diff --git a/.changeset/moody-mugs-pay.md b/.changeset/moody-mugs-pay.md new file mode 100644 index 000000000..facd6d2f2 --- /dev/null +++ b/.changeset/moody-mugs-pay.md @@ -0,0 +1,5 @@ +--- +'@verdaccio/config': patch +--- + +chore: improve debug code and refactor code diff --git a/package.json b/package.json index 58d19c2c6..2567847f6 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@verdaccio/eslint-config": "workspace:*", "@verdaccio/types": "workspace:*", "@verdaccio/ui-theme": "workspace:*", - "@vitest/coverage-v8": "0.34.6", + "@vitest/coverage-v8": "2.0.5", "aria-query": "5.1.3", "babel-core": "7.0.0-bridge.0", "babel-jest": "29.7.0", @@ -128,7 +128,7 @@ "verdaccio-auth-memory": "workspace:*", "verdaccio-htpasswd": "workspace:*", "verdaccio-memory": "workspace:*", - "vitest": "1.6.0" + "vitest": "2.0.4" }, "scripts": { "prepare": "husky install", diff --git a/packages/config/package.json b/packages/config/package.json index 08cf88cb0..aae9748b9 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -26,11 +26,11 @@ "verdaccio" ], "engines": { - "node": ">=12" + "node": ">=14" }, "scripts": { "clean": "rimraf ./build", - "test": "jest", + "test": "vitest run", "type-check": "tsc --noEmit -p tsconfig.build.json", "build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json", "build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps", diff --git a/packages/config/src/config-path.ts b/packages/config/src/config-path.ts index 6fbfb4999..740a3c569 100644 --- a/packages/config/src/config-path.ts +++ b/packages/config/src/config-path.ts @@ -1,16 +1,13 @@ import buildDebug from 'debug'; import fs from 'fs'; import _ from 'lodash'; +import os from 'os'; import path from 'path'; -import { CHARACTER_ENCODING } from '@verdaccio/core'; - import { fileExists, folderExists } from './config-utils'; const CONFIG_FILE = 'config.yaml'; const XDG = 'xdg'; -const WIN = 'win'; -const WIN32 = 'win32'; // eslint-disable-next-line const pkgJSON = { name: 'verdaccio', @@ -18,23 +15,27 @@ const pkgJSON = { export type SetupDirectory = { path: string; - type: string; + type: 'xdg' | 'win' | 'win32' | 'def' | 'old'; }; -const debug = buildDebug('verdaccio:config'); +const debug = buildDebug('verdaccio:config:config-path'); /** * Find and get the first config file that match. * @return {String} the config file path */ function findConfigFile(configPath?: string): string { + debug('searching for config file %o', configPath); if (typeof configPath !== 'undefined') { - return path.resolve(configPath); + const configLocation = path.resolve(configPath); + debug('custom location %s', configLocation); + return configLocation; } const configPaths: SetupDirectory[] = getConfigPaths(); debug('%o posible locations found', configPaths.length); - if (_.isEmpty(configPaths)) { + if (configPaths.length === 0) { + debug('no configuration files can be processed'); // this should never happens throw new Error('no configuration files can be processed'); } @@ -45,12 +46,12 @@ function findConfigFile(configPath?: string): string { ); if (typeof primaryConf !== 'undefined') { - debug('previous location exist already %s', primaryConf?.path); + debug('at least one primary location detected at %s', primaryConf?.path); return primaryConf.path; } - - // @ts-ignore - return createConfigFile(_.head(configPaths)).path; + debug('no previous location found, creating a new one'); + debug('generating the first match path location %s', configPaths[0].path); + return createConfigFile(configPaths[0]).path; } function createConfigFile(configLocation: SetupDirectory): SetupDirectory { @@ -63,25 +64,37 @@ function createConfigFile(configLocation: SetupDirectory): SetupDirectory { return configLocation; } -export function readDefaultConfig(): Buffer { +export function readDefaultConfig(): string { const pathDefaultConf: string = path.resolve(__dirname, 'conf/default.yaml'); try { - debug('default configuration file %s', pathDefaultConf); + debug('the path of default config used from %s', pathDefaultConf); fs.accessSync(pathDefaultConf, fs.constants.R_OK); + debug('configuration file has enough permissions for reading'); } catch { + debug('configuration file does not have enough permissions for reading'); throw new TypeError('configuration file does not have enough permissions for reading'); } - // @ts-ignore - return fs.readFileSync(pathDefaultConf, CHARACTER_ENCODING.UTF8); + + return fs.readFileSync(pathDefaultConf, 'utf8'); } function createConfigFolder(configLocation): void { - fs.mkdirSync(path.dirname(configLocation.path), { recursive: true }); - debug(`Creating default config file in %o`, configLocation?.path); + const folder = path.dirname(configLocation.path); + debug(`creating default config file folder at %o`, folder); + fs.mkdirSync(folder, { recursive: true }); + debug(`folder %o created`, folder); } -function updateStorageLinks(configLocation, defaultConfig): string { +/** + * Update the storage links to the new location if it is necessary. + * @param configLocation + * @param defaultConfig + * @returns + */ +function updateStorageLinks(configLocation: SetupDirectory, defaultConfig: string): string { + debug('checking storage links for %s and type %s', configLocation.path, configLocation.type); if (configLocation.type !== XDG) { + debug(`skip storage override for %s`, configLocation.type); return defaultConfig; } @@ -114,7 +127,11 @@ function getConfigPaths(): SetupDirectory[] { return listPaths.reduce(function (acc, currentValue: SetupDirectory | void): SetupDirectory[] { if (typeof currentValue !== 'undefined') { - debug('directory detected path %s for type %s', currentValue?.path, currentValue.type); + debug( + 'posible directory path generated %s for type %s', + currentValue?.path, + currentValue.type + ); acc.push(currentValue); } return acc; @@ -123,11 +140,22 @@ function getConfigPaths(): SetupDirectory[] { /** * Get XDG_CONFIG_HOME or HOME location (usually unix) + * + * The XDG_CONFIG_HOME environment variable is also part of the XDG Base Directory Specification, + * which aims to standardize the locations where applications store configuration files and other + * user-specific data on Unix-like operating systems. + * + * + * + * https://specifications.freedesktop.org/basedir-spec/latest/ + * + * * @returns */ const getXDGDirectory = (): SetupDirectory | void => { const xDGConfigPath = process.env.XDG_CONFIG_HOME || (process.env.HOME && path.join(process.env.HOME, '.config')); + debug('XDGConfig folder path %s', xDGConfigPath); if (xDGConfigPath && folderExists(xDGConfigPath)) { debug('XDGConfig folder path %s', xDGConfigPath); return { @@ -143,11 +171,11 @@ const getXDGDirectory = (): SetupDirectory | void => { * @returns */ const getWindowsDirectory = (): SetupDirectory | void => { - if (process.platform === WIN32 && process.env.APPDATA && folderExists(process.env.APPDATA)) { - debug('is windows appdata: %s', process.env.APPDATA); + if (os.platform() === 'win32' && process.env.APPDATA && folderExists(process.env.APPDATA)) { + debug('windows appdata folder path %s', process.env.APPDATA); return { path: path.resolve(path.join(process.env.APPDATA, pkgJSON.name, CONFIG_FILE)), - type: WIN, + type: 'win', }; } }; @@ -158,8 +186,10 @@ const getWindowsDirectory = (): SetupDirectory | void => { * @returns */ const getRelativeDefaultDirectory = (): SetupDirectory => { + const relativePath = path.resolve(path.join('.', pkgJSON.name, CONFIG_FILE)); + debug('relative folder path %s', relativePath); return { - path: path.resolve(path.join('.', pkgJSON.name, CONFIG_FILE)), + path: relativePath, type: 'def', }; }; @@ -169,8 +199,10 @@ const getRelativeDefaultDirectory = (): SetupDirectory => { * @returns */ const getOldDirectory = (): SetupDirectory => { + const oldPath = path.resolve(path.join('.', CONFIG_FILE)); + debug('old folder path %s', oldPath); return { - path: path.resolve(path.join('.', CONFIG_FILE)), + path: oldPath, type: 'old', }; }; diff --git a/packages/config/src/config-utils.ts b/packages/config/src/config-utils.ts index 9cfbca59f..6986203f0 100644 --- a/packages/config/src/config-utils.ts +++ b/packages/config/src/config-utils.ts @@ -1,5 +1,8 @@ +import buildDebug from 'debug'; import fs from 'fs'; +const debug = buildDebug('verdaccio:config:config-utils'); + /** * Check whether the path already exist. * @param {String} path @@ -7,9 +10,13 @@ import fs from 'fs'; */ export function folderExists(path: string): boolean { try { + debug('check folder exist', path); const stat = fs.statSync(path); - return stat.isDirectory(); + const isDirectory = stat.isDirectory(); + debug('folder exist', isDirectory); + return isDirectory; } catch (_: any) { + debug('folder %s does not exist', path); return false; } } @@ -21,9 +28,13 @@ export function folderExists(path: string): boolean { */ export function fileExists(path: string): boolean { try { + debug('check file exist', path); const stat = fs.statSync(path); - return stat.isFile(); + const isFile = stat.isFile(); + debug('file exist', isFile); + return isFile; } catch (_: any) { + debug('file %s does not exist', path); return false; } } diff --git a/packages/config/test/__snapshots__/builder.spec.ts.snap b/packages/config/test/__snapshots__/builder.spec.ts.snap index c5b3f580e..99fdf0b43 100644 --- a/packages/config/test/__snapshots__/builder.spec.ts.snap +++ b/packages/config/test/__snapshots__/builder.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Config builder should create a configuration file as yaml 1`] = ` +exports[`Config builder > should create a configuration file as yaml 1`] = ` "uplinks: upstream: url: https://registry.verdaccio.org diff --git a/packages/config/test/__snapshots__/config-parsing.spec.ts.snap b/packages/config/test/__snapshots__/config-parsing.spec.ts.snap index ed1200698..cc47adad7 100644 --- a/packages/config/test/__snapshots__/config-parsing.spec.ts.snap +++ b/packages/config/test/__snapshots__/config-parsing.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`parse fromJStoYAML basic conversion roundtrip 1`] = ` +exports[`parse > fromJStoYAML > basic conversion roundtrip 1`] = ` "storage: ./storage_default_storage uplinks: npmjs: diff --git a/packages/config/test/agent.spec.ts b/packages/config/test/agent.spec.ts index 6daf557e8..449991add 100644 --- a/packages/config/test/agent.spec.ts +++ b/packages/config/test/agent.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest'; + import { getUserAgent } from '../src'; describe('getUserAgent', () => { diff --git a/packages/config/test/builder.spec.ts b/packages/config/test/builder.spec.ts index b0c17094f..c3032c8fc 100644 --- a/packages/config/test/builder.spec.ts +++ b/packages/config/test/builder.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest'; + import { ConfigBuilder } from '../src'; describe('Config builder', () => { diff --git a/packages/config/test/config-parsing.spec.ts b/packages/config/test/config-parsing.spec.ts index 22a1d812c..1c0eafb6d 100644 --- a/packages/config/test/config-parsing.spec.ts +++ b/packages/config/test/config-parsing.spec.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import { describe, expect, test } from 'vitest'; import { fileUtils } from '@verdaccio/core'; diff --git a/packages/config/test/config-utils.spec.ts b/packages/config/test/config-utils.spec.ts index 17b13fe90..0ebddf090 100644 --- a/packages/config/test/config-utils.spec.ts +++ b/packages/config/test/config-utils.spec.ts @@ -1,4 +1,5 @@ import path from 'path'; +import { describe, expect, test } from 'vitest'; import { fileExists, folderExists } from '../src/config-utils'; diff --git a/packages/config/test/config.path.spec.ts b/packages/config/test/config.path.spec.ts index 0f0e5b2c0..9e83bea34 100644 --- a/packages/config/test/config.path.spec.ts +++ b/packages/config/test/config.path.spec.ts @@ -1,106 +1,127 @@ +import fs from 'fs'; import os from 'os'; +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import { findConfigFile } from '../src/config-path'; -const mockmkDir = jest.fn(); -const mockaccessSync = jest.fn(); -const mockwriteFile = jest.fn(); - -jest.mock('fs', () => { - const fsOri = jest.requireActual('fs'); - return { - ...fsOri, - statSync: (path) => ({ - isDirectory: () => { - if (path.match(/fail/)) { - throw Error('file does not exist'); - } - return true; - }, - }), - accessSync: (a) => mockaccessSync(a), - mkdirSync: (a) => mockmkDir(a), - writeFileSync: (a) => mockwriteFile(a), - }; -}); - -jest.mock('fs'); - describe('config-path', () => { + let statSyncMock; + let mkdirSyncMock; + let writeFileSyncMock; + let platformMock; + let accessSyncMock; + let fakeStats = { + isDirectory: vi.fn().mockReturnValue(true), + }; + beforeEach(() => { - jest.clearAllMocks(); - jest.resetAllMocks(); + // Mock only statSync method + statSyncMock = vi.spyOn(fs, 'statSync'); + mkdirSyncMock = vi.spyOn(fs, 'mkdirSync'); + writeFileSyncMock = vi.spyOn(fs, 'writeFileSync'); + accessSyncMock = vi.spyOn(fs, 'accessSync'); + platformMock = vi.spyOn(os, 'platform'); + platformMock.mockReturnValue('linux'); + }); + + afterEach(() => { + // Restore the original implementation after each test + statSyncMock.mockRestore(); + vi.unstubAllEnvs(); }); describe('findConfigFile', () => { - if (os.platform() !== 'win32') { - describe('using defiled location from arguments', () => { - test('with custom location', () => { - expect(findConfigFile('/home/user/custom/location/config.yaml')).toEqual( - '/home/user/custom/location/config.yaml' - ); - expect(mockwriteFile).not.toHaveBeenCalled(); - expect(mockmkDir).not.toHaveBeenCalled(); - }); + describe('using defiled location from arguments', () => { + test('with custom location', () => { + // mock + statSyncMock.mockReturnValue(fakeStats); + mkdirSyncMock.mockReturnValue(true); + writeFileSyncMock.mockReturnValue(undefined); + expect(findConfigFile('/home/user/custom/location/config.yaml')).toEqual( + '/home/user/custom/location/config.yaml' + ); + expect(writeFileSyncMock).not.toHaveBeenCalled(); + expect(mkdirSyncMock).not.toHaveBeenCalled(); + }); + }); + + describe('whith env variables', () => { + test('the env XDG_CONFIG_HOME is defined and the directory exist but config file is missing', async () => { + // mock + statSyncMock.mockReturnValue(fakeStats); + mkdirSyncMock.mockReturnValue(true); + writeFileSyncMock.mockReturnValue(undefined); + // node env variable + vi.stubEnv('XDG_CONFIG_HOME', '/home/user'); + + expect(findConfigFile()).toEqual('/home/user/verdaccio/config.yaml'); + expect(writeFileSyncMock).toHaveBeenCalledWith( + '/home/user/verdaccio/config.yaml', + expect.stringContaining('packages') + ); }); - describe('whith env variables', () => { - test('with XDG_CONFIG_HOME if directory exist but config file is missing', () => { - process.env.XDG_CONFIG_HOME = '/home/user'; - expect(findConfigFile()).toEqual('/home/user/verdaccio/config.yaml'); - expect(mockwriteFile).toHaveBeenCalledWith('/home/user/verdaccio/config.yaml'); - expect(mockmkDir).toHaveBeenCalledWith('/home/user/verdaccio'); - }); - - test('with HOME if directory exist but config file is missing', () => { - delete process.env.XDG_CONFIG_HOME; - process.env.HOME = '/home/user'; - expect(findConfigFile()).toEqual('/home/user/.config/verdaccio/config.yaml'); - expect(mockwriteFile).toHaveBeenCalledWith('/home/user/.config/verdaccio/config.yaml'); - expect(mockmkDir).toHaveBeenCalledWith('/home/user/.config/verdaccio'); - }); - - describe('error handling', () => { - test('XDG_CONFIG_HOME is not directory fallback to default', () => { - process.env.XDG_CONFIG_HOME = '/home/user/fail'; - mockaccessSync.mockImplementation(() => {}); - mockwriteFile.mockImplementation(() => {}); - expect(findConfigFile()).toMatch('packages/config/verdaccio/config.yaml'); - }); - - test('no permissions on read default config file', () => { - process.env.XDG_CONFIG_HOME = '/home/user'; - mockaccessSync.mockImplementation(() => { - throw new Error('error on write file'); - }); - - expect(function () { - findConfigFile(); - }).toThrow(/configuration file does not have enough permissions for reading/); - }); - }); + test('with HOME if directory exist but config file is missing', () => { + // mock + statSyncMock.mockReturnValue(fakeStats); + mkdirSyncMock.mockReturnValue(true); + writeFileSyncMock.mockReturnValue(undefined); + vi.stubEnv('XDG_CONFIG_HOME', ''); + vi.stubEnv('HOME', '/home/user'); + expect(findConfigFile()).toEqual('/home/user/.config/verdaccio/config.yaml'); + expect(writeFileSyncMock).toHaveBeenCalledWith( + '/home/user/.config/verdaccio/config.yaml', + expect.stringContaining('packages') + ); + expect(mkdirSyncMock).toHaveBeenCalledWith( + '/home/user/.config/verdaccio', + expect.anything() + ); }); - describe('with no env variables', () => { - test('with relative location', () => { - mockaccessSync.mockImplementation(() => {}); - delete process.env.XDG_CONFIG_HOME; - delete process.env.HOME; - process.env.APPDATA = '/app/data/'; + describe('error handling', () => { + test('XDG_CONFIG_HOME is not directory fallback to default', () => { + // mock + statSyncMock.mockReturnValue({ + isDirectory: vi.fn().mockReturnValue(false), + }); + mkdirSyncMock.mockReturnValue(true); + writeFileSyncMock.mockReturnValue(undefined); + // node env variable + vi.stubEnv('XDG_CONFIG_HOME', '/home/user/fail'); + expect(findConfigFile()).toMatch('packages/config/verdaccio/config.yaml'); - expect(mockwriteFile).toHaveBeenCalled(); - expect(mockmkDir).toHaveBeenCalled(); + }); + + test('no permissions on read default config file', () => { + vi.stubEnv('XDG_CONFIG_HOME', '/home/user'); + accessSyncMock.mockImplementation(() => { + throw new Error('error on write file'); + }); + + expect(function () { + findConfigFile(); + }).toThrow(/configuration file does not have enough permissions for reading/); }); }); - } else { - test('with windows as directory exist but config file is missing', () => { - delete process.env.XDG_CONFIG_HOME; - delete process.env.HOME; - process.env.APPDATA = '/app/data/'; - expect(findConfigFile()).toMatch('\\app\\data\\verdaccio\\config.yaml'); - expect(mockwriteFile).toHaveBeenCalled(); - expect(mockmkDir).toHaveBeenCalled(); + }); + + describe('with no env variables', () => { + test('with relative location', () => { + // mock + statSyncMock.mockReturnValue(fakeStats); + mkdirSyncMock.mockReturnValue(true); + writeFileSyncMock.mockReturnValue(undefined); + accessSyncMock.mockImplementation(() => {}); + platformMock.mockReturnValue('win32'); + // delete process.env.XDG_CONFIG_HOME; + vi.stubEnv('XDG_CONFIG_HOME', ''); + vi.stubEnv('HOME', ''); + vi.stubEnv('APPDATA', '/app/data/'); + expect(findConfigFile()).toMatch('/app/data/verdaccio/config.yaml'); + expect(writeFileSyncMock).toHaveBeenCalled(); + expect(mkdirSyncMock).toHaveBeenCalled(); }); - } + }); }); }); diff --git a/packages/config/test/config.spec.ts b/packages/config/test/config.spec.ts index babff90ef..a02e63382 100644 --- a/packages/config/test/config.spec.ts +++ b/packages/config/test/config.spec.ts @@ -1,5 +1,6 @@ import _ from 'lodash'; import path from 'path'; +import { describe, expect, test } from 'vitest'; import { Config, @@ -22,7 +23,7 @@ const resolveConf = (conf) => { return path.join(__dirname, `../src/conf/${name}${ext.startsWith('.') ? ext : '.yaml'}`); }; -const itif = (condition) => (condition ? it : it.skip); +const itif = (condition) => (condition ? test : test.skip); const checkDefaultUplink = (config) => { expect(_.isObject(config.uplinks[DEFAULT_UPLINK])).toBeTruthy(); diff --git a/packages/config/test/package-access.spec.ts b/packages/config/test/package-access.spec.ts index cecbeae24..99861e7ba 100644 --- a/packages/config/test/package-access.spec.ts +++ b/packages/config/test/package-access.spec.ts @@ -1,4 +1,5 @@ import _ from 'lodash'; +import { describe, expect, test } from 'vitest'; import { parseConfigFile } from '../src'; import { PACKAGE_ACCESS, normalisePackageAccess, normalizeUserList } from '../src/package-access'; diff --git a/packages/config/test/token.spec.ts b/packages/config/test/token.spec.ts index 4780e3713..0a181d616 100644 --- a/packages/config/test/token.spec.ts +++ b/packages/config/test/token.spec.ts @@ -1,3 +1,5 @@ +import { expect, test } from 'vitest'; + import { TOKEN_VALID_LENGTH, generateRandomSecretKey } from '../src/token'; test('token test valid length', () => { diff --git a/packages/config/test/uplinks.spec.ts b/packages/config/test/uplinks.spec.ts index 416f7e359..be7b05e85 100644 --- a/packages/config/test/uplinks.spec.ts +++ b/packages/config/test/uplinks.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest'; + import { normalisePackageAccess, parseConfigFile } from '../src'; import { hasProxyTo, sanityCheckUplinksProps, uplinkSanityCheck } from '../src/uplinks'; import { parseConfigurationFile } from './utils'; diff --git a/packages/config/test/utils.spec.ts b/packages/config/test/utils.spec.ts index a464f4cd2..a9d38708f 100644 --- a/packages/config/test/utils.spec.ts +++ b/packages/config/test/utils.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest'; + import { ROLES, createAnonymousRemoteUser, createRemoteUser } from '../src'; describe('createRemoteUser and createAnonymousRemoteUser', () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9972a3936..61144bd05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -228,8 +228,8 @@ importers: specifier: workspace:* version: link:packages/plugins/ui-theme '@vitest/coverage-v8': - specifier: 0.34.6 - version: 0.34.6(vitest@1.6.0) + specifier: 2.0.5 + version: 2.0.5(vitest@2.0.4) aria-query: specifier: 5.1.3 version: 5.1.3 @@ -348,8 +348,8 @@ importers: specifier: workspace:* version: link:packages/plugins/memory vitest: - specifier: 1.6.0 - version: 1.6.0(@types/node@20.14.12) + specifier: 2.0.4 + version: 2.0.4(@types/node@20.14.12) e2e/cli/cli-commons: devDependencies: @@ -2512,12 +2512,12 @@ packages: '@algolia/requester-common': 4.24.0 dev: false - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 /@babel/cli@7.24.8(@babel/core@7.24.9): resolution: {integrity: sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==} @@ -2579,7 +2579,7 @@ packages: '@babel/generator': 7.23.3 '@babel/helper-module-transforms': 7.25.0(@babel/core@7.12.9) '@babel/helpers': 7.23.9 - '@babel/parser': 7.23.9 + '@babel/parser': 7.25.0 '@babel/template': 7.25.0 '@babel/traverse': 7.23.3 '@babel/types': 7.25.0 @@ -2598,7 +2598,7 @@ packages: resolution: {integrity: sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.1 + '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 '@babel/generator': 7.24.10 '@babel/helper-compilation-targets': 7.24.8 @@ -2653,8 +2653,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 /@babel/generator@7.24.10: @@ -2871,7 +2871,7 @@ packages: resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.25.0 /@babel/helper-member-expression-to-functions@7.24.8: resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} @@ -4884,8 +4884,8 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.9 - '@babel/types': 7.23.9 + '@babel/parser': 7.25.0 + '@babel/types': 7.25.0 debug: 4.3.6(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: @@ -7276,7 +7276,7 @@ packages: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -7407,8 +7407,8 @@ packages: /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 /@jridgewell/source-map@0.3.6: resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} @@ -9782,11 +9782,11 @@ packages: dependencies: '@babel/core': 7.24.9 '@babel/generator': 7.23.6 - '@babel/parser': 7.23.9 + '@babel/parser': 7.25.0 '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.9) '@babel/preset-env': 7.25.0(@babel/core@7.24.9) '@babel/traverse': 7.23.9 - '@babel/types': 7.23.9 + '@babel/types': 7.25.0 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/mdx1-csf': 0.0.1(@babel/core@7.24.9) core-js: 3.35.0 @@ -11609,64 +11609,77 @@ packages: http-status-codes: 2.2.0 dev: true - /@vitest/coverage-v8@0.34.6(vitest@1.6.0): - resolution: {integrity: sha512-fivy/OK2d/EsJFoEoxHFEnNGTg+MmdZBAVK9Ka4qhXR2K3J0DS08vcGVwzDtXSuUMabLv4KtPcpSKkcMXFDViw==} + /@vitest/coverage-v8@2.0.5(vitest@2.0.4): + resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==} peerDependencies: - vitest: '>=0.32.0 <1' + vitest: 2.0.5 dependencies: - '@ampproject/remapping': 2.2.1 + '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - istanbul-lib-coverage: 3.2.0 + debug: 4.3.6(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - magic-string: 0.30.4 - picocolors: 1.0.0 - std-env: 3.4.3 - test-exclude: 6.0.0 - v8-to-istanbul: 9.1.3 - vitest: 1.6.0(@types/node@20.14.12) + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.10 + magicast: 0.3.4 + std-env: 3.7.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.0.4(@types/node@20.14.12) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@1.6.0: - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + /@vitest/expect@2.0.4: + resolution: {integrity: sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==} dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.3.10 + '@vitest/spy': 2.0.4 + '@vitest/utils': 2.0.4 + chai: 5.1.1 + tinyrainbow: 1.2.0 dev: true - /@vitest/runner@1.6.0: - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + /@vitest/pretty-format@2.0.4: + resolution: {integrity: sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==} dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 - pathe: 1.1.1 + tinyrainbow: 1.2.0 dev: true - /@vitest/snapshot@1.6.0: - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + /@vitest/pretty-format@2.0.5: + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} dependencies: + tinyrainbow: 1.2.0 + dev: true + + /@vitest/runner@2.0.4: + resolution: {integrity: sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==} + dependencies: + '@vitest/utils': 2.0.4 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@2.0.4: + resolution: {integrity: sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==} + dependencies: + '@vitest/pretty-format': 2.0.4 magic-string: 0.30.10 - pathe: 1.1.1 - pretty-format: 29.7.0 + pathe: 1.1.2 dev: true - /@vitest/spy@1.6.0: - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + /@vitest/spy@2.0.4: + resolution: {integrity: sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==} dependencies: - tinyspy: 2.2.1 + tinyspy: 3.0.0 dev: true - /@vitest/utils@1.6.0: - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + /@vitest/utils@2.0.4: + resolution: {integrity: sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==} dependencies: - diff-sequences: 29.6.3 + '@vitest/pretty-format': 2.0.4 estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + loupe: 3.1.1 + tinyrainbow: 1.2.0 dev: true /@vue/compiler-core@3.4.34: @@ -12183,12 +12196,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - /acorn@8.12.1: resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} @@ -12727,8 +12734,9 @@ packages: util: 0.10.3 dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} dev: true /assign-symbols@1.0.0: @@ -13836,17 +13844,15 @@ packages: /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} + /chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 dev: true /chalk@1.1.3: @@ -13918,10 +13924,9 @@ packages: /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} dev: true /check-more-types@2.24.0: @@ -14401,10 +14406,6 @@ packages: yargs: 17.7.2 dev: true - /confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - dev: true - /configstore@5.0.1: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} engines: {node: '>=8'} @@ -15798,11 +15799,9 @@ packages: babel-plugin-macros: optional: true - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 dev: true /deep-equal@1.1.1: @@ -18749,6 +18748,18 @@ packages: minipass: 7.0.4 path-scurry: 1.10.1 + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -20460,6 +20471,10 @@ packages: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} @@ -20488,7 +20503,7 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} dependencies: - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 @@ -20502,6 +20517,17 @@ packages: transitivePeerDependencies: - supports-color + /istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.6(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /istanbul-reports@3.1.6: resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} engines: {node: '>=8'} @@ -20509,6 +20535,14 @@ packages: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + /iterate-iterator@1.0.2: resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} dev: true @@ -20548,6 +20582,14 @@ packages: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + /jake@10.9.1: resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} engines: {node: '>=10'} @@ -21114,10 +21156,6 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - dev: true - /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -21664,14 +21702,6 @@ packages: resolution: {integrity: sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA==} dev: false - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - dependencies: - mlly: 1.7.1 - pkg-types: 1.0.3 - dev: true - /localstorage-memory@1.0.3: resolution: {integrity: sha512-t9P8WB6DcVttbw/W4PIE8HOqum8Qlvx5SjR6oInwR9Uia0EEmyUeBh7S+weKByW+l/f45Bj4L/dgZikGFDM6ng==} @@ -21813,15 +21843,8 @@ packages: signal-exit: 3.0.7 dev: true - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - deprecated: Please upgrade to 2.3.7 which fixes GHSA-4q6p-r6v2-jvc5 - dependencies: - get-func-name: 2.0.2 - dev: true - - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + /loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} dependencies: get-func-name: 2.0.2 dev: true @@ -21854,6 +21877,10 @@ packages: resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} engines: {node: 14 || >=16.14} + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: true + /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: @@ -21890,11 +21917,12 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /magic-string@0.30.4: - resolution: {integrity: sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==} - engines: {node: '>=12'} + /magicast@0.3.4: + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@babel/parser': 7.25.0 + '@babel/types': 7.25.0 + source-map-js: 1.2.0 dev: true /make-dir@2.1.0: @@ -22777,6 +22805,11 @@ packages: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -22826,15 +22859,6 @@ packages: engines: {node: '>=10'} hasBin: true - /mlly@1.7.1: - resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} - dependencies: - acorn: 8.12.0 - pathe: 1.1.2 - pkg-types: 1.1.1 - ufo: 1.5.3 - dev: true - /mockdate@3.0.5: resolution: {integrity: sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ==} dev: true @@ -24000,13 +24024,6 @@ packages: yocto-queue: 1.1.1 dev: true - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -24088,6 +24105,10 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + /package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + dev: true + /package-json@6.5.0: resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} engines: {node: '>=8'} @@ -24344,6 +24365,14 @@ packages: lru-cache: 10.1.0 minipass: 7.0.4 + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + dev: true + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -24381,16 +24410,13 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true - /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} dev: true /pbkdf2@3.1.2: @@ -24545,22 +24571,6 @@ packages: find-up: 6.3.0 dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.7.1 - pathe: 1.1.1 - dev: true - - /pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} - dependencies: - confbox: 0.1.7 - mlly: 1.7.1 - pathe: 1.1.2 - dev: true - /pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} @@ -25651,15 +25661,6 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - dev: true - /postcss@8.4.40: resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} engines: {node: ^10 || ^12 || >=14} @@ -28694,12 +28695,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - /strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - dependencies: - js-tokens: 9.0.0 - dev: true - /style-loader@1.3.0(webpack@4.47.0): resolution: {integrity: sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==} engines: {node: '>= 8.9.0'} @@ -29284,6 +29279,15 @@ packages: glob: 7.2.3 minimatch: 3.1.2 + /test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -29334,13 +29338,18 @@ packages: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} dev: true - /tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + /tinypool@1.0.0: + resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + engines: {node: ^18.0.0 || >=20.0.0} + dev: true + + /tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} dev: true - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + /tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} dev: true @@ -29866,10 +29875,6 @@ packages: /ua-parser-js@0.7.35: resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - dev: true - /uglify-js@3.19.0: resolution: {integrity: sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==} engines: {node: '>=0.8.0'} @@ -30461,7 +30466,7 @@ packages: resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.4 convert-source-map: 2.0.0 @@ -30558,15 +30563,15 @@ packages: remove-trailing-separator: 1.1.0 replace-ext: 1.0.1 - /vite-node@1.6.0(@types/node@20.14.12): - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + /vite-node@2.0.4(@types/node@20.14.12): + resolution: {integrity: sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.6(supports-color@5.5.0) - pathe: 1.1.1 - picocolors: 1.0.0 + pathe: 1.1.2 + tinyrainbow: 1.2.0 vite: 5.3.1(@types/node@20.14.12) transitivePeerDependencies: - '@types/node' @@ -30609,21 +30614,21 @@ packages: dependencies: '@types/node': 20.14.12 esbuild: 0.21.5 - postcss: 8.4.38 + postcss: 8.4.40 rollup: 4.18.0 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@1.6.0(@types/node@20.14.12): - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + /vitest@2.0.4(@types/node@20.14.12): + resolution: {integrity: sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@vitest/browser': 2.0.4 + '@vitest/ui': 2.0.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -30640,27 +30645,26 @@ packages: jsdom: optional: true dependencies: + '@ampproject/remapping': 2.3.0 '@types/node': 20.14.12 - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.3 - chai: 4.3.10 + '@vitest/expect': 2.0.4 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.4 + '@vitest/snapshot': 2.0.4 + '@vitest/spy': 2.0.4 + '@vitest/utils': 2.0.4 + chai: 5.1.1 debug: 4.3.6(supports-color@5.5.0) execa: 8.0.1 - local-pkg: 0.5.0 magic-string: 0.30.10 - pathe: 1.1.1 - picocolors: 1.0.0 + pathe: 1.1.2 std-env: 3.7.0 - strip-literal: 2.1.0 tinybench: 2.8.0 - tinypool: 0.8.4 + tinypool: 1.0.0 + tinyrainbow: 1.2.0 vite: 5.3.1(@types/node@20.14.12) - vite-node: 1.6.0(@types/node@20.14.12) - why-is-node-running: 2.2.2 + vite-node: 2.0.4(@types/node@20.14.12) + why-is-node-running: 2.3.0 transitivePeerDependencies: - less - lightningcss @@ -31563,8 +31567,8 @@ packages: dependencies: isexe: 2.0.0 - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true dependencies: @@ -31987,11 +31991,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true - /yocto-queue@1.1.1: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'}