diff --git a/.gitignore b/.gitignore index 46da32d..35f841d 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,6 @@ tsconfig.node.tsbuildinfo vite.config.d.ts vite.config.js vitest.config.d.ts -vitest.config.js components.d.ts #keys diff --git a/components.d.ts b/components.d.ts index 54896dc..5c5210a 100644 --- a/components.d.ts +++ b/components.d.ts @@ -7,6 +7,7 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + ChatMessage: typeof import('./src/components/ChatMessage.vue')['default'] ChatWidget: typeof import('./src/components/ChatWidget.vue')['default'] ChatWidgetII: typeof import('./src/components/ChatWidgetII.vue')['default'] ChatWidgetOld: typeof import('./src/components/ChatWidgetOld.vue')['default'] diff --git a/package.json b/package.json index 96286ae..105f0a8 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "build": "run-p build-only", "build-server": "tsc --project tsconfig.server.json", "preview": "vite preview", - "test:unit": "vitest", + "test:vue": "vitest", "test": "jest --silent=false", "build-only": "vite build", "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false", @@ -58,6 +58,7 @@ "devDependencies": { "@ai-sdk/vue": "^1.1.18", "@rushstack/eslint-patch": "^1.4.0", + "@testing-library/vue": "^8.1.0", "@types/jest": "^29.5.14", "@types/jsdom": "^21.1.7", "@types/jsonwebtoken": "^9.0.6", @@ -71,6 +72,7 @@ "@vue/tsconfig": "^0.1.3", "eslint": "^9.15.0", "eslint-plugin-vue": "^9.12.0", + "happy-dom": "^17.1.4", "jest": "^29.7.0", "jsdom": "^25.0.1", "node-mocks-http": "^1.16.2", @@ -87,7 +89,7 @@ "vite": "^4.4.0", "vite-plugin-node-polyfills": "^0.10.0", "vite-plugin-rewrite-all": "^1.0.2", - "vitest": "^0.34.0", + "vitest": "^0.34.6", "vue-tsc": "^2.0.0" } } diff --git a/server/controllers/OpeyIIController.ts b/server/controllers/OpeyIIController.ts index 8de2732..472db8c 100644 --- a/server/controllers/OpeyIIController.ts +++ b/server/controllers/OpeyIIController.ts @@ -1,11 +1,13 @@ import { Controller, Session, Req, Res, Post, Get } from 'routing-controllers' import { Request, Response } from 'express' -import { pipeline } from "node:stream/promises" +import { Transform, pipeline } from "node:stream" import { Service } from 'typedi' import OBPClientService from '../services/OBPClientService' import OpeyClientService from '../services/OpeyClientService' +import { LangChainAdapter, streamText } from 'ai'; import { UserInput } from '../schema/OpeySchema' +import { strictEqual } from 'node:assert' @Service() @Controller('/opey') @@ -44,8 +46,10 @@ export class OpeyController { let user_input: UserInput try { - user_input = { - "message": request.body.message, + console.log("Request body: ", request.body) + const user_message = request.body.messages[request.body.messages.length - 1] + user_input = { + "message": user_message.content, "thread_id": request.body.thread_id, "is_tool_call_approval": request.body.is_tool_call_approval } @@ -55,44 +59,96 @@ 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(); - // } - // }) + // Define a function to transform the response from Opey into a pure langchain stream format + const transformToPureLangchain = new TransformStream({ + transform(chunk, controller) { + // Decode the chunk to a string + const decodedChunk = new TextDecoder().decode(chunk) + console.log('[transform]', decodedChunk); + const dataString = decodedChunk.split('data: ')[1] + controller.enqueue(dataString); + }, + flush(controller) { + console.log('[flush]'); + controller.terminate(); + }, + }); - let stream: NodeJS.ReadableStream | null = null + let stream: ReadableStream | null = null try { // Read stream from OpeyClientService + console.log("Calling OpeyClientService.stream") stream = await this.opeyClientService.stream(user_input) - console.debug(`Stream received readable: ${stream?.readable}`) + //console.debug(`Stream received readable: ${stream?.readable}`) } catch (error) { console.error("Error reading stream: ", error) return response.status(500).json({ error: 'Internal Server Error' }) } - if (!stream || !stream.readable) { + if (!stream) { console.error("Stream is not recieved or not readable") return response.status(500).json({ error: 'Internal Server Error' }) } return new Promise((resolve, reject) => { - stream.pipe(response) - stream.on('end', () => { - response.status(200) - resolve(response) + // pipeline(stream, convertToVercelTansform, response, (error) => { + // if (error) { + // console.error("Error piping stream: ", error) + // reject(error) + // } else { + // console.log("Stream piped successfully") + // resolve(response) + // } + // }) + const streamTee = stream.tee() + if (!streamTee) { + console.error("Stream is not tee'd") + return response.status(500).json({ error: 'Internal Server Error' }) + } + const [stream1, stream2] = streamTee + + const reader = stream1.getReader() + let charsReceived = 0; + const decoder = new TextDecoder(); + + // this is simply to log the stream to console + reader.read().then(function processText({ done, value }) { + // Result objects contain two properties: + // done - true if the stream has already given you all its data. + // value - some data. Always undefined when done is true. + if (done) { + console.log("Stream complete"); + return; + } + + // value for fetch streams is a Uint8Array + charsReceived += value.length; + const chunk = value; + console.log("Chunk: ", decoder.decode(chunk), "\n\nChars received: ", charsReceived); + + return reader.read().then(processText); }) - stream.on('error', (error) => { - console.error("Error piping stream: ", error) + + try { + const vercelDataStream = LangChainAdapter.toDataStream(stream2) + resolve(vercelDataStream) + } catch (error) { reject(error) - }) + } + + + + // stream.on('end', () => { + // response.status(200) + // resolve(response) + // }) + // stream.on('error', (error) => { + // console.error("Error piping stream: ", error) + // reject(error) + // }) }) diff --git a/server/services/OpeyClientService.ts b/server/services/OpeyClientService.ts index 6d56aa9..9d74bdb 100644 --- a/server/services/OpeyClientService.ts +++ b/server/services/OpeyClientService.ts @@ -1,7 +1,7 @@ import { Service } from 'typedi' import { UserInput, StreamInput, OpeyConfig, AuthConfig } from '../schema/OpeySchema' import { Readable } from "stream" -import fetch from 'node-fetch' +//import fetch from 'node-fetch' @Service() export default class OpeyClientService { @@ -17,7 +17,7 @@ export default class OpeyClientService { authConfig: this.authConfig, paths: { status: '/status', - stream: '/stream', + stream: '/stream-langchain', invoke: '/invoke', approve_tool: '/approve_tool/{thead_id}', feedback: '/feedback', @@ -73,7 +73,7 @@ export default class OpeyClientService { console.log("Got response body: ", response.body) //DEBUG - return response.body + return response.body as unknown as ReadableStream } catch (error) { throw new Error(`Error streaming from Opey: ${error}`) diff --git a/src/components/ChatWidget.vue b/src/components/ChatWidget.vue index c17892c..3eefb8f 100644 --- a/src/components/ChatWidget.vue +++ b/src/components/ChatWidget.vue @@ -6,11 +6,26 @@ placeholder for Opey II Chat widget import { ref, reactive } from 'vue' import { useChat } from '@ai-sdk/vue' import { Close } from '@element-plus/icons-vue' +import ChatMessage from './ChatMessage.vue'; +import { v4 as uuidv4 } from 'uuid'; export default { setup () { const { messages, input, handleInputChange, handleSubmit, addToolResult, status } = useChat({ - api:'/api/opey/stream' + api:'/api/opey/stream', + streamProtocol: 'data', + onMessage: (message) => { + console.log(`Message in useChat: ${message}`) + }, + onError: (error) => { + console.log(`Error in useChat: ${error.message}`) + }, + onFinish: () => { + console.log('Chat finished') + console.log('Messages:', messages); + + } + }) return { @@ -31,17 +46,26 @@ export default { input_content: '', thread_id: '', }), + thread_id: uuidv4(), } }, + components: { + ChatMessage, + }, methods: { toggleChat() { this.chatOpen = !this.chatOpen }, - async onSubmit() { - this.handleSubmit(chatRequestOptions={ + async onSubmit(event) { + this.handleSubmit(event, { + body: { + thread_id: this.thread_id, + is_tool_call_approval: false, + }, }) - } + console.log("Status: ", this.status) + }, }, } @@ -65,9 +89,8 @@ export default { -
-
{{ message.role }}
-
{{ message.content }}
+
+
@@ -157,4 +180,8 @@ export default { transform: rotate(180deg); } +.messages-container { + padding-left: 10px; + padding-right: 10px; +} \ No newline at end of file diff --git a/tests/opey-controller.test.ts b/tests/opey-controller.test.ts deleted file mode 100644 index 9e7280f..0000000 --- a/tests/opey-controller.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -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', async () => { - - const _eventEmitter = new EventEmitter(); - _eventEmitter.addListener('data', () => { - console.log('Data received') - }) - // The default event emitter does nothing, so replace - const res = await 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 - - - - let chunks: any[] = []; - try { - const response = await opeyController.streamOpey({}, req, 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) - } - - - 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 deleted file mode 100644 index 64c66a3..0000000 --- a/tests/opey.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import app, { instance } from '../server/app'; -import request from 'supertest'; -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 -const SERVER_URL = process.env.VITE_OBP_API_EXPLORER_HOST - -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('GET /api/opey/invoke', () => { - let response; - - let userInput: UserInput = { - message: "Hello Opey", - thread_id: uuidv4(), - is_tool_call_approval: false - } - - beforeAll(async () => { - // Make the invoke request - response = await request(app) - .post("/api/opey/invoke") - .send(userInput) - .set('Content-Type', 'application/json') - }) - - 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 data: Array = []; - let res; - - let userInput: UserInput = { - message: "Hello Opey", - thread_id: uuidv4(), - is_tool_call_approval: false - } - - - beforeAll(async () => { - app.listen(5173) - }); - - afterAll(async () => { - instance.close() - }); - - it - - it('Should stream response', async () => { - - try { - 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 fetching stream from test: ${error}`) - } - - - - - - }) -}); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 33a1970..cccac3b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,8 @@ }, "emitDecoratorMetadata": true, "experimentalDecorators": true, - "allowJs": true + "allowJs": true, + "types": ["vitest/globals"] }, "references": [ { diff --git a/tsconfig.vitest.json b/tsconfig.vitest.json index c82c65a..96afaeb 100644 --- a/tsconfig.vitest.json +++ b/tsconfig.vitest.json @@ -5,6 +5,7 @@ "esModuleInterop": true, "composite": true, "lib": [], - "types": ["node", "jsdom"] + "types": ["node", "jsdom", "vitest/globals"] + } } diff --git a/vite.config.mts b/vite.config.mts index 5e5a48f..b53563c 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -12,7 +12,6 @@ import pluginRewriteAll from 'vite-plugin-rewrite-all'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [ vue(), vueJsx(), AutoImport({ @@ -46,4 +45,11 @@ export default defineConfig({ }, }, }, + test: { + // enable jest-like global test APIs + globals: true, + // simulate DOM with happy-dom + // (requires installing happy-dom as a peer dependency) + environment: 'happy-dom' + }, }) diff --git a/vitest.config.ts b/vitest.config.ts deleted file mode 100644 index 0bccc49..0000000 --- a/vitest.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { fileURLToPath } from 'node:url' -import { mergeConfig } from 'vite' -import { configDefaults, defineConfig } from 'vitest/config' -import viteConfig from './vite.config.mjs' - -export default mergeConfig( - viteConfig, - defineConfig({ - test: { - environment: 'jsdom', - exclude: [...configDefaults.exclude, 'e2e/*'], - root: fileURLToPath(new URL('./', import.meta.url)) - } - }) -) diff --git a/yarn.lock b/yarn.lock index 37bca0c..b227cfd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -71,7 +71,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.26.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@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== @@ -385,6 +385,13 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" "@babel/plugin-syntax-typescript" "^7.25.9" +"@babel/runtime@^7.12.5", "@babel/runtime@^7.23.2": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz" + integrity sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg== + dependencies: + regenerator-runtime "^0.14.0" + "@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" @@ -1157,6 +1164,29 @@ resolved "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz" integrity sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw== +"@testing-library/dom@^9.3.3": + version "9.3.4" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz" + integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/vue@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@testing-library/vue/-/vue-8.1.0.tgz" + integrity sha512-ls4RiHO1ta4mxqqajWRh8158uFObVrrtAPoxk7cIp4HrnQUj/ScKzqz53HxYpG3X6Zb7H2v+0eTGLSoy8HQ2nA== + dependencies: + "@babel/runtime" "^7.23.2" + "@testing-library/dom" "^9.3.3" + "@vue/test-utils" "^2.4.1" + "@tsconfig/node10@^1.0.7": version "1.0.9" resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" @@ -1177,6 +1207,11 @@ resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + "@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" @@ -1586,7 +1621,7 @@ "@vue/compiler-core" "3.5.13" "@vue/shared" "3.5.13" -"@vue/compiler-sfc@^3.5.3", "@vue/compiler-sfc@3.5.13": +"@vue/compiler-sfc@^3.5.3", "@vue/compiler-sfc@>= 3", "@vue/compiler-sfc@3.5.13": version "3.5.13" resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz" integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== @@ -1692,7 +1727,7 @@ resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz" integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== -"@vue/test-utils@^2.4.0": +"@vue/test-utils@^2.4.0", "@vue/test-utils@^2.4.1": version "2.4.6" resolved "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz" integrity sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow== @@ -1881,6 +1916,21 @@ aria-query@^5.3.1: resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz" integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +array-buffer-byte-length@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" @@ -1936,10 +1986,12 @@ asynckit@^0.4.0: resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.5, available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" axios@^1.7.4: version "1.7.9" @@ -2276,7 +2328,7 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" -call-bind-apply-helpers@^1.0.1: +call-bind-apply-helpers@^1.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" integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== @@ -2284,15 +2336,17 @@ call-bind-apply-helpers@^1.0.1: es-errors "^1.3.0" function-bind "^1.1.2" -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" -call-bound@^1.0.2: +call-bound@^1.0.2, call-bound@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz" integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== @@ -2333,7 +2387,7 @@ chai@^4.3.10: pathval "^1.1.1" type-detect "^4.1.0" -chalk@^4.0.0, chalk@^4.0.2: +chalk@^4.0.0, chalk@^4.0.2, 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== @@ -2815,6 +2869,30 @@ deep-eql@^4.1.3: dependencies: type-detect "^4.0.0" +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz" @@ -2830,11 +2908,21 @@ 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== -define-properties@^1.1.3: - version "1.2.0" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -2918,6 +3006,11 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + dom-serializer@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" @@ -3155,7 +3248,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-define-property@^1.0.1: +es-define-property@^1.0.0, 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" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== @@ -3165,6 +3258,21 @@ es-errors@^1.3.0: resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es-module-lexer@^1.3.0: version "1.5.4" resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz" @@ -3702,11 +3810,16 @@ fs.realpath@^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: +function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + generic-pool@3.9.0: version "3.9.0" resolved "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz" @@ -3727,7 +3840,7 @@ get-func-name@^2.0.0, get-func-name@^2.0.2: resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.2, get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: version "1.2.7" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz" integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA== @@ -3748,7 +3861,7 @@ get-package-type@^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: +get-proto@^1.0.0, get-proto@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== @@ -3858,6 +3971,19 @@ graphemer@^1.4.0: resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +happy-dom@*, happy-dom@^17.1.4: + version "17.1.4" + resolved "https://registry.npmjs.org/happy-dom/-/happy-dom-17.1.4.tgz" + integrity sha512-cMxE0HP45kLIgWdI0PFfnitNb95Cv8kG8moqI7CK6kcEcfV7xoYVVvSmJ7EuGfDatSKWtjhG/czVooqEV0L4rA== + dependencies: + webidl-conversions "^7.0.0" + whatwg-mimetype "^3.0.0" + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + has-binary2@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz" @@ -3875,24 +4001,24 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" + es-define-property "^1.0.0" -has-symbols@^1.0.2, has-symbols@^1.1.0: +has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" hash-base@^3.0.0: version "3.1.0" @@ -4119,12 +4245,21 @@ ini@^1.3.4: resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -4132,11 +4267,27 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.2, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + 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-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + 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" @@ -4144,6 +4295,14 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + is-callable@^1.1.3: version "1.2.7" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" @@ -4156,6 +4315,14 @@ is-core-module@^2.13.0: dependencies: hasown "^2.0.2" +is-date-object@^1.0.5: + version "1.1.0" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" @@ -4185,6 +4352,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + is-nan@^1.2.1: version "1.3.2" resolved "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz" @@ -4193,6 +4365,14 @@ is-nan@^1.2.1: call-bind "^1.0.0" define-properties "^1.1.3" +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" @@ -4210,12 +4390,51 @@ is-reference@^3.0.3: dependencies: "@types/estree" "^1.0.6" +is-regex@^1.1.4, is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + 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-typed-array@^1.1.10, is-typed-array@^1.1.3: +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +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" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -4226,6 +4445,24 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3: gopd "^1.0.1" has-tostringtag "^1.0.0" +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" @@ -5095,6 +5332,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + magic-string@^0.27.0: version "0.27.0" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz" @@ -5517,7 +5759,7 @@ object-inspect@^1.13.3: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz" integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== -object-is@^1.0.1: +object-is@^1.0.1, object-is@^1.1.5: version "1.1.5" resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -5530,6 +5772,18 @@ object-keys@^1.1.1: resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object.assign@^4.1.4: + version "4.1.7" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + obp-typescript@^1.0.36: version "1.0.36" resolved "https://registry.npmjs.org/obp-typescript/-/obp-typescript-1.0.36.tgz" @@ -5823,6 +6077,11 @@ pkg-types@^1.2.1: mlly "^1.7.2" pathe "^1.1.2" +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + postcss-selector-parser@^6.0.15: version "6.1.2" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" @@ -5857,6 +6116,15 @@ 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@^27.0.2: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + 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" @@ -6006,6 +6274,11 @@ raw-body@^2.3.3, raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-is@^18.0.0: version "18.3.1" resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" @@ -6079,6 +6352,23 @@ 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== +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== + +regexp.prototype.flags@^1.5.1: + version "1.5.4" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -6191,6 +6481,15 @@ safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" @@ -6281,6 +6580,28 @@ serve-static@1.16.2: parseurl "~1.3.3" send "0.19.0" +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" @@ -6345,7 +6666,7 @@ side-channel-weakmap@^1.0.2: object-inspect "^1.13.3" side-channel-map "^1.0.1" -side-channel@^1.0.6: +side-channel@^1.0.4, side-channel@^1.0.6, side-channel@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== @@ -6496,6 +6817,14 @@ std-env@^3.3.3: resolved "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz" integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== +stop-iteration-iterator@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + stream-browserify@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz" @@ -7188,7 +7517,7 @@ vite-plugin-rewrite-all@^1.0.2: optionalDependencies: fsevents "~2.3.2" -vitest@^0.34.0: +vitest@^0.34.6: version "0.34.6" resolved "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz" integrity sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q== @@ -7287,7 +7616,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.3.4, vue@^3.5.1, "vue@>= 3", "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== @@ -7339,6 +7668,11 @@ whatwg-encoding@^3.1.1: dependencies: iconv-lite "0.6.3" +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + whatwg-mimetype@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz" @@ -7360,17 +7694,38 @@ whatwg-url@^5.0.0: 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" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-boxed-primitive@^1.0.2: + version "1.1.1" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.13, which-typed-array@^1.1.2: + version "1.1.18" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz" + integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" + gopd "^1.2.0" + has-tostringtag "^1.0.2" which@^2.0.1: version "2.0.2"