diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bdd6dcd..7b596fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,10 +1,10 @@ name: internxt/sdk CI - on: push: branches: [master] pull_request: branches: [master] + workflow_dispatch: jobs: test: @@ -16,16 +16,20 @@ jobs: matrix: node-version: [22.x] steps: - - uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} - registry-url: 'https://npm.pkg.github.com' + node-version: '22.x' + cache: yarn + + - name: Install dependencies + run: yarn + + - name: Build + run: yarn build - - run: yarn - env: - NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - run: yarn run lint && yarn run format && yarn run test - env: - CI: true \ No newline at end of file + - name: Run tests + run: yarn test diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml deleted file mode 100644 index b97b9c3..0000000 --- a/.github/workflows/code-coverage.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Code coverage -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - strategy: - matrix: - node-version: [22.x] - steps: - - name: Check Out Repo - uses: actions/checkout@v4 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - registry-url: 'https://npm.pkg.github.com' - - - name: Install dependencies - run: yarn - env: - NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Run tests - run: yarn run test:cov - - - name: Codecov - uses: codecov/codecov-action@v3.1.0 diff --git a/.github/workflows/publish-github.yml b/.github/workflows/publish-github.yml new file mode 100644 index 0000000..792cb64 --- /dev/null +++ b/.github/workflows/publish-github.yml @@ -0,0 +1,37 @@ +name: Publish package to github package registry +on: + release: + types: [created] + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '22.x' + cache: yarn + + - name: Install dependencies + run: yarn + + - name: Build + run: yarn build + + - name: Set the NPM registry with token + run: | + echo "registry=https://npm.pkg.github.com/" > .npmrc + echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc + + - name: Publish on GitHub + run: yarn publish + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index bf927a4..5573db2 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -2,6 +2,8 @@ name: Publish Package to npmjs on: release: types: [published] + workflow_dispatch: + jobs: build: runs-on: ubuntu-latest @@ -10,21 +12,25 @@ jobs: id-token: write packages: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 with: node-version: '22.x' + cache: yarn - - run: | - echo "@internxt:registry=https://npm.pkg.github.com/" > .npmrc - echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc + - name: Install dependencies + run: yarn - - run: yarn - - run: yarn run build + - name: Build + run: yarn build - # Change the registry to npmjs (to publish) - - run: | + - name: Set the NPM registry with token + run: | echo "registry=https://registry.npmjs.org/" > .npmrc echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" >> .npmrc - - run: npm publish --scope=@internxt --access public + - name: Publish on NPM + run: npm publish --scope=@internxt --access public diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index 96a6d93..0000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Publish package in github package registry -on: - release: - types: [created] - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: '22.x' - registry-url: 'https://npm.pkg.github.com' - - run: yarn - env: - NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - run: yarn build - - run: yarn publish - env: - NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.husky/pre-commit b/.husky/pre-commit index 02fc8f5..4a6ccc9 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1,3 @@ -yarn lint && yarn format && yarn test && yarn lint-staged \ No newline at end of file +yarn test +yarn lint +yarn lint-staged diff --git a/.npmrc.template b/.npmrc.template index 57053c1..08ffa03 100644 --- a/.npmrc.template +++ b/.npmrc.template @@ -1,5 +1,3 @@ registry=https://registry.yarnpkg.com/ - -@internxt:registry=https://npm.pkg.github.com -//npm.pkg.github.com/:_authToken=TOKEN -always-auth=true \ No newline at end of file + +@internxt:registry=https://registry.yarnpkg.com/ diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index f687e4b..0000000 --- a/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['**/?(*.)+(spec|test).ts'], -}; diff --git a/package.json b/package.json index acb07a0..f6494a2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@internxt/sdk", "author": "Internxt ", - "version": "1.12.6", + "version": "1.13.0", "description": "An sdk for interacting with Internxt's services", "repository": { "type": "git", @@ -19,35 +19,36 @@ "types": "dist/index.d.ts", "scripts": { "prepare": "husky", - "test": "jest --detectOpenHandles test/", - "test:cov": "jest --coverage", - "build": "tsc", + "test": "vitest run --coverage", + "test:watch": "vitest watch", + "clean": "rimraf dist coverage tsconfig.tsbuildinfo", + "build": "yarn clean && tsc", "lint": "eslint ./src", - "format": "prettier src/**/*.ts --write", + "format": "prettier --write **/*.{js,jsx,tsx,ts}", "swagger": "openapi-typescript https://gateway.internxt.com/drive/api-json -o ./src/schema.ts && yarn format" }, "devDependencies": { "@internxt/eslint-config-internxt": "2.0.1", - "@internxt/prettier-config": "1.0.2", - "@types/jest": "30.0.0", - "@types/sinon": "21.0.0", + "@internxt/prettier-config": "internxt/prettier-config#v1.0.2", + "@types/node": "25.2.3", + "@vitest/coverage-istanbul": "4.0.18", + "@vitest/spy": "4.0.18", "eslint": "9.39.2", "husky": "9.1.7", - "jest": "30.2.0", "lint-staged": "16.2.7", - "openapi-typescript": "7.10.1", - "prettier": "3.7.4", - "sinon": "21.0.0", - "ts-jest": "29.4.6", - "typescript": "5.9.3" + "openapi-typescript": "7.12.0", + "prettier": "3.8.1", + "rimraf": "6.1.2", + "typescript": "5.9.3", + "vitest": "4.0.18" }, "dependencies": { - "axios": "1.13.2", - "uuid": "11.1.0" + "axios": "1.13.5", + "uuid": "13.0.0" }, "lint-staged": { "*.{js,jsx,tsx,ts}": [ - "yarn format" + "prettier --write" ] } } diff --git a/src/drive/users/inext.test.ts b/src/drive/users/inext.test.ts deleted file mode 100644 index 18fa85b..0000000 --- a/src/drive/users/inext.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import sinon from 'sinon'; -import { Users } from '.'; -import { headersWithToken } from '../../shared/headers'; -import { HttpClient } from '../../shared/http/client'; -import { UserPublicKeyWithCreationResponse } from './types'; - -const httpClient = HttpClient.create(''); - -describe('Users service tests', () => { - beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); - }); - - describe('Users methods', () => { - describe('getPublicKeyWithPrecreation', () => { - it('should call the correct endpoint and return the public key response', async () => { - const email = 'test@example.com'; - const publicKeyResponse: UserPublicKeyWithCreationResponse = { - publicKey: 'public_key_example_123', - publicKyberKey: 'kyber_key_example_123', - }; - - const { client, headers } = clientAndHeaders(); - const putCall = sinon.stub(httpClient, 'put').resolves(publicKeyResponse); - - const response = await client.getPublicKeyWithPrecreation({ email }); - - expect(putCall.firstCall.args).toEqual([`/users/public-key/${email}`, {}, headers]); - expect(response).toEqual(publicKeyResponse); - }); - }); - }); -}); - -function clientAndHeaders( - apiUrl = '', - clientName = 'c-name', - clientVersion = '0.1', - token = 'my-token', -): { - client: Users; - headers: object; -} { - const appDetails = { - clientName, - clientVersion, - }; - const apiSecurity = { - token, - unauthorizedCallback: () => {}, - }; - const client = Users.client(apiUrl, appDetails, apiSecurity); - const headers = headersWithToken({ - clientName, - clientVersion, - token, - }); - return { client, headers }; -} diff --git a/src/schema.ts b/src/schema.ts index 057de85..ff6c037 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -2810,7 +2810,7 @@ export interface paths { }; get?: never; put?: never; - /** CLI platform login access */ + /** CLI/Rclone platform login access */ post: operations['AuthController_cliLoginAccess']; delete?: never; options?: never; @@ -3197,6 +3197,7 @@ export interface components { */ type: string; }; + Object: Record; MoveFileDto: { /** * @description New Destination Folder UUID @@ -5116,11 +5117,13 @@ export interface operations { /** @description Bucket ID filter */ bucket?: string; /** @description Field to sort by */ - sort?: 'updatedAt' | 'size' | 'id' | 'plainName' | 'name' | 'uuid'; + sort?: 'updatedAt' | 'size' | 'id' | 'plainName' | 'uuid'; /** @description Sort order */ order?: 'ASC' | 'DESC'; /** @description Filter files updated after this date */ updatedAt?: string; + /** @description The last file uuid of the provided list in the previous call */ + lastId?: components['schemas']['Object']; }; header?: never; path?: never; @@ -5562,7 +5565,7 @@ export interface operations { /** @description Offset for pagination */ offset: number; /** @description Field to sort by */ - sort?: 'updatedAt' | 'size' | 'id' | 'plainName' | 'name' | 'uuid'; + sort?: 'updatedAt' | 'size' | 'id' | 'plainName' | 'uuid'; /** @description Sort order */ order?: 'ASC' | 'DESC'; }; @@ -5592,7 +5595,7 @@ export interface operations { /** @description Offset for pagination */ offset: number; /** @description Field to sort by */ - sort?: 'updatedAt' | 'size' | 'id' | 'plainName' | 'name' | 'uuid'; + sort?: 'updatedAt' | 'size' | 'id' | 'plainName' | 'uuid'; /** @description Sort order */ order?: 'ASC' | 'DESC'; }; @@ -5644,7 +5647,7 @@ export interface operations { /** @description Offset for pagination */ offset: number; /** @description Field to sort by */ - sort?: 'updatedAt' | 'id' | 'plainName' | 'name' | 'uuid'; + sort?: 'updatedAt' | 'id' | 'plainName' | 'uuid'; /** @description Sort order */ order?: 'ASC' | 'DESC'; }; @@ -5773,7 +5776,7 @@ export interface operations { /** @description Offset for pagination */ offset: number; /** @description Field to sort by */ - sort?: 'updatedAt' | 'id' | 'plainName' | 'name' | 'uuid'; + sort?: 'updatedAt' | 'id' | 'plainName' | 'uuid'; /** @description Sort order */ order?: 'ASC' | 'DESC'; }; @@ -9468,7 +9471,7 @@ export interface operations { }; }; responses: { - /** @description CLI user successfully accessed their account */ + /** @description User successfully accessed their account via CLI or Rclone */ 200: { headers: { [name: string]: unknown; @@ -9477,7 +9480,7 @@ export interface operations { 'application/json': components['schemas']['LoginAccessResponseDto']; }; }; - /** @description This user current tier does not allow CLI access */ + /** @description This user current tier does not allow CLI/Rclone access */ 402: { headers: { [name: string]: unknown; diff --git a/src/shared/http/client.ts b/src/shared/http/client.ts index f4d6cef..2b5178c 100644 --- a/src/shared/http/client.ts +++ b/src/shared/http/client.ts @@ -1,4 +1,4 @@ -import axios, { Axios, AxiosError, AxiosResponse, CancelToken, InternalAxiosRequestConfig } from 'axios'; +import axios, { AxiosError, AxiosInstance, AxiosResponse, CancelToken, InternalAxiosRequestConfig } from 'axios'; import AppError from '../types/errors'; import { Headers, Parameters, RequestCanceler, URL, UnauthorizedCallback } from './types'; @@ -18,7 +18,7 @@ export interface CustomInterceptor { } export class HttpClient { - private readonly axios: Axios; + private readonly axios: AxiosInstance; private readonly unauthorizedCallback: UnauthorizedCallback; static globalInterceptors: CustomInterceptor[] = []; diff --git a/test/auth/index.test.ts b/test/auth/index.test.ts index 2d91f74..394f286 100644 --- a/test/auth/index.test.ts +++ b/test/auth/index.test.ts @@ -1,19 +1,13 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { emptyRegisterDetails } from './registerDetails.mother'; import { basicHeaders, headersWithToken } from '../../src/shared/headers'; import { ApiSecurity, AppDetails } from '../../src/shared'; import { HttpClient } from '../../src/shared/http/client'; import { Auth, CryptoProvider, Keys, LoginDetails, Password, RegisterDetails, Token } from '../../src'; -const httpClient = HttpClient.create(''); - describe('# auth service tests', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('-> register use case', () => { @@ -33,14 +27,14 @@ describe('# auth service tests', () => { registerDetails.keys.revocationCertificate = '11'; registerDetails.captcha = '12'; - const postCall = sinon.stub(httpClient, 'post').resolves({}); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); // Act await client.register(registerDetails); // Assert - expect(postCall.firstCall.args).toEqual([ + expect(postCall).toHaveBeenCalledWith( '/users', { name: registerDetails.name, @@ -67,12 +61,12 @@ describe('# auth service tests', () => { captcha: registerDetails.captcha, }, headers, - ]); + ); }); it('Should resolve valid on valid response', async () => { // Arrange - sinon.stub(httpClient, 'post').resolves({ + vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ valid: true, }); const { client } = clientAndHeaders(); @@ -105,14 +99,14 @@ describe('# auth service tests', () => { registerDetails.keys.revocationCertificate = '11'; registerDetails.captcha = '12'; - const postCall = sinon.stub(httpClient, 'post').resolves({}); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); // Act await client.registerWithoutKeys(registerDetails); // Assert - expect(postCall.firstCall.args).toEqual([ + expect(postCall).toHaveBeenCalledWith( '/users', { name: registerDetails.name, @@ -126,12 +120,12 @@ describe('# auth service tests', () => { captcha: registerDetails.captcha, }, headers, - ]); + ); }); it('Should resolve valid on valid response', async () => { // Arrange - sinon.stub(httpClient, 'post').resolves({ + vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ valid: true, }); const { client } = clientAndHeaders(); @@ -166,14 +160,14 @@ describe('# auth service tests', () => { const mockInvitatioId = 'invitationId'; - const postCall = sinon.stub(httpClient, 'post').resolves({}); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); // Act await client.registerPreCreatedUser({ ...registerDetails, invitationId: mockInvitatioId }); // Assert - expect(postCall.firstCall.args).toEqual([ + expect(postCall).toHaveBeenCalledWith( 'users/pre-created-users/register', { name: registerDetails.name, @@ -201,12 +195,12 @@ describe('# auth service tests', () => { invitationId: mockInvitatioId, }, headers, - ]); + ); }); it('Should resolve valid on valid response', async () => { // Arrange - sinon.stub(httpClient, 'post').resolves({ + vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ valid: true, }); const { client } = clientAndHeaders(); @@ -241,14 +235,14 @@ describe('# auth service tests', () => { const mockInvitatioId = 'invitationId'; - const postCall = sinon.stub(httpClient, 'post').resolves({}); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); // Act await client.registerPreCreatedUserWithoutKeys({ ...registerDetails, invitationId: mockInvitatioId }); // Assert - expect(postCall.firstCall.args).toEqual([ + expect(postCall).toHaveBeenCalledWith( 'users/pre-created-users/register', { name: registerDetails.name, @@ -263,12 +257,12 @@ describe('# auth service tests', () => { invitationId: mockInvitatioId, }, headers, - ]); + ); }); it('Should resolve valid on valid response', async () => { // Arrange - sinon.stub(httpClient, 'post').resolves({ + vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ valid: true, }); const { client } = clientAndHeaders(); @@ -292,7 +286,7 @@ describe('# auth service tests', () => { it('Should bubble up the error on first call failure', async () => { // Arrange const error = new Error('Network error'); - sinon.stub(httpClient, 'post').rejects(error); + vi.spyOn(HttpClient.prototype, 'post').mockRejectedValue(error); const { client } = clientAndHeaders(); const loginDetails: LoginDetails = { email: '', @@ -354,14 +348,12 @@ describe('# auth service tests', () => { return Promise.resolve(keys); }, }; - const postStub = sinon.stub(httpClient, 'post'); + const postStub = vi.spyOn(HttpClient.prototype, 'post'); postStub - .onFirstCall() - .resolves({ + .mockResolvedValueOnce({ sKey: 'encrypted_salt', }) - .onSecondCall() - .rejects(error); + .mockRejectedValueOnce(error); // Act const call = client.login(loginDetails, cryptoProvider); @@ -397,14 +389,12 @@ describe('# auth service tests', () => { return Promise.resolve(keys); }, }; - const postStub = sinon.stub(httpClient, 'post'); + const postStub = vi.spyOn(HttpClient.prototype, 'post'); postStub - .onFirstCall() - .resolves({ + .mockResolvedValueOnce({ sKey: 'encrypted_salt', }) - .onSecondCall() - .resolves({ + .mockResolvedValueOnce({ user: { revocateKey: 'key', }, @@ -414,14 +404,15 @@ describe('# auth service tests', () => { const body = await client.login(loginDetails, cryptoProvider); // Assert - expect(postStub.firstCall.args).toEqual([ + expect(postStub).toHaveBeenCalledTimes(2); + expect(postStub).toHaveBeenCalledWith( '/auth/login', { email: loginDetails.email, }, headers, - ]); - expect(postStub.secondCall.args).toEqual([ + ); + expect(postStub).toHaveBeenCalledWith( '/auth/login/access', { email: loginDetails.email, @@ -442,7 +433,7 @@ describe('# auth service tests', () => { }, }, headers, - ]); + ); expect(body).toEqual({ user: { revocateKey: 'key', @@ -480,14 +471,12 @@ describe('# auth service tests', () => { return Promise.resolve(keys); }, }; - const postStub = sinon.stub(httpClient, 'post'); + const postStub = vi.spyOn(HttpClient.prototype, 'post'); postStub - .onFirstCall() - .resolves({ + .mockResolvedValueOnce({ sKey: 'encrypted_salt', }) - .onSecondCall() - .resolves({ + .mockResolvedValueOnce({ user: { revocateKey: 'key', }, @@ -497,14 +486,15 @@ describe('# auth service tests', () => { const body = await client.loginWithoutKeys(loginDetails, cryptoProvider); // Assert - expect(postStub.firstCall.args).toEqual([ + expect(postStub).toHaveBeenCalledTimes(2); + expect(postStub).toHaveBeenCalledWith( '/auth/login', { email: loginDetails.email, }, headers, - ]); - expect(postStub.secondCall.args).toEqual([ + ); + expect(postStub).toHaveBeenCalledWith( '/auth/login/access', { email: loginDetails.email, @@ -512,7 +502,7 @@ describe('# auth service tests', () => { tfa: loginDetails.tfaCode, }, headers, - ]); + ); expect(body).toEqual({ user: { revocateKey: 'key', @@ -524,7 +514,7 @@ describe('# auth service tests', () => { it('Should bubble up the error on first call failure', async () => { // Arrange const error = new Error('Network error'); - sinon.stub(httpClient, 'post').rejects(error); + vi.spyOn(HttpClient.prototype, 'post').mockRejectedValue(error); const { client } = clientAndHeaders(); const loginDetails: LoginDetails = { email: '', @@ -577,13 +567,13 @@ describe('# auth service tests', () => { privateKeyEncrypted: 'privKyber', }, }; - const axiosStub = sinon.stub(httpClient, 'patch').resolves({}); + const axiosStub = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue({}); // Act await client.updateKeys(keys, token); // Assert - expect(axiosStub.firstCall.args).toEqual([ + expect(axiosStub).toHaveBeenCalledWith( '/user/keys', { publicKey: 'pubk', @@ -599,14 +589,14 @@ describe('# auth service tests', () => { }, }, headers, - ]); + ); }); }); describe('-> security details', () => { it('Should call with right parameters & return correct content', async () => { // Arrange - const postStub = sinon.stub(httpClient, 'post').resolves({ + const postStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ hasKeys: true, sKey: 'gibberish', tfa: true, @@ -619,13 +609,13 @@ describe('# auth service tests', () => { const body = await client.securityDetails(email); // Assert - expect(postStub.firstCall.args).toEqual([ + expect(postStub).toHaveBeenCalledWith( '/auth/login', { email: email, }, headers, - ]); + ); expect(body).toEqual({ encryptedSalt: 'gibberish', tfaEnabled: true, @@ -635,7 +625,7 @@ describe('# auth service tests', () => { it('Should return boolean value on null param response', async () => { // Arrange - sinon.stub(httpClient, 'post').resolves({ + vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ hasKeys: true, sKey: 'gibberish', tfa: null, @@ -658,7 +648,7 @@ describe('# auth service tests', () => { describe('-> generate twoFactorAuth code', () => { it('Should call with right params & return data', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ qr: 'qr', code: 'code', }); @@ -668,7 +658,7 @@ describe('# auth service tests', () => { const body = await client.generateTwoFactorAuthQR(); // Assert - await expect(callStub.firstCall.args).toEqual(['/auth/tfa', headers]); + expect(callStub).toHaveBeenCalledWith('/auth/tfa', headers); expect(body).toEqual({ qr: 'qr', backupKey: 'code', @@ -679,7 +669,7 @@ describe('# auth service tests', () => { describe('-> disable twoFactorAuth', () => { it('Should call with right params & return values', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'delete').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue({}); const { client, headers } = clientAndHeadersWithToken(); const pass = 'pass', code = 'code'; @@ -688,14 +678,10 @@ describe('# auth service tests', () => { const body = await client.disableTwoFactorAuth(pass, code); // Assert - await expect(callStub.firstCall.args).toEqual([ - '/auth/tfa', - headers, - { - pass: pass, - code: code, - }, - ]); + expect(callStub).toHaveBeenCalledWith('/auth/tfa', headers, { + pass: pass, + code: code, + }); expect(body).toEqual({}); }); }); @@ -703,7 +689,7 @@ describe('# auth service tests', () => { describe('-> store twoFactorAuth key', () => { it('Should call with right params & return values', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'put').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue({}); const { client, headers } = clientAndHeadersWithToken(); const backupKey = 'key', code = 'code'; @@ -712,14 +698,14 @@ describe('# auth service tests', () => { const body = await client.storeTwoFactorAuthKey(backupKey, code); // Assert - await expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/auth/tfa', { key: backupKey, code: code, }, headers, - ]); + ); expect(body).toEqual({}); }); }); @@ -727,7 +713,7 @@ describe('# auth service tests', () => { describe('-> send email to deactivate account', () => { it('Should call with right params & return values', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const email = 'my@email'; @@ -735,7 +721,7 @@ describe('# auth service tests', () => { const body = await client.sendDeactivationEmail(email); // Assert - await expect(callStub.firstCall.args).toEqual([`/deactivate/${email}`, headers]); + expect(callStub).toHaveBeenCalledWith(`/deactivate/${email}`, headers); expect(body).toEqual({}); }); }); @@ -743,7 +729,7 @@ describe('# auth service tests', () => { describe('-> confirm account deactivation', () => { it('Should call with right params & return values', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const token = 'token'; @@ -751,7 +737,7 @@ describe('# auth service tests', () => { const body = await client.confirmDeactivation(token); // Assert - await expect(callStub.firstCall.args).toEqual([`/confirmDeactivation/${token}`, headers]); + expect(callStub).toHaveBeenCalledWith(`/confirmDeactivation/${token}`, headers); expect(body).toEqual({}); }); }); @@ -759,7 +745,7 @@ describe('# auth service tests', () => { describe('-> send email unblock account', () => { it('Should call with right params & return values', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'post').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const email = 'email@gmail.com'; @@ -767,7 +753,7 @@ describe('# auth service tests', () => { const body = await client.requestUnblockAccount(email); // Assert - expect(callStub.firstCall.args).toEqual(['users/unblock-account', { email }, headers]); + expect(callStub).toHaveBeenCalledWith('users/unblock-account', { email }, headers); expect(body).toEqual({}); }); }); @@ -775,7 +761,7 @@ describe('# auth service tests', () => { describe('-> unblock account', () => { it('Should call with right params & return values', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'put').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const token = 'token'; @@ -783,14 +769,14 @@ describe('# auth service tests', () => { const body = await client.unblockAccount(token); // Assert - expect(callStub.firstCall.args).toEqual(['users/unblock-account', { token }, headers]); + expect(callStub).toHaveBeenCalledWith('users/unblock-account', { token }, headers); expect(body).toEqual({}); }); }); describe('-> change password with link', () => { it('Should call with right params without private keys', async () => { - const callStub = sinon.stub(httpClient, 'put').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const token = 'token'; const password = 'newPassword'; @@ -799,7 +785,7 @@ describe('# auth service tests', () => { await client.changePasswordWithLink(token, password, salt, mnemonic); - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( `/users/recover-account?token=${token}&reset=false`, { password, @@ -807,11 +793,11 @@ describe('# auth service tests', () => { mnemonic, }, headers, - ]); + ); }); it('Should call with right params including private keys', async () => { - const callStub = sinon.stub(httpClient, 'put').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const token = 'token'; const password = 'newPassword'; @@ -825,7 +811,7 @@ describe('# auth service tests', () => { await client.changePasswordWithLink(token, password, salt, mnemonic, privateKeys); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( `/users/recover-account?token=${token}&reset=false`, { password, @@ -834,12 +820,12 @@ describe('# auth service tests', () => { privateKeys, }, headers, - ]); + ); }); }); describe('-> change password with link v2', () => { it('Should call with right params without keys', async () => { - const callStub = sinon.stub(httpClient, 'put').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const token = 'token'; const password = 'newPassword'; @@ -848,7 +834,7 @@ describe('# auth service tests', () => { await client.changePasswordWithLinkV2(token, password, salt, mnemonic); - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( `/users/recover-account-v2?token=${token}&reset=false`, { password, @@ -856,11 +842,11 @@ describe('# auth service tests', () => { mnemonic, }, headers, - ]); + ); }); it('Should call with right params including private keys', async () => { - const callStub = sinon.stub(httpClient, 'put').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const token = 'token'; const password = 'newPassword'; @@ -874,7 +860,7 @@ describe('# auth service tests', () => { await client.changePasswordWithLinkV2(token, password, salt, mnemonic, { private: privateKeys }); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( `/users/recover-account-v2?token=${token}&reset=false`, { password, @@ -884,11 +870,11 @@ describe('# auth service tests', () => { publicKeys: undefined, }, headers, - ]); + ); }); it('Should call with right params including private and public keys', async () => { - const callStub = sinon.stub(httpClient, 'put').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const token = 'token'; const password = 'newPassword'; @@ -909,7 +895,7 @@ describe('# auth service tests', () => { }); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( `/users/recover-account-v2?token=${token}&reset=false`, { password, @@ -919,11 +905,11 @@ describe('# auth service tests', () => { publicKeys, }, headers, - ]); + ); }); it('Should call with right params including only public keys (legacy backup without private keys)', async () => { - const callStub = sinon.stub(httpClient, 'put').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const token = 'token'; const password = 'newPassword'; @@ -939,7 +925,7 @@ describe('# auth service tests', () => { }); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( `/users/recover-account-v2?token=${token}&reset=false`, { password, @@ -949,13 +935,13 @@ describe('# auth service tests', () => { publicKeys, }, headers, - ]); + ); }); }); describe('Legacy recover account', () => { it('Should call with right params & return values', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'put').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue({}); const { client, headers } = clientAndHeaders(); const payload = { @@ -982,7 +968,7 @@ describe('# auth service tests', () => { const result = await client.legacyRecoverAccount(payload); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/users/legacy-recover-account', { token: payload.token, @@ -996,7 +982,7 @@ describe('# auth service tests', () => { keys: payload.keys, }, headers, - ]); + ); expect(result).toEqual({}); }); }); diff --git a/test/drive/backups/index.test.ts b/test/drive/backups/index.test.ts index 0217dad..e8ab025 100644 --- a/test/drive/backups/index.test.ts +++ b/test/drive/backups/index.test.ts @@ -1,25 +1,19 @@ import { HttpClient } from '../../../src/shared/http/client'; -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { ApiSecurity, AppDetails } from '../../../src/shared'; import { headersWithToken } from '../../../src/shared/headers'; import { Backups } from '../../../src/drive/backups'; -const httpClient = HttpClient.create(''); - describe('backups service', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('get all devices', () => { it('should call with right params & return data', async () => { // Arrange const { client, headers } = clientAndHeadersWithToken(); - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ devices: 'some', }); @@ -27,7 +21,7 @@ describe('backups service', () => { const body = await client.getAllDevices(); // Assert - expect(callStub.firstCall.args).toEqual(['/backup/device', headers]); + expect(callStub).toHaveBeenCalledWith('/backup/device', headers); expect(body).toEqual({ devices: 'some', }); @@ -38,7 +32,7 @@ describe('backups service', () => { it('should call with right params & return data', async () => { // Arrange const { client, headers } = clientAndHeadersWithToken(); - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ backups: 'some', }); const mac = 'lololo'; @@ -47,7 +41,7 @@ describe('backups service', () => { const body = await client.getAllBackups(mac); // Assert - expect(callStub.firstCall.args).toEqual([`/backup/${mac}`, headers]); + expect(callStub).toHaveBeenCalledWith(`/backup/${mac}`, headers); expect(body).toEqual({ backups: 'some', }); @@ -58,7 +52,7 @@ describe('backups service', () => { it('should call with right params & return data', async () => { // Arrange const { client, headers } = clientAndHeadersWithToken(); - const callStub = sinon.stub(httpClient, 'delete').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue({ done: true, }); const backupId = 1; @@ -67,7 +61,7 @@ describe('backups service', () => { const body = await client.deleteBackup(backupId); // Assert - expect(callStub.firstCall.args).toEqual([`/backup/${backupId}`, headers]); + expect(callStub).toHaveBeenCalledWith(`/backup/${backupId}`, headers); expect(body).toEqual({ done: true, }); @@ -78,7 +72,7 @@ describe('backups service', () => { it('should call with right params & return data', async () => { // Arrange const { client, headers } = clientAndHeadersWithToken(); - const callStub = sinon.stub(httpClient, 'delete').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue({ done: true, }); const deviceId = 1; @@ -87,7 +81,7 @@ describe('backups service', () => { const body = await client.deleteDevice(deviceId); // Assert - expect(callStub.firstCall.args).toEqual([`/backup/device/${deviceId}`, headers]); + expect(callStub).toHaveBeenCalledWith(`/backup/device/${deviceId}`, headers); expect(body).toEqual({ done: true, }); diff --git a/src/meet/index.test.ts b/test/drive/meet/index.test.ts similarity index 70% rename from src/meet/index.test.ts rename to test/drive/meet/index.test.ts index b2a7dbe..d65c239 100644 --- a/src/meet/index.test.ts +++ b/test/drive/meet/index.test.ts @@ -1,19 +1,13 @@ -import sinon from 'sinon'; -import { ApiSecurity, AppDetails } from '../shared'; -import { basicHeaders, headersWithToken } from '../shared/headers'; -import { HttpClient } from '../shared/http/client'; -import { Meet } from './index'; -import { CreateCallResponse, JoinCallPayload, JoinCallResponse, UsersInCallResponse } from './types'; - -const httpClient = HttpClient.create(''); +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { ApiSecurity, AppDetails } from '../../../src/shared'; +import { basicHeaders, headersWithToken } from '../../../src/shared/headers'; +import { HttpClient } from '../../../src/shared/http/client'; +import { Meet } from '../../../src/meet/index'; +import { CreateCallResponse, JoinCallPayload, JoinCallResponse, UsersInCallResponse } from '../../../src/meet/types'; describe('Meet service tests', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('createCall method', () => { @@ -27,13 +21,13 @@ describe('Meet service tests', () => { }; const { client, headers } = clientAndHeadersWithToken(); - const postCall = sinon.stub(httpClient, 'post').resolves(expectedResponse); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(expectedResponse); // Act const response = await client.createCall(); // Assert - expect(postCall.firstCall.args).toEqual(['call', {}, headers]); + expect(postCall).toHaveBeenCalledWith('call', {}, headers); expect(response).toEqual(expectedResponse); }); @@ -64,28 +58,26 @@ describe('Meet service tests', () => { it('should join a call successfully with token', async () => { // Arrange const { client, headers } = clientAndHeadersWithToken(); - const postCall = sinon.stub(httpClient, 'post').resolves(joinCallResponse); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(joinCallResponse); // Act const response = await client.joinCall(callId, payload); // Assert - expect(postCall.firstCall.args).toEqual([`call/${callId}/users/join`, payload, headers]); + expect(postCall).toHaveBeenCalledWith(`call/${callId}/users/join`, payload, headers); expect(response).toEqual(joinCallResponse); }); it('should join a call successfully without token', async () => { // Arrange const { client, headers } = clientAndHeadersWithoutToken(); - const postCall = sinon.stub(httpClient, 'post').resolves(joinCallResponse); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(joinCallResponse); // Act const response = await client.joinCall(callId, payload); // Assert - expect(postCall.firstCall.args[0]).toEqual(`call/${callId}/users/join`); - expect(postCall.firstCall.args[1]).toEqual(payload); - expect(postCall.firstCall.args[2]).toEqual(headers); + expect(postCall).toHaveBeenCalledWith(`call/${callId}/users/join`, payload, headers); expect(response).toEqual(joinCallResponse); }); }); @@ -112,27 +104,26 @@ describe('Meet service tests', () => { it('should get current users in call successfully with token', async () => { // Arrange const { client, headers } = clientAndHeadersWithToken(); - const getCall = sinon.stub(httpClient, 'get').resolves(usersInCallResponse); + const getCall = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(usersInCallResponse); // Act const response = await client.getCurrentUsersInCall(callId); // Assert - expect(getCall.firstCall.args).toEqual([`call/${callId}/users`, headers]); + expect(getCall).toHaveBeenCalledWith(`call/${callId}/users`, headers); expect(response).toEqual(usersInCallResponse); }); it('should get current users in call successfully without token', async () => { // Arrange const { client, headers } = clientAndHeadersWithoutToken(); - const getCall = sinon.stub(httpClient, 'get').resolves(usersInCallResponse); + const getCall = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(usersInCallResponse); // Act const response = await client.getCurrentUsersInCall(callId); // Assert - expect(getCall.firstCall.args[0]).toEqual(`call/${callId}/users`); - expect(getCall.firstCall.args[1]).toEqual(headers); + expect(getCall).toHaveBeenCalledWith(`call/${callId}/users`, headers); expect(response).toEqual(usersInCallResponse); }); }); @@ -143,27 +134,25 @@ describe('Meet service tests', () => { it('should leave a call successfully with token', async () => { // Arrange const { client, headers } = clientAndHeadersWithToken(); - const postCall = sinon.stub(httpClient, 'post').resolves(); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(undefined); // Act await client.leaveCall(callId); // Assert - expect(postCall.firstCall.args).toEqual([`call/${callId}/users/leave`, {}, headers]); + expect(postCall).toHaveBeenCalledWith(`call/${callId}/users/leave`, {}, headers); }); it('should leave a call successfully without token', async () => { // Arrange const { client, headers } = clientAndHeadersWithoutToken(); - const postCall = sinon.stub(httpClient, 'post').resolves(); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(undefined); // Act await client.leaveCall(callId); // Assert - expect(postCall.firstCall.args[0]).toEqual(`call/${callId}/users/leave`); - expect(postCall.firstCall.args[1]).toEqual({}); - expect(postCall.firstCall.args[2]).toEqual(headers); + expect(postCall).toHaveBeenCalledWith(`call/${callId}/users/leave`, {}, headers); }); }); }); diff --git a/test/drive/payments/index.test.ts b/test/drive/payments/index.test.ts index 7243a47..21d9bc2 100644 --- a/test/drive/payments/index.test.ts +++ b/test/drive/payments/index.test.ts @@ -1,26 +1,19 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { Payments } from '../../../src/drive'; import { CreatePaymentSessionPayload, StripeSessionMode, UserType } from '../../../src/drive/payments/types/types'; import { ApiSecurity, AppDetails } from '../../../src/shared'; import { headersWithToken } from '../../../src/shared/headers'; import { HttpClient } from '../../../src/shared/http/client'; -const httpClient = HttpClient.create(''); - describe('payments service', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - jest.resetAllMocks(); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('get products', () => { it('should call with right params & return data', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ content: 'true', }); @@ -30,7 +23,7 @@ describe('payments service', () => { const body = await client.getProducts(); // Assert - expect(callStub.firstCall.args).toEqual(['/v3/stripe/products', headers]); + expect(callStub).toHaveBeenCalledWith('/v3/stripe/products', headers); expect(body).toEqual({ content: 'true', }); @@ -38,12 +31,8 @@ describe('payments service', () => { }); describe('getInvoices', () => { - afterEach(() => { - sinon.restore(); - }); - it('should call with right params & return data', async () => { - const callStub = sinon.stub(httpClient, 'get').resolves([ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue([ { id: 'invoice_123', amount: 1000 }, { id: 'invoice_456', amount: 2000 }, ]); @@ -66,7 +55,7 @@ describe('payments service', () => { limit: '10', }).toString(); - expect(callStub.firstCall.args).toEqual([`/invoices?${expectedQuery}`, headers]); + expect(callStub).toHaveBeenCalledWith(`/invoices?${expectedQuery}`, headers); expect(invoices).toEqual([ { id: 'invoice_123', amount: 1000 }, @@ -75,7 +64,7 @@ describe('payments service', () => { }); it('should handle missing optional parameters correctly', async () => { - const callStub = sinon.stub(httpClient, 'get').resolves([]); + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue([]); const { client, headers } = clientAndHeadersWithToken({}); @@ -87,14 +76,14 @@ describe('payments service', () => { const invoices = await client.getInvoices(params as any); - expect(callStub.firstCall.args).toEqual([`/invoices?${expectedQuery}`, headers]); + expect(callStub).toHaveBeenCalledWith(`/invoices?${expectedQuery}`, headers); expect(invoices).toEqual([]); }); }); describe('check if product is available', () => { it('should call with right params & return data', async () => { - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ featuresPerService: { antivirus: false, }, @@ -103,7 +92,7 @@ describe('payments service', () => { const body = await client.checkUserAvailableProducts(); - expect(callStub.firstCall.args).toEqual(['/products', headers]); + expect(callStub).toHaveBeenCalledWith('/products', headers); expect(body).toEqual({ featuresPerService: { antivirus: false, @@ -115,7 +104,7 @@ describe('payments service', () => { describe('create payment session', () => { it('should call with right params & return data', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ id: 'ident', }); const { client, headers } = clientAndHeadersWithToken({}); @@ -132,7 +121,7 @@ describe('payments service', () => { const body = await client.createSession(payload); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/v2/stripe/session', { test: payload.test, @@ -143,7 +132,7 @@ describe('payments service', () => { canceledUrl: payload.canceledUrl, }, headers, - ]); + ); expect(body).toEqual({ id: 'ident', }); @@ -153,12 +142,12 @@ describe('payments service', () => { describe('Get user used promotional codes', () => { it('When requesting a user redeemed promo codes, it returns the correct data with the right parameters', async () => { const response = { usedCoupons: ['PROMO_CODE', 'PROMO_CODE_1'] }; - const callStub = sinon.stub(httpClient, 'get').resolves(response); + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(response); const { client, headers } = clientAndHeadersWithToken({}); const body = await client.getPromoCodesUsedByUser(); - expect(callStub.firstCall.args).toEqual(['/customer/redeemed-promotion-codes', headers]); + expect(callStub).toHaveBeenCalledWith('/customer/redeemed-promotion-codes', headers); expect(body).toEqual(response); }); }); diff --git a/test/drive/payments/object-storage.test.ts b/test/drive/payments/object-storage.test.ts index a54a02c..b578aea 100644 --- a/test/drive/payments/object-storage.test.ts +++ b/test/drive/payments/object-storage.test.ts @@ -1,37 +1,31 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { AppDetails } from '../../../src/shared'; import { basicHeaders } from '../../../src/shared/headers'; import { ObjectStorage } from '../../../src/drive'; import { HttpClient } from '../../../src/shared/http/client'; -const httpClient = HttpClient.create(''); - describe('Object Storage service', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('Get object storage plan by id', () => { it('When get object storage plan by id is requested, then it should call with right params & return data', async () => { - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ id: 'plan_123', }); const { client, headers } = basicHeadersAndClient(); const body = await client.getObjectStoragePlanById('plan_123', 'eur'); - expect(callStub.firstCall.args).toEqual(['/object-storage/price?planId=plan_123¤cy=eur', headers]); + expect(callStub).toHaveBeenCalledWith('/object-storage/price?planId=plan_123¤cy=eur', headers); expect(body).toEqual({ id: 'plan_123' }); }); }); describe('Create customer for object storage', () => { it('When create customer is requested, then it should call with right params & return data', async () => { - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ customerId: 'cus_123', }); const { client, headers } = basicHeadersAndClient(); @@ -57,14 +51,14 @@ describe('Object Storage service', () => { query.set('country', country); query.set('companyVatId', companyVatId); - expect(callStub.firstCall.args).toEqual([`/object-storage/customer?${query.toString()}`, headers]); + expect(callStub).toHaveBeenCalledWith(`/object-storage/customer?${query.toString()}`, headers); expect(body).toEqual({ customerId: 'cus_123' }); }); }); describe('Create object storage subscription', () => { it('When create subscription is requested, then it should call with right params & return data', async () => { - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ subscriptionId: 'sub_123', }); @@ -78,7 +72,7 @@ describe('Object Storage service', () => { promoCodeId: 'promo_123', }); - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/object-storage/subscription', { customerId: 'cus_123', @@ -88,13 +82,13 @@ describe('Object Storage service', () => { promoCodeId: 'promo_123', }, headers, - ]); + ); }); }); describe('Verifying the user payment method', () => { it("When the user wants to verify the payment method and it's verified, then an object indicating so is returned", async () => { - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ intentId: 'intent_id', verified: true, }); @@ -109,7 +103,7 @@ describe('Object Storage service', () => { paymentMethod: 'pm123', }); - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/payment-method-verification', { customerId: 'cus_123', @@ -119,13 +113,13 @@ describe('Object Storage service', () => { paymentMethod: 'pm123', }, headers, - ]); + ); expect(result).toEqual({ intentId: 'intent_id', verified: true }); }); it("When the user wants to verify the payment method and it's not verified, then an object indicating so is returned", async () => { - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ intentId: '', verified: false, clientSecret: 'client_secret', @@ -141,7 +135,7 @@ describe('Object Storage service', () => { paymentMethod: 'pm123', }); - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/payment-method-verification', { customerId: 'cus_123', @@ -151,7 +145,7 @@ describe('Object Storage service', () => { paymentMethod: 'pm123', }, headers, - ]); + ); expect(result).toEqual({ intentId: '', verified: false, clientSecret: 'client_secret' }); }); diff --git a/test/drive/referrals/index.test.ts b/test/drive/referrals/index.test.ts index 8e06647..aa1c906 100644 --- a/test/drive/referrals/index.test.ts +++ b/test/drive/referrals/index.test.ts @@ -1,25 +1,19 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { ApiSecurity, AppDetails } from '../../../src/shared'; import { headersWithToken } from '../../../src/shared/headers'; import { Referrals } from '../../../src/drive'; import { HttpClient } from '../../../src/shared/http/client'; -const httpClient = HttpClient.create(''); - describe('# users service tests', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('get referrals', () => { it('should call with right params & return response', async () => { // Arrange const { client, headers } = clientAndHeaders(); - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ referrals: [1, 2], }); @@ -27,7 +21,7 @@ describe('# users service tests', () => { const body = await client.getReferrals(); // Assert - expect(callStub.firstCall.args).toEqual(['/users-referrals', headers]); + expect(callStub).toHaveBeenCalledWith('/users-referrals', headers); expect(body).toEqual({ referrals: [1, 2], }); diff --git a/test/drive/share/index.test.ts b/test/drive/share/index.test.ts index ebc5d4f..d95cf37 100644 --- a/test/drive/share/index.test.ts +++ b/test/drive/share/index.test.ts @@ -1,4 +1,4 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { GenerateShareLinkPayload, GetSharedDirectoryPayload, @@ -10,25 +10,20 @@ import { Share } from '../../../src/drive'; import { basicHeaders, headersWithToken } from '../../../src/shared/headers'; import { ApiSecurity, AppDetails } from '../../../src/shared'; import { HttpClient } from '../../../src/shared/http/client'; - -const httpClient = HttpClient.create(''); +import { fail } from 'assert'; describe('# share service tests', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('generate share link', () => { it('Should be called with fail argments & throws Error', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ token: 'token', }); - const { client, headers } = clientAndHeadersWithToken(); + const { client } = clientAndHeadersWithToken(); const payload: GenerateShareLinkPayload = { itemId: '1', type: 'files', @@ -40,14 +35,18 @@ describe('# share service tests', () => { }; // Assert - expect(() => { - client.createShareLink(payload); - }).toThrow('Invalid type'); + try { + await client.createShareLink(payload); + fail('Expected function to throw an error, but it did not.'); + } catch (error) { + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe('Invalid type'); + } }); it('Should be called with right arguments & return content of file', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ token: 'token', }); const { client, headers } = clientAndHeadersWithToken(); @@ -65,7 +64,7 @@ describe('# share service tests', () => { const body = await client.createShareLink(payload); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/storage/share/file/1', { timesValid: payload.timesValid, @@ -75,7 +74,7 @@ describe('# share service tests', () => { encryptedCode: payload.encryptedCode, }, headers, - ]); + ); expect(body).toEqual({ token: 'token', }); @@ -83,7 +82,7 @@ describe('# share service tests', () => { it('Should be called with right arguments & return content of folders', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ token: 'token', }); const { client, headers } = clientAndHeadersWithToken(); @@ -101,7 +100,7 @@ describe('# share service tests', () => { const body = await client.createShareLink(payload); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/storage/share/folder/1', { timesValid: payload.timesValid, @@ -111,7 +110,7 @@ describe('# share service tests', () => { encryptedCode: payload.encryptedCode, }, headers, - ]); + ); expect(body).toEqual({ token: 'token', }); @@ -121,17 +120,17 @@ describe('# share service tests', () => { describe('get share token info', () => { it('Should be called with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ info: 'some', }); - const { client, headers } = clientAndHeaders(); + const { client, headers } = clientAndBasicHeaders(); const token = 'ma-token'; // Act const body = await client.getShareLink(token); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/share/ma-token', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/share/ma-token', headers); expect(body).toEqual({ info: 'some', }); @@ -141,18 +140,18 @@ describe('# share service tests', () => { describe('delete share by id', () => { it('Should be called with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'delete').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue({ deleted: true, shareId: '1', }); - const { client, headers } = clientAndHeaders(); + const { client, headers } = clientAndHeadersWithToken(); const shareId = '1'; // Act const body = await client.deleteShareLink(shareId); // Assert - expect(callStub.firstCall.args).toMatchObject(['/storage/share/1', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/share/1', headers); expect(body).toEqual({ deleted: true, shareId: '1', @@ -165,17 +164,17 @@ describe('# share service tests', () => { // Arrange const mockUuid = '550e8400-e29b-41d4-a716-446655440000'; - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ uuid: mockUuid, }); - const { client, headers } = clientAndHeaders(); + const { client, headers } = clientAndHeadersWithToken(); const shareId = mockUuid; // Act const body = await client.validateInviteExpiration(shareId); // Assert - expect(callStub.firstCall.args).toMatchObject([`sharings/invites/${mockUuid}/validate`, headers]); + expect(callStub).toHaveBeenCalledWith(`sharings/invites/${mockUuid}/validate`, headers); expect(body).toEqual({ uuid: mockUuid, }); @@ -203,18 +202,18 @@ describe('# share service tests', () => { itemToken: 'sampleItemToken', }; - const callStub = sinon.stub(httpClient, 'patch').resolves(sharedFile); - const { client, headers } = clientAndHeaders(); + const callStub = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue(sharedFile); + const { client, headers } = clientAndHeadersWithToken(); // Act const body = await client.saveSharingPassword(mockUuid, 'encryptedPassword'); // Assert - expect(callStub.firstCall.args).toMatchObject([ + expect(callStub).toHaveBeenCalledWith( `sharings/${mockUuid}/password`, { encryptedPassword: 'encryptedPassword' }, headers, - ]); + ); expect(body).toEqual(sharedFile); }); }); @@ -224,21 +223,21 @@ describe('# share service tests', () => { // Arrange const mockUuid = '550e8400-e29b-41d4-a716-446655440000'; - const callStub = sinon.stub(httpClient, 'delete').resolves(); - const { client, headers } = clientAndHeaders(); + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue({}); + const { client, headers } = clientAndHeadersWithToken(); // Act await client.removeSharingPassword(mockUuid); // Assert - expect(callStub.firstCall.args).toMatchObject([`sharings/${mockUuid}/password`, headers]); + expect(callStub).toHaveBeenCalledWith(`sharings/${mockUuid}/password`, headers); }); }); describe('get public shared item info', () => { it('Should be called with sharingId and return basic info', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ plainName: 'anyname', size: 30, type: 'pdf', @@ -250,7 +249,7 @@ describe('# share service tests', () => { const body = await client.getPublicSharedItemInfo(mockUuid); // Assert - expect(callStub.firstCall.args).toEqual([`sharings/public/${mockUuid}/item`, headers]); + expect(callStub).toHaveBeenCalledWith(`sharings/public/${mockUuid}/item`, headers); expect(body).toEqual({ plainName: 'anyname', size: 30, @@ -262,7 +261,7 @@ describe('# share service tests', () => { describe('get shares list', () => { it('Should be called with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ list: 'some', }); const { client, headers } = clientAndHeadersWithToken(); @@ -271,7 +270,7 @@ describe('# share service tests', () => { const body = await client.getShareLinks(); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/share/list?page=0&perPage=50', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/share/list?page=0&perPage=50', headers); expect(body).toEqual({ list: 'some', }); @@ -279,7 +278,7 @@ describe('# share service tests', () => { it('Should be called with right pagination & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ list: 'some', }); const { client, headers } = clientAndHeadersWithToken(); @@ -288,7 +287,7 @@ describe('# share service tests', () => { const body = await client.getShareLinks(2, 100); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/share/list?page=2&perPage=100', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/share/list?page=2&perPage=100', headers); expect(body).toEqual({ list: 'some', }); @@ -298,17 +297,17 @@ describe('# share service tests', () => { describe('get shared folder info', () => { it('Should be called with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ info: 'some', }); - const { client, headers } = clientAndHeaders(); + const { client, headers } = clientAndBasicHeaders(); const token = 'ma-token'; // Act const body = await client.getShareLink(token); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/share/ma-token', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/share/ma-token', headers); expect(body).toEqual({ info: 'some', }); @@ -318,10 +317,10 @@ describe('# share service tests', () => { describe('get shared-directory folders', () => { it('Should be called with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ info: 'some', }); - const { client, headers } = clientAndHeaders(); + const { client, headers } = clientAndBasicHeaders(); const payload: GetSharedDirectoryPayload = { token: 'tokk', folderId: 1, @@ -335,10 +334,10 @@ describe('# share service tests', () => { const body = await client.getShareLinkDirectory(payload); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( `/storage/share/down/folders?token=${payload.token}&folderId=${payload.folderId}&parentId=${payload.parentId}&page=${payload.page}&perPage=${payload.perPage}`, headers, - ]); + ); expect(body).toEqual({ info: 'some', }); @@ -348,10 +347,10 @@ describe('# share service tests', () => { describe('get shared-directory files', () => { it('Should be called with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ info: 'some', }); - const { client, headers } = clientAndHeaders(); + const { client, headers } = clientAndBasicHeaders(); const payload: GetSharedDirectoryPayload = { token: 'tokk', type: 'file', @@ -366,10 +365,10 @@ describe('# share service tests', () => { const body = await client.getShareLinkDirectory(payload); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( `/storage/share/down/files?token=${payload.token}&folderId=${payload.folderId}&parentId=${payload.parentId}&page=${payload.page}&perPage=${payload.perPage}&code=${payload.code}`, headers, - ]); + ); expect(body).toEqual({ info: 'some', }); @@ -379,7 +378,7 @@ describe('# share service tests', () => { describe('get shared folder size', () => { it('Should be called with right arguments & return folder size', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ size: 30, }); const { client, headers } = clientAndHeadersWithToken(); @@ -389,7 +388,7 @@ describe('# share service tests', () => { const body = await client.getSharedFolderSize(mockUuid); // Assert - expect(callStub.firstCall.args).toEqual([`sharings/public/${mockUuid}/folder/size`, headers]); + expect(callStub).toHaveBeenCalledWith(`sharings/public/${mockUuid}/folder/size`, headers); expect(body).toEqual({ size: 30, }); @@ -407,7 +406,7 @@ describe('# share service tests', () => { }, type: 'public', }; - const callStub = sinon.stub(httpClient, 'get').resolves(mockedResponse); + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(mockedResponse); const { client, headers } = clientAndHeadersWithToken(); const mockId = 'item-id'; const mockedItemType = 'item-type'; @@ -416,7 +415,7 @@ describe('# share service tests', () => { const body = await client.getSharingInfo({ itemId: mockId, itemType: mockedItemType }); // Assert - expect(callStub.firstCall.args).toEqual([`sharings/${mockedItemType}/${mockId}/info`, headers]); + expect(callStub).toHaveBeenCalledWith(`sharings/${mockedItemType}/${mockId}/info`, headers); expect(body).toStrictEqual(mockedResponse); }); }); @@ -442,7 +441,7 @@ describe('# share service tests', () => { return { client, headers }; } - function clientAndHeaders( + function clientAndBasicHeaders( apiUrl = '', clientName = 'c-name', clientVersion = '0.1', diff --git a/test/drive/storage/index.test.ts b/test/drive/storage/index.test.ts index 219fe54..f677770 100644 --- a/test/drive/storage/index.test.ts +++ b/test/drive/storage/index.test.ts @@ -1,4 +1,4 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { v4 } from 'uuid'; import { Storage, StorageTypes } from '../../../src/drive'; import { @@ -26,15 +26,9 @@ import { randomMoveFilePayload } from './mothers/moveFilePayload.mother'; import { randomMoveFolderPayload } from './mothers/moveFolderPayload.mother'; import { randomUpdateFolderMetadataPayload } from './mothers/updateFolderMetadataPayload.mother'; -const httpClient = HttpClient.create(''); - describe('# storage service tests', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('-> folders', () => { @@ -43,7 +37,7 @@ describe('# storage service tests', () => { // Arrange const response = randomFolderContentResponse(2, 2); const { client } = clientAndHeaders({}); - sinon.stub(httpClient, 'getCancellable').returns({ + vi.spyOn(HttpClient.prototype, 'getCancellable').mockReturnValue({ promise: Promise.resolve(response), requestCanceler: { cancel: () => null, @@ -51,7 +45,7 @@ describe('# storage service tests', () => { }); // Act - const [promise, requestCanceler] = client.getFolderContent(1); + const [promise] = client.getFolderContent(1); const body = await promise; // Assert @@ -91,13 +85,13 @@ describe('# storage service tests', () => { ], }; const { client, headers } = clientAndHeaders({}); - sinon.stub(httpClient, 'getCancellable').returns({ + vi.spyOn(HttpClient.prototype, 'getCancellable').mockReturnValue({ promise: Promise.resolve(response), requestCanceler: { cancel: () => null, }, }); - const getFolderFoldersStub = jest.spyOn(httpClient, 'getCancellable'); + const getFolderFoldersStub = vi.spyOn(HttpClient.prototype, 'getCancellable'); // Act const [promise] = client.getFolderFolders(folderId); @@ -144,13 +138,13 @@ describe('# storage service tests', () => { ], }; const { client, headers } = clientAndHeaders({}); - sinon.stub(httpClient, 'getCancellable').returns({ + vi.spyOn(HttpClient.prototype, 'getCancellable').mockReturnValue({ promise: Promise.resolve(response), requestCanceler: { cancel: () => null, }, }); - const getFolderFoldersStub = jest.spyOn(httpClient, 'getCancellable'); + const getFolderFoldersStub = vi.spyOn(HttpClient.prototype, 'getCancellable'); // Act const [promise] = client.getFolderFiles(folderId); @@ -170,13 +164,13 @@ describe('# storage service tests', () => { const responseSubfiles = randomSubfilesResponse(3); const randomUUID = v4(); const { client, headers } = clientAndHeaders({}); - sinon.stub(httpClient, 'getCancellable').returns({ + vi.spyOn(HttpClient.prototype, 'getCancellable').mockReturnValue({ promise: Promise.resolve(responseSubfiles), requestCanceler: { cancel: () => null, }, }); - const getFolderContentFilesStub = jest.spyOn(httpClient, 'getCancellable'); + const getFolderContentFilesStub = vi.spyOn(HttpClient.prototype, 'getCancellable'); // Act const [promise] = client.getFolderFilesByUuid(randomUUID); @@ -196,13 +190,13 @@ describe('# storage service tests', () => { const responseSubfolders = randomSubfoldersResponse(4); const { client, headers } = clientAndHeaders({}); - sinon.stub(httpClient, 'getCancellable').returns({ + vi.spyOn(HttpClient.prototype, 'getCancellable').mockReturnValue({ promise: Promise.resolve(responseSubfolders), requestCanceler: { cancel: () => null, }, }); - const getFolderContentFoldersStub = jest.spyOn(httpClient, 'getCancellable'); + const getFolderContentFoldersStub = vi.spyOn(HttpClient.prototype, 'getCancellable'); // Act const [promise] = client.getFolderFoldersByUuid(randomUUID); @@ -232,7 +226,7 @@ describe('# storage service tests', () => { // Arrange const response = randomFolderContentResponse(2, 2); const { client, headers } = clientAndHeaders({}); - const callStub = sinon.stub(httpClient, 'getCancellable').returns({ + const callStub = vi.spyOn(HttpClient.prototype, 'getCancellable').mockReturnValue({ promise: Promise.resolve(response), requestCanceler: { cancel: () => null, @@ -240,11 +234,11 @@ describe('# storage service tests', () => { }); // Act - const [promise, requestCanceler] = client.getFolderContent(1, true); + const [promise] = client.getFolderContent(1, true); const body = await promise; // Assert - expect(callStub.firstCall.args).toEqual(['/storage/v2/folder/1/?trash=true', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/v2/folder/1/?trash=true', headers); expect(body.files).toHaveLength(2); expect(body.children).toHaveLength(2); }); @@ -276,7 +270,7 @@ describe('# storage service tests', () => { removed: false, removedAt: null, }; - const callStub = sinon.stub(httpClient, 'postCancellable').returns({ + const callStub = vi.spyOn(HttpClient.prototype, 'postCancellable').mockReturnValue({ promise: Promise.resolve(createFolderResponse), requestCanceler: { cancel: () => null, @@ -285,18 +279,18 @@ describe('# storage service tests', () => { const { client, headers } = clientAndHeaders({}); // Act - const [promise, requestCanceler] = client.createFolder(createFolderPayload); + const [promise] = client.createFolder(createFolderPayload); const body = await promise; // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/storage/folder', { parentFolderId: 34, folderName: 'ma-fol', }, headers, - ]); + ); expect(body).toEqual(createFolderResponse); }); @@ -341,21 +335,21 @@ describe('# storage service tests', () => { }, moved: false, }; - const callStub = sinon.stub(httpClient, 'post').resolves(moveFolderResponse); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(moveFolderResponse); const { client, headers } = clientAndHeaders({}); // Act const body = await client.moveFolder(payload); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/storage/move/folder', { folderId: payload.folderId, destination: payload.destinationFolderId, }, headers, - ]); + ); expect(body).toEqual(moveFolderResponse); }); }); @@ -365,13 +359,13 @@ describe('# storage service tests', () => { // Arrange const payload = randomUpdateFolderMetadataPayload(); const { client, headers } = clientAndHeaders({}); - const callStub = sinon.stub(httpClient, 'post').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({}); // Act await client.updateFolder(payload); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/storage/folder/2/meta', { metadata: { @@ -381,14 +375,14 @@ describe('# storage service tests', () => { }, }, headers, - ]); + ); }); }); describe('delete folder', () => { it('Should call with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'delete').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue({ valid: true, }); const { client, headers } = clientAndHeaders({}); @@ -397,7 +391,7 @@ describe('# storage service tests', () => { const body = await client.deleteFolder(2); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/folder/2', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/folder/2', headers); expect(body).toEqual({ valid: true, }); @@ -407,7 +401,7 @@ describe('# storage service tests', () => { describe('folder size', () => { it('Should call with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ size: 10, }); const { client, headers } = clientAndHeaders({}); @@ -416,7 +410,7 @@ describe('# storage service tests', () => { const body = await client.getFolderSize(2); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/folder/size/2', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/folder/size/2', headers); expect(body).toEqual(10); }); }); @@ -442,7 +436,7 @@ describe('# storage service tests', () => { plainName: 'mi-folder3', }, ]; - const callStub = sinon.stub(httpClient, 'get').resolves(mockResponse); + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(mockResponse); const { client, headers } = clientAndHeaders({ customHeaders: { 'internxt-resources-token': resourceToken, @@ -453,10 +447,7 @@ describe('# storage service tests', () => { const body = await client.getFolderAncestorsInWorkspace(workspaceId, itemType, itemUuid, resourceToken); // Assert - expect(callStub.firstCall.args).toEqual([ - `workspaces/${workspaceId}/${itemType}/${itemUuid}/ancestors`, - headers, - ]); + expect(callStub).toHaveBeenCalledWith(`workspaces/${workspaceId}/${itemType}/${itemUuid}/ancestors`, headers); expect(body).toEqual(mockResponse); }); @@ -479,17 +470,14 @@ describe('# storage service tests', () => { plainName: 'mi-folder3', }, ]; - const callStub = sinon.stub(httpClient, 'get').resolves(mockResponse); + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(mockResponse); const { client, headers } = clientAndHeaders({}); // Act const body = await client.getFolderAncestorsInWorkspace(workspaceId, itemType, itemUuid); // Assert - expect(callStub.firstCall.args).toEqual([ - `workspaces/${workspaceId}/${itemType}/${itemUuid}/ancestors`, - headers, - ]); + expect(callStub).toHaveBeenCalledWith(`workspaces/${workspaceId}/${itemType}/${itemUuid}/ancestors`, headers); expect(body).toEqual(mockResponse); }); }); @@ -499,7 +487,7 @@ describe('# storage service tests', () => { describe('create file entry', () => { it('Should have all the correct params on call', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'post').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({}); const { client, headers } = clientAndHeaders({}); const fileEntry: StorageTypes.FileEntry = { id: '1', @@ -516,7 +504,7 @@ describe('# storage service tests', () => { await client.createFileEntry(fileEntry); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/storage/file', { file: { @@ -531,7 +519,7 @@ describe('# storage service tests', () => { }, }, headers, - ]); + ); }); }); @@ -546,7 +534,7 @@ describe('# storage service tests', () => { itemName: 'new name', }, }; - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ valid: true, }); const { client, headers } = clientAndHeaders({}); @@ -555,7 +543,7 @@ describe('# storage service tests', () => { const body = await client.updateFile(payload); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/storage/file/6/meta', { metadata: { @@ -565,7 +553,7 @@ describe('# storage service tests', () => { relativePath: 'x', }, headers, - ]); + ); expect(body).toEqual({ valid: true, }); @@ -575,7 +563,7 @@ describe('# storage service tests', () => { describe('delete file', () => { it('Should call with right arguments and return control', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'delete').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue({ valid: true, }); const { client, headers } = clientAndHeaders({}); @@ -588,7 +576,7 @@ describe('# storage service tests', () => { const body = await client.deleteFile(payload); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/folder/2/file/5', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/folder/2/file/5', headers); expect(body).toEqual({ valid: true, }); @@ -599,7 +587,7 @@ describe('# storage service tests', () => { it('Should call with right arguments & return content', async () => { // Arrange const payload = randomMoveFilePayload(); - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ content: 'test', }); const { client, headers } = clientAndHeaders({}); @@ -611,7 +599,7 @@ describe('# storage service tests', () => { expect(body).toEqual({ content: 'test', }); - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/storage/move/file', { fileId: payload.fileId, @@ -620,14 +608,14 @@ describe('# storage service tests', () => { bucketId: payload.bucketId, }, headers, - ]); + ); }); }); describe('get recent files', () => { it('Should be called with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ files: [], }); const { client, headers } = clientAndHeaders({}); @@ -636,7 +624,7 @@ describe('# storage service tests', () => { const body = await client.getRecentFiles(5); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/recents?limit=5', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/recents?limit=5', headers); expect(body).toEqual({ files: [], }); @@ -646,7 +634,7 @@ describe('# storage service tests', () => { describe('get recent files V2', () => { it('Should be called with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ files: [], }); const { client, headers } = clientAndHeaders({}); @@ -655,7 +643,7 @@ describe('# storage service tests', () => { const body = await client.getRecentFilesV2(5); // Assert - expect(callStub.firstCall.args).toEqual(['/files/recents?limit=5', headers]); + expect(callStub).toHaveBeenCalledWith('/files/recents?limit=5', headers); expect(body).toEqual({ files: [], }); @@ -669,7 +657,7 @@ describe('# storage service tests', () => { const size = 100; const fileUUID = v4(); const response = randomFileData(); - const callStub = sinon.stub(httpClient, 'put').resolves(response); + const callStub = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue(response); const { client, headers } = clientAndHeaders({}); // Act @@ -679,14 +667,14 @@ describe('# storage service tests', () => { }); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( `/files/${fileUUID}`, { fileId, size, }, headers, - ]); + ); expect(body).toEqual(response); }); }); @@ -696,7 +684,7 @@ describe('# storage service tests', () => { // Arrange const fileUUID = v4(); const response = randomFileMetaData(); - const callStub = sinon.stub(httpClient, 'getCancellable').returns({ + const callStub = vi.spyOn(HttpClient.prototype, 'getCancellable').mockReturnValue({ promise: Promise.resolve(response), requestCanceler: { cancel: () => null, @@ -710,7 +698,7 @@ describe('# storage service tests', () => { const body = await promise; // Assert - expect(callStub.firstCall.args).toEqual([`/files/${fileUUID}/meta`, headers]); + expect(callStub).toHaveBeenCalledWith(`/files/${fileUUID}/meta`, headers); expect(body).toEqual(response); }); @@ -718,7 +706,7 @@ describe('# storage service tests', () => { // Arrange const fileUUID = v4(); const response = randomFileMetaData(); - const callStub = sinon.stub(httpClient, 'getCancellable').returns({ + const callStub = vi.spyOn(HttpClient.prototype, 'getCancellable').mockReturnValue({ promise: Promise.resolve(response), requestCanceler: { cancel: () => null, @@ -732,7 +720,7 @@ describe('# storage service tests', () => { const body = await promise; // Assert - expect(callStub.firstCall.args).toEqual([`/files/${fileUUID}/meta`, headers]); + expect(callStub).toHaveBeenCalledWith(`/files/${fileUUID}/meta`, headers); expect(body).toEqual(response); }); }); @@ -743,7 +731,7 @@ describe('# storage service tests', () => { it('should call with right params & return response', async () => { // Arrange const { client, headers } = clientAndHeaders({}); - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ total: 10, }); @@ -751,7 +739,7 @@ describe('# storage service tests', () => { const body = await client.spaceUsage(); // Assert - expect(callStub.firstCall.args).toEqual(['/usage', headers]); + expect(callStub).toHaveBeenCalledWith('/usage', headers); expect(body).toEqual({ total: 10, }); @@ -761,13 +749,13 @@ describe('# storage service tests', () => { describe('space usage v2', () => { it('should call with right params & return response', async () => { const { client, headers } = clientAndHeaders({}); - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ drive: 10, }); const body = await client.spaceUsageV2(); - expect(callStub.firstCall.args).toEqual(['/users/usage', headers]); + expect(callStub).toHaveBeenCalledWith('/users/usage', headers); expect(body).toEqual({ drive: 10, }); @@ -777,13 +765,13 @@ describe('# storage service tests', () => { describe('The user already uploaded any file', () => { it('it should return a boolean indicating if the user already uploaded any file or not', async () => { const { client, headers } = clientAndHeaders({}); - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ hasUploadedFiles: true, }); const body = await client.hasUploadedFiles(); - expect(callStub.firstCall.args).toEqual(['/users/me/upload-status', headers]); + expect(callStub).toHaveBeenCalledWith('/users/me/upload-status', headers); expect(body).toEqual({ hasUploadedFiles: true, }); @@ -794,7 +782,7 @@ describe('# storage service tests', () => { it('should call with right params & return response', async () => { // Arrange const { client, headers } = clientAndHeaders({}); - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ total: 10, }); @@ -802,7 +790,7 @@ describe('# storage service tests', () => { const body = await client.spaceLimit(); // Assert - expect(callStub.firstCall.args).toEqual(['/limit', headers]); + expect(callStub).toHaveBeenCalledWith('/limit', headers); expect(body).toEqual({ total: 10, }); @@ -812,13 +800,13 @@ describe('# storage service tests', () => { describe('space limit v2', () => { it('should call with right params & return response', async () => { const { client, headers } = clientAndHeaders({}); - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ maxSpaceBytes: 10, }); const body = await client.spaceLimitV2(); - expect(callStub.firstCall.args).toEqual(['/users/limit', headers]); + expect(callStub).toHaveBeenCalledWith('/users/limit', headers); expect(body).toEqual({ maxSpaceBytes: 10, }); @@ -831,7 +819,7 @@ describe('# storage service tests', () => { // Arrange const response = randomFolderContentResponse(2, 2); const { client } = clientAndHeaders({}); - sinon.stub(httpClient, 'getCancellable').returns({ + vi.spyOn(HttpClient.prototype, 'getCancellable').mockReturnValue({ promise: Promise.resolve(response), requestCanceler: { cancel: () => null, @@ -839,7 +827,7 @@ describe('# storage service tests', () => { }); // Act - const [promise, requestCanceler] = client.getTrash(); + const [promise] = client.getTrash(); const body = await promise; // Assert @@ -863,7 +851,7 @@ describe('# storage service tests', () => { describe('Add Items into trash', () => { it('should call with right params & return 200', async () => { const { client, headers } = clientAndHeaders({}); - const callStub = sinon.stub(httpClient, 'post').resolves(true); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(true); const itemsToTrash = [ { id: 'id1', uuid: 'uuid1', type: 'file' as const }, { id: 'id2', uuid: 'uuid2', type: 'folder' as const }, @@ -873,7 +861,7 @@ describe('# storage service tests', () => { const body = await client.addItemsToTrash({ items: itemsToTrash }); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/trash/add', { items: itemsToTrash }, headers]); + expect(callStub).toHaveBeenCalledWith('/storage/trash/add', { items: itemsToTrash }, headers); expect(body).toEqual(true); }); }); @@ -914,16 +902,18 @@ describe('# storage service tests', () => { 'internxt-resources-token': resourcesToken, }; - const postStub = sinon.stub(httpClient, 'post').resolves(expectedResponse); + const postStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(expectedResponse); const response = await client.createThumbnailEntryWithUUID(thumbnailEntryPayload, resourcesToken); - expect(postStub.calledOnce).toBeTruthy(); - expect(postStub.firstCall.args[0]).toEqual('/files/thumbnail'); - expect(postStub.firstCall.args[1]).toEqual({ - ...thumbnailEntryPayload, - }); - expect(postStub.firstCall.args[2]).toEqual(headersWithResourceToken); + expect(postStub).toHaveBeenCalledOnce(); + expect(postStub).toHaveBeenCalledWith( + '/files/thumbnail', + { + ...thumbnailEntryPayload, + }, + headersWithResourceToken, + ); expect(response).toEqual(expectedResponse); }); }); diff --git a/test/drive/storage/mothers/moveFilePayload.mother.ts b/test/drive/storage/mothers/moveFilePayload.mother.ts index 9d2666e..dee5a71 100644 --- a/test/drive/storage/mothers/moveFilePayload.mother.ts +++ b/test/drive/storage/mothers/moveFilePayload.mother.ts @@ -5,6 +5,6 @@ export function randomMoveFilePayload(): MoveFilePayload { fileId: 'xtr-std-asd', destination: 0, destinationPath: 'x', - bucketId: '' + bucketId: '', }; -} \ No newline at end of file +} diff --git a/test/drive/storage/mothers/moveFolderPayload.mother.ts b/test/drive/storage/mothers/moveFolderPayload.mother.ts index 26b6363..30e1706 100644 --- a/test/drive/storage/mothers/moveFolderPayload.mother.ts +++ b/test/drive/storage/mothers/moveFolderPayload.mother.ts @@ -5,4 +5,4 @@ export function randomMoveFolderPayload(): MoveFolderPayload { folderId: 1, destinationFolderId: 3, }; -} \ No newline at end of file +} diff --git a/test/drive/storage/mothers/updateFolderMetadataPayload.mother.ts b/test/drive/storage/mothers/updateFolderMetadataPayload.mother.ts index 7a0d67d..997d71c 100644 --- a/test/drive/storage/mothers/updateFolderMetadataPayload.mother.ts +++ b/test/drive/storage/mothers/updateFolderMetadataPayload.mother.ts @@ -9,4 +9,4 @@ export function randomUpdateFolderMetadataPayload(): UpdateFolderMetadataPayload icon: 'new icon', }, }; -} \ No newline at end of file +} diff --git a/test/drive/trash/index.test.ts b/test/drive/trash/index.test.ts index 4ace537..4a66a66 100644 --- a/test/drive/trash/index.test.ts +++ b/test/drive/trash/index.test.ts @@ -1,4 +1,4 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { Trash } from '../../../src/drive'; import { randomFolderContentResponse } from '../storage/mothers/folderContentResponse.mother'; import { DeleteFilePayload, DeleteItemsPermanentlyPayload } from '../../../src/drive/trash/types'; @@ -6,22 +6,16 @@ import { headersWithToken } from '../../../src/shared/headers'; import { ApiSecurity, AppDetails } from '../../../src/shared'; import { HttpClient } from '../../../src/shared/http/client'; -const httpClient = HttpClient.create(''); - describe('# trash service tests', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('-> folders', () => { describe('delete folder', () => { it('Should call with right arguments & return content', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'delete').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue({ valid: true, }); const { client, headers } = clientAndHeaders(); @@ -30,7 +24,7 @@ describe('# trash service tests', () => { const body = await client.deleteFolder(2); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/folder/2', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/folder/2', headers); expect(body).toEqual({ valid: true, }); @@ -42,7 +36,7 @@ describe('# trash service tests', () => { describe('delete file', () => { it('Should call with right arguments and return control', async () => { // Arrange - const callStub = sinon.stub(httpClient, 'delete').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue({ valid: true, }); const { client, headers } = clientAndHeaders(); @@ -55,7 +49,7 @@ describe('# trash service tests', () => { const body = await client.deleteFile(payload); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/folder/2/file/5', headers]); + expect(callStub).toHaveBeenCalledWith('/storage/folder/2/file/5', headers); expect(body).toEqual({ valid: true, }); @@ -69,7 +63,7 @@ describe('# trash service tests', () => { // Arrange const response = randomFolderContentResponse(2, 2); const { client } = clientAndHeaders(); - sinon.stub(httpClient, 'get').resolves(response); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(response); // Act const body = await client.getTrash(); @@ -82,7 +76,7 @@ describe('# trash service tests', () => { describe('Add Items into trash', () => { it('should call with right params & return 200', async () => { const { client, headers } = clientAndHeaders(); - const callStub = sinon.stub(httpClient, 'post').resolves(true); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(true); const itemsToTrash = [ { id: 'id1', uuid: 'uuid1', type: 'file' as const }, { id: 'id2', uuid: 'uuid2', type: 'folder' as const }, @@ -92,7 +86,7 @@ describe('# trash service tests', () => { const body = await client.addItemsToTrash({ items: itemsToTrash }); // Assert - expect(callStub.firstCall.args).toEqual(['/storage/trash/add', { items: itemsToTrash }, headers]); + expect(callStub).toHaveBeenCalledWith('/storage/trash/add', { items: itemsToTrash }, headers); expect(body).toEqual(true); }); }); @@ -101,7 +95,7 @@ describe('# trash service tests', () => { it('should return an empty body', async () => { // Arrange const { client } = clientAndHeaders(); - sinon.stub(httpClient, 'delete').resolves(); + vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue(undefined); // Act const body = await client.clearTrash(); @@ -114,7 +108,7 @@ describe('# trash service tests', () => { describe('Delete trashed items', () => { it('should call with right params', async () => { const { client, headers } = clientAndHeaders(); - const callStub = sinon.stub(httpClient, 'delete').resolves(); + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue(undefined); const payload: DeleteItemsPermanentlyPayload = { items: [ { id: 36225, type: 'folder' }, @@ -125,7 +119,7 @@ describe('# trash service tests', () => { const body = await client.deleteItemsPermanently(payload); - expect(callStub.firstCall.args).toEqual(['/storage/trash', headers, payload]); + expect(callStub).toHaveBeenCalledWith('/storage/trash', headers, payload); expect(body).toBe(undefined); }); }); diff --git a/test/drive/users/index.test.ts b/test/drive/users/index.test.ts index 2490581..5b72a25 100644 --- a/test/drive/users/index.test.ts +++ b/test/drive/users/index.test.ts @@ -1,26 +1,20 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { Users } from '../../../src/drive'; -import { ChangePasswordPayloadNew } from '../../../src/drive/users/types'; +import { ChangePasswordPayloadNew, UserPublicKeyWithCreationResponse } from '../../../src/drive/users/types'; import { ApiSecurity, AppDetails } from '../../../src/shared'; import { headersWithToken } from '../../../src/shared/headers'; import { HttpClient } from '../../../src/shared/http/client'; -const httpClient = HttpClient.create(''); - describe('# users service tests', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('send invitation', () => { it('should call with right params & return response', async () => { // Arrange const { client, headers } = clientAndHeaders(); - const postStub = sinon.stub(httpClient, 'post').resolves({ + const postStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ sent: true, }); const email = 'my@email.com'; @@ -29,13 +23,13 @@ describe('# users service tests', () => { const body = await client.sendInvitation(email); // Assert - expect(postStub.firstCall.args).toEqual([ + expect(postStub).toHaveBeenCalledWith( '/user/invite', { email: email, }, headers, - ]); + ); expect(body).toEqual({ sent: true, }); @@ -46,7 +40,7 @@ describe('# users service tests', () => { it('should call with right params & return response', async () => { // Arrange const { client, headers } = clientAndHeaders(); - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ user: { root_folder: 1, }, @@ -58,14 +52,14 @@ describe('# users service tests', () => { const body = await client.initialize(email, mnemonic); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/initialize', { email: email, mnemonic: mnemonic, }, headers, - ]); + ); expect(body).toEqual({ root_folder: 1, }); @@ -76,7 +70,7 @@ describe('# users service tests', () => { it('should call with right params & return response', async () => { // Arrange const { client, headers } = clientAndHeaders(); - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ user: {}, token: 't', }); @@ -85,7 +79,7 @@ describe('# users service tests', () => { const body = await client.refreshUser(); // Assert - expect(callStub.firstCall.args).toEqual(['/users/refresh', headers]); + expect(callStub).toHaveBeenCalledWith('/users/refresh', headers); expect(body).toEqual({ user: {}, token: 't', @@ -98,7 +92,7 @@ describe('# users service tests', () => { // Arrange const { client, headers } = clientAndHeaders(); const mockedAvatarUrl = 'https://example.avatar.com/avatar.jpg'; - const callStub = sinon.stub(httpClient, 'get').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue({ avatar: mockedAvatarUrl, }); @@ -106,7 +100,7 @@ describe('# users service tests', () => { const body = await client.refreshAvatarUser(); // Assert - expect(callStub.firstCall.args).toStrictEqual(['/users/avatar/refresh', headers]); + expect(callStub).toHaveBeenCalledWith('/users/avatar/refresh', headers); expect(body).toStrictEqual({ avatar: mockedAvatarUrl, }); @@ -118,7 +112,7 @@ describe('# users service tests', () => { // Arrange const { client, headers } = clientAndHeaders(); const email = 'test@test.com'; - const callStub = sinon.stub(httpClient, 'post').resolves({ + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ publicKey: 'publicKey', keys: { kyber: 'publicKeyberKey', @@ -131,7 +125,7 @@ describe('# users service tests', () => { const body = await client.preRegister(email); // Assert - expect(callStub.firstCall.args).toEqual(['/users/pre-create', { email }, headers]); + expect(callStub).toHaveBeenCalledWith('/users/pre-create', { email }, headers); expect(body).toEqual({ publicKey: 'publicKey', keys: { @@ -147,7 +141,7 @@ describe('# users service tests', () => { it('should call with right params & return response', async () => { // Arrange const { client, headers } = clientAndHeaders(); - const callStub = sinon.stub(httpClient, 'patch').resolves({}); + const callStub = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue({}); const payload: ChangePasswordPayloadNew = { currentEncryptedPassword: '1', encryptedMnemonic: '2', @@ -165,7 +159,7 @@ describe('# users service tests', () => { const body = await client.changePassword(payload); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/users/password', { currentPassword: payload.currentEncryptedPassword, @@ -177,10 +171,28 @@ describe('# users service tests', () => { encryptVersion: payload.encryptVersion, }, headers, - ]); + ); expect(body).toEqual({}); }); }); + + describe('getPublicKeyWithPrecreation', () => { + it('should call the correct endpoint and return the public key response', async () => { + const email = 'test@example.com'; + const publicKeyResponse: UserPublicKeyWithCreationResponse = { + publicKey: 'public_key_example_123', + publicKyberKey: 'kyber_key_example_123', + }; + + const { client, headers } = clientAndHeaders(); + const putCall = vi.spyOn(HttpClient.prototype, 'put').mockResolvedValue(publicKeyResponse); + + const response = await client.getPublicKeyWithPrecreation({ email }); + + expect(putCall).toHaveBeenCalledWith(`/users/public-key/${email}`, {}, headers); + expect(response).toEqual(publicKeyResponse); + }); + }); }); function clientAndHeaders( diff --git a/test/misc/location/index.test.ts b/test/misc/location/index.test.ts index ca7235f..7561e3f 100644 --- a/test/misc/location/index.test.ts +++ b/test/misc/location/index.test.ts @@ -1,16 +1,10 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { Location, UserLocation } from '../../../src/misc/location'; import { HttpClient } from '../../../src/shared/http/client'; -const httpClient = HttpClient.create(''); - describe('Location service', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('Get user location', () => { @@ -20,7 +14,7 @@ describe('Location service', () => { ip: '1.1.1.1', location: 'ES', }; - sinon.stub(httpClient, 'get').resolves(mockLocation); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(mockLocation); const { client } = clientAndHeaders(); // Act diff --git a/test/network/download.test.ts b/test/network/download.test.ts index e5aff78..6e082e8 100644 --- a/test/network/download.test.ts +++ b/test/network/download.test.ts @@ -1,9 +1,10 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { randomBytes } from 'crypto'; import { ALGORITHMS, BinaryDataEncoding, Crypto, DownloadableShard, Network } from '../../src/network'; import { downloadFile, FileVersionOneError } from '../../src/network/download'; import { DownloadInvalidMnemonicError } from '../../src/network/errors'; +import { fail } from 'assert'; const fakeFileId = 'fake-file-id'; const fakeBucketId = 'fake-bucket-id'; @@ -32,11 +33,11 @@ const network = Network.client( }, ); -afterEach(() => { - sinon.restore(); -}); - describe('network/download', () => { + beforeEach(() => { + vi.restoreAllMocks(); + }); + describe('downloadFile()', () => { describe('Should work properly if all is fine', () => { it('Should work when the mnemonic is provided', async () => { @@ -63,9 +64,9 @@ describe('network/download', () => { ]; const fileSize = shards.reduce((a, s) => a + s.size, 0); - const validateMnemonicStub = sinon.stub(crypto, 'validateMnemonic').returns(true); - const generateFileKeyStub = sinon.stub(crypto, 'generateFileKey').resolves(key); - const getDownloadLinksStub = sinon.stub(network, 'getDownloadLinks').resolves({ + const validateMnemonicStub = vi.spyOn(crypto, 'validateMnemonic').mockReturnValue(true); + const generateFileKeyStub = vi.spyOn(crypto, 'generateFileKey').mockResolvedValue(key); + const getDownloadLinksStub = vi.spyOn(network, 'getDownloadLinks').mockResolvedValue({ index, shards, version: 2, @@ -74,9 +75,9 @@ describe('network/download', () => { size: fileSize, }); - const toBinaryDataMock = jest.fn().mockReturnValue(bufferizedIndex); - const downloadFileMock = jest.fn(); - const decryptFileMock = jest.fn(); + const toBinaryDataMock = vi.fn().mockReturnValue(bufferizedIndex); + const downloadFileMock = vi.fn(); + const decryptFileMock = vi.fn(); try { await downloadFile( @@ -90,18 +91,18 @@ describe('network/download', () => { decryptFileMock, ); - expect(validateMnemonicStub.calledOnce).toBeTruthy(); - expect(validateMnemonicStub.firstCall.args).toStrictEqual([mnemonic]); + expect(validateMnemonicStub).toHaveBeenCalledOnce(); + expect(validateMnemonicStub).toHaveBeenCalledWith(mnemonic); - expect(getDownloadLinksStub.calledOnce).toBeTruthy(); - expect(getDownloadLinksStub.firstCall.args).toStrictEqual([bucketId, fileId, undefined]); + expect(getDownloadLinksStub).toHaveBeenCalledOnce(); + expect(getDownloadLinksStub).toHaveBeenCalledWith(bucketId, fileId, undefined); expect(toBinaryDataMock).toHaveBeenCalledTimes(2); expect(toBinaryDataMock).toHaveBeenCalledWith(index, BinaryDataEncoding.HEX); expect(toBinaryDataMock).toHaveBeenCalledWith(index, BinaryDataEncoding.HEX); - expect(generateFileKeyStub.calledOnce).toBeTruthy(); - expect(generateFileKeyStub.firstCall.args).toStrictEqual([mnemonic, bucketId, bufferizedIndex]); + expect(generateFileKeyStub).toHaveBeenCalledOnce(); + expect(generateFileKeyStub).toHaveBeenCalledWith(mnemonic, bucketId, bufferizedIndex); expect(downloadFileMock).toHaveBeenCalledTimes(1); expect(downloadFileMock).toHaveBeenCalledWith(shards, fileSize); @@ -113,9 +114,8 @@ describe('network/download', () => { bufferizedIndex.slice(0, 16), fileSize, ); - } catch (err) { - console.log(err); - expect(true).toBeFalsy(); + } catch { + fail('Expected function to not throw an error, but it did.'); } }); @@ -144,9 +144,9 @@ describe('network/download', () => { ]; const fileSize = shards.reduce((a, s) => a + s.size, 0); - const validateMnemonicStub = sinon.stub(crypto, 'validateMnemonic').returns(true); - const generateFileKeyStub = sinon.stub(crypto, 'generateFileKey').resolves(key); - const getDownloadLinksStub = sinon.stub(network, 'getDownloadLinks').resolves({ + const validateMnemonicStub = vi.spyOn(crypto, 'validateMnemonic').mockReturnValue(true); + const generateFileKeyStub = vi.spyOn(crypto, 'generateFileKey').mockResolvedValue(key); + const getDownloadLinksStub = vi.spyOn(network, 'getDownloadLinks').mockResolvedValue({ index, shards, version: 2, @@ -155,9 +155,9 @@ describe('network/download', () => { size: fileSize, }); - const toBinaryDataMock = jest.fn().mockReturnValue(bufferizedIndex); - const downloadFileMock = jest.fn(); - const decryptFileMock = jest.fn(); + const toBinaryDataMock = vi.fn().mockReturnValue(bufferizedIndex); + const downloadFileMock = vi.fn(); + const decryptFileMock = vi.fn(); try { await downloadFile( @@ -172,17 +172,17 @@ describe('network/download', () => { { token }, ); - expect(validateMnemonicStub.callCount).toBe(0); + expect(validateMnemonicStub).not.toHaveBeenCalled(); - expect(getDownloadLinksStub.calledOnce).toBeTruthy(); - expect(getDownloadLinksStub.firstCall.args).toStrictEqual([bucketId, fileId, token]); + expect(getDownloadLinksStub).toHaveBeenCalledOnce(); + expect(getDownloadLinksStub).toHaveBeenCalledWith(bucketId, fileId, token); expect(toBinaryDataMock).toHaveBeenCalledTimes(2); expect(toBinaryDataMock).toHaveBeenCalledWith(index, BinaryDataEncoding.HEX); expect(toBinaryDataMock).toHaveBeenCalledWith(index, BinaryDataEncoding.HEX); - expect(generateFileKeyStub.calledOnce).toBeTruthy(); - expect(generateFileKeyStub.firstCall.args).toStrictEqual([mnemonic, bucketId, bufferizedIndex]); + expect(generateFileKeyStub).toHaveBeenCalledOnce(); + expect(generateFileKeyStub).toHaveBeenCalledWith(mnemonic, bucketId, bufferizedIndex); expect(downloadFileMock).toHaveBeenCalledTimes(1); expect(downloadFileMock).toHaveBeenCalledWith(shards, fileSize); @@ -194,14 +194,14 @@ describe('network/download', () => { bufferizedIndex.slice(0, 16), fileSize, ); - } catch (err) { - expect(true).toBeFalsy(); + } catch { + fail('Expected function to not throw an error, but it did.'); } }); }); it('Should throw if file version is missing', async () => { - sinon.stub(network, 'getDownloadLinks').resolves({ + vi.spyOn(network, 'getDownloadLinks').mockResolvedValue({ index: '', shards: [], bucket: '', @@ -209,7 +209,7 @@ describe('network/download', () => { size: 1000, }); try { - await downloadFile(fakeFileId, fakeBucketId, fakeMnemonic, network, crypto, jest.fn(), jest.fn(), jest.fn()); + await downloadFile(fakeFileId, fakeBucketId, fakeMnemonic, network, crypto, vi.fn(), vi.fn(), vi.fn()); expect(false).toBeTruthy(); } catch (err) { expect(err).toBeInstanceOf(FileVersionOneError); @@ -217,7 +217,7 @@ describe('network/download', () => { }); it('Should throw if file version is 1', async () => { - sinon.stub(network, 'getDownloadLinks').resolves({ + vi.spyOn(network, 'getDownloadLinks').mockResolvedValue({ index: '', shards: [], bucket: '', @@ -226,7 +226,7 @@ describe('network/download', () => { size: 1000, }); try { - await downloadFile(fakeFileId, fakeBucketId, fakeMnemonic, network, crypto, jest.fn(), jest.fn(), jest.fn()); + await downloadFile(fakeFileId, fakeBucketId, fakeMnemonic, network, crypto, vi.fn(), vi.fn(), vi.fn()); expect(false).toBeTruthy(); } catch (err) { expect(err).toBeInstanceOf(FileVersionOneError); @@ -234,19 +234,19 @@ describe('network/download', () => { }); it('Should throw if the mnemonic is invalid', async () => { - const validateMnemonicStub = sinon.stub(crypto, 'validateMnemonic').returns(false); - const downloadLinksStub = sinon.stub(network, 'getDownloadLinks'); + const validateMnemonicStub = vi.spyOn(crypto, 'validateMnemonic').mockReturnValue(false); + const downloadLinksStub = vi.spyOn(network, 'getDownloadLinks'); try { - await downloadFile(fakeFileId, fakeBucketId, fakeMnemonic, network, crypto, jest.fn(), jest.fn(), jest.fn()); + await downloadFile(fakeFileId, fakeBucketId, fakeMnemonic, network, crypto, vi.fn(), vi.fn(), vi.fn()); expect(false).toBeTruthy(); } catch (err) { expect(err).toBeInstanceOf(DownloadInvalidMnemonicError); - expect(validateMnemonicStub.calledOnce).toBeTruthy(); - expect(validateMnemonicStub.firstCall.args).toStrictEqual([fakeMnemonic]); + expect(validateMnemonicStub).toHaveBeenCalledOnce(); + expect(validateMnemonicStub).toHaveBeenCalledWith(fakeMnemonic); - expect(downloadLinksStub.callCount).toEqual(0); + expect(downloadLinksStub).not.toHaveBeenCalled(); } }); }); diff --git a/test/network/errors/context.test.ts b/test/network/errors/context.test.ts index 5b7a43f..654a215 100644 --- a/test/network/errors/context.test.ts +++ b/test/network/errors/context.test.ts @@ -1,19 +1,20 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { NetworkUploadContext, NetworkDownloadContext, getNetworkErrorContext, DownloadInvalidMnemonicError, - UploadInvalidMnemonicError + UploadInvalidMnemonicError, } from '../../../src/network/errors'; function getNetworkUploadContext(merge?: Partial): NetworkUploadContext { const defaultContext: NetworkUploadContext = { bucketId: '', crypto: { - mnemonic: 'mnemonic' + mnemonic: 'mnemonic', }, fileSize: 10, - user: 'user' + user: 'user', }; return { ...defaultContext, ...merge }; @@ -23,16 +24,20 @@ function getNetworkDownloadContext(merge?: Partial): Netwo const defaultContext: NetworkDownloadContext = { bucketId: '', crypto: { - mnemonic: 'mnemonic' + mnemonic: 'mnemonic', }, fileId: 'fileId', - user: 'user' + user: 'user', }; return { ...defaultContext, ...merge }; } describe('network/errors/context', () => { + beforeEach(() => { + vi.restoreAllMocks(); + }); + describe('Get download error context', () => { it('When the download error is not related to the mnemonic, the mnemonic is not included', async () => { const context = getNetworkDownloadContext(); diff --git a/test/network/network.test.ts b/test/network/network.test.ts index 9266519..535c9c4 100644 --- a/test/network/network.test.ts +++ b/test/network/network.test.ts @@ -1,4 +1,4 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { HttpClient } from '../../src/shared/http/client'; import { AppDetails } from '../../src/shared'; @@ -16,8 +16,7 @@ import { FinishUploadResponse, StartUploadResponse, } from '../../src/network/types'; - -const httpClient = HttpClient.create(''); +import { fail } from 'assert'; const validUUID = 'b541b138-a6f2-4729-8d20-8e6011cb8216'; const validHex = '2e1884c34f174110ca6e324e7b745754b3d6356b53ef9f594b960fd534050089'; @@ -32,11 +31,7 @@ const validSize = 1; describe('network ', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('startUpload()', () => { @@ -48,7 +43,7 @@ describe('network ', () => { await client.startUpload(idBucket, { uploads: [{ index: validIndex, size: invalidSize }], }); - expect(true).toBeFalsy(); + fail('Expected function to throw an error, but it did not.'); } catch (err) { expect(err).toBeInstanceOf(InvalidUploadSizeError); } @@ -62,7 +57,7 @@ describe('network ', () => { await client.startUpload(idBucket, { uploads: [{ index: invalidIndex, size: validSize }], }); - expect(true).toBeFalsy(); + fail('Expected function to throw an error, but it did not.'); } catch (err) { expect(err).toBeInstanceOf(InvalidUploadIndexError); } @@ -79,7 +74,7 @@ describe('network ', () => { { index: validIndex, size: validSize }, ], }); - expect(true).toBeFalsy(); + fail('Expected function to throw an error, but it did not.'); } catch (err) { expect(err).toBeInstanceOf(DuplicatedIndexesError); } @@ -102,7 +97,7 @@ describe('network ', () => { })), }; - sinon.stub(Network, 'startUpload').resolves(expected); + vi.spyOn(Network, 'startUpload').mockResolvedValue(expected); const received = await client.startUpload(idBucket, { uploads }); @@ -163,8 +158,8 @@ describe('network ', () => { const resolvesTo: StartUploadResponse = { uploads: [{ index: validIndex, uuid: validUUID, url: '', urls: null }], }; - const callStub = sinon.stub(httpClient, 'post').resolves(resolvesTo); - const staticStartUpload = jest.spyOn(Network.prototype as any, 'startUpload'); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(resolvesTo); + const staticStartUpload = vi.spyOn(Network.prototype, 'startUpload'); // Act const response = await client.startUpload(idBucket, validStartUploadPayload); @@ -172,11 +167,11 @@ describe('network ', () => { // Assert expect(response).toEqual(resolvesTo); expect(staticStartUpload).toHaveBeenCalled(); - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( `/v2/buckets/${idBucket}/files/start?multiparts=1`, validStartUploadPayload, headers, - ]); + ); }); it('should call static finishUpload with correct parameters', async () => { @@ -201,9 +196,9 @@ describe('network ', () => { created: new Date(), }; - const callStub = sinon.stub(httpClient, 'post').resolves(resolvesTo); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(resolvesTo); - const staticFinishUpload = jest.spyOn(Network.prototype as any, 'finishUpload'); + const staticFinishUpload = vi.spyOn(Network.prototype, 'finishUpload'); // Act const response = await client.finishUpload(idBucket, validFinishUploadPayload); @@ -211,11 +206,7 @@ describe('network ', () => { // Assert expect(response).toEqual(resolvesTo); expect(staticFinishUpload).toHaveBeenCalled(); - expect(callStub.firstCall.args).toEqual([ - `/v2/buckets/${idBucket}/files/finish`, - validFinishUploadPayload, - headers, - ]); + expect(callStub).toHaveBeenCalledWith(`/v2/buckets/${idBucket}/files/finish`, validFinishUploadPayload, headers); }); it('should call static getDownloadLinks with correct parameters', async () => { @@ -229,9 +220,9 @@ describe('network ', () => { created: new Date(), shards: [{ index: validHex, size: 33, hash: 'a-hash', url: 'a-url' }], }; - const callStub = sinon.stub(httpClient, 'get').resolves(resolvesTo); + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(resolvesTo); - const staticGetDownloadLinks = jest.spyOn(Network.prototype as any, 'getDownloadLinks'); + const staticGetDownloadLinks = vi.spyOn(Network.prototype, 'getDownloadLinks'); // Act const links = await client.getDownloadLinks(idBucket, file); @@ -239,10 +230,10 @@ describe('network ', () => { // Assert expect(links).toEqual(resolvesTo); expect(staticGetDownloadLinks).toHaveBeenCalled(); - expect(callStub.firstCall.args).toEqual([ - `/buckets/${idBucket}/files/${file}/info`, - { ...headers, 'x-api-version': '2' }, - ]); + expect(callStub).toHaveBeenCalledWith(`/buckets/${idBucket}/files/${file}/info`, { + ...headers, + 'x-api-version': '2', + }); }); it('should call static deleteFile with correct parameters', async () => { @@ -250,16 +241,16 @@ describe('network ', () => { const { client, headers } = clientAndHeadersWithBasicAuth(); const idBucket = 'id-bucket'; const file = 'a-file'; - const callStub = sinon.stub(httpClient, 'delete').resolves(); + const callStub = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue(undefined); - const staticGetDownloadLinks = jest.spyOn(Network.prototype as any, 'deleteFile'); + const staticGetDownloadLinks = vi.spyOn(Network.prototype, 'deleteFile'); // Act await client.deleteFile(idBucket, file); // Assert expect(staticGetDownloadLinks).toHaveBeenCalled(); - expect(callStub.firstCall.args).toEqual([`/v2/buckets/${idBucket}/files/${file}`, headers]); + expect(callStub).toHaveBeenCalledWith(`/v2/buckets/${idBucket}/files/${file}`, headers); }); }); }); diff --git a/test/network/upload.test.ts b/test/network/upload.test.ts index 28b604b..4f9368b 100644 --- a/test/network/upload.test.ts +++ b/test/network/upload.test.ts @@ -1,9 +1,10 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { randomBytes } from 'crypto'; import { ALGORITHMS, Network, Crypto } from '../../src/network'; import { uploadFile } from '../../src/network/upload'; import { UploadInvalidMnemonicError } from '../../src/network/errors'; +import { fail } from 'assert'; const fakeFileId = 'aaaaaa'; const fakeBucketId = 'fake-bucket-id'; @@ -31,11 +32,11 @@ const network = Network.client( }, ); -afterEach(() => { - sinon.restore(); -}); - describe('network/upload', () => { + beforeEach(() => { + vi.restoreAllMocks(); + }); + describe('uploadFile()', () => { it('Should work properly if all is fine', async () => { const fileId = fakeFileId; @@ -51,10 +52,10 @@ describe('network/upload', () => { const bufferizedIndex = Buffer.from(index, 'hex'); const key = Buffer.from(''); - const randomBytesStub = sinon.stub(crypto, 'randomBytes').returns(bufferizedIndex); - const generateFileKeyStub = sinon.stub(crypto, 'generateFileKey').resolves(key); - const validateMnemonicStub = sinon.stub(crypto, 'validateMnemonic').returns(true); - const startUploadStub = sinon.stub(network, 'startUpload').resolves({ + const randomBytesStub = vi.spyOn(crypto, 'randomBytes').mockReturnValue(bufferizedIndex); + const generateFileKeyStub = vi.spyOn(crypto, 'generateFileKey').mockResolvedValue(key); + const validateMnemonicStub = vi.spyOn(crypto, 'validateMnemonic').mockReturnValue(true); + const startUploadStub = vi.spyOn(network, 'startUpload').mockResolvedValue({ uploads: [ { url: fakeUrl, @@ -64,7 +65,7 @@ describe('network/upload', () => { }, ], }); - const finishUploadStub = sinon.stub(network, 'finishUpload').resolves({ + const finishUploadStub = vi.spyOn(network, 'finishUpload').mockResolvedValue({ bucket: '', created: new Date(), id: fileId, @@ -73,8 +74,8 @@ describe('network/upload', () => { name: fakeFilename, }); - const encryptFileMock = jest.fn(); - const uploadFileMock = jest.fn().mockReturnValue(fakeHash); + const encryptFileMock = vi.fn(); + const uploadFileMock = vi.fn().mockReturnValue(fakeHash); try { const receivedFileId = await uploadFile( @@ -87,27 +88,24 @@ describe('network/upload', () => { uploadFileMock, ); - expect(validateMnemonicStub.calledOnce).toBeTruthy(); - expect(validateMnemonicStub.firstCall.args).toStrictEqual([mnemonic]); + expect(validateMnemonicStub).toHaveBeenCalledOnce(); + expect(validateMnemonicStub).toHaveBeenCalledWith(mnemonic); - expect(randomBytesStub.calledOnce).toBeTruthy(); - expect(randomBytesStub.firstCall.args).toStrictEqual([ALGORITHMS.AES256CTR.ivSize]); + expect(randomBytesStub).toHaveBeenCalledOnce(); + expect(randomBytesStub).toHaveBeenCalledWith(ALGORITHMS.AES256CTR.ivSize); - expect(generateFileKeyStub.calledOnce).toBeTruthy(); - expect(generateFileKeyStub.firstCall.args).toStrictEqual([mnemonic, bucketId, bufferizedIndex]); + expect(generateFileKeyStub).toHaveBeenCalledOnce(); + expect(generateFileKeyStub).toHaveBeenCalledWith(mnemonic, bucketId, bufferizedIndex); - expect(startUploadStub.calledOnce).toBeTruthy(); - expect(startUploadStub.firstCall.args).toStrictEqual([ - bucketId, - { - uploads: [ - { - index: 0, - size: fileSize, - }, - ], - }, - ]); + expect(startUploadStub).toHaveBeenCalledOnce(); + expect(startUploadStub).toHaveBeenCalledWith(bucketId, { + uploads: [ + { + index: 0, + size: fileSize, + }, + ], + }); expect(encryptFileMock).toHaveBeenCalledTimes(1); expect(encryptFileMock).toHaveBeenCalledWith(ALGORITHMS.AES256CTR.type, key, bufferizedIndex.slice(0, 16)); @@ -115,23 +113,20 @@ describe('network/upload', () => { expect(uploadFileMock).toHaveBeenCalledTimes(1); expect(uploadFileMock).toHaveBeenCalledWith(fakeUrl); - expect(finishUploadStub.calledOnce).toBeTruthy(); - expect(finishUploadStub.firstCall.args).toStrictEqual([ - bucketId, - { - index, - shards: [ - { - hash: fakeHash, - uuid: fakeUuid, - }, - ], - }, - ]); + expect(finishUploadStub).toHaveBeenCalledOnce(); + expect(finishUploadStub).toHaveBeenCalledWith(bucketId, { + index, + shards: [ + { + hash: fakeHash, + uuid: fakeUuid, + }, + ], + }); expect(receivedFileId).toEqual(fileId); - } catch (err) { - expect(true).toBeFalsy(); + } catch { + fail('Expected function to not throw an error, but it did.'); } }); @@ -140,20 +135,20 @@ describe('network/upload', () => { const mnemonic = fakeMnemonic; const fileSize = 1000; - const validateMnemonic = sinon.stub(crypto, 'validateMnemonic').returns(false); - const randomBytes = sinon.stub(crypto, 'randomBytes').returns(Buffer.from('')); + const validateMnemonic = vi.spyOn(crypto, 'validateMnemonic').mockReturnValue(false); + const randomBytes = vi.spyOn(crypto, 'randomBytes').mockReturnValue(Buffer.from('')); try { - await uploadFile(network, crypto, bucketId, mnemonic, fileSize, jest.fn(), jest.fn()); + await uploadFile(network, crypto, bucketId, mnemonic, fileSize, vi.fn(), vi.fn()); - expect(true).toBeFalsy(); + fail('Expected function to throw an error, but it did not.'); } catch (err) { expect(err).toBeInstanceOf(UploadInvalidMnemonicError); - expect(validateMnemonic.calledOnce).toBeTruthy(); - expect(validateMnemonic.firstCall.args).toStrictEqual([mnemonic]); + expect(validateMnemonic).toHaveBeenCalledOnce(); + expect(validateMnemonic).toHaveBeenCalledWith(mnemonic); - expect(randomBytes.callCount).toEqual(0); + expect(randomBytes).not.toHaveBeenCalled(); } }); }); diff --git a/test/payments/checkout.test.ts b/test/payments/checkout.test.ts index 26e5d1d..d68d56e 100644 --- a/test/payments/checkout.test.ts +++ b/test/payments/checkout.test.ts @@ -1,20 +1,13 @@ -import sinon from 'sinon'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { HttpClient } from '../../src/shared/http/client'; import { Checkout } from '../../src/payments'; import { ApiSecurity, AppDetails } from '../../src/shared'; import { basicHeaders, headersWithToken } from '../../src/shared/headers'; import { CreateCustomerPayload, CreatePaymentIntentPayload, CryptoCurrency } from '../../src/payments/types'; -const httpClient = HttpClient.create(''); - describe('Checkout service tests', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - jest.resetAllMocks(); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('Create customer ID', () => { @@ -34,7 +27,7 @@ describe('Checkout service tests', () => { token: 'valid_token', }; - const callStub = sinon.stub(httpClient, 'post').resolves([mockedResponse]); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue([mockedResponse]); const { client, headers } = clientAndHeadersWithAuthToken({}); @@ -42,7 +35,7 @@ describe('Checkout service tests', () => { const body = await client.createCustomer(userPayload); // Assert - expect(callStub.firstCall.args).toEqual(['/checkout/customer', userPayload, headers]); + expect(callStub).toHaveBeenCalledWith('/checkout/customer', userPayload, headers); expect(body).toStrictEqual([mockedResponse]); }); }); @@ -66,7 +59,7 @@ describe('Checkout service tests', () => { invoiceStatus: 'paid', }; - const callStub = sinon.stub(httpClient, 'post').resolves([mockedResponse]); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue([mockedResponse]); const { client, headers } = clientAndHeadersWithAuthToken({}); @@ -74,7 +67,7 @@ describe('Checkout service tests', () => { const body = await client.createPaymentIntent(userPayload); // Assert - expect(callStub.firstCall.args).toEqual(['/checkout/payment-intent', userPayload, headers]); + expect(callStub).toHaveBeenCalledWith('/checkout/payment-intent', userPayload, headers); expect(body).toStrictEqual([mockedResponse]); }); }); @@ -95,7 +88,7 @@ describe('Checkout service tests', () => { receiveType: true, type: 'crypto', }; - const callStub = sinon.stub(httpClient, 'get').resolves([mockedCryptoCurrency]); + const callStub = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue([mockedCryptoCurrency]); const { client, headers } = clientAndHeadersWithToken({}); @@ -103,7 +96,7 @@ describe('Checkout service tests', () => { const body = await client.getAvailableCryptoCurrencies(); // Assert - expect(callStub.firstCall.args).toEqual(['/checkout/crypto/currencies', headers]); + expect(callStub).toHaveBeenCalledWith('/checkout/crypto/currencies', headers); expect(body).toStrictEqual([mockedCryptoCurrency]); }); }); @@ -112,7 +105,7 @@ describe('Checkout service tests', () => { it('should call with right params & return data', async () => { // Arrange const mockedInvoiceId = 'encoded-invoice-id'; - const callStub = sinon.stub(httpClient, 'post').resolves(true); + const callStub = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(true); const { client, headers } = clientAndHeadersWithAuthToken({}); @@ -120,7 +113,7 @@ describe('Checkout service tests', () => { const body = await client.verifyCryptoPayment(mockedInvoiceId); // Assert - expect(callStub.firstCall.args).toEqual(['/checkout/crypto/verify/payment', { token: mockedInvoiceId }, headers]); + expect(callStub).toHaveBeenCalledWith('/checkout/crypto/verify/payment', { token: mockedInvoiceId }, headers); expect(body).toStrictEqual(true); }); }); diff --git a/test/shared/http/client.test.ts b/test/shared/http/client.test.ts index 0f7a4be..3c6c082 100644 --- a/test/shared/http/client.test.ts +++ b/test/shared/http/client.test.ts @@ -1,26 +1,26 @@ -import sinon from 'sinon'; -import axios, { Axios, AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import axios, { AxiosInstance, AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; import { HttpClient } from '../../../src/shared/http/client'; +import { UnauthorizedCallback } from '../../../src/shared/http/types'; +import { fail } from 'assert'; describe('HttpClient', () => { - afterEach(() => { - sinon.restore(); + beforeEach(() => { + vi.restoreAllMocks(); }); describe('construction', () => { it('should set the a given base URL', () => { // Arrange - const createSpy = sinon.spy(axios, 'create'); + const createSpy = vi.spyOn(axios, 'create'); // Act HttpClient.create('my-url'); // Assert - expect( - createSpy.calledOnceWith({ - baseURL: 'my-url', - }), - ).toBeTruthy(); + expect(createSpy).toHaveBeenCalledWith({ + baseURL: 'my-url', + }); }); }); @@ -29,7 +29,7 @@ describe('HttpClient', () => { const myAxios = axios.create(); beforeEach(() => { - sinon.stub(axios, 'create').returns(myAxios); + vi.spyOn(axios, 'create').mockReturnValue(myAxios); }); it('should return only the data inside the response', () => { @@ -46,7 +46,7 @@ describe('HttpClient', () => { const fulfilled = myAxios.interceptors.response.handlers[0].fulfilled; // Act - const result = fulfilled(responseFake); + const result = fulfilled(responseFake as AxiosResponse); // Assert expect(result).toEqual({ @@ -98,14 +98,10 @@ describe('HttpClient', () => { }); describe('interceptor with callback', () => { - const myAxios = axios.create(); - - beforeEach(() => { - sinon.stub(axios, 'create').returns(myAxios); - }); - it('should return unauthorized and execute callback if unauthorized callback is present', () => { - // Arrange + const myAxios = axios.create(); + vi.spyOn(axios, 'create').mockReturnValue(myAxios); + const error = getAxiosError(); error.response = { data: { @@ -113,34 +109,17 @@ describe('HttpClient', () => { }, status: 401, }; - const unauthorizedSpy = sinon.spy(); - HttpClient.create('', unauthorizedSpy); + const unauthorizedSpy = vi.fn(); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - const rejected = myAxios.interceptors.response.handlers[0].rejected; - - try { - // Act - rejected(error); - } catch (e) { - // Assert - expect(e).toEqual(new Error('not authorized')); - expect(unauthorizedSpy.calledOnce).toBeTruthy(); - } + assertMessageOnOutputError(myAxios, error, 'not authorized', unauthorizedSpy); + expect(unauthorizedSpy).toHaveBeenCalledOnce(); }); }); describe('calls', () => { - const myAxios = axios.create(); - - beforeEach(() => { - sinon.stub(axios, 'create').returns(myAxios); - }); - it('should execute GET request with correct parameters', async () => { // Arrange - const callStub = sinon.stub(myAxios, 'get').resolves({}); + const callStub = vi.spyOn(axios.Axios.prototype, 'get').mockResolvedValue({}); const client = HttpClient.create(''); // Act @@ -149,14 +128,11 @@ describe('HttpClient', () => { }); // Assert - expect(callStub.firstCall.args).toEqual([ - '/some-path?with=arguments', - { - headers: { - some: 'header', - }, + expect(callStub).toHaveBeenCalledWith('/some-path?with=arguments', { + headers: { + some: 'header', }, - ]); + }); }); it('should be able to cancel a GET request', async () => { @@ -173,7 +149,7 @@ describe('HttpClient', () => { it('should be able to complete a cancellable GET request', async () => { // Arrange - sinon.stub(myAxios, 'get').resolves({ + vi.spyOn(axios.Axios.prototype, 'get').mockResolvedValue({ some: true, }); const client = HttpClient.create(''); @@ -189,7 +165,7 @@ describe('HttpClient', () => { it('should execute POST request with correct parameters', async () => { // Arrange - const callStub = sinon.stub(myAxios, 'post').resolves({}); + const callStub = vi.spyOn(axios.Axios.prototype, 'post').mockResolvedValue({}); const client = HttpClient.create(''); // Act @@ -205,7 +181,7 @@ describe('HttpClient', () => { ); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/some-path', { something: 'here', @@ -216,7 +192,7 @@ describe('HttpClient', () => { some: 'header', }, }, - ]); + ); }); it('should be able to cancel a POST request', async () => { @@ -233,7 +209,7 @@ describe('HttpClient', () => { it('should be able to complete a cancellable a POST request', async () => { // Arrange - sinon.stub(myAxios, 'post').resolves({ + vi.spyOn(axios.Axios.prototype, 'post').mockResolvedValue({ some: true, }); const client = HttpClient.create(''); @@ -249,7 +225,7 @@ describe('HttpClient', () => { it('should execute PUT request with correct parameters', async () => { // Arrange - const callStub = sinon.stub(myAxios, 'put').resolves({}); + const callStub = vi.spyOn(axios.Axios.prototype, 'put').mockResolvedValue({}); const client = HttpClient.create(''); // Act @@ -265,7 +241,7 @@ describe('HttpClient', () => { ); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/some-path', { something: 'here', @@ -276,12 +252,12 @@ describe('HttpClient', () => { some: 'header', }, }, - ]); + ); }); it('should execute PATCH request with correct parameters', async () => { // Arrange - const callStub = sinon.stub(myAxios, 'patch').resolves({}); + const callStub = vi.spyOn(axios.Axios.prototype, 'patch').mockResolvedValue({}); const client = HttpClient.create(''); // Act @@ -297,7 +273,7 @@ describe('HttpClient', () => { ); // Assert - expect(callStub.firstCall.args).toEqual([ + expect(callStub).toHaveBeenCalledWith( '/some-path', { something: 'here', @@ -308,12 +284,12 @@ describe('HttpClient', () => { some: 'header', }, }, - ]); + ); }); it('should execute DELETE request with correct parameters', async () => { // Arrange - const callStub = sinon.stub(myAxios, 'delete').resolves({}); + const callStub = vi.spyOn(axios.Axios.prototype, 'delete').mockResolvedValue({}); const client = HttpClient.create(''); // Act @@ -329,18 +305,15 @@ describe('HttpClient', () => { ); // Assert - expect(callStub.firstCall.args).toEqual([ - '/some-path', - { - data: { - something: 'here', - else: 'there', - }, - headers: { - some: 'header', - }, + expect(callStub).toHaveBeenCalledWith('/some-path', { + data: { + something: 'here', + else: 'there', + }, + headers: { + some: 'header', }, - ]); + }); }); }); }); @@ -361,9 +334,14 @@ function getAxiosError(): AxiosError { }; } -function assertMessageOnOutputError(axios: Axios, error: AxiosError, message: string) { +function assertMessageOnOutputError( + axios: AxiosInstance, + error: AxiosError, + message: string, + unauthorizedCallback?: UnauthorizedCallback, +) { // Arrange - HttpClient.create(''); + HttpClient.create('', unauthorizedCallback); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore @@ -371,6 +349,7 @@ function assertMessageOnOutputError(axios: Axios, error: AxiosError, message: st // Act & Assert expect(() => { - rejected(error); + rejected?.(error); + fail('Expected function to throw an error, but it did not.'); }).toThrow(message); } diff --git a/src/workspaces/index.test.ts b/test/workspaces/index.test.ts similarity index 82% rename from src/workspaces/index.test.ts rename to test/workspaces/index.test.ts index 6304b69..870a5e3 100644 --- a/src/workspaces/index.test.ts +++ b/test/workspaces/index.test.ts @@ -1,6 +1,6 @@ -import sinon from 'sinon'; -import { headersWithToken } from '../shared/headers'; -import { HttpClient } from '../shared/http/client'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { headersWithToken } from '../../src/shared/headers'; +import { HttpClient } from '../../src/shared/http/client'; import { GetMemberDetailsResponse, PendingInvitesResponse, @@ -9,17 +9,11 @@ import { WorkspaceTeamResponse, Workspaces, WorkspacesResponse, -} from './index'; - -const httpClient = HttpClient.create(''); +} from '../../src/workspaces/index'; describe('Workspaces service tests', () => { beforeEach(() => { - sinon.stub(HttpClient, 'create').returns(httpClient); - }); - - afterEach(() => { - sinon.restore(); + vi.restoreAllMocks(); }); describe('Workspaces methods', () => { @@ -147,7 +141,7 @@ describe('Workspaces service tests', () => { describe('getWorkspaces', () => { it('should return the expected workspaces when getWorkspaces is called', async () => { const { client } = clientAndHeaders(); - sinon.stub(httpClient, 'get').resolves(workspacesResponse); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(workspacesResponse); const response = await client.getWorkspaces(); @@ -158,7 +152,7 @@ describe('Workspaces service tests', () => { describe('getPendingWorkspaces', () => { it('should return the pending workspaces when getPendingWorkspaces is called', async () => { const { client } = clientAndHeaders(); - sinon.stub(httpClient, 'get').resolves(workspacesResponse); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(workspacesResponse); const response = await client.getPendingWorkspaces(); @@ -180,15 +174,15 @@ describe('Workspaces service tests', () => { }; const { client, headers } = clientAndHeaders(); - const patchCall = sinon.stub(httpClient, 'patch').resolves(); + const patchCall = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue(undefined); await client.setupWorkspace(workspaceSetupInfo); - expect(patchCall.firstCall.args).toEqual([ + expect(patchCall).toHaveBeenCalledWith( `workspaces/${workspaceSetupInfo.workspaceId}/setup`, workspaceData, headers, - ]); + ); }); }); @@ -203,11 +197,11 @@ describe('Workspaces service tests', () => { spaceUsed: 1024 * 1024 * 1024 * 1, }; - const getCall = sinon.stub(httpClient, 'get').resolves(usageResponse); + const getCall = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(usageResponse); const response = await client.getWorkspaceUsage(workspaceId); - expect(getCall.firstCall.args).toEqual([`workspaces/${workspaceId}/usage`, headers]); + expect(getCall).toHaveBeenCalledWith(`workspaces/${workspaceId}/usage`, headers); expect(response).toEqual(usageResponse); }); }); @@ -252,7 +246,7 @@ describe('Workspaces service tests', () => { ]; const { client } = clientAndHeaders(); - sinon.stub(httpClient, 'get').resolves(workspaceTeamsResponse); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(workspaceTeamsResponse); const response = await client.getWorkspacesTeams(workspaceId); @@ -268,10 +262,10 @@ describe('Workspaces service tests', () => { ...teamData, }; const { client, headers } = clientAndHeaders(); - const postCall = sinon.stub(httpClient, 'post').resolves({ status: 200 }); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ status: 200 }); const response = await client.createTeam(createTeamData); - expect(postCall.firstCall.args).toEqual(['workspaces/123sdf/teams', teamData, headers]); + expect(postCall).toHaveBeenCalledWith('workspaces/123sdf/teams', teamData, headers); expect(response).toEqual({ status: 200 }); }); }); @@ -282,11 +276,11 @@ describe('Workspaces service tests', () => { const newName = 'New Team Name'; const { client, headers } = clientAndHeaders(); - const patchCall = sinon.stub(httpClient, 'patch').resolves(); + const patchCall = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue(undefined); await client.editTeam({ teamId, name: newName }); - expect(patchCall.firstCall.args).toEqual([`workspaces/teams/${teamId}`, { name: newName }, headers]); + expect(patchCall).toHaveBeenCalledWith(`workspaces/teams/${teamId}`, { name: newName }, headers); }); }); @@ -295,11 +289,11 @@ describe('Workspaces service tests', () => { const workspaceId = 'workspaceId'; const teamId = 'teamId'; const { client, headers } = clientAndHeaders(); - const deleteCall = sinon.stub(httpClient, 'delete').resolves(); + const deleteCall = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue(undefined); await client.deleteTeam({ workspaceId, teamId }); - expect(deleteCall.firstCall.args).toEqual([`workspaces/${workspaceId}/teams/${teamId}`, headers]); + expect(deleteCall).toHaveBeenCalledWith(`workspaces/${workspaceId}/teams/${teamId}`, headers); }); }); @@ -307,11 +301,11 @@ describe('Workspaces service tests', () => { it('should return the members of a team when getWorkspacesTeamMembers is called', async () => { const teamId = 'teamId'; const { client, headers } = clientAndHeaders(); - const getCall = sinon.stub(httpClient, 'get').resolves(); + const getCall = vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(undefined); await client.getWorkspacesTeamMembers(teamId); - expect(getCall.firstCall.args).toEqual([`workspaces/teams/${teamId}/members`, headers]); + expect(getCall).toHaveBeenCalledWith(`workspaces/teams/${teamId}/members`, headers); }); }); @@ -320,11 +314,11 @@ describe('Workspaces service tests', () => { const teamId = 'teamId'; const userUuid = 'userUuid'; const { client, headers } = clientAndHeaders(); - const postCall = sinon.stub(httpClient, 'post').resolves(); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(undefined); await client.addTeamUser(teamId, userUuid); - expect(postCall.firstCall.args).toEqual([`/workspaces/teams/${teamId}/user/${userUuid}`, {}, headers]); + expect(postCall).toHaveBeenCalledWith(`/workspaces/teams/${teamId}/user/${userUuid}`, {}, headers); }); }); @@ -333,11 +327,11 @@ describe('Workspaces service tests', () => { const teamId = 'teamId'; const userUuid = 'userUuid'; const { client, headers } = clientAndHeaders(); - const deleteCall = sinon.stub(httpClient, 'delete').resolves(); + const deleteCall = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue(undefined); await client.removeTeamUser(teamId, userUuid); - expect(deleteCall.firstCall.args).toEqual([`/workspaces/teams/${teamId}/user/${userUuid}`, headers]); + expect(deleteCall).toHaveBeenCalledWith(`/workspaces/teams/${teamId}/user/${userUuid}`, headers); }); }); @@ -347,15 +341,15 @@ describe('Workspaces service tests', () => { const teamId = 'teamId'; const userUuid = 'userUuid'; const { client, headers } = clientAndHeaders(); - const patchCall = sinon.stub(httpClient, 'patch').resolves(); + const patchCall = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue(undefined); await client.changeTeamManager(workspaceId, teamId, userUuid); - expect(patchCall.firstCall.args).toEqual([ + expect(patchCall).toHaveBeenCalledWith( `/workspaces/${workspaceId}/teams/${teamId}/manager`, { managerId: userUuid }, headers, - ]); + ); }); }); @@ -365,15 +359,15 @@ describe('Workspaces service tests', () => { const memberId = 'memberId'; const role = 'newRole'; const { client, headers } = clientAndHeaders(); - const patchCall = sinon.stub(httpClient, 'patch').resolves(); + const patchCall = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue(undefined); await client.changeUserRole(teamId, memberId, role); - expect(patchCall.firstCall.args).toEqual([ + expect(patchCall).toHaveBeenCalledWith( `/api/workspaces/teams/${teamId}/members/${memberId}/role`, { role }, headers, - ]); + ); }); }); @@ -385,7 +379,7 @@ describe('Workspaces service tests', () => { const encryptedMnemonicInBase64 = 'encryptedMnemonic'; const encryptionAlgorithm = 'aes-256-gcm'; const { client, headers } = clientAndHeaders(); - const postCall = sinon.stub(httpClient, 'post').resolves(); + const postCall = vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(undefined); const message = 'Test message'; await client.inviteMemberToWorkspace({ @@ -397,7 +391,7 @@ describe('Workspaces service tests', () => { message, }); - expect(postCall.firstCall.args).toEqual([ + expect(postCall).toHaveBeenCalledWith( `workspaces/${workspaceId}/members/invite`, { invitedUser: invitedUserEmail, @@ -407,7 +401,7 @@ describe('Workspaces service tests', () => { message: message, }, headers, - ]); + ); }); }); @@ -432,15 +426,15 @@ describe('Workspaces service tests', () => { }, }; - const patchCall = sinon.stub(httpClient, 'patch').resolves(workspaceUserResponse); + const patchCall = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue(workspaceUserResponse); const response = await client.modifyMemberUsage(workspaceId, memberId, spaceLimitBytes); - expect(patchCall.firstCall.args).toEqual([ + expect(patchCall).toHaveBeenCalledWith( `workspaces/${workspaceId}/members/${memberId}/usage`, { spaceLimit: spaceLimitBytes }, headers, - ]); + ); expect(response).toEqual(workspaceUserResponse); }); }); @@ -475,7 +469,7 @@ describe('Workspaces service tests', () => { }, }, ]; - sinon.stub(httpClient, 'get').resolves(pendingInvitesResponse); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(pendingInvitesResponse); const response = await client.getPendingInvites(); @@ -488,7 +482,7 @@ describe('Workspaces service tests', () => { const { client } = clientAndHeaders(); const inviteId = 'inviteId'; - sinon.stub(httpClient, 'get').resolves(inviteId); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(inviteId); const response = await client.validateWorkspaceInvite(inviteId); @@ -500,11 +494,11 @@ describe('Workspaces service tests', () => { it('should delete the workspace avatar successfully', async () => { const workspaceId = 'workspaceId'; const { client, headers } = clientAndHeaders(); - const deleteCall = sinon.stub(httpClient, 'delete').resolves(); + const deleteCall = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue(undefined); await client.deleteWorkspaceAvatar(workspaceId); - expect(deleteCall.firstCall.args).toEqual([`workspaces/${workspaceId}/avatar`, headers]); + expect(deleteCall).toHaveBeenCalledWith(`workspaces/${workspaceId}/avatar`, headers); }); }); @@ -524,7 +518,7 @@ describe('Workspaces service tests', () => { tokenHeader: 'tokenHeader', }; - sinon.stub(httpClient, 'get').resolves(getWorkspaceCredentialsResponse); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(getWorkspaceCredentialsResponse); const response = await client.getWorkspaceCredentials(workspaceId); @@ -542,7 +536,7 @@ describe('Workspaces service tests', () => { folders: [], }; - sinon.stub(httpClient, 'get').resolves(getPersonalTrashResponse); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(getPersonalTrashResponse); const response = await client.getPersonalTrash(workspaceId, 'file'); @@ -554,11 +548,11 @@ describe('Workspaces service tests', () => { it('should empty the personal trash successfully', async () => { const { client, headers } = clientAndHeaders(); const workspaceId = 'workspaceId'; - const deleteCall = sinon.stub(httpClient, 'delete').resolves(); + const deleteCall = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue(undefined); await client.emptyPersonalTrash(workspaceId); - expect(deleteCall.firstCall.args).toEqual([`/workspaces/${workspaceId}/trash`, headers]); + expect(deleteCall).toHaveBeenCalledWith(`/workspaces/${workspaceId}/trash`, headers); }); }); @@ -571,7 +565,7 @@ describe('Workspaces service tests', () => { description: 'Workspace Description', address: 'Workspace Address', }; - const patchCall = sinon.stub(httpClient, 'patch').resolves(); + const patchCall = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue(undefined); await client.editWorkspace(workspaceId, { description: workspaceData.description, @@ -579,7 +573,7 @@ describe('Workspaces service tests', () => { address: workspaceData.address, }); - expect(patchCall.firstCall.args).toEqual([`workspaces/${workspaceId}`, workspaceData, headers]); + expect(patchCall).toHaveBeenCalledWith(`workspaces/${workspaceId}`, workspaceData, headers); }); }); @@ -587,11 +581,11 @@ describe('Workspaces service tests', () => { it('should leave the workspace successfully', async () => { const { client, headers } = clientAndHeaders(); const workspaceId = 'workspaceId'; - const deleteCall = sinon.stub(httpClient, 'delete').resolves(); + const deleteCall = vi.spyOn(HttpClient.prototype, 'delete').mockResolvedValue(undefined); await client.leaveWorkspace(workspaceId); - expect(deleteCall.firstCall.args).toEqual([`workspaces/${workspaceId}/members/leave`, headers]); + expect(deleteCall).toHaveBeenCalledWith(`workspaces/${workspaceId}/members/leave`, headers); }); }); @@ -627,7 +621,7 @@ describe('Workspaces service tests', () => { ], }; - sinon.stub(httpClient, 'get').resolves(getMemberDetailsResponse); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(getMemberDetailsResponse); const response = await client.getMemberDetails('workspaceId', memberId); @@ -640,15 +634,11 @@ describe('Workspaces service tests', () => { const { client, headers } = clientAndHeaders(); const workspaceId = 'workspaceId'; const memberId = 'memberId'; - const patchCall = sinon.stub(httpClient, 'patch').resolves(); + const patchCall = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue(undefined); await client.deactivateMember(workspaceId, memberId); - expect(patchCall.firstCall.args).toEqual([ - `workspaces/${workspaceId}/members/${memberId}/deactivate`, - {}, - headers, - ]); + expect(patchCall).toHaveBeenCalledWith(`workspaces/${workspaceId}/members/${memberId}/deactivate`, {}, headers); }); }); @@ -657,15 +647,11 @@ describe('Workspaces service tests', () => { const { client, headers } = clientAndHeaders(); const workspaceId = 'workspaceId'; const memberId = 'memberId'; - const patchCall = sinon.stub(httpClient, 'patch').resolves(); + const patchCall = vi.spyOn(HttpClient.prototype, 'patch').mockResolvedValue(undefined); await client.activateMember(workspaceId, memberId); - expect(patchCall.firstCall.args).toEqual([ - `workspaces/${workspaceId}/members/${memberId}/activate`, - {}, - headers, - ]); + expect(patchCall).toHaveBeenCalledWith(`workspaces/${workspaceId}/members/${memberId}/activate`, {}, headers); }); }); @@ -688,7 +674,7 @@ describe('Workspaces service tests', () => { const { client } = clientAndHeaders(); const workspaceId = 'workspaceId'; - sinon.stub(httpClient, 'get').resolves(workspace); + vi.spyOn(HttpClient.prototype, 'get').mockResolvedValue(workspace); const response = await client.getWorkspace(workspaceId); diff --git a/tsconfig.json b/tsconfig.json index c379cd8..ad12bef 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -69,4 +69,4 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ }, "include": ["src"] -} +} \ No newline at end of file diff --git a/vitest.config.mjs b/vitest.config.mjs new file mode 100644 index 0000000..4ea27fa --- /dev/null +++ b/vitest.config.mjs @@ -0,0 +1,19 @@ +import { coverageConfigDefaults, defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + include: ['test/**/*.test.ts'], + coverage: { + provider: 'istanbul', + reporter: ['text', 'lcov'], + exclude: [ + 'test/', + 'dist/', + '**/*types.ts', + ...coverageConfigDefaults.exclude + ], + } + } +}); diff --git a/yarn.lock b/yarn.lock index a013bf8..97c142e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,356 +2,286 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.0.0": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== +"@babel/code-frame@^7.26.2", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/code-frame@^7.26.2", "@babel/code-frame@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== - dependencies: - "@babel/helper-validator-identifier" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.27.2": - version "7.27.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.5.tgz#7d0658ec1a8420fc866d1df1b03bea0e79934c82" - integrity sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg== - -"@babel/core@^7.23.9", "@babel/core@^7.27.4": - version "7.27.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.4.tgz#cc1fc55d0ce140a1828d1dd2a2eba285adbfb3ce" - integrity sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.3" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.27.3" - "@babel/helpers" "^7.27.4" - "@babel/parser" "^7.27.4" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.27.4" - "@babel/types" "^7.27.3" +"@babel/compat-data@^7.28.6": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" + integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== + +"@babel/core@^7.23.9": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" + integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-module-transforms" "^7.28.6" + "@babel/helpers" "^7.28.6" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/remapping" "^2.3.5" 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.27.3", "@babel/generator@^7.27.5": - version "7.27.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.5.tgz#3eb01866b345ba261b04911020cbe22dd4be8c8c" - integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== +"@babel/generator@^7.29.0": + version "7.29.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== dependencies: - "@babel/parser" "^7.27.5" - "@babel/types" "^7.27.3" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== +"@babel/helper-compilation-targets@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" + integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== dependencies: - "@babel/compat-data" "^7.27.2" + "@babel/compat-data" "^7.28.6" "@babel/helper-validator-option" "^7.27.1" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-module-imports@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" - integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== -"@babel/helper-module-transforms@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" - integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== +"@babel/helper-module-imports@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" + integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.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.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" - integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== - -"@babel/helper-plugin-utils@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" - integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + "@babel/traverse" "^7.28.6" + "@babel/types" "^7.28.6" -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== +"@babel/helper-module-transforms@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" + integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== + dependencies: + "@babel/helper-module-imports" "^7.28.6" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.28.6" "@babel/helper-string-parser@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== "@babel/helper-validator-option@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== -"@babel/helpers@^7.27.4": - version "7.27.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.6.tgz#6456fed15b2cb669d2d1fabe84b66b34991d812c" - integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== - dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.27.6" - -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== - dependencies: - "@babel/types" "^7.26.0" - -"@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.27.4", "@babel/parser@^7.27.5": - version "7.27.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.5.tgz#ed22f871f110aa285a6fd934a0efed621d118826" - integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg== - dependencies: - "@babel/types" "^7.27.3" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - 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.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - 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.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - 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.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" - 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.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - 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.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" - integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - 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.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - 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.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - 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.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - 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.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - 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.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - 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.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - 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.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" - integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/template@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" - -"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.27.4": - version "7.27.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.4.tgz#b0045ac7023c8472c3d35effd7cc9ebd638da6ea" - integrity sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.3" - "@babel/parser" "^7.27.4" - "@babel/template" "^7.27.2" - "@babel/types" "^7.27.3" +"@babel/helpers@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.6.tgz#fca903a313ae675617936e8998b814c415cbf5d7" + integrity sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw== + dependencies: + "@babel/template" "^7.28.6" + "@babel/types" "^7.28.6" + +"@babel/parser@^7.23.9", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" + integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== + dependencies: + "@babel/types" "^7.29.0" + +"@babel/template@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== + dependencies: + "@babel/code-frame" "^7.28.6" + "@babel/parser" "^7.28.6" + "@babel/types" "^7.28.6" + +"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" debug "^4.3.1" - globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6": - version "7.27.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.6.tgz#a434ca7add514d4e646c80f7375c0aa2befc5535" - integrity sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q== +"@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== dependencies: "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@emnapi/core@^1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.3.tgz#9ac52d2d5aea958f67e52c40a065f51de59b77d6" - integrity sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g== - dependencies: - "@emnapi/wasi-threads" "1.0.2" - tslib "^2.4.0" - -"@emnapi/runtime@^1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.3.tgz#c0564665c80dc81c448adac23f9dfbed6c838f7d" - integrity sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ== - dependencies: - tslib "^2.4.0" - -"@emnapi/wasi-threads@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz#977f44f844eac7d6c138a415a123818c655f874c" - integrity sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA== - dependencies: - tslib "^2.4.0" - -"@eslint-community/eslint-utils@^4.7.0": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" - integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== + "@babel/helper-validator-identifier" "^7.28.5" + +"@esbuild/aix-ppc64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz#815b39267f9bffd3407ea6c376ac32946e24f8d2" + integrity sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg== + +"@esbuild/android-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz#19b882408829ad8e12b10aff2840711b2da361e8" + integrity sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg== + +"@esbuild/android-arm@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz#90be58de27915efa27b767fcbdb37a4470627d7b" + integrity sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA== + +"@esbuild/android-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz#d7dcc976f16e01a9aaa2f9b938fbec7389f895ac" + integrity sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ== + +"@esbuild/darwin-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz#9f6cac72b3a8532298a6a4493ed639a8988e8abd" + integrity sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg== + +"@esbuild/darwin-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz#ac61d645faa37fd650340f1866b0812e1fb14d6a" + integrity sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg== + +"@esbuild/freebsd-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz#b8625689d73cf1830fe58c39051acdc12474ea1b" + integrity sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w== + +"@esbuild/freebsd-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz#07be7dd3c9d42fe0eccd2ab9f9ded780bc53bead" + integrity sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA== + +"@esbuild/linux-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz#bf31918fe5c798586460d2b3d6c46ed2c01ca0b6" + integrity sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg== + +"@esbuild/linux-arm@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz#28493ee46abec1dc3f500223cd9f8d2df08f9d11" + integrity sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw== + +"@esbuild/linux-ia32@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz#750752a8b30b43647402561eea764d0a41d0ee29" + integrity sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg== + +"@esbuild/linux-loong64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz#a5a92813a04e71198c50f05adfaf18fc1e95b9ed" + integrity sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA== + +"@esbuild/linux-mips64el@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz#deb45d7fd2d2161eadf1fbc593637ed766d50bb1" + integrity sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw== + +"@esbuild/linux-ppc64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz#6f39ae0b8c4d3d2d61a65b26df79f6e12a1c3d78" + integrity sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA== + +"@esbuild/linux-riscv64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz#4c5c19c3916612ec8e3915187030b9df0b955c1d" + integrity sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ== + +"@esbuild/linux-s390x@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz#9ed17b3198fa08ad5ccaa9e74f6c0aff7ad0156d" + integrity sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw== + +"@esbuild/linux-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz#12383dcbf71b7cf6513e58b4b08d95a710bf52a5" + integrity sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA== + +"@esbuild/netbsd-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz#dd0cb2fa543205fcd931df44f4786bfcce6df7d7" + integrity sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA== + +"@esbuild/netbsd-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz#028ad1807a8e03e155153b2d025b506c3787354b" + integrity sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA== + +"@esbuild/openbsd-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz#e3c16ff3490c9b59b969fffca87f350ffc0e2af5" + integrity sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw== + +"@esbuild/openbsd-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz#c5a4693fcb03d1cbecbf8b422422468dfc0d2a8b" + integrity sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ== + +"@esbuild/openharmony-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz#082082444f12db564a0775a41e1991c0e125055e" + integrity sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g== + +"@esbuild/sunos-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz#5ab036c53f929e8405c4e96e865a424160a1b537" + integrity sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA== + +"@esbuild/win32-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz#38de700ef4b960a0045370c171794526e589862e" + integrity sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA== + +"@esbuild/win32-ia32@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz#451b93dc03ec5d4f38619e6cd64d9f9eff06f55c" + integrity sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q== + +"@esbuild/win32-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz#0eaf705c941a218a43dba8e09f1df1d6cd2f1f17" + integrity sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA== + +"@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/eslint-utils@^4.8.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" - integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== +"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": + version "4.12.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== "@eslint/config-array@^0.21.1": version "0.21.1" @@ -377,9 +307,9 @@ "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" - integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== + version "3.3.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.3.tgz#26393a0806501b5e2b6a43aa588a4d8df67880ac" + integrity sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -387,7 +317,7 @@ globals "^14.0.0" ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^4.1.0" + js-yaml "^4.1.1" minimatch "^3.1.2" strip-json-comments "^3.1.1" @@ -415,328 +345,66 @@ integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== "@humanfs/node@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" - integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + version "0.16.7" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" + integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== dependencies: "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.3.0" + "@humanwhocodes/retry" "^0.4.0" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/retry@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@humanwhocodes/retry@^0.4.2": +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": version "0.4.3" resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== "@internxt/eslint-config-internxt@2.0.1": version "2.0.1" - resolved "https://npm.pkg.github.com/download/@internxt/eslint-config-internxt/2.0.1/da01ca87ded6781de963cda13c292d9f273bd392#da01ca87ded6781de963cda13c292d9f273bd392" - integrity sha512-TeRsWhp9UVHMbhsDuz2gXieSva677ugM8NUjeFyskd8AzP/H43FZNzrfhCO4H1uP7SUsh2IjkJN7HDaL/z9jJw== + resolved "https://registry.yarnpkg.com/@internxt/eslint-config-internxt/-/eslint-config-internxt-2.0.1.tgz#0d4c4f085245f10937a3b1914ba091811dba9d05" + integrity sha512-Ueczo0BAy8T9P8tXztRUoTnY7KU0ISoJ5H4cfqVTiJqkot09uPOaWmLTwI1xTMeKIkBF4h34PzNbGQ32N/nlMw== dependencies: eslint-config-prettier "^10.1.8" typescript-eslint "^8.40.0" -"@internxt/prettier-config@1.0.2": +"@internxt/prettier-config@internxt/prettier-config#v1.0.2": version "1.0.2" - resolved "https://npm.pkg.github.com/download/@internxt/prettier-config/1.0.2/5bd220b8de76734448db5475b3e0c01f9d22c19b#5bd220b8de76734448db5475b3e0c01f9d22c19b" - integrity sha512-t4HiqvCbC7XgQepwWlIaFJe3iwW7HCf6xOSU9nKTV0tiGqOPz7xMtIgLEloQrDA34Cx4PkOYBXrvFPV6RxSFAA== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - 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.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + resolved "https://codeload.github.com/internxt/prettier-config/tar.gz/9fa74e9a2805e1538b50c3809324f1c9d0f3e4f9" + +"@isaacs/balanced-match@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" + integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== + +"@isaacs/brace-expansion@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz#0ef5a92d91f2fff2a37646ce54da9e5f599f6eff" + integrity sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ== 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" + "@isaacs/balanced-match" "^4.0.1" -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": +"@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-30.2.0.tgz#c52fcd5b58fdd2e8eb66b2fd8ae56f2f64d05b28" - integrity sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - jest-message-util "30.2.0" - jest-util "30.2.0" - slash "^3.0.0" - -"@jest/core@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-30.2.0.tgz#813d59faa5abd5510964a8b3a7b17cc77b775275" - integrity sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ== - dependencies: - "@jest/console" "30.2.0" - "@jest/pattern" "30.0.1" - "@jest/reporters" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - ci-info "^4.2.0" - exit-x "^0.2.2" - graceful-fs "^4.2.11" - jest-changed-files "30.2.0" - jest-config "30.2.0" - jest-haste-map "30.2.0" - jest-message-util "30.2.0" - jest-regex-util "30.0.1" - jest-resolve "30.2.0" - jest-resolve-dependencies "30.2.0" - jest-runner "30.2.0" - jest-runtime "30.2.0" - jest-snapshot "30.2.0" - jest-util "30.2.0" - jest-validate "30.2.0" - jest-watcher "30.2.0" - micromatch "^4.0.8" - pretty-format "30.2.0" - slash "^3.0.0" - -"@jest/diff-sequences@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz#0ededeae4d071f5c8ffe3678d15f3a1be09156be" - integrity sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw== - -"@jest/environment@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.2.0.tgz#1e673cdb8b93ded707cf6631b8353011460831fa" - integrity sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g== - dependencies: - "@jest/fake-timers" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - jest-mock "30.2.0" - -"@jest/expect-utils@30.0.3": - version "30.0.3" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.0.3.tgz#2a9fb40110c8a13ae464da41f877df90d2e6bc3b" - integrity sha512-SMtBvf2sfX2agcT0dA9pXwcUrKvOSDqBY4e4iRfT+Hya33XzV35YVg+98YQFErVGA/VR1Gto5Y2+A6G9LSQ3Yg== - dependencies: - "@jest/get-type" "30.0.1" - -"@jest/expect-utils@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.2.0.tgz#4f95413d4748454fdb17404bf1141827d15e6011" - integrity sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA== - dependencies: - "@jest/get-type" "30.1.0" - -"@jest/expect@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-30.2.0.tgz#9a5968499bb8add2bbb09136f69f7df5ddbf3185" - integrity sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA== - dependencies: - expect "30.2.0" - jest-snapshot "30.2.0" - -"@jest/fake-timers@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.2.0.tgz#0941ddc28a339b9819542495b5408622dc9e94ec" - integrity sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw== - dependencies: - "@jest/types" "30.2.0" - "@sinonjs/fake-timers" "^13.0.0" - "@types/node" "*" - jest-message-util "30.2.0" - jest-mock "30.2.0" - jest-util "30.2.0" - -"@jest/get-type@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/get-type/-/get-type-30.0.1.tgz#0d32f1bbfba511948ad247ab01b9007724fc9f52" - integrity sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw== - -"@jest/get-type@30.1.0": - version "30.1.0" - resolved "https://registry.yarnpkg.com/@jest/get-type/-/get-type-30.1.0.tgz#4fcb4dc2ebcf0811be1c04fd1cb79c2dba431cbc" - integrity sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA== - -"@jest/globals@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-30.2.0.tgz#2f4b696d5862664b89c4ee2e49ae24d2bb7e0988" - integrity sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw== - dependencies: - "@jest/environment" "30.2.0" - "@jest/expect" "30.2.0" - "@jest/types" "30.2.0" - jest-mock "30.2.0" - -"@jest/pattern@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/pattern/-/pattern-30.0.1.tgz#d5304147f49a052900b4b853dedb111d080e199f" - integrity sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA== - dependencies: - "@types/node" "*" - jest-regex-util "30.0.1" - -"@jest/reporters@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.2.0.tgz#a36b28fcbaf0c4595250b108e6f20e363348fd91" - integrity sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - "@jridgewell/trace-mapping" "^0.3.25" - "@types/node" "*" - chalk "^4.1.2" - collect-v8-coverage "^1.0.2" - exit-x "^0.2.2" - glob "^10.3.10" - graceful-fs "^4.2.11" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^5.0.0" - istanbul-reports "^3.1.3" - jest-message-util "30.2.0" - jest-util "30.2.0" - jest-worker "30.2.0" - slash "^3.0.0" - string-length "^4.0.2" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.0.1.tgz#27c00d707d480ece0c19126af97081a1af3bc46e" - integrity sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w== - dependencies: - "@sinclair/typebox" "^0.34.0" - -"@jest/schemas@30.0.5": - version "30.0.5" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.0.5.tgz#7bdf69fc5a368a5abdb49fd91036c55225846473" - integrity sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA== - dependencies: - "@sinclair/typebox" "^0.34.0" - -"@jest/snapshot-utils@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz#387858eb90c2f98f67bff327435a532ac5309fbe" - integrity sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug== - dependencies: - "@jest/types" "30.2.0" - chalk "^4.1.2" - graceful-fs "^4.2.11" - natural-compare "^1.4.0" +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.13", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" -"@jest/source-map@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-30.0.1.tgz#305ebec50468f13e658b3d5c26f85107a5620aaa" - integrity sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - callsites "^3.1.0" - graceful-fs "^4.2.11" - -"@jest/test-result@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.2.0.tgz#9c0124377fb7996cdffb86eda3dbc56eacab363d" - integrity sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg== - dependencies: - "@jest/console" "30.2.0" - "@jest/types" "30.2.0" - "@types/istanbul-lib-coverage" "^2.0.6" - collect-v8-coverage "^1.0.2" - -"@jest/test-sequencer@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz#bf0066bc72e176d58f5dfa7f212b6e7eee44f221" - integrity sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q== - dependencies: - "@jest/test-result" "30.2.0" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - slash "^3.0.0" - -"@jest/transform@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-30.2.0.tgz#54bef1a4510dcbd58d5d4de4fe2980a63077ef2a" - integrity sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA== - dependencies: - "@babel/core" "^7.27.4" - "@jest/types" "30.2.0" - "@jridgewell/trace-mapping" "^0.3.25" - babel-plugin-istanbul "^7.0.1" - chalk "^4.1.2" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - jest-regex-util "30.0.1" - jest-util "30.2.0" - micromatch "^4.0.8" - pirates "^4.0.7" - slash "^3.0.0" - write-file-atomic "^5.0.1" - -"@jest/types@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.0.1.tgz#a46df6a99a416fa685740ac4264b9f9cd7da1598" - integrity sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw== - dependencies: - "@jest/pattern" "30.0.1" - "@jest/schemas" "30.0.1" - "@types/istanbul-lib-coverage" "^2.0.6" - "@types/istanbul-reports" "^3.0.4" - "@types/node" "*" - "@types/yargs" "^17.0.33" - chalk "^4.1.2" - -"@jest/types@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.2.0.tgz#1c678a7924b8f59eafd4c77d56b6d0ba976d62b8" - integrity sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg== - dependencies: - "@jest/pattern" "30.0.1" - "@jest/schemas" "30.0.5" - "@types/istanbul-lib-coverage" "^2.0.6" - "@types/istanbul-reports" "^3.0.4" - "@types/node" "*" - "@types/yargs" "^17.0.33" - chalk "^4.1.2" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": @@ -744,83 +412,38 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== +"@jridgewell/trace-mapping@0.3.31", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@napi-rs/wasm-runtime@^0.2.11": - version "0.2.11" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz#192c1610e1625048089ab4e35bc0649ce478500e" - integrity sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA== - dependencies: - "@emnapi/core" "^1.4.3" - "@emnapi/runtime" "^1.4.3" - "@tybys/wasm-util" "^0.9.0" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@pkgr/core@^0.2.4": - version "0.2.7" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.7.tgz#eb5014dfd0b03e7f3ba2eeeff506eed89b028058" - integrity sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg== - "@redocly/ajv@^8.11.2": - version "8.11.3" - resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.11.3.tgz#4f148d1cec14ef3fd9d0efecedaa504159c959a6" - integrity sha512-4P3iZse91TkBiY+Dx5DUgxQ9GXkVJf++cmI0MOyLDxV9b5MUBI4II6ES8zA5JCbO72nKAJxWrw4PUPW+YP3ZDQ== + version "8.17.3" + resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.17.3.tgz#98b30ee03111b27a5acdcab15d3f51622836d0e8" + integrity sha512-NQsbJbB/GV7JVO88ebFkMndrnuGp/dTm5/2NISeg+JGcLzTfGBJZ01+V5zD8nKBOpi/dLLNFT+Ql6IcUk8ehng== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js-replace "^1.0.1" "@redocly/config@^0.22.0": version "0.22.2" resolved "https://registry.yarnpkg.com/@redocly/config/-/config-0.22.2.tgz#9a05e694816d53a5236cf8768d3cad0e49d8b116" integrity sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ== -"@redocly/openapi-core@^1.34.5": - version "1.34.5" - resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.34.5.tgz#9c2cf901d1098ceb626e789e2065c762fe63727f" - integrity sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA== +"@redocly/openapi-core@^1.34.6": + version "1.34.6" + resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.34.6.tgz#6230b140530dc6f1d0684c52d0f31dce0ef3cb3b" + integrity sha512-2+O+riuIUgVSuLl3Lyh5AplWZyVMNuG2F98/o6NrutKJfW4/GTZdPpZlIphS0HGgcOHgmWcCSHj+dWFlZaGSHw== dependencies: "@redocly/ajv" "^8.11.2" "@redocly/config" "^0.22.0" @@ -832,346 +455,335 @@ pluralize "^8.0.0" yaml-ast-parser "0.0.43" -"@sinclair/typebox@^0.34.0": - version "0.34.37" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.37.tgz#f331e4db64ff8195e9e3d8449343c85aaa237d6e" - integrity sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw== - -"@sinonjs/commons@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^13.0.0", "@sinonjs/fake-timers@^13.0.5": - version "13.0.5" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5" - integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw== - dependencies: - "@sinonjs/commons" "^3.0.1" - -"@sinonjs/samsam@^8.0.1": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.2.tgz#e4386bf668ff36c95949e55a38dc5f5892fc2689" - integrity sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw== - dependencies: - "@sinonjs/commons" "^3.0.1" - lodash.get "^4.4.2" - type-detect "^4.1.0" - -"@tybys/wasm-util@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355" - integrity sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw== - dependencies: - tslib "^2.4.0" - -"@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - 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.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" +"@rollup/rollup-android-arm-eabi@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz#add5e608d4e7be55bc3ca3d962490b8b1890e088" + integrity sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg== + +"@rollup/rollup-android-arm64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz#10bd0382b73592beee6e9800a69401a29da625c4" + integrity sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w== + +"@rollup/rollup-darwin-arm64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz#1e99ab04c0b8c619dd7bbde725ba2b87b55bfd81" + integrity sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg== + +"@rollup/rollup-darwin-x64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz#69e741aeb2839d2e8f0da2ce7a33d8bd23632423" + integrity sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w== + +"@rollup/rollup-freebsd-arm64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz#3736c232a999c7bef7131355d83ebdf9651a0839" + integrity sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug== + +"@rollup/rollup-freebsd-x64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz#227dcb8f466684070169942bd3998901c9bfc065" + integrity sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz#ba004b30df31b724f99ce66e7128248bea17cb0c" + integrity sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw== + +"@rollup/rollup-linux-arm-musleabihf@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz#6929f3e07be6b6da5991f63c6b68b3e473d0a65a" + integrity sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw== + +"@rollup/rollup-linux-arm64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz#06e89fd4a25d21fe5575d60b6f913c0e65297bfa" + integrity sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g== + +"@rollup/rollup-linux-arm64-musl@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz#fddabf395b90990d5194038e6cd8c00156ed8ac0" + integrity sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q== + +"@rollup/rollup-linux-loong64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz#04c10bb764bbf09a3c1bd90432e92f58d6603c36" + integrity sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA== + +"@rollup/rollup-linux-loong64-musl@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz#f2450361790de80581d8687ea19142d8a4de5c0f" + integrity sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw== + +"@rollup/rollup-linux-ppc64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz#0474f4667259e407eee1a6d38e29041b708f6a30" + integrity sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w== + +"@rollup/rollup-linux-ppc64-musl@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz#9f32074819eeb1ddbe51f50ea9dcd61a6745ec33" + integrity sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw== + +"@rollup/rollup-linux-riscv64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz#3fdb9d4b1e29fb6b6a6da9f15654d42eb77b99b2" + integrity sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A== + +"@rollup/rollup-linux-riscv64-musl@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz#1de780d64e6be0e3e8762035c22e0d8ea68df8ed" + integrity sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw== + +"@rollup/rollup-linux-s390x-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz#1da022ffd2d9e9f0fd8344ea49e113001fbcac64" + integrity sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg== + +"@rollup/rollup-linux-x64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz#78c16eef9520bd10e1ea7a112593bb58e2842622" + integrity sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg== + +"@rollup/rollup-linux-x64-musl@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz#a7598591b4d9af96cb3167b50a5bf1e02dfea06c" + integrity sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw== + +"@rollup/rollup-openbsd-x64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz#c51d48c07cd6c466560e5bed934aec688ce02614" + integrity sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw== + +"@rollup/rollup-openharmony-arm64@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz#f09921d0b2a0b60afbf3586d2a7a7f208ba6df17" + integrity sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ== + +"@rollup/rollup-win32-arm64-msvc@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz#08d491717135376e4a99529821c94ecd433d5b36" + integrity sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ== + +"@rollup/rollup-win32-ia32-msvc@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz#b0c12aac1104a8b8f26a5e0098e5facbb3e3964a" + integrity sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew== + +"@rollup/rollup-win32-x64-gnu@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz#b9cccef26f5e6fdc013bf3c0911a3c77428509d0" + integrity sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ== + +"@rollup/rollup-win32-x64-msvc@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz#a03348e7b559c792b6277cc58874b89ef46e1e72" + integrity sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA== + +"@standard-schema/spec@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== +"@types/chai@^5.2.2": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" + integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@types/deep-eql" "*" + assertion-error "^2.0.1" -"@types/babel__traverse@*": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" - integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== - dependencies: - "@babel/types" "^7.20.7" +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== -"@types/estree@^1.0.6": +"@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.6": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@30.0.0": - version "30.0.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-30.0.0.tgz#5e85ae568006712e4ad66f25433e9bdac8801f1d" - integrity sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA== - dependencies: - expect "^30.0.0" - pretty-format "^30.0.0" - "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@*": - version "22.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.0.tgz#b7f16e5c3384788542c72dc3d561a7ceae2c0365" - integrity sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ== +"@types/node@25.2.3": + version "25.2.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.2.3.tgz#9c18245be768bdb4ce631566c7da303a5c99a7f8" + integrity sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ== dependencies: - undici-types "~6.19.8" + undici-types "~7.16.0" -"@types/sinon@21.0.0": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-21.0.0.tgz#3a598a29b3aec0512a21e57ae0fd4c09aa013ca9" - integrity sha512-+oHKZ0lTI+WVLxx1IbJDNmReQaIsQJjN2e7UUrJHEeByG7bFeKJYsv1E75JxTQ9QKJDp21bAa/0W2Xo4srsDnw== +"@typescript-eslint/eslint-plugin@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz#086d2ef661507b561f7b17f62d3179d692a0765f" + integrity sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ== dependencies: - "@types/sinonjs__fake-timers" "*" + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.55.0" + "@typescript-eslint/type-utils" "8.55.0" + "@typescript-eslint/utils" "8.55.0" + "@typescript-eslint/visitor-keys" "8.55.0" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.4.0" + +"@typescript-eslint/parser@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.55.0.tgz#6eace4e9e95f178d3447ed1f17f3d6a5dfdb345c" + integrity sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw== + dependencies: + "@typescript-eslint/scope-manager" "8.55.0" + "@typescript-eslint/types" "8.55.0" + "@typescript-eslint/typescript-estree" "8.55.0" + "@typescript-eslint/visitor-keys" "8.55.0" + debug "^4.4.3" + +"@typescript-eslint/project-service@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.55.0.tgz#b8a71c06a625bdad481c24d5614b68e252f3ae9b" + integrity sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.55.0" + "@typescript-eslint/types" "^8.55.0" + debug "^4.4.3" + +"@typescript-eslint/scope-manager@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz#8a0752c31c788651840dc98f840b0c2ebe143b8c" + integrity sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q== + dependencies: + "@typescript-eslint/types" "8.55.0" + "@typescript-eslint/visitor-keys" "8.55.0" + +"@typescript-eslint/tsconfig-utils@8.55.0", "@typescript-eslint/tsconfig-utils@^8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz#62f1d005419985e09d37a040b2f1450e4e805afa" + integrity sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q== + +"@typescript-eslint/type-utils@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz#195d854b3e56308ce475fdea2165313bb1190200" + integrity sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g== + dependencies: + "@typescript-eslint/types" "8.55.0" + "@typescript-eslint/typescript-estree" "8.55.0" + "@typescript-eslint/utils" "8.55.0" + debug "^4.4.3" + ts-api-utils "^2.4.0" + +"@typescript-eslint/types@8.55.0", "@typescript-eslint/types@^8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.55.0.tgz#8449c5a7adac61184cac92dbf6315733569708c2" + integrity sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w== + +"@typescript-eslint/typescript-estree@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz#c83ac92c11ce79bedd984937c7780a65e7f7b2e3" + integrity sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw== + dependencies: + "@typescript-eslint/project-service" "8.55.0" + "@typescript-eslint/tsconfig-utils" "8.55.0" + "@typescript-eslint/types" "8.55.0" + "@typescript-eslint/visitor-keys" "8.55.0" + debug "^4.4.3" + minimatch "^9.0.5" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.4.0" -"@types/sinonjs__fake-timers@*": - version "8.1.5" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz#5fd3592ff10c1e9695d377020c033116cc2889f2" - integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ== +"@typescript-eslint/utils@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.55.0.tgz#c1744d94a3901deb01f58b09d3478d811f96d619" + integrity sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.55.0" + "@typescript-eslint/types" "8.55.0" + "@typescript-eslint/typescript-estree" "8.55.0" -"@types/stack-utils@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.33": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz#19f959f273b32f5082c891903645e6a85328db4e" - integrity sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.40.0" - "@typescript-eslint/type-utils" "8.40.0" - "@typescript-eslint/utils" "8.40.0" - "@typescript-eslint/visitor-keys" "8.40.0" - graphemer "^1.4.0" - ignore "^7.0.0" - natural-compare "^1.4.0" - ts-api-utils "^2.1.0" - -"@typescript-eslint/parser@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.40.0.tgz#1bc9f3701ced29540eb76ff2d95ce0d52ddc7e69" - integrity sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw== - dependencies: - "@typescript-eslint/scope-manager" "8.40.0" - "@typescript-eslint/types" "8.40.0" - "@typescript-eslint/typescript-estree" "8.40.0" - "@typescript-eslint/visitor-keys" "8.40.0" - debug "^4.3.4" - -"@typescript-eslint/project-service@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.40.0.tgz#1b7ba6079ff580c3215882fe75a43e5d3ed166b9" - integrity sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.40.0" - "@typescript-eslint/types" "^8.40.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.40.0.tgz#2fbfcc8643340d8cd692267e61548b946190be8a" - integrity sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w== - dependencies: - "@typescript-eslint/types" "8.40.0" - "@typescript-eslint/visitor-keys" "8.40.0" - -"@typescript-eslint/tsconfig-utils@8.40.0", "@typescript-eslint/tsconfig-utils@^8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.40.0.tgz#8e8fdb9b988854aedd04abdde3239c4bdd2d26e4" - integrity sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw== - -"@typescript-eslint/type-utils@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz#a7e4a1f0815dd0ba3e4eef945cc87193ca32c422" - integrity sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow== - dependencies: - "@typescript-eslint/types" "8.40.0" - "@typescript-eslint/typescript-estree" "8.40.0" - "@typescript-eslint/utils" "8.40.0" - debug "^4.3.4" - ts-api-utils "^2.1.0" - -"@typescript-eslint/types@8.40.0", "@typescript-eslint/types@^8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.40.0.tgz#0b580fdf643737aa5c01285314b5c6e9543846a9" - integrity sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg== - -"@typescript-eslint/typescript-estree@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.40.0.tgz#295149440ce7da81c790a4e14e327599a3a1e5c9" - integrity sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ== - dependencies: - "@typescript-eslint/project-service" "8.40.0" - "@typescript-eslint/tsconfig-utils" "8.40.0" - "@typescript-eslint/types" "8.40.0" - "@typescript-eslint/visitor-keys" "8.40.0" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^2.1.0" - -"@typescript-eslint/utils@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.40.0.tgz#8d0c6430ed2f5dc350784bb0d8be514da1e54054" - integrity sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg== - dependencies: - "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.40.0" - "@typescript-eslint/types" "8.40.0" - "@typescript-eslint/typescript-estree" "8.40.0" - -"@typescript-eslint/visitor-keys@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.40.0.tgz#c1b45196981311fed7256863be4bfb2d3eda332a" - integrity sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA== - dependencies: - "@typescript-eslint/types" "8.40.0" +"@typescript-eslint/visitor-keys@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz#3d9a40fd4e3705c63d8fae3af58988add3ed464d" + integrity sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA== + dependencies: + "@typescript-eslint/types" "8.55.0" eslint-visitor-keys "^4.2.1" -"@ungap/structured-clone@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" - integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== - -"@unrs/resolver-binding-android-arm-eabi@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.2.tgz#6cb01dde20bef06397ffd4924f502596cb458851" - integrity sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A== - -"@unrs/resolver-binding-android-arm64@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.2.tgz#1672b533f01f98119095860683496def93929a2e" - integrity sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q== - -"@unrs/resolver-binding-darwin-arm64@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.2.tgz#dad66a21553b1ba4088c6eb922332846550bd9b2" - integrity sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ== - -"@unrs/resolver-binding-darwin-x64@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.2.tgz#bfaedca218078862f3d536d44269fed94a6158e2" - integrity sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ== - -"@unrs/resolver-binding-freebsd-x64@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.2.tgz#bdab0e754c45831522b16df0b6fe4b0ffde22628" - integrity sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw== - -"@unrs/resolver-binding-linux-arm-gnueabihf@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.2.tgz#2bac9c19599888d4ba4787b437b0273ac7a7a9f2" - integrity sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw== - -"@unrs/resolver-binding-linux-arm-musleabihf@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.2.tgz#49d27d5d63e5f26cf7b93a0731334b302b9b7fec" - integrity sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg== - -"@unrs/resolver-binding-linux-arm64-gnu@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.2.tgz#95ba5d1654a04b1049d944871e165d786e8da68f" - integrity sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA== - -"@unrs/resolver-binding-linux-arm64-musl@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.2.tgz#23f90a48b1d343189b1c20c89b694140e2d5a210" - integrity sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA== - -"@unrs/resolver-binding-linux-ppc64-gnu@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.2.tgz#076f2c2e95dbcd4824cc9929bc504151b402ac11" - integrity sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw== - -"@unrs/resolver-binding-linux-riscv64-gnu@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.2.tgz#f7de54d45df430c74bbd12794946a55805bed6dd" - integrity sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ== - -"@unrs/resolver-binding-linux-riscv64-musl@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.2.tgz#ad1fcdcf5f112d7432fcfe38269a084bdccad266" - integrity sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg== - -"@unrs/resolver-binding-linux-s390x-gnu@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.2.tgz#d914a4f12b9048e1a4de0040f64d73274104e301" - integrity sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ== - -"@unrs/resolver-binding-linux-x64-gnu@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.2.tgz#d8f8cddc42ae267ef45ed4b61ff72b9e22aa3b82" - integrity sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w== - -"@unrs/resolver-binding-linux-x64-musl@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.2.tgz#7bfce67acb51b3f4a7cff8383f46600f7b055a96" - integrity sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw== - -"@unrs/resolver-binding-wasm32-wasi@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.2.tgz#b133c9b6941aba54eea007ca2f27ff6ce917ae55" - integrity sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ== - dependencies: - "@napi-rs/wasm-runtime" "^0.2.11" - -"@unrs/resolver-binding-win32-arm64-msvc@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.2.tgz#5f95f590f06c1e9ba15b24292c956c21a6294b30" - integrity sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw== - -"@unrs/resolver-binding-win32-ia32-msvc@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.2.tgz#aac6595c6de6b26e5314372ab977b0f6a869c903" - integrity sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA== - -"@unrs/resolver-binding-win32-x64-msvc@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.2.tgz#f755c5229f1401bbff7307d037c6e38fa169ad1d" - integrity sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg== +"@vitest/coverage-istanbul@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/coverage-istanbul/-/coverage-istanbul-4.0.18.tgz#9521482686849c76c2feee2335bb9b914ecc4f06" + integrity sha512-0OhjP30owEDihYTZGWuq20rNtV1RjjJs1Mv4MaZIKcFBmiLUXX7HJLX4fU7wE+Mrc3lQxI2HKq6WrSXi5FGuCQ== + dependencies: + "@istanbuljs/schema" "^0.1.3" + "@jridgewell/gen-mapping" "^0.3.13" + "@jridgewell/trace-mapping" "0.3.31" + istanbul-lib-coverage "^3.2.2" + istanbul-lib-instrument "^6.0.3" + istanbul-lib-report "^3.0.1" + istanbul-reports "^3.2.0" + magicast "^0.5.1" + obug "^2.1.1" + tinyrainbow "^3.0.3" + +"@vitest/expect@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-4.0.18.tgz#361510d99fbf20eb814222e4afcb8539d79dc94d" + integrity sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ== + dependencies: + "@standard-schema/spec" "^1.0.0" + "@types/chai" "^5.2.2" + "@vitest/spy" "4.0.18" + "@vitest/utils" "4.0.18" + chai "^6.2.1" + tinyrainbow "^3.0.3" + +"@vitest/mocker@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-4.0.18.tgz#b9735da114ef65ea95652c5bdf13159c6fab4865" + integrity sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ== + dependencies: + "@vitest/spy" "4.0.18" + estree-walker "^3.0.3" + magic-string "^0.30.21" + +"@vitest/pretty-format@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-4.0.18.tgz#fbccd4d910774072ec15463553edb8ca5ce53218" + integrity sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw== + dependencies: + tinyrainbow "^3.0.3" + +"@vitest/runner@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-4.0.18.tgz#c2c0a3ed226ec85e9312f9cc8c43c5b3a893a8b1" + integrity sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw== + dependencies: + "@vitest/utils" "4.0.18" + pathe "^2.0.3" + +"@vitest/snapshot@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-4.0.18.tgz#bcb40fd6d742679c2ac927ba295b66af1c6c34c5" + integrity sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA== + dependencies: + "@vitest/pretty-format" "4.0.18" + magic-string "^0.30.21" + pathe "^2.0.3" + +"@vitest/spy@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-4.0.18.tgz#ba0f20503fb6d08baf3309d690b3efabdfa88762" + integrity sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw== + +"@vitest/utils@4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-4.0.18.tgz#9636b16d86a4152ec68a8d6859cff702896433d4" + integrity sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA== + dependencies: + "@vitest/pretty-format" "4.0.18" + tinyrainbow "^3.0.3" acorn-jsx@^5.3.2: version "5.3.2" @@ -1203,155 +815,68 @@ ansi-colors@^4.1.3: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - ansi-escapes@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" - integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== + version "7.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.3.0.tgz#5395bb74b2150a4a1d6e3c2565f4aeca78d28627" + integrity sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg== dependencies: environment "^1.0.0" -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-styles@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - ansi-styles@^6.2.1: version "6.2.3" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== -anymatch@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.2.tgz#9ada120b7b5ab24509553ec3e40123521117f687" - integrity sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA== +axios@1.13.5: + version "1.13.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.5.tgz#5e464688fa127e11a660a2c49441c009f6567a43" + integrity sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q== dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.4" + follow-redirects "^1.15.11" + form-data "^4.0.5" proxy-from-env "^1.1.0" -babel-jest@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-30.2.0.tgz#fd44a1ec9552be35ead881f7381faa7d8f3b95ac" - integrity sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw== - dependencies: - "@jest/transform" "30.2.0" - "@types/babel__core" "^7.20.5" - babel-plugin-istanbul "^7.0.1" - babel-preset-jest "30.2.0" - chalk "^4.1.2" - graceful-fs "^4.2.11" - slash "^3.0.0" - -babel-plugin-istanbul@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz#d8b518c8ea199364cf84ccc82de89740236daf92" - integrity sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-instrument "^6.0.2" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz#94c250d36b43f95900f3a219241e0f4648191ce2" - integrity sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA== - dependencies: - "@types/babel__core" "^7.20.5" - -babel-preset-current-node-syntax@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6" - integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== - 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@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz#04717843e561347781d6d7f69c81e6bcc3ed11ce" - integrity sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ== - dependencies: - babel-plugin-jest-hoist "30.2.0" - babel-preset-current-node-syntax "^1.2.0" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +baseline-browser-mapping@^2.9.0: + version "2.9.19" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz#3e508c43c46d961eb4d7d2e5b8d1dd0f9ee4f488" + integrity sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg== + brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1371,33 +896,15 @@ braces@^3.0.3: fill-range "^7.1.1" browserslist@^4.24.0: - version "4.24.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" - integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== - dependencies: - caniuse-lite "^1.0.30001669" - electron-to-chromium "^1.5.41" - node-releases "^2.0.18" - update-browserslist-db "^1.1.1" - -bs-logger@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + version "4.28.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + baseline-browser-mapping "^2.9.0" + caniuse-lite "^1.0.30001759" + electron-to-chromium "^1.5.263" + node-releases "^2.0.27" + update-browserslist-db "^1.2.0" call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" @@ -1407,27 +914,22 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: es-errors "^1.3.0" function-bind "^1.1.2" -callsites@^3.0.0, callsites@^3.1.0: +callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +caniuse-lite@^1.0.30001759: + version "1.0.30001769" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz#1ad91594fad7dc233777c2781879ab5409f7d9c2" + integrity sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg== -caniuse-lite@^1.0.30001669: - version "1.0.30001678" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001678.tgz#b930b04cd0b295136405634aa32ad540d7eeb71e" - integrity sha512-RR+4U/05gNtps58PEBDZcPWTgEO2MBeoPZ96aQcjmfkBWRIDfN451fW2qyDA9/+HohLLIL5GqiMwA+IB1pWarw== +chai@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.2.tgz#ae41b52c9aca87734505362717f3255facda360e" + integrity sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg== -chalk@^4.0.0, chalk@^4.1.2: +chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1440,21 +942,6 @@ change-case@^5.4.4: resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz#0d52b507d8fb8f204343432381d1a6d7bff97a02" integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w== -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -ci-info@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.2.0.tgz#cbd21386152ebfe1d56f280a3b5feccbd96764c7" - integrity sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg== - -cjs-module-lexer@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.1.0.tgz#586e87d4341cb2661850ece5190232ccdebcff8b" - integrity sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA== - cli-cursor@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" @@ -1463,32 +950,13 @@ cli-cursor@^5.0.0: restore-cursor "^5.0.0" cli-truncate@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-5.1.0.tgz#bb12607a62f0e4bb91a54aa4653b23347900bb55" - integrity sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g== + version "5.1.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-5.1.1.tgz#455476face9904d94b7d11e98d9adbca15292ea5" + integrity sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A== dependencies: slice-ansi "^7.1.0" string-width "^8.0.0" -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - 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" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -1519,9 +987,9 @@ combined-stream@^1.0.8: delayed-stream "~1.0.0" commander@^14.0.2: - version "14.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-14.0.2.tgz#b71fd37fe4069e4c3c7c13925252ada4eba14e8e" - integrity sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ== + version "14.0.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-14.0.3.tgz#425d79b48f9af82fcd9e4fc1ea8af6c5ec07bbc2" + integrity sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw== concat-map@0.0.1: version "0.0.1" @@ -1533,15 +1001,6 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cross-spawn@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.4.tgz#36d9cb36c32ae7a0df935f0191f79959962a2165" - integrity sha512-9KdyVPPtLHjPAD7tcuzSFs64UfHlLJt7U6qP4/bFVLyjLceyizj6s6jO6YBaV5d0G7g/9KnY/dOpLR4Rcg8YDg== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" @@ -1551,50 +1010,23 @@ cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" -debug@4, debug@^4.3.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== +debug@4, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -dedent@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.6.0.tgz#79d52d6389b1ffa67d2bcef59ba51847a9d503b2" - integrity sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA== - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -detect-newline@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" - integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== - dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -1604,48 +1036,21 @@ dunder-proto@^1.0.1: es-errors "^1.3.0" gopd "^1.2.0" -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.5.41: - version "1.5.52" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.52.tgz#2bed832c95a56a195504f918150e548474687da8" - integrity sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +electron-to-chromium@^1.5.263: + version "1.5.286" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz#142be1ab5e1cd5044954db0e5898f60a4960384e" + integrity sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A== emoji-regex@^10.3.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.5.0.tgz#be23498b9e39db476226d8e81e467f39aca26b78" - integrity sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + version "10.6.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== environment@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - 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.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" @@ -1656,6 +1061,11 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-module-lexer@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== + es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" @@ -1673,16 +1083,43 @@ es-set-tostringtag@^2.1.0: has-tostringtag "^1.0.2" hasown "^2.0.2" -escalade@^3.1.1, escalade@^3.2.0: +esbuild@^0.27.0: + version "0.27.3" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.3.tgz#5859ca8e70a3af956b26895ce4954d7e73bd27a8" + integrity sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.27.3" + "@esbuild/android-arm" "0.27.3" + "@esbuild/android-arm64" "0.27.3" + "@esbuild/android-x64" "0.27.3" + "@esbuild/darwin-arm64" "0.27.3" + "@esbuild/darwin-x64" "0.27.3" + "@esbuild/freebsd-arm64" "0.27.3" + "@esbuild/freebsd-x64" "0.27.3" + "@esbuild/linux-arm" "0.27.3" + "@esbuild/linux-arm64" "0.27.3" + "@esbuild/linux-ia32" "0.27.3" + "@esbuild/linux-loong64" "0.27.3" + "@esbuild/linux-mips64el" "0.27.3" + "@esbuild/linux-ppc64" "0.27.3" + "@esbuild/linux-riscv64" "0.27.3" + "@esbuild/linux-s390x" "0.27.3" + "@esbuild/linux-x64" "0.27.3" + "@esbuild/netbsd-arm64" "0.27.3" + "@esbuild/netbsd-x64" "0.27.3" + "@esbuild/openbsd-arm64" "0.27.3" + "@esbuild/openbsd-x64" "0.27.3" + "@esbuild/openharmony-arm64" "0.27.3" + "@esbuild/sunos-x64" "0.27.3" + "@esbuild/win32-arm64" "0.27.3" + "@esbuild/win32-ia32" "0.27.3" + "@esbuild/win32-x64" "0.27.3" + +escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -1760,15 +1197,10 @@ espree@^10.0.1, espree@^10.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.1" -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + version "1.7.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== dependencies: estraverse "^5.1.0" @@ -1784,77 +1216,34 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + version "5.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb" + integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== -execa@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - 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-x@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/exit-x/-/exit-x-0.2.2.tgz#1f9052de3b8d99a696b10dad5bced9bdd5c3aa64" - integrity sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ== - -expect@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-30.2.0.tgz#d4013bed267013c14bc1199cec8aa57cee9b5869" - integrity sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw== - dependencies: - "@jest/expect-utils" "30.2.0" - "@jest/get-type" "30.1.0" - jest-matcher-utils "30.2.0" - jest-message-util "30.2.0" - jest-mock "30.2.0" - jest-util "30.2.0" - -expect@^30.0.0: - version "30.0.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-30.0.3.tgz#8bf31a67514f78c5e4ac8d67774192ab95d5ec25" - integrity sha512-HXg6NvK35/cSYZCUKAtmlgCFyqKM4frEPbzrav5hRqb0GMz0E0lS5hfzYjSaiaE5ysnp/qI2aeZkeyeIAOeXzQ== - dependencies: - "@jest/expect-utils" "30.0.3" - "@jest/get-type" "30.0.1" - jest-matcher-utils "30.0.3" - jest-message-util "30.0.2" - jest-mock "30.0.2" - jest-util "30.0.2" +expect-type@^1.2.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.3.0.tgz#0d58ed361877a31bbc4dd6cf71bbfef7faf6bd68" + integrity sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -1864,19 +1253,15 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" +fast-uri@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== -fb-watchman@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== file-entry-cache@^8.0.0: version "8.0.0" @@ -1892,14 +1277,6 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - 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.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -1917,27 +1294,19 @@ flat-cache@^4.0.0: keyv "^4.5.4" flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== +follow-redirects@^1.15.11: + version "1.15.11" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -form-data@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" - integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== +form-data@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -1945,12 +1314,7 @@ form-data@^4.0.4: hasown "^2.0.2" mime-types "^2.1.12" -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.3: +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -1965,17 +1329,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.1.tgz#b85889d779881a651dfde71d3796ddbe9549012b" - integrity sha512-R1QfovbPsKmosqTnPoRFiJ7CF9MLRgb53ChvMZm+r4p76/+8yKDy17qLL2PKInORy2RkZZekuK0efYgmzTkXyQ== - -get-east-asian-width@^1.3.0: +get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.0, get-east-asian-width@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz#9bc4caa131702b4b61729cb7e42735bc550c9ee6" integrity sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q== @@ -1996,11 +1350,6 @@ get-intrinsic@^1.2.6: hasown "^2.0.2" math-intrinsics "^1.1.0" -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - get-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" @@ -2009,18 +1358,6 @@ get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -2028,34 +1365,14 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^10.3.10: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== +glob@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.2.tgz#74b28859255e319c84d1aed1a0a5b5248bfea227" + integrity sha512-035InabNu/c1lW0tzPhAgapKctblppqsKKG9ZaNzbr+gXwWMjXoiyGSyB9sArzrjG7jY+zntRq5ZSUYemrnWVQ== dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" + minimatch "^10.1.2" minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - 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" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + path-scurry "^2.0.0" globals@^14.0.0: version "14.0.0" @@ -2067,28 +1384,6 @@ gopd@^1.2.0: resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.2.11: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -handlebars@^4.7.8: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.2" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -2126,11 +1421,6 @@ 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.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - husky@9.1.7: version "9.1.7" resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" @@ -2141,65 +1431,34 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -ignore@^7.0.0: +ignore@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - 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.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== index-to-position@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-1.1.0.tgz#2e50bd54c8040bdd6d9b3d95ec2a8fedf86b4d44" - integrity sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-1.2.0.tgz#c800eb34dacf4dbf96b9b06c7eb78d5f704138b4" + integrity sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw== is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - is-fullwidth-code-point@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" @@ -2207,12 +1466,7 @@ is-fullwidth-code-point@^5.0.0: dependencies: get-east-asian-width "^1.3.1" -is-generator-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -2224,22 +1478,17 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0, istanbul-lib-coverage@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2: +istanbul-lib-instrument@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== @@ -2250,7 +1499,7 @@ istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2: istanbul-lib-coverage "^3.2.0" semver "^7.5.4" -istanbul-lib-report@^3.0.0: +istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== @@ -2259,444 +1508,14 @@ istanbul-lib-report@^3.0.0: make-dir "^4.0.0" supports-color "^7.1.0" -istanbul-lib-source-maps@^5.0.0: - version "5.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz#acaef948df7747c8eb5fbf1265cb980f6353a441" - integrity sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== - dependencies: - "@jridgewell/trace-mapping" "^0.3.23" - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== +istanbul-reports@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93" + integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jest-changed-files@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-30.2.0.tgz#602266e478ed554e1e1469944faa7efd37cee61c" - integrity sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ== - dependencies: - execa "^5.1.1" - jest-util "30.2.0" - p-limit "^3.1.0" - -jest-circus@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-30.2.0.tgz#98b8198b958748a2f322354311023d1d02e7603f" - integrity sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg== - dependencies: - "@jest/environment" "30.2.0" - "@jest/expect" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - co "^4.6.0" - dedent "^1.6.0" - is-generator-fn "^2.1.0" - jest-each "30.2.0" - jest-matcher-utils "30.2.0" - jest-message-util "30.2.0" - jest-runtime "30.2.0" - jest-snapshot "30.2.0" - jest-util "30.2.0" - p-limit "^3.1.0" - pretty-format "30.2.0" - pure-rand "^7.0.0" - slash "^3.0.0" - stack-utils "^2.0.6" - -jest-cli@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-30.2.0.tgz#1780f8e9d66bf84a10b369aea60aeda7697dcc67" - integrity sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA== - dependencies: - "@jest/core" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/types" "30.2.0" - chalk "^4.1.2" - exit-x "^0.2.2" - import-local "^3.2.0" - jest-config "30.2.0" - jest-util "30.2.0" - jest-validate "30.2.0" - yargs "^17.7.2" - -jest-config@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-30.2.0.tgz#29df8c50e2ad801cc59c406b50176c18c362a90b" - integrity sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA== - dependencies: - "@babel/core" "^7.27.4" - "@jest/get-type" "30.1.0" - "@jest/pattern" "30.0.1" - "@jest/test-sequencer" "30.2.0" - "@jest/types" "30.2.0" - babel-jest "30.2.0" - chalk "^4.1.2" - ci-info "^4.2.0" - deepmerge "^4.3.1" - glob "^10.3.10" - graceful-fs "^4.2.11" - jest-circus "30.2.0" - jest-docblock "30.2.0" - jest-environment-node "30.2.0" - jest-regex-util "30.0.1" - jest-resolve "30.2.0" - jest-runner "30.2.0" - jest-util "30.2.0" - jest-validate "30.2.0" - micromatch "^4.0.8" - parse-json "^5.2.0" - pretty-format "30.2.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@30.0.3: - version "30.0.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.0.3.tgz#50ac056b90fe9151d6266b18a27adeb064c30235" - integrity sha512-Q1TAV0cUcBTic57SVnk/mug0/ASyAqtSIOkr7RAlxx97llRYsM74+E8N5WdGJUlwCKwgxPAkVjKh653h1+HA9A== - dependencies: - "@jest/diff-sequences" "30.0.1" - "@jest/get-type" "30.0.1" - chalk "^4.1.2" - pretty-format "30.0.2" - -jest-diff@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.2.0.tgz#e3ec3a6ea5c5747f605c9e874f83d756cba36825" - integrity sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A== - dependencies: - "@jest/diff-sequences" "30.0.1" - "@jest/get-type" "30.1.0" - chalk "^4.1.2" - pretty-format "30.2.0" - -jest-docblock@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-30.2.0.tgz#42cd98d69f887e531c7352309542b1ce4ee10256" - integrity sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA== - dependencies: - detect-newline "^3.1.0" - -jest-each@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-30.2.0.tgz#39e623ae71641c2ac3ee69b3ba3d258fce8e768d" - integrity sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ== - dependencies: - "@jest/get-type" "30.1.0" - "@jest/types" "30.2.0" - chalk "^4.1.2" - jest-util "30.2.0" - pretty-format "30.2.0" - -jest-environment-node@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-30.2.0.tgz#3def7980ebd2fd86e74efd4d2e681f55ab38da0f" - integrity sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA== - dependencies: - "@jest/environment" "30.2.0" - "@jest/fake-timers" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - jest-mock "30.2.0" - jest-util "30.2.0" - jest-validate "30.2.0" - -jest-haste-map@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-30.2.0.tgz#808e3889f288603ac70ff0ac047598345a66022e" - integrity sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - anymatch "^3.1.3" - fb-watchman "^2.0.2" - graceful-fs "^4.2.11" - jest-regex-util "30.0.1" - jest-util "30.2.0" - jest-worker "30.2.0" - micromatch "^4.0.8" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.3" - -jest-leak-detector@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz#292fdca7b7c9cf594e1e570ace140b01d8beb736" - integrity sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ== - dependencies: - "@jest/get-type" "30.1.0" - pretty-format "30.2.0" - -jest-matcher-utils@30.0.3: - version "30.0.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.0.3.tgz#e07e4776bade71a3a7948a9bf8aeede311c5013a" - integrity sha512-hMpVFGFOhYmIIRGJ0HgM9htC5qUiJ00famcc9sRFchJJiLZbbVKrAztcgE6VnXLRxA3XZ0bvNA7hQWh3oHXo/A== - dependencies: - "@jest/get-type" "30.0.1" - chalk "^4.1.2" - jest-diff "30.0.3" - pretty-format "30.0.2" - -jest-matcher-utils@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz#69a0d4c271066559ec8b0d8174829adc3f23a783" - integrity sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg== - dependencies: - "@jest/get-type" "30.1.0" - chalk "^4.1.2" - jest-diff "30.2.0" - pretty-format "30.2.0" - -jest-message-util@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.0.2.tgz#9dfdc37570d172f0ffdc42a0318036ff4008837f" - integrity sha512-vXywcxmr0SsKXF/bAD7t7nMamRvPuJkras00gqYeB1V0WllxZrbZ0paRr3XqpFU2sYYjD0qAaG2fRyn/CGZ0aw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@jest/types" "30.0.1" - "@types/stack-utils" "^2.0.3" - chalk "^4.1.2" - graceful-fs "^4.2.11" - micromatch "^4.0.8" - pretty-format "30.0.2" - slash "^3.0.0" - stack-utils "^2.0.6" - -jest-message-util@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.2.0.tgz#fc97bf90d11f118b31e6131e2b67fc4f39f92152" - integrity sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@jest/types" "30.2.0" - "@types/stack-utils" "^2.0.3" - chalk "^4.1.2" - graceful-fs "^4.2.11" - micromatch "^4.0.8" - pretty-format "30.2.0" - slash "^3.0.0" - stack-utils "^2.0.6" - -jest-mock@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.0.2.tgz#5e4245f25f6f9532714906cab10a2b9e39eb2183" - integrity sha512-PnZOHmqup/9cT/y+pXIVbbi8ID6U1XHRmbvR7MvUy4SLqhCbwpkmXhLbsWbGewHrV5x/1bF7YDjs+x24/QSvFA== - dependencies: - "@jest/types" "30.0.1" - "@types/node" "*" - jest-util "30.0.2" - -jest-mock@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.2.0.tgz#69f991614eeb4060189459d3584f710845bff45e" - integrity sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - jest-util "30.2.0" - -jest-pnp-resolver@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@30.0.1: - version "30.0.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.0.1.tgz#f17c1de3958b67dfe485354f5a10093298f2a49b" - integrity sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA== - -jest-resolve-dependencies@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz#3370e2c0b49cc560f6a7e8ec3a59dd99525e1a55" - integrity sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w== - dependencies: - jest-regex-util "30.0.1" - jest-snapshot "30.2.0" - -jest-resolve@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-30.2.0.tgz#2e2009cbd61e8f1f003355d5ec87225412cebcd7" - integrity sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A== - dependencies: - chalk "^4.1.2" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - jest-pnp-resolver "^1.2.3" - jest-util "30.2.0" - jest-validate "30.2.0" - slash "^3.0.0" - unrs-resolver "^1.7.11" - -jest-runner@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-30.2.0.tgz#c62b4c3130afa661789705e13a07bdbcec26a114" - integrity sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ== - dependencies: - "@jest/console" "30.2.0" - "@jest/environment" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - emittery "^0.13.1" - exit-x "^0.2.2" - graceful-fs "^4.2.11" - jest-docblock "30.2.0" - jest-environment-node "30.2.0" - jest-haste-map "30.2.0" - jest-leak-detector "30.2.0" - jest-message-util "30.2.0" - jest-resolve "30.2.0" - jest-runtime "30.2.0" - jest-util "30.2.0" - jest-watcher "30.2.0" - jest-worker "30.2.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-30.2.0.tgz#395ea792cde048db1b0cd1a92dc9cb9f1921bf8a" - integrity sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg== - dependencies: - "@jest/environment" "30.2.0" - "@jest/fake-timers" "30.2.0" - "@jest/globals" "30.2.0" - "@jest/source-map" "30.0.1" - "@jest/test-result" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - cjs-module-lexer "^2.1.0" - collect-v8-coverage "^1.0.2" - glob "^10.3.10" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - jest-message-util "30.2.0" - jest-mock "30.2.0" - jest-regex-util "30.0.1" - jest-resolve "30.2.0" - jest-snapshot "30.2.0" - jest-util "30.2.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-30.2.0.tgz#266fbbb4b95fc4665ce6f32f1f38eeb39f4e26d0" - integrity sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA== - dependencies: - "@babel/core" "^7.27.4" - "@babel/generator" "^7.27.5" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.27.1" - "@babel/types" "^7.27.3" - "@jest/expect-utils" "30.2.0" - "@jest/get-type" "30.1.0" - "@jest/snapshot-utils" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - babel-preset-current-node-syntax "^1.2.0" - chalk "^4.1.2" - expect "30.2.0" - graceful-fs "^4.2.11" - jest-diff "30.2.0" - jest-matcher-utils "30.2.0" - jest-message-util "30.2.0" - jest-util "30.2.0" - pretty-format "30.2.0" - semver "^7.7.2" - synckit "^0.11.8" - -jest-util@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.0.2.tgz#1bd8411f81e6f5e2ca8b31bb2534ebcd7cbac065" - integrity sha512-8IyqfKS4MqprBuUpZNlFB5l+WFehc8bfCe1HSZFHzft2mOuND8Cvi9r1musli+u6F3TqanCZ/Ik4H4pXUolZIg== - dependencies: - "@jest/types" "30.0.1" - "@types/node" "*" - chalk "^4.1.2" - ci-info "^4.2.0" - graceful-fs "^4.2.11" - picomatch "^4.0.2" - -jest-util@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.2.0.tgz#5142adbcad6f4e53c2776c067a4db3c14f913705" - integrity sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - ci-info "^4.2.0" - graceful-fs "^4.2.11" - picomatch "^4.0.2" - -jest-validate@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.2.0.tgz#273eaaed4c0963b934b5b31e96289edda6e0a2ef" - integrity sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw== - dependencies: - "@jest/get-type" "30.1.0" - "@jest/types" "30.2.0" - camelcase "^6.3.0" - chalk "^4.1.2" - leven "^3.1.0" - pretty-format "30.2.0" - -jest-watcher@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-30.2.0.tgz#f9c055de48e18c979e7756a3917e596e2d69b07b" - integrity sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg== - dependencies: - "@jest/test-result" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - emittery "^0.13.1" - jest-util "30.2.0" - string-length "^4.0.2" - -jest-worker@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.2.0.tgz#fd5c2a36ff6058ec8f74366ec89538cc99539d26" - integrity sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g== - dependencies: - "@types/node" "*" - "@ungap/structured-clone" "^1.3.0" - jest-util "30.2.0" - merge-stream "^2.0.0" - supports-color "^8.1.1" - -jest@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-30.2.0.tgz#9f0a71e734af968f26952b5ae4b724af82681630" - integrity sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A== - dependencies: - "@jest/core" "30.2.0" - "@jest/types" "30.2.0" - import-local "^3.2.0" - jest-cli "30.2.0" - js-levenshtein@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" @@ -2707,36 +1526,23 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - 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.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== +js-yaml@^4.1.0, js-yaml@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== dependencies: argparse "^2.0.1" jsesc@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -2764,11 +1570,6 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2777,11 +1578,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - lint-staged@16.2.7: version "16.2.7" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-16.2.7.tgz#c4a635960c17b52fe774f1f40aee8ce1bd86531f" @@ -2807,13 +1603,6 @@ listr2@^9.0.5: rfdc "^1.4.1" wrap-ansi "^9.0.0" -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -2821,16 +1610,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -2847,10 +1626,10 @@ log-update@^6.1.0: strip-ansi "^7.1.0" wrap-ansi "^9.0.0" -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +lru-cache@^11.0.0: + version "11.2.6" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.6.tgz#356bf8a29e88a7a2945507b31f6429a65a192c58" + integrity sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ== lru-cache@^5.1.1: version "5.1.1" @@ -2859,6 +1638,22 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +magic-string@^0.30.21: + version "0.30.21" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + +magicast@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.5.2.tgz#70cea9df729c164485049ea5df85a390281dfb9d" + integrity sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + source-map-js "^1.2.1" + make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -2866,33 +1661,11 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-error@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - micromatch@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" @@ -2913,17 +1686,19 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - mimic-function@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^10.1.2: + version "10.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.2.tgz#6c3f289f9de66d628fa3feb1842804396a43d81c" + integrity sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw== + dependencies: + "@isaacs/brace-expansion" "^5.0.1" + +minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -2937,19 +1712,14 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.4: +minimatch@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" -minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: +minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== @@ -2964,56 +1734,25 @@ nano-spawn@^2.0.0: resolved "https://registry.yarnpkg.com/nano-spawn/-/nano-spawn-2.0.0.tgz#f1250434c09ae18870d4f729fc54b406cf85a3e1" integrity sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw== -napi-postinstall@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.2.4.tgz#419697d0288cb524623e422f919624f22a5e4028" - integrity sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg== +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +node-releases@^2.0.27: + version "2.0.27" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== -node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" +obug@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/obug/-/obug-2.1.1.tgz#2cba74ff241beb77d63055ddf4cd1e9f90b538be" + integrity sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ== onetime@^7.0.0: version "7.0.0" @@ -3022,12 +1761,12 @@ onetime@^7.0.0: dependencies: mimic-function "^5.0.0" -openapi-typescript@7.10.1: - version "7.10.1" - resolved "https://registry.yarnpkg.com/openapi-typescript/-/openapi-typescript-7.10.1.tgz#813bb63b3252e7c6d5e706c9b7fa962164604d53" - integrity sha512-rBcU8bjKGGZQT4K2ekSTY2Q5veOQbVG/lTKZ49DeCyT9z62hM2Vj/LLHjDHC9W7LJG8YMHcdXpRZDqC1ojB/lw== +openapi-typescript@7.12.0: + version "7.12.0" + resolved "https://registry.yarnpkg.com/openapi-typescript/-/openapi-typescript-7.12.0.tgz#d0049889f883f4bf6a19b4d813febe7601e85e91" + integrity sha512-dtk3h5rbILWfDEUCNgMeBHSpvVsslM0ik1psDxxlrIAJk34SDqZIbhF+qKZy6MytW7Fp+wxynq9y5S3wgJcn0g== dependencies: - "@redocly/openapi-core" "^1.34.5" + "@redocly/openapi-core" "^1.34.6" ansi-colors "^4.1.3" change-case "^5.4.4" parse-json "^8.3.0" @@ -3046,27 +1785,13 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: +p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - 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.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -3074,12 +1799,7 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json-from-dist@^1.0.0: +package-json-from-dist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== @@ -3091,16 +1811,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - 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" - parse-json@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.3.0.tgz#88a195a2157025139a2317a4f2f9252b61304ed5" @@ -3115,88 +1825,67 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== +path-scurry@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.1.tgz#4b6572376cfd8b811fca9cd1f5c24b3cbac0fe10" + integrity sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA== dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + lru-cache "^11.0.0" + minipass "^7.1.2" -picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + +picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.3.1: +picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== pidtree@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== -pirates@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" - integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@3.7.4: - version "3.7.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.7.4.tgz#d2f8335d4b1cec47e1c8098645411b0c9dff9c0f" - integrity sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA== - -pretty-format@30.0.2, pretty-format@^30.0.0: - version "30.0.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.0.2.tgz#54717b6aa2b4357a2e6d83868e10a2ea8dd647c7" - integrity sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg== - dependencies: - "@jest/schemas" "30.0.1" - ansi-styles "^5.2.0" - react-is "^18.3.1" - -pretty-format@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.2.0.tgz#2d44fe6134529aed18506f6d11509d8a62775ebe" - integrity sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA== - dependencies: - "@jest/schemas" "30.0.5" - ansi-styles "^5.2.0" - react-is "^18.3.1" +prettier@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" + integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== proxy-from-env@^1.1.0: version "1.1.0" @@ -3208,48 +1897,16 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -pure-rand@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-7.0.1.tgz#6f53a5a9e3e4a47445822af96821ca509ed37566" - integrity sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-is@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - 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.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - restore-cursor@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" @@ -3258,42 +1915,62 @@ restore-cursor@^5.0.0: onetime "^7.0.0" signal-exit "^4.1.0" -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - rfdc@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== +rimraf@6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.1.2.tgz#9a0f3cea2ab853e81291127422116ecf2a86ae89" + integrity sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g== + dependencies: + glob "^13.0.0" + package-json-from-dist "^1.0.1" + +rollup@^4.43.0: + version "4.57.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.57.1.tgz#947f70baca32db2b9c594267fe9150aa316e5a88" + integrity sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A== dependencies: - queue-microtask "^1.2.2" + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.57.1" + "@rollup/rollup-android-arm64" "4.57.1" + "@rollup/rollup-darwin-arm64" "4.57.1" + "@rollup/rollup-darwin-x64" "4.57.1" + "@rollup/rollup-freebsd-arm64" "4.57.1" + "@rollup/rollup-freebsd-x64" "4.57.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.57.1" + "@rollup/rollup-linux-arm-musleabihf" "4.57.1" + "@rollup/rollup-linux-arm64-gnu" "4.57.1" + "@rollup/rollup-linux-arm64-musl" "4.57.1" + "@rollup/rollup-linux-loong64-gnu" "4.57.1" + "@rollup/rollup-linux-loong64-musl" "4.57.1" + "@rollup/rollup-linux-ppc64-gnu" "4.57.1" + "@rollup/rollup-linux-ppc64-musl" "4.57.1" + "@rollup/rollup-linux-riscv64-gnu" "4.57.1" + "@rollup/rollup-linux-riscv64-musl" "4.57.1" + "@rollup/rollup-linux-s390x-gnu" "4.57.1" + "@rollup/rollup-linux-x64-gnu" "4.57.1" + "@rollup/rollup-linux-x64-musl" "4.57.1" + "@rollup/rollup-openbsd-x64" "4.57.1" + "@rollup/rollup-openharmony-arm64" "4.57.1" + "@rollup/rollup-win32-arm64-msvc" "4.57.1" + "@rollup/rollup-win32-ia32-msvc" "4.57.1" + "@rollup/rollup-win32-x64-gnu" "4.57.1" + "@rollup/rollup-win32-x64-msvc" "4.57.1" + fsevents "~2.3.2" semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -semver@^7.5.4, semver@^7.6.0, semver@^7.7.2: - version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -semver@^7.7.3: - version "7.7.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" - integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== +semver@^7.5.3, semver@^7.5.4, semver@^7.7.3: + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== shebang-command@^2.0.0: version "2.0.0" @@ -3307,32 +1984,16 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^4.0.1, signal-exit@^4.1.0: +signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -sinon@21.0.0: - version "21.0.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-21.0.0.tgz#dbda73abc7e6cb803fef3368cfbecbb5936e8a9e" - integrity sha512-TOgRcwFPbfGtpqvZw+hyqJDvqfapr1qUlOizROIk4bBLjlsjlB00Pg6wMFXNtJRpu+eCZuVOaLatG7M8105kAw== - dependencies: - "@sinonjs/commons" "^3.0.1" - "@sinonjs/fake-timers" "^13.0.5" - "@sinonjs/samsam" "^8.0.1" - diff "^7.0.0" - supports-color "^7.2.0" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slice-ansi@^7.1.0: version "7.1.2" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" @@ -3341,71 +2002,26 @@ slice-ansi@^7.1.0: ansi-styles "^6.2.1" is-fullwidth-code-point "^5.0.0" -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" +std-env@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== string-argv@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -string-length@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - 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.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - 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.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - 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@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - string-width@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" @@ -3416,34 +2032,13 @@ string-width@^7.0.0: strip-ansi "^7.1.0" string-width@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-8.1.0.tgz#9e9fb305174947cf45c30529414b5da916e9e8d1" - integrity sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg== + version "8.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-8.1.1.tgz#9b5aa0df72e3f232611c57fd47eb41dd97866bd3" + integrity sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw== dependencies: get-east-asian-width "^1.3.0" strip-ansi "^7.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - strip-ansi@^7.1.0: version "7.1.2" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" @@ -3451,16 +2046,6 @@ strip-ansi@^7.1.0: dependencies: ansi-regex "^6.0.1" -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -3471,40 +2056,35 @@ supports-color@^10.2.2: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-10.2.2.tgz#466c2978cc5cd0052d542a0b576461c2b802ebb4" integrity sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g== -supports-color@^7.1.0, supports-color@^7.2.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== -synckit@^0.11.8: - version "0.11.8" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.8.tgz#b2aaae998a4ef47ded60773ad06e7cb821f55457" - integrity sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A== - dependencies: - "@pkgr/core" "^0.2.4" +tinyexec@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.2.tgz#bdd2737fe2ba40bd6f918ae26642f264b99ca251" + integrity sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== +tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" + fdir "^6.5.0" + picomatch "^4.0.3" -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +tinyrainbow@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-3.0.3.tgz#984a5b1c1b25854a9b6bccbe77964d0593d1ea42" + integrity sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q== to-regex-range@^5.0.1: version "5.0.1" @@ -3513,30 +2093,10 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -ts-api-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" - integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== - -ts-jest@29.4.6: - version "29.4.6" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.6.tgz#51cb7c133f227396818b71297ad7409bb77106e9" - integrity sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA== - dependencies: - bs-logger "^0.2.6" - fast-json-stable-stringify "^2.1.0" - handlebars "^4.7.8" - json5 "^2.2.3" - lodash.memoize "^4.1.2" - make-error "^1.3.6" - semver "^7.7.3" - type-fest "^4.41.0" - yargs-parser "^21.1.1" - -tslib@^2.4.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +ts-api-utils@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8" + integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -3545,90 +2105,38 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-detect@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^4.39.1, type-fest@^4.41.0: +type-fest@^4.39.1: version "4.41.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== typescript-eslint@^8.40.0: - version "8.40.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.40.0.tgz#27541748f3ca889c9698327bdacf815f7dc61804" - integrity sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q== + version "8.55.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.55.0.tgz#abae8295c5f0f82f816218113a46e89bc30c3de2" + integrity sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw== dependencies: - "@typescript-eslint/eslint-plugin" "8.40.0" - "@typescript-eslint/parser" "8.40.0" - "@typescript-eslint/typescript-estree" "8.40.0" - "@typescript-eslint/utils" "8.40.0" + "@typescript-eslint/eslint-plugin" "8.55.0" + "@typescript-eslint/parser" "8.55.0" + "@typescript-eslint/typescript-estree" "8.55.0" + "@typescript-eslint/utils" "8.55.0" typescript@5.9.3: version "5.9.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== -uglify-js@^3.1.4: - version "3.19.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" - integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== - -undici-types@~6.19.8: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" + integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== -unrs-resolver@^1.7.11: - version "1.9.2" - resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.9.2.tgz#1a7c73335a5e510643664d7bb4bb6f5c28782e36" - integrity sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA== - dependencies: - napi-postinstall "^0.2.4" - optionalDependencies: - "@unrs/resolver-binding-android-arm-eabi" "1.9.2" - "@unrs/resolver-binding-android-arm64" "1.9.2" - "@unrs/resolver-binding-darwin-arm64" "1.9.2" - "@unrs/resolver-binding-darwin-x64" "1.9.2" - "@unrs/resolver-binding-freebsd-x64" "1.9.2" - "@unrs/resolver-binding-linux-arm-gnueabihf" "1.9.2" - "@unrs/resolver-binding-linux-arm-musleabihf" "1.9.2" - "@unrs/resolver-binding-linux-arm64-gnu" "1.9.2" - "@unrs/resolver-binding-linux-arm64-musl" "1.9.2" - "@unrs/resolver-binding-linux-ppc64-gnu" "1.9.2" - "@unrs/resolver-binding-linux-riscv64-gnu" "1.9.2" - "@unrs/resolver-binding-linux-riscv64-musl" "1.9.2" - "@unrs/resolver-binding-linux-s390x-gnu" "1.9.2" - "@unrs/resolver-binding-linux-x64-gnu" "1.9.2" - "@unrs/resolver-binding-linux-x64-musl" "1.9.2" - "@unrs/resolver-binding-wasm32-wasi" "1.9.2" - "@unrs/resolver-binding-win32-arm64-msvc" "1.9.2" - "@unrs/resolver-binding-win32-ia32-msvc" "1.9.2" - "@unrs/resolver-binding-win32-x64-msvc" "1.9.2" - -update-browserslist-db@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" - integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== +update-browserslist-db@^1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== dependencies: escalade "^3.2.0" - picocolors "^1.1.0" - -uri-js-replace@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uri-js-replace/-/uri-js-replace-1.0.1.tgz#c285bb352b701c9dfdaeffc4da5be77f936c9048" - integrity sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g== + picocolors "^1.1.1" uri-js@^4.2.2: version "4.4.1" @@ -3637,26 +2145,50 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -uuid@11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" - integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== - -v8-to-istanbul@^9.0.1: - version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" - 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" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" +uuid@13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-13.0.0.tgz#263dc341b19b4d755eb8fe36b78d95a6b65707e8" + integrity sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w== + +"vite@^6.0.0 || ^7.0.0": + version "7.3.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-7.3.1.tgz#7f6cfe8fb9074138605e822a75d9d30b814d6507" + integrity sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA== + dependencies: + esbuild "^0.27.0" + fdir "^6.5.0" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.43.0" + tinyglobby "^0.2.15" + optionalDependencies: + fsevents "~2.3.3" + +vitest@4.0.18: + version "4.0.18" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-4.0.18.tgz#56f966353eca0b50f4df7540cd4350ca6d454a05" + integrity sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ== + dependencies: + "@vitest/expect" "4.0.18" + "@vitest/mocker" "4.0.18" + "@vitest/pretty-format" "4.0.18" + "@vitest/runner" "4.0.18" + "@vitest/snapshot" "4.0.18" + "@vitest/spy" "4.0.18" + "@vitest/utils" "4.0.18" + es-module-lexer "^1.7.0" + expect-type "^1.2.2" + magic-string "^0.30.21" + obug "^2.1.1" + pathe "^2.0.3" + picomatch "^4.0.3" + std-env "^3.10.0" + tinybench "^2.9.0" + tinyexec "^1.0.2" + tinyglobby "^0.2.15" + tinyrainbow "^3.0.3" + vite "^6.0.0 || ^7.0.0" + why-is-node-running "^2.3.0" which@^2.0.1: version "2.0.2" @@ -3665,43 +2197,19 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - 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.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - wrap-ansi@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" @@ -3711,24 +2219,6 @@ wrap-ansi@^9.0.0: string-width "^7.0.0" strip-ansi "^7.1.0" -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" - integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^4.0.1" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -3740,28 +2230,15 @@ yaml-ast-parser@0.0.43: integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== yaml@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" - integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== + version "2.8.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" + integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - 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" - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"