From 1ca686b8923157cc18750dbce03ab1fb1e5c138a Mon Sep 17 00:00:00 2001 From: nemo Date: Thu, 23 Jan 2025 12:36:06 +0000 Subject: [PATCH 01/69] opey consents WIP --- components.d.ts | 1 + server/controllers/OpeyController.ts | 88 ++++++++++++++++++++++++++++ src/components/ChatWidget.vue | 55 ++++++++++++++++- src/components/ChatWidgetII.vue | 3 + src/obp/common-functions.ts | 23 ++++++++ 5 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 src/components/ChatWidgetII.vue diff --git a/components.d.ts b/components.d.ts index 62a87ee..06a6e91 100644 --- a/components.d.ts +++ b/components.d.ts @@ -8,6 +8,7 @@ export {} declare module 'vue' { export interface GlobalComponents { ChatWidget: typeof import('./src/components/ChatWidget.vue')['default'] + ChatWidgetII: typeof import('./src/components/ChatWidgetII.vue')['default'] Collections: typeof import('./src/components/Collections.vue')['default'] Content: typeof import('./src/components/Content.vue')['default'] ElAlert: typeof import('element-plus/es')['ElAlert'] diff --git a/server/controllers/OpeyController.ts b/server/controllers/OpeyController.ts index 45676f0..a181318 100644 --- a/server/controllers/OpeyController.ts +++ b/server/controllers/OpeyController.ts @@ -45,6 +45,94 @@ export class OpeyController { private obpClientService: OBPClientService, ) {} + @Post('/consent') + /** + * Retrieves a consent from OBP for the current user + */ + async getConsent( + @Session() session: any, + @Req() request: Request, + @Res() response: Response + ): Response { + try { + console.log("Getting consent from OBP") + // Check if consent is already in session + if (session['obpConsent']) { + console.log("Consent found in session, returning cached consent") + // NOTE: Arguably we should not return the consent to the frontend as it could be hijacked, + // we can keep everything in the backend and only return the JWT token + return response.status(200).json(true); + } + + const oauthConfig = session['clientConfig'] + const version = this.obpClientService.getOBPVersion() + // Obbiously this should not be hard-coded, especially the consumer_id, but for now it is + const consentBody = { + "everything": false, + "views": [], + "entitlements": [], + "consumer_id": "33e0a1bd-9f1d-4128-911b-8936110f802f" + } + // 33e0a1bd-9f1d-4128-911b-8936110f802f + + // Get current user, only proceed if user is logged in + const currentUser = await this.obpClientService.get(`/obp/${version}/users/current`, oauthConfig) + const currentResponseKeys = Object.keys(currentUser) + if (!currentResponseKeys.includes('user_id')) { + return response.status(400).json({ message: 'User not logged in, Authentication required' }); + } + + // url needs to be changed once we get the 'bankless' consent endpoint + // this creates a consent for the current logged in user, and starts SCA flow i.e. sends SMS or email OTP to user + const consent = await this.obpClientService.create(`/obp/${version}/banks/gh.29.uk/my/consents/IMPLICIT`, consentBody, oauthConfig) + console.log("Consent: ", consent) + + // store consent in session, return consent 200 OK + session['obpConsent'] = consent + return response.status(200).json(true); + } catch (error) { + console.error("Error in consent endpoint: ", error); + return response.status(500).json({ error: 'Internal Server Error '}); + } + } + + @Post('/consent/answer-challenge') + /** + * Endpoint to answer the consent challenge with code i.e. SMS or email OTP for SCA + * If successful, returns a Consent-JWT for use by Opey to access endpoints/ roles that the consenting user has + * This completes (i.e. is the final step in) the consent flow + */ + async answerConsentChallenge( + @Session() session: any, + @Req() request: Request, + @Res() response: Response + ): Response { + try { + const oauthConfig = session['clientConfig'] + const version = this.obpClientService.getOBPVersion() + + const obpConsent = session['obpConsent'] + if (!obpConsent) { + return response.status(400).json({ message: 'Consent not found in session' }); + } else if (obpConsent.status === 'ACCEPTED') { + return response.status(400).json({ message: 'Consent already accepted' }); + } + const answerBody = request.body + + const consentJWT = await this.obpClientService.create(`/obp/${version}/banks/gh.29.uk/consents/${obpConsent.consent_id}/challenge`, answerBody, oauthConfig) + console.log("Consent JWT: ", consentJWT) + // store consent JWT in session, return consent JWT 200 OK + session['obpConsentJWT'] = consentJWT + return response.status(200).json(true); + + } catch (error) { + console.error("Error in consent/answer-challenge endpoint: ", error); + return response.status(500).json({ error: 'Internal Server Error' }); + } + + } + + @Post('/token') /** * Retrieves a JWT token for the current user. diff --git a/src/components/ChatWidget.vue b/src/components/ChatWidget.vue index d746e3e..d0784fb 100644 --- a/src/components/ChatWidget.vue +++ b/src/components/ChatWidget.vue @@ -33,7 +33,7 @@ import { inject } from 'vue'; import { obpApiHostKey } from '@/obp/keys'; import { getCurrentUser } from '../obp'; - import { getOpeyJWT } from '@/obp/common-functions' + import { getOpeyJWT, getOpeyConsent, answerOpeyConsentChallenge } from '@/obp/common-functions' import { storeToRefs } from "pinia"; import { socket } from '@/socket'; import { useConnectionStore } from '@/stores/connection'; @@ -80,6 +80,8 @@ userInput: '', sessionId: uuidv4(), awaitingConnection: !this.isConnected, + awaitingConsentChallengeAnswer: false, + consentChallengeAnswer: '', isLoading: false, obpApiHost: null, isLoggedIn: null, @@ -128,6 +130,20 @@ }); } + + // try to get a consent token + try { + token = await getOpeyConsent() + this.awaitingConsentChallengeAnswer = true + } catch (error) { + console.log('Error getting consent for opey from OBP: ', error) + this.errorState = true + ElMessage({ + message: 'Error getting consent for opey from OBP', + type: 'error' + }); + + } // Establish the WebSocket connection console.log('Establishing WebSocket connection'); @@ -143,6 +159,33 @@ } }, + async answerConsentChallenge() { + const challengeAnswer = this.consentChallengeAnswer + if (!challengeAnswer) { + console.error("empty challenge answer") + return + } + + try { + const answerBody = { + answer: challengeAnswer + } + const response = await answerOpeyConsentChallenge(answerBody) + if (response.status === 200) { + console.log('Consent challenge answered successfully, Consent approved') + this.awaitingConsentChallengeAnswer = false + } + } catch (error) { + + console.log('Error answering consent challenge: ', error) + this.errorState = true + ElMessage({ + message: 'Error answering consent challenge', + type: 'error' + }); + } + }, + async sendMessage() { if (this.userInput.trim()) { // Message in OpenAI standard format for user message @@ -269,7 +312,15 @@ Chat with Opey Powered by OpenAI -
+
+ + + Submit +
+
diff --git a/src/components/ChatWidgetII.vue b/src/components/ChatWidgetII.vue new file mode 100644 index 0000000..d86feda --- /dev/null +++ b/src/components/ChatWidgetII.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/obp/common-functions.ts b/src/obp/common-functions.ts index c4bc512..8dfc454 100644 --- a/src/obp/common-functions.ts +++ b/src/obp/common-functions.ts @@ -85,6 +85,29 @@ export async function getOpeyJWT() { return token } +export async function getOpeyConsent() { + const response = await axios.post('/api/opey/consent').catch((error) => { + if (error.response) { + throw new Error(`getOpeyConsent returned an error: ${error.toJSON()}`); + } else { + throw new Error(`getOpeyConsent returned an error: ${error.message}`); + } + }); + const consent = String(response?.data?.consent) + return consent +} + +export async function answerOpeyConsentChallenge(answerBody: any) { + const response = await axios.post('/api/opey/consent/answer-challenge', answerBody).catch((error) => { + if (error.response) { + throw new Error(`answerOpeyConsentChallenge returned an error: ${error.toJSON()}`); + } else { + throw new Error(`answerOpeyConsentChallenge returned an error: ${error.message}`); + } + }); + return response +} + export function clearCacheByName(cacheName: string) { if ('caches' in window) { caches.delete(cacheName).then(function(success) { From 0feb271e23977bd496e86816c999a1faac4df560 Mon Sep 17 00:00:00 2001 From: nemo Date: Tue, 28 Jan 2025 14:51:23 +0000 Subject: [PATCH 02/69] integration WIP --- server/controllers/OpeyController.ts | 12 ++--- src/components/ChatWidget.vue | 65 ++++++++++++++-------------- src/obp/common-functions.ts | 3 +- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/server/controllers/OpeyController.ts b/server/controllers/OpeyController.ts index a181318..2963784 100644 --- a/server/controllers/OpeyController.ts +++ b/server/controllers/OpeyController.ts @@ -58,22 +58,22 @@ export class OpeyController { console.log("Getting consent from OBP") // Check if consent is already in session if (session['obpConsent']) { - console.log("Consent found in session, returning cached consent") + console.log("Consent found in session, returning cached consent ID") + const obpConsent = session['obpConsent'] // NOTE: Arguably we should not return the consent to the frontend as it could be hijacked, // we can keep everything in the backend and only return the JWT token - return response.status(200).json(true); + return response.status(200).json({consent_id: obpConsent.consent_id}); } const oauthConfig = session['clientConfig'] const version = this.obpClientService.getOBPVersion() // Obbiously this should not be hard-coded, especially the consumer_id, but for now it is - const consentBody = { + const consentRequestBody = { "everything": false, "views": [], "entitlements": [], "consumer_id": "33e0a1bd-9f1d-4128-911b-8936110f802f" } - // 33e0a1bd-9f1d-4128-911b-8936110f802f // Get current user, only proceed if user is logged in const currentUser = await this.obpClientService.get(`/obp/${version}/users/current`, oauthConfig) @@ -84,12 +84,12 @@ export class OpeyController { // url needs to be changed once we get the 'bankless' consent endpoint // this creates a consent for the current logged in user, and starts SCA flow i.e. sends SMS or email OTP to user - const consent = await this.obpClientService.create(`/obp/${version}/banks/gh.29.uk/my/consents/IMPLICIT`, consentBody, oauthConfig) + const consent = await this.obpClientService.create(`/obp/${version}/banks/gh.29.uk/my/consents/IMPLICIT`, consentRequestBody, oauthConfig) console.log("Consent: ", consent) // store consent in session, return consent 200 OK session['obpConsent'] = consent - return response.status(200).json(true); + return response.status(200).json({consent_id: consent.consent_id}); } catch (error) { console.error("Error in consent endpoint: ", error); return response.status(500).json({ error: 'Internal Server Error '}); diff --git a/src/components/ChatWidget.vue b/src/components/ChatWidget.vue index d0784fb..fb075e9 100644 --- a/src/components/ChatWidget.vue +++ b/src/components/ChatWidget.vue @@ -28,6 +28,7 @@ + + \ No newline at end of file diff --git a/src/obp/common-functions.ts b/src/obp/common-functions.ts index d9b8f7a..2c82ef9 100644 --- a/src/obp/common-functions.ts +++ b/src/obp/common-functions.ts @@ -86,14 +86,16 @@ export async function getOpeyJWT() { } export async function getOpeyConsent() { - const response = await axios.post('/api/opey/consent').catch((error) => { + await axios.post('/api/opey/consent').catch((error) => { if (error.response) { throw new Error(`getOpeyConsent returned an error: ${error.toJSON()}`); } else { throw new Error(`getOpeyConsent returned an error: ${error.message}`); } + }).then((response) => { + console.log(response) + return response }); - return response } export async function answerOpeyConsentChallenge(answerBody: any) { diff --git a/test/opey.test.ts b/test/opey.test.ts new file mode 100644 index 0000000..f490bd3 --- /dev/null +++ b/test/opey.test.ts @@ -0,0 +1,41 @@ + +import { beforeAll, describe, afterAll, it, expect, expectTypeOf, test } from 'vitest'; +import { OpeyController } from "../server/controllers/OpeyController"; +import app from '../server/app'; +import { UserInput } from '../server/schema/OpeySchema'; +import { v6 as uuid6 } from 'uuid'; + +const BEFORE_ALL_TIMEOUT = 30000; // 30 sec + + +let server; + +beforeAll(() => { + // Start the Express app on a test port + server = app.listen(3000); +}); + +afterAll(() => { + // Close the server after tests + server.close(); +}); + + +describe('POST /api/opey/stream', () => { + let response: Response; + + it('Should return 200', async () => { + let userInput: UserInput = { + message: "Hello Opey", + is_tool_call_approval: false + } + const response = await fetch("http://localhost:3000/api/opey/stream", { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(userInput) + }); + expect(response.status).toBe(200); + }); +}); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 5aa99f6..43e591a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,51 @@ # yarn lockfile v1 +"@ai-sdk/provider-utils@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.5.tgz" + integrity sha512-PcNR7E4ovZGV/J47gUqaFlvzorgca6uUfN5WzfXJSFWeOeLunN+oxRVwgUOwj0zbmO0yGQTHQD+FHVw8s3Rz8w== + dependencies: + "@ai-sdk/provider" "1.0.6" + eventsource-parser "^3.0.0" + nanoid "^3.3.8" + secure-json-parse "^2.7.0" + +"@ai-sdk/provider@1.0.6": + version "1.0.6" + resolved "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.6.tgz" + integrity sha512-hwj/gFNxpDgEfTaYzCYoslmw01IY9kWLKl/wf8xuPvHtQIzlfXWmmUwc8PnCwxyt8cKzIuV0dfUghCf68HQ0SA== + dependencies: + json-schema "^0.4.0" + +"@ai-sdk/react@1.1.6": + version "1.1.6" + resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-1.1.6.tgz" + integrity sha512-kP5pimLyNWldw8+0j3ym+AACFEXcQHdELNtk45wDJA3HoH486x/zffdn7yLc3c1DOu5apew+COl8CNL4A+2E4g== + dependencies: + "@ai-sdk/provider-utils" "2.1.5" + "@ai-sdk/ui-utils" "1.1.6" + swr "^2.2.5" + throttleit "2.1.0" + +"@ai-sdk/ui-utils@1.1.6": + version "1.1.6" + resolved "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.1.6.tgz" + integrity sha512-YAwZhFwpIcvWERIjkET2o2MAwMFfJG18WdtcIjtxxMW7hA0bt5cliOV78DVcwRrxqJ2IKBlxaFmwUjW6M4SdOQ== + dependencies: + "@ai-sdk/provider" "1.0.6" + "@ai-sdk/provider-utils" "2.1.5" + zod-to-json-schema "^3.24.1" + +"@ai-sdk/vue@^1.1.6": + version "1.1.6" + resolved "https://registry.npmjs.org/@ai-sdk/vue/-/vue-1.1.6.tgz" + integrity sha512-lo9WslJn/E52qHrmQj2PM74LBpzctqjHg94gQOz4YdlQLsCDG5BmD4o3dnRm1yKfYQZkB31XYTfOComo9gki2Q== + dependencies: + "@ai-sdk/provider-utils" "2.1.5" + "@ai-sdk/ui-utils" "1.1.6" + swrv "^1.0.4" + "@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0": version "2.3.0" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" @@ -698,6 +743,11 @@ resolved "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz" integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== +"@opentelemetry/api@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" + integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" @@ -834,6 +884,11 @@ dependencies: "@types/node" "*" +"@types/diff-match-patch@^1.0.36": + version "1.0.36" + resolved "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz" + integrity sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg== + "@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" @@ -1306,6 +1361,18 @@ agent-base@^7.1.0, agent-base@^7.1.2: resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== +ai@^4.1.9: + version "4.1.9" + resolved "https://registry.npmjs.org/ai/-/ai-4.1.9.tgz" + integrity sha512-EUc21jyV/2Fv0hEd4toLxQMxjTXBWjKnw16tpto12Vrg/EvkmfVSEvtwXDa+J70iPDmASxL10VKmJk/wnb6bZA== + dependencies: + "@ai-sdk/provider" "1.0.6" + "@ai-sdk/provider-utils" "2.1.5" + "@ai-sdk/react" "1.1.6" + "@ai-sdk/ui-utils" "1.1.6" + "@opentelemetry/api" "1.9.0" + jsondiffpatch "0.6.0" + ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -1331,6 +1398,11 @@ alien-signals@^0.4.9: resolved "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz" integrity sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q== +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" @@ -1572,6 +1644,11 @@ browser-resolve@^2.0.0: dependencies: resolve "^1.17.0" +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" @@ -1733,6 +1810,11 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-lite@^1.0.30001669: version "1.0.30001683" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz" @@ -1751,7 +1833,7 @@ chai@^4.3.10: pathval "^1.1.1" type-detect "^4.1.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1759,6 +1841,11 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.3.0: + version "5.4.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== + check-error@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" @@ -1795,7 +1882,7 @@ cheerio@^1.0.0: undici "^6.19.5" whatwg-mimetype "^4.0.0" -chokidar@^3.6.0: +chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -1832,6 +1919,15 @@ class-validator@^0.14.0: libphonenumber-js "^1.10.14" validator "^13.7.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clsx@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" @@ -2148,6 +2244,13 @@ debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3 dependencies: ms "2.1.2" +debug@^4.3.5: + version "4.4.0" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + debug@^4.3.7: version "4.4.0" resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" @@ -2169,6 +2272,11 @@ debug@2.6.9: dependencies: ms "2.0.0" +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + decimal.js@^10.4.3: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" @@ -2219,6 +2327,11 @@ depd@~1.1.2: resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + des.js@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz" @@ -2240,6 +2353,11 @@ dezalgo@^1.0.4: asap "^2.0.0" wrappy "1" +diff-match-patch@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz" + integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== + diff-sequences@^29.4.3, diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" @@ -2250,6 +2368,11 @@ diff@^4.0.1: resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" @@ -2532,7 +2655,7 @@ esbuild@^0.18.10: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" -escalade@^3.2.0: +escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== @@ -2721,6 +2844,11 @@ events@^3.0.0: resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +eventsource-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz" + integrity sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA== + evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" @@ -2880,6 +3008,11 @@ flat-cache@^4.0.0: flatted "^3.2.9" keyv "^4.5.4" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^3.2.9: version "3.3.2" resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz" @@ -2958,6 +3091,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-func-name@^2.0.0, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" @@ -3008,7 +3146,7 @@ glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^10.2.2, glob@^10.3.3: +glob@^10.2.2, glob@^10.3.3, glob@^10.4.5: version "10.4.5" resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== @@ -3359,6 +3497,11 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" @@ -3382,6 +3525,11 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3: gopd "^1.0.1" has-tostringtag "^1.0.0" +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" @@ -3519,6 +3667,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz" @@ -3534,6 +3687,15 @@ json5@^2.2.3: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsondiffpatch@0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz" + integrity sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ== + dependencies: + "@types/diff-match-patch" "^1.0.36" + chalk "^5.3.0" + diff-match-patch "^1.0.5" + "jsonpath-plus@^9.0.0 || ^10.2.0": version "10.2.0" resolved "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.2.0.tgz" @@ -3745,6 +3907,14 @@ lodash@*, lodash@^4.17.21: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + loupe@^2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz" @@ -3918,6 +4088,13 @@ minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^9.0.0, minimatch@^9.0.3, minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" @@ -3959,6 +4136,32 @@ mlly@^1.4.0, mlly@^1.7.2, mlly@^1.7.3: pkg-types "^1.2.1" ufo "^1.5.4" +mocha@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz" + integrity sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^10.4.5" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^17.7.2" + yargs-parser "^21.1.1" + yargs-unparser "^2.0.0" + ms@^2.1.1, ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" @@ -3997,10 +4200,10 @@ multer@*, multer@^1.4.5-lts.1: type-is "^1.6.4" xtend "^4.0.0" -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +nanoid@^3.3.7, nanoid@^3.3.8: + version "3.3.8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== natural-compare-lite@^1.4.0: version "1.4.0" @@ -4511,7 +4714,7 @@ random-bytes@~1.0.0: resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -4546,6 +4749,11 @@ react-is@^18.0.0: resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== +"react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19 || ^19.0.0-rc": + version "19.0.0" + resolved "https://registry.npmjs.org/react/-/react-19.0.0.tgz" + integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== + read-package-json-fast@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz" @@ -4609,6 +4817,11 @@ reflect-metadata@^0.1.13: resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" @@ -4716,6 +4929,11 @@ scule@^1.3.0: resolved "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz" integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g== +secure-json-parse@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz" + integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== + semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" @@ -4774,6 +4992,13 @@ send@0.19.0: range-parser "~1.2.1" statuses "2.0.1" +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + serve-static@1.16.2: version "1.16.2" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" @@ -4998,7 +5223,16 @@ string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0: +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5077,7 +5311,7 @@ superagent@^8.0.9: qs "^6.11.0" semver "^7.3.8" -superagent@^9.0.0: +superagent@^9.0.0, superagent@^9.0.1: version "9.0.2" resolved "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz" integrity sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w== @@ -5092,6 +5326,14 @@ superagent@^9.0.0: mime "2.6.0" qs "^6.11.0" +supertest@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz" + integrity sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA== + dependencies: + methods "^1.1.2" + superagent "^9.0.1" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" @@ -5099,6 +5341,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -5129,6 +5378,19 @@ svg-tags@^1.0.0: resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz" integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== +swr@^2.2.5: + version "2.3.0" + resolved "https://registry.npmjs.org/swr/-/swr-2.3.0.tgz" + integrity sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA== + dependencies: + dequal "^2.0.3" + use-sync-external-store "^1.4.0" + +swrv@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/swrv/-/swrv-1.0.4.tgz" + integrity sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" @@ -5147,6 +5409,11 @@ template-url@^1.0.0: resolved "https://registry.npmjs.org/template-url/-/template-url-1.0.0.tgz" integrity sha512-QUjZNE7yTdIzB91sITTSYcSX5GRF5FulKvIYCqV5350NfSNfiuuCYQIJZ5PIN7k/uJ+kpurEEv9hFqRRc+JilA== +throttleit@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz" + integrity sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw== + timers-browserify@^2.0.4: version "2.0.12" resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" @@ -5422,6 +5689,11 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-sync-external-store@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz" + integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" @@ -5641,7 +5913,7 @@ vue-tsc@^2.0.0: "@volar/typescript" "~2.4.11" "@vue/language-core" "2.2.0" -"vue@^2.6.14 || ^3.5.11", vue@^3, vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.5.1, "vue@2 || 3", vue@2||3, vue@3.5.13: +"vue@^2.6.14 || ^3.5.11", vue@^3, vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.3.4, vue@^3.5.1, "vue@>=3.2.26 < 4", "vue@2 || 3", vue@2||3, vue@3.5.13: version "3.5.13" resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz" integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== @@ -5733,6 +6005,11 @@ word-wrap@^1.2.5: resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -5742,6 +6019,15 @@ word-wrap@^1.2.5: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" @@ -5801,6 +6087,11 @@ xtend@^4.0.0, xtend@^4.0.2: resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" @@ -5816,6 +6107,34 @@ yallist@4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yeast@0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz" @@ -5845,3 +6164,13 @@ zimmerframe@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz" integrity sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w== + +zod-to-json-schema@^3.24.1: + version "3.24.1" + resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz" + integrity sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w== + +zod@^3.0.0, zod@^3.24.1: + version "3.24.1" + resolved "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz" + integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A== From a98dc346e86e55c06a4d85146684bd3c549c58c5 Mon Sep 17 00:00:00 2001 From: nemo Date: Mon, 10 Feb 2025 10:58:51 +0000 Subject: [PATCH 04/69] Tests WIP --- jest.config.js | 8 + package.json | 14 +- server/app.ts | 4 +- server/controllers/OpeyController.ts | 2 +- server/controllers/OpeyIIController.ts | 52 +- server/schema/OpeySchema.ts | 16 + server/services/OpeyClientService.ts | 60 +- test/opey.test.ts | 41 - tests/opey.test.ts | 55 + yarn.lock | 1823 ++++++++++++++++++++++-- 10 files changed, 1830 insertions(+), 245 deletions(-) create mode 100644 jest.config.js delete mode 100644 test/opey.test.ts create mode 100644 tests/opey.test.ts diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..6da536c --- /dev/null +++ b/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + transform: {'^.+\\.ts?$': 'ts-jest'}, + preset: 'ts-jest', + testEnvironment: 'node', + testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + detectOpenHandles: true, + }; \ No newline at end of file diff --git a/package.json b/package.json index 085881a..a3384ca 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,17 @@ "name": "api-explorer", "version": "1.1.2", "private": true, + "types": [ + "jest", + "node" + ], "scripts": { "dev": "vite & ts-node server/app.ts", "build": "run-p build-only", "build-server": "tsc --project tsconfig.server.json", "preview": "vite preview", "test:unit": "vitest", + "test": "jest", "build-only": "vite build", "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false", "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", @@ -17,6 +22,9 @@ "@element-plus/icons-vue": "^2.1.0", "@fontsource/roboto": "^5.0.0", "@highlightjs/vue-plugin": "^2.1.0", + "@types/jest": "^29.5.14", + "@types/supertest": "^6.0.2", + "ai": "^4.1.11", "axios": "^1.7.4", "cheerio": "^1.0.0", "class-transformer": "^0.5.1", @@ -26,6 +34,7 @@ "element-plus": "^2.3.9", "express": "^4.21.0", "express-session": "^1.17.3", + "got": "^14.4.5", "highlight.js": "^11.8.0", "json-editor-vue": "^0.17.3", "jsonwebtoken": "^9.0.2", @@ -39,6 +48,7 @@ "routing-controllers": "^0.10.4", "socket.io": "^4.7.5", "socket.io-client": "^4.7.5", + "supertest": "^7.0.0", "typedi": "^0.10.0", "uuid": "^9.0.1", "vanilla-jsoneditor": "^2.3.3", @@ -53,7 +63,7 @@ "@types/jsdom": "^21.1.7", "@types/jsonwebtoken": "^9.0.6", "@types/markdown-it": "^14.1.1", - "@types/node": "^20.5.7", + "@types/node": "^20.17.16", "@vitejs/plugin-vue": "^4.3.0", "@vitejs/plugin-vue-jsx": "^3.1.0", "@vue/eslint-config-prettier": "^9.0.0", @@ -62,10 +72,12 @@ "@vue/tsconfig": "^0.1.3", "eslint": "^9.15.0", "eslint-plugin-vue": "^9.12.0", + "jest": "^29.7.0", "jsdom": "^25.0.1", "npm-run-all2": "^7.0.1", "prettier": "^3.0.1", "superagent": "^9.0.0", + "ts-jest": "^29.2.5", "ts-node": "^10.9.1", "typescript": "~5.2.2", "unplugin-auto-import": "^0.18.0", diff --git a/server/app.ts b/server/app.ts index 105622f..a376a21 100644 --- a/server/app.ts +++ b/server/app.ts @@ -138,9 +138,11 @@ console.log('Execution continues with commitId:', commitId); // Error Handling to Shut Down the App server.on('error', (err) => { + redisClient.disconnect(); if (err.code === 'EADDRINUSE') { console.error(`Port ${port} is already in use.`); - process.exit(1); // Shut down the app + process.exit(1); + // Shut down the app } else { console.error('An error occurred:', err); } diff --git a/server/controllers/OpeyController.ts b/server/controllers/OpeyController.ts index 2963784..ea8fd1d 100644 --- a/server/controllers/OpeyController.ts +++ b/server/controllers/OpeyController.ts @@ -33,7 +33,7 @@ import * as fs from 'fs' import * as jwt from 'jsonwebtoken' @Service() -@Controller('/opey') +@Controller('/opey-old') /** * Controller class for handling Opey related operations. * This used to hold the /chat endpoint, but that endpoint has become obsolete since using websockets. diff --git a/server/controllers/OpeyIIController.ts b/server/controllers/OpeyIIController.ts index 96d7519..036d073 100644 --- a/server/controllers/OpeyIIController.ts +++ b/server/controllers/OpeyIIController.ts @@ -1,6 +1,6 @@ import { streamText } from 'ai' import axios from 'axios' -import { Controller, Session, Req, Res, Post } from 'routing-controllers' +import { Controller, Session, Req, Res, Post, Get } from 'routing-controllers' import { Request, Response } from 'express' import { Service } from 'typedi' import OBPClientService from '../services/OBPClientService' @@ -17,6 +17,13 @@ export class OpeyController { private opeyClientService: OpeyClientService, ) {} + @Get('/') + async getStatus( + @Res() response: Response + ): Response { + return response.status(200).json({status: 'Opey is running'}); + } + @Post('/consent') /** * Retrieves a consent from OBP for the current user @@ -112,21 +119,42 @@ export class OpeyController { @Req() request: Request, @Res() response: Response ) { - const messages = await request.json() - console.log(messages) - - const user_input: UserInput = { - "message": messages[-1], - "thread_id": uuid6(), - "is_tool_call_approval": false + let user_input: UserInput + try { + user_input = { + "message": request.body.message, + "thread_id": request.body.thread_id, + "is_tool_call_approval": request.body.is_tool_call_approval + } + } catch (error) { + console.error("Error in stream endpoint, could not parse into UserInput: ", error) + return response.status(500).json({ error: 'Internal Server Error' }) } + + + + try { + console.log("Calling OpeyClientService.stream") + const stream = await this.opeyClientService.stream(user_input) + try{ + response.setHeader('Content-Type', 'text/event-stream') + return stream + } catch (error) { + console.error("Error in stream endpoint: ", error) + return response.status(500).json({ error: 'Internal Server Error' }) + } + + + - const stream = await this.opeyClientService.stream(user_input) + } catch (error) { + console.error("Error in stream endpoint: ", error) + return response.status(500).json({ error: 'Internal Server Error' }) + } + - stream.on('data', (chunk)=>{ - console.log(chunk) - }) + } diff --git a/server/schema/OpeySchema.ts b/server/schema/OpeySchema.ts index 0f020d4..7c55899 100644 --- a/server/schema/OpeySchema.ts +++ b/server/schema/OpeySchema.ts @@ -3,4 +3,20 @@ export class UserInput { message: string; thread_id?: string | null; is_tool_call_approval: boolean; +} + +export type OpeyConfig = { + baseUri: string, + authConfig: any, + paths: { + stream: string, + invoke: string, + approve_tool: string, + feedback: string, + } +} + +export type AuthConfig = { + consentId: string, + opeyJWT: string, } \ No newline at end of file diff --git a/server/services/OpeyClientService.ts b/server/services/OpeyClientService.ts index 4f70acd..d7aea9f 100644 --- a/server/services/OpeyClientService.ts +++ b/server/services/OpeyClientService.ts @@ -1,31 +1,19 @@ import { Service } from 'typedi' -import axios from 'axios' -import { UserInput } from '../schema/OpeySchema' +import { got } from 'got'; +import { UserInput, OpeyConfig, AuthConfig } from '../schema/OpeySchema' @Service() export default class OpeyClientService { - private AuthConfig: { - consentId: string, - opeyJWT: string, - } - private opeyConfig: { - baseUri: string, - authConfig: any, - paths: { - stream: string, - invoke: string, - approve_tool: string, - feedback: string, - } - } - constuctor() { - this.AuthConfig = { + private authConfig: AuthConfig + private opeyConfig: OpeyConfig + constructor() { + this.authConfig = { consentId: '', opeyJWT: '' } this.opeyConfig = { - baseUri: process.env.VITE_CHATBOT_URL, - authConfig: this.AuthConfig, + baseUri: process.env.VITE_CHATBOT_URL? process.env.VITE_CHATBOT_URL : 'http://localhost:5000', + authConfig: this.authConfig, paths: { stream: '/stream', invoke: '/invoke', @@ -35,20 +23,28 @@ export default class OpeyClientService { } } - async stream(user_input: UserInput) { - await axios.post(this.opeyConfig.paths.stream, user_input, { + async stream(user_input: UserInput): Promise { - headers: { - "Authorization": `Bearer ${this.opeyConfig.authConfig.opeyJWT}` - }, - responseType: 'stream' + try { + console.log(`Streaming to Opey: ${JSON.stringify(user_input)}`) //DEBUG + const stream = got.stream.post(`${this.opeyConfig.baseUri}${this.opeyConfig.paths.stream}`, { - }).catch((error) => { - console.error(error) + headers: { + "Authorization": `Bearer ${this.opeyConfig.authConfig.opeyJWT}` + }, + body: JSON.stringify(user_input), + + }); + console.log(`Response from Opey: ${stream}`) //DEBUG - }).then((response) => { - const stream = response.data - return stream - }) + //response.data.on('data', (chunk) => {console.log(`Recieved chunk: ${chunk.toString()}`)}); + return stream; + } + catch (error) { + throw new Error(`Error streaming to Opey: ${error}`) + } + + + } } \ No newline at end of file diff --git a/test/opey.test.ts b/test/opey.test.ts deleted file mode 100644 index f490bd3..0000000 --- a/test/opey.test.ts +++ /dev/null @@ -1,41 +0,0 @@ - -import { beforeAll, describe, afterAll, it, expect, expectTypeOf, test } from 'vitest'; -import { OpeyController } from "../server/controllers/OpeyController"; -import app from '../server/app'; -import { UserInput } from '../server/schema/OpeySchema'; -import { v6 as uuid6 } from 'uuid'; - -const BEFORE_ALL_TIMEOUT = 30000; // 30 sec - - -let server; - -beforeAll(() => { - // Start the Express app on a test port - server = app.listen(3000); -}); - -afterAll(() => { - // Close the server after tests - server.close(); -}); - - -describe('POST /api/opey/stream', () => { - let response: Response; - - it('Should return 200', async () => { - let userInput: UserInput = { - message: "Hello Opey", - is_tool_call_approval: false - } - const response = await fetch("http://localhost:3000/api/opey/stream", { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(userInput) - }); - expect(response.status).toBe(200); - }); -}); \ No newline at end of file diff --git a/tests/opey.test.ts b/tests/opey.test.ts new file mode 100644 index 0000000..d134127 --- /dev/null +++ b/tests/opey.test.ts @@ -0,0 +1,55 @@ +import { OpeyController } from "../server/controllers/OpeyController"; +import app from '../server/app'; +import request from 'supertest'; +import { UserInput } from '../server/schema/OpeySchema'; +import {v4 as uuidv4} from 'uuid'; + + +const BEFORE_ALL_TIMEOUT = 30000; // 30 sec + +describe('GET /api/opey', () => { + let response: Response; + + it('Should return 200', async () => { + const response = await request(app) + .get("/api/opey") + .set('Content-Type', 'application/json') + + expect(response.status).toBe(200); + }); +}); + + +describe('POST /api/opey/stream', () => { + let response: Response; + + it('Should return 200', async () => { + let userInput: UserInput = { + message: "Hello Opey", + thread_id: uuidv4(), + is_tool_call_approval: false + } + const response = await request(app) + .post("/api/opey/stream") + .send(userInput) + .set('Content-Type', 'application/json') + .buffer(false) + .parse((res, callback) => { + res.on('data', (chunk) => { + console.log(`Recieved chunk: ${chunk.toString()}`); + expect(chunk.toString()).toBeTruthy(); + }); + + res.on('end', () => { + callback(null, null); + }); + }); + + expect(response.status).toBe(200); + expect(response.headers['content-type']).toContain('text/event-stream'); // Ensure it is an SSE stream + expect(response.headers['transfer-encoding']).toBe('chunked'); // Ensure it is streamed + }); + + + +}); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 43e591a..ad5c948 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38,15 +38,6 @@ "@ai-sdk/provider-utils" "2.1.5" zod-to-json-schema "^3.24.1" -"@ai-sdk/vue@^1.1.6": - version "1.1.6" - resolved "https://registry.npmjs.org/@ai-sdk/vue/-/vue-1.1.6.tgz" - integrity sha512-lo9WslJn/E52qHrmQj2PM74LBpzctqjHg94gQOz4YdlQLsCDG5BmD4o3dnRm1yKfYQZkB31XYTfOComo9gki2Q== - dependencies: - "@ai-sdk/provider-utils" "2.1.5" - "@ai-sdk/ui-utils" "1.1.6" - swrv "^1.0.4" - "@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0": version "2.3.0" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" @@ -71,7 +62,7 @@ "@csstools/css-tokenizer" "^3.0.3" lru-cache "^10.4.3" -"@babel/code-frame@^7.24.7", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": version "7.26.2" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -85,7 +76,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz" integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.14.6", "@babel/core@^7.23.3": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.14.6", "@babel/core@^7.23.3", "@babel/core@^7.23.9", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": version "7.26.0" resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -106,7 +97,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": +"@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": version "7.26.2" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz" integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== @@ -180,7 +171,7 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz" integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== @@ -232,7 +223,7 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@babel/parser@^7.15.8", "@babel/parser@^7.25.3", "@babel/parser@^7.25.6", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.8", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.3", "@babel/parser@^7.25.6", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": version "7.26.2" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz" integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== @@ -247,6 +238,34 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" @@ -254,14 +273,91 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-jsx@^7.24.7": +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.24.7", "@babel/plugin-syntax-jsx@^7.7.2": version "7.25.9" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz" integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-typescript@^7.25.9": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.25.9", "@babel/plugin-syntax-typescript@^7.7.2": version "7.25.9" resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz" integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== @@ -288,7 +384,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" "@babel/plugin-syntax-typescript" "^7.25.9" -"@babel/template@^7.25.0", "@babel/template@^7.25.9": +"@babel/template@^7.25.0", "@babel/template@^7.25.9", "@babel/template@^7.3.3": version "7.25.9" resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz" integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== @@ -310,7 +406,7 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.21.5", "@babel/types@^7.25.6", "@babel/types@^7.25.9", "@babel/types@^7.26.0": +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.5", "@babel/types@^7.25.6", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.3": version "7.26.0" resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz" integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== @@ -318,6 +414,11 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "@codemirror/autocomplete@^6.18.1": version "6.18.4" resolved "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.4.tgz" @@ -605,6 +706,145 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" @@ -612,6 +852,68 @@ dependencies: "@sinclair/typebox" "^0.27.8" +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.0.0", "@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.0.0", "@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" @@ -636,7 +938,7 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -825,11 +1127,35 @@ resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz" integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== +"@sec-ant/readable-stream@^0.4.1": + version "0.4.1" + resolved "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz" + integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg== + "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sindresorhus/is@^7.0.1": + version "7.0.1" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz" + integrity sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ== + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@socket.io/component-emitter@~3.1.0": version "3.1.2" resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz" @@ -840,6 +1166,13 @@ resolved "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz" integrity sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw== +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + "@tsconfig/node10@^1.0.7": version "1.0.9" resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" @@ -860,6 +1193,39 @@ resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.6" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + "@types/chai-subset@^1.3.3": version "1.3.3" resolved "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz" @@ -877,6 +1243,11 @@ resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== +"@types/cookiejar@^2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz" + integrity sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q== + "@types/cors@^2.8.12": version "2.8.17" resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz" @@ -894,6 +1265,45 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/http-cache-semantics@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.14": + version "29.5.14" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz" + integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + "@types/jsdom@^21.1.7": version "21.1.7" resolved "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz" @@ -945,13 +1355,41 @@ resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz" integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== -"@types/node@*", "@types/node@^20.5.7", "@types/node@>= 14", "@types/node@>=10.0.0": - version "20.17.6" - resolved "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz" - integrity sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ== +"@types/methods@^1.1.4": + version "1.1.4" + resolved "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz" + integrity sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ== + +"@types/node@*", "@types/node@^20.17.16", "@types/node@>= 14", "@types/node@>=10.0.0": + version "20.17.16" + resolved "https://registry.npmjs.org/@types/node/-/node-20.17.16.tgz" + integrity sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw== dependencies: undici-types "~6.19.2" +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/superagent@^8.1.0": + version "8.1.9" + resolved "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz" + integrity sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ== + dependencies: + "@types/cookiejar" "^2.1.5" + "@types/methods" "^1.1.4" + "@types/node" "*" + form-data "^4.0.0" + +"@types/supertest@^6.0.2": + version "6.0.2" + resolved "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz" + integrity sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg== + dependencies: + "@types/methods" "^1.1.4" + "@types/superagent" "^8.1.0" + "@types/tough-cookie@*": version "4.0.2" resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" @@ -967,6 +1405,18 @@ resolved "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz" integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.33" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + dependencies: + "@types/yargs-parser" "*" + "@typescript-eslint/eslint-plugin@8.20.0": version "8.20.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz" @@ -1361,10 +1811,10 @@ agent-base@^7.1.0, agent-base@^7.1.2: resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== -ai@^4.1.9: - version "4.1.9" - resolved "https://registry.npmjs.org/ai/-/ai-4.1.9.tgz" - integrity sha512-EUc21jyV/2Fv0hEd4toLxQMxjTXBWjKnw16tpto12Vrg/EvkmfVSEvtwXDa+J70iPDmASxL10VKmJk/wnb6bZA== +ai@^4.1.11: + version "4.1.11" + resolved "https://registry.npmjs.org/ai/-/ai-4.1.11.tgz" + integrity sha512-390dahvdwt/kKCq63dyi3M7pq6iWVk9MpfY9C5+RpyDWb50tohUwxntnUvB4Y/cOXGn4Miavdo1g8JbCxsd7wg== dependencies: "@ai-sdk/provider" "1.0.6" "@ai-sdk/provider-utils" "2.1.5" @@ -1398,10 +1848,12 @@ alien-signals@^0.4.9: resolved "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz" integrity sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q== -ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" @@ -1435,7 +1887,7 @@ ansi-styles@^6.2.1: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -1453,6 +1905,13 @@ arg@^4.1.0: resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" @@ -1508,6 +1967,11 @@ async-validator@^4.2.5: resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz" integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== +async@^3.2.3: + version "3.2.6" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" @@ -1532,6 +1996,69 @@ axobject-query@^4.1.0: resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz" integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== +babel-jest@^29.0.0, babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + backo2@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz" @@ -1644,11 +2171,6 @@ browser-resolve@^2.0.0: dependencies: resolve "^1.17.0" -browser-stdout@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" @@ -1720,6 +2242,20 @@ browserslist@^4.24.0, "browserslist@>= 4.21.0": node-releases "^2.0.18" update-browserslist-db "^1.1.1" +bs-logger@^0.2.6: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" @@ -1781,6 +2317,24 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^12.0.1: + version "12.0.1" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz" + integrity sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg== + dependencies: + "@types/http-cache-semantics" "^4.0.4" + get-stream "^9.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.4" + mimic-response "^4.0.0" + normalize-url "^8.0.1" + responselike "^3.0.0" + call-bind-apply-helpers@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz" @@ -1810,7 +2364,12 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^6.0.0: +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -1833,7 +2392,7 @@ chai@^4.3.10: pathval "^1.1.1" type-detect "^4.1.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.0.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1846,6 +2405,11 @@ chalk@^5.3.0: resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz" integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + check-error@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" @@ -1882,7 +2446,7 @@ cheerio@^1.0.0: undici "^6.19.5" whatwg-mimetype "^4.0.0" -chokidar@^3.5.3, chokidar@^3.6.0: +chokidar@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -1897,6 +2461,11 @@ chokidar@^3.5.3, chokidar@^3.6.0: optionalDependencies: fsevents "~2.3.2" +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" @@ -1905,6 +2474,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +cjs-module-lexer@^1.0.0: + version "1.4.1" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + class-transformer@^0.5.1: version "0.5.1" resolved "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz" @@ -1958,6 +2532,11 @@ codemirror-wrapped-line-indent@^1.0.8: resolved "https://registry.npmjs.org/codemirror-wrapped-line-indent/-/codemirror-wrapped-line-indent-1.0.8.tgz" integrity sha512-5UwuHCz4oAZuvot1DbfFxSxJacTESdNGa/KpJD7HfpVpDAJdgB1vV9OG4b4pkJqPWuOfIpFLTQEKS85kTpV+XA== +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" @@ -2149,6 +2728,19 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + create-require@^1.1.0, create-require@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" @@ -2159,7 +2751,7 @@ crelt@^1.0.5: resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz" integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== -cross-spawn@^7.0.0, cross-spawn@^7.0.6: +cross-spawn@^7.0.0, cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -2237,20 +2829,13 @@ de-indent@^1.0.2: resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz" integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== -debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4, debug@4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4, debug@4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^4.3.5: - version "4.4.0" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - debug@^4.3.7: version "4.4.0" resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" @@ -2272,16 +2857,23 @@ debug@2.6.9: dependencies: ms "2.0.0" -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - decimal.js@^10.4.3: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + deep-eql@^4.1.3: version "4.1.4" resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz" @@ -2299,6 +2891,16 @@ deep-is@^0.1.3: resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + define-properties@^1.1.3: version "1.2.0" resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" @@ -2345,6 +2947,11 @@ destroy@^1.0.4, destroy@1.2.0: resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz" @@ -2368,11 +2975,6 @@ diff@^4.0.1: resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" - integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" @@ -2463,6 +3065,13 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +ejs@^3.1.10: + version "3.1.10" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + electron-to-chromium@^1.5.41: version "1.5.64" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz" @@ -2502,6 +3111,11 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" @@ -2600,6 +3214,13 @@ entities@^4.2.0, entities@^4.4.0, entities@^4.5.0: resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es-define-property@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" @@ -2665,6 +3286,11 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" @@ -2791,6 +3417,11 @@ espree@^9.3.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.4.0, esquery@^1.5.0: version "1.6.0" resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" @@ -2857,6 +3488,37 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + express-session@^1.17.3, express-session@>=1: version "1.17.3" resolved "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz" @@ -2929,7 +3591,7 @@ fast-glob@^3.3.2, fast-glob@^3.3.3: merge2 "^1.3.0" micromatch "^4.0.8" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -2956,6 +3618,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" @@ -2963,6 +3632,13 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + fill-range@^7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" @@ -2983,6 +3659,22 @@ finalhandler@1.3.1: statuses "2.0.1" unpipe "~1.0.0" +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" @@ -3008,11 +3700,6 @@ flat-cache@^4.0.0: flatted "^3.2.9" keyv "^4.5.4" -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - flatted@^3.2.9: version "3.3.2" resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz" @@ -3038,6 +3725,11 @@ foreground-child@^3.1.0: cross-spawn "^7.0.0" signal-exit "^4.0.1" +form-data-encoder@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz" + integrity sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw== + form-data@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" @@ -3076,6 +3768,11 @@ fresh@~0.5.2, fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + function-bind@^1.1.1, function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -3117,6 +3814,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.2.5, get-intrinsic@ hasown "^2.0.2" math-intrinsics "^1.1.0" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-proto@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" @@ -3125,6 +3827,19 @@ get-proto@^1.0.0: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-stream@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz" + integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA== + dependencies: + "@sec-ant/readable-stream" "^0.4.1" + is-stream "^4.0.1" + glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" @@ -3146,7 +3861,7 @@ glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^10.2.2, glob@^10.3.3, glob@^10.4.5: +glob@^10.2.2, glob@^10.3.3: version "10.4.5" resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== @@ -3158,6 +3873,30 @@ glob@^10.2.2, glob@^10.3.3, glob@^10.4.5: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.4: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + global@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" @@ -3188,6 +3927,28 @@ gopd@^1.0.1, gopd@^1.2.0: resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== +got@^14.4.5: + version "14.4.5" + resolved "https://registry.npmjs.org/got/-/got-14.4.5.tgz" + integrity sha512-sq+uET8TnNKRNnjEOPJzMcxeI0irT8BBNmf+GtZcJpmhYsQM1DSKmCROUjPWKsXZ5HzwD5Cf5/RV+QD9BSTxJg== + dependencies: + "@sindresorhus/is" "^7.0.1" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^12.0.1" + decompress-response "^6.0.0" + form-data-encoder "^4.0.2" + http2-wrapper "^2.2.1" + lowercase-keys "^3.0.0" + p-cancelable "^4.0.1" + responselike "^3.0.0" + type-fest "^4.26.1" + +graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graphemer@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" @@ -3289,6 +4050,11 @@ html-encoding-sniffer@^4.0.0: dependencies: whatwg-encoding "^3.1.1" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + html-tags@^3.3.1: version "3.3.1" resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" @@ -3312,6 +4078,11 @@ http-assert@^1.3.0: deep-equal "~1.0.1" http-errors "~1.8.0" +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + http-errors@^1.6.3: version "1.8.1" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" @@ -3353,6 +4124,14 @@ http-proxy-agent@^7.0.2: agent-base "^7.1.0" debug "^4.3.4" +http2-wrapper@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" @@ -3366,6 +4145,11 @@ https-proxy-agent@^7.0.5: agent-base "^7.1.2" debug "4" +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + iconv-lite@^0.6.3, iconv-lite@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" @@ -3403,6 +4187,14 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" @@ -3418,7 +4210,15 @@ inflation@^2.0.0: resolved "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz" integrity sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw== -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4, inherits@2.0.4: +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3441,6 +4241,11 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" @@ -3470,6 +4275,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" @@ -3497,11 +4307,6 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" @@ -3514,6 +4319,16 @@ is-reference@^3.0.3: dependencies: "@types/estree" "^1.0.6" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz" + integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A== + is-typed-array@^1.1.10, is-typed-array@^1.1.3: version "1.1.10" resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" @@ -3525,11 +4340,6 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3: gopd "^1.0.1" has-tostringtag "^1.0.0" -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" @@ -3555,6 +4365,59 @@ isomorphic-timers-promises@^1.0.1: resolved "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz" integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.3" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + jackspeak@^3.1.2: version "3.4.3" resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" @@ -3564,6 +4427,374 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@*, jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.0.0, jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + jmespath@^0.16.0: version "0.16.0" resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz" @@ -3595,6 +4826,14 @@ js-tokens@^9.0.0: resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz" integrity sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ== +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" @@ -3652,6 +4891,11 @@ json-editor-vue@^0.17.3: vanilla-jsoneditor "^2.0.0" vue-demi "^0.14.10" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-parse-even-better-errors@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz" @@ -3757,6 +5001,11 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + koa-bodyparser@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.0.tgz" @@ -3807,6 +5056,11 @@ koa@^2.14.2: type-is "^1.6.16" vary "^1.1.2" +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + levn@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" @@ -3820,6 +5074,11 @@ libphonenumber-js@^1.10.14: resolved "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.31.tgz" integrity sha512-qYTzElLePmz3X/6I0JPX5n87tu7jVIMtR/yRLi5PGVPvMCMSVTCR+079KmdNK005i4dBjFxY/bMYceI9IBp47w== +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + linkify-it@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz" @@ -3845,6 +5104,13 @@ locate-character@^3.0.0: resolved "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz" integrity sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -3892,6 +5158,11 @@ lodash.isstring@^4.0.1: resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" @@ -3907,14 +5178,6 @@ lodash@*, lodash@^4.17.21: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - loupe@^2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz" @@ -3922,6 +5185,11 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.0" +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" @@ -3960,11 +5228,25 @@ magic-string@^0.30.1, magic-string@^0.30.11, magic-string@^0.30.12, magic-string dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" -make-error@^1.1.1: +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.1.1, make-error@^1.3.6: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + markdown-it@^14.1.0: version "14.1.0" resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" @@ -4016,6 +5298,11 @@ merge-descriptors@1.0.3: resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" @@ -4026,7 +5313,7 @@ methods@^1.1.2, methods@~1.1.2: resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.8: +micromatch@^4.0.4, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -4064,6 +5351,21 @@ mime@2.6.0: resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" @@ -4081,6 +5383,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -4088,7 +5397,7 @@ minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^5.1.6: +minimatch@^5.0.1: version "5.1.6" resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== @@ -4136,32 +5445,6 @@ mlly@^1.4.0, mlly@^1.7.2, mlly@^1.7.3: pkg-types "^1.2.1" ufo "^1.5.4" -mocha@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz" - integrity sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg== - dependencies: - ansi-colors "^4.1.3" - browser-stdout "^1.3.1" - chokidar "^3.5.3" - debug "^4.3.5" - diff "^5.2.0" - escape-string-regexp "^4.0.0" - find-up "^5.0.0" - glob "^10.4.5" - he "^1.2.0" - js-yaml "^4.1.0" - log-symbols "^4.1.0" - minimatch "^5.1.6" - ms "^2.1.3" - serialize-javascript "^6.0.2" - strip-json-comments "^3.1.1" - supports-color "^8.1.1" - workerpool "^6.5.1" - yargs "^17.7.2" - yargs-parser "^21.1.1" - yargs-unparser "^2.0.0" - ms@^2.1.1, ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" @@ -4220,6 +5503,11 @@ negotiator@0.6.3: resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + node-releases@^2.0.18: version "2.0.18" resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz" @@ -4270,6 +5558,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz" + integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== + normalize-wheel-es@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz" @@ -4294,6 +5587,13 @@ npm-run-all2@^7.0.1: shell-quote "^1.7.3" which "^5.0.0" +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + nth-check@^2.0.1, nth-check@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" @@ -4356,13 +5656,20 @@ on-headers@~1.0.2: resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + only@~0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/only/-/only-0.0.2.tgz" @@ -4385,7 +5692,19 @@ os-browserify@^0.3.0: resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== -p-limit@^3.0.2: +p-cancelable@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz" + integrity sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -4399,6 +5718,13 @@ p-limit@^4.0.0: dependencies: yocto-queue "^1.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" @@ -4406,6 +5732,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + package-json-from-dist@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" @@ -4434,6 +5765,16 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse5-htmlparser2-tree-adapter@^7.0.0: version "7.1.0" resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz" @@ -4481,7 +5822,12 @@ path-exists@^4.0.0: resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-key@^3.1.0: +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -4535,7 +5881,7 @@ picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -4558,6 +5904,18 @@ pinia@^2.0.37: "@vue/devtools-api" "^6.6.3" vue-demi "^0.14.10" +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + pkg-dir@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz" @@ -4608,7 +5966,7 @@ prettier@^3.0.1, "prettier@>= 3.0.0", prettier@>=3.0.0: resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== -pretty-format@^29.5.0: +pretty-format@^29.0.0, pretty-format@^29.5.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== @@ -4637,6 +5995,14 @@ process@^0.11.10: resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" @@ -4687,6 +6053,11 @@ punycode@1.3.2: resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + qs@^6.11.0, qs@^6.5.2, qs@6.13.0: version "6.13.0" resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" @@ -4709,12 +6080,17 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + random-bytes@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -4827,12 +6203,34 @@ require-from-string@^2.0.2: resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.17.0: +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== + +resolve@^1.17.0, resolve@^1.20.0: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -4841,6 +6239,13 @@ resolve@^1.17.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + reusify@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" @@ -4934,7 +6339,7 @@ secure-json-parse@^2.7.0: resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz" integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== -semver@^6.3.1: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -4959,9 +6364,9 @@ semver@^7.5.3: integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== semver@^7.5.4: - version "7.6.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + version "7.7.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz" + integrity sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ== semver@^7.6.0: version "7.6.3" @@ -4992,13 +6397,6 @@ send@0.19.0: range-parser "~1.2.1" statuses "2.0.1" -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - serve-static@1.16.2: version "1.16.2" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" @@ -5089,11 +6487,31 @@ siginfo@^2.0.0: resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + signal-exit@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz" integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + socket.io-adapter@~2.5.2: version "2.5.5" resolved "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz" @@ -5164,6 +6582,31 @@ source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + stackback@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" @@ -5214,6 +6657,14 @@ string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -5271,6 +6722,16 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" @@ -5341,7 +6802,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.1.1: +supports-color@^8.0.0: version "8.1.1" resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -5386,11 +6847,6 @@ swr@^2.2.5: dequal "^2.0.3" use-sync-external-store "^1.4.0" -swrv@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/swrv/-/swrv-1.0.4.tgz" - integrity sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g== - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" @@ -5409,6 +6865,15 @@ template-url@^1.0.0: resolved "https://registry.npmjs.org/template-url/-/template-url-1.0.0.tgz" integrity sha512-QUjZNE7yTdIzB91sITTSYcSX5GRF5FulKvIYCqV5350NfSNfiuuCYQIJZ5PIN7k/uJ+kpurEEv9hFqRRc+JilA== +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + throttleit@2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz" @@ -5448,6 +6913,11 @@ tldts@^6.1.32: dependencies: tldts-core "^6.1.71" +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + to-array@0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz" @@ -5484,7 +6954,22 @@ ts-api-utils@^2.0.0: resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz" integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ== -ts-node@^10.9.1: +ts-jest@^29.2.5: + version "29.2.5" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== + dependencies: + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" + +ts-node@^10.9.1, ts-node@>=9.0.0: version "10.9.1" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -5530,11 +7015,26 @@ type-detect@^4.0.0, type-detect@^4.1.0: resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz" integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^4.26.1: + version "4.33.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz" + integrity sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g== + type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" @@ -5562,7 +7062,7 @@ typescript-eslint@^8.20.0: "@typescript-eslint/parser" "8.20.0" "@typescript-eslint/utils" "8.20.0" -typescript@*, typescript@>=2.7, typescript@>=4.4.4, typescript@>=4.8.4, "typescript@>=4.8.4 <5.8.0", typescript@>=5.0.0, typescript@~5.2.2: +typescript@*, typescript@>=2.7, "typescript@>=4.3 <6", typescript@>=4.4.4, typescript@>=4.8.4, "typescript@>=4.8.4 <5.8.0", typescript@>=5.0.0, typescript@~5.2.2: version "5.2.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== @@ -5725,6 +7225,15 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +v8-to-istanbul@^9.0.1: + version "9.3.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + validator@^13.7.0: version "13.9.0" resolved "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz" @@ -5913,7 +7422,7 @@ vue-tsc@^2.0.0: "@volar/typescript" "~2.4.11" "@vue/language-core" "2.2.0" -"vue@^2.6.14 || ^3.5.11", vue@^3, vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.3.4, vue@^3.5.1, "vue@>=3.2.26 < 4", "vue@2 || 3", vue@2||3, vue@3.5.13: +"vue@^2.6.14 || ^3.5.11", vue@^3, vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.5.1, "vue@2 || 3", vue@2||3, vue@3.5.13: version "3.5.13" resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz" integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== @@ -5936,6 +7445,13 @@ w3c-xmlserializer@^5.0.0: dependencies: xml-name-validator "^5.0.0" +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" @@ -6005,11 +7521,6 @@ word-wrap@^1.2.5: resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -workerpool@^6.5.1: - version "6.5.1" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz" - integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -6042,6 +7553,14 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + ws@^8.18.0: version "8.18.0" resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz" @@ -6112,17 +7631,7 @@ yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-unparser@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@^17.7.2: +yargs@^17.3.1: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From 7ec6a447c1049813e0c4526ecd86bd39d2a7e995 Mon Sep 17 00:00:00 2001 From: nemo Date: Tue, 11 Feb 2025 17:12:07 +0000 Subject: [PATCH 05/69] streams WIP --- babel.config.js | 6 + jest.config.js | 5 +- package.json | 9 +- server/controllers/OpeyIIController.ts | 54 +- server/schema/OpeySchema.ts | 4 + server/services/OpeyClientService.ts | 34 +- tests/opey.test.ts | 83 ++- yarn.lock | 922 ++++++++++++++++++++++--- 8 files changed, 954 insertions(+), 163 deletions(-) create mode 100644 babel.config.js diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..9ba90d5 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + ['@babel/preset-env', {targets: {node: 'current'}}], + '@babel/preset-typescript', + ], +}; \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 6da536c..0063e0c 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,8 @@ module.exports = { - transform: {'^.+\\.ts?$': 'ts-jest'}, + transform: { + '^.+\\.ts?$': 'ts-jest', + "^.+\\.(js)$": "babel-jest", + }, preset: 'ts-jest', testEnvironment: 'node', testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', diff --git a/package.json b/package.json index a3384ca..c81a2f4 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "build-server": "tsc --project tsconfig.server.json", "preview": "vite preview", "test:unit": "vitest", - "test": "jest", + "test": "jest --silent=false", "build-only": "vite build", "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false", "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", @@ -39,6 +39,7 @@ "json-editor-vue": "^0.17.3", "jsonwebtoken": "^9.0.2", "markdown-it": "^14.1.0", + "node-fetch": "v2.6", "oauth": "^0.10.0", "obp-typescript": "^1.0.36", "pinia": "^2.0.37", @@ -59,17 +60,21 @@ "ws": "^8.18.0" }, "devDependencies": { + "@babel/core": "^7.26.8", + "@babel/preset-env": "^7.26.8", + "@babel/preset-typescript": "^7.26.0", "@rushstack/eslint-patch": "^1.4.0", "@types/jsdom": "^21.1.7", "@types/jsonwebtoken": "^9.0.6", "@types/markdown-it": "^14.1.1", - "@types/node": "^20.17.16", + "@types/node": "^20.17.17", "@vitejs/plugin-vue": "^4.3.0", "@vitejs/plugin-vue-jsx": "^3.1.0", "@vue/eslint-config-prettier": "^9.0.0", "@vue/eslint-config-typescript": "^14.0.0", "@vue/test-utils": "^2.4.0", "@vue/tsconfig": "^0.1.3", + "babel-jest": "^29.7.0", "eslint": "^9.15.0", "eslint-plugin-vue": "^9.12.0", "jest": "^29.7.0", diff --git a/server/controllers/OpeyIIController.ts b/server/controllers/OpeyIIController.ts index 036d073..642214c 100644 --- a/server/controllers/OpeyIIController.ts +++ b/server/controllers/OpeyIIController.ts @@ -6,6 +6,7 @@ import { Service } from 'typedi' import OBPClientService from '../services/OBPClientService' import OpeyClientService from '../services/OpeyClientService' import { v6 as uuid6 } from 'uuid'; +import { Transform } from 'stream' import { UserInput } from '../schema/OpeySchema' @Service() @@ -133,29 +134,44 @@ export class OpeyController { } + console.log("Calling OpeyClientService.stream") + + const streamMiddlewareTransform = new Transform({ + transform(chunk, encoding, callback) { + console.log(`Logged Chunk: ${chunk}`) + this.push(chunk); + + callback(); + } + }) try { - console.log("Calling OpeyClientService.stream") - const stream = await this.opeyClientService.stream(user_input) - try{ - response.setHeader('Content-Type', 'text/event-stream') - return stream - } catch (error) { - console.error("Error in stream endpoint: ", error) - return response.status(500).json({ error: 'Internal Server Error' }) - } - - - + const nodeStream = await this.opeyClientService.stream(user_input) + console.log(`Stream received from OpeyClientService.stream: ${nodeStream.readable}`) + nodeStream.pipe(streamMiddlewareTransform).pipe(response) + response.status(200) + response.setHeader('Content-Type', 'text/event-stream') + response.setHeader('Cache-Control', 'no-cache') + response.setHeader('Connection', 'keep-alive') + + nodeStream.on('data', (chunk) => { + const data = chunk.toString() + console.log(`data: ${data}`) + response.write(`data: ${data}\n\n`) + }) + nodeStream.on('end', () => { + console.log('Stream ended') + response.end() + }) + nodeStream.on('error', (error) => { + console.error(error) + response.write(`data: Error reading stream\n\n`) + response.end() + }) } catch (error) { - console.error("Error in stream endpoint: ", error) - return response.status(500).json({ error: 'Internal Server Error' }) + console.error(error) + response.status(500).json({ error: 'Internal Server Error' }) } - - - - - } } \ No newline at end of file diff --git a/server/schema/OpeySchema.ts b/server/schema/OpeySchema.ts index 7c55899..7a2ae82 100644 --- a/server/schema/OpeySchema.ts +++ b/server/schema/OpeySchema.ts @@ -5,6 +5,10 @@ export class UserInput { is_tool_call_approval: boolean; } +export class StreamInput extends UserInput { + stream_tokens: boolean; +} + export type OpeyConfig = { baseUri: string, authConfig: any, diff --git a/server/services/OpeyClientService.ts b/server/services/OpeyClientService.ts index d7aea9f..20941b6 100644 --- a/server/services/OpeyClientService.ts +++ b/server/services/OpeyClientService.ts @@ -1,6 +1,6 @@ import { Service } from 'typedi' -import { got } from 'got'; -import { UserInput, OpeyConfig, AuthConfig } from '../schema/OpeySchema' +import { UserInput, StreamInput, OpeyConfig, AuthConfig } from '../schema/OpeySchema' +import fetch from 'node-fetch'; @Service() export default class OpeyClientService { @@ -23,22 +23,28 @@ export default class OpeyClientService { } } - async stream(user_input: UserInput): Promise { - + async stream(user_input: UserInput): Promise { try { - console.log(`Streaming to Opey: ${JSON.stringify(user_input)}`) //DEBUG - const stream = got.stream.post(`${this.opeyConfig.baseUri}${this.opeyConfig.paths.stream}`, { + const url = `${this.opeyConfig.baseUri}${this.opeyConfig.paths.stream}` + // We need to set whether we want to stream tokens or not + const stream_input = user_input as StreamInput + stream_input.stream_tokens = true + + console.log(`Posting to Opey: ${JSON.stringify(stream_input)}\n URL: ${url}`) //DEBUG + + const response = await fetch(url, { + method: 'POST', headers: { - "Authorization": `Bearer ${this.opeyConfig.authConfig.opeyJWT}` + "Authorization": `Bearer ${this.opeyConfig.authConfig.opeyJWT}`, + "Content-Type": "application/json" }, - body: JSON.stringify(user_input), - - }); - console.log(`Response from Opey: ${stream}`) //DEBUG - - //response.data.on('data', (chunk) => {console.log(`Recieved chunk: ${chunk.toString()}`)}); - return stream; + body: JSON.stringify(stream_input) + }) + if (!response.body) { + throw new Error("No response body") + } + return response.body as NodeJS.ReadableStream } catch (error) { throw new Error(`Error streaming to Opey: ${error}`) diff --git a/tests/opey.test.ts b/tests/opey.test.ts index d134127..f9aa0b1 100644 --- a/tests/opey.test.ts +++ b/tests/opey.test.ts @@ -1,11 +1,15 @@ import { OpeyController } from "../server/controllers/OpeyController"; import app from '../server/app'; import request from 'supertest'; +import fetch from 'node-fetch'; +import http from 'node:http'; import { UserInput } from '../server/schema/OpeySchema'; import {v4 as uuidv4} from 'uuid'; +import { agent } from "superagent"; const BEFORE_ALL_TIMEOUT = 30000; // 30 sec +const SERVER_URL = process.env.VITE_OBP_API_EXPLORER_HOST describe('GET /api/opey', () => { let response: Response; @@ -21,35 +25,74 @@ describe('GET /api/opey', () => { describe('POST /api/opey/stream', () => { - let response: Response; + + const httpAgent = new http.Agent({ keepAlive: true, port: 9999 }); + + beforeAll(async () => { + app.listen(5173) + + }); + + afterAll(async () => { + app.close() + httpAgent.destroy() + }); + - it('Should return 200', async () => { + it('Should stream response', async () => { let userInput: UserInput = { message: "Hello Opey", thread_id: uuidv4(), is_tool_call_approval: false } - const response = await request(app) - .post("/api/opey/stream") - .send(userInput) - .set('Content-Type', 'application/json') - .buffer(false) - .parse((res, callback) => { - res.on('data', (chunk) => { - console.log(`Recieved chunk: ${chunk.toString()}`); - expect(chunk.toString()).toBeTruthy(); - }); - res.on('end', () => { - callback(null, null); - }); - }); + - expect(response.status).toBe(200); - expect(response.headers['content-type']).toContain('text/event-stream'); // Ensure it is an SSE stream - expect(response.headers['transfer-encoding']).toBe('chunked'); // Ensure it is streamed - }); + // const response = await request(app) + // .post("/api/opey/stream") + // .set('Content-Type', 'text/event-stream') + // .responseType('blob') + // .send(userInput) + await fetch(`${SERVER_URL}/api/opey/stream`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'connection': 'keep-alive' + }, + body: JSON.stringify(userInput), + }) + .catch(error => { + console.error(`Error performing test fetch: ${error}`) + }) + .then(streamingResponse => { + console.log(streamingResponse) + streamingResponse.body.on('data', (chunk) => { + console.log(`${chunk}`) + }) + // response.on + // console.log(response.body) + // const readable = response.body + // readable.on('data', (chunk) => { + // const data = chunk.toString() + // console.log(`data: ${data}`) + // }) + }) + .finally(() => { + httpAgent.destroy() + }) + + + // while (true) { + // const {value, done} = await reader.read(); + // if (done) break; + // console.log('Received', value); + // } + + // expect(response.headers['content-type']).toBe('text/event-stream') + // expect(response.status).toBe(200) + // Optionally, parse chunks or check SSE headers + }) }); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index ad5c948..5898022 100644 --- a/yarn.lock +++ b/yarn.lock @@ -62,7 +62,7 @@ "@csstools/css-tokenizer" "^3.0.3" lru-cache "^10.4.3" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -71,39 +71,40 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.25.9": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz" - integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5", "@babel/compat-data@^7.26.8": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz" + integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.14.6", "@babel/core@^7.23.3", "@babel/core@^7.23.9", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" - integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.14.6", "@babel/core@^7.23.3", "@babel/core@^7.23.9", "@babel/core@^7.26.8", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz" + integrity sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.0" - "@babel/generator" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.8" + "@babel/helper-compilation-targets" "^7.26.5" "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.0" - "@babel/parser" "^7.26.0" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/helpers" "^7.26.7" + "@babel/parser" "^7.26.8" + "@babel/template" "^7.26.8" + "@babel/traverse" "^7.26.8" + "@babel/types" "^7.26.8" + "@types/gensync" "^1.0.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.26.8", "@babel/generator@^7.7.2": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz" + integrity sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" + "@babel/parser" "^7.26.8" + "@babel/types" "^7.26.8" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -115,12 +116,12 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz" - integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": + version "7.26.5" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== dependencies: - "@babel/compat-data" "^7.25.9" + "@babel/compat-data" "^7.26.5" "@babel/helper-validator-option" "^7.25.9" browserslist "^4.24.0" lru-cache "^5.1.1" @@ -139,6 +140,26 @@ "@babel/traverse" "^7.25.9" semver "^6.3.1" +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.26.3" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz" + integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.2.0" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.3": + version "0.6.3" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz" + integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + "@babel/helper-member-expression-to-functions@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz" @@ -155,7 +176,7 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.26.0": +"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": version "7.26.0" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz" integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== @@ -171,10 +192,19 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.26.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== + +"@babel/helper-remap-async-to-generator@^7.25.9": version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz" - integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/helper-replace-supers@^7.25.9": version "7.25.9" @@ -185,13 +215,6 @@ "@babel/helper-optimise-call-expression" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== - dependencies: - "@babel/types" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz" @@ -215,20 +238,68 @@ resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== -"@babel/helpers@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz" - integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== dependencies: "@babel/template" "^7.25.9" - "@babel/types" "^7.26.0" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.8", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.3", "@babel/parser@^7.25.6", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== +"@babel/helpers@^7.26.7": + version "7.26.7" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz" + integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== dependencies: - "@babel/types" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.7" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.8", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.3", "@babel/parser@^7.25.6", "@babel/parser@^7.26.8": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz" + integrity sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw== + dependencies: + "@babel/types" "^7.26.8" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/plugin-proposal-export-namespace-from@^7.14.5": version "7.18.9" @@ -238,6 +309,11 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" @@ -273,7 +349,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-attributes@^7.24.7": +"@babel/plugin-syntax-import-assertions@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz" + integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.26.0": version "7.26.0" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz" integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== @@ -294,7 +377,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.24.7", "@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@^7.24.7", "@babel/plugin-syntax-jsx@^7.25.9", "@babel/plugin-syntax-jsx@^7.7.2": version "7.25.9" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz" integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== @@ -364,16 +447,371 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.14.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz" - integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-simple-access" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-typescript@^7.23.3": +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-async-generator-functions@^7.26.8": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz" + integrity sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.26.8" + +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + +"@babel/plugin-transform-block-scoped-functions@^7.26.5": + version "7.26.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz" + integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-class-static-block@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz" + integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" + +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-exponentiation-operator@^7.26.3": + version "7.26.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-for-of@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz" + integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== + dependencies: + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-modules-commonjs@^7.14.5", "@babel/plugin-transform-modules-commonjs@^7.25.9", "@babel/plugin-transform-modules-commonjs@^7.26.3": + version "7.26.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== + dependencies: + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": + version "7.26.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz" + integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== + dependencies: + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-regexp-modifiers@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz" + integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-template-literals@^7.26.8": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz" + integrity sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-typeof-symbol@^7.26.7": + version "7.26.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz" + integrity sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-typescript@^7.23.3", "@babel/plugin-transform-typescript@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz" integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ== @@ -384,32 +822,165 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" "@babel/plugin-syntax-typescript" "^7.25.9" -"@babel/template@^7.25.0", "@babel/template@^7.25.9", "@babel/template@^7.3.3": +"@babel/plugin-transform-unicode-escapes@^7.25.9": version "7.25.9" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/traverse@^7.25.6", "@babel/traverse@^7.25.9": +"@babel/plugin-transform-unicode-property-regex@^7.25.9": version "7.25.9" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/preset-env@^7.26.8": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.8.tgz" + integrity sha512-um7Sy+2THd697S4zJEfv/U5MHGJzkN2xhtsR3T/SWRbVSic62nbISh51VVfU9JiO/L/Z97QczHTaFVkOU8IzNg== + dependencies: + "@babel/compat-data" "^7.26.8" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.26.8" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.26.5" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.26.3" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.25.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.26.3" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.26.8" + "@babel/plugin-transform-typeof-symbol" "^7.26.7" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.40.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz" + integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-typescript" "^7.25.9" + +"@babel/runtime@^7.8.4": + version "7.26.7" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz" + integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.25.0", "@babel/template@^7.25.9", "@babel/template@^7.26.8", "@babel/template@^7.3.3": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz" + integrity sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.26.8" + "@babel/types" "^7.26.8" + +"@babel/traverse@^7.25.6", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.8": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz" + integrity sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.8" + "@babel/parser" "^7.26.8" + "@babel/template" "^7.26.8" + "@babel/types" "^7.26.8" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.5", "@babel/types@^7.25.6", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.3": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.6", "@babel/types@^7.25.9", "@babel/types@^7.26.7", "@babel/types@^7.26.8", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.26.8" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz" + integrity sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1265,6 +1836,11 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/gensync@^1.0.0": + version "1.0.4" + resolved "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz" + integrity sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA== + "@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" @@ -1360,10 +1936,10 @@ resolved "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz" integrity sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ== -"@types/node@*", "@types/node@^20.17.16", "@types/node@>= 14", "@types/node@>=10.0.0": - version "20.17.16" - resolved "https://registry.npmjs.org/@types/node/-/node-20.17.16.tgz" - integrity sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw== +"@types/node@*", "@types/node@^20.17.17", "@types/node@>= 14", "@types/node@>=10.0.0": + version "20.17.17" + resolved "https://registry.npmjs.org/@types/node/-/node-20.17.17.tgz" + integrity sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg== dependencies: undici-types "~6.19.2" @@ -2030,6 +2606,30 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.12" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz" + integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.3" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz" + integrity sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.3" + core-js-compat "^3.40.0" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz" + integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.3" + babel-preset-current-node-syntax@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz" @@ -2232,14 +2832,14 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.24.0, "browserslist@>= 4.21.0": - version "4.24.2" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz" - integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== +browserslist@^4.24.0, browserslist@^4.24.3, "browserslist@>= 4.21.0": + version "4.24.4" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: - caniuse-lite "^1.0.30001669" - electron-to-chromium "^1.5.41" - node-releases "^2.0.18" + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" update-browserslist-db "^1.1.1" bs-logger@^0.2.6: @@ -2374,10 +2974,10 @@ camelcase@^6.2.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001669: - version "1.0.30001683" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz" - integrity sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q== +caniuse-lite@^1.0.30001688: + version "1.0.30001699" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz" + integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w== chai@^4.3.10: version "4.5.0" @@ -2684,6 +3284,13 @@ copy-to@^2.0.1: resolved "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz" integrity sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w== +core-js-compat@^3.40.0: + version "3.40.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz" + integrity sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ== + dependencies: + browserslist "^4.24.3" + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" @@ -3072,10 +3679,10 @@ ejs@^3.1.10: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.41: - version "1.5.64" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz" - integrity sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ== +electron-to-chromium@^1.5.73: + version "1.5.97" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz" + integrity sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ== element-plus@^2.3.9: version "2.8.8" @@ -4873,7 +5480,7 @@ jsep@^0.4.0||^1.0.0, jsep@^1.4.0: resolved "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz" integrity sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw== -jsesc@^3.0.2: +jsesc@^3.0.2, jsesc@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== @@ -5128,6 +5735,11 @@ lodash-unified@^1.0.2: resolved "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz" integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ== +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" @@ -5503,15 +6115,22 @@ negotiator@0.6.3: resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +node-fetch@v2.6: + version "2.6.13" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz" + integrity sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA== + dependencies: + whatwg-url "^5.0.0" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== node-stdlib-browser@^1.2.0: version "1.2.0" @@ -5876,7 +6495,7 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: +picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -6193,6 +6812,54 @@ reflect-metadata@^0.1.13: resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== + dependencies: + jsesc "~3.0.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -6230,7 +6897,7 @@ resolve.exports@^2.0.0: resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz" integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== -resolve@^1.17.0, resolve@^1.20.0: +resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -6949,6 +7616,11 @@ tr46@^5.0.0: dependencies: punycode "^2.3.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + ts-api-utils@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz" @@ -7094,6 +7766,29 @@ undici@^6.19.5: resolved "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz" integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + unimport@^3.13.2: version "3.13.2" resolved "https://registry.npmjs.org/unimport/-/unimport-3.13.2.tgz" @@ -7167,12 +7862,12 @@ unplugin@^1.15.0, unplugin@^1.16.0, unplugin@^1.3.2: webpack-virtual-modules "^0.6.2" update-browserslist-db@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz" - integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + version "1.1.2" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== dependencies: escalade "^3.2.0" - picocolors "^1.1.0" + picocolors "^1.1.1" uri-js@^4.2.2: version "4.4.1" @@ -7452,6 +8147,11 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" @@ -7482,6 +8182,14 @@ whatwg-url@^14.0.0: tr46 "^5.0.0" webidl-conversions "^7.0.0" +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-typed-array@^1.1.2: version "1.1.9" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" From b78daae06e8dc423c5fcad24151f3e0cc278b60b Mon Sep 17 00:00:00 2001 From: nemo Date: Wed, 12 Feb 2025 15:06:52 +0000 Subject: [PATCH 06/69] add tests for Opey status and invoke endpoints --- server/controllers/OpeyIIController.ts | 167 ++++++++++++++++--------- server/schema/OpeySchema.ts | 11 +- server/services/OpeyClientService.ts | 57 ++++++++- tests/opey.test.ts | 22 ++++ 4 files changed, 185 insertions(+), 72 deletions(-) diff --git a/server/controllers/OpeyIIController.ts b/server/controllers/OpeyIIController.ts index 642214c..1fb890e 100644 --- a/server/controllers/OpeyIIController.ts +++ b/server/controllers/OpeyIIController.ts @@ -22,7 +22,110 @@ export class OpeyController { async getStatus( @Res() response: Response ): Response { - return response.status(200).json({status: 'Opey is running'}); + + try { + const opeyStatus = await this.opeyClientService.getOpeyStatus() + console.log("Opey status: ", opeyStatus) + return response.status(200).json({status: 'Opey is running'}); + + } catch (error) { + console.error("Error in /opey endpoint: ", error); + return response.status(500).json({ error: 'Internal Server Error' }); + } + + + } + + @Post('/stream') + + async streamOpey( + @Session() session: any, + @Req() request: Request, + @Res() response: Response + ) { + + let user_input: UserInput + try { + user_input = { + "message": request.body.message, + "thread_id": request.body.thread_id, + "is_tool_call_approval": request.body.is_tool_call_approval + } + } catch (error) { + console.error("Error in stream endpoint, could not parse into UserInput: ", error) + return response.status(500).json({ error: 'Internal Server Error' }) + } + + + console.log("Calling OpeyClientService.stream") + + const streamMiddlewareTransform = new Transform({ + transform(chunk, encoding, callback) { + console.log(`Logged Chunk: ${chunk}`) + this.push(chunk); + + callback(); + } + }) + + try { + const nodeStream = await this.opeyClientService.stream(user_input) + console.log(`Stream received from OpeyClientService.stream: ${nodeStream.readable}`) + nodeStream.pipe(streamMiddlewareTransform).pipe(response) + + response.status(200) + response.setHeader('Content-Type', 'text/event-stream') + response.setHeader('Cache-Control', 'no-cache') + response.setHeader('Connection', 'keep-alive') + + // nodeStream.on('data', (chunk) => { + // const data = chunk.toString() + // console.log(`data: ${data}`) + // response.write(`data: ${data}\n\n`) + // }) + // nodeStream.on('end', () => { + // console.log('Stream ended') + // response.end() + // }) + // nodeStream.on('error', (error) => { + // console.error(error) + // response.write(`data: Error reading stream\n\n`) + // response.end() + // }) + } catch (error) { + console.error(error) + response.status(500).json({ error: 'Internal Server Error' }) + } + } + + @Post('/invoke') + async invokeOpey( + @Session() session: any, + @Req() request: Request, + @Res() response: Response + ): Response { + + let user_input: UserInput + try { + user_input = { + "message": request.body.message, + "thread_id": request.body.thread_id, + "is_tool_call_approval": request.body.is_tool_call_approval + } + } catch (error) { + console.error("Error in stream endpoint, could not parse into UserInput: ", error) + return response.status(500).json({ error: 'Internal Server Error' }) + } + + try { + const opey_response = await this.opeyClientService.invoke(user_input) + + console.log("Opey response: ", opey_response) + return response.status(200).json(opey_response) + } catch (error) { + console.error(error) + return response.status(500).json({ error: 'Internal Server Error' }) + } } @Post('/consent') @@ -113,65 +216,5 @@ export class OpeyController { } - @Post('/stream') - - async streamOpey( - @Session() session: any, - @Req() request: Request, - @Res() response: Response - ) { - - let user_input: UserInput - try { - user_input = { - "message": request.body.message, - "thread_id": request.body.thread_id, - "is_tool_call_approval": request.body.is_tool_call_approval - } - } catch (error) { - console.error("Error in stream endpoint, could not parse into UserInput: ", error) - return response.status(500).json({ error: 'Internal Server Error' }) - } - - - console.log("Calling OpeyClientService.stream") - - const streamMiddlewareTransform = new Transform({ - transform(chunk, encoding, callback) { - console.log(`Logged Chunk: ${chunk}`) - this.push(chunk); - - callback(); - } - }) - - try { - const nodeStream = await this.opeyClientService.stream(user_input) - console.log(`Stream received from OpeyClientService.stream: ${nodeStream.readable}`) - nodeStream.pipe(streamMiddlewareTransform).pipe(response) - - response.status(200) - response.setHeader('Content-Type', 'text/event-stream') - response.setHeader('Cache-Control', 'no-cache') - response.setHeader('Connection', 'keep-alive') - - nodeStream.on('data', (chunk) => { - const data = chunk.toString() - console.log(`data: ${data}`) - response.write(`data: ${data}\n\n`) - }) - nodeStream.on('end', () => { - console.log('Stream ended') - response.end() - }) - nodeStream.on('error', (error) => { - console.error(error) - response.write(`data: Error reading stream\n\n`) - response.end() - }) - } catch (error) { - console.error(error) - response.status(500).json({ error: 'Internal Server Error' }) - } - } + } \ No newline at end of file diff --git a/server/schema/OpeySchema.ts b/server/schema/OpeySchema.ts index 7a2ae82..ab1cb03 100644 --- a/server/schema/OpeySchema.ts +++ b/server/schema/OpeySchema.ts @@ -9,15 +9,14 @@ export class StreamInput extends UserInput { stream_tokens: boolean; } +export type OpeyPaths = { + [key: string]: string; +} + export type OpeyConfig = { baseUri: string, authConfig: any, - paths: { - stream: string, - invoke: string, - approve_tool: string, - feedback: string, - } + paths: OpeyPaths, } export type AuthConfig = { diff --git a/server/services/OpeyClientService.ts b/server/services/OpeyClientService.ts index 20941b6..854f80f 100644 --- a/server/services/OpeyClientService.ts +++ b/server/services/OpeyClientService.ts @@ -15,6 +15,7 @@ export default class OpeyClientService { baseUri: process.env.VITE_CHATBOT_URL? process.env.VITE_CHATBOT_URL : 'http://localhost:5000', authConfig: this.authConfig, paths: { + status: '/status', stream: '/stream', invoke: '/invoke', approve_tool: '/approve_tool/{thead_id}', @@ -23,7 +24,31 @@ export default class OpeyClientService { } } + async getOpeyStatus(): Promise { + // Endpoint to check if Opey is running + try { + const url = `${this.opeyConfig.baseUri}${this.opeyConfig.paths.status}` + const response = await fetch(url, { + method: 'GET', + headers: {} + }) + if (response.status === 200) { + const status = await response.json() + return status + } else { + throw new Error(`Error getting status from Opey: ${response.status} ${response.statusText}`) + } + + + + + } catch (error) { + throw new Error(`Error getting status from Opey: ${error}`) + } + } + async stream(user_input: UserInput): Promise { + // Endpoint to post a message to Opey and stream the response tokens/messages try { const url = `${this.opeyConfig.baseUri}${this.opeyConfig.paths.stream}` @@ -31,7 +56,7 @@ export default class OpeyClientService { const stream_input = user_input as StreamInput stream_input.stream_tokens = true - console.log(`Posting to Opey: ${JSON.stringify(stream_input)}\n URL: ${url}`) //DEBUG + console.log(`Posting to Opey with streaming: ${JSON.stringify(stream_input)}\n URL: ${url}`) //DEBUG const response = await fetch(url, { method: 'POST', @@ -47,10 +72,34 @@ export default class OpeyClientService { return response.body as NodeJS.ReadableStream } catch (error) { - throw new Error(`Error streaming to Opey: ${error}`) + throw new Error(`Error streaming from Opey: ${error}`) } - + } - + async invoke(user_input: UserInput): Promise { + // Endpoint to post a message to Opey and get a response without stream + // I.e. a normal REST call + const url = `${this.opeyConfig.baseUri}${this.opeyConfig.paths.invoke}` + + console.log(`Posting to Opey, STREAMING OFF: ${JSON.stringify(user_input)}\n URL: ${url}`) //DEBUG + + try { + const response = await fetch(url, { + method: 'POST', + headers: { + "Authorization": `Bearer ${this.opeyConfig.authConfig.opeyJWT}`, + "Content-Type": "application/json" + }, + body: JSON.stringify(user_input) + }) + if (response.status === 200) { + const opey_response = await response.json() + return opey_response + } else { + throw new Error(`Error invoking Opey: ${response.status} ${response.statusText}`) + } + } catch (error) { + throw new Error(`Error invoking Opey: ${error}`) + } } } \ No newline at end of file diff --git a/tests/opey.test.ts b/tests/opey.test.ts index f9aa0b1..74d9209 100644 --- a/tests/opey.test.ts +++ b/tests/opey.test.ts @@ -23,6 +23,28 @@ describe('GET /api/opey', () => { }); }); +describe('GET /api/opey/invoke', () => { + let response: Response; + + let userInput: UserInput = { + message: "Hello Opey", + thread_id: uuidv4(), + is_tool_call_approval: false + } + + it('Should return 200', async () => { + const response = await request(app) + .post("/api/opey/invoke") + .send(userInput) + .set('Content-Type', 'application/json') + .then(response => { + console.log(`Response: ${response.body}`) + expect(response.status).toBe(200); + }) + + + }); +}) describe('POST /api/opey/stream', () => { From 3321235c7fac9b233fc1fdfb0c70bb47a8ad3c1b Mon Sep 17 00:00:00 2001 From: nemo Date: Fri, 14 Feb 2025 17:27:55 +0000 Subject: [PATCH 07/69] tests WIP --- package.json | 4 +- server/controllers/OpeyIIController.ts | 78 ++++++++----- tests/opey-unit.test.ts | 154 +++++++++++++++++++++++++ tests/opey.test.ts | 83 +++++++------ yarn.lock | 127 +++++++++++++++++--- 5 files changed, 363 insertions(+), 83 deletions(-) create mode 100644 tests/opey-unit.test.ts diff --git a/package.json b/package.json index c81a2f4..d4fbc70 100644 --- a/package.json +++ b/package.json @@ -64,10 +64,11 @@ "@babel/preset-env": "^7.26.8", "@babel/preset-typescript": "^7.26.0", "@rushstack/eslint-patch": "^1.4.0", + "@types/express": "^5.0.0", "@types/jsdom": "^21.1.7", "@types/jsonwebtoken": "^9.0.6", "@types/markdown-it": "^14.1.1", - "@types/node": "^20.17.17", + "@types/node": "^22.13.4", "@vitejs/plugin-vue": "^4.3.0", "@vitejs/plugin-vue-jsx": "^3.1.0", "@vue/eslint-config-prettier": "^9.0.0", @@ -79,6 +80,7 @@ "eslint-plugin-vue": "^9.12.0", "jest": "^29.7.0", "jsdom": "^25.0.1", + "node-mocks-http": "^1.16.2", "npm-run-all2": "^7.0.1", "prettier": "^3.0.1", "superagent": "^9.0.0", diff --git a/server/controllers/OpeyIIController.ts b/server/controllers/OpeyIIController.ts index 1fb890e..bed47eb 100644 --- a/server/controllers/OpeyIIController.ts +++ b/server/controllers/OpeyIIController.ts @@ -14,14 +14,14 @@ import { UserInput } from '../schema/OpeySchema' export class OpeyController { constructor( - private obpClientService: OBPClientService, - private opeyClientService: OpeyClientService, + public obpClientService: OBPClientService, + public opeyClientService: OpeyClientService, ) {} @Get('/') async getStatus( @Res() response: Response - ): Response { + ): Promise { try { const opeyStatus = await this.opeyClientService.getOpeyStatus() @@ -67,33 +67,57 @@ export class OpeyController { callback(); } }) + + let nodeStream: NodeJS.ReadableStream | null = null try { - const nodeStream = await this.opeyClientService.stream(user_input) - console.log(`Stream received from OpeyClientService.stream: ${nodeStream.readable}`) - nodeStream.pipe(streamMiddlewareTransform).pipe(response) + // Read stream from OpeyClientService + nodeStream = await this.opeyClientService.stream(user_input) + console.debug(`Stream received readable: ${nodeStream.readable}`) + + } catch (error) { + console.error("Error reading stream: ", error) + response.status(500).json({ error: 'Internal Server Error' }) + return + } + + if (!nodeStream || !nodeStream.readable) { + console.error("Stream is not readable") + response.status(500).json({ error: 'Internal Server Error' }) + return + } + + try { + // response.writeHead(200, { + // 'Content-Type': "text/event-stream", + // 'Cache-Control': "no-cache", + // 'Connection': "keep-alive" + // }); - response.status(200) response.setHeader('Content-Type', 'text/event-stream') response.setHeader('Cache-Control', 'no-cache') response.setHeader('Connection', 'keep-alive') - // nodeStream.on('data', (chunk) => { - // const data = chunk.toString() - // console.log(`data: ${data}`) - // response.write(`data: ${data}\n\n`) - // }) - // nodeStream.on('end', () => { - // console.log('Stream ended') - // response.end() - // }) - // nodeStream.on('error', (error) => { - // console.error(error) - // response.write(`data: Error reading stream\n\n`) - // response.end() - // }) + let data: any[] = [] + + nodeStream.on('data', (chunk) => { + const bufferChunk = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); + data.push(bufferChunk); + response.write(`data: ${chunk.toString()}\n\n`) + }) + nodeStream.on('end', () => { + //console.log('Stream ended') + const totalData = Buffer.concat(data) + response.write(totalData) + response.end() + }) + nodeStream.on('error', (error) => { + console.error(error) + response.write(`data: Error reading stream\n\n`) + response.end() + }) } catch (error) { - console.error(error) + console.error("Error writing data: ", error) response.status(500).json({ error: 'Internal Server Error' }) } } @@ -103,7 +127,7 @@ export class OpeyController { @Session() session: any, @Req() request: Request, @Res() response: Response - ): Response { + ): Promise { let user_input: UserInput try { @@ -113,14 +137,14 @@ export class OpeyController { "is_tool_call_approval": request.body.is_tool_call_approval } } catch (error) { - console.error("Error in stream endpoint, could not parse into UserInput: ", error) + console.error("Error in invoke endpoint, could not parse into UserInput: ", error) return response.status(500).json({ error: 'Internal Server Error' }) } try { const opey_response = await this.opeyClientService.invoke(user_input) - console.log("Opey response: ", opey_response) + //console.log("Opey response: ", opey_response) return response.status(200).json(opey_response) } catch (error) { console.error(error) @@ -136,7 +160,7 @@ export class OpeyController { @Session() session: any, @Req() request: Request, @Res() response: Response - ): Response { + ): Promise { try { console.log("Getting consent from OBP") // Check if consent is already in session @@ -190,7 +214,7 @@ export class OpeyController { @Session() session: any, @Req() request: Request, @Res() response: Response - ): Response { + ): Promise { try { const oauthConfig = session['clientConfig'] const version = this.obpClientService.getOBPVersion() diff --git a/tests/opey-unit.test.ts b/tests/opey-unit.test.ts new file mode 100644 index 0000000..13c2903 --- /dev/null +++ b/tests/opey-unit.test.ts @@ -0,0 +1,154 @@ +import { OpeyController } from "../server/controllers/OpeyIIController"; +import OpeyClientService from '../server/services/OpeyClientService'; +import OBPClientService from '../server/services/OBPClientService'; +import Stream, { Readable } from 'stream'; +import { Request, Response } from 'express'; +import httpMocks from 'node-mocks-http' +import { EventEmitter } from 'events'; +import {jest} from '@jest/globals'; + +jest.mock("../server/services/OpeyClientService", () => { + return { + OpeyClientService: jest.fn().mockImplementation(() => { + return { + getOpeyStatus: jest.fn(async () => { + return {status: 'running'} + }), + stream: jest.fn(async () => { + const readableStream = new Stream.Readable(); + + for (let i=0; i<10; i++) { + readableStream.push(`Chunk ${i}`); + } + + return readableStream as NodeJS.ReadableStream; + }), + invoke: jest.fn(async () => { + return { + content: 'Hi this is Opey', + } + }) + } + + }), + }; +}); + +// jest.mock("./A", () => { +// return { +// A: jest.fn().mockImplementation(() => { +// return { +// getSomething: getSomethingMock +// } +// }) +// }; +// }); +// Mock the OpeyClientService class + + +// jest.mocked(OpeyClientService).mockImplementation(() => { +// return { +// getOpeyStatus: jest.fn(async () => { +// return {status: 'running'} +// }), +// stream: jest.fn(async () => { +// const readableStream = new Stream.Readable(); + +// for (let i=0; i<10; i++) { +// readableStream.push(`Chunk ${i}`); +// } + +// return readableStream as NodeJS.ReadableStream; +// }), +// invoke: jest.fn(async () => { +// return { +// content: 'Hi this is Opey', +// } +// }) +// } +// }); + + + +describe('OpeyController', () => { + // Mock the OpeyClientService class + + const MockOpeyClientService = { + authConfig: {}, + opeyConfig: {}, + getOpeyStatus: jest.fn(async () => { + return {status: 'running'} + }), + stream: jest.fn(async () => { + + async function * generator() { + for (let i=0; i<10; i++) { + yield `Chunk ${i}`; + } + } + + const readableStream = Stream.Readable.from(generator()); + + return readableStream as NodeJS.ReadableStream; + }), + invoke: jest.fn(async () => { + return { + content: 'Hi this is Opey', + } + }) + } as unknown as jest.Mocked + + + // Instantiate OpeyController with the mocked OpeyClientService + const opeyController = new OpeyController(new OBPClientService, MockOpeyClientService) + + + it('getStatus', async () => { + const res = httpMocks.createResponse(); + + await opeyController.getStatus(res) + expect(MockOpeyClientService.getOpeyStatus).toHaveBeenCalled(); + expect(res.statusCode).toBe(200); + }) + + it('streamOpey', () => { + + // The default event emitter does nothing, so replace + const res = httpMocks.createResponse({ + eventEmitter: EventEmitter, + writableStream: Stream.Writable + }); + + const req = { + body: { + message: 'Hello Opey', + thread_id: '123', + is_tool_call_approval: false + } + } as unknown as Request; + + // Define handelrs for events + res.on('end', () => { + console.log('Stream ended') + console.log(res._getData()) + expect(res.statusCode).toBe(200); + }) + + let chunks: any[] = []; + res.on('data', (chunk) => { + console.log(chunk) + chunks.push(chunk); + expect(chunk).toBeDefined(); + }) + + opeyController.streamOpey({}, req, res) + .then((res) => { + console.log(res) + }) + + expect(chunks.length).toBe(10); + expect(MockOpeyClientService.stream).toHaveBeenCalled(); + expect(res).toBeDefined(); + + }) +}) diff --git a/tests/opey.test.ts b/tests/opey.test.ts index 74d9209..d884228 100644 --- a/tests/opey.test.ts +++ b/tests/opey.test.ts @@ -1,5 +1,4 @@ -import { OpeyController } from "../server/controllers/OpeyController"; -import app from '../server/app'; +import app, { instance } from '../server/app'; import request from 'supertest'; import fetch from 'node-fetch'; import http from 'node:http'; @@ -24,49 +23,72 @@ describe('GET /api/opey', () => { }); describe('GET /api/opey/invoke', () => { - let response: Response; + let response; let userInput: UserInput = { message: "Hello Opey", thread_id: uuidv4(), is_tool_call_approval: false } - - it('Should return 200', async () => { - const response = await request(app) + + beforeAll(async () => { + // Make the invoke request + response = await request(app) .post("/api/opey/invoke") .send(userInput) .set('Content-Type', 'application/json') - .then(response => { - console.log(`Response: ${response.body}`) - expect(response.status).toBe(200); - }) - - + }) + + it('Should return 200', async () => { + expect(response.status).toBe(200); }); + + it('Should return a message if not a tool call approval', async () => { + if (!response.body.tool_approval_request) { + expect(response.body.content).toBeTruthy(); + } + }) }) describe('POST /api/opey/stream', () => { + let streamingResponse; + + let userInput: UserInput = { + message: "Hello Opey", + thread_id: uuidv4(), + is_tool_call_approval: false + } + const httpAgent = new http.Agent({ keepAlive: true, port: 9999 }); beforeAll(async () => { app.listen(5173) + try { + streamingResponse = await fetch(`${SERVER_URL}/api/opey/stream`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'connection': 'keep-alive' + }, + body: JSON.stringify(userInput), + }) + } catch (error) { + console.error(`Error getting stream: ${error}`) + } + }); afterAll(async () => { - app.close() + instance.close() httpAgent.destroy() }); + it it('Should stream response', async () => { - let userInput: UserInput = { - message: "Hello Opey", - thread_id: uuidv4(), - is_tool_call_approval: false - } + @@ -76,23 +98,11 @@ describe('POST /api/opey/stream', () => { // .responseType('blob') // .send(userInput) - await fetch(`${SERVER_URL}/api/opey/stream`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'connection': 'keep-alive' - }, - body: JSON.stringify(userInput), + expect(streamingResponse.status).toBe(200) + + streamingResponse.body.on('data', (chunk) => { + console.log(`${chunk}`) }) - .catch(error => { - console.error(`Error performing test fetch: ${error}`) - }) - .then(streamingResponse => { - console.log(streamingResponse) - - streamingResponse.body.on('data', (chunk) => { - console.log(`${chunk}`) - }) // response.on // console.log(response.body) // const readable = response.body @@ -100,10 +110,7 @@ describe('POST /api/opey/stream', () => { // const data = chunk.toString() // console.log(`data: ${data}`) // }) - }) - .finally(() => { - httpAgent.destroy() - }) + diff --git a/yarn.lock b/yarn.lock index 5898022..a48fbdf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1797,6 +1797,14 @@ dependencies: "@babel/types" "^7.20.7" +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + "@types/chai-subset@^1.3.3": version "1.3.3" resolved "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz" @@ -1809,6 +1817,13 @@ resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz" integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== +"@types/connect@*": + version "3.4.38" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" @@ -1836,6 +1851,26 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/express-serve-static-core@^5.0.0": + version "5.0.6" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.17.21 || ^5.0.0", "@types/express@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/gensync@^1.0.0": version "1.0.4" resolved "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz" @@ -1853,6 +1888,11 @@ resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" @@ -1936,12 +1976,44 @@ resolved "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz" integrity sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ== -"@types/node@*", "@types/node@^20.17.17", "@types/node@>= 14", "@types/node@>=10.0.0": - version "20.17.17" - resolved "https://registry.npmjs.org/@types/node/-/node-20.17.17.tgz" - integrity sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg== +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/node@*", "@types/node@^22.13.4", "@types/node@>= 14", "@types/node@>=10.0.0": + version "22.13.4" + resolved "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz" + integrity sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg== dependencies: - undici-types "~6.19.2" + undici-types "~6.20.0" + +"@types/qs@*": + version "6.9.18" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" "@types/stack-utils@^2.0.0": version "2.0.3" @@ -2349,7 +2421,7 @@ abbrev@^2.0.0: resolved "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz" integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== -accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.8: +accepts@^1.3.5, accepts@^1.3.7, accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -3224,7 +3296,7 @@ constants-browserify@^1.0.0: resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== -content-disposition@~0.5.2, content-disposition@0.5.4: +content-disposition@^0.5.3, content-disposition@~0.5.2, content-disposition@0.5.4: version "0.5.4" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== @@ -3526,6 +3598,11 @@ delegates@^1.0.0: resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== +depd@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + depd@^2.0.0, depd@~2.0.0, depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" @@ -4370,7 +4447,7 @@ forwarded@0.2.0: resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fresh@~0.5.2, fresh@0.5.2: +fresh@^0.5.2, fresh@~0.5.2, fresh@0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== @@ -5905,7 +5982,7 @@ memorystream@^0.3.1: resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== -merge-descriptors@1.0.3: +merge-descriptors@^1.0.1, merge-descriptors@1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== @@ -5953,7 +6030,7 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.24, mime-types@~2.1.34: dependencies: mime-db "1.52.0" -mime@1.6.0: +mime@^1.3.4, mime@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -6127,6 +6204,22 @@ node-int64@^0.4.0: resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +node-mocks-http@^1.16.2: + version "1.16.2" + resolved "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.16.2.tgz" + integrity sha512-2Sh6YItRp1oqewZNlck3LaFp5vbyW2u51HX2p1VLxQ9U/bG90XV8JY9O7Nk+HDd6OOn/oV3nA5Tx5k4Rki0qlg== + dependencies: + accepts "^1.3.7" + content-disposition "^0.5.3" + depd "^1.1.0" + fresh "^0.5.2" + merge-descriptors "^1.0.1" + methods "^1.1.2" + mime "^1.3.4" + parseurl "^1.3.3" + range-parser "^1.2.0" + type-is "^1.6.18" + node-releases@^2.0.19: version "2.0.19" resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" @@ -6426,7 +6519,7 @@ parseuri@0.0.6: resolved "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz" integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== -parseurl@^1.3.2, parseurl@~1.3.3: +parseurl@^1.3.2, parseurl@^1.3.3, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -6724,7 +6817,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@~1.2.1: +range-parser@^1.2.0, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -7707,7 +7800,7 @@ type-fest@^4.26.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz" integrity sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g== -type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.18: +type-is@^1.6.16, type-is@^1.6.18, type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -7756,10 +7849,10 @@ uid-safe@~2.1.5: dependencies: random-bytes "~1.0.0" -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== undici@^6.19.5: version "6.21.0" From fe3de28e958757ea94ab7ff2325dbf6a91ea30de Mon Sep 17 00:00:00 2001 From: nemo Date: Mon, 17 Feb 2025 12:17:10 +0000 Subject: [PATCH 08/69] add unit test for OpeyController --- tests/opey-unit.test.ts | 158 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 tests/opey-unit.test.ts diff --git a/tests/opey-unit.test.ts b/tests/opey-unit.test.ts new file mode 100644 index 0000000..794a88f --- /dev/null +++ b/tests/opey-unit.test.ts @@ -0,0 +1,158 @@ +import { OpeyController } from "../server/controllers/OpeyIIController"; +import OpeyClientService from '../server/services/OpeyClientService'; +import OBPClientService from '../server/services/OBPClientService'; +import Stream, { Readable } from 'stream'; +import { Request, Response } from 'express'; +import httpMocks from 'node-mocks-http' +import { EventEmitter } from 'events'; +import {jest} from '@jest/globals'; + +jest.mock("../server/services/OpeyClientService", () => { + return { + OpeyClientService: jest.fn().mockImplementation(() => { + return { + getOpeyStatus: jest.fn(async () => { + return {status: 'running'} + }), + stream: jest.fn(async () => { + const readableStream = new Stream.Readable(); + + for (let i=0; i<10; i++) { + readableStream.push(`Chunk ${i}`); + } + + return readableStream as NodeJS.ReadableStream; + }), + invoke: jest.fn(async () => { + return { + content: 'Hi this is Opey', + } + }) + } + + }), + }; +}); + +// jest.mock("./A", () => { +// return { +// A: jest.fn().mockImplementation(() => { +// return { +// getSomething: getSomethingMock +// } +// }) +// }; +// }); +// Mock the OpeyClientService class + + +// jest.mocked(OpeyClientService).mockImplementation(() => { +// return { +// getOpeyStatus: jest.fn(async () => { +// return {status: 'running'} +// }), +// stream: jest.fn(async () => { +// const readableStream = new Stream.Readable(); + +// for (let i=0; i<10; i++) { +// readableStream.push(`Chunk ${i}`); +// } + +// return readableStream as NodeJS.ReadableStream; +// }), +// invoke: jest.fn(async () => { +// return { +// content: 'Hi this is Opey', +// } +// }) +// } +// }); + + + +describe('OpeyController', () => { + // Mock the OpeyClientService class + + const MockOpeyClientService = { + authConfig: {}, + opeyConfig: {}, + getOpeyStatus: jest.fn(async () => { + return {status: 'running'} + }), + stream: jest.fn(async () => { + + async function * generator() { + for (let i=0; i<10; i++) { + yield `Chunk ${i}`; + } + } + + const readableStream = Stream.Readable.from(generator()); + + return readableStream as NodeJS.ReadableStream; + }), + invoke: jest.fn(async () => { + return { + content: 'Hi this is Opey', + } + }) + } as unknown as jest.Mocked + + + // Instantiate OpeyController with the mocked OpeyClientService + const opeyController = new OpeyController(new OBPClientService, MockOpeyClientService) + + + it('getStatus', async () => { + const res = httpMocks.createResponse(); + + await opeyController.getStatus(res) + expect(MockOpeyClientService.getOpeyStatus).toHaveBeenCalled(); + expect(res.statusCode).toBe(200); + }) + + it('streamOpey', () => { + + const _eventEmitter = new EventEmitter(); + _eventEmitter.addListener('data', () => { + console.log('Data received') + }) + // The default event emitter does nothing, so replace + const res = httpMocks.createResponse({ + eventEmitter: _eventEmitter, + writableStream: Stream.Writable + }); + + const req = { + body: { + message: 'Hello Opey', + thread_id: '123', + is_tool_call_approval: false + } + } as unknown as Request; + + // Define handelrs for events + res.on('end', () => { + console.log('Stream ended') + console.log(res._getData()) + expect(res.statusCode).toBe(200); + }) + + let chunks: any[] = []; + res.on('data', (chunk) => { + console.log(chunk) + chunks.push(chunk); + expect(chunk).toBeDefined(); + }) + + opeyController.streamOpey({}, req, res) + .then((res) => { + console.log(res) + }) + + expect(chunks.length).toBe(10); + expect(MockOpeyClientService.stream).toHaveBeenCalled(); + expect(res).toBeDefined(); + + }) +}) From 29c98120cdffc8f7abd21cd0bba5e96dd3de1c7b Mon Sep 17 00:00:00 2001 From: Nemo Godebski-Pedersen Date: Thu, 20 Feb 2025 10:07:26 +0000 Subject: [PATCH 09/69] bugfix/remove potentially broken packages and redundancies --- babel.config.js | 6 - package.json | 19 +- server/controllers/OpeyIIController.ts | 39 +- server/services/OpeyClientService.ts | 5 +- ...y-unit.test.ts => opey-controller.test.ts} | 0 tests/opey.test.ts | 1 - yarn.lock | 1250 ++--------------- 7 files changed, 166 insertions(+), 1154 deletions(-) delete mode 100644 babel.config.js rename tests/{opey-unit.test.ts => opey-controller.test.ts} (100%) diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index 9ba90d5..0000000 --- a/babel.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - presets: [ - ['@babel/preset-env', {targets: {node: 'current'}}], - '@babel/preset-typescript', - ], -}; \ No newline at end of file diff --git a/package.json b/package.json index 13ee9c6..a9e57d9 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,7 @@ "version": "1.1.3", "private": true, "types": [ - "jest", - "node" + "jest" ], "scripts": { "dev": "vite & ts-node server/app.ts", @@ -22,9 +21,7 @@ "@element-plus/icons-vue": "^2.1.0", "@fontsource/roboto": "^5.0.0", "@highlightjs/vue-plugin": "^2.1.0", - "@types/jest": "^29.5.14", - "@types/supertest": "^6.0.2", - "ai": "^4.1.11", + "ai": "^4.1.43", "axios": "^1.7.4", "cheerio": "^1.0.0", "class-transformer": "^0.5.1", @@ -34,12 +31,10 @@ "element-plus": "^2.3.9", "express": "^4.21.0", "express-session": "^1.17.3", - "got": "^14.4.5", "highlight.js": "^11.8.0", "json-editor-vue": "^0.17.3", "jsonwebtoken": "^9.0.2", "markdown-it": "^14.1.0", - "node-fetch": "v2.6", "oauth": "^0.10.0", "obp-typescript": "^1.0.36", "pinia": "^2.0.37", @@ -49,7 +44,6 @@ "routing-controllers": "^0.10.4", "socket.io": "^4.7.5", "socket.io-client": "^4.7.5", - "supertest": "^7.0.0", "typedi": "^0.10.0", "uuid": "^9.0.1", "vanilla-jsoneditor": "^2.3.3", @@ -60,22 +54,18 @@ "ws": "^8.18.0" }, "devDependencies": { - "@babel/core": "^7.26.8", - "@babel/preset-env": "^7.26.8", - "@babel/preset-typescript": "^7.26.0", "@rushstack/eslint-patch": "^1.4.0", - "@types/express": "^5.0.0", + "@types/jest": "^29.5.14", "@types/jsdom": "^21.1.7", "@types/jsonwebtoken": "^9.0.6", "@types/markdown-it": "^14.1.1", - "@types/node": "^22.13.4", + "@types/node": "^20.5.7", "@vitejs/plugin-vue": "^4.3.0", "@vitejs/plugin-vue-jsx": "^3.1.0", "@vue/eslint-config-prettier": "^9.0.0", "@vue/eslint-config-typescript": "^14.0.0", "@vue/test-utils": "^2.4.0", "@vue/tsconfig": "^0.1.3", - "babel-jest": "^29.7.0", "eslint": "^9.15.0", "eslint-plugin-vue": "^9.12.0", "jest": "^29.7.0", @@ -84,6 +74,7 @@ "npm-run-all2": "^7.0.1", "prettier": "^3.0.1", "superagent": "^9.0.0", + "supertest": "^7.0.0", "ts-jest": "^29.2.5", "ts-node": "^10.9.1", "typescript": "~5.2.2", diff --git a/server/controllers/OpeyIIController.ts b/server/controllers/OpeyIIController.ts index bed47eb..d2733a8 100644 --- a/server/controllers/OpeyIIController.ts +++ b/server/controllers/OpeyIIController.ts @@ -68,12 +68,12 @@ export class OpeyController { } }) - let nodeStream: NodeJS.ReadableStream | null = null + let stream: ReadableStream | null = null try { // Read stream from OpeyClientService - nodeStream = await this.opeyClientService.stream(user_input) - console.debug(`Stream received readable: ${nodeStream.readable}`) + stream = await this.opeyClientService.stream(user_input) + console.debug(`Stream received readable: ${stream}`) } catch (error) { console.error("Error reading stream: ", error) @@ -81,7 +81,7 @@ export class OpeyController { return } - if (!nodeStream || !nodeStream.readable) { + if (!stream) { console.error("Stream is not readable") response.status(500).json({ error: 'Internal Server Error' }) return @@ -99,23 +99,22 @@ export class OpeyController { response.setHeader('Connection', 'keep-alive') let data: any[] = [] + + const streamReader = stream.getReader() + console.log("Got stream reader: ", streamReader) + + streamReader + .read() + .then(function processText({ done, value }) { + if (done) { + console.log("Stream done") + return response.status(200).json(data) + } + console.log("Stream value: ", value) + data.push(value) + response.write(`data: ${value}\n\n`) + }) - nodeStream.on('data', (chunk) => { - const bufferChunk = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); - data.push(bufferChunk); - response.write(`data: ${chunk.toString()}\n\n`) - }) - nodeStream.on('end', () => { - //console.log('Stream ended') - const totalData = Buffer.concat(data) - response.write(totalData) - response.end() - }) - nodeStream.on('error', (error) => { - console.error(error) - response.write(`data: Error reading stream\n\n`) - response.end() - }) } catch (error) { console.error("Error writing data: ", error) response.status(500).json({ error: 'Internal Server Error' }) diff --git a/server/services/OpeyClientService.ts b/server/services/OpeyClientService.ts index 854f80f..a5589b8 100644 --- a/server/services/OpeyClientService.ts +++ b/server/services/OpeyClientService.ts @@ -1,6 +1,5 @@ import { Service } from 'typedi' import { UserInput, StreamInput, OpeyConfig, AuthConfig } from '../schema/OpeySchema' -import fetch from 'node-fetch'; @Service() export default class OpeyClientService { @@ -47,7 +46,7 @@ export default class OpeyClientService { } } - async stream(user_input: UserInput): Promise { + async stream(user_input: UserInput): Promise { // Endpoint to post a message to Opey and stream the response tokens/messages try { @@ -69,7 +68,7 @@ export default class OpeyClientService { if (!response.body) { throw new Error("No response body") } - return response.body as NodeJS.ReadableStream + return response.body } catch (error) { throw new Error(`Error streaming from Opey: ${error}`) diff --git a/tests/opey-unit.test.ts b/tests/opey-controller.test.ts similarity index 100% rename from tests/opey-unit.test.ts rename to tests/opey-controller.test.ts diff --git a/tests/opey.test.ts b/tests/opey.test.ts index d884228..7b9e213 100644 --- a/tests/opey.test.ts +++ b/tests/opey.test.ts @@ -1,6 +1,5 @@ import app, { instance } from '../server/app'; import request from 'supertest'; -import fetch from 'node-fetch'; import http from 'node:http'; import { UserInput } from '../server/schema/OpeySchema'; import {v4 as uuidv4} from 'uuid'; diff --git a/yarn.lock b/yarn.lock index a48fbdf..04c733f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,40 +2,40 @@ # yarn lockfile v1 -"@ai-sdk/provider-utils@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.5.tgz" - integrity sha512-PcNR7E4ovZGV/J47gUqaFlvzorgca6uUfN5WzfXJSFWeOeLunN+oxRVwgUOwj0zbmO0yGQTHQD+FHVw8s3Rz8w== +"@ai-sdk/provider-utils@2.1.9": + version "2.1.9" + resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.9.tgz" + integrity sha512-NerKjTuuUUs6glJGaentaXEBH52jRM0pR+cRCzc7aWke/K5jYBD6Frv1JYBpcxS7gnnCqSQZR9woiyS+6jrdjw== dependencies: - "@ai-sdk/provider" "1.0.6" + "@ai-sdk/provider" "1.0.8" eventsource-parser "^3.0.0" nanoid "^3.3.8" secure-json-parse "^2.7.0" -"@ai-sdk/provider@1.0.6": - version "1.0.6" - resolved "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.6.tgz" - integrity sha512-hwj/gFNxpDgEfTaYzCYoslmw01IY9kWLKl/wf8xuPvHtQIzlfXWmmUwc8PnCwxyt8cKzIuV0dfUghCf68HQ0SA== +"@ai-sdk/provider@1.0.8": + version "1.0.8" + resolved "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.8.tgz" + integrity sha512-f9jSYwKMdXvm44Dmab1vUBnfCDSFfI5rOtvV1W9oKB7WYHR5dGvCC6x68Mk3NUfrdmNoMVHGoh6JT9HCVMlMow== dependencies: json-schema "^0.4.0" -"@ai-sdk/react@1.1.6": - version "1.1.6" - resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-1.1.6.tgz" - integrity sha512-kP5pimLyNWldw8+0j3ym+AACFEXcQHdELNtk45wDJA3HoH486x/zffdn7yLc3c1DOu5apew+COl8CNL4A+2E4g== +"@ai-sdk/react@1.1.17": + version "1.1.17" + resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-1.1.17.tgz" + integrity sha512-NAuEflFvjw1uh1AOmpyi7rBF4xasWsiWUb86JQ8ScjDGxoGDYEdBnaHOxUpooLna0dGNbSPkvDMnVRhoLKoxPQ== dependencies: - "@ai-sdk/provider-utils" "2.1.5" - "@ai-sdk/ui-utils" "1.1.6" + "@ai-sdk/provider-utils" "2.1.9" + "@ai-sdk/ui-utils" "1.1.15" swr "^2.2.5" throttleit "2.1.0" -"@ai-sdk/ui-utils@1.1.6": - version "1.1.6" - resolved "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.1.6.tgz" - integrity sha512-YAwZhFwpIcvWERIjkET2o2MAwMFfJG18WdtcIjtxxMW7hA0bt5cliOV78DVcwRrxqJ2IKBlxaFmwUjW6M4SdOQ== +"@ai-sdk/ui-utils@1.1.15": + version "1.1.15" + resolved "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.1.15.tgz" + integrity sha512-NsV/3CMmjc4m53snzRdtZM6teTQUXIKi8u0Kf7GBruSzaMSuZ4DWaAAlUshhR3p2FpZgtsogW+vYG1/rXsGu+Q== dependencies: - "@ai-sdk/provider" "1.0.6" - "@ai-sdk/provider-utils" "2.1.5" + "@ai-sdk/provider" "1.0.8" + "@ai-sdk/provider-utils" "2.1.9" zod-to-json-schema "^3.24.1" "@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0": @@ -71,40 +71,39 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5", "@babel/compat-data@^7.26.8": +"@babel/compat-data@^7.26.5": version "7.26.8" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz" integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.14.6", "@babel/core@^7.23.3", "@babel/core@^7.23.9", "@babel/core@^7.26.8", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz" - integrity sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ== +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.14.6", "@babel/core@^7.23.3", "@babel/core@^7.23.9", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz" + integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.8" + "@babel/generator" "^7.26.9" "@babel/helper-compilation-targets" "^7.26.5" "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.7" - "@babel/parser" "^7.26.8" - "@babel/template" "^7.26.8" - "@babel/traverse" "^7.26.8" - "@babel/types" "^7.26.8" - "@types/gensync" "^1.0.0" + "@babel/helpers" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/traverse" "^7.26.9" + "@babel/types" "^7.26.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.26.8", "@babel/generator@^7.7.2": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz" - integrity sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA== +"@babel/generator@^7.26.9", "@babel/generator@^7.7.2": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz" + integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== dependencies: - "@babel/parser" "^7.26.8" - "@babel/types" "^7.26.8" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -116,7 +115,7 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": +"@babel/helper-compilation-targets@^7.26.5": version "7.26.5" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz" integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== @@ -140,26 +139,6 @@ "@babel/traverse" "^7.25.9" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": - version "7.26.3" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz" - integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - regexpu-core "^6.2.0" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.6.3": - version "0.6.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz" - integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - "@babel/helper-member-expression-to-functions@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz" @@ -176,7 +155,7 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": +"@babel/helper-module-transforms@^7.26.0": version "7.26.0" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz" integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== @@ -192,20 +171,11 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.26.5" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz" integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== -"@babel/helper-remap-async-to-generator@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz" - integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-wrap-function" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/helper-replace-supers@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz" @@ -238,68 +208,20 @@ resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== -"@babel/helper-wrap-function@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz" - integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== +"@babel/helpers@^7.26.9": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz" + integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== dependencies: - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" -"@babel/helpers@^7.26.7": - version "7.26.7" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz" - integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.8", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.3", "@babel/parser@^7.25.6", "@babel/parser@^7.26.9": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz" + integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== dependencies: - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.8", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.3", "@babel/parser@^7.25.6", "@babel/parser@^7.26.8": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz" - integrity sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw== - dependencies: - "@babel/types" "^7.26.8" - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz" - integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz" - integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz" - integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz" - integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - "@babel/plugin-transform-optional-chaining" "^7.25.9" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz" - integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.9" "@babel/plugin-proposal-export-namespace-from@^7.14.5": version "7.18.9" @@ -309,11 +231,6 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" @@ -349,14 +266,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz" - integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.26.0": +"@babel/plugin-syntax-import-attributes@^7.24.7": version "7.26.0" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz" integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== @@ -377,7 +287,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.24.7", "@babel/plugin-syntax-jsx@^7.25.9", "@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@^7.24.7", "@babel/plugin-syntax-jsx@^7.7.2": version "7.25.9" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz" integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== @@ -447,194 +357,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz" - integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-async-generator-functions@^7.26.8": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz" - integrity sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg== - dependencies: - "@babel/helper-plugin-utils" "^7.26.5" - "@babel/helper-remap-async-to-generator" "^7.25.9" - "@babel/traverse" "^7.26.8" - -"@babel/plugin-transform-async-to-generator@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz" - integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-remap-async-to-generator" "^7.25.9" - -"@babel/plugin-transform-block-scoped-functions@^7.26.5": - version "7.26.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz" - integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== - dependencies: - "@babel/helper-plugin-utils" "^7.26.5" - -"@babel/plugin-transform-block-scoping@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz" - integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-class-properties@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz" - integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-class-static-block@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz" - integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-classes@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz" - integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-replace-supers" "^7.25.9" - "@babel/traverse" "^7.25.9" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz" - integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/template" "^7.25.9" - -"@babel/plugin-transform-destructuring@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz" - integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-dotall-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz" - integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-duplicate-keys@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz" - integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz" - integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-dynamic-import@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz" - integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-exponentiation-operator@^7.26.3": - version "7.26.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz" - integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-export-namespace-from@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz" - integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-for-of@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz" - integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - -"@babel/plugin-transform-function-name@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz" - integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== - dependencies: - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/plugin-transform-json-strings@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz" - integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz" - integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-logical-assignment-operators@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz" - integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-member-expression-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz" - integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-modules-amd@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz" - integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== - dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-modules-commonjs@^7.14.5", "@babel/plugin-transform-modules-commonjs@^7.25.9", "@babel/plugin-transform-modules-commonjs@^7.26.3": +"@babel/plugin-transform-modules-commonjs@^7.14.5": version "7.26.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz" integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== @@ -642,176 +365,7 @@ "@babel/helper-module-transforms" "^7.26.0" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-systemjs@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz" - integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== - dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/plugin-transform-modules-umd@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz" - integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== - dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz" - integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-new-target@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz" - integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": - version "7.26.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz" - integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== - dependencies: - "@babel/helper-plugin-utils" "^7.26.5" - -"@babel/plugin-transform-numeric-separator@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz" - integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-object-rest-spread@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz" - integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== - dependencies: - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/plugin-transform-parameters" "^7.25.9" - -"@babel/plugin-transform-object-super@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz" - integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-replace-supers" "^7.25.9" - -"@babel/plugin-transform-optional-catch-binding@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz" - integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-optional-chaining@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz" - integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - -"@babel/plugin-transform-parameters@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz" - integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-private-methods@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz" - integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-private-property-in-object@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz" - integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-property-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz" - integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-regenerator@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz" - integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - regenerator-transform "^0.15.2" - -"@babel/plugin-transform-regexp-modifiers@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz" - integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-reserved-words@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz" - integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-shorthand-properties@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz" - integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-spread@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz" - integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - -"@babel/plugin-transform-sticky-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz" - integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-template-literals@^7.26.8": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz" - integrity sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q== - dependencies: - "@babel/helper-plugin-utils" "^7.26.5" - -"@babel/plugin-transform-typeof-symbol@^7.26.7": - version "7.26.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz" - integrity sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw== - dependencies: - "@babel/helper-plugin-utils" "^7.26.5" - -"@babel/plugin-transform-typescript@^7.23.3", "@babel/plugin-transform-typescript@^7.25.9": +"@babel/plugin-transform-typescript@^7.23.3": version "7.25.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz" integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ== @@ -822,165 +376,32 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" "@babel/plugin-syntax-typescript" "^7.25.9" -"@babel/plugin-transform-unicode-escapes@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz" - integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-unicode-property-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz" - integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-unicode-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz" - integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-unicode-sets-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz" - integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/preset-env@^7.26.8": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.8.tgz" - integrity sha512-um7Sy+2THd697S4zJEfv/U5MHGJzkN2xhtsR3T/SWRbVSic62nbISh51VVfU9JiO/L/Z97QczHTaFVkOU8IzNg== - dependencies: - "@babel/compat-data" "^7.26.8" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-plugin-utils" "^7.26.5" - "@babel/helper-validator-option" "^7.25.9" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.26.0" - "@babel/plugin-syntax-import-attributes" "^7.26.0" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.25.9" - "@babel/plugin-transform-async-generator-functions" "^7.26.8" - "@babel/plugin-transform-async-to-generator" "^7.25.9" - "@babel/plugin-transform-block-scoped-functions" "^7.26.5" - "@babel/plugin-transform-block-scoping" "^7.25.9" - "@babel/plugin-transform-class-properties" "^7.25.9" - "@babel/plugin-transform-class-static-block" "^7.26.0" - "@babel/plugin-transform-classes" "^7.25.9" - "@babel/plugin-transform-computed-properties" "^7.25.9" - "@babel/plugin-transform-destructuring" "^7.25.9" - "@babel/plugin-transform-dotall-regex" "^7.25.9" - "@babel/plugin-transform-duplicate-keys" "^7.25.9" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" - "@babel/plugin-transform-dynamic-import" "^7.25.9" - "@babel/plugin-transform-exponentiation-operator" "^7.26.3" - "@babel/plugin-transform-export-namespace-from" "^7.25.9" - "@babel/plugin-transform-for-of" "^7.25.9" - "@babel/plugin-transform-function-name" "^7.25.9" - "@babel/plugin-transform-json-strings" "^7.25.9" - "@babel/plugin-transform-literals" "^7.25.9" - "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" - "@babel/plugin-transform-member-expression-literals" "^7.25.9" - "@babel/plugin-transform-modules-amd" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.26.3" - "@babel/plugin-transform-modules-systemjs" "^7.25.9" - "@babel/plugin-transform-modules-umd" "^7.25.9" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" - "@babel/plugin-transform-new-target" "^7.25.9" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" - "@babel/plugin-transform-numeric-separator" "^7.25.9" - "@babel/plugin-transform-object-rest-spread" "^7.25.9" - "@babel/plugin-transform-object-super" "^7.25.9" - "@babel/plugin-transform-optional-catch-binding" "^7.25.9" - "@babel/plugin-transform-optional-chaining" "^7.25.9" - "@babel/plugin-transform-parameters" "^7.25.9" - "@babel/plugin-transform-private-methods" "^7.25.9" - "@babel/plugin-transform-private-property-in-object" "^7.25.9" - "@babel/plugin-transform-property-literals" "^7.25.9" - "@babel/plugin-transform-regenerator" "^7.25.9" - "@babel/plugin-transform-regexp-modifiers" "^7.26.0" - "@babel/plugin-transform-reserved-words" "^7.25.9" - "@babel/plugin-transform-shorthand-properties" "^7.25.9" - "@babel/plugin-transform-spread" "^7.25.9" - "@babel/plugin-transform-sticky-regex" "^7.25.9" - "@babel/plugin-transform-template-literals" "^7.26.8" - "@babel/plugin-transform-typeof-symbol" "^7.26.7" - "@babel/plugin-transform-unicode-escapes" "^7.25.9" - "@babel/plugin-transform-unicode-property-regex" "^7.25.9" - "@babel/plugin-transform-unicode-regex" "^7.25.9" - "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.11.0" - babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.40.0" - semver "^6.3.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-typescript@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz" - integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-validator-option" "^7.25.9" - "@babel/plugin-syntax-jsx" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.25.9" - "@babel/plugin-transform-typescript" "^7.25.9" - -"@babel/runtime@^7.8.4": - version "7.26.7" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz" - integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.25.0", "@babel/template@^7.25.9", "@babel/template@^7.26.8", "@babel/template@^7.3.3": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz" - integrity sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q== +"@babel/template@^7.25.0", "@babel/template@^7.26.9", "@babel/template@^7.3.3": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz" + integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.26.8" - "@babel/types" "^7.26.8" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" -"@babel/traverse@^7.25.6", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.8": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz" - integrity sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA== +"@babel/traverse@^7.25.6", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.9": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz" + integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.8" - "@babel/parser" "^7.26.8" - "@babel/template" "^7.26.8" - "@babel/types" "^7.26.8" + "@babel/generator" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.6", "@babel/types@^7.25.9", "@babel/types@^7.26.7", "@babel/types@^7.26.8", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz" - integrity sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.6", "@babel/types@^7.25.9", "@babel/types@^7.26.9", "@babel/types@^7.3.3": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz" + integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1698,21 +1119,11 @@ resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz" integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== -"@sec-ant/readable-stream@^0.4.1": - version "0.4.1" - resolved "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz" - integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg== - "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sindresorhus/is@^7.0.1": - version "7.0.1" - resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz" - integrity sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ== - "@sinonjs/commons@^3.0.0": version "3.0.1" resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" @@ -1737,13 +1148,6 @@ resolved "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz" integrity sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw== -"@szmarczak/http-timer@^5.0.1": - version "5.0.1" - resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz" - integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== - dependencies: - defer-to-connect "^2.0.1" - "@tsconfig/node10@^1.0.7": version "1.0.9" resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" @@ -1797,14 +1201,6 @@ dependencies: "@babel/types" "^7.20.7" -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - "@types/chai-subset@^1.3.3": version "1.3.3" resolved "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz" @@ -1817,23 +1213,11 @@ resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz" integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== -"@types/connect@*": - version "3.4.38" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== -"@types/cookiejar@^2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz" - integrity sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q== - "@types/cors@^2.8.12": version "2.8.17" resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz" @@ -1851,31 +1235,6 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== -"@types/express-serve-static-core@^5.0.0": - version "5.0.6" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz" - integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@^4.17.21 || ^5.0.0", "@types/express@^5.0.0": - version "5.0.0" - resolved "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz" - integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/gensync@^1.0.0": - version "1.0.4" - resolved "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz" - integrity sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA== - "@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" @@ -1883,16 +1242,6 @@ dependencies: "@types/node" "*" -"@types/http-cache-semantics@^4.0.4": - version "4.0.4" - resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== - -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" @@ -1971,73 +1320,18 @@ resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz" integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== -"@types/methods@^1.1.4": - version "1.1.4" - resolved "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz" - integrity sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/node@*", "@types/node@^22.13.4", "@types/node@>= 14", "@types/node@>=10.0.0": - version "22.13.4" - resolved "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz" - integrity sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg== +"@types/node@*", "@types/node@^20.5.7", "@types/node@>= 14", "@types/node@>=10.0.0": + version "20.17.19" + resolved "https://registry.npmjs.org/@types/node/-/node-20.17.19.tgz" + integrity sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A== dependencies: - undici-types "~6.20.0" - -"@types/qs@*": - version "6.9.18" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz" - integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/send@*": - version "0.17.4" - resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.7" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" + undici-types "~6.19.2" "@types/stack-utils@^2.0.0": version "2.0.3" resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== -"@types/superagent@^8.1.0": - version "8.1.9" - resolved "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz" - integrity sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ== - dependencies: - "@types/cookiejar" "^2.1.5" - "@types/methods" "^1.1.4" - "@types/node" "*" - form-data "^4.0.0" - -"@types/supertest@^6.0.2": - version "6.0.2" - resolved "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz" - integrity sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg== - dependencies: - "@types/methods" "^1.1.4" - "@types/superagent" "^8.1.0" - "@types/tough-cookie@*": version "4.0.2" resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" @@ -2459,15 +1753,15 @@ agent-base@^7.1.0, agent-base@^7.1.2: resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== -ai@^4.1.11: - version "4.1.11" - resolved "https://registry.npmjs.org/ai/-/ai-4.1.11.tgz" - integrity sha512-390dahvdwt/kKCq63dyi3M7pq6iWVk9MpfY9C5+RpyDWb50tohUwxntnUvB4Y/cOXGn4Miavdo1g8JbCxsd7wg== +ai@^4.1.43: + version "4.1.43" + resolved "https://registry.npmjs.org/ai/-/ai-4.1.43.tgz" + integrity sha512-qzHQgT1Icg3/Ck1reDqor3mGqB7PTwbRSfil4k+fzbaPyZQvaJVUOhPruLryfMK4oyGdSEMuLl/uWPpRlVXDvg== dependencies: - "@ai-sdk/provider" "1.0.6" - "@ai-sdk/provider-utils" "2.1.5" - "@ai-sdk/react" "1.1.6" - "@ai-sdk/ui-utils" "1.1.6" + "@ai-sdk/provider" "1.0.8" + "@ai-sdk/provider-utils" "2.1.9" + "@ai-sdk/react" "1.1.17" + "@ai-sdk/ui-utils" "1.1.15" "@opentelemetry/api" "1.9.0" jsondiffpatch "0.6.0" @@ -2678,30 +1972,6 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.12" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz" - integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.3" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.11.0: - version "0.11.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz" - integrity sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.3" - core-js-compat "^3.40.0" - -babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz" - integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.3" - babel-preset-current-node-syntax@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz" @@ -2904,7 +2174,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.24.0, browserslist@^4.24.3, "browserslist@>= 4.21.0": +browserslist@^4.24.0, "browserslist@>= 4.21.0": version "4.24.4" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== @@ -2989,24 +2259,6 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" -cacheable-lookup@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz" - integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== - -cacheable-request@^12.0.1: - version "12.0.1" - resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz" - integrity sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg== - dependencies: - "@types/http-cache-semantics" "^4.0.4" - get-stream "^9.0.1" - http-cache-semantics "^4.1.1" - keyv "^4.5.4" - mimic-response "^4.0.0" - normalize-url "^8.0.1" - responselike "^3.0.0" - call-bind-apply-helpers@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz" @@ -3047,9 +2299,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001688: - version "1.0.30001699" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz" - integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w== + version "1.0.30001700" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz" + integrity sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ== chai@^4.3.10: version "4.5.0" @@ -3147,9 +2399,9 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: safe-buffer "^5.0.1" cjs-module-lexer@^1.0.0: - version "1.4.1" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz" - integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + version "1.4.3" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz" + integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== class-transformer@^0.5.1: version "0.5.1" @@ -3356,13 +2608,6 @@ copy-to@^2.0.1: resolved "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz" integrity sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w== -core-js-compat@^3.40.0: - version "3.40.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz" - integrity sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ== - dependencies: - browserslist "^4.24.3" - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" @@ -3541,13 +2786,6 @@ decimal.js@^10.4.3: resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - dedent@^1.0.0: version "1.5.3" resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz" @@ -3575,11 +2813,6 @@ deepmerge@^4.2.2: resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -defer-to-connect@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - define-properties@^1.1.3: version "1.2.0" resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" @@ -3757,9 +2990,9 @@ ejs@^3.1.10: jake "^10.8.5" electron-to-chromium@^1.5.73: - version "1.5.97" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz" - integrity sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ== + version "1.5.102" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz" + integrity sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q== element-plus@^2.3.9: version "2.8.8" @@ -4409,11 +3642,6 @@ foreground-child@^3.1.0: cross-spawn "^7.0.0" signal-exit "^4.0.1" -form-data-encoder@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz" - integrity sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw== - form-data@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" @@ -4516,14 +3744,6 @@ get-stream@^6.0.0: resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-stream@^9.0.1: - version "9.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz" - integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA== - dependencies: - "@sec-ant/readable-stream" "^0.4.1" - is-stream "^4.0.1" - glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" @@ -4545,7 +3765,7 @@ glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^10.2.2, glob@^10.3.3: +glob@^10.2.2: version "10.4.5" resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== @@ -4557,19 +3777,19 @@ glob@^10.2.2, glob@^10.3.3: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@^10.3.3: + version "10.4.5" + resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" -glob@^7.1.4: +glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4611,23 +3831,6 @@ gopd@^1.0.1, gopd@^1.2.0: resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -got@^14.4.5: - version "14.4.5" - resolved "https://registry.npmjs.org/got/-/got-14.4.5.tgz" - integrity sha512-sq+uET8TnNKRNnjEOPJzMcxeI0irT8BBNmf+GtZcJpmhYsQM1DSKmCROUjPWKsXZ5HzwD5Cf5/RV+QD9BSTxJg== - dependencies: - "@sindresorhus/is" "^7.0.1" - "@szmarczak/http-timer" "^5.0.1" - cacheable-lookup "^7.0.0" - cacheable-request "^12.0.1" - decompress-response "^6.0.0" - form-data-encoder "^4.0.2" - http2-wrapper "^2.2.1" - lowercase-keys "^3.0.0" - p-cancelable "^4.0.1" - responselike "^3.0.0" - type-fest "^4.26.1" - graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" @@ -4762,11 +3965,6 @@ http-assert@^1.3.0: deep-equal "~1.0.1" http-errors "~1.8.0" -http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - http-errors@^1.6.3: version "1.8.1" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" @@ -4808,14 +4006,6 @@ http-proxy-agent@^7.0.2: agent-base "^7.1.0" debug "^4.3.4" -http2-wrapper@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz" - integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.2.0" - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" @@ -5008,11 +4198,6 @@ is-stream@^2.0.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz" - integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A== - is-typed-array@^1.1.10, is-typed-array@^1.1.3: version "1.1.10" resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" @@ -5557,7 +4742,7 @@ jsep@^0.4.0||^1.0.0, jsep@^1.4.0: resolved "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz" integrity sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw== -jsesc@^3.0.2, jsesc@~3.0.2: +jsesc@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== @@ -5812,11 +4997,6 @@ lodash-unified@^1.0.2: resolved "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz" integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ== -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" @@ -5874,11 +5054,6 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.0" -lowercase-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz" - integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== - lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" @@ -6045,16 +5220,6 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -mimic-response@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz" - integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== - min-document@^2.19.0: version "2.19.0" resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" @@ -6072,7 +5237,14 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.1.1: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6192,13 +5364,6 @@ negotiator@0.6.3: resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -node-fetch@v2.6: - version "2.6.13" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz" - integrity sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA== - dependencies: - whatwg-url "^5.0.0" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" @@ -6270,11 +5435,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz" - integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== - normalize-wheel-es@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz" @@ -6404,11 +5564,6 @@ os-browserify@^0.3.0: resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== -p-cancelable@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz" - integrity sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg== - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" @@ -6792,11 +5947,6 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - random-bytes@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" @@ -6905,54 +6055,6 @@ reflect-metadata@^0.1.13: resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== -regenerate-unicode-properties@^10.2.0: - version "10.2.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz" - integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== - dependencies: - "@babel/runtime" "^7.8.4" - -regexpu-core@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz" - integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.2.0" - regjsgen "^0.8.0" - regjsparser "^0.12.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -regjsgen@^0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz" - integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== - -regjsparser@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz" - integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== - dependencies: - jsesc "~3.0.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -6963,11 +6065,6 @@ require-from-string@^2.0.2: resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -resolve-alpn@^1.2.0: - version "1.2.1" - resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" @@ -6990,7 +6087,7 @@ resolve.exports@^2.0.0: resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz" integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== -resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0: +resolve@^1.17.0, resolve@^1.20.0: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -6999,13 +6096,6 @@ resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz" - integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== - dependencies: - lowercase-keys "^3.0.0" - reusify@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" @@ -7124,9 +6214,9 @@ semver@^7.5.3: integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== semver@^7.5.4: - version "7.7.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz" - integrity sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ== + version "7.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== semver@^7.6.0: version "7.6.3" @@ -7247,12 +6337,7 @@ siginfo@^2.0.0: resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^3.0.7: +signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -7434,16 +6519,7 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -7600,9 +6676,9 @@ svg-tags@^1.0.0: integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== swr@^2.2.5: - version "2.3.0" - resolved "https://registry.npmjs.org/swr/-/swr-2.3.0.tgz" - integrity sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA== + version "2.3.2" + resolved "https://registry.npmjs.org/swr/-/swr-2.3.2.tgz" + integrity sha512-RosxFpiabojs75IwQ316DGoDRmOqtiAj0tg8wCcbEu4CiLZBs/a9QNtHV7TUfDXmmlgqij/NqzKq/eLelyv9xA== dependencies: dequal "^2.0.3" use-sync-external-store "^1.4.0" @@ -7709,11 +6785,6 @@ tr46@^5.0.0: dependencies: punycode "^2.3.1" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - ts-api-utils@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz" @@ -7775,16 +6846,16 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@^4.0.0, type-detect@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - -type-detect@4.0.8: +type-detect@^4.0.0, type-detect@4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" @@ -7795,11 +6866,6 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^4.26.1: - version "4.33.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz" - integrity sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g== - type-is@^1.6.16, type-is@^1.6.18, type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" @@ -7849,39 +6915,16 @@ uid-safe@~2.1.5: dependencies: random-bytes "~1.0.0" -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== undici@^6.19.5: version "6.21.0" resolved "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz" integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz" - integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz" - integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - unimport@^3.13.2: version "3.13.2" resolved "https://registry.npmjs.org/unimport/-/unimport-3.13.2.tgz" @@ -8240,11 +7283,6 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" @@ -8275,14 +7313,6 @@ whatwg-url@^14.0.0: tr46 "^5.0.0" webidl-conversions "^7.0.0" -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which-typed-array@^1.1.2: version "1.1.9" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" @@ -8481,6 +7511,6 @@ zod-to-json-schema@^3.24.1: integrity sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w== zod@^3.0.0, zod@^3.24.1: - version "3.24.1" - resolved "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz" - integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A== + version "3.24.2" + resolved "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz" + integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ== From cd13f057a23fa09321f9eeb4454781cb1d2fc569 Mon Sep 17 00:00:00 2001 From: Nemo Godebski-Pedersen Date: Thu, 20 Feb 2025 15:45:19 +0000 Subject: [PATCH 10/69] integration tests passing --- package.json | 2 + server/controllers/OpeyIIController.ts | 78 +++++++++--------------- server/services/OpeyClientService.ts | 7 ++- tests/opey-controller.test.ts | 45 +++++++------- tests/opey.test.ts | 83 +++++++++++--------------- yarn.lock | 33 ++++++++++ 6 files changed, 130 insertions(+), 118 deletions(-) diff --git a/package.json b/package.json index a9e57d9..4a0b9a3 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@element-plus/icons-vue": "^2.1.0", "@fontsource/roboto": "^5.0.0", "@highlightjs/vue-plugin": "^2.1.0", + "@types/node-fetch": "^2.6.12", "ai": "^4.1.43", "axios": "^1.7.4", "cheerio": "^1.0.0", @@ -35,6 +36,7 @@ "json-editor-vue": "^0.17.3", "jsonwebtoken": "^9.0.2", "markdown-it": "^14.1.0", + "node-fetch": "^2.6.7", "oauth": "^0.10.0", "obp-typescript": "^1.0.36", "pinia": "^2.0.37", diff --git a/server/controllers/OpeyIIController.ts b/server/controllers/OpeyIIController.ts index d2733a8..8de2732 100644 --- a/server/controllers/OpeyIIController.ts +++ b/server/controllers/OpeyIIController.ts @@ -1,12 +1,10 @@ -import { streamText } from 'ai' -import axios from 'axios' import { Controller, Session, Req, Res, Post, Get } from 'routing-controllers' import { Request, Response } from 'express' +import { pipeline } from "node:stream/promises" import { Service } from 'typedi' import OBPClientService from '../services/OBPClientService' import OpeyClientService from '../services/OpeyClientService' -import { v6 as uuid6 } from 'uuid'; -import { Transform } from 'stream' + import { UserInput } from '../schema/OpeySchema' @Service() @@ -41,7 +39,7 @@ export class OpeyController { async streamOpey( @Session() session: any, @Req() request: Request, - @Res() response: Response + @Res() response: Response, ) { let user_input: UserInput @@ -59,66 +57,46 @@ export class OpeyController { console.log("Calling OpeyClientService.stream") - const streamMiddlewareTransform = new Transform({ - transform(chunk, encoding, callback) { - console.log(`Logged Chunk: ${chunk}`) - this.push(chunk); + // const streamMiddlewareTransform = new Transform({ + // transform(chunk, encoding, callback) { + // console.log(`Logged Chunk: ${chunk}`) + // this.push(chunk); - callback(); - } - }) + // callback(); + // } + // }) - let stream: ReadableStream | null = null + let stream: NodeJS.ReadableStream | null = null try { // Read stream from OpeyClientService stream = await this.opeyClientService.stream(user_input) - console.debug(`Stream received readable: ${stream}`) + console.debug(`Stream received readable: ${stream?.readable}`) } catch (error) { console.error("Error reading stream: ", error) - response.status(500).json({ error: 'Internal Server Error' }) - return + return response.status(500).json({ error: 'Internal Server Error' }) } - if (!stream) { - console.error("Stream is not readable") - response.status(500).json({ error: 'Internal Server Error' }) - return + if (!stream || !stream.readable) { + console.error("Stream is not recieved or not readable") + return response.status(500).json({ error: 'Internal Server Error' }) } - try { - // response.writeHead(200, { - // 'Content-Type': "text/event-stream", - // 'Cache-Control': "no-cache", - // 'Connection': "keep-alive" - // }); - - response.setHeader('Content-Type', 'text/event-stream') - response.setHeader('Cache-Control', 'no-cache') - response.setHeader('Connection', 'keep-alive') - - let data: any[] = [] + return new Promise((resolve, reject) => { + stream.pipe(response) + stream.on('end', () => { + response.status(200) + resolve(response) + }) + stream.on('error', (error) => { + console.error("Error piping stream: ", error) + reject(error) + }) - const streamReader = stream.getReader() - console.log("Got stream reader: ", streamReader) + }) - streamReader - .read() - .then(function processText({ done, value }) { - if (done) { - console.log("Stream done") - return response.status(200).json(data) - } - console.log("Stream value: ", value) - data.push(value) - response.write(`data: ${value}\n\n`) - }) - - } catch (error) { - console.error("Error writing data: ", error) - response.status(500).json({ error: 'Internal Server Error' }) - } + } @Post('/invoke') diff --git a/server/services/OpeyClientService.ts b/server/services/OpeyClientService.ts index a5589b8..6d56aa9 100644 --- a/server/services/OpeyClientService.ts +++ b/server/services/OpeyClientService.ts @@ -1,5 +1,7 @@ import { Service } from 'typedi' import { UserInput, StreamInput, OpeyConfig, AuthConfig } from '../schema/OpeySchema' +import { Readable } from "stream" +import fetch from 'node-fetch' @Service() export default class OpeyClientService { @@ -46,7 +48,7 @@ export default class OpeyClientService { } } - async stream(user_input: UserInput): Promise { + async stream(user_input: UserInput): Promise { // Endpoint to post a message to Opey and stream the response tokens/messages try { @@ -68,6 +70,9 @@ export default class OpeyClientService { if (!response.body) { throw new Error("No response body") } + + console.log("Got response body: ", response.body) //DEBUG + return response.body } catch (error) { diff --git a/tests/opey-controller.test.ts b/tests/opey-controller.test.ts index 794a88f..9e7280f 100644 --- a/tests/opey-controller.test.ts +++ b/tests/opey-controller.test.ts @@ -111,15 +111,15 @@ describe('OpeyController', () => { expect(res.statusCode).toBe(200); }) - it('streamOpey', () => { + it('streamOpey', async () => { const _eventEmitter = new EventEmitter(); _eventEmitter.addListener('data', () => { console.log('Data received') }) // The default event emitter does nothing, so replace - const res = httpMocks.createResponse({ - eventEmitter: _eventEmitter, + const res = await httpMocks.createResponse({ + eventEmitter: EventEmitter, writableStream: Stream.Writable }); @@ -132,27 +132,32 @@ describe('OpeyController', () => { } as unknown as Request; // Define handelrs for events - res.on('end', () => { - console.log('Stream ended') - console.log(res._getData()) - expect(res.statusCode).toBe(200); - }) + + let chunks: any[] = []; - res.on('data', (chunk) => { - console.log(chunk) - chunks.push(chunk); - expect(chunk).toBeDefined(); - }) + try { + const response = await opeyController.streamOpey({}, req, res) - opeyController.streamOpey({}, req, res) - .then((res) => { - console.log(res) - }) + response.on('end', async () => { + console.log('Stream ended') + console.log(res._getData()) + await expect(res.statusCode).toBe(200); + }) + + response.on('data', async (chunk) => { + console.log(chunk) + await chunks.push(chunk); + await expect(chunk).toBeDefined(); + }) + } catch (error) { + console.error(error) + } + - expect(chunks.length).toBe(10); - expect(MockOpeyClientService.stream).toHaveBeenCalled(); - expect(res).toBeDefined(); + await expect(chunks.length).toBe(10); + await expect(MockOpeyClientService.stream).toHaveBeenCalled(); + await expect(res).toBeDefined(); }) }) diff --git a/tests/opey.test.ts b/tests/opey.test.ts index 7b9e213..64c66a3 100644 --- a/tests/opey.test.ts +++ b/tests/opey.test.ts @@ -4,6 +4,7 @@ import http from 'node:http'; import { UserInput } from '../server/schema/OpeySchema'; import {v4 as uuidv4} from 'uuid'; import { agent } from "superagent"; +import fetch from 'node-fetch'; const BEFORE_ALL_TIMEOUT = 30000; // 30 sec @@ -51,7 +52,8 @@ describe('GET /api/opey/invoke', () => { describe('POST /api/opey/stream', () => { - let streamingResponse; + let data: Array = []; + let res; let userInput: UserInput = { message: "Hello Opey", @@ -59,68 +61,55 @@ describe('POST /api/opey/stream', () => { is_tool_call_approval: false } - const httpAgent = new http.Agent({ keepAlive: true, port: 9999 }); beforeAll(async () => { app.listen(5173) - + }); + + afterAll(async () => { + instance.close() + }); + + it + + it('Should stream response', async () => { + try { - streamingResponse = await fetch(`${SERVER_URL}/api/opey/stream`, { + const response = await fetch(`${SERVER_URL}/api/opey/stream`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'connection': 'keep-alive' }, body: JSON.stringify(userInput), + }); + + console.log(`Response in test: ${response.body}`) + const stream = response.body + + stream.on('data', (chunk) => { + console.log(`chunk: ${chunk}`) + // check if chunk is not empty + expect(chunk).toBeTruthy() }) + stream.on('end', () => { + console.log('Stream ended') + }) + stream.on('error', (error) => { + console.error(`Error in stream: ${error}`) + }) + + res = response; + + await expect(res.status).toBe(200) + } catch (error) { - console.error(`Error getting stream: ${error}`) + console.error(`Error fetching stream from test: ${error}`) } + - }); - afterAll(async () => { - instance.close() - httpAgent.destroy() - }); - - it - it('Should stream response', async () => { - - - - // const response = await request(app) - // .post("/api/opey/stream") - // .set('Content-Type', 'text/event-stream') - // .responseType('blob') - // .send(userInput) - - expect(streamingResponse.status).toBe(200) - - streamingResponse.body.on('data', (chunk) => { - console.log(`${chunk}`) - }) - // response.on - // console.log(response.body) - // const readable = response.body - // readable.on('data', (chunk) => { - // const data = chunk.toString() - // console.log(`data: ${data}`) - // }) - - - - - // while (true) { - // const {value, done} = await reader.read(); - // if (done) break; - // console.log('Received', value); - // } - - // expect(response.headers['content-type']).toBe('text/event-stream') - // expect(response.status).toBe(200) - // Optionally, parse chunks or check SSE headers }) }); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 04c733f..d18fe20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1320,6 +1320,14 @@ resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz" integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== +"@types/node-fetch@^2.6.12": + version "2.6.12" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz" + integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== + dependencies: + "@types/node" "*" + form-data "^4.0.0" + "@types/node@*", "@types/node@^20.5.7", "@types/node@>= 14", "@types/node@>=10.0.0": version "20.17.19" resolved "https://registry.npmjs.org/@types/node/-/node-20.17.19.tgz" @@ -5364,6 +5372,13 @@ negotiator@0.6.3: resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" @@ -6785,6 +6800,11 @@ tr46@^5.0.0: dependencies: punycode "^2.3.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + ts-api-utils@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz" @@ -7283,6 +7303,11 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" @@ -7313,6 +7338,14 @@ whatwg-url@^14.0.0: tr46 "^5.0.0" webidl-conversions "^7.0.0" +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-typed-array@^1.1.2: version "1.1.9" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" From ddefe09935af4981fa3533045e4d079318cd67d6 Mon Sep 17 00:00:00 2001 From: Nemo Godebski-Pedersen Date: Fri, 21 Feb 2025 15:48:34 +0000 Subject: [PATCH 11/69] New widget build WIP --- components.d.ts | 2 + package.json | 1 + src/App.vue | 4 - src/components/ChatWidget.vue | 687 +++---------------------------- src/components/ChatWidgetII.vue | 13 - src/components/ChatWidgetOld.vue | 657 +++++++++++++++++++++++++++++ src/views/BodyView.vue | 3 + yarn.lock | 16 +- 8 files changed, 742 insertions(+), 641 deletions(-) delete mode 100644 src/components/ChatWidgetII.vue create mode 100644 src/components/ChatWidgetOld.vue diff --git a/components.d.ts b/components.d.ts index 06a6e91..54896dc 100644 --- a/components.d.ts +++ b/components.d.ts @@ -9,8 +9,10 @@ declare module 'vue' { export interface GlobalComponents { ChatWidget: typeof import('./src/components/ChatWidget.vue')['default'] ChatWidgetII: typeof import('./src/components/ChatWidgetII.vue')['default'] + ChatWidgetOld: typeof import('./src/components/ChatWidgetOld.vue')['default'] Collections: typeof import('./src/components/Collections.vue')['default'] Content: typeof import('./src/components/Content.vue')['default'] + ElAffix: typeof import('element-plus/es')['ElAffix'] ElAlert: typeof import('element-plus/es')['ElAlert'] ElAside: typeof import('element-plus/es')['ElAside'] ElBacktop: typeof import('element-plus/es')['ElBacktop'] diff --git a/package.json b/package.json index 4a0b9a3..96286ae 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "ws": "^8.18.0" }, "devDependencies": { + "@ai-sdk/vue": "^1.1.18", "@rushstack/eslint-patch": "^1.4.0", "@types/jest": "^29.5.14", "@types/jsdom": "^21.1.7", diff --git a/src/App.vue b/src/App.vue index 1f59451..be09cbd 100644 --- a/src/App.vue +++ b/src/App.vue @@ -27,9 +27,6 @@ diff --git a/src/components/ChatWidget.vue b/src/components/ChatWidget.vue index e1639f4..113c059 100644 --- a/src/components/ChatWidget.vue +++ b/src/components/ChatWidget.vue @@ -1,657 +1,98 @@ - +placeholder for Opey II Chat widget +--> \ No newline at end of file diff --git a/src/components/ChatWidgetII.vue b/src/components/ChatWidgetII.vue deleted file mode 100644 index 3766a33..0000000 --- a/src/components/ChatWidgetII.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/components/ChatWidgetOld.vue b/src/components/ChatWidgetOld.vue new file mode 100644 index 0000000..e1639f4 --- /dev/null +++ b/src/components/ChatWidgetOld.vue @@ -0,0 +1,657 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/BodyView.vue b/src/views/BodyView.vue index bd92eb0..507c31c 100644 --- a/src/views/BodyView.vue +++ b/src/views/BodyView.vue @@ -28,9 +28,11 @@ diff --git a/yarn.lock b/yarn.lock index d18fe20..37bca0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38,6 +38,15 @@ "@ai-sdk/provider-utils" "2.1.9" zod-to-json-schema "^3.24.1" +"@ai-sdk/vue@^1.1.18": + version "1.1.18" + resolved "https://registry.npmjs.org/@ai-sdk/vue/-/vue-1.1.18.tgz" + integrity sha512-z6LG0p8kljLAuSPUqbT5dYEQ/CTCZEtN8Ows86TB7EPvrXOHRWLAoFIf1nyS2JlzmZK216tPYLiNHCifsBt6LA== + dependencies: + "@ai-sdk/provider-utils" "2.1.9" + "@ai-sdk/ui-utils" "1.1.15" + swrv "^1.0.4" + "@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0": version "2.3.0" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" @@ -6698,6 +6707,11 @@ swr@^2.2.5: dequal "^2.0.3" use-sync-external-store "^1.4.0" +swrv@^1.0.4: + version "1.1.0" + resolved "https://registry.npmjs.org/swrv/-/swrv-1.1.0.tgz" + integrity sha512-pjllRDr2s0iTwiE5Isvip51dZGR7GjLH1gCSVyE8bQnbAx6xackXsFdojau+1O5u98yHF5V73HQGOFxKUXO9gQ== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" @@ -7273,7 +7287,7 @@ vue-tsc@^2.0.0: "@volar/typescript" "~2.4.11" "@vue/language-core" "2.2.0" -"vue@^2.6.14 || ^3.5.11", vue@^3, vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.5.1, "vue@2 || 3", vue@2||3, vue@3.5.13: +"vue@^2.6.14 || ^3.5.11", vue@^3, vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.3.4, vue@^3.5.1, "vue@>=3.2.26 < 4", "vue@2 || 3", vue@2||3, vue@3.5.13: version "3.5.13" resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz" integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== From 6bf77bdf7bb36a6ac5ff12b40fc3def4ee6c287f Mon Sep 17 00:00:00 2001 From: Nemo Godebski-Pedersen Date: Sat, 22 Feb 2025 13:28:24 +0000 Subject: [PATCH 12/69] frontend UI WIP --- src/assets/opey-icon-white.png | Bin 0 -> 12937 bytes src/assets/opey-logo-inv.png | Bin 0 -> 35872 bytes src/components/ChatWidget.vue | 88 ++++++++++++++++++++++++++++----- 3 files changed, 75 insertions(+), 13 deletions(-) create mode 100644 src/assets/opey-icon-white.png create mode 100644 src/assets/opey-logo-inv.png diff --git a/src/assets/opey-icon-white.png b/src/assets/opey-icon-white.png new file mode 100644 index 0000000000000000000000000000000000000000..862e1fbd4c171cd50d1ebb4feca9eea25c579d50 GIT binary patch literal 12937 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 KRcny;5&s9fD^yMZ literal 0 HcmV?d00001 diff --git a/src/assets/opey-logo-inv.png b/src/assets/opey-logo-inv.png new file mode 100644 index 0000000000000000000000000000000000000000..c6420214fef8e10724a868ff94bdf3471675dce5 GIT binary patch literal 35872 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 Y{swJaCad{1Lu|>aN{PAEI%$bN~PV literal 0 HcmV?d00001 diff --git a/src/components/ChatWidget.vue b/src/components/ChatWidget.vue index 113c059..c17892c 100644 --- a/src/components/ChatWidget.vue +++ b/src/components/ChatWidget.vue @@ -3,12 +3,13 @@ placeholder for Opey II Chat widget -->