From 1b39e345b66918fd6fe71dbb76c3fd280a51b71e Mon Sep 17 00:00:00 2001 From: orangecoding Date: Mon, 16 Mar 2026 14:26:58 +0100 Subject: [PATCH] moving from jest to vitest --- eslint.config.js | 5 +- package.json | 16 +- test/backup/backupRestoreService.test.js | 63 +- test/db/migrations/migrate.test.js | 94 +- test/esmock-loader.mjs | 5 +- test/pipeline_filtering.test.js | 6 +- test/provider/einsAImmobilien.test.js | 26 +- test/provider/immobilienDe.test.js | 30 +- test/provider/immoscout.test.js | 26 +- test/provider/immoswp.test.js | 24 +- test/provider/immowelt.test.js | 26 +- test/provider/kleinanzeigen.test.js | 22 +- test/provider/mcMakler.test.js | 26 +- test/provider/neubauKompass.test.js | 22 +- test/provider/ohneMakler.test.js | 26 +- test/provider/regionalimmobilien24.test.js | 26 +- test/provider/sparkasse.test.js | 25 +- test/provider/testProvider.json | 2 +- test/provider/utils.test.js | 18 +- test/provider/wgGesucht.test.js | 18 +- test/provider/wohnungsboerse.test.js | 26 +- .../queryStringMutator.test.js | 6 +- test/services/extractor/botPrevention.test.js | 49 +- .../immoscout-web-translator.test.js | 24 +- .../services/jobs/jobExecutionService.test.js | 81 +- test/similarity/similarityCache.test.js | 33 +- test/storage/SqliteConnection.test.js | 38 +- test/utils.js | 31 +- test/utils/utils.test.js | 8 +- vitest.config.js | 16 + vitest.gh.config.js | 21 + yarn.lock | 889 ++++++++++++------ 32 files changed, 991 insertions(+), 737 deletions(-) create mode 100644 vitest.config.js create mode 100644 vitest.gh.config.js diff --git a/eslint.config.js b/eslint.config.js index 29c93e2..5216193 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -25,12 +25,15 @@ export default [ globals: { ...globals.browser, ...globals.node, - ...globals.mocha, + ...globals.jest, Promise: 'readonly', fetch: 'readonly', describe: 'readonly', after: 'readonly', it: 'readonly', + beforeEach: 'readonly', + afterEach: 'readonly', + vi: 'readonly', }, }, plugins: { react }, diff --git a/package.json b/package.json index 62a2f3f..3553f27 100755 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "build:frontend": "vite build", "format": "prettier --write \"**/*.js\"", "format:check": "prettier --check \"**/*.js\"", - "test": "node --import ./test/esmock-loader.mjs ./node_modules/mocha/bin/mocha.js --timeout 60000 test/**/*.test.js", - "testGH": "node --import ./test/esmock-loader.mjs ./node_modules/mocha/bin/mocha.js --timeout 60000 --exclude test/provider/immonet.test.js --exclude test/provider/immobilienDe.test.js --exclude test/provider/immowelt.test.js test/**/*.test.js", + "test": "vitest run", + "testGH": "vitest run --config vitest.gh.config.js", "lint": "eslint .", "mcp:stdio": "node lib/mcp/stdio.js", "lint:fix": "yarn lint --fix", @@ -65,15 +65,15 @@ "@douyinfe/semi-ui": "2.93.0", "@douyinfe/semi-ui-19": "^2.93.0", "@mapbox/mapbox-gl-draw": "^1.5.1", - "@sendgrid/mail": "8.1.6", - "@vitejs/plugin-react": "6.0.1", "@modelcontextprotocol/sdk": "^1.27.1", + "@sendgrid/mail": "8.1.6", + "@turf/boolean-point-in-polygon": "^7.3.4", + "@vitejs/plugin-react": "6.0.1", "adm-zip": "^0.5.16", "better-sqlite3": "^12.8.0", "body-parser": "2.2.2", "chart.js": "^4.5.1", "cheerio": "^1.2.0", - "@turf/boolean-point-in-polygon": "^7.3.4", "cookie-session": "2.1.1", "handlebars": "4.7.8", "lodash": "4.17.23", @@ -109,19 +109,17 @@ "@babel/preset-env": "7.29.0", "@babel/preset-react": "7.28.5", "@eslint/js": "^10.0.1", - "chai": "6.2.2", "chalk": "^5.6.2", "eslint": "10.0.3", "eslint-config-prettier": "10.1.8", "eslint-plugin-react": "7.37.5", - "esmock": "2.7.3", "globals": "^17.4.0", "history": "5.3.0", "husky": "9.1.7", "less": "4.6.4", "lint-staged": "16.4.0", - "mocha": "11.7.5", "nodemon": "^3.1.14", - "prettier": "3.8.1" + "prettier": "3.8.1", + "vitest": "^3.2.0" } } diff --git a/test/backup/backupRestoreService.test.js b/test/backup/backupRestoreService.test.js index a9a7d9a..d343d12 100644 --- a/test/backup/backupRestoreService.test.js +++ b/test/backup/backupRestoreService.test.js @@ -3,8 +3,7 @@ * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ -import { expect } from 'chai'; -import esmock from 'esmock'; +import { vi, describe, it, expect, beforeEach } from 'vitest'; describe('services/storage/backupRestoreService.js - precheck & filename', () => { let svc; @@ -14,7 +13,7 @@ describe('services/storage/backupRestoreService.js - precheck & filename', () => beforeEach(async () => { calls = { logger: { info: [], warn: [], error: [] } }; - // Mock AdmZip with configurable state via globalThis (avoid esmock export name pitfalls) + // Mock AdmZip with configurable state via globalThis (avoid mock export name pitfalls) globalThis.__ADM_ZIP_STATE__ = { hasDb: false, meta: null }; setZipState = (s) => { globalThis.__ADM_ZIP_STATE__ = { ...globalThis.__ADM_ZIP_STATE__, ...s }; @@ -77,67 +76,61 @@ describe('services/storage/backupRestoreService.js - precheck & filename', () => const utilsMock = { getPackageVersion: async () => '16.2.0' }; - const admZipPath = path.join(ROOT, 'node_modules', 'adm-zip', 'adm-zip.js'); - const mod = await esmock( - path.join(ROOT, 'lib', 'services', 'storage', 'backupRestoreService.js'), - {}, - { - 'adm-zip': admZipMock, - [admZipPath]: admZipMock, - [migratePath]: migrateMock, - [sqlitePath]: sqliteMock, - [loggerPath]: loggerMock, - [utilsPath]: utilsMock, - }, - ); + vi.resetModules(); + vi.doMock('adm-zip', () => admZipMock); + vi.doMock(migratePath, () => migrateMock); + vi.doMock(sqlitePath, () => sqliteMock); + vi.doMock(loggerPath, () => loggerMock); + vi.doMock(utilsPath, () => utilsMock); + const mod = await import(path.join(ROOT, 'lib', 'services', 'storage', 'backupRestoreService.js')); svc = mod; }); it('precheck: empty upload yields danger', async () => { const res = await svc.precheckRestore(Buffer.alloc(0)); - expect(res.compatible).to.equal(false); - expect(res.severity).to.equal('danger'); - expect(res.message).to.contain('Empty upload'); - expect(res.requiredMigration).to.equal(10); + expect(res.compatible).toBe(false); + expect(res.severity).toBe('danger'); + expect(res.message).toContain('Empty upload'); + expect(res.requiredMigration).toBe(10); }); it('precheck: missing listings.db yields danger', async () => { setZipState({ hasDb: false, meta: { dbMigration: 9 } }); const res = await svc.precheckRestore(Buffer.from('dummy')); - expect(res.compatible).to.equal(false); - expect(res.severity).to.equal('danger'); - expect(res.message).to.match(/missing the database file/i); + expect(res.compatible).toBe(false); + expect(res.severity).toBe('danger'); + expect(res.message).toMatch(/missing the database file/i); }); it('precheck: older backup is compatible with warning', async () => { setZipState({ hasDb: true, meta: { dbMigration: 5, fredyVersion: '16.0.0' } }); const res = await svc.precheckRestore(Buffer.from('zip')); - expect(res.compatible).to.equal(true); - expect(res.severity).to.equal('warning'); - expect(res.message).to.match(/automatic migrations/i); - expect(res.backupMigration).to.equal(5); - expect(res.requiredMigration).to.equal(10); + expect(res.compatible).toBe(true); + expect(res.severity).toBe('warning'); + expect(res.message).toMatch(/automatic migrations/i); + expect(res.backupMigration).toBe(5); + expect(res.requiredMigration).toBe(10); }); it('precheck: equal backup is compatible with info', async () => { setZipState({ hasDb: true, meta: { dbMigration: 10 } }); const res = await svc.precheckRestore(Buffer.from('zip')); - expect(res.compatible).to.equal(true); - expect(res.severity).to.equal('info'); + expect(res.compatible).toBe(true); + expect(res.severity).toBe('info'); }); it('precheck: newer backup yields danger', async () => { setZipState({ hasDb: true, meta: { dbMigration: 11 } }); const res = await svc.precheckRestore(Buffer.from('zip')); - expect(res.compatible).to.equal(false); - expect(res.severity).to.equal('danger'); + expect(res.compatible).toBe(false); + expect(res.severity).toBe('danger'); }); it('buildBackupFileName: matches pattern and includes version', async () => { const name = await svc.buildBackupFileName(); - expect(name).to.match(/^\d{4}-\d{2}-\d{2}-FredyBackup-/); - expect(name).to.include('16.2.0'); - expect(name).to.match(/\.zip$/); + expect(name).toMatch(/^\d{4}-\d{2}-\d{2}-FredyBackup-/); + expect(name).toContain('16.2.0'); + expect(name).toMatch(/\.zip$/); }); }); diff --git a/test/db/migrations/migrate.test.js b/test/db/migrations/migrate.test.js index b57d083..93fdd8b 100644 --- a/test/db/migrations/migrate.test.js +++ b/test/db/migrations/migrate.test.js @@ -3,8 +3,7 @@ * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ -import { expect } from 'chai'; -import esmock from 'esmock'; +import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest'; // We will fully mock fs, crypto, SqliteConnection, and dynamic import of migration modules @@ -85,22 +84,18 @@ describe('db/migrations/migrate.js - runMigrations', () => { }, }; - // esmock with dependency replacements const path = await import('node:path'); const ROOT = path.resolve('.'); const sqlPath = path.join(ROOT, 'lib', 'services', 'storage', 'SqliteConnection.js'); const loggerPath = path.join(ROOT, 'lib', 'services', 'logger.js'); - const mod = await esmock( - '../../../db/migrations/migrate.js', - {}, - { - fs: fsMock, - crypto: cryptoMock, - [sqlPath]: sqlMock, - [loggerPath]: loggerMock, - }, - ); + vi.resetModules(); + vi.doMock('fs', () => ({ default: fsMock, ...fsMock })); + vi.doMock('crypto', () => ({ default: cryptoMock, ...cryptoMock })); + vi.doMock(sqlPath, () => ({ default: sqlMock })); + vi.doMock(loggerPath, () => ({ default: loggerMock })); + + const mod = await import('../../../lib/services/storage/migrations/migrate.js'); runMigrations = mod.runMigrations; // remember original exitCode to restore later @@ -114,9 +109,9 @@ describe('db/migrations/migrate.js - runMigrations', () => { it('logs and returns when no migration files are found', async () => { await runMigrations(); - expect(calls.logs.info.some((a) => String(a[0]).includes('No migration files'))).to.equal(true); - expect(calls.sql.getConnection).to.equal(0); - expect(calls.sql.optimize).to.equal(0); + expect(calls.logs.info.some((a) => String(a[0]).includes('No migration files'))).toBe(true); + expect(calls.sql.getConnection).toBe(0); + expect(calls.sql.optimize).toBe(0); }); it('applies a single new migration inside a transaction and records it', async () => { @@ -165,11 +160,6 @@ describe('db/migrations/migrate.js - runMigrations', () => { }, }; - // We need to intercept dynamic import by esmock: provide a stub for import(url) - // esmock supports mocking via a virtual module using URL matching, but simpler approach: - // place the file path that migrate.js will compute and make Node import resolve to our stub - // We simulate by mocking url.pathToFileURL is still used, but dynamic import will be handled by esmock when we map the computed path. - const path = await import('node:path'); const ROOT = path.resolve('.'); @@ -178,26 +168,22 @@ describe('db/migrations/migrate.js - runMigrations', () => { // Use global importer hook to bypass dynamic import globalThis.__TEST_MIGRATE_IMPORT__ = async () => migrationModule; - const mod = await esmock( - '../../../db/migrations/migrate.js', - {}, - { - fs: fsMock, - crypto: cryptoMock, - [sqlPath]: sqlMock, - [loggerPath]: loggerMock, - }, - ); + vi.resetModules(); + vi.doMock('fs', () => ({ default: fsMock, ...fsMock })); + vi.doMock('crypto', () => ({ default: cryptoMock, ...cryptoMock })); + vi.doMock(sqlPath, () => ({ default: sqlMock })); + vi.doMock(loggerPath, () => ({ default: loggerMock })); + const mod = await import('../../../lib/services/storage/migrations/migrate.js'); runMigrations = mod.runMigrations; await runMigrations(); // Should have started a transaction and inserted into schema_migrations - expect(calls.sql.withTransaction.length).to.equal(1); + expect(calls.sql.withTransaction.length).toBe(1); const inserted = calls.sql.execute.find((e) => String(e.sql).includes('INSERT INTO schema_migrations')); - expect(!!inserted).to.equal(true); - expect(calls.sql.optimize).to.equal(1); + expect(!!inserted).toBe(true); + expect(calls.sql.optimize).toBe(1); }); it('skips already executed migration with same checksum', async () => { @@ -242,24 +228,20 @@ describe('db/migrations/migrate.js - runMigrations', () => { globalThis.__TEST_MIGRATE_IMPORT__ = async () => ({ up: () => {} }); - const mod = await esmock( - '../../../db/migrations/migrate.js', - {}, - { - fs: fsMock, - crypto: cryptoMock, - [sqlPath]: sqlMock, - [loggerPath]: loggerMock, - }, - ); + vi.resetModules(); + vi.doMock('fs', () => ({ default: fsMock, ...fsMock })); + vi.doMock('crypto', () => ({ default: cryptoMock, ...cryptoMock })); + vi.doMock(sqlPath, () => ({ default: sqlMock })); + vi.doMock(loggerPath, () => ({ default: loggerMock })); + const mod = await import('../../../lib/services/storage/migrations/migrate.js'); runMigrations = mod.runMigrations; await runMigrations(); // Should not run transaction because it's skipped - expect(calls.sql.withTransaction.length).to.equal(0); - expect(calls.sql.optimize).to.equal(1); + expect(calls.sql.withTransaction.length).toBe(0); + expect(calls.sql.optimize).toBe(1); }); it('aborts with exitCode=1 when a migration throws, without applying insert', async () => { @@ -311,24 +293,20 @@ describe('db/migrations/migrate.js - runMigrations', () => { const sqlPath = path.join(ROOT, 'lib', 'services', 'storage', 'SqliteConnection.js'); const loggerPath = path.join(ROOT, 'lib', 'services', 'logger.js'); - const mod = await esmock( - '../../../lib/services/storage/migrations/migrate.js', - {}, - { - fs: fsMock, - crypto: cryptoMock, - [sqlPath]: sqlMock, - [loggerPath]: loggerMock, - }, - ); + vi.resetModules(); + vi.doMock('fs', () => ({ default: fsMock, ...fsMock })); + vi.doMock('crypto', () => ({ default: cryptoMock, ...cryptoMock })); + vi.doMock(sqlPath, () => ({ default: sqlMock })); + vi.doMock(loggerPath, () => ({ default: loggerMock })); + const mod = await import('../../../lib/services/storage/migrations/migrate.js'); runMigrations = mod.runMigrations; await runMigrations(); - expect(process.exitCode).to.equal(1); + expect(process.exitCode).toBe(1); // No insert into schema_migrations should be recorded since transaction failed const inserted = calls.sql.execute.find((e) => String(e.sql).includes('INSERT INTO schema_migrations')); - expect(inserted).to.equal(undefined); + expect(inserted).toBe(undefined); }); }); diff --git a/test/esmock-loader.mjs b/test/esmock-loader.mjs index 63485e2..822ad04 100644 --- a/test/esmock-loader.mjs +++ b/test/esmock-loader.mjs @@ -1,4 +1 @@ -import { register } from 'node:module'; -import { pathToFileURL } from 'node:url'; - -register('esmock', pathToFileURL('./')); \ No newline at end of file +// No longer needed - using vitest diff --git a/test/pipeline_filtering.test.js b/test/pipeline_filtering.test.js index aae6704..83aff97 100644 --- a/test/pipeline_filtering.test.js +++ b/test/pipeline_filtering.test.js @@ -3,7 +3,7 @@ * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ -import { expect } from 'chai'; +import { expect } from 'vitest'; import { mockFredy } from './utils.js'; import * as mockStore from './mocks/mockStore.js'; @@ -34,7 +34,7 @@ describe('Issue reproduction: listings filtered by similarity or area should be // Might throw NoNewListingsWarning if all are filtered out } - expect(mockStore.deletedIds).to.include('1'); + expect(mockStore.deletedIds).toContain('1'); }); it('should call deleteListingsById when listings are filtered by area', async () => { @@ -84,6 +84,6 @@ describe('Issue reproduction: listings filtered by similarity or area should be // Might throw NoNewListingsWarning if all are filtered out } - expect(mockStore.deletedIds).to.include('2'); + expect(mockStore.deletedIds).toContain('2'); }); }); diff --git a/test/provider/einsAImmobilien.test.js b/test/provider/einsAImmobilien.test.js index e0ebb02..1ee6792 100644 --- a/test/provider/einsAImmobilien.test.js +++ b/test/provider/einsAImmobilien.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { providerConfig, mockFredy } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/einsAImmobilien.js'; describe('#einsAImmobilien testsuite()', () => { @@ -23,22 +23,22 @@ describe('#einsAImmobilien testsuite()', () => { similarityCache, ); fredy.execute().then((listings) => { - expect(listings).to.be.a('array'); + expect(listings).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('einsAImmobilien'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('einsAImmobilien'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.size).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.size).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.size).to.be.not.empty; - expect(notify.title).to.be.not.empty; - expect(notify.link).that.does.include('https://www.1a-immobilienmarkt.de'); + expect(notify.size).not.toBe(''); + expect(notify.title).not.toBe(''); + expect(notify.link).toContain('https://www.1a-immobilienmarkt.de'); }); resolve(); }); diff --git a/test/provider/immobilienDe.test.js b/test/provider/immobilienDe.test.js index a17485c..078377a 100644 --- a/test/provider/immobilienDe.test.js +++ b/test/provider/immobilienDe.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { providerConfig, mockFredy } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/immobilienDe.js'; describe('#immobilien.de testsuite()', () => { @@ -16,24 +16,24 @@ describe('#immobilien.de testsuite()', () => { return await new Promise((resolve) => { const fredy = new Fredy(provider.config, null, null, provider.metaInformation.id, 'test1', similarityCache); fredy.execute().then((listing) => { - expect(listing).to.be.a('array'); + expect(listing).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('immobilienDe'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('immobilienDe'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.size).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.size).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.price).that.does.include('€'); - expect(notify.size).that.does.include('m²'); - expect(notify.title).to.be.not.empty; - expect(notify.link).that.does.include('https://www.immobilien.de'); - expect(notify.address).to.be.not.empty; + expect(notify.price).toContain('€'); + expect(notify.size).toContain('m²'); + expect(notify.title).not.toBe(''); + expect(notify.link).toContain('https://www.immobilien.de'); + expect(notify.address).not.toBe(''); }); resolve(); }); diff --git a/test/provider/immoscout.test.js b/test/provider/immoscout.test.js index 29b12e8..3067c61 100644 --- a/test/provider/immoscout.test.js +++ b/test/provider/immoscout.test.js @@ -3,7 +3,7 @@ * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { mockFredy, providerConfig } from '../utils.js'; import { get } from '../mocks/mockNotification.js'; @@ -16,22 +16,22 @@ describe('#immoscout provider testsuite()', () => { return await new Promise((resolve) => { const fredy = new Fredy(provider.config, null, null, provider.metaInformation.id, '', similarityCache); fredy.execute().then((listings) => { - expect(listings).to.be.a('array'); + expect(listings).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('immoscout'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('immoscout'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.size).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.size).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.size).to.be.not.empty; - expect(notify.title).to.be.not.empty; - expect(notify.link).that.does.include('https://www.immobilienscout24.de/'); + expect(notify.size).not.toBe(''); + expect(notify.title).not.toBe(''); + expect(notify.link).toContain('https://www.immobilienscout24.de/'); }); resolve(); }); diff --git a/test/provider/immoswp.test.js b/test/provider/immoswp.test.js index 8f34d3b..dbf2d60 100644 --- a/test/provider/immoswp.test.js +++ b/test/provider/immoswp.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { mockFredy, providerConfig } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/immoswp.js'; describe('#immoswp testsuite()', () => { @@ -16,21 +16,21 @@ describe('#immoswp testsuite()', () => { return await new Promise((resolve) => { const fredy = new Fredy(provider.config, null, null, provider.metaInformation.id, 'immoswp', similarityCache); fredy.execute().then((listing) => { - expect(listing).to.be.a('array'); + expect(listing).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('immoswp'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('immoswp'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.size).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.size).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.price).that.does.include('€'); - expect(notify.title).to.be.not.empty; - expect(notify.link).that.does.include('https://immo.swp.de'); + expect(notify.price).toContain('€'); + expect(notify.title).not.toBe(''); + expect(notify.link).toContain('https://immo.swp.de'); }); resolve(); }); diff --git a/test/provider/immowelt.test.js b/test/provider/immowelt.test.js index 9e5a034..ad2fe13 100644 --- a/test/provider/immowelt.test.js +++ b/test/provider/immowelt.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { mockFredy, providerConfig } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/immowelt.js'; describe('#immowelt testsuite()', () => { @@ -17,24 +17,24 @@ describe('#immowelt testsuite()', () => { const fredy = new Fredy(provider.config, null, null, provider.metaInformation.id, 'immowelt', similarityCache); const listing = await fredy.execute(); - expect(listing).to.be.a('array'); + expect(listing).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('immowelt'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('immowelt'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ if (notify.size != null && notify.size.trim().toLowerCase() !== 'k.a.') { - expect(notify.size).that.does.include('m²'); + expect(notify.size).toContain('m²'); } - expect(notify.title).to.be.not.empty; - expect(notify.link).that.does.include('https://www.immowelt.de'); - expect(notify.address).to.be.not.empty; + expect(notify.title).not.toBe(''); + expect(notify.link).toContain('https://www.immowelt.de'); + expect(notify.address).not.toBe(''); }); }); }); diff --git a/test/provider/kleinanzeigen.test.js b/test/provider/kleinanzeigen.test.js index 628cadf..d7dd082 100644 --- a/test/provider/kleinanzeigen.test.js +++ b/test/provider/kleinanzeigen.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { mockFredy, providerConfig } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/kleinanzeigen.js'; describe('#kleinanzeigen testsuite()', () => { @@ -23,20 +23,20 @@ describe('#kleinanzeigen testsuite()', () => { similarityCache, ); fredy.execute().then((listing) => { - expect(listing).to.be.a('array'); + expect(listing).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('kleinanzeigen'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('kleinanzeigen'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.title).to.be.not.empty; - expect(notify.link).that.does.include('https://www.kleinanzeigen.de'); - expect(notify.address).to.be.not.empty; + expect(notify.title).not.toBe(''); + expect(notify.link).toContain('https://www.kleinanzeigen.de'); + expect(notify.address).not.toBe(''); }); resolve(); }); diff --git a/test/provider/mcMakler.test.js b/test/provider/mcMakler.test.js index d35414f..21bacdc 100644 --- a/test/provider/mcMakler.test.js +++ b/test/provider/mcMakler.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { mockFredy, providerConfig } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/mcMakler.js'; describe('#mcMakler testsuite()', () => { @@ -17,22 +17,22 @@ describe('#mcMakler testsuite()', () => { const fredy = new Fredy(provider.config, null, null, provider.metaInformation.id, 'mcMakler', similarityCache); const listing = await fredy.execute(); - expect(listing).to.be.a('array'); + expect(listing).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('mcMakler'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('mcMakler'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.size).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.size).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.size).that.does.include('m²'); - expect(notify.title).to.be.not.empty; - expect(notify.address).to.be.not.empty; + expect(notify.size).toContain('m²'); + expect(notify.title).not.toBe(''); + expect(notify.address).not.toBe(''); }); }); }); diff --git a/test/provider/neubauKompass.test.js b/test/provider/neubauKompass.test.js index 1182bb2..08110e1 100644 --- a/test/provider/neubauKompass.test.js +++ b/test/provider/neubauKompass.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { mockFredy, providerConfig } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/neubauKompass.js'; describe('#neubauKompass testsuite()', () => { @@ -23,20 +23,20 @@ describe('#neubauKompass testsuite()', () => { similarityCache, ); fredy.execute().then((listing) => { - expect(listing).to.be.a('array'); + expect(listing).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj.serviceName).to.equal('neubauKompass'); + expect(notificationObj.serviceName).toBe('neubauKompass'); notificationObj.payload.forEach((notify) => { - expect(notify).to.be.a('object'); + expect(notify).toBeTypeOf('object'); /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.title).to.be.not.empty; - expect(notify.link).that.does.include('https://www.neubaukompass.de'); - expect(notify.address).to.be.not.empty; + expect(notify.title).not.toBe(''); + expect(notify.link).toContain('https://www.neubaukompass.de'); + expect(notify.address).not.toBe(''); }); resolve(); }); diff --git a/test/provider/ohneMakler.test.js b/test/provider/ohneMakler.test.js index eec70f0..060efa6 100644 --- a/test/provider/ohneMakler.test.js +++ b/test/provider/ohneMakler.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { mockFredy, providerConfig } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/ohneMakler.js'; describe('#ohneMakler testsuite()', () => { @@ -17,22 +17,22 @@ describe('#ohneMakler testsuite()', () => { const fredy = new Fredy(provider.config, null, null, provider.metaInformation.id, 'ohneMakler', similarityCache); const listing = await fredy.execute(); - expect(listing).to.be.a('array'); + expect(listing).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('ohneMakler'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('ohneMakler'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.size).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.size).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.size).that.does.include('m²'); - expect(notify.title).to.be.not.empty; - expect(notify.address).to.be.not.empty; + expect(notify.size).toContain('m²'); + expect(notify.title).not.toBe(''); + expect(notify.address).not.toBe(''); }); }); }); diff --git a/test/provider/regionalimmobilien24.test.js b/test/provider/regionalimmobilien24.test.js index 2a4dfd9..61166b3 100644 --- a/test/provider/regionalimmobilien24.test.js +++ b/test/provider/regionalimmobilien24.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { mockFredy, providerConfig } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/regionalimmobilien24.js'; describe('#regionalimmobilien24 testsuite()', () => { @@ -24,22 +24,22 @@ describe('#regionalimmobilien24 testsuite()', () => { ); const listing = await fredy.execute(); - expect(listing).to.be.a('array'); + expect(listing).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('regionalimmobilien24'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('regionalimmobilien24'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.size).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.size).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.size).that.does.include('m²'); - expect(notify.title).to.be.not.empty; - expect(notify.address).to.be.not.empty; + expect(notify.size).toContain('m²'); + expect(notify.title).not.toBe(''); + expect(notify.address).not.toBe(''); }); }); }); diff --git a/test/provider/sparkasse.test.js b/test/provider/sparkasse.test.js index 875f8af..1b13904 100644 --- a/test/provider/sparkasse.test.js +++ b/test/provider/sparkasse.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { mockFredy, providerConfig } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/sparkasse.js'; describe('#sparkasse testsuite()', () => { @@ -17,22 +17,21 @@ describe('#sparkasse testsuite()', () => { const fredy = new Fredy(provider.config, null, null, provider.metaInformation.id, 'sparkasse', similarityCache); const listing = await fredy.execute(); - expect(listing).to.be.a('array'); + expect(listing).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('sparkasse'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('sparkasse'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.size).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.size).that.does.include('m²'); - expect(notify.title).to.be.not.empty; - expect(notify.address).to.be.not.empty; + expect(notify.size).toContain('m²'); + expect(notify.title).not.toBe(''); + expect(notify.address).not.toBe(''); }); }); }); diff --git a/test/provider/testProvider.json b/test/provider/testProvider.json index d307ef1..5ebcaeb 100644 --- a/test/provider/testProvider.json +++ b/test/provider/testProvider.json @@ -41,7 +41,7 @@ "enabled": true }, "sparkasse": { - "url": "https://immobilien.sparkasse.de/immobilien/treffer?marketingType=buy&objectType=flat&perimeter=10&usageType=residential&zipCityEstateId=62782__Hamburg", + "url": "https://immobilien.sparkasse.de/immobilien/treffer?estateTypeGroupingId=403&marketingType=buy&perimeter=10&usageType=residential&zipCityEstateId=51.22422%2F6.78006%2F0__D%C3%BCsseldorf", "enabled": true }, "wgGesucht": { diff --git a/test/provider/utils.test.js b/test/provider/utils.test.js index 0fc6bfe..de8d9d4 100644 --- a/test/provider/utils.test.js +++ b/test/provider/utils.test.js @@ -5,7 +5,7 @@ import { isOneOf, duringWorkingHoursOrNotSet } from '../../lib/utils.js'; import assert from 'assert'; -import { expect } from 'chai'; +import { expect } from 'vitest'; const fakeWorkingHoursConfig = (from, to) => ({ workingHours: { @@ -25,19 +25,19 @@ describe('utils', () => { }); describe('#duringWorkingHoursOrNotSet()', () => { it('should be false', () => { - expect(duringWorkingHoursOrNotSet(fakeWorkingHoursConfig('12:00', '13:00'), 0)).to.be.false; + expect(duringWorkingHoursOrNotSet(fakeWorkingHoursConfig('12:00', '13:00'), 0)).toBe(false); }); it('should be true', () => { - expect(duringWorkingHoursOrNotSet(fakeWorkingHoursConfig('10:00', '16:00'), 1622026740000)).to.be.true; + expect(duringWorkingHoursOrNotSet(fakeWorkingHoursConfig('10:00', '16:00'), 1622026740000)).toBe(true); }); it('should be true if nothing set', () => { - expect(duringWorkingHoursOrNotSet(fakeWorkingHoursConfig(null, null), 1622026740000)).to.be.true; + expect(duringWorkingHoursOrNotSet(fakeWorkingHoursConfig(null, null), 1622026740000)).toBe(true); }); it('should be true if only to is set', () => { - expect(duringWorkingHoursOrNotSet(fakeWorkingHoursConfig(null, '13:00'), 1622026740000)).to.be.true; + expect(duringWorkingHoursOrNotSet(fakeWorkingHoursConfig(null, '13:00'), 1622026740000)).toBe(true); }); it('should be true if only from is set', () => { - expect(duringWorkingHoursOrNotSet(fakeWorkingHoursConfig('12:00', null), 1622026740000)).to.be.true; + expect(duringWorkingHoursOrNotSet(fakeWorkingHoursConfig('12:00', null), 1622026740000)).toBe(true); }); it('should handle working hours that cross midnight (e.g., 05:00 → 00:30)', () => { const cfg = fakeWorkingHoursConfig('05:00', '00:30'); @@ -49,9 +49,9 @@ describe('utils', () => { d.setMilliseconds(0); return d.getTime(); }; - expect(duringWorkingHoursOrNotSet(cfg, mkTs(23, 0))).to.be.true; // 23:00 => within window - expect(duringWorkingHoursOrNotSet(cfg, mkTs(1, 0))).to.be.false; // 01:00 => outside window - expect(duringWorkingHoursOrNotSet(cfg, mkTs(6, 0))).to.be.true; // 06:00 => within window + expect(duringWorkingHoursOrNotSet(cfg, mkTs(23, 0))).toBe(true); // 23:00 => within window + expect(duringWorkingHoursOrNotSet(cfg, mkTs(1, 0))).toBe(false); // 01:00 => outside window + expect(duringWorkingHoursOrNotSet(cfg, mkTs(6, 0))).toBe(true); // 06:00 => within window }); }); }); diff --git a/test/provider/wgGesucht.test.js b/test/provider/wgGesucht.test.js index ad1ca9c..110d669 100644 --- a/test/provider/wgGesucht.test.js +++ b/test/provider/wgGesucht.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { mockFredy, providerConfig } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/wgGesucht.js'; describe('#wgGesucht testsuite()', () => { @@ -16,17 +16,17 @@ describe('#wgGesucht testsuite()', () => { return await new Promise((resolve) => { const fredy = new Fredy(provider.config, null, null, provider.metaInformation.id, 'wgGesucht', similarityCache); fredy.execute().then((listing) => { - expect(listing).to.be.a('array'); + expect(listing).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj.serviceName).to.equal('wgGesucht'); + expect(notificationObj.serviceName).toBe('wgGesucht'); notificationObj.payload.forEach((notify) => { - expect(notify).to.be.a('object'); + expect(notify).toBeTypeOf('object'); /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.details).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.link).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.details).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); }); resolve(); }); diff --git a/test/provider/wohnungsboerse.test.js b/test/provider/wohnungsboerse.test.js index 2f27072..138950b 100644 --- a/test/provider/wohnungsboerse.test.js +++ b/test/provider/wohnungsboerse.test.js @@ -6,7 +6,7 @@ import * as similarityCache from '../../lib/services/similarity-check/similarityCache.js'; import { get } from '../mocks/mockNotification.js'; import { providerConfig, mockFredy } from '../utils.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import * as provider from '../../lib/provider/wohnungsboerse.js'; describe('#wohnungsboerse testsuite()', () => { @@ -23,22 +23,22 @@ describe('#wohnungsboerse testsuite()', () => { similarityCache, ); fredy.execute().then((listings) => { - expect(listings).to.be.a('array'); + expect(listings).toBeInstanceOf(Array); const notificationObj = get(); - expect(notificationObj).to.be.a('object'); - expect(notificationObj.serviceName).to.equal('wohnungsboerse'); + expect(notificationObj).toBeTypeOf('object'); + expect(notificationObj.serviceName).toBe('wohnungsboerse'); notificationObj.payload.forEach((notify) => { /** check the actual structure **/ - expect(notify.id).to.be.a('string'); - expect(notify.price).to.be.a('string'); - expect(notify.size).to.be.a('string'); - expect(notify.title).to.be.a('string'); - expect(notify.link).to.be.a('string'); - expect(notify.address).to.be.a('string'); + expect(notify.id).toBeTypeOf('string'); + expect(notify.price).toBeTypeOf('string'); + expect(notify.size).toBeTypeOf('string'); + expect(notify.title).toBeTypeOf('string'); + expect(notify.link).toBeTypeOf('string'); + expect(notify.address).toBeTypeOf('string'); /** check the values if possible **/ - expect(notify.size).to.be.not.empty; - expect(notify.title).to.be.not.empty; - expect(notify.link).that.does.include('https://www.wohnungsboerse.net'); + expect(notify.size).not.toBe(''); + expect(notify.title).not.toBe(''); + expect(notify.link).toContain('https://www.wohnungsboerse.net'); }); resolve(); }); diff --git a/test/queryStringMutator/queryStringMutator.test.js b/test/queryStringMutator/queryStringMutator.test.js index cc3dc0b..f0c0a91 100644 --- a/test/queryStringMutator/queryStringMutator.test.js +++ b/test/queryStringMutator/queryStringMutator.test.js @@ -4,7 +4,7 @@ */ import fs from 'fs'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import { readFile } from 'fs/promises'; import mutator from '../../lib/services/queryStringMutator.js'; import queryString from 'query-string'; @@ -33,8 +33,8 @@ describe('queryStringMutator', () => { const expectedParams = queryString.parseUrl(test.shouldBecome); const actualParams = queryString.parseUrl(fixedUrl); //check if all new params are existing - expect(Object.keys(expectedParams.query)).to.include.members(Object.keys(actualParams.query)); - expect(Object.values(expectedParams.query)).to.include.members(Object.values(actualParams.query)); + expect(Object.keys(expectedParams.query)).toEqual(expect.arrayContaining(Object.keys(actualParams.query))); + expect(Object.values(expectedParams.query)).toEqual(expect.arrayContaining(Object.values(actualParams.query))); } }); }); diff --git a/test/services/extractor/botPrevention.test.js b/test/services/extractor/botPrevention.test.js index 7f036f5..46af4ff 100644 --- a/test/services/extractor/botPrevention.test.js +++ b/test/services/extractor/botPrevention.test.js @@ -3,8 +3,7 @@ * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ -import { describe, it } from 'mocha'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import { getPreLaunchConfig, @@ -26,16 +25,16 @@ describe('botPrevention helper', () => { }; const cfg = getPreLaunchConfig(url, options); - expect(cfg.acceptLanguage).to.equal('de-DE,de;q=0.9'); - expect(cfg.langArg).to.equal('--lang=de-DE'); - expect(cfg.windowSizeArg).to.equal('--window-size=1200,700'); - expect(cfg.viewport).to.deep.equal({ width: 1200, height: 700, deviceScaleFactor: 2 }); - expect(cfg.userAgent).to.equal('TestAgent/1.0'); - expect(cfg.headers['Accept-Language']).to.equal('de-DE,de;q=0.9'); - expect(cfg.headers['User-Agent']).to.equal('TestAgent/1.0'); - expect(cfg.headers.Referer).to.equal('https://example.com/ref'); - expect(cfg.extraArgs).to.include('--disable-blink-features=AutomationControlled'); - expect(cfg.extraArgs).to.include('--proxy-bypass-list=<-loopback>'); + expect(cfg.acceptLanguage).toBe('de-DE,de;q=0.9'); + expect(cfg.langArg).toBe('--lang=de-DE'); + expect(cfg.windowSizeArg).toBe('--window-size=1200,700'); + expect(cfg.viewport).toEqual({ width: 1200, height: 700, deviceScaleFactor: 2 }); + expect(cfg.userAgent).toBe('TestAgent/1.0'); + expect(cfg.headers['Accept-Language']).toBe('de-DE,de;q=0.9'); + expect(cfg.headers['User-Agent']).toBe('TestAgent/1.0'); + expect(cfg.headers.Referer).toBe('https://example.com/ref'); + expect(cfg.extraArgs).toContain('--disable-blink-features=AutomationControlled'); + expect(cfg.extraArgs).toContain('--proxy-bypass-list=<-loopback>'); }); it('applyBotPreventionToPage sets UA, viewport, headers and injects patches', async () => { @@ -58,15 +57,15 @@ describe('botPrevention helper', () => { await applyBotPreventionToPage(page, cfg); - expect(calls[0]).to.deep.equal(['setUserAgent', 'Foo/Bar']); - expect(calls.some((c) => c[0] === 'setViewport' && c[1].width === 1000 && c[1].height === 600)).to.equal(true); - expect(calls.some((c) => c[0] === 'setJavaScriptEnabled' && c[1] === true)).to.equal(true); + expect(calls[0]).toEqual(['setUserAgent', 'Foo/Bar']); + expect(calls.some((c) => c[0] === 'setViewport' && c[1].width === 1000 && c[1].height === 600)).toBe(true); + expect(calls.some((c) => c[0] === 'setJavaScriptEnabled' && c[1] === true)).toBe(true); const headerCall = calls.find((c) => c[0] === 'setExtraHTTPHeaders'); - expect(headerCall).to.exist; - expect(headerCall[1]['Accept-Language']).to.equal('en-US,en'); - expect(headerCall[1]['User-Agent']).to.equal('Foo/Bar'); - expect(calls.some((c) => c[0] === 'emulateTimezone' && c[1] === 'UTC')).to.equal(true); - expect(calls.some((c) => c[0] === 'evaluateOnNewDocument' && c[1] === 'function')).to.equal(true); + expect(headerCall).toBeDefined(); + expect(headerCall[1]['Accept-Language']).toBe('en-US,en'); + expect(headerCall[1]['User-Agent']).toBe('Foo/Bar'); + expect(calls.some((c) => c[0] === 'emulateTimezone' && c[1] === 'UTC')).toBe(true); + expect(calls.some((c) => c[0] === 'evaluateOnNewDocument' && c[1] === 'function')).toBe(true); }); it('applyLanguagePersistence stores languages early', async () => { @@ -80,9 +79,9 @@ describe('botPrevention helper', () => { }); await applyLanguagePersistence(page, cfg); const call = calls[0]; - expect(call[0]).to.equal('evaluateOnNewDocument'); - expect(call[1]).to.equal('function'); - expect(call[2]).to.equal('de-DE,de'); + expect(call[0]).toBe('evaluateOnNewDocument'); + expect(call[1]).toBe('function'); + expect(call[2]).toBe('de-DE,de'); }); it('applyPostNavigationHumanSignals moves mouse and scrolls when enabled', async () => { @@ -98,7 +97,7 @@ describe('botPrevention helper', () => { viewport: { width: 1200, height: 800 }, }; await applyPostNavigationHumanSignals(page, cfg); - expect(mouseCalls.some((c) => c[0] === 'move')).to.equal(true); - expect(mouseCalls.some((c) => c[0] === 'wheel')).to.equal(true); + expect(mouseCalls.some((c) => c[0] === 'move')).toBe(true); + expect(mouseCalls.some((c) => c[0] === 'wheel')).toBe(true); }); }); diff --git a/test/services/immoscout/immoscout-web-translator.test.js b/test/services/immoscout/immoscout-web-translator.test.js index 9f963e2..f9dcbaa 100644 --- a/test/services/immoscout/immoscout-web-translator.test.js +++ b/test/services/immoscout/immoscout-web-translator.test.js @@ -4,7 +4,7 @@ */ import { convertWebToMobile } from '../../../lib/services/immoscout/immoscout-web-translator.js'; -import { expect } from 'chai'; +import { expect } from 'vitest'; import { readFile } from 'fs/promises'; export const testData = JSON.parse(await readFile(new URL('./testdata.json', import.meta.url))); @@ -18,7 +18,7 @@ describe('#immoscout-mobile URL conversion', () => { 'https://api.mobile.immobilienscout24.de/search/list?apartmenttypes=halfbasement,penthouse,other,loft,groundfloor,terracedflat,raisedgroundfloor,roofstorey,apartment,maisonette&constructionyear=1920-2026&energyefficiencyclasses=a,b,c,d,e,f,g,h,a_plus&equipment=parking,cellar,builtInKitchen,lift,garden,guestToilet,balcony&exclusioncriteria=projectlisting,swapflat&floor=2-7&geocodes=%2Fde%2Fberlin%2Fberlin&haspromotion=false&heatingtypes=central,selfcontainedcentral&livingspace=10.0-25.0&numberofrooms=2.0-5.0&petsallowedtypes=no,yes,negotiable&price=10.0-100.0&pricetype=calculatedtotalrent&realestatetype=apartmentrent&searchType=region'; const actualMobileUrl = convertWebToMobile(webUrl); - expect(actualMobileUrl).to.equal(expectedMobileUrl); + expect(actualMobileUrl).toBe(expectedMobileUrl); }); // Test URL conversion of web-only SEO path @@ -27,27 +27,27 @@ describe('#immoscout-mobile URL conversion', () => { const converted = convertWebToMobile(webUrl); const queryParams = new URL(converted).searchParams; - expect(queryParams.get('equipment').split(',')).to.include.members(['garden', 'balcony']); + expect(queryParams.get('equipment').split(',')).toEqual(expect.arrayContaining(['garden', 'balcony'])); }); // Test URL conversion with unsupported query parameters it('should remove unsupported query parameters', () => { const webUrl = 'https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?minimuminternetspeed=100000'; const converted = convertWebToMobile(webUrl); - expect(converted).that.does.not.include('minimuminternetspeed'); + expect(converted).not.toContain('minimuminternetspeed'); }); // Test URL conversion with invalid URL it('should throw an error for invalid URL', () => { const invalidUrl = 'invalid-url'; - expect(() => convertWebToMobile(invalidUrl)).to.throw('Invalid URL: invalid-url'); + expect(() => convertWebToMobile(invalidUrl)).toThrow('Invalid URL: invalid-url'); }); // Test URL conversion with unexpected path format it('should throw an error for unexpected path format', () => { const webUrl = 'https://www.immobilienscout24.de/invalid/path/format'; - expect(() => convertWebToMobile(webUrl)).to.throw('Unexpected path format: /invalid/path/format'); + expect(() => convertWebToMobile(webUrl)).toThrow('Unexpected path format: /invalid/path/format'); }); it('shouldFindResultsForEveryTestData', async () => { @@ -70,14 +70,12 @@ describe('#immoscout-mobile URL conversion', () => { console.error('Error fetching data from ImmoScout Mobile API:', response.statusText); } - expect([null, true]).to.include(response.ok); + expect([null, true]).toContain(response.ok); const responseBody = await response.json(); - expect(responseBody.totalResults).to.be.greaterThan(0); - expect(responseBody.totalResults).to.be.greaterThan(0); - expect(responseBody.resultListItems.length).to.greaterThan(0); - expect(responseBody.resultListItems.filter((r) => r.type === 'EXPOSE_RESULT')[0].item.realEstateType).to.equal( - type, - ); + expect(responseBody.totalResults).toBeGreaterThan(0); + expect(responseBody.totalResults).toBeGreaterThan(0); + expect(responseBody.resultListItems.length).toBeGreaterThan(0); + expect(responseBody.resultListItems.filter((r) => r.type === 'EXPOSE_RESULT')[0].item.realEstateType).toBe(type); } }); }); diff --git a/test/services/jobs/jobExecutionService.test.js b/test/services/jobs/jobExecutionService.test.js index 64d74e6..643cb53 100644 --- a/test/services/jobs/jobExecutionService.test.js +++ b/test/services/jobs/jobExecutionService.test.js @@ -3,8 +3,7 @@ * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ -import { expect } from 'chai'; -import esmock from 'esmock'; +import { vi, describe, it, expect, beforeEach } from 'vitest'; import { EventEmitter } from 'node:events'; describe('services/jobs/jobExecutionService', () => { @@ -22,45 +21,39 @@ describe('services/jobs/jobExecutionService', () => { const brokerPath = root + '/lib/services/sse/sse-broker.js'; const utilsPath = root + '/lib/utils.js'; const loggerPath = root + '/lib/services/logger.js'; + const notifyPath = root + '/lib/notification/notify.js'; - // esmock the service with all its collaborators - const mod = await esmock( - svcPath, - {}, - { - [busPath]: { bus }, - [jobStoragePath]: { - getJob: (id) => state.jobsById[id] || null, - getJobs: () => state.jobsList.slice(), - }, - [userStoragePath]: { - getUsers: () => state.users.slice(), - getUser: (id) => state.users.find((u) => u.id === id) || null, - }, - [brokerPath]: { - sendToUsers: (...args) => calls.sent.push(args), - }, - [utilsPath]: { - duringWorkingHoursOrNotSet: () => false, // avoid startup run - }, - [loggerPath]: { - debug: () => {}, - info: () => {}, - warn: () => {}, - error: () => {}, - }, - [root + '/lib/services/jobs/run-state.js']: { - isRunning: () => false, - markRunning: (id) => { - calls.markRunning.push(id); - return true; - }, - markFinished: () => {}, - }, + vi.resetModules(); + vi.doMock(busPath, () => ({ bus })); + vi.doMock(jobStoragePath, () => ({ + getJob: (id) => state.jobsById[id] || null, + getJobs: () => state.jobsList.slice(), + })); + vi.doMock(userStoragePath, () => ({ + getUsers: () => state.users.slice(), + getUser: (id) => state.users.find((u) => u.id === id) || null, + })); + vi.doMock(brokerPath, () => ({ + sendToUsers: (...args) => calls.sent.push(args), + })); + vi.doMock(utilsPath, () => ({ + duringWorkingHoursOrNotSet: () => false, + })); + vi.doMock(loggerPath, () => { + const m = { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} }; + return { default: m }; + }); + vi.doMock(notifyPath, () => ({ send: async () => [] })); + vi.doMock(root + '/lib/services/jobs/run-state.js', () => ({ + isRunning: () => false, + markRunning: (id) => { + calls.markRunning.push(id); + return true; }, - ); + markFinished: () => {}, + })); - // call initializer with minimal deps + const mod = await import(svcPath); mod.initJobExecutionService({ providers: [], settings: { demoMode: false }, intervalMs: 0 }); return mod; } @@ -87,13 +80,13 @@ describe('services/jobs/jobExecutionService', () => { bus.emit('jobs:status', { jobId: 'j1', running: true }); - expect(calls.sent.length).to.equal(1, 'sendToUsers should be called once'); + expect(calls.sent.length, 'sendToUsers should be called once').toBe(1); const [recipients, event, data] = calls.sent[0]; - expect(event).to.equal('jobStatus'); - expect(data).to.deep.equal({ jobId: 'j1', running: true }); + expect(event).toBe('jobStatus'); + expect(data).toEqual({ jobId: 'j1', running: true }); const got = new Set(recipients); const expected = new Set(['owner1', 'u2', 'a1']); - expect(got).to.deep.equal(expected); + expect(got).toEqual(expected); }); it('runs all jobs for admin; only own jobs for regular user', async () => { @@ -113,12 +106,12 @@ describe('services/jobs/jobExecutionService', () => { bus.emit('jobs:runAll', { userId: 'u1' }); // allow microtasks to flush await new Promise((r) => setTimeout(r, 0)); - expect(new Set(calls.markRunning)).to.deep.equal(new Set(['j1'])); + expect(new Set(calls.markRunning)).toEqual(new Set(['j1'])); // Admin: all jobs calls.markRunning = []; bus.emit('jobs:runAll', { userId: 'admin' }); await new Promise((r) => setTimeout(r, 0)); - expect(new Set(calls.markRunning)).to.deep.equal(new Set(['j1', 'j2'])); + expect(new Set(calls.markRunning)).toEqual(new Set(['j1', 'j2'])); }); }); diff --git a/test/similarity/similarityCache.test.js b/test/similarity/similarityCache.test.js index c04a8ea..5bf1685 100644 --- a/test/similarity/similarityCache.test.js +++ b/test/similarity/similarityCache.test.js @@ -3,18 +3,15 @@ * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ -import { expect } from 'chai'; -import esmock from 'esmock'; +import { vi, describe, it, expect } from 'vitest'; // Helper to create module under test with mocks async function loadModuleWith({ entries = [] } = {}) { - const mod = await esmock('../../lib/services/similarity-check/similarityCache.js', { - // Mock the storage to return our controlled entries - '../../lib/services/storage/listingsStorage.js': { - getAllEntriesFromListings: () => entries, - }, - }); - return mod; + vi.resetModules(); + vi.doMock('../../lib/services/storage/listingsStorage.js', () => ({ + getAllEntriesFromListings: () => entries, + })); + return await import('../../lib/services/similarity-check/similarityCache.js'); } describe('similarityCache', () => { @@ -27,15 +24,15 @@ describe('similarityCache', () => { const { initSimilarityCache, checkAndAddEntry } = await loadModuleWith({ entries }); // Initially, duplicates should not be detected for new data - expect(checkAndAddEntry({ title: 'X', price: 200, address: 'Y' })).to.equal(false); + expect(checkAndAddEntry({ title: 'X', price: 200, address: 'Y' })).toBe(false); // Now initialize from storage initSimilarityCache(); // Exact duplicates should be detected - expect(checkAndAddEntry({ title: 'A', price: 1000, address: 'Main 1' })).to.equal(true); + expect(checkAndAddEntry({ title: 'A', price: 1000, address: 'Main 1' })).toBe(true); // Ensure falsy-but-valid price 0 is preserved by hashing and detected as duplicate - expect(checkAndAddEntry({ title: 'B', price: 0, address: 'Zero St' })).to.equal(true); + expect(checkAndAddEntry({ title: 'B', price: 0, address: 'Zero St' })).toBe(true); }); it('checkAndAddEntry returns false for new entry then true for duplicate on second call', async () => { @@ -44,8 +41,8 @@ describe('similarityCache', () => { const first = checkAndAddEntry({ title: 'C', price: 300, address: 'Road 3' }); const second = checkAndAddEntry({ title: 'C', price: 300, address: 'Road 3' }); - expect(first).to.equal(false); - expect(second).to.equal(true); + expect(first).toBe(false); + expect(second).toBe(true); }); it('hashing ignores null/undefined but preserves 0 via behavior', async () => { @@ -53,15 +50,15 @@ describe('similarityCache', () => { // Add baseline (null address ignored) const add1 = checkAndAddEntry({ title: 'T', price: 1, address: null }); - expect(add1).to.equal(false); + expect(add1).toBe(false); // Duplicate with undefined address should match const dup = checkAndAddEntry({ title: 'T', price: 1, address: undefined }); - expect(dup).to.equal(true); + expect(dup).toBe(true); // Now test that price 0 is preserved (not filtered out) const addZero = checkAndAddEntry({ title: 'Z', price: 0, address: 'Zero' }); - expect(addZero).to.equal(false); + expect(addZero).toBe(false); const dupZero = checkAndAddEntry({ title: 'Z', price: 0, address: 'Zero' }); - expect(dupZero).to.equal(true); + expect(dupZero).toBe(true); }); }); diff --git a/test/storage/SqliteConnection.test.js b/test/storage/SqliteConnection.test.js index 6c82b14..c3c52fb 100644 --- a/test/storage/SqliteConnection.test.js +++ b/test/storage/SqliteConnection.test.js @@ -3,8 +3,7 @@ * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ -import { expect } from 'chai'; -import esmock from 'esmock'; +import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest'; // We explicitly avoid touching the real filesystem or creating a real DB file. // better-sqlite3 is fully mocked and operates in-memory via our stubs. @@ -78,15 +77,10 @@ describe('SqliteConnection', () => { }; }; - // esmock the module with our stubs - SqliteConnection = await esmock( - '../../lib/services/storage/SqliteConnection.js', - {}, - { - fs: fsMock, - 'better-sqlite3': { default: BetterSqlite3Mock }, - }, - ); + vi.resetModules(); + vi.doMock('fs', () => ({ default: fsMock, ...fsMock })); + vi.doMock('better-sqlite3', () => ({ default: BetterSqlite3Mock })); + SqliteConnection = (await import('../../lib/services/storage/SqliteConnection.js')).default; }); afterEach(() => { @@ -98,9 +92,9 @@ describe('SqliteConnection', () => { const db1 = SqliteConnection.getConnection(); const db2 = SqliteConnection.getConnection(); - expect(db1).to.equal(db2); + expect(db1).toBe(db2); // journal_mode, synchronous, cache_size, foreign_keys, optimize - expect(calls.db.pragma).to.deep.equal([ + expect(calls.db.pragma).toEqual([ 'journal_mode = WAL', 'synchronous = NORMAL', 'cache_size = -64000', @@ -108,21 +102,21 @@ describe('SqliteConnection', () => { 'optimize', ]); // mkdirSync should not be called because existsSync returned true - expect(calls.fs.mkdirSync).to.have.length(0); + expect(calls.fs.mkdirSync).toHaveLength(0); }); it('executes query and execute helpers', () => { const rows = SqliteConnection.query('SELECT 1', {}); - expect(rows).to.be.an('array'); - expect(rows[0]).to.deep.equal({ x: 1 }); + expect(rows).toBeInstanceOf(Array); + expect(rows[0]).toEqual({ x: 1 }); const info = SqliteConnection.execute('UPDATE x SET y=1 WHERE id=@id', { id: 5 }); - expect(info).to.have.property('changes', 1); + expect(info).toHaveProperty('changes', 1); }); it('tableExists uses sqlite_master get()', () => { const exists = SqliteConnection.tableExists('users'); - expect(exists).to.equal(true); + expect(exists).toBe(true); }); it('withTransaction wraps callback', () => { @@ -131,17 +125,17 @@ describe('SqliteConnection', () => { db.prepare('SELECT inside').all({}); return 42; }); - expect(result).to.equal(42); - expect(calls.db.prepare).to.include('SELECT inside'); + expect(result).toBe(42); + expect(calls.db.prepare).toContain('SELECT inside'); }); it('optimize() delegates to PRAGMA optimize and close() calls it again then closes', () => { SqliteConnection.optimize(); // It will use the existing connection and call pragma('optimize') - expect(calls.db.pragma).to.include('optimize'); + expect(calls.db.pragma).toContain('optimize'); SqliteConnection.close(); // close increments close counter - expect(calls.db.close).to.equal(1); + expect(calls.db.close).toBe(1); }); }); diff --git a/test/utils.js b/test/utils.js index af2d18a..4330c12 100644 --- a/test/utils.js +++ b/test/utils.js @@ -3,29 +3,24 @@ * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ +import { vi } from 'vitest'; import { readFile } from 'fs/promises'; -import esmock from 'esmock'; import * as mockStore from './mocks/mockStore.js'; import { send } from './mocks/mockNotification.js'; export const providerConfig = JSON.parse(await readFile(new URL('./provider/testProvider.json', import.meta.url))); +vi.mock('../lib/services/storage/listingsStorage.js', () => mockStore); +vi.mock('../lib/services/storage/settingsStorage.js', () => mockStore); +vi.mock('../lib/services/geocoding/geoCodingService.js', () => ({ + geocodeAddress: mockStore.getGeocoordinatesByAddress, +})); +vi.mock('../lib/services/storage/jobStorage.js', () => ({ + getJob: (jobKey) => ({ id: jobKey, userId: 'user1' }), +})); +vi.mock('../lib/notification/notify.js', () => ({ send })); + export const mockFredy = async () => { - return await esmock('../lib/FredyPipelineExecutioner', { - '../lib/services/storage/listingsStorage.js': { - ...mockStore, - }, - '../lib/services/storage/settingsStorage.js': { - ...mockStore, - }, - '../lib/services/geocoding/geoCodingService.js': { - geocodeAddress: mockStore.getGeocoordinatesByAddress, - }, - '../lib/services/storage/jobStorage.js': { - getJob: (jobKey) => ({ id: jobKey, userId: 'user1' }), - }, - '../lib/notification/notify.js': { - send, - }, - }); + const mod = await import('../lib/FredyPipelineExecutioner.js'); + return mod.default ?? mod; }; diff --git a/test/utils/utils.test.js b/test/utils/utils.test.js index 2123c01..013d209 100644 --- a/test/utils/utils.test.js +++ b/test/utils/utils.test.js @@ -3,19 +3,19 @@ * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ -import { expect } from 'chai'; +import { expect } from 'vitest'; import { buildHash } from '../../lib/utils.js'; describe('utilsCheck', () => { describe('#utilsCheck()', () => { it('should be null when null input', () => { - expect(buildHash(null)).to.be.null; + expect(buildHash(null)).toBeNull(); }); it('should be null when null empty', () => { - expect(buildHash('')).to.be.null; + expect(buildHash('')).toBeNull(); }); it('should return a value', () => { - expect(buildHash('bla', '', null)).to.be.a.string; + expect(buildHash('bla', '', null)).toBeTypeOf('string'); }); }); }); diff --git a/vitest.config.js b/vitest.config.js new file mode 100644 index 0000000..35ad0ba --- /dev/null +++ b/vitest.config.js @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2026 by Christian Kellner. + * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause + */ + +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + include: ['test/**/*.test.js'], + testTimeout: 60000, + reporters: ['verbose'], + }, +}); diff --git a/vitest.gh.config.js b/vitest.gh.config.js new file mode 100644 index 0000000..5632320 --- /dev/null +++ b/vitest.gh.config.js @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2026 by Christian Kellner. + * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause + */ + +import { defineConfig, mergeConfig } from 'vitest/config'; +import base from './vitest.config.js'; + +export default mergeConfig( + base, + defineConfig({ + test: { + exclude: [ + '**/node_modules/**', + 'test/provider/immonet.test.js', + 'test/provider/immobilienDe.test.js', + 'test/provider/immowelt.test.js', + ], + }, + }), +); diff --git a/yarn.lock b/yarn.lock index 84d0964..8973fe6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1061,6 +1061,136 @@ dependencies: tslib "^2.4.0" +"@esbuild/aix-ppc64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz#4c585002f7ad694d38fe0e8cbf5cfd939ccff327" + integrity sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q== + +"@esbuild/android-arm64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz#7625d0952c3b402d3ede203a16c9f2b78f8a4827" + integrity sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw== + +"@esbuild/android-arm@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.4.tgz#9a0cf1d12997ec46dddfb32ce67e9bca842381ac" + integrity sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ== + +"@esbuild/android-x64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.4.tgz#06e1fdc6283fccd6bc6aadd6754afce6cf96f42e" + integrity sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw== + +"@esbuild/darwin-arm64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz#6c550ee6c0273bcb0fac244478ff727c26755d80" + integrity sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ== + +"@esbuild/darwin-x64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz#ed7a125e9f25ce0091b9aff783ee943f6ba6cb86" + integrity sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw== + +"@esbuild/freebsd-arm64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz#597dc8e7161dba71db4c1656131c1f1e9d7660c6" + integrity sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw== + +"@esbuild/freebsd-x64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz#ea171f9f4f00efaa8e9d3fe8baa1b75d757d1b36" + integrity sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ== + +"@esbuild/linux-arm64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz#e52d57f202369386e6dbcb3370a17a0491ab1464" + integrity sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA== + +"@esbuild/linux-arm@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz#5e0c0b634908adbce0a02cebeba8b3acac263fb6" + integrity sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg== + +"@esbuild/linux-ia32@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz#5f90f01f131652473ec06b038a14c49683e14ec7" + integrity sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA== + +"@esbuild/linux-loong64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz#63bacffdb99574c9318f9afbd0dd4fff76a837e3" + integrity sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA== + +"@esbuild/linux-mips64el@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz#c4b6952eca6a8efff67fee3671a3536c8e67b7eb" + integrity sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw== + +"@esbuild/linux-ppc64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz#6dea67d3d98c6986f1b7769e4f1848e5ae47ad58" + integrity sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA== + +"@esbuild/linux-riscv64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz#9ad2b4c3c0502c6bada9c81997bb56c597853489" + integrity sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw== + +"@esbuild/linux-s390x@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz#c43d3cfd073042ca6f5c52bb9bc313ed2066ce28" + integrity sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA== + +"@esbuild/linux-x64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz#45fa173e0591ac74d80d3cf76704713e14e2a4a6" + integrity sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA== + +"@esbuild/netbsd-arm64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz#366b0ef40cdb986fc751cbdad16e8c25fe1ba879" + integrity sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q== + +"@esbuild/netbsd-x64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz#e985d49a3668fd2044343071d52e1ae815112b3e" + integrity sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg== + +"@esbuild/openbsd-arm64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz#6fb4ab7b73f7e5572ce5ec9cf91c13ff6dd44842" + integrity sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow== + +"@esbuild/openbsd-x64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz#641f052040a0d79843d68898f5791638a026d983" + integrity sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ== + +"@esbuild/openharmony-arm64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz#fc1d33eac9d81ae0a433b3ed1dd6171a20d4e317" + integrity sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg== + +"@esbuild/sunos-x64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz#af2cd5ca842d6d057121f66a192d4f797de28f53" + integrity sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g== + +"@esbuild/win32-arm64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz#78ec7e59bb06404583d4c9511e621db31c760de3" + integrity sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg== + +"@esbuild/win32-ia32@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz#0e616aa488b7ee5d2592ab070ff9ec06a9fddf11" + integrity sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw== + +"@esbuild/win32-x64@0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz#1f7ba71a3d6155d44a6faa8dbe249c62ab3e408c" + integrity sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg== + "@eslint-community/eslint-utils@^4.8.0": version "4.9.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz" @@ -1174,18 +1304,6 @@ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" - 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" - "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" @@ -1207,7 +1325,7 @@ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": +"@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.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== @@ -1408,11 +1526,6 @@ resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.115.0.tgz#92a599543529bce45f8f2da77f40a124d63349dc" integrity sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw== -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - "@puppeteer/browsers@2.13.0": version "2.13.0" resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.13.0.tgz#10f980c6d65efeff77f8a3cac6e1a7ac10604500" @@ -1518,6 +1631,131 @@ resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz#ddb28c13602aea5a5edf03532c28bbfc37c4b5e0" integrity sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw== +"@rollup/rollup-android-arm-eabi@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz#a6742c74c7d9d6d604ef8a48f99326b4ecda3d82" + integrity sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg== + +"@rollup/rollup-android-arm64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz#97247be098de4df0c11971089fd2edf80a5da8cf" + integrity sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q== + +"@rollup/rollup-darwin-arm64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz#674852cf14cf11b8056e0b1a2f4e872b523576cf" + integrity sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg== + +"@rollup/rollup-darwin-x64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz#36dfd7ed0aaf4d9d89d9ef983af72632455b0246" + integrity sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w== + +"@rollup/rollup-freebsd-arm64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz#2f87c2074b4220260fdb52a9996246edfc633c22" + integrity sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA== + +"@rollup/rollup-freebsd-x64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz#9b5a26522a38a95dc06616d1939d4d9a76937803" + integrity sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg== + +"@rollup/rollup-linux-arm-gnueabihf@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz#86aa4859385a8734235b5e40a48e52d770758c3a" + integrity sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw== + +"@rollup/rollup-linux-arm-musleabihf@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz#cbe70e56e6ece8dac83eb773b624fc9e5a460976" + integrity sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA== + +"@rollup/rollup-linux-arm64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz#d14992a2e653bc3263d284bc6579b7a2890e1c45" + integrity sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA== + +"@rollup/rollup-linux-arm64-musl@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz#2fdd1ddc434ea90aeaa0851d2044789b4d07f6da" + integrity sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA== + +"@rollup/rollup-linux-loong64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz#8a181e6f89f969f21666a743cd411416c80099e7" + integrity sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg== + +"@rollup/rollup-linux-loong64-musl@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz#904125af2babc395f8061daa27b5af1f4e3f2f78" + integrity sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q== + +"@rollup/rollup-linux-ppc64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz#a57970ac6864c9a3447411a658224bdcf948be22" + integrity sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA== + +"@rollup/rollup-linux-ppc64-musl@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz#bb84de5b26870567a4267666e08891e80bb56a63" + integrity sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA== + +"@rollup/rollup-linux-riscv64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz#72d00d2c7fb375ce3564e759db33f17a35bffab9" + integrity sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg== + +"@rollup/rollup-linux-riscv64-musl@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz#4c166ef58e718f9245bd31873384ba15a5c1a883" + integrity sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg== + +"@rollup/rollup-linux-s390x-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz#bb5025cde9a61db478c2ca7215808ad3bce73a09" + integrity sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w== + +"@rollup/rollup-linux-x64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz#9b66b1f9cd95c6624c788f021c756269ffed1552" + integrity sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg== + +"@rollup/rollup-linux-x64-musl@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz#b007ca255dc7166017d57d7d2451963f0bd23fd9" + integrity sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg== + +"@rollup/rollup-openbsd-x64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz#e8b357b2d1aa2c8d76a98f5f0d889eabe93f4ef9" + integrity sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ== + +"@rollup/rollup-openharmony-arm64@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz#96c2e3f4aacd3d921981329831ff8dde492204dc" + integrity sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA== + +"@rollup/rollup-win32-arm64-msvc@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz#2d865149d706d938df8b4b8f117e69a77646d581" + integrity sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A== + +"@rollup/rollup-win32-ia32-msvc@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz#abe1593be0fa92325e9971c8da429c5e05b92c36" + integrity sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA== + +"@rollup/rollup-win32-x64-gnu@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz#c4af3e9518c9a5cd4b1c163dc81d0ad4d82e7eab" + integrity sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA== + +"@rollup/rollup-win32-x64-msvc@4.59.0": + version "4.59.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz#4584a8a87b29188a4c1fe987a9fcf701e256d86c" + integrity sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA== + "@sendgrid/client@^8.1.5": version "8.1.5" resolved "https://registry.npmjs.org/@sendgrid/client/-/client-8.1.5.tgz" @@ -1884,6 +2122,14 @@ dependencies: tslib "^2.4.0" +"@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: + "@types/deep-eql" "*" + assertion-error "^2.0.1" + "@types/debug@^4.0.0", "@types/debug@^4.1.0": version "4.1.12" resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" @@ -1891,6 +2137,11 @@ dependencies: "@types/ms" "*" +"@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/esrecurse@^4.3.1": version "4.3.1" resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" @@ -1903,7 +2154,7 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@^1.0.8": +"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@^1.0.8": version "1.0.8" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== @@ -2008,6 +2259,67 @@ dependencies: "@rolldown/pluginutils" "1.0.0-rc.7" +"@vitest/expect@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433" + integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" + chai "^5.2.0" + tinyrainbow "^2.0.0" + +"@vitest/mocker@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.2.4.tgz#4471c4efbd62db0d4fa203e65cc6b058a85cabd3" + integrity sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ== + dependencies: + "@vitest/spy" "3.2.4" + estree-walker "^3.0.3" + magic-string "^0.30.17" + +"@vitest/pretty-format@3.2.4", "@vitest/pretty-format@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.4.tgz#3c102f79e82b204a26c7a5921bf47d534919d3b4" + integrity sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== + dependencies: + tinyrainbow "^2.0.0" + +"@vitest/runner@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.2.4.tgz#5ce0274f24a971f6500f6fc166d53d8382430766" + integrity sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ== + dependencies: + "@vitest/utils" "3.2.4" + pathe "^2.0.3" + strip-literal "^3.0.0" + +"@vitest/snapshot@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.2.4.tgz#40a8bc0346ac0aee923c0eefc2dc005d90bc987c" + integrity sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ== + dependencies: + "@vitest/pretty-format" "3.2.4" + magic-string "^0.30.17" + pathe "^2.0.3" + +"@vitest/spy@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.4.tgz#cc18f26f40f3f028da6620046881f4e4518c2599" + integrity sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== + dependencies: + tinyspy "^4.0.3" + +"@vitest/utils@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.4.tgz#c0813bc42d99527fb8c5b138c7a88516bca46fea" + integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== + dependencies: + "@vitest/pretty-format" "3.2.4" + loupe "^3.1.4" + tinyrainbow "^2.0.0" + accepts@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" @@ -2085,14 +2397,14 @@ ansi-regex@^6.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz" integrity sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg== -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-styles@^6.1.0, ansi-styles@^6.2.1: +ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -2193,6 +2505,11 @@ arraybuffer.prototype.slice@^1.0.4: get-intrinsic "^1.2.6" is-array-buffer "^3.0.4" +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== + ast-types@^0.13.4: version "0.13.4" resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz" @@ -2413,13 +2730,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - brace-expansion@^5.0.2: version "5.0.4" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.4.tgz#614daaecd0a688f660bbbc909a8748c3d80d4336" @@ -2434,11 +2744,6 @@ braces@~3.0.2: dependencies: fill-range "^7.1.1" -browser-stdout@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - browserslist@^4.24.0, browserslist@^4.28.1: version "4.28.1" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz" @@ -2468,6 +2773,11 @@ bytes@^3.1.2, bytes@~3.1.2: resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" @@ -2499,11 +2809,6 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - caniuse-lite@^1.0.30001759: version "1.0.30001769" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz" @@ -2514,18 +2819,16 @@ ccount@^2.0.0: resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chai@6.2.2: - version "6.2.2" - resolved "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz" - integrity sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg== - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== +chai@^5.2.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" + integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" chalk@^5.6.2: version "5.6.2" @@ -2559,6 +2862,11 @@ chart.js@^4.5.1: dependencies: "@kurkle/color" "^0.3.0" +check-error@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.3.tgz#2427361117b70cca8dc89680ead32b157019caf5" + integrity sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA== + cheerio-select@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" @@ -2603,13 +2911,6 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" -chokidar@^4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== - dependencies: - readdirp "^4.0.1" - chownr@^1.1.1: version "1.1.4" resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" @@ -2898,18 +3199,13 @@ debug@3.2.7: dependencies: ms "^2.1.1" -debug@4, debug@^4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.3: +debug@4, debug@^4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: version "4.4.3" resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - decode-named-character-reference@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz" @@ -2929,6 +3225,11 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" @@ -3008,11 +3309,6 @@ devtools-protocol@0.0.1581282: resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1581282.tgz#7f289b837e052ad04eb16e9575877801c2b3716c" integrity sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ== -diff@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz" - integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== - doctrine@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" @@ -3069,11 +3365,6 @@ earcut@^3.0.2: resolved "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz" integrity sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ== -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" @@ -3094,11 +3385,6 @@ emoji-regex@^8.0.0: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - encodeurl@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" @@ -3250,6 +3536,11 @@ es-iterator-helpers@^1.2.1: iterator.prototype "^1.1.4" safe-array-concat "^1.1.3" +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.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" @@ -3303,6 +3594,38 @@ esast-util-from-js@^2.0.0: esast-util-from-estree "^2.0.0" vfile-message "^4.0.0" +esbuild@^0.27.0: + version "0.27.4" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.4.tgz#b9591dd7e0ab803a11c9c3b602850403bef22f00" + integrity sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ== + optionalDependencies: + "@esbuild/aix-ppc64" "0.27.4" + "@esbuild/android-arm" "0.27.4" + "@esbuild/android-arm64" "0.27.4" + "@esbuild/android-x64" "0.27.4" + "@esbuild/darwin-arm64" "0.27.4" + "@esbuild/darwin-x64" "0.27.4" + "@esbuild/freebsd-arm64" "0.27.4" + "@esbuild/freebsd-x64" "0.27.4" + "@esbuild/linux-arm" "0.27.4" + "@esbuild/linux-arm64" "0.27.4" + "@esbuild/linux-ia32" "0.27.4" + "@esbuild/linux-loong64" "0.27.4" + "@esbuild/linux-mips64el" "0.27.4" + "@esbuild/linux-ppc64" "0.27.4" + "@esbuild/linux-riscv64" "0.27.4" + "@esbuild/linux-s390x" "0.27.4" + "@esbuild/linux-x64" "0.27.4" + "@esbuild/netbsd-arm64" "0.27.4" + "@esbuild/netbsd-x64" "0.27.4" + "@esbuild/openbsd-arm64" "0.27.4" + "@esbuild/openbsd-x64" "0.27.4" + "@esbuild/openharmony-arm64" "0.27.4" + "@esbuild/sunos-x64" "0.27.4" + "@esbuild/win32-arm64" "0.27.4" + "@esbuild/win32-ia32" "0.27.4" + "@esbuild/win32-x64" "0.27.4" + escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" @@ -3432,11 +3755,6 @@ eslint@10.0.3: natural-compare "^1.4.0" optionator "^0.9.3" -esmock@2.7.3: - version "2.7.3" - resolved "https://registry.npmjs.org/esmock/-/esmock-2.7.3.tgz" - integrity sha512-/M/YZOjgyLaVoY6K83pwCsGE1AJQnj4S4GyXLYgi/Y79KL8EeW6WU7Rmjc89UO7jv6ec8+j34rKeWOfiLeEu0A== - espree@^11.1.1: version "11.2.0" resolved "https://registry.yarnpkg.com/espree/-/espree-11.2.0.tgz#01d5e47dc332aaba3059008362454a8cc34ccaa5" @@ -3522,7 +3840,7 @@ estree-util-visit@^2.0.0: "@types/estree-jsx" "^1.0.0" "@types/unist" "^3.0.0" -estree-walker@^3.0.0: +estree-walker@^3.0.0, estree-walker@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== @@ -3568,6 +3886,11 @@ expand-template@^2.0.3: resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +expect-type@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.3.0.tgz#0d58ed361877a31bbc4dd6cf71bbfef7faf6bd68" + integrity sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA== + express-rate-limit@^8.2.1: version "8.2.1" resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-8.2.1.tgz#ec75fdfe280ecddd762b8da8784c61bae47d7f7f" @@ -3742,11 +4065,6 @@ flat-cache@^4.0.0: flatted "^3.2.9" keyv "^4.5.4" -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - flatted@^3.2.9: version "3.3.3" resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" @@ -3781,14 +4099,6 @@ for-own@^0.1.3: dependencies: for-in "^1.0.1" -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" - 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.npmjs.org/form-data/-/form-data-4.0.4.tgz" @@ -3956,18 +4266,6 @@ glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^10.4.5: - version "10.4.5" - resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - glob@^7.0.0, glob@^7.1.3: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" @@ -4025,11 +4323,6 @@ has-flag@^3.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" @@ -4113,11 +4406,6 @@ hast-util-whitespace@^3.0.0: dependencies: "@types/hast" "^3.0.0" -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - history@5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/history/-/history-5.3.0.tgz" @@ -4450,16 +4738,6 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-plain-obj@^4.0.0: version "4.1.0" resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" @@ -4523,11 +4801,6 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: dependencies: which-typed-array "^1.1.16" -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - is-weakmap@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" @@ -4580,15 +4853,6 @@ iterator.prototype@^1.1.4: has-symbols "^1.1.0" set-function-name "^2.0.2" -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - jose@^6.1.3: version "6.1.3" resolved "https://registry.yarnpkg.com/jose/-/jose-6.1.3.tgz#8453d7be88af7bb7d64a0481d6a35a0145ba3ea5" @@ -4599,6 +4863,11 @@ jose@^6.1.3: resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" + integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" @@ -4881,14 +5150,6 @@ lodash@4.17.23, lodash@^4.17.21: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz" integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - log-update@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz" @@ -4917,10 +5178,10 @@ lottie-web@^5.12.2: resolved "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz" integrity sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ== -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +loupe@^3.1.0, loupe@^3.1.4: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" + integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== lru-cache@^11.0.2: version "11.1.0" @@ -4939,6 +5200,13 @@ lru-cache@^7.14.1: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== +magic-string@^0.30.17: + 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" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" @@ -5646,23 +5914,11 @@ minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.4, minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - mitt@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz" @@ -5681,33 +5937,6 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mocha@11.7.5: - version "11.7.5" - resolved "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz" - integrity sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig== - dependencies: - browser-stdout "^1.3.1" - chokidar "^4.0.1" - debug "^4.3.5" - diff "^7.0.0" - escape-string-regexp "^4.0.0" - find-up "^5.0.0" - glob "^10.4.5" - he "^1.2.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - log-symbols "^4.1.0" - minimatch "^9.0.5" - ms "^2.1.3" - picocolors "^1.1.1" - serialize-javascript "^6.0.2" - strip-json-comments "^3.1.1" - supports-color "^8.1.1" - workerpool "^9.2.0" - yargs "^17.7.2" - yargs-parser "^21.1.1" - yargs-unparser "^2.0.0" - ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -5984,11 +6213,6 @@ pac-resolver@^7.0.1: degenerator "^5.0.0" netmask "^2.0.2" -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - package-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/package-up/-/package-up-5.0.0.tgz" @@ -6078,19 +6302,21 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-to-regexp@^8.0.0: version "8.3.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.3.0.tgz#aa818a6981f99321003a08987d3cec9c3474cd1f" integrity sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA== +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== + +pathval@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" + integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== + pbf@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz" @@ -6113,7 +6339,7 @@ picomatch@^2.0.4, picomatch@^2.2.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.3: +picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== @@ -6145,7 +6371,7 @@ postal-mime@2.7.3: resolved "https://registry.yarnpkg.com/postal-mime/-/postal-mime-2.7.3.tgz#358d92192656a262568ffc7a441a713131aa1272" integrity sha512-MjhXadAJaWgYzevi46+3kLak8y6gbg0ku14O1gO/LNOuay8dO+1PtcSGvAdgDR0DoIsSaiIA8y/Ddw6MnrO0Tw== -postcss@^8.5.8: +postcss@^8.5.6, postcss@^8.5.8: version "8.5.8" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.8.tgz#6230ecc8fb02e7a0f6982e53990937857e13f399" integrity sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg== @@ -6525,13 +6751,6 @@ quickselect@^3.0.0: resolved "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz" integrity sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g== -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - range-parser@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" @@ -6635,11 +6854,6 @@ readable-stream@^3.1.1, readable-stream@^3.4.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^4.0.1: - version "4.1.2" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" - integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" @@ -6924,6 +7138,40 @@ rolldown@1.0.0-rc.9: "@rolldown/binding-win32-arm64-msvc" "1.0.0-rc.9" "@rolldown/binding-win32-x64-msvc" "1.0.0-rc.9" +rollup@^4.43.0: + version "4.59.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.59.0.tgz#cf74edac17c1486f562d728a4d923a694abdf06f" + integrity sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg== + dependencies: + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.59.0" + "@rollup/rollup-android-arm64" "4.59.0" + "@rollup/rollup-darwin-arm64" "4.59.0" + "@rollup/rollup-darwin-x64" "4.59.0" + "@rollup/rollup-freebsd-arm64" "4.59.0" + "@rollup/rollup-freebsd-x64" "4.59.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.59.0" + "@rollup/rollup-linux-arm-musleabihf" "4.59.0" + "@rollup/rollup-linux-arm64-gnu" "4.59.0" + "@rollup/rollup-linux-arm64-musl" "4.59.0" + "@rollup/rollup-linux-loong64-gnu" "4.59.0" + "@rollup/rollup-linux-loong64-musl" "4.59.0" + "@rollup/rollup-linux-ppc64-gnu" "4.59.0" + "@rollup/rollup-linux-ppc64-musl" "4.59.0" + "@rollup/rollup-linux-riscv64-gnu" "4.59.0" + "@rollup/rollup-linux-riscv64-musl" "4.59.0" + "@rollup/rollup-linux-s390x-gnu" "4.59.0" + "@rollup/rollup-linux-x64-gnu" "4.59.0" + "@rollup/rollup-linux-x64-musl" "4.59.0" + "@rollup/rollup-openbsd-x64" "4.59.0" + "@rollup/rollup-openharmony-arm64" "4.59.0" + "@rollup/rollup-win32-arm64-msvc" "4.59.0" + "@rollup/rollup-win32-ia32-msvc" "4.59.0" + "@rollup/rollup-win32-x64-gnu" "4.59.0" + "@rollup/rollup-win32-x64-msvc" "4.59.0" + fsevents "~2.3.2" + rope-sequence@^1.3.0: version "1.3.4" resolved "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz" @@ -6956,7 +7204,7 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7054,13 +7302,6 @@ send@^1.2.0: range-parser "^1.2.1" statuses "^2.0.1" -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - serve-static@2.2.1, serve-static@^2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz" @@ -7183,7 +7424,12 @@ side-channel@^1.1.0: side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" -signal-exit@^4.0.1, signal-exit@^4.1.0: +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.1.0: version "4.1.0" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -7271,6 +7517,11 @@ split-on-first@^3.0.0: resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz" integrity sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== +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== + standardwebhooks@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/standardwebhooks/-/standardwebhooks-1.0.0.tgz#5faa23ceacbf9accd344361101d9e3033b64324f" @@ -7289,6 +7540,11 @@ statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.2: resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== +std-env@^3.9.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== + stop-iteration-iterator@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" @@ -7311,15 +7567,6 @@ string-argv@^0.3.2: resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - 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.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -7329,15 +7576,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 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.npmjs.org/string-width/-/string-width-5.1.2.tgz" - 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.npmjs.org/string-width/-/string-width-7.2.0.tgz" @@ -7429,13 +7667,6 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - 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.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -7443,23 +7674,25 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1, strip-ansi@^7.1.0: +strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strip-literal@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-3.1.0.tgz#222b243dd2d49c0bcd0de8906adbd84177196032" + integrity sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg== + dependencies: + js-tokens "^9.0.1" + style-to-js@^1.0.0: version "1.1.21" resolved "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz" @@ -7488,20 +7721,6 @@ supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - 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.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -7568,12 +7787,22 @@ tiny-json-http@^7.0.2: resolved "https://registry.npmjs.org/tiny-json-http/-/tiny-json-http-7.5.1.tgz" integrity sha512-lB7qkBGpL3HR/8gidBu3MMfgfnDj2mlvK/eYXgSbO06gKphemLKGp/TgRTy/BKVD7nCbgIeCm41lMNayXO1f2w== +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== + +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + tinyexec@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.4.tgz#6c60864fe1d01331b2f17c6890f535d7e5385408" integrity sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw== -tinyglobby@^0.2.15: +tinyglobby@^0.2.14, tinyglobby@^0.2.15: version "0.2.15" resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== @@ -7581,11 +7810,26 @@ tinyglobby@^0.2.15: fdir "^6.5.0" picomatch "^4.0.3" +tinypool@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" + integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== + tinyqueue@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz" integrity sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g== +tinyrainbow@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" + integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== + +tinyspy@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.4.tgz#d77a002fb53a88aa1429b419c1c92492e0c81f78" + integrity sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" @@ -7890,6 +8134,17 @@ vfile@^6.0.0: "@types/unist" "^3.0.0" vfile-message "^4.0.0" +vite-node@3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.2.4.tgz#f3676d94c4af1e76898c162c92728bca65f7bb07" + integrity sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg== + dependencies: + cac "^6.7.14" + debug "^4.4.1" + es-module-lexer "^1.7.0" + pathe "^2.0.3" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + vite@8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/vite/-/vite-8.0.0.tgz#d749f9bf5be196635982bc16ec0c6faf2b31f3a4" @@ -7904,6 +8159,49 @@ vite@8.0.0: optionalDependencies: fsevents "~2.3.3" +"vite@^5.0.0 || ^6.0.0 || ^7.0.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@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.2.4.tgz#0637b903ad79d1539a25bc34c0ed54b5c67702ea" + integrity sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/expect" "3.2.4" + "@vitest/mocker" "3.2.4" + "@vitest/pretty-format" "^3.2.4" + "@vitest/runner" "3.2.4" + "@vitest/snapshot" "3.2.4" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" + chai "^5.2.0" + debug "^4.4.1" + expect-type "^1.2.1" + magic-string "^0.30.17" + pathe "^2.0.3" + picomatch "^4.0.2" + std-env "^3.9.0" + tinybench "^2.9.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.14" + tinypool "^1.1.1" + tinyrainbow "^2.0.0" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + vite-node "3.2.4" + why-is-node-running "^2.3.0" + w3c-keyname@^2.2.0: version "2.2.8" resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz" @@ -7996,6 +8294,14 @@ 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.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" @@ -8006,20 +8312,6 @@ wordwrap@^1.0.0: resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -workerpool@^9.2.0: - version "9.3.3" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-9.3.3.tgz" - integrity sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - 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.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -8029,15 +8321,6 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - 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.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz" @@ -8085,16 +8368,6 @@ yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-unparser@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz"