diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c64bd84..826434e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,11 +12,6 @@ updates: cooldown: default-days: 3 open-pull-requests-limit: 10 - groups: - vitest: - patterns: - - 'vitest' - - '@vitest/coverage*' ignore: - dependency-name: 'react-native' - dependency-name: 'react' diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml index d322d15..fc65ce8 100644 --- a/.github/workflows/pr-validation.yml +++ b/.github/workflows/pr-validation.yml @@ -46,7 +46,7 @@ jobs: - name: Test if: matrix.variant == 'default' - run: yarn test --run --coverage --reporter=junit --outputFile=test-report.junit.xml + run: yarn test --ci --coverage --reporters=default --reporters=jest-junit - name: Upload test results to Codecov if: ${{ !cancelled() && matrix.variant == 'default' }} diff --git a/.gitignore b/.gitignore index 9d446e4..abd2f30 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ licenses.json # Coverage coverage/ +test-report.junit.xml # Android Studio .idea/ diff --git a/eslint.config.mjs b/eslint.config.mjs index 7814279..7dba32b 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -5,7 +5,7 @@ import reactHooks from 'eslint-plugin-react-hooks' import tseslint from 'typescript-eslint' import eslintConfigPrettier from 'eslint-config-prettier/flat' import sonarjs from 'eslint-plugin-sonarjs' -import vitest from '@vitest/eslint-plugin' +import jest from 'eslint-plugin-jest' import globals from 'globals' export default defineConfig( @@ -43,12 +43,7 @@ export default defineConfig( sonarjs.configs.recommended, { files: ['**/*.test.ts', '**/*.test.tsx'], - plugins: { - vitest, - }, - rules: { - ...vitest.configs.recommended.rules, - }, + ...jest.configs['flat/recommended'], }, { files: ['**/*.{ts,tsx}'], diff --git a/package.json b/package.json index b419a74..fb62f52 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "typecheck:foss": "tsc -p tsconfig.foss.json --noEmit", "lint": "eslint .", "format": "prettier --write .", - "test": "vitest", + "test": "jest", "generate-licenses": "yarn dlx license-checker-rseidelsohn --production --json --out src/licenses.json" }, "expo": { @@ -71,31 +71,48 @@ "react-native-web": "0.21.2", "react-native-worklets": "0.10.0" }, + "jest": { + "preset": "jest-expo", + "roots": [ + "/src" + ], + "setupFilesAfterEnv": [ + "/src/test/jestSetup.ts" + ], + "collectCoverageFrom": [ + "src/**/*.{ts,tsx}", + "!src/**/*.test.{ts,tsx}", + "!src/**/*.d.ts", + "!src/i18n/locales/*.ts", + "!src/test/**" + ] + }, + "jest-junit": { + "outputName": "test-report.junit.xml" + }, "private": true, "packageManager": "yarn@4.12.0", "devDependencies": { "@babel/core": "^7.29.0", "@eslint/js": "9.39.2", - "@rolldown/plugin-babel": "0.2.3", + "@jest/globals": "^29.7.0", + "@react-native/jest-preset": "0.86.0", "@types/papaparse": "5.5.2", "@types/react": "~19.2.14", "@types/react-dom": "~19.2.0", "@types/react-native-web": "0.19.2", - "@vitejs/plugin-react": "6.0.3", - "@vitest/coverage-v8": "4.1.9", - "@vitest/eslint-plugin": "1.6.20", - "babel-plugin-module-resolver": "5.0.3", "cross-env": "10.1.0", "eslint": "9.39.2", "eslint-config-prettier": "10.1.8", + "eslint-plugin-jest": "29.15.4", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.1.1", "eslint-plugin-sonarjs": "4.1.0", + "jest": "~29.7.0", + "jest-expo": "~57.0.1", + "jest-junit": "17.0.0", "prettier": "3.9.4", - "rolldown": "1.1.3", "typescript": "~6.0.3", - "typescript-eslint": "8.62.1", - "vite": "8.1.0", - "vitest": "4.1.9" + "typescript-eslint": "8.62.1" } } diff --git a/src/components/AdaptiveDateTimePicker.tsx b/src/components/AdaptiveDateTimePicker.tsx index 51babe6..62244fb 100644 --- a/src/components/AdaptiveDateTimePicker.tsx +++ b/src/components/AdaptiveDateTimePicker.tsx @@ -2,6 +2,7 @@ import { useState } from 'react' import { Platform, View } from 'react-native' import { Portal, Dialog, Button } from 'react-native-paper' import DateTimePicker from '@expo/ui/community/datetime-picker' +import { shiftToUTC, shiftToLocal } from '../utils/dateShift' export interface AdaptiveDateTimePickerProps { visible: boolean @@ -14,30 +15,6 @@ export interface AdaptiveDateTimePickerProps { confirmLabel: string } -const shiftToUTC = (date: Date) => { - return new Date( - Date.UTC( - date.getFullYear(), - date.getMonth(), - date.getDate(), - date.getHours(), - date.getMinutes(), - date.getSeconds(), - ), - ) -} - -const shiftToLocal = (date: Date) => { - return new Date( - date.getUTCFullYear(), - date.getUTCMonth(), - date.getUTCDate(), - date.getUTCHours(), - date.getUTCMinutes(), - date.getUTCSeconds(), - ) -} - const AdaptiveDateTimePicker = ({ visible, onDismiss, diff --git a/src/db/database.test.ts b/src/db/database.test.ts new file mode 100644 index 0000000..a5927d3 --- /dev/null +++ b/src/db/database.test.ts @@ -0,0 +1,314 @@ +import { describe, it, expect, beforeEach, jest } from '@jest/globals' + +// Run the real SQL against an in-memory node:sqlite database. +jest.mock('expo-sqlite', () => jest.requireActual('../test/expoSqliteAdapter')) + +type DatabaseModule = typeof import('./database') + +let db: DatabaseModule + +beforeEach(() => { + // The database handle is a module-level singleton; re-requiring the + // module gives every test a fresh in-memory database. (jest.requireActual + // instead of a dynamic import, which jest's CJS runtime cannot execute.) + jest.resetModules() + db = jest.requireActual('./database') + db.initDatabase() +}) + +const addPair = (date: string, start: string, end: string) => { + db.addEvent(date, start, null) + db.addEvent(date, end, null) +} + +describe('initDatabase', () => { + it('can be called multiple times', () => { + expect(() => { + db.initDatabase() + }).not.toThrow() + }) +}) + +describe('settings', () => { + it('returns null for an unset key', () => { + expect(db.getSetting('language')).toBeNull() + }) + + it('stores and retrieves a value', () => { + db.setSetting('language', 'de') + expect(db.getSetting('language')).toBe('de') + }) + + it('replaces the value on repeated set', () => { + db.setSetting('language', 'de') + db.setSetting('language', 'en') + expect(db.getSetting('language')).toBe('en') + }) +}) + +describe('addEvent / updateEvent / deleteEvent', () => { + it('returns incrementing row ids', () => { + const first = db.addEvent('2024-01-15', '09:00', null) + const second = db.addEvent('2024-01-15', '17:00', null) + expect(second).toBe(first + 1) + }) + + it('persists all fields', () => { + db.addEvent('2024-01-15', '09:00', 'Morning shift', true) + db.addEvent('2024-01-15', '17:00', null) + + const events = db.getTodayEvents('2024-01-15') + expect(events).toHaveLength(2) + expect(events[0]).toMatchObject({ + date: '2024-01-15', + time: '09:00', + note: 'Morning shift', + isManualEntry: 1, + }) + expect(events[1]).toMatchObject({ + time: '17:00', + note: null, + isManualEntry: 0, + }) + }) + + it('updates only the event with the given id', () => { + const id = db.addEvent('2024-01-15', '09:00', null) + db.addEvent('2024-01-15', '17:00', null) + + db.updateEvent(id, '2024-01-16', '09:30', 'Corrected', true) + + const updated = db.getTodayEvents('2024-01-16') + expect(updated).toHaveLength(1) + expect(updated[0]).toMatchObject({ + id, + time: '09:30', + note: 'Corrected', + isManualEntry: 1, + }) + expect(db.getTodayEvents('2024-01-15')).toHaveLength(1) + }) + + it('deletes only the event with the given id', () => { + const id = db.addEvent('2024-01-15', '09:00', null) + db.addEvent('2024-01-15', '17:00', null) + + db.deleteEvent(id) + + const remaining = db.getTodayEvents('2024-01-15') + expect(remaining).toHaveLength(1) + expect(remaining[0].time).toBe('17:00') + }) +}) + +describe('event queries', () => { + it('getTodayEvents returns only the given date ordered by time', () => { + db.addEvent('2024-01-15', '17:00', null) + db.addEvent('2024-01-15', '09:00', null) + db.addEvent('2024-01-16', '10:00', null) + + const events = db.getTodayEvents('2024-01-15') + expect(events.map((event) => event.time)).toEqual(['09:00', '17:00']) + }) + + it('getMonthEvents filters by month prefix and orders by date and time', () => { + db.addEvent('2024-01-20', '09:00', null) + db.addEvent('2024-01-05', '17:00', null) + db.addEvent('2024-01-05', '09:00', null) + db.addEvent('2024-11-05', '09:00', null) // must not match '2024-01' + db.addEvent('2023-12-31', '09:00', null) + + const events = db.getMonthEvents('2024-01') + expect(events.map((event) => `${event.date} ${event.time}`)).toEqual([ + '2024-01-05 09:00', + '2024-01-05 17:00', + '2024-01-20 09:00', + ]) + }) + + it('getEventsRange includes both boundary dates', () => { + db.addEvent('2024-01-14', '09:00', null) + db.addEvent('2024-01-15', '09:00', null) + db.addEvent('2024-01-17', '09:00', null) + db.addEvent('2024-01-18', '09:00', null) + + const events = db.getEventsRange('2024-01-15', '2024-01-17') + expect(events.map((event) => event.date)).toEqual([ + '2024-01-15', + '2024-01-17', + ]) + }) + + it('getAllEvents orders by date and time descending', () => { + db.addEvent('2024-01-15', '09:00', null) + db.addEvent('2024-01-16', '09:00', null) + db.addEvent('2024-01-15', '17:00', null) + + const events = db.getAllEvents() + expect(events.map((event) => `${event.date} ${event.time}`)).toEqual([ + '2024-01-16 09:00', + '2024-01-15 17:00', + '2024-01-15 09:00', + ]) + }) +}) + +describe('importEvents', () => { + it('appends without clearing existing events', () => { + db.addEvent('2024-01-15', '09:00', null) + + db.importEvents([ + { + date: '2024-01-16', + time: '10:00', + note: 'Imported', + isManualEntry: true, + }, + ]) + + const events = db.getAllEvents() + expect(events).toHaveLength(2) + expect(events[0]).toMatchObject({ + date: '2024-01-16', + note: 'Imported', + isManualEntry: 1, + }) + }) + + it('normalizes an empty-string note to null', () => { + db.importEvents([ + { + date: '2024-01-15', + time: '09:00', + note: '', + isManualEntry: false, + }, + ]) + + expect(db.getAllEvents()[0].note).toBeNull() + }) +}) + +describe('work hours', () => { + it('imports entries and replaces those with the same effective date', () => { + db.importWorkHours([ + { effectiveDate: '2024-01-01', dailyMinutes: 480 }, + { effectiveDate: '2024-06-01', dailyMinutes: 420 }, + ]) + db.importWorkHours([{ effectiveDate: '2024-06-01', dailyMinutes: 360 }]) + + expect(db.getWorkHoursHistory()).toEqual([ + { effectiveDate: '2024-01-01', dailyMinutes: 480 }, + { effectiveDate: '2024-06-01', dailyMinutes: 360 }, + ]) + }) + + it('returns the history sorted by effective date ascending', () => { + db.importWorkHours([ + { effectiveDate: '2024-06-01', dailyMinutes: 420 }, + { effectiveDate: '2024-01-01', dailyMinutes: 480 }, + ]) + + expect( + db.getWorkHoursHistory().map((entry) => entry.effectiveDate), + ).toEqual(['2024-01-01', '2024-06-01']) + }) + + it('setDailyTargetMinutes upserts the entry for the given date', () => { + db.setDailyTargetMinutes(420, '2024-01-01') + db.setDailyTargetMinutes(360, '2024-01-01') + + expect(db.getWorkHoursHistory()).toEqual([ + { effectiveDate: '2024-01-01', dailyMinutes: 360 }, + ]) + }) + + it('getDailyTargetMinutes falls back to the default without history', () => { + expect(db.getDailyTargetMinutes('2024-01-15')).toBe(480) + }) + + it('getDailyTargetMinutes resolves the latest entry effective on or before the date', () => { + db.importWorkHours([ + { effectiveDate: '2024-01-01', dailyMinutes: 420 }, + { effectiveDate: '2024-06-01', dailyMinutes: 360 }, + ]) + + expect(db.getDailyTargetMinutes('2023-12-31')).toBe(480) + expect(db.getDailyTargetMinutes('2024-01-01')).toBe(420) + expect(db.getDailyTargetMinutes('2024-05-31')).toBe(420) + expect(db.getDailyTargetMinutes('2024-06-01')).toBe(360) + }) +}) + +describe('getOverallStats', () => { + it('returns zeros for an empty database', () => { + expect(db.getOverallStats()).toEqual({ + totalMinutesWorked: 0, + overallBalanceMinutes: 0, + }) + }) + + it('computes the minutes of a single check-in/check-out pair', () => { + addPair('2024-01-15', '09:00', '17:00') + + expect(db.getOverallStats()).toEqual({ + totalMinutesWorked: 480, + overallBalanceMinutes: 0, // 480 worked - 480 default target + }) + }) + + it('sums multiple pairs on one day excluding the pause', () => { + addPair('2024-01-15', '09:00', '12:00') + addPair('2024-01-15', '13:00', '17:00') + + expect(db.getOverallStats()).toEqual({ + totalMinutesWorked: 420, // 180 + 240, pause not counted + overallBalanceMinutes: -60, + }) + }) + + it('ignores an odd trailing event but still counts the day against the target', () => { + addPair('2024-01-15', '09:00', '12:00') + db.addEvent('2024-01-15', '13:00', null) // still checked in + + expect(db.getOverallStats()).toEqual({ + totalMinutesWorked: 180, + overallBalanceMinutes: -300, + }) + }) + + it('only counts events up to the cutoff date', () => { + addPair('2024-01-15', '09:00', '17:00') + addPair('2024-01-16', '09:00', '17:00') + + expect(db.getOverallStats('2024-01-15')).toEqual({ + totalMinutesWorked: 480, + overallBalanceMinutes: 0, + }) + }) + + it('uses an explicitly passed work-hours history over the stored one', () => { + db.importWorkHours([{ effectiveDate: '2024-01-01', dailyMinutes: 480 }]) + addPair('2024-01-15', '09:00', '17:00') + + const stats = db.getOverallStats(undefined, [ + { effectiveDate: '2024-01-01', dailyMinutes: 240 }, + ]) + expect(stats).toEqual({ + totalMinutesWorked: 480, + overallBalanceMinutes: 240, + }) + }) + + it('applies effective-dated targets per worked day', () => { + // Default target (480) applies on the 15th, reduced target from the 16th. + db.importWorkHours([{ effectiveDate: '2024-01-16', dailyMinutes: 240 }]) + addPair('2024-01-15', '09:00', '17:00') // 480 worked vs 480 target + addPair('2024-01-16', '09:00', '17:00') // 480 worked vs 240 target + + expect(db.getOverallStats()).toEqual({ + totalMinutesWorked: 960, + overallBalanceMinutes: 240, + }) + }) +}) diff --git a/src/db/database.ts b/src/db/database.ts index b53506b..2fba7b0 100644 --- a/src/db/database.ts +++ b/src/db/database.ts @@ -179,7 +179,7 @@ export const getTodayEvents = (date: string): TimeEvent[] => { export const getMonthEvents = (month: string): TimeEvent[] => { // month format: 'YYYY-MM' return db.getAllSync( - 'SELECT * FROM events WHERE date LIKE $month || "%" ORDER BY date ASC, time ASC', + "SELECT * FROM events WHERE date LIKE $month || '%' ORDER BY date ASC, time ASC", { $month: month }, ) } diff --git a/src/i18n/i18n.test.ts b/src/i18n/i18n.test.ts new file mode 100644 index 0000000..5c560f6 --- /dev/null +++ b/src/i18n/i18n.test.ts @@ -0,0 +1,130 @@ +/* eslint-disable @typescript-eslint/unbound-method -- + * `expect(mock)` / `jest.mocked(mock)` never call the reference with `this`, + * so passing mocked methods unbound is safe here. */ +import { describe, it, expect, beforeEach, jest } from '@jest/globals' +import i18n from 'i18next' +import * as Localization from 'expo-localization' +import { getSetting } from '../db/database' +import initI18n from './i18n' + +jest.mock('i18next', () => { + const i18next = { + use: jest.fn(), + init: jest.fn(() => Promise.resolve()), + } + i18next.use.mockReturnValue(i18next) + return { __esModule: true, default: i18next } +}) + +jest.mock('react-i18next', () => ({ + initReactI18next: { type: '3rdParty', init: jest.fn() }, +})) + +jest.mock('expo-localization', () => ({ + getLocales: jest.fn(), +})) + +jest.mock('../db/database', () => ({ + getSetting: jest.fn(), +})) + +const setDeviceLanguage = (languageCode: string | null) => { + jest.mocked(Localization.getLocales).mockReturnValue([ + { languageCode } as Localization.Locale, + ]) +} + +const initializedLanguage = () => { + const options = jest.mocked(i18n.init).mock.calls[0][0] + return options.lng +} + +beforeEach(() => { + jest.clearAllMocks() + jest.mocked(i18n.use).mockReturnValue(i18n) + jest.mocked(getSetting).mockReturnValue(null) + setDeviceLanguage('en') +}) + +describe('initI18n', () => { + it('uses a saved language setting', async () => { + jest.mocked(getSetting).mockReturnValue('de') + setDeviceLanguage('en') + + await initI18n() + + expect(getSetting).toHaveBeenCalledWith('language') + expect(initializedLanguage()).toBe('de') + }) + + it('prefers the saved language over the device locale', async () => { + jest.mocked(getSetting).mockReturnValue('en') + setDeviceLanguage('de') + + await initI18n() + + expect(initializedLanguage()).toBe('en') + }) + + it('uses the device locale when the setting is auto', async () => { + jest.mocked(getSetting).mockReturnValue('auto') + setDeviceLanguage('de') + + await initI18n() + + expect(initializedLanguage()).toBe('de') + }) + + it('uses the device locale when no setting is stored', async () => { + setDeviceLanguage('de') + + await initI18n() + + expect(initializedLanguage()).toBe('de') + }) + + it('falls back to English for unsupported device locales', async () => { + setDeviceLanguage('fr') + + await initI18n() + + expect(initializedLanguage()).toBe('en') + }) + + it('falls back to English when the device locale is unknown', async () => { + setDeviceLanguage(null) + + await initI18n() + + expect(initializedLanguage()).toBe('en') + }) + + it('falls back to English when reading the setting fails', async () => { + const errorSpy = jest + .spyOn(console, 'error') + .mockImplementation(() => undefined) + jest.mocked(getSetting).mockImplementation(() => { + throw new Error('db locked') + }) + + await initI18n() + + expect(initializedLanguage()).toBe('en') + expect(errorSpy).toHaveBeenCalled() + }) + + it('initializes with the react-i18next plugin and an English fallback', async () => { + await initI18n() + + expect(i18n.use).toHaveBeenCalledTimes(1) + expect(i18n.init).toHaveBeenCalledWith( + expect.objectContaining({ + fallbackLng: 'en', + resources: expect.objectContaining({ + en: expect.anything(), + de: expect.anything(), + }), + }), + ) + }) +}) diff --git a/src/plugins/withDisableDependencyMetadata.test.ts b/src/plugins/withDisableDependencyMetadata.test.ts new file mode 100644 index 0000000..5e717d6 --- /dev/null +++ b/src/plugins/withDisableDependencyMetadata.test.ts @@ -0,0 +1,43 @@ +import { describe, it, expect, jest } from '@jest/globals' +import withDisableDependencyMetadata from './withDisableDependencyMetadata' + +// Execute the gradle modifier directly instead of running expo's +// build-time plugin machinery. +jest.mock('@expo/config-plugins', () => ({ + withAppBuildGradle: ( + config: unknown, + action: (config: unknown) => unknown, + ) => action(config), +})) + +const runPlugin = (contents: string) => { + const modResults = { contents } + const config = { + name: 'time-tracking', + slug: 'time-tracking', + modResults, + } + withDisableDependencyMetadata(config) + return modResults.contents +} + +describe('withDisableDependencyMetadata', () => { + it('injects the dependenciesInfo block into the android section', () => { + const result = runPlugin('android {\n namespace "com.example"\n}') + + expect(result).toContain('dependenciesInfo {') + expect(result).toContain('includeInApk = false') + expect(result).toContain('includeInBundle = false') + // still inside the android block + expect(result.indexOf('dependenciesInfo {')).toBeGreaterThan( + result.indexOf('android {'), + ) + }) + + it('leaves the gradle file unchanged when the block already exists', () => { + const contents = + 'android {\n dependenciesInfo {\n includeInApk = false\n }\n}' + + expect(runPlugin(contents)).toBe(contents) + }) +}) diff --git a/src/plugins/withNfcIntent.test.ts b/src/plugins/withNfcIntent.test.ts new file mode 100644 index 0000000..1c04e4b --- /dev/null +++ b/src/plugins/withNfcIntent.test.ts @@ -0,0 +1,91 @@ +import { describe, it, expect, jest } from '@jest/globals' +import withNfcIntent from './withNfcIntent' + +// Execute the manifest modifier directly instead of running expo's +// build-time plugin machinery. +jest.mock('@expo/config-plugins', () => ({ + withAndroidManifest: ( + config: unknown, + action: (config: unknown) => unknown, + ) => action(config), +})) + +interface ManifestActivity { + $: Record + 'intent-filter'?: unknown[] +} + +interface TestManifest { + application?: { activity?: ManifestActivity[] }[] +} + +const runPlugin = (manifest: TestManifest) => { + const config = { + name: 'time-tracking', + slug: 'time-tracking', + modResults: { manifest }, + } + withNfcIntent(config) + return manifest +} + +const mainActivity = (): ManifestActivity => ({ + $: { 'android:name': '.MainActivity' }, +}) + +describe('withNfcIntent', () => { + it('adds the NDEF intent filter to the main activity', () => { + const activity = mainActivity() + runPlugin({ application: [{ activity: [activity] }] }) + + expect(activity['intent-filter']).toEqual([ + { + action: [ + { + $: { + 'android:name': + 'android.nfc.action.NDEF_DISCOVERED', + }, + }, + ], + category: [ + { + $: { + 'android:name': 'android.intent.category.DEFAULT', + }, + }, + ], + data: [ + { + $: { + 'android:scheme': 'timetracking', + 'android:host': 'nfc', + }, + }, + ], + }, + ]) + }) + + it('keeps existing intent filters', () => { + const existing = { action: [] } + const activity = { ...mainActivity(), 'intent-filter': [existing] } + runPlugin({ application: [{ activity: [activity] }] }) + + expect(activity['intent-filter']).toHaveLength(2) + expect(activity['intent-filter'][0]).toBe(existing) + }) + + it('leaves other activities untouched', () => { + const other: ManifestActivity = { + $: { 'android:name': '.OtherActivity' }, + } + runPlugin({ application: [{ activity: [other] }] }) + + expect(other['intent-filter']).toBeUndefined() + }) + + it('does nothing without an application entry', () => { + expect(() => runPlugin({})).not.toThrow() + }) +}) diff --git a/src/plugins/withRemovePermissions.test.ts b/src/plugins/withRemovePermissions.test.ts new file mode 100644 index 0000000..ede8636 --- /dev/null +++ b/src/plugins/withRemovePermissions.test.ts @@ -0,0 +1,115 @@ +import { describe, it, expect, afterEach, jest } from '@jest/globals' +import withRemovePermissions from './withRemovePermissions' + +// Execute the manifest modifier directly instead of running expo's +// build-time plugin machinery. +jest.mock('@expo/config-plugins', () => ({ + withAndroidManifest: ( + config: unknown, + action: (config: unknown) => unknown, + ) => action(config), +})) + +interface TestManifest { + $: Record + 'uses-permission'?: { $: Record }[] +} + +const permission = (name: string) => ({ $: { 'android:name': name } }) + +const permissionNames = (manifest: TestManifest) => + (manifest['uses-permission'] ?? []).map((perm) => perm.$['android:name']) + +const runPlugin = (manifest: TestManifest) => { + const config = { + name: 'time-tracking', + slug: 'time-tracking', + modResults: { manifest }, + } + withRemovePermissions(config) + return manifest +} + +// expo's env typings widen EXPO_PUBLIC_* variables to `any` +const originalFossBuild = process.env.EXPO_PUBLIC_FOSS_BUILD as + string | undefined + +afterEach(() => { + if (originalFossBuild === undefined) { + delete process.env.EXPO_PUBLIC_FOSS_BUILD + } else { + process.env.EXPO_PUBLIC_FOSS_BUILD = originalFossBuild + } +}) + +describe('withRemovePermissions', () => { + it('removes the unwanted permissions in default builds', () => { + process.env.EXPO_PUBLIC_FOSS_BUILD = 'false' + + const manifest = runPlugin({ + $: {}, + 'uses-permission': [ + permission('android.permission.SYSTEM_ALERT_WINDOW'), + permission('android.permission.VIBRATE'), + permission('android.permission.INTERNET'), + permission('android.permission.NFC'), + ], + }) + + expect(permissionNames(manifest)).toEqual([ + 'android.permission.INTERNET', + 'android.permission.NFC', + ]) + expect(manifest.$['xmlns:tools']).toBeUndefined() + }) + + it('also removes network permissions in FOSS builds', () => { + process.env.EXPO_PUBLIC_FOSS_BUILD = 'true' + + const manifest = runPlugin({ + $: {}, + 'uses-permission': [ + permission('android.permission.VIBRATE'), + permission('android.permission.INTERNET'), + permission('android.permission.ACCESS_NETWORK_STATE'), + permission('android.permission.NFC'), + ], + }) + + // The remaining INTERNET / ACCESS_NETWORK_STATE entries are the + // injected tools:node="remove" directives, not real permissions. + expect(manifest['uses-permission']).toEqual([ + permission('android.permission.NFC'), + { + $: { + 'android:name': 'android.permission.INTERNET', + 'tools:node': 'remove', + }, + }, + { + $: { + 'android:name': 'android.permission.ACCESS_NETWORK_STATE', + 'tools:node': 'remove', + }, + }, + ]) + }) + + it('adds the tools namespace in FOSS builds', () => { + process.env.EXPO_PUBLIC_FOSS_BUILD = 'true' + + const manifest = runPlugin({ $: {} }) + + expect(manifest.$['xmlns:tools']).toBe( + 'http://schemas.android.com/tools', + ) + }) + + it('handles a manifest without permissions', () => { + process.env.EXPO_PUBLIC_FOSS_BUILD = 'false' + + const manifest = runPlugin({ $: {} }) + + expect(manifest['uses-permission']).toEqual([]) + }) +}) diff --git a/src/services/LocationTask.test.ts b/src/services/LocationTask.test.ts new file mode 100644 index 0000000..9840d6e --- /dev/null +++ b/src/services/LocationTask.test.ts @@ -0,0 +1,166 @@ +import { + describe, + it, + expect, + beforeEach, + afterEach, + jest, +} from '@jest/globals' +import * as TaskManager from 'expo-task-manager' +import * as Notifications from 'expo-notifications' +import { addEvent, getTodayEvents } from '../db/database' +import { LOCATION_TASK_NAME } from './LocationTask' +import { TimeEvent } from '../types' + +type TaskBody = { data: unknown; error: unknown } + +jest.mock('expo-task-manager', () => ({ + defineTask: jest.fn(), +})) + +jest.mock('expo-location', () => ({ + GeofencingEventType: { Enter: 1, Exit: 2 }, +})) + +jest.mock('expo-notifications', () => ({ + setNotificationHandler: jest.fn(), + scheduleNotificationAsync: jest.fn(), +})) + +jest.mock('../db/database', () => ({ + addEvent: jest.fn(), + getTodayEvents: jest.fn(), +})) + +// Importing ./LocationTask above already registered the task and the +// notification handler; capture both here, before the jest.clearAllMocks() +// in beforeEach wipes the recorded calls. +const [taskName, taskCallback] = jest.mocked(TaskManager.defineTask).mock + .calls[0] as unknown as [string, (body: TaskBody) => Promise | void] + +const notificationHandler = jest.mocked(Notifications.setNotificationHandler) + .mock.calls[0][0] as unknown as { + handleNotification: () => Promise +} + +const ENTER = { eventType: 1 } +const EXIT = { eventType: 2 } + +const makeEvent = (id: number, time: string): TimeEvent => ({ + id, + date: '2026-07-05', + time, + note: null, +}) + +const runTask = async (body: TaskBody) => { + await taskCallback(body) +} + +beforeEach(() => { + jest.clearAllMocks() + jest.spyOn(console, 'log').mockImplementation(() => undefined) + jest.useFakeTimers() + jest.setSystemTime(new Date(2026, 6, 5, 9, 5)) + jest.mocked(getTodayEvents).mockReturnValue([]) +}) + +afterEach(() => { + jest.useRealTimers() +}) + +describe('LocationTask', () => { + it('registers the geofence task and a notification handler on import', async () => { + expect(taskName).toBe(LOCATION_TASK_NAME) + expect(taskCallback).toBeDefined() + + expect(notificationHandler).toBeDefined() + await expect( + notificationHandler.handleNotification(), + ).resolves.toMatchObject({ shouldShowBanner: true }) + }) + + it('checks in with a notification when entering while checked out', async () => { + await runTask({ data: ENTER, error: null }) + + expect(addEvent).toHaveBeenCalledWith( + '2026-07-05', + '09:05', + 'Auto check-in geofence', + ) + expect(Notifications.scheduleNotificationAsync).toHaveBeenCalledWith( + expect.objectContaining({ + content: expect.objectContaining({ + body: 'Checked in at 09:05', + }), + }), + ) + }) + + it('skips the auto check-in when already checked in', async () => { + jest.mocked(getTodayEvents).mockReturnValue([makeEvent(1, '08:00')]) + + await runTask({ data: ENTER, error: null }) + + expect(addEvent).not.toHaveBeenCalled() + expect(Notifications.scheduleNotificationAsync).not.toHaveBeenCalled() + }) + + it('checks out with a notification when exiting while checked in', async () => { + jest.mocked(getTodayEvents).mockReturnValue([makeEvent(1, '08:00')]) + + await runTask({ data: EXIT, error: null }) + + expect(addEvent).toHaveBeenCalledWith( + '2026-07-05', + '09:05', + 'Auto check-out geofence', + ) + expect(Notifications.scheduleNotificationAsync).toHaveBeenCalledWith( + expect.objectContaining({ + content: expect.objectContaining({ + body: 'Checked out at 09:05', + }), + }), + ) + }) + + it('skips the auto check-out when already checked out', async () => { + await runTask({ data: EXIT, error: null }) + + expect(addEvent).not.toHaveBeenCalled() + }) + + it('logs task errors without touching the database', async () => { + const errorSpy = jest + .spyOn(console, 'error') + .mockImplementation(() => undefined) + + await runTask({ data: ENTER, error: new Error('location failed') }) + + expect(errorSpy).toHaveBeenCalled() + expect(getTodayEvents).not.toHaveBeenCalled() + }) + + it('does nothing without data', async () => { + await runTask({ data: null, error: null }) + + expect(getTodayEvents).not.toHaveBeenCalled() + }) + + it('catches database errors and does not notify', async () => { + const errorSpy = jest + .spyOn(console, 'error') + .mockImplementation(() => undefined) + jest.mocked(addEvent).mockImplementation(() => { + throw new Error('db locked') + }) + + await expect( + runTask({ data: ENTER, error: null }), + ).resolves.not.toThrow() + + expect(errorSpy).toHaveBeenCalled() + expect(Notifications.scheduleNotificationAsync).not.toHaveBeenCalled() + }) +}) diff --git a/src/services/NFCService.test.ts b/src/services/NFCService.test.ts new file mode 100644 index 0000000..a1a0760 --- /dev/null +++ b/src/services/NFCService.test.ts @@ -0,0 +1,177 @@ +/* eslint-disable @typescript-eslint/unbound-method -- + * `expect(mock)` / `jest.mocked(mock)` never call the reference with `this`, + * so passing mocked methods unbound is safe here. */ +import { + describe, + it, + expect, + beforeEach, + afterEach, + jest, +} from '@jest/globals' +import { Platform, Linking, ToastAndroid, BackHandler } from 'react-native' +import { getTodayEvents, addEvent } from '../db/database' +import { initNfcService } from './NFCService' +import { TimeEvent } from '../types' + +jest.mock('react-native', () => { + const subscription = { remove: jest.fn() } + return { + Platform: { OS: 'android' }, + ToastAndroid: { show: jest.fn(), SHORT: 0 }, + BackHandler: { exitApp: jest.fn() }, + Linking: { + getInitialURL: jest.fn(), + addEventListener: jest.fn(() => subscription), + }, + } +}) + +jest.mock('../db/database', () => ({ + getTodayEvents: jest.fn(), + addEvent: jest.fn(), +})) + +jest.mock('i18next', () => ({ + __esModule: true, + default: { t: (key: string) => key }, +})) + +const NFC_URL = 'timetracking://nfc' + +const makeEvent = (id: number, time: string): TimeEvent => ({ + id, + date: '2026-07-05', + time, + note: null, +}) + +const setPlatformOS = (os: string) => { + ;(Platform as { OS: string }).OS = os +} + +const initAndFlush = async () => { + initNfcService() + // let the getInitialURL promise chain settle + await jest.advanceTimersByTimeAsync(0) +} + +const receiveUrl = (url: string) => { + const listener = jest + .mocked(Linking.addEventListener) + .mock.calls.at(-1)?.[1] + if (!listener) throw new Error('url listener not registered') + listener({ url }) +} + +const registeredSubscription = () => + jest.mocked(Linking.addEventListener).mock.results[0].value as { + remove: () => void + } + +beforeEach(() => { + jest.clearAllMocks() + setPlatformOS('android') + jest.useFakeTimers() + jest.setSystemTime(new Date(2026, 6, 5, 9, 5)) + jest.mocked(getTodayEvents).mockReturnValue([]) + jest.mocked(Linking.getInitialURL).mockResolvedValue(null) +}) + +afterEach(() => { + jest.useRealTimers() +}) + +describe('initNfcService', () => { + it('checks in when launched with a matching initial url', async () => { + jest.mocked(Linking.getInitialURL).mockResolvedValue(NFC_URL) + + await initAndFlush() + + expect(addEvent).toHaveBeenCalledWith( + '2026-07-05', + '09:05', + 'nfc.checkinEvent', + ) + }) + + it('checks out when the day has an odd number of events', async () => { + jest.mocked(getTodayEvents).mockReturnValue([makeEvent(1, '08:00')]) + + await initAndFlush() + receiveUrl(NFC_URL) + + expect(addEvent).toHaveBeenCalledWith( + '2026-07-05', + '09:05', + 'nfc.checkoutEvent', + ) + }) + + it('handles url events received while running', async () => { + await initAndFlush() + receiveUrl(NFC_URL) + + expect(addEvent).toHaveBeenCalledTimes(1) + expect(ToastAndroid.show).toHaveBeenCalledWith( + 'nfc.checkedInAt 09:05', + expect.anything(), + ) + }) + + it('ignores non-matching and null initial urls', async () => { + await initAndFlush() + receiveUrl('https://example.com') + + expect(addEvent).not.toHaveBeenCalled() + }) + + it('exits the app 1500 ms after handling a tag', async () => { + await initAndFlush() + receiveUrl(NFC_URL) + + jest.advanceTimersByTime(1499) + expect(BackHandler.exitApp).not.toHaveBeenCalled() + + jest.advanceTimersByTime(1) + expect(BackHandler.exitApp).toHaveBeenCalledTimes(1) + }) + + it('does not show a toast on iOS but still exits', async () => { + setPlatformOS('ios') + + await initAndFlush() + receiveUrl(NFC_URL) + + expect(ToastAndroid.show).not.toHaveBeenCalled() + + jest.advanceTimersByTime(1500) + expect(BackHandler.exitApp).toHaveBeenCalledTimes(1) + }) + + it('catches database errors without scheduling an app exit', async () => { + const errorSpy = jest + .spyOn(console, 'error') + .mockImplementation(() => undefined) + jest.mocked(getTodayEvents).mockImplementation(() => { + throw new Error('db locked') + }) + + await initAndFlush() + expect(() => { + receiveUrl(NFC_URL) + }).not.toThrow() + + jest.advanceTimersByTime(2000) + expect(BackHandler.exitApp).not.toHaveBeenCalled() + expect(errorSpy).toHaveBeenCalled() + }) + + it('returns a cleanup that removes the url listener', async () => { + const cleanup = initNfcService() + await jest.advanceTimersByTimeAsync(0) + cleanup() + + expect(registeredSubscription().remove).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/services/QuickActionService.test.ts b/src/services/QuickActionService.test.ts new file mode 100644 index 0000000..34019c8 --- /dev/null +++ b/src/services/QuickActionService.test.ts @@ -0,0 +1,190 @@ +/* eslint-disable @typescript-eslint/unbound-method -- + * `expect(mock)` / `jest.mocked(mock)` never call the reference with `this`, + * so passing mocked methods unbound is safe here. */ +import { + describe, + it, + expect, + beforeEach, + afterEach, + jest, +} from '@jest/globals' +import * as QuickActions from 'expo-quick-actions' +import { Platform, ToastAndroid } from 'react-native' +import { getTodayEvents, addEvent } from '../db/database' +import { initQuickActions } from './QuickActionService' +import { TimeEvent } from '../types' + +jest.mock('expo-quick-actions', () => { + const state = { initial: null as { id: string } | null } + const subscription = { remove: jest.fn() } + return { + get initial() { + return state.initial + }, + __setInitial: (action: { id: string } | null) => { + state.initial = action + }, + setItems: jest.fn(), + addListener: jest.fn(() => subscription), + } +}) + +jest.mock('react-native', () => ({ + Platform: { OS: 'android' }, + ToastAndroid: { show: jest.fn(), SHORT: 0 }, +})) + +jest.mock('../db/database', () => ({ + getTodayEvents: jest.fn(), + addEvent: jest.fn(), +})) + +jest.mock('i18next', () => ({ + __esModule: true, + default: { t: (key: string) => key }, +})) + +// The factory replaces the read-only `initial` property with a getter and +// exposes this setter for it. +const setInitialAction = ( + QuickActions as unknown as { + __setInitial: (action: { id: string } | null) => void + } +).__setInitial + +const makeEvent = (id: number, time: string): TimeEvent => ({ + id, + date: '2026-07-05', + time, + note: null, +}) + +const setPlatformOS = (os: string) => { + ;(Platform as { OS: string }).OS = os +} + +const trigger = (action: { id: string } | null) => { + const listener = jest + .mocked(QuickActions.addListener) + .mock.calls.at(-1)?.[0] as + ((action: { id: string } | null) => void) | undefined + if (!listener) throw new Error('listener not registered') + listener(action) +} + +const registeredSubscription = () => + jest.mocked(QuickActions.addListener).mock.results[0].value as { + remove: () => void + } + +const toggleAction = { id: 'toggle_status' } + +beforeEach(() => { + jest.clearAllMocks() + setInitialAction(null) + setPlatformOS('android') + jest.useFakeTimers() + jest.setSystemTime(new Date(2026, 6, 5, 9, 5)) + jest.mocked(getTodayEvents).mockReturnValue([]) +}) + +afterEach(() => { + jest.useRealTimers() +}) + +describe('initQuickActions', () => { + it('registers the toggle quick-action item', () => { + initQuickActions() + + expect(QuickActions.setItems).toHaveBeenCalledWith([ + expect.objectContaining({ + id: 'toggle_status', + title: 'quickAction.title', + icon: 'shortcut_timer', + }), + ]) + }) + + it('handles a pending initial action', () => { + setInitialAction({ id: 'toggle_status' }) + + initQuickActions() + + expect(addEvent).toHaveBeenCalledTimes(1) + }) + + it('checks in when the day has an even number of events', () => { + initQuickActions() + trigger(toggleAction) + + expect(addEvent).toHaveBeenCalledWith( + '2026-07-05', + '09:05', + 'quickAction.checkinEvent', + ) + }) + + it('checks out when the day has an odd number of events', () => { + jest.mocked(getTodayEvents).mockReturnValue([makeEvent(1, '08:00')]) + + initQuickActions() + trigger(toggleAction) + + expect(addEvent).toHaveBeenCalledWith( + '2026-07-05', + '09:05', + 'quickAction.checkoutEvent', + ) + }) + + it('shows an Android toast containing the time', () => { + initQuickActions() + trigger(toggleAction) + + expect(ToastAndroid.show).toHaveBeenCalledWith( + 'quickAction.checkedInAt 09:05', + expect.anything(), + ) + }) + + it('does not show a toast on iOS', () => { + setPlatformOS('ios') + + initQuickActions() + trigger(toggleAction) + + expect(addEvent).toHaveBeenCalledTimes(1) + expect(ToastAndroid.show).not.toHaveBeenCalled() + }) + + it('ignores unrelated and null actions', () => { + initQuickActions() + trigger({ id: 'something_else' }) + trigger(null) + + expect(addEvent).not.toHaveBeenCalled() + }) + + it('returns a cleanup that removes the listener subscription', () => { + const cleanup = initQuickActions() + cleanup() + + expect(registeredSubscription().remove).toHaveBeenCalledTimes(1) + }) + + it('catches database errors without throwing', () => { + const errorSpy = jest + .spyOn(console, 'error') + .mockImplementation(() => undefined) + jest.mocked(getTodayEvents).mockImplementation(() => { + throw new Error('db locked') + }) + + initQuickActions() + expect(() => { + trigger(toggleAction) + }).not.toThrow() + expect(errorSpy).toHaveBeenCalled() + }) +}) diff --git a/src/test/expoSqliteAdapter.ts b/src/test/expoSqliteAdapter.ts new file mode 100644 index 0000000..288af0f --- /dev/null +++ b/src/test/expoSqliteAdapter.ts @@ -0,0 +1,58 @@ +import { DatabaseSync } from 'node:sqlite' + +/** + * In-memory stand-in for expo-sqlite backed by node:sqlite, implementing + * exactly the API surface used by src/db/database.ts. Used via + * `jest.mock('expo-sqlite', () => jest.requireActual('../test/expoSqliteAdapter'))` + * so the + * database module runs its real SQL against a real (in-memory) SQLite. + */ + +type BindParams = Record + +class MockSQLiteDatabase { + private readonly db = new DatabaseSync(':memory:') + + execSync(sql: string): void { + this.db.exec(sql) + } + + getAllSync(sql: string, params?: BindParams): T[] { + const statement = this.db.prepare(sql) + const rows = + params === undefined ? statement.all() : statement.all(params) + return rows as T[] + } + + prepareSync(sql: string) { + const statement = this.db.prepare(sql) + return { + executeSync(params?: BindParams) { + const result = + params === undefined + ? statement.run() + : statement.run(params) + return { + lastInsertRowId: Number(result.lastInsertRowid), + changes: Number(result.changes), + } + }, + finalizeSync() { + // node:sqlite statements are released by GC; nothing to do + }, + } + } + + withTransactionSync(fn: () => void): void { + this.db.exec('BEGIN') + try { + fn() + this.db.exec('COMMIT') + } catch (error) { + this.db.exec('ROLLBACK') + throw error + } + } +} + +export const openDatabaseSync = () => new MockSQLiteDatabase() diff --git a/src/test/jestSetup.ts b/src/test/jestSetup.ts new file mode 100644 index 0000000..f220dbb --- /dev/null +++ b/src/test/jestSetup.ts @@ -0,0 +1,11 @@ +/** + * jest-expo's preset setup installs expo's winter-runtime globals (`fetch`, + * …) as lazy properties whose first read requires expo modules. In suites + * that mock 'react-native', that first read only happens after the last test, + * when jest has already torn the module registry down — producing + * "Cannot log after tests are done" warnings. Reading the global here + * resolves it while the runtime is still alive. + */ +if (typeof globalThis.fetch !== 'function') { + throw new Error('expected the jest-expo setup to install a fetch global') +} diff --git a/src/utils/csv.test.ts b/src/utils/csv.test.ts new file mode 100644 index 0000000..cac62be --- /dev/null +++ b/src/utils/csv.test.ts @@ -0,0 +1,426 @@ +import { + describe, + it, + expect, + beforeEach, + afterEach, + jest, +} from '@jest/globals' +import * as Sharing from 'expo-sharing' +import * as DocumentPicker from 'expo-document-picker' +import { + getAllEvents, + getWorkHoursHistory, + importEvents, + importWorkHours, +} from '../db/database' +import { exportToCSV, importFromCSV } from './csv' +import { TimeEvent } from '../types' + +// The name must start with `mock` so the hoisted jest.mock factory below may +// reference it; the factory only reads it lazily (inside File methods), after +// this initializer has run. +const mockFileState = { + written: [] as { name: string; content: string }[], + textContent: '', + writeError: null as Error | null, + textError: null as Error | null, +} + +jest.mock('expo-file-system', () => { + class File { + readonly name: string + + constructor(...parts: string[]) { + this.name = parts.join('/') + } + + get uri() { + return `file://${this.name}` + } + + create() { + // nothing to create in memory + } + + write(content: string) { + if (mockFileState.writeError) throw mockFileState.writeError + mockFileState.written.push({ name: this.name, content }) + } + + text() { + if (mockFileState.textError) { + return Promise.reject(mockFileState.textError) + } + return Promise.resolve(mockFileState.textContent) + } + } + + return { File, Paths: { document: '/documents' } } +}) + +jest.mock('expo-sharing', () => ({ + isAvailableAsync: jest.fn(), + shareAsync: jest.fn(), +})) + +jest.mock('expo-document-picker', () => ({ + getDocumentAsync: jest.fn(), +})) + +jest.mock('../db/database', () => ({ + getAllEvents: jest.fn(), + getWorkHoursHistory: jest.fn(), + importEvents: jest.fn(), + importWorkHours: jest.fn(), +})) + +const makeEvent = (overrides: Partial): TimeEvent => ({ + id: 1, + date: '2024-01-15', + time: '09:00', + note: null, + isManualEntry: false, + ...overrides, +}) + +const pickFile = (content: string) => { + mockFileState.textContent = content + jest.mocked(DocumentPicker.getDocumentAsync).mockResolvedValue({ + canceled: false, + assets: [ + { + uri: 'file:///picked/import.csv', + name: 'import.csv', + mimeType: 'text/csv', + lastModified: 0, + }, + ], + }) +} + +beforeEach(() => { + jest.clearAllMocks() + mockFileState.written = [] + mockFileState.textContent = '' + mockFileState.writeError = null + mockFileState.textError = null + jest.mocked(getAllEvents).mockReturnValue([]) + jest.mocked(getWorkHoursHistory).mockReturnValue([]) + jest.mocked(Sharing.isAvailableAsync).mockResolvedValue(true) +}) + +afterEach(() => { + jest.useRealTimers() +}) + +describe('exportToCSV', () => { + it('writes the header row even without events and shares the file', async () => { + const result = await exportToCSV() + + expect(result).toEqual({ success: true }) + expect(mockFileState.written).toHaveLength(1) + // papaparse emits a trailing newline when there are no data rows + expect(mockFileState.written[0].content).toBe( + 'Date,Time,Note,IsManualEntry\r\n', + ) + expect(Sharing.shareAsync).toHaveBeenCalledWith( + `file://${mockFileState.written[0].name}`, + ) + }) + + it('writes one row per event with true/false manual-entry strings', async () => { + jest.mocked(getAllEvents).mockReturnValue([ + makeEvent({ note: 'Morning', isManualEntry: true }), + makeEvent({ id: 2, time: '17:00' }), + ]) + + await exportToCSV() + + expect(mockFileState.written[0].content).toBe( + 'Date,Time,Note,IsManualEntry\r\n' + + '2024-01-15,09:00,Morning,true\r\n' + + '2024-01-15,17:00,,false', + ) + }) + + it('appends the work-hours section when history exists', async () => { + jest.mocked(getWorkHoursHistory).mockReturnValue([ + { effectiveDate: '2024-01-01', dailyMinutes: 480 }, + { effectiveDate: '2024-06-01', dailyMinutes: 420 }, + ]) + + await exportToCSV() + + expect(mockFileState.written[0].content).toBe( + 'Date,Time,Note,IsManualEntry\r\n' + + '\r\n\r\n[WorkHours]\r\n' + + '2024-01-01=480\r\n2024-06-01=420', + ) + }) + + it('omits the work-hours section when the history is empty', async () => { + await exportToCSV() + + expect(mockFileState.written[0].content).not.toContain('[WorkHours]') + }) + + it('names the file with the current date', async () => { + jest.useFakeTimers() + jest.setSystemTime(new Date(2024, 0, 15, 12, 0)) + + await exportToCSV() + + expect(mockFileState.written[0].name).toBe( + '/documents/time_tracking_export_2024-01-15.csv', + ) + }) + + it('reports when sharing is unavailable and does not share', async () => { + jest.mocked(Sharing.isAvailableAsync).mockResolvedValue(false) + + const result = await exportToCSV() + + expect(result).toEqual({ + success: false, + message: 'csv.sharingUnavailable', + }) + expect(Sharing.shareAsync).not.toHaveBeenCalled() + }) + + it('reports a failure when writing throws', async () => { + const errorSpy = jest + .spyOn(console, 'error') + .mockImplementation(() => undefined) + mockFileState.writeError = new Error('disk full') + + const result = await exportToCSV() + + expect(result).toEqual({ success: false, message: 'csv.exportFailed' }) + expect(errorSpy).toHaveBeenCalled() + }) +}) + +describe('importFromCSV', () => { + it('reports cancellation without touching the database', async () => { + jest.mocked(DocumentPicker.getDocumentAsync).mockResolvedValue({ + canceled: true, + assets: null, + }) + + const result = await importFromCSV() + + expect(result).toEqual({ success: false, cancelled: true }) + expect(importEvents).not.toHaveBeenCalled() + expect(importWorkHours).not.toHaveBeenCalled() + }) + + it('imports events and maps the manual-entry flag', async () => { + pickFile( + 'Date,Time,Note,IsManualEntry\r\n' + + '2024-01-15,09:00,Morning,true\r\n' + + '2024-01-15,17:00,,false', + ) + + const result = await importFromCSV() + + expect(result).toEqual({ success: true, count: 2, workHoursCount: 0 }) + expect(importEvents).toHaveBeenCalledWith([ + { + date: '2024-01-15', + time: '09:00', + note: 'Morning', + isManualEntry: true, + }, + { + date: '2024-01-15', + time: '17:00', + note: '', + isManualEntry: false, + }, + ]) + expect(importWorkHours).not.toHaveBeenCalled() + }) + + it('maps a missing note column to null', async () => { + pickFile('Date,Time\r\n2024-01-15,09:00') + + await importFromCSV() + + expect(importEvents).toHaveBeenCalledWith([ + { + date: '2024-01-15', + time: '09:00', + note: null, + isManualEntry: false, + }, + ]) + }) + + it('skips rows without a time value', async () => { + pickFile( + 'Date,Time,Note,IsManualEntry\r\n' + + '2024-01-15,,broken,false\r\n' + + '2024-01-15,09:00,,false', + ) + + const result = await importFromCSV() + + expect(result).toEqual({ success: true, count: 1, workHoursCount: 0 }) + }) + + it('parses the work-hours section', async () => { + pickFile( + 'Date,Time,Note,IsManualEntry\r\n' + + '2024-01-15,09:00,,false\r\n' + + '[WorkHours]\r\n' + + '2024-01-01=480\r\n' + + '2024-06-01=420', + ) + + const result = await importFromCSV() + + expect(result).toEqual({ success: true, count: 1, workHoursCount: 2 }) + expect(importWorkHours).toHaveBeenCalledWith([ + { effectiveDate: '2024-01-01', dailyMinutes: 480 }, + { effectiveDate: '2024-06-01', dailyMinutes: 420 }, + ]) + }) + + it('rejects out-of-range daily minutes', async () => { + pickFile( + 'Date,Time,Note,IsManualEntry\r\n' + + '[WorkHours]\r\n' + + '2024-01-01=0\r\n' + + '2024-01-02=1440\r\n' + + '2024-01-03=1439', + ) + + const result = await importFromCSV() + + expect(result).toEqual({ success: true, count: 0, workHoursCount: 1 }) + expect(importWorkHours).toHaveBeenCalledWith([ + { effectiveDate: '2024-01-03', dailyMinutes: 1439 }, + ]) + }) + + it('ignores malformed work-hours lines', async () => { + pickFile( + 'Date,Time,Note,IsManualEntry\r\n' + + '[WorkHours]\r\n' + + 'not-a-date=480\r\n' + + '2024-01-01=abc\r\n' + + '2024-01-01480', + ) + + const result = await importFromCSV() + + expect(result).toEqual({ + success: false, + message: 'csv.noImportableData', + }) + }) + + it('does not treat the marker inside a quoted note as the section start', async () => { + pickFile( + 'Date,Time,Note,IsManualEntry\r\n' + + '2024-01-15,09:00,"[WorkHours]",false\r\n' + + '2024-01-15,17:00,,false', + ) + + const result = await importFromCSV() + + expect(result).toEqual({ success: true, count: 2, workHoursCount: 0 }) + expect(importEvents).toHaveBeenCalledWith([ + expect.objectContaining({ note: '[WorkHours]' }), + expect.objectContaining({ time: '17:00' }), + ]) + }) + + it('does not import event-shaped rows after the section marker', async () => { + pickFile( + 'Date,Time,Note,IsManualEntry\r\n' + + '2024-01-15,09:00,,false\r\n' + + '[WorkHours]\r\n' + + '2024-01-16,10:00,Sneaky,false', + ) + + const result = await importFromCSV() + + expect(result).toEqual({ success: true, count: 1, workHoursCount: 0 }) + expect(importEvents).toHaveBeenCalledWith([ + expect.objectContaining({ time: '09:00' }), + ]) + }) + + it('reports a header-only file as not importable', async () => { + pickFile('Date,Time,Note,IsManualEntry') + + const result = await importFromCSV() + + expect(result).toEqual({ + success: false, + message: 'csv.noImportableData', + }) + expect(importEvents).not.toHaveBeenCalled() + expect(importWorkHours).not.toHaveBeenCalled() + }) + + it('only calls the importers that received data', async () => { + pickFile( + 'Date,Time,Note,IsManualEntry\r\n' + + '[WorkHours]\r\n' + + '2024-01-01=480', + ) + + const result = await importFromCSV() + + expect(result).toEqual({ success: true, count: 0, workHoursCount: 1 }) + expect(importEvents).not.toHaveBeenCalled() + expect(importWorkHours).toHaveBeenCalledTimes(1) + }) + + it('reports a failure when reading the file throws', async () => { + const errorSpy = jest + .spyOn(console, 'error') + .mockImplementation(() => undefined) + pickFile('irrelevant') + mockFileState.textError = new Error('unreadable') + + const result = await importFromCSV() + + expect(result).toEqual({ success: false, message: 'csv.importFailed' }) + expect(errorSpy).toHaveBeenCalled() + }) + + it('round-trips notes with commas, quotes and newlines', async () => { + const trickyNotes = [ + 'has, a comma', + 'has "quotes" inside', + 'spans\nmultiple lines', + ] + jest.mocked(getAllEvents).mockReturnValue( + trickyNotes.map((note, index) => + makeEvent({ id: index + 1, note }), + ), + ) + jest.mocked(getWorkHoursHistory).mockReturnValue([ + { effectiveDate: '2024-01-01', dailyMinutes: 480 }, + ]) + + await exportToCSV() + pickFile(mockFileState.written[0].content) + + const result = await importFromCSV() + + expect(result).toEqual({ success: true, count: 3, workHoursCount: 1 }) + expect(importEvents).toHaveBeenCalledWith( + trickyNotes.map( + (note) => expect.objectContaining({ note }) as unknown, + ), + ) + expect(importWorkHours).toHaveBeenCalledWith([ + { effectiveDate: '2024-01-01', dailyMinutes: 480 }, + ]) + }) +}) diff --git a/src/utils/dateShift.test.ts b/src/utils/dateShift.test.ts new file mode 100644 index 0000000..070b147 --- /dev/null +++ b/src/utils/dateShift.test.ts @@ -0,0 +1,59 @@ +import { describe, it, expect } from '@jest/globals' +import { shiftToUTC, shiftToLocal } from './dateShift' + +describe('shiftToUTC', () => { + it('copies the local wall-clock fields into UTC fields', () => { + const date = new Date(2023, 5, 15, 14, 30, 45) // Jun 15, 2023 14:30:45 local + const shifted = shiftToUTC(date) + + expect(shifted.getUTCFullYear()).toBe(2023) + expect(shifted.getUTCMonth()).toBe(5) + expect(shifted.getUTCDate()).toBe(15) + expect(shifted.getUTCHours()).toBe(14) + expect(shifted.getUTCMinutes()).toBe(30) + expect(shifted.getUTCSeconds()).toBe(45) + }) + + it('handles the end of the year', () => { + const date = new Date(2023, 11, 31, 23, 59, 59) + const shifted = shiftToUTC(date) + + expect(shifted.getUTCFullYear()).toBe(2023) + expect(shifted.getUTCMonth()).toBe(11) + expect(shifted.getUTCDate()).toBe(31) + expect(shifted.getUTCHours()).toBe(23) + expect(shifted.getUTCMinutes()).toBe(59) + }) +}) + +describe('shiftToLocal', () => { + it('copies the UTC fields into local wall-clock fields', () => { + const date = new Date(Date.UTC(2023, 5, 15, 14, 30, 45)) + const shifted = shiftToLocal(date) + + expect(shifted.getFullYear()).toBe(2023) + expect(shifted.getMonth()).toBe(5) + expect(shifted.getDate()).toBe(15) + expect(shifted.getHours()).toBe(14) + expect(shifted.getMinutes()).toBe(30) + expect(shifted.getSeconds()).toBe(45) + }) + + it('is the inverse of shiftToUTC', () => { + const dates = [ + new Date(2023, 0, 1, 0, 0, 0), + new Date(2023, 5, 15, 14, 30, 45), + new Date(2023, 11, 31, 23, 59, 59), + new Date(2024, 1, 29, 12, 0, 0), // leap day + ] + + for (const date of dates) { + expect(shiftToLocal(shiftToUTC(date)).getTime()).toBe( + date.getTime(), + ) + expect(shiftToUTC(shiftToLocal(date)).getTime()).toBe( + date.getTime(), + ) + } + }) +}) diff --git a/src/utils/dateShift.ts b/src/utils/dateShift.ts new file mode 100644 index 0000000..285d877 --- /dev/null +++ b/src/utils/dateShift.ts @@ -0,0 +1,37 @@ +/** + * Reinterprets the local wall-clock fields of a date as UTC fields. + * Used to hand a date to pickers that operate on UTC values. + * + * @param date - The date whose local fields should be kept. + * @returns A new Date whose UTC fields equal the input's local fields. + */ +export const shiftToUTC = (date: Date) => { + return new Date( + Date.UTC( + date.getFullYear(), + date.getMonth(), + date.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), + ), + ) +} + +/** + * Inverse of {@link shiftToUTC}: reinterprets the UTC fields of a date as + * local wall-clock fields. + * + * @param date - The date whose UTC fields should be kept. + * @returns A new Date whose local fields equal the input's UTC fields. + */ +export const shiftToLocal = (date: Date) => { + return new Date( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + date.getUTCHours(), + date.getUTCMinutes(), + date.getUTCSeconds(), + ) +} diff --git a/src/utils/time.test.ts b/src/utils/time.test.ts index 3d9ef55..01a9706 100644 --- a/src/utils/time.test.ts +++ b/src/utils/time.test.ts @@ -1,8 +1,9 @@ -import { describe, it, expect } from 'vitest' +import { describe, it, expect } from '@jest/globals' import { formatTime, getFormattedTime, getFormattedDate, + getFormattedMonth, getLocaleDateString, } from './time' @@ -80,6 +81,23 @@ describe('getFormattedDate', () => { }) }) +describe('getFormattedMonth', () => { + it('formats month correctly with zero-padding', () => { + const date = new Date(2023, 0, 15) // Jan 15, 2023 + expect(getFormattedMonth(date)).toBe('2023-01') + }) + + it('handles two-digit months correctly', () => { + const date = new Date(2023, 9, 1) // Oct 1, 2023 + expect(getFormattedMonth(date)).toBe('2023-10') + }) + + it('handles December correctly', () => { + const date = new Date(2023, 11, 31) // Dec 31, 2023 + expect(getFormattedMonth(date)).toBe('2023-12') + }) +}) + describe('getLocaleDateString', () => { it('returns empty string for empty input', () => { expect(getLocaleDateString('', 'en-US')).toBe('') diff --git a/src/utils/workHours.test.ts b/src/utils/workHours.test.ts index 039f18a..ed92bf7 100644 --- a/src/utils/workHours.test.ts +++ b/src/utils/workHours.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect } from 'vitest' +import { describe, it, expect } from '@jest/globals' import { DEFAULT_DAILY_TARGET_MINUTES, resolveDailyTarget, diff --git a/tsconfig.foss.json b/tsconfig.foss.json index a82adec..4dfd0d0 100644 --- a/tsconfig.foss.json +++ b/tsconfig.foss.json @@ -6,6 +6,7 @@ "exclude": [ "node_modules", "src/screens/menu/GeofenceSetupScreen.tsx", - "src/services/LocationTask.ts" + "src/services/LocationTask.ts", + "src/services/LocationTask.test.ts" ] } diff --git a/vitest.config.ts b/vitest.config.ts deleted file mode 100644 index f963ff1..0000000 --- a/vitest.config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { defineConfig } from 'vitest/config' -import react, { reactCompilerPreset } from '@vitejs/plugin-react' -import babel from '@rolldown/plugin-babel' - -export default defineConfig({ - plugins: [ - react(), - babel({ - presets: [reactCompilerPreset()], - }), - ], - test: { - coverage: { - provider: 'v8', - include: ['src/**/*.{ts,tsx}'], - exclude: [ - 'src/**/*.test.{ts,tsx}', - 'src/**/*.d.ts', - 'src/i18n/locales/*.ts', // often don't need coverage for just translation files - ], - }, - }, -}) diff --git a/yarn.lock b/yarn.lock index 7de4c4f..0ed4b14 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,7 +12,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.20.0, @babel/code-frame@npm:^7.29.0, @babel/code-frame@npm:^7.29.7": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.20.0, @babel/code-frame@npm:^7.29.0, @babel/code-frame@npm:^7.29.7": version: 7.29.7 resolution: "@babel/code-frame@npm:7.29.7" dependencies: @@ -30,7 +30,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.20.0, @babel/core@npm:^7.24.4, @babel/core@npm:^7.25.2, @babel/core@npm:^7.29.0": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.0, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.4, @babel/core@npm:^7.25.2, @babel/core@npm:^7.29.0": version: 7.29.7 resolution: "@babel/core@npm:7.29.7" dependencies: @@ -53,7 +53,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.20.5, @babel/generator@npm:^7.29.1, @babel/generator@npm:^7.29.7": +"@babel/generator@npm:^7.20.5, @babel/generator@npm:^7.29.1, @babel/generator@npm:^7.29.7, @babel/generator@npm:^7.7.2": version: 7.29.7 resolution: "@babel/generator@npm:7.29.7" dependencies: @@ -182,7 +182,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.29.7, @babel/helper-plugin-utils@npm:^7.8.0": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.29.7, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.29.7 resolution: "@babel/helper-plugin-utils@npm:7.29.7" checksum: 10c0/380477a06133274a2759f9355929cb60a95e8b8fee624a1ae1fa349e1d1645b89daca456f72833f6d1062bffa12ee4271c5bf0cc5a61c0166cdc24c7591e2408 @@ -267,7 +267,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.24.4, @babel/parser@npm:^7.29.0, @babel/parser@npm:^7.29.7": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.4, @babel/parser@npm:^7.29.0, @babel/parser@npm:^7.29.7": version: 7.29.7 resolution: "@babel/parser@npm:7.29.7" dependencies: @@ -302,6 +302,50 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.12.13": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.12.13" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-static-block@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 + languageName: node + linkType: hard + "@babel/plugin-syntax-decorators@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-syntax-decorators@npm:7.27.1" @@ -346,7 +390,40 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.29.7": +"@babel/plugin-syntax-import-attributes@npm:^7.24.7": + version: 7.29.7 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b9a47e869d8c06676297069895ae34e2bd244ec4c3bdf15002f1e69aed32eef0361044af22a43f271b8de5e23a40534fe6a74a63e7ab98e3d60a74b322444b49 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.29.7, @babel/plugin-syntax-jsx@npm:^7.7.2": version: 7.29.7 resolution: "@babel/plugin-syntax-jsx@npm:7.29.7" dependencies: @@ -357,6 +434,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b + languageName: node + linkType: hard + "@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": version: 7.8.3 resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" @@ -368,6 +456,39 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af + languageName: node + linkType: hard + "@babel/plugin-syntax-optional-chaining@npm:^7.8.3": version: 7.8.3 resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" @@ -379,7 +500,29 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.29.7": +"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.29.7, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.29.7 resolution: "@babel/plugin-syntax-typescript@npm:7.29.7" dependencies: @@ -814,7 +957,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.27.2, @babel/template@npm:^7.28.6, @babel/template@npm:^7.29.7": +"@babel/template@npm:^7.27.2, @babel/template@npm:^7.28.6, @babel/template@npm:^7.29.7, @babel/template@npm:^7.3.3": version: 7.29.7 resolution: "@babel/template@npm:7.29.7" dependencies: @@ -840,7 +983,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.26.0, @babel/types@npm:^7.27.1, @babel/types@npm:^7.28.2, @babel/types@npm:^7.29.0, @babel/types@npm:^7.29.7": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.26.0, @babel/types@npm:^7.27.1, @babel/types@npm:^7.28.2, @babel/types@npm:^7.29.0, @babel/types@npm:^7.29.7, @babel/types@npm:^7.3.3": version: 7.29.7 resolution: "@babel/types@npm:7.29.7" dependencies: @@ -850,10 +993,10 @@ __metadata: languageName: node linkType: hard -"@bcoe/v8-coverage@npm:^1.0.2": - version: 1.0.2 - resolution: "@bcoe/v8-coverage@npm:1.0.2" - checksum: 10c0/1eb1dc93cc17fb7abdcef21a6e7b867d6aa99a7ec88ec8207402b23d9083ab22a8011213f04b2cf26d535f1d22dc26139b7929e6c2134c254bd1e14ba5e678c3 +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 10c0/6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 languageName: node linkType: hard @@ -878,34 +1021,6 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:1.11.1": - version: 1.11.1 - resolution: "@emnapi/core@npm:1.11.1" - dependencies: - "@emnapi/wasi-threads": "npm:1.2.2" - tslib: "npm:^2.4.0" - checksum: 10c0/2c6defdac2d1d26090384655d7d6c9614fa553853b1760597686749e9375dc2aa0dae80a2615b81c254600f5d531d07d8466cde0d331a8caae64b93f3ca5937e - languageName: node - linkType: hard - -"@emnapi/runtime@npm:1.11.1": - version: 1.11.1 - resolution: "@emnapi/runtime@npm:1.11.1" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/04332fb62076afc440aa23316c04bec42f584ca8b074e5507d08e2b33a47cbe0493b1aadb8f3c1057b64ae1e17f5bde1a7bc37f7facc9d0bc25c18197cbd366f - languageName: node - linkType: hard - -"@emnapi/wasi-threads@npm:1.2.2": - version: 1.2.2 - resolution: "@emnapi/wasi-threads@npm:1.2.2" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/f0dc8269d6b20ae5a7c7b36e7a6a333452009d461038ef4febb29da2f3f78c1e2b1576d7e8970a5c5789ed3caedc1f80f5b0c2a5373bdaf8d03b20432bb55747 - languageName: node - linkType: hard - "@epic-web/invariant@npm:^1.0.0": version: 1.0.0 resolution: "@epic-web/invariant@npm:1.0.0" @@ -1621,6 +1736,184 @@ __metadata: languageName: node linkType: hard +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: "npm:^5.3.1" + find-up: "npm:^4.1.0" + get-package-type: "npm:^0.1.0" + js-yaml: "npm:^3.13.1" + resolve-from: "npm:^5.0.0" + checksum: 10c0/dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": + version: 0.1.6 + resolution: "@istanbuljs/schema@npm:0.1.6" + checksum: 10c0/bb0d370bf3dd454d2f37f1bccb8921e2da99adacef2da56ef47850e25d7a4de69cf639ead8c189755aef38921369024b4afea3535a5c2ac9082b3e1171bcbc3a + languageName: node + linkType: hard + +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/7be408781d0a6f657e969cbec13b540c329671819c2f57acfad0dae9dbfe2c9be859f38fe99b35dba9ff1536937dc6ddc69fdcd2794812fa3c647a1619797f6c + languageName: node + linkType: hard + +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/reporters": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-changed-files: "npm:^29.7.0" + jest-config: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-resolve-dependencies: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-ansi: "npm:^6.0.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2 + languageName: node + linkType: hard + +"@jest/create-cache-key-function@npm:^29.2.1, @jest/create-cache-key-function@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/create-cache-key-function@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + checksum: 10c0/5c47ef62205264adf77b1ff26b969ce9fe84920b8275c3c5e83f4236859d6ae5e4e7027af99eef04a8e334c4e424d44af3e167972083406070aca733ac2a2795 + languageName: node + linkType: hard + +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + checksum: 10c0/c7b1b40c618f8baf4d00609022d2afa086d9c6acc706f303a70bb4b67275868f620ad2e1a9efc5edd418906157337cce50589a627a6400bbdf117d351b91ef86 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + checksum: 10c0/60b79d23a5358dc50d9510d726443316253ecda3a7fb8072e1526b3e0d3b14f066ee112db95699b7a43ad3f0b61b750c72e28a5a1cac361d7a2bb34747fa938a + languageName: node + linkType: hard + +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" + dependencies: + expect: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b41f193fb697d3ced134349250aed6ccea075e48c4f803159db102b826a4e473397c68c31118259868fd69a5cba70e97e1c26d2c2ff716ca39dc73a2ccec037e + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@sinonjs/fake-timers": "npm:^10.0.2" + "@types/node": "npm:*" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/cf0a8bcda801b28dc2e2b2ba36302200ee8104a45ad7a21e6c234148932f826cb3bc57c8df3b7b815aeea0861d7b6ca6f0d4778f93b9219398ef28749e03595c + languageName: node + linkType: hard + +"@jest/globals@npm:^29.2.1, @jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + jest-mock: "npm:^29.7.0" + checksum: 10c0/a385c99396878fe6e4460c43bd7bb0a5cc52befb462cc6e7f2a3810f9e7bcce7cdeb51908fd530391ee452dc856c98baa2c5f5fa8a5b30b071d31ef7f6955cea + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@jest/console": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + collect-v8-coverage: "npm:^1.0.0" + exit: "npm:^0.1.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-instrument: "npm:^6.0.0" + istanbul-lib-report: "npm:^3.0.0" + istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-reports: "npm:^3.1.3" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + slash: "npm:^3.0.0" + string-length: "npm:^4.0.1" + strip-ansi: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2 + languageName: node + linkType: hard + "@jest/schemas@npm:^29.6.3": version: 29.6.3 resolution: "@jest/schemas@npm:29.6.3" @@ -1630,6 +1923,64 @@ __metadata: languageName: node linkType: hard +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + callsites: "npm:^3.0.0" + graceful-fs: "npm:^4.2.9" + checksum: 10c0/a2f177081830a2e8ad3f2e29e20b63bd40bade294880b595acf2fc09ec74b6a9dd98f126a2baa2bf4941acd89b13a4ade5351b3885c224107083a0059b60a219 + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + collect-v8-coverage: "npm:^1.0.0" + checksum: 10c0/7de54090e54a674ca173470b55dc1afdee994f2d70d185c80236003efd3fa2b753fff51ffcdda8e2890244c411fd2267529d42c4a50a8303755041ee493e6a04 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b + languageName: node + linkType: hard + +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + babel-plugin-istanbul: "npm:^6.1.1" + chalk: "npm:^4.0.0" + convert-source-map: "npm:^2.0.0" + fast-json-stable-stringify: "npm:^2.1.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pirates: "npm:^4.0.4" + slash: "npm:^3.0.0" + write-file-atomic: "npm:^4.0.2" + checksum: 10c0/7f4a7f73dcf45dfdf280c7aa283cbac7b6e5a904813c3a93ead7e55873761fc20d5c4f0191d2019004fac6f55f061c82eb3249c2901164ad80e362e7a7ede5a6 + languageName: node + linkType: hard + "@jest/types@npm:^29.6.3": version: 29.6.3 resolution: "@jest/types@npm:29.6.3" @@ -1688,7 +2039,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.31": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28": version: 0.3.31 resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: @@ -1756,18 +2107,6 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^1.1.6": - version: 1.1.6 - resolution: "@napi-rs/wasm-runtime@npm:1.1.6" - dependencies: - "@tybys/wasm-util": "npm:^0.10.3" - peerDependencies: - "@emnapi/core": ^1.7.1 - "@emnapi/runtime": ^1.7.1 - checksum: 10c0/344518bf3ef65051dda4c00969f293aa4a21ab7dc7822b3f48519b17cd5eaa3f0bc34898d115d50ba59b1817a0cb905d46f7a7223c8249239cd14c28db388e10 - languageName: node - linkType: hard - "@npmcli/agent@npm:^4.0.0": version: 4.0.0 resolution: "@npmcli/agent@npm:4.0.0" @@ -1790,13 +2129,6 @@ __metadata: languageName: node linkType: hard -"@oxc-project/types@npm:=0.137.0": - version: 0.137.0 - resolution: "@oxc-project/types@npm:0.137.0" - checksum: 10c0/5a6a50174e5ac79aebf38a120fe57be7a84c8bb0c77117f30de15183aa5ab0161e78364d2d3725397090e362e5c5f6eda754b53057b0b63983e3ee604f888aca - languageName: node - linkType: hard - "@radix-ui/primitive@npm:1.1.3": version: 1.1.3 resolution: "@radix-ui/primitive@npm:1.1.3" @@ -2387,6 +2719,21 @@ __metadata: languageName: node linkType: hard +"@react-native/jest-preset@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/jest-preset@npm:0.86.0" + dependencies: + "@jest/create-cache-key-function": "npm:^29.7.0" + "@react-native/js-polyfills": "npm:0.86.0" + babel-jest: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + regenerator-runtime: "npm:^0.13.2" + peerDependencies: + react: ^19.2.3 + checksum: 10c0/34f6ffe9c6cedbb23eaeffa801a3dfea75034740dca2c7685aa1bbef42a5f12aa735c17e041142a4551176410b641c35656861c94827e73341a39d40b20b5fbb + languageName: node + linkType: hard + "@react-native/js-polyfills@npm:0.86.0": version: 0.86.0 resolution: "@react-native/js-polyfills@npm:0.86.0" @@ -2451,155 +2798,28 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-android-arm64@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-android-arm64@npm:1.1.3" - conditions: os=android & cpu=arm64 +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e languageName: node linkType: hard -"@rolldown/binding-darwin-arm64@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-darwin-arm64@npm:1.1.3" - conditions: os=darwin & cpu=arm64 +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" + dependencies: + type-detect: "npm:4.0.8" + checksum: 10c0/1227a7b5bd6c6f9584274db996d7f8cee2c8c350534b9d0141fc662eaf1f292ea0ae3ed19e5e5271c8fd390d27e492ca2803acd31a1978be2cdc6be0da711403 languageName: node linkType: hard -"@rolldown/binding-darwin-x64@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-darwin-x64@npm:1.1.3" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-freebsd-x64@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-freebsd-x64@npm:1.1.3" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm-gnueabihf@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.1.3" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm64-gnu@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.1.3" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm64-musl@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-linux-arm64-musl@npm:1.1.3" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rolldown/binding-linux-ppc64-gnu@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.1.3" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-s390x-gnu@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.1.3" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-x64-gnu@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-linux-x64-gnu@npm:1.1.3" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-x64-musl@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-linux-x64-musl@npm:1.1.3" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rolldown/binding-openharmony-arm64@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-openharmony-arm64@npm:1.1.3" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-wasm32-wasi@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-wasm32-wasi@npm:1.1.3" - dependencies: - "@emnapi/core": "npm:1.11.1" - "@emnapi/runtime": "npm:1.11.1" - "@napi-rs/wasm-runtime": "npm:^1.1.6" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@rolldown/binding-win32-arm64-msvc@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.1.3" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-win32-x64-msvc@npm:1.1.3": - version: 1.1.3 - resolution: "@rolldown/binding-win32-x64-msvc@npm:1.1.3" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/plugin-babel@npm:0.2.3": - version: 0.2.3 - resolution: "@rolldown/plugin-babel@npm:0.2.3" +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" dependencies: - picomatch: "npm:^4.0.4" - peerDependencies: - "@babel/core": ^7.29.0 || ^8.0.0-rc.1 - "@babel/plugin-transform-runtime": ^7.29.0 || ^8.0.0-rc.1 - "@babel/runtime": ^7.27.0 || ^8.0.0-rc.1 - rolldown: ^1.0.0-rc.5 - vite: ^8.0.0 - peerDependenciesMeta: - "@babel/plugin-transform-runtime": - optional: true - "@babel/runtime": - optional: true - vite: - optional: true - checksum: 10c0/84afe9854137b576f963f4fd11080dc0b8afe6243d565513d33ddfed9ea9149652110def881a3911b5e889f5fa505df036c6839f4d0fd01d4222297d7f2baa21 - languageName: node - linkType: hard - -"@rolldown/pluginutils@npm:^1.0.0, @rolldown/pluginutils@npm:^1.0.1": - version: 1.0.1 - resolution: "@rolldown/pluginutils@npm:1.0.1" - checksum: 10c0/99d9b06d90196823e4d8c841f258db7a16e5dbba5824a2962b05d907b79f1ba929d56f22dd744fd530936e568c865ee56a719dc31e57e13bc0a8eb4764a8d8dd - languageName: node - linkType: hard - -"@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e - languageName: node - linkType: hard - -"@standard-schema/spec@npm:^1.1.0": - version: 1.1.0 - resolution: "@standard-schema/spec@npm:1.1.0" - checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 + "@sinonjs/commons": "npm:^3.0.0" + checksum: 10c0/2e2fb6cc57f227912814085b7b01fede050cd4746ea8d49a1e44d5a0e56a804663b0340ae2f11af7559ea9bf4d087a11f2f646197a660ea3cb04e19efc04aa63 languageName: node linkType: hard @@ -2626,6 +2846,13 @@ __metadata: languageName: node linkType: hard +"@tootallnate/once@npm:2": + version: 2.0.1 + resolution: "@tootallnate/once@npm:2.0.1" + checksum: 10c0/23b01a341485be711c602077936d70f8e695405bb88ab4433dc6d1e6cb4556401518789574d399eded790b70b27738136c9a8f02df7ae4219f4ba28bb22d586b + languageName: node + linkType: hard + "@turf/distance@npm:7.3.5, @turf/distance@npm:^7.3.5": version: 7.3.5 resolution: "@turf/distance@npm:7.3.5" @@ -2697,33 +2924,48 @@ __metadata: languageName: node linkType: hard -"@tybys/wasm-util@npm:^0.10.3": - version: 0.10.3 - resolution: "@tybys/wasm-util@npm:0.10.3" +"@types/babel__core@npm:^7.1.14": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/fd2bd2a79c6cd8c79ed1cf7a0fa375c64589264c88a27acaf9756d556b453ea222b62a4f68dd2fbb8b3a78b6bab3b1f4fb2431b6afc6aeda8344b53a521a1cd3 + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff languageName: node linkType: hard -"@types/chai@npm:^5.2.2": - version: 5.2.3 - resolution: "@types/chai@npm:5.2.3" +"@types/babel__generator@npm:*": + version: 7.27.0 + resolution: "@types/babel__generator@npm:7.27.0" dependencies: - "@types/deep-eql": "npm:*" - assertion-error: "npm:^2.0.1" - checksum: 10c0/e0ef1de3b6f8045a5e473e867c8565788c444271409d155588504840ad1a53611011f85072188c2833941189400228c1745d78323dac13fcede9c2b28bacfb2f + "@babel/types": "npm:^7.0.0" + checksum: 10c0/9f9e959a8792df208a9d048092fda7e1858bddc95c6314857a8211a99e20e6830bdeb572e3587ae8be5429e37f2a96fcf222a9f53ad232f5537764c9e13a2bbd languageName: node linkType: hard -"@types/deep-eql@npm:*": - version: 4.0.2 - resolution: "@types/deep-eql@npm:4.0.2" - checksum: 10c0/bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" + dependencies: + "@babel/types": "npm:^7.28.2" + checksum: 10c0/b52d7d4e8fc6a9018fe7361c4062c1c190f5778cf2466817cb9ed19d69fbbb54f9a85ffedeb748ed8062d2cf7d4cc088ee739848f47c57740de1c48cbf0d0994 languageName: node linkType: hard -"@types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": +"@types/estree@npm:^1.0.6": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 @@ -2737,6 +2979,15 @@ __metadata: languageName: node linkType: hard +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/235d2fc69741448e853333b7c3d1180a966dd2b8972c8cbcd6b2a0c6cd7f8d582ab2b8e58219dbc62cce8f1b40aa317ff78ea2201cdd8249da5025adebed6f0b + languageName: node + linkType: hard + "@types/hammerjs@npm:^2.0.36": version: 2.0.46 resolution: "@types/hammerjs@npm:2.0.46" @@ -2744,7 +2995,7 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": version: 2.0.6 resolution: "@types/istanbul-lib-coverage@npm:2.0.6" checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 @@ -2769,6 +3020,17 @@ __metadata: languageName: node linkType: hard +"@types/jsdom@npm:^20.0.0": + version: 20.0.1 + resolution: "@types/jsdom@npm:20.0.1" + dependencies: + "@types/node": "npm:*" + "@types/tough-cookie": "npm:*" + parse5: "npm:^7.0.0" + checksum: 10c0/3d4b2a3eab145674ee6da482607c5e48977869109f0f62560bf91ae1a792c9e847ac7c6aaf243ed2e97333cb3c51aef314ffa54a19ef174b8f9592dfcb836b25 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -2831,6 +3093,20 @@ __metadata: languageName: node linkType: hard +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c + languageName: node + linkType: hard + +"@types/tough-cookie@npm:*": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: 10c0/68c6921721a3dcb40451543db2174a145ef915bc8bcbe7ad4e59194a0238e776e782b896c7a59f4b93ac6acefca9161fccb31d1ce3b3445cb6faa467297fb473 + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.3 resolution: "@types/yargs-parser@npm:21.0.3" @@ -2896,7 +3172,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.62.1, @typescript-eslint/scope-manager@npm:^8.58.0": +"@typescript-eslint/scope-manager@npm:8.62.1": version: 8.62.1 resolution: "@typescript-eslint/scope-manager@npm:8.62.1" dependencies: @@ -2957,7 +3233,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.62.1, @typescript-eslint/utils@npm:^8.58.0": +"@typescript-eslint/utils@npm:8.62.1, @typescript-eslint/utils@npm:^8.0.0": version: 8.62.1 resolution: "@typescript-eslint/utils@npm:8.62.1" dependencies: @@ -2989,152 +3265,6 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-react@npm:6.0.3": - version: 6.0.3 - resolution: "@vitejs/plugin-react@npm:6.0.3" - dependencies: - "@rolldown/pluginutils": "npm:^1.0.1" - peerDependencies: - "@rolldown/plugin-babel": ^0.1.7 || ^0.2.0 - babel-plugin-react-compiler: ^1.0.0 - vite: ^8.0.0 - peerDependenciesMeta: - "@rolldown/plugin-babel": - optional: true - babel-plugin-react-compiler: - optional: true - checksum: 10c0/592a93178c0eec420759d529a2c964a7103860808f549f72993b96a38c287c929a0d371cacbd932c37ee2118b830348db752cc01a31d688c71d19d74567251fa - languageName: node - linkType: hard - -"@vitest/coverage-v8@npm:4.1.9": - version: 4.1.9 - resolution: "@vitest/coverage-v8@npm:4.1.9" - dependencies: - "@bcoe/v8-coverage": "npm:^1.0.2" - "@vitest/utils": "npm:4.1.9" - ast-v8-to-istanbul: "npm:^1.0.0" - istanbul-lib-coverage: "npm:^3.2.2" - istanbul-lib-report: "npm:^3.0.1" - istanbul-reports: "npm:^3.2.0" - magicast: "npm:^0.5.2" - obug: "npm:^2.1.1" - std-env: "npm:^4.0.0-rc.1" - tinyrainbow: "npm:^3.1.0" - peerDependencies: - "@vitest/browser": 4.1.9 - vitest: 4.1.9 - peerDependenciesMeta: - "@vitest/browser": - optional: true - checksum: 10c0/02bc408d5d8d5188bb569ae1df1f56903e9e19a6a19ddeff07140e1b344b82662f0669c7ee87b6f4f82c9d1d63a0296fe40c023f923a500a707463c8c05ec133 - languageName: node - linkType: hard - -"@vitest/eslint-plugin@npm:1.6.20": - version: 1.6.20 - resolution: "@vitest/eslint-plugin@npm:1.6.20" - dependencies: - "@typescript-eslint/scope-manager": "npm:^8.58.0" - "@typescript-eslint/utils": "npm:^8.58.0" - peerDependencies: - "@typescript-eslint/eslint-plugin": "*" - eslint: ">=8.57.0" - typescript: ">=5.0.0" - vitest: "*" - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - typescript: - optional: true - vitest: - optional: true - checksum: 10c0/9c1b3697fec30304aea3c28efe0077b74f6b9423d0bed51c63e11ef7287a13cf3d3a4ce0a6ba853a91781da80820bd9b43cbf02766b6abe4ae054c93046ee36e - languageName: node - linkType: hard - -"@vitest/expect@npm:4.1.9": - version: 4.1.9 - resolution: "@vitest/expect@npm:4.1.9" - dependencies: - "@standard-schema/spec": "npm:^1.1.0" - "@types/chai": "npm:^5.2.2" - "@vitest/spy": "npm:4.1.9" - "@vitest/utils": "npm:4.1.9" - chai: "npm:^6.2.2" - tinyrainbow: "npm:^3.1.0" - checksum: 10c0/243bacaed2cba5e0ea4ec7465662fcec465a358a0e06381e337fac49426aa67a73b104fbb9d65d8bccadfba8f70e27f57ffb897aacfa140f579a556367357875 - languageName: node - linkType: hard - -"@vitest/mocker@npm:4.1.9": - version: 4.1.9 - resolution: "@vitest/mocker@npm:4.1.9" - dependencies: - "@vitest/spy": "npm:4.1.9" - estree-walker: "npm:^3.0.3" - magic-string: "npm:^0.30.21" - peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - checksum: 10c0/707353b7435bbfd441cc754e4ee7bc5921b70d07b051c6e414b6bbe4ca369154702b0ddeb603389469fe87ca1983e002eb2d55044582661f54a1945dd27e5c82 - languageName: node - linkType: hard - -"@vitest/pretty-format@npm:4.1.9": - version: 4.1.9 - resolution: "@vitest/pretty-format@npm:4.1.9" - dependencies: - tinyrainbow: "npm:^3.1.0" - checksum: 10c0/5b96295f25ab885616230ad1355fc82f490bebb39cc707688d7c8969c08270d7e076ed8a10af4e762ed57145193c6061a1f549f136f0ded344f8db0c2b3fb3de - languageName: node - linkType: hard - -"@vitest/runner@npm:4.1.9": - version: 4.1.9 - resolution: "@vitest/runner@npm:4.1.9" - dependencies: - "@vitest/utils": "npm:4.1.9" - pathe: "npm:^2.0.3" - checksum: 10c0/d206b4891a64b1f55c346f832b0a7b489108094d8ae34438d3b53e78be7b45b139fa95ffa027c98c357bd532268ee573168de1943235b7eed32a9236ed5978bb - languageName: node - linkType: hard - -"@vitest/snapshot@npm:4.1.9": - version: 4.1.9 - resolution: "@vitest/snapshot@npm:4.1.9" - dependencies: - "@vitest/pretty-format": "npm:4.1.9" - "@vitest/utils": "npm:4.1.9" - magic-string: "npm:^0.30.21" - pathe: "npm:^2.0.3" - checksum: 10c0/c3099df12ad1f9c1e180441856c9eb82f1990f87ff16aafedd6fa19978eaff20bc59220b692a99fcc822daef86eab256ba3dadb49544b7bd625b57c49cd9d995 - languageName: node - linkType: hard - -"@vitest/spy@npm:4.1.9": - version: 4.1.9 - resolution: "@vitest/spy@npm:4.1.9" - checksum: 10c0/e51f328f55b76e8ba66e5e18f183484a8dc0a092685b101112d3e9fb8e989ddca162c98ddf00254476502c25bc05c4ec1e277fd6ad8bfc702464c08f6b5dd115 - languageName: node - linkType: hard - -"@vitest/utils@npm:4.1.9": - version: 4.1.9 - resolution: "@vitest/utils@npm:4.1.9" - dependencies: - "@vitest/pretty-format": "npm:4.1.9" - convert-source-map: "npm:^2.0.0" - tinyrainbow: "npm:^3.1.0" - checksum: 10c0/d55506c077fd72c091eb66f02926f0abf72801c87a085f565698289562f47befa114ae2c680ab8736dfe46abab0cfd6b8031f2ac519bafeb37578aa6e5ad03c5 - languageName: node - linkType: hard - "@xmldom/xmldom@npm:^0.8.8": version: 0.8.13 resolution: "@xmldom/xmldom@npm:0.8.13" @@ -3149,6 +3279,13 @@ __metadata: languageName: node linkType: hard +"abab@npm:^2.0.6": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 10c0/0b245c3c3ea2598fe0025abf7cc7bb507b06949d51e8edae5d12c1b847a0a0c09639abcb94788332b4e2044ac4491c1e8f571b51c7826fd4b0bda1685ad4a278 + languageName: node + linkType: hard + "abbrev@npm:^4.0.0": version: 4.0.0 resolution: "abbrev@npm:4.0.0" @@ -3185,6 +3322,16 @@ __metadata: languageName: node linkType: hard +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: "npm:^8.1.0" + acorn-walk: "npm:^8.0.2" + checksum: 10c0/7437f58e92d99292dbebd0e79531af27d706c9f272f31c675d793da6c82d897e75302a8744af13c7f7978a8399840f14a353b60cf21014647f71012982456d2b + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -3194,12 +3341,30 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.15.0": - version: 8.15.0 - resolution: "acorn@npm:8.15.0" +"acorn-walk@npm:^8.0.2": + version: 8.3.5 + resolution: "acorn-walk@npm:8.3.5" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/e31bf5b5423ed1349437029d66d708b9fbd1b77a644b031501e2c753b028d13b56348210ed901d5b1d0d86eb3381c0a0fc0d0998511a9d546d1194936266a332 + languageName: node + linkType: hard + +"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.8.1": + version: 8.17.0 + resolution: "acorn@npm:8.17.0" bin: acorn: bin/acorn - checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec + checksum: 10c0/5dcefea5f8f023b6cc24cbe71fb5a8112b601d36c4fa07d14e4e6ffc2ee47383332c46b36c766d9437725aa6660156eae50efa0c838719823b50d7c327c4ed42 + languageName: node + linkType: hard + +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 languageName: node linkType: hard @@ -3275,7 +3440,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1": +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -3284,6 +3449,13 @@ __metadata: languageName: node linkType: hard +"ansi-escapes@npm:^6.0.0": + version: 6.2.1 + resolution: "ansi-escapes@npm:6.2.1" + checksum: 10c0/a2c6f58b044be5f69662ee17073229b492daa2425a7fd99a665db6c22eab6e4ab42752807def7281c1c7acfed48f87f2362dda892f08c2c437f1b39c6b033103 + languageName: node + linkType: hard + "ansi-regex@npm:^4.1.0": version: 4.1.1 resolution: "ansi-regex@npm:4.1.1" @@ -3298,6 +3470,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^6.2.2": + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f + languageName: node + linkType: hard + "ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -3323,6 +3502,16 @@ __metadata: languageName: node linkType: hard +"anymatch@npm:^3.0.3": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + "arg@npm:^5.0.2": version: 5.0.2 resolution: "arg@npm:5.0.2" @@ -3330,6 +3519,15 @@ __metadata: languageName: node linkType: hard +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -3452,24 +3650,6 @@ __metadata: languageName: node linkType: hard -"assertion-error@npm:^2.0.1": - version: 2.0.1 - resolution: "assertion-error@npm:2.0.1" - checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 - languageName: node - linkType: hard - -"ast-v8-to-istanbul@npm:^1.0.0": - version: 1.0.0 - resolution: "ast-v8-to-istanbul@npm:1.0.0" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.31" - estree-walker: "npm:^3.0.3" - js-tokens: "npm:^10.0.0" - checksum: 10c0/35e57b754ba63287358094d4f7ae8de2de27286fb4e76a1fbf28b2e67e3b670b59c3f511882473d0fd2cdbaa260062e3cd4f216b724c70032e2b09e5cebbd618 - languageName: node - linkType: hard - "async-function@npm:^1.0.0": version: 1.0.0 resolution: "async-function@npm:1.0.0" @@ -3484,6 +3664,13 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -3500,16 +3687,45 @@ __metadata: languageName: node linkType: hard -"babel-plugin-module-resolver@npm:5.0.3": - version: 5.0.3 - resolution: "babel-plugin-module-resolver@npm:5.0.3" +"babel-jest@npm:^29.2.1, babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" + dependencies: + "@jest/transform": "npm:^29.7.0" + "@types/babel__core": "npm:^7.1.14" + babel-plugin-istanbul: "npm:^6.1.1" + babel-preset-jest: "npm:^29.6.3" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + slash: "npm:^3.0.0" + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 10c0/2eda9c1391e51936ca573dd1aedfee07b14c59b33dbe16ef347873ddd777bcf6e2fc739681e9e9661ab54ef84a3109a03725be2ac32cd2124c07ea4401cbe8c1 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-instrument: "npm:^5.0.4" + test-exclude: "npm:^6.0.0" + checksum: 10c0/1075657feb705e00fd9463b329921856d3775d9867c5054b449317d39153f8fbcebd3e02ebf00432824e647faff3683a9ca0a941325ef1afe9b3c4dd51b24beb + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" dependencies: - find-babel-config: "npm:^2.1.1" - glob: "npm:^9.3.3" - pkg-up: "npm:^3.1.0" - reselect: "npm:^4.1.7" - resolve: "npm:^1.22.8" - checksum: 10c0/aa8940ae1eaa7dadbf63b12387ed63ab34a19bf6614ac76e16e4d44af80ae36c4741d307a91f864320c0ad33037b34466854bb9d8de6c1e73936b1af1b6d36a6 + "@babel/template": "npm:^7.3.3" + "@babel/types": "npm:^7.3.3" + "@types/babel__core": "npm:^7.1.14" + "@types/babel__traverse": "npm:^7.0.6" + checksum: 10c0/7e6451caaf7dce33d010b8aafb970e62f1b0c0b57f4978c37b0d457bbcf0874d75a395a102daf0bae0bd14eafb9f6e9a165ee5e899c0a4f1f3bb2e07b304ed2e languageName: node linkType: hard @@ -3592,6 +3808,31 @@ __metadata: languageName: node linkType: hard +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.2.0 + resolution: "babel-preset-current-node-syntax@npm:1.2.0" + dependencies: + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-bigint": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0 || ^8.0.0-0 + checksum: 10c0/94a4f81cddf9b051045d08489e4fff7336292016301664c138cfa3d9ffe3fe2ba10a24ad6ae589fd95af1ac72ba0216e1653555c187e694d7b17be0c002bea10 + languageName: node + linkType: hard + "babel-preset-expo@npm:~57.0.1": version: 57.0.1 resolution: "babel-preset-expo@npm:57.0.1" @@ -3654,6 +3895,18 @@ __metadata: languageName: node linkType: hard +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" + dependencies: + babel-plugin-jest-hoist: "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ec5fd0276b5630b05f0c14bb97cc3815c6b31600c683ebb51372e54dcb776cff790bdeeabd5b8d01ede375a040337ccbf6a3ccd68d3a34219125945e167ad943 + languageName: node + linkType: hard + "badgin@npm:^1.1.5": version: 1.2.3 resolution: "badgin@npm:1.2.3" @@ -3735,15 +3988,6 @@ __metadata: languageName: node linkType: hard -"brace-expansion@npm:^2.0.1": - version: 2.1.0 - resolution: "brace-expansion@npm:2.1.0" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/439cedf3e23d7993b37919f1d6fdc653ec21a42437ec3e7460bea9ca8b17edf7a24a633273c31d61aa4335877cf29a443f1871814131c87997a1e6223e1f1502 - languageName: node - linkType: hard - "brace-expansion@npm:^5.0.5": version: 5.0.6 resolution: "brace-expansion@npm:5.0.6" @@ -3865,6 +4109,13 @@ __metadata: languageName: node linkType: hard +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 + languageName: node + linkType: hard + "camelcase@npm:^6.2.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" @@ -3879,13 +4130,6 @@ __metadata: languageName: node linkType: hard -"chai@npm:^6.2.2": - version: 6.2.2 - resolution: "chai@npm:6.2.2" - checksum: 10c0/e6c69e5f0c11dffe6ea13d0290936ebb68fcc1ad688b8e952e131df6a6d5797d5e860bc55cef1aca2e950c3e1f96daf79e9d5a70fb7dbaab4e46355e2635ed53 - languageName: node - linkType: hard - "chalk@npm:^2.0.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -3897,6 +4141,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/ee650b0a065b3d7a6fda258e75d3a86fc8e4effa55871da730a9e42ccb035bf5fd203525e5a1ef45ec2582ecc4f65b47eb11357c526b84dd29a14fb162c414d2 + languageName: node + linkType: hard + "chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -3907,6 +4161,20 @@ __metadata: languageName: node linkType: hard +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e + languageName: node + linkType: hard + +"char-regex@npm:^2.0.0": + version: 2.0.2 + resolution: "char-regex@npm:2.0.2" + checksum: 10c0/afbfb11019bafcc70a3e85b760d63336cf941f7608f1df7d746a60ee6075d1926e5c18a9fb1b6c22024f3a000c0e0c745f059b2bf679a5cba6cb48adf7ea43ce + languageName: node + linkType: hard + "chownr@npm:^3.0.0": version: 3.0.0 resolution: "chownr@npm:3.0.0" @@ -3955,6 +4223,13 @@ __metadata: languageName: node linkType: hard +"cjs-module-lexer@npm:^1.0.0": + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 10c0/076b3af85adc4d65dbdab1b5b240fe5b45d44fcf0ef9d429044dd94d19be5589376805c44fb2d4b3e684e5fe6a9b7cf3e426476a6507c45283c5fc6ff95240be + languageName: node + linkType: hard + "cli-cursor@npm:^2.1.0": version: 2.1.0 resolution: "cli-cursor@npm:2.1.0" @@ -3996,6 +4271,20 @@ __metadata: languageName: node linkType: hard +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.3 + resolution: "collect-v8-coverage@npm:1.0.3" + checksum: 10c0/bc62ba251bcce5e3354a8f88fa6442bee56e3e612fec08d4dfcf66179b41ea0bf544b0f78c4ebc0f8050871220af95bb5c5578a6aef346feea155640582f09dc + languageName: node + linkType: hard + "color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": version: 1.9.3 resolution: "color-convert@npm:1.9.3" @@ -4058,6 +4347,15 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + "commander@npm:^12.0.0": version: 12.1.0 resolution: "commander@npm:12.1.0" @@ -4138,6 +4436,23 @@ __metadata: languageName: node linkType: hard +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + prompts: "npm:^2.0.1" + bin: + create-jest: bin/create-jest.js + checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f + languageName: node + linkType: hard + "cross-env@npm:10.1.0": version: 10.1.0 resolution: "cross-env@npm:10.1.0" @@ -4160,7 +4475,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.6": +"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -4187,6 +4502,29 @@ __metadata: languageName: node linkType: hard +"cssom@npm:^0.5.0": + version: 0.5.0 + resolution: "cssom@npm:0.5.0" + checksum: 10c0/8c4121c243baf0678c65dcac29b201ff0067dfecf978de9d5c83b2ff127a8fdefd2bfd54577f5ad8c80ed7d2c8b489ae01c82023545d010c4ecb87683fb403dd + languageName: node + linkType: hard + +"cssom@npm:~0.3.6": + version: 0.3.8 + resolution: "cssom@npm:0.3.8" + checksum: 10c0/d74017b209440822f9e24d8782d6d2e808a8fdd58fa626a783337222fe1c87a518ba944d4c88499031b4786e68772c99dfae616638d71906fe9f203aeaf14411 + languageName: node + linkType: hard + +"cssstyle@npm:^2.3.0": + version: 2.3.0 + resolution: "cssstyle@npm:2.3.0" + dependencies: + cssom: "npm:~0.3.6" + checksum: 10c0/863400da2a458f73272b9a55ba7ff05de40d850f22eb4f37311abebd7eff801cf1cd2fb04c4c92b8c3daed83fe766e52e4112afb7bc88d86c63a9c2256a7d178 + languageName: node + linkType: hard + "csstype@npm:^3.2.2": version: 3.2.3 resolution: "csstype@npm:3.2.3" @@ -4194,6 +4532,17 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: "npm:^2.0.6" + whatwg-mimetype: "npm:^3.0.0" + whatwg-url: "npm:^11.0.0" + checksum: 10c0/051c3aaaf3e961904f136aab095fcf6dff4db23a7fc759dd8ba7b3e6ba03fc07ef608086caad8ab910d864bd3b5e57d0d2f544725653d77c96a2c971567045f4 + languageName: node + linkType: hard + "data-view-buffer@npm:^1.0.2": version: 1.0.2 resolution: "data-view-buffer@npm:1.0.2" @@ -4236,7 +4585,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -4257,6 +4606,13 @@ __metadata: languageName: node linkType: hard +"decimal.js@npm:^10.4.2": + version: 10.6.0 + resolution: "decimal.js@npm:10.6.0" + checksum: 10c0/07d69fbcc54167a340d2d97de95f546f9ff1f69d2b45a02fd7a5292412df3cd9eb7e23065e532a318f5474a2e1bccf8392fdf0443ef467f97f3bf8cb0477e5aa + languageName: node + linkType: hard + "decode-uri-component@npm:^0.2.2": version: 0.2.2 resolution: "decode-uri-component@npm:0.2.2" @@ -4264,6 +4620,18 @@ __metadata: languageName: node linkType: hard +"dedent@npm:^1.0.0": + version: 1.7.2 + resolution: "dedent@npm:1.7.2" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: 10c0/acaff07cac355b93f17b1b17ebbb84d3cc55af6ab4b7814c3f505e061903e168bc6bf9ddce331552d64dee1525f0b4c549c9ade46aebfac6f69caaed74e90751 + languageName: node + linkType: hard + "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -4278,7 +4646,7 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.3.1": +"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.1": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 @@ -4316,6 +4684,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + "depd@npm:2.0.0, depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -4337,6 +4712,13 @@ __metadata: languageName: node linkType: hard +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d + languageName: node + linkType: hard + "detect-node-es@npm:^1.1.0": version: 1.1.0 resolution: "detect-node-es@npm:1.1.0" @@ -4344,6 +4726,13 @@ __metadata: languageName: node linkType: hard +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 + languageName: node + linkType: hard + "dnssd-advertise@npm:^1.1.4": version: 1.1.6 resolution: "dnssd-advertise@npm:1.1.6" @@ -4367,6 +4756,15 @@ __metadata: languageName: node linkType: hard +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: "npm:^7.0.0" + checksum: 10c0/774277cd9d4df033f852196e3c0077a34dbd15a96baa4d166e0e47138a80f4c0bdf0d94e4703e6ff5883cec56bb821a6fff84402d8a498e31de7c87eb932a294 + languageName: node + linkType: hard + "dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -4392,6 +4790,13 @@ __metadata: languageName: node linkType: hard +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 10c0/1573d0ae29ab34661b6c63251ff8f5facd24ccf6a823f19417ae8ba8c88ea450325788c67f16c99edec8de4b52ce93a10fe441ece389fd156e88ee7dab9bfa35 + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -4422,6 +4827,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -4436,6 +4848,15 @@ __metadata: languageName: node linkType: hard +"error-ex@npm:^1.3.1": + version: 1.3.4 + resolution: "error-ex@npm:1.3.4" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/b9e34ff4778b8f3b31a8377e1c654456f4c41aeaa3d10a1138c3b7635d8b7b2e03eb2475d46d8ae055c1f180a1063e100bffabf64ea7e7388b37735df5328664 + languageName: node + linkType: hard + "error-stack-parser@npm:^2.0.6": version: 2.1.4 resolution: "error-stack-parser@npm:2.1.4" @@ -4545,13 +4966,6 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^2.0.0": - version: 2.0.0 - resolution: "es-module-lexer@npm:2.0.0" - checksum: 10c0/ae78dbbd43035a4b972c46cfb6877e374ea290adfc62bc2f5a083fea242c0b2baaab25c5886af86be55f092f4a326741cb94334cd3c478c383fdc8a9ec5ff817 - languageName: node - linkType: hard - "es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": version: 1.1.1 resolution: "es-object-atoms@npm:1.1.1" @@ -4614,6 +5028,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -4621,6 +5042,24 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^2.0.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 10c0/e1450a1f75f67d35c061bf0d60888b15f62ab63aef9df1901cffc81cffbbb9e8b3de237c5502cf8613a017c1df3a3003881307c78835a1ab54d8c8d2206e01d3 + languageName: node + linkType: hard + "eslint-config-prettier@npm:10.1.8": version: 10.1.8 resolution: "eslint-config-prettier@npm:10.1.8" @@ -4632,6 +5071,27 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-jest@npm:29.15.4": + version: 29.15.4 + resolution: "eslint-plugin-jest@npm:29.15.4" + dependencies: + "@typescript-eslint/utils": "npm:^8.0.0" + peerDependencies: + "@typescript-eslint/eslint-plugin": ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + jest: "*" + typescript: ">=4.8.4 <7.0.0" + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + jest: + optional: true + typescript: + optional: true + checksum: 10c0/4a32cd29cb67b54e5fb5f4acbc749e79c024f50099825e91c93d1d9674caf5b4bfe4810c7931e01d6b30e77cbf72d7619db785a12f459f2b23f5885d39cb1033 + languageName: node + linkType: hard + "eslint-plugin-react-hooks@npm:7.1.1": version: 7.1.1 resolution: "eslint-plugin-react-hooks@npm:7.1.1" @@ -4789,6 +5249,16 @@ __metadata: languageName: node linkType: hard +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + "esquery@npm:^1.5.0": version: 1.7.0 resolution: "esquery@npm:1.7.0" @@ -4814,15 +5284,6 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:^3.0.3": - version: 3.0.3 - resolution: "estree-walker@npm:3.0.3" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d - languageName: node - linkType: hard - "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -4844,10 +5305,40 @@ __metadata: languageName: node linkType: hard -"expect-type@npm:^1.3.0": - version: 1.3.0 - resolution: "expect-type@npm:1.3.0" - checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: 10c0/71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 + languageName: node + linkType: hard + +"expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/2eddeace66e68b8d8ee5f7be57f3014b19770caaf6815c7a08d131821da527fb8c8cb7b3dcd7c883d2d3d8d184206a4268984618032d1e4b16dc8d6596475d41 languageName: node linkType: hard @@ -5270,7 +5761,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0": +"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b @@ -5390,21 +5881,13 @@ __metadata: languageName: node linkType: hard -"find-babel-config@npm:^2.1.1": - version: 2.1.2 - resolution: "find-babel-config@npm:2.1.2" - dependencies: - json5: "npm:^2.2.3" - checksum: 10c0/c9151b23d636378eae11aa761b0af41d5f67d5479e3ebfca7b0ec7feef91723f14242d243342783b89e6c51fc5b4120086eacf5d8a1a335cf7bae4b0ac89f493 - languageName: node - linkType: hard - -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" dependencies: - locate-path: "npm:^3.0.0" - checksum: 10c0/2c2e7d0a26db858e2f624f39038c74739e38306dee42b45f404f770db357947be9d0d587f1cac72d20c114deb38aa57316e879eb0a78b17b46da7dab0a3bd6e3 + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 languageName: node linkType: hard @@ -5468,6 +5951,19 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.0": + version: 4.0.6 + resolution: "form-data@npm:4.0.6" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.4" + mime-types: "npm:^2.1.35" + checksum: 10c0/43947a77bf0ff45c6ceed789778982d47a3f3e720a74b71721174ebf3310a5f1a8be1d6b38a3ee3688e8a18a2c4273073ec0844cd37efda3eaf46d41c9c318ff + languageName: node + linkType: hard + "fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -5491,7 +5987,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.3": +"fsevents@npm:^2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -5501,7 +5997,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -5594,6 +6090,13 @@ __metadata: languageName: node linkType: hard +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: 10c0/e34cdf447fdf1902a1f6d5af737eaadf606d2ee3518287abde8910e04159368c268568174b2e71102b87b26c2020486f126bfca9c4fb1ceb986ff99b52ecd1be + languageName: node + linkType: hard + "get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": version: 1.0.1 resolution: "get-proto@npm:1.0.1" @@ -5604,6 +6107,13 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + "get-symbol-description@npm:^1.1.0": version: 1.1.0 resolution: "get-symbol-description@npm:1.1.0" @@ -5642,15 +6152,17 @@ __metadata: languageName: node linkType: hard -"glob@npm:^9.3.3": - version: 9.3.5 - resolution: "glob@npm:9.3.5" +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" dependencies: fs.realpath: "npm:^1.0.0" - minimatch: "npm:^8.0.2" - minipass: "npm:^4.2.4" - path-scurry: "npm:^1.6.1" - checksum: 10c0/2f6c2b9ee019ee21dc258ae97a88719614591e4c979cb4580b1b9df6f0f778a3cb38b4bdaf18dfa584637ea10f89a3c5f2533a5e449cf8741514ad18b0951f2e + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe languageName: node linkType: hard @@ -5747,12 +6259,12 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" +"hasown@npm:^2.0.2, hasown@npm:^2.0.4": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" dependencies: function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + checksum: 10c0/2d8de939e270b70618f8cebb69746620db10617dbb495bc66ddad326955ea24d3ca4af133aff3eb7c1853e0218f867bc2b050ec26fe02e3aea58f880ffc5e506 languageName: node linkType: hard @@ -5845,6 +6357,15 @@ __metadata: languageName: node linkType: hard +"html-encoding-sniffer@npm:^3.0.0": + version: 3.0.0 + resolution: "html-encoding-sniffer@npm:3.0.0" + dependencies: + whatwg-encoding: "npm:^2.0.0" + checksum: 10c0/b17b3b0fb5d061d8eb15121c3b0b536376c3e295ecaf09ba48dd69c6b6c957839db124fe1e2b3f11329753a4ee01aa7dedf63b7677999e86da17fbbdd82c5386 + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -5881,6 +6402,17 @@ __metadata: languageName: node linkType: hard +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": "npm:2" + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/32a05e413430b2c1e542e5c74b38a9f14865301dd69dff2e53ddb684989440e3d2ce0c4b64d25eb63cf6283e6265ff979a61cf93e3ca3d23047ddfdc8df34a32 + languageName: node + linkType: hard + "http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" @@ -5891,6 +6423,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + "https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" @@ -5901,6 +6443,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + "hyphenate-style-name@npm:^1.0.3": version: 1.1.0 resolution: "hyphenate-style-name@npm:1.1.0" @@ -5920,7 +6469,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -5964,6 +6513,18 @@ __metadata: languageName: node linkType: hard +"import-local@npm:^3.0.2": + version: 3.2.0 + resolution: "import-local@npm:3.2.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: 10c0/94cd6367a672b7e0cb026970c85b76902d2710a64896fa6de93bd5c571dd03b228c5759308959de205083e3b1c61e799f019c9e36ee8e9c523b993e1057f0433 + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -5978,7 +6539,17 @@ __metadata: languageName: node linkType: hard -"inherits@npm:~2.0.3, inherits@npm:~2.0.4": +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:~2.0.3, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -6032,6 +6603,13 @@ __metadata: languageName: node linkType: hard +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + "is-arrayish@npm:^0.3.1": version: 0.3.4 resolution: "is-arrayish@npm:0.3.4" @@ -6140,6 +6718,13 @@ __metadata: languageName: node linkType: hard +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: 10c0/2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d + languageName: node + linkType: hard + "is-generator-function@npm:^1.0.10": version: 1.1.2 resolution: "is-generator-function@npm:1.1.2" @@ -6193,6 +6778,13 @@ __metadata: languageName: node linkType: hard +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: 10c0/b73e2f22bc863b0939941d369486d308b43d7aef1f9439705e3582bfccaa4516406865e32c968a35f97a99396dac84e2624e67b0a16b0a15086a785e16ce7db9 + languageName: node + linkType: hard + "is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -6221,6 +6813,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + "is-string@npm:^1.1.1": version: 1.1.1 resolution: "is-string@npm:1.1.1" @@ -6293,66 +6892,525 @@ __metadata: languageName: node linkType: hard -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": "npm:^7.12.3" + "@babel/parser": "npm:^7.14.7" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^6.3.0" + checksum: 10c0/8a1bdf3e377dcc0d33ec32fe2b6ecacdb1e4358fd0eb923d4326bb11c67622c0ceb99600a680f3dad5d29c66fc1991306081e339b4d43d0b8a2ab2e1d910a6ee + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" + dependencies: + "@babel/core": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^7.5.4" + checksum: 10c0/a1894e060dd2a3b9f046ffdc87b44c00a35516f5e6b7baf4910369acca79e506fc5323a816f811ae23d82334b38e3ddeb8b3b331bd2c860540793b59a8689128 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + source-map: "npm:^0.6.1" + checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.2.0 + resolution: "istanbul-reports@npm:3.2.0" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 10c0/d596317cfd9c22e1394f22a8d8ba0303d2074fe2e971887b32d870e4b33f8464b10f8ccbe6847808f7db485f084eba09e6c2ed706b3a978e4b52f07085b8f9bc + languageName: node + linkType: hard + +"iterator.prototype@npm:^1.1.5": + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" + dependencies: + define-data-property: "npm:^1.1.4" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + get-proto: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/f7a262808e1b41049ab55f1e9c29af7ec1025a000d243b83edf34ce2416eedd56079b117fa59376bb4a724110690f13aa8427f2ee29a09eec63a7e72367626d0 + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" + dependencies: + execa: "npm:^5.0.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b + languageName: node + linkType: hard + +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + co: "npm:^4.6.0" + dedent: "npm:^1.0.0" + is-generator-fn: "npm:^2.0.0" + jest-each: "npm:^29.7.0" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + pure-rand: "npm:^6.0.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e + languageName: node + linkType: hard + +"jest-cli@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + create-jest: "npm:^29.7.0" + exit: "npm:^0.1.2" + import-local: "npm:^3.0.2" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + yargs: "npm:^17.3.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a + languageName: node + linkType: hard + +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/test-sequencer": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-jest: "npm:^29.7.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + deepmerge: "npm:^4.2.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-circus: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + parse-json: "npm:^5.2.0" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1 + languageName: node + linkType: hard + +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.6.3" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/89a4a7f182590f56f526443dde69acefb1f2f0c9e59253c61d319569856c4931eae66b8a3790c443f529267a0ddba5ba80431c585deed81827032b2b2a1fc999 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 + languageName: node + linkType: hard + +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4 + languageName: node + linkType: hard + +"jest-environment-jsdom@npm:^29.2.1": + version: 29.7.0 + resolution: "jest-environment-jsdom@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/jsdom": "npm:^20.0.0" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jsdom: "npm:^20.0.0" + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 10c0/139b94e2c8ec1bb5a46ce17df5211da65ce867354b3fd4e00fa6a0d1da95902df4cf7881273fc6ea937e5c325d39d6773f0d41b6c469363334de9d489d2c321f + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/61f04fec077f8b1b5c1a633e3612fc0c9aa79a0ab7b05600683428f1e01a4d35346c474bde6f439f9fcc1a4aa9a2861ff852d079a43ab64b02105d1004b2592b + languageName: node + linkType: hard + +"jest-expo@npm:~57.0.1": + version: 57.0.1 + resolution: "jest-expo@npm:57.0.1" + dependencies: + "@jest/create-cache-key-function": "npm:^29.2.1" + "@jest/globals": "npm:^29.2.1" + babel-jest: "npm:^29.2.1" + jest-environment-jsdom: "npm:^29.2.1" + jest-snapshot: "npm:^29.2.1" + jest-watch-select-projects: "npm:^2.0.0" + jest-watch-typeahead: "npm:2.2.1" + json5: "npm:^2.2.3" + lodash: "npm:^4.17.19" + react-test-renderer: "npm:19.2.3" + server-only: "npm:^0.0.1" + stacktrace-js: "npm:^2.0.2" + peerDependencies: + "@react-native/jest-preset": ^0.86.0 + expo: "*" + react-native: "*" + react-server-dom-webpack: ~19.0.4 || ~19.1.5 || ~19.2.4 + peerDependenciesMeta: + expo: + optional: true + react-server-dom-webpack: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/cd4f8550fd531d2078757920b482142ec401c81d60539bc8f70d1f44a5d400fca47cf105cf80a75b67ba27cb499e68db631b4a286eee225c177a8addddd2d222 + languageName: node + linkType: hard + +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 10c0/552e7a97a983d3c2d4e412a44eb7de0430ff773dd99f7500962c268d6dfbfa431d7d08f919c9d960530e5f7f78eb47f267ad9b318265e5092b3ff9ede0db7c2b + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-haste-map@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/graceful-fs": "npm:^4.1.3" + "@types/node": "npm:*" + anymatch: "npm:^3.0.3" + fb-watchman: "npm:^2.0.0" + fsevents: "npm:^2.3.2" + graceful-fs: "npm:^4.2.9" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + walker: "npm:^1.0.8" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/2683a8f29793c75a4728787662972fedd9267704c8f7ef9d84f2beed9a977f1cf5e998c07b6f36ba5603f53cb010c911fe8cd0ac9886e073fe28ca66beefd30c + languageName: node + linkType: hard + +"jest-junit@npm:17.0.0": + version: 17.0.0 + resolution: "jest-junit@npm:17.0.0" + dependencies: + mkdirp: "npm:^1.0.4" + strip-ansi: "npm:^6.0.1" + uuid: "npm:^14.0.0" + xml: "npm:^1.0.1" + checksum: 10c0/24206792c48064a474cb13deba5edac6212667065f79dc024677cb6f34615b96991ed231cb61846fd32eca2d5f97011e5dfb714d8a30b583f5e584b41b0878da + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/71bb9f77fc489acb842a5c7be030f2b9acb18574dc9fb98b3100fc57d422b1abc55f08040884bd6e6dbf455047a62f7eaff12aa4058f7cbdc11558718ca6a395 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/0d0e70b28fa5c7d4dce701dc1f46ae0922102aadc24ed45d594dd9b7ae0a8a6ef8b216718d1ab79e451291217e05d4d49a82666e1a3cc2b428b75cd9c933244e + languageName: node + linkType: hard + +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.6.3" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/850ae35477f59f3e6f27efac5215f706296e2104af39232bb14e5403e067992afb5c015e87a9243ec4d9df38525ef1ca663af9f2f4766aa116f127247008bd22 + languageName: node + linkType: hard + +"jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + checksum: 10c0/7b9f8349ee87695a309fe15c46a74ab04c853369e5c40952d68061d9dc3159a0f0ed73e215f81b07ee97a9faaf10aebe5877a9d6255068a0977eae6a9ff1d5ac languageName: node linkType: hard -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: 10c0/86eec0c78449a2de733a6d3e316d49461af6a858070e113c97f75fb742a48c2396ea94150cbca44159ffd4a959f743a47a8b37a792ef6fdad2cf0a5cba973fac languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.2": - version: 3.2.2 - resolution: "istanbul-lib-coverage@npm:3.2.2" - checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b +"jest-regex-util@npm:^29.0.0, jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 10c0/4e33fb16c4f42111159cafe26397118dcfc4cf08bc178a67149fb05f45546a91928b820894572679d62559839d0992e21080a1527faad65daaae8743a5705a3b languageName: node linkType: hard -"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": - version: 3.0.1 - resolution: "istanbul-lib-report@npm:3.0.1" +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" dependencies: - istanbul-lib-coverage: "npm:^3.0.0" - make-dir: "npm:^4.0.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 + jest-regex-util: "npm:^29.6.3" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d languageName: node linkType: hard -"istanbul-reports@npm:^3.2.0": - version: 3.2.0 - resolution: "istanbul-reports@npm:3.2.0" +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" dependencies: - html-escaper: "npm:^2.0.0" - istanbul-lib-report: "npm:^3.0.0" - checksum: 10c0/d596317cfd9c22e1394f22a8d8ba0303d2074fe2e971887b32d870e4b33f8464b10f8ccbe6847808f7db485f084eba09e6c2ed706b3a978e4b52f07085b8f9bc + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-pnp-resolver: "npm:^1.2.2" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + resolve: "npm:^1.20.0" + resolve.exports: "npm:^2.0.0" + slash: "npm:^3.0.0" + checksum: 10c0/59da5c9c5b50563e959a45e09e2eace783d7f9ac0b5dcc6375dea4c0db938d2ebda97124c8161310082760e8ebbeff9f6b177c15ca2f57fb424f637a5d2adb47 languageName: node linkType: hard -"iterator.prototype@npm:^1.1.5": - version: 1.1.5 - resolution: "iterator.prototype@npm:1.1.5" +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" dependencies: - define-data-property: "npm:^1.1.4" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.6" - get-proto: "npm:^1.0.0" - has-symbols: "npm:^1.1.0" - set-function-name: "npm:^2.0.2" - checksum: 10c0/f7a262808e1b41049ab55f1e9c29af7ec1025a000d243b83edf34ce2416eedd56079b117fa59376bb4a724110690f13aa8427f2ee29a09eec63a7e72367626d0 + "@jest/console": "npm:^29.7.0" + "@jest/environment": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + graceful-fs: "npm:^4.2.9" + jest-docblock: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-leak-detector: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-resolve: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 10c0/2194b4531068d939f14c8d3274fe5938b77fa73126aedf9c09ec9dec57d13f22c72a3b5af01ac04f5c1cf2e28d0ac0b4a54212a61b05f10b5d6b47f2a1097bb4 languageName: node linkType: hard -"jest-get-type@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-get-type@npm:29.6.3" - checksum: 10c0/552e7a97a983d3c2d4e412a44eb7de0430ff773dd99f7500962c268d6dfbfa431d7d08f919c9d960530e5f7f78eb47f267ad9b318265e5092b3ff9ede0db7c2b +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/globals": "npm:^29.7.0" + "@jest/source-map": "npm:^29.6.3" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + cjs-module-lexer: "npm:^1.0.0" + collect-v8-coverage: "npm:^1.0.0" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10c0/7cd89a1deda0bda7d0941835434e44f9d6b7bd50b5c5d9b0fc9a6c990b2d4d2cab59685ab3cb2850ed4cc37059f6de903af5a50565d7f7f1192a77d3fd6dd2a6 + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.2.1, jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" + "@babel/plugin-syntax-typescript": "npm:^7.7.2" + "@babel/types": "npm:^7.3.3" + "@jest/expect-utils": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + chalk: "npm:^4.0.0" + expect: "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + natural-compare: "npm:^1.4.0" + pretty-format: "npm:^29.7.0" + semver: "npm:^7.5.3" + checksum: 10c0/6e9003c94ec58172b4a62864a91c0146513207bedf4e0a06e1e2ac70a4484088a2683e3a0538d8ea913bcfd53dc54a9b98a98cdfa562e7fe1d1339aeae1da570 languageName: node linkType: hard @@ -6384,6 +7442,50 @@ __metadata: languageName: node linkType: hard +"jest-watch-select-projects@npm:^2.0.0": + version: 2.0.0 + resolution: "jest-watch-select-projects@npm:2.0.0" + dependencies: + ansi-escapes: "npm:^4.3.0" + chalk: "npm:^3.0.0" + prompts: "npm:^2.2.1" + checksum: 10c0/c8d9817aff45dd85d307a48ba63dec33a1a7496b1896cb54f446799626e1700afb7755424e360c7a14b15e88b9cf45669cc18339347a407e5eeed829994a7106 + languageName: node + linkType: hard + +"jest-watch-typeahead@npm:2.2.1": + version: 2.2.1 + resolution: "jest-watch-typeahead@npm:2.2.1" + dependencies: + ansi-escapes: "npm:^6.0.0" + chalk: "npm:^4.0.0" + jest-regex-util: "npm:^29.0.0" + jest-watcher: "npm:^29.0.0" + slash: "npm:^5.0.0" + string-length: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + peerDependencies: + jest: ^27.0.0 || ^28.0.0 || ^29.0.0 + checksum: 10c0/2f47433ac6dd1dfd3015182b325108bc95e15dfbb577e7730468172b15b7d91be443f4d68a3849963e1f29e96d031eaf2b79cae6f45e64630383129a2d5e2e2d + languageName: node + linkType: hard + +"jest-watcher@npm:^29.0.0, jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + jest-util: "npm:^29.7.0" + string-length: "npm:^4.0.1" + checksum: 10c0/ec6c75030562fc8f8c727cb8f3b94e75d831fc718785abfc196e1f2a2ebc9a2e38744a15147170039628a853d77a3b695561ce850375ede3a4ee6037a2574567 + languageName: node + linkType: hard + "jest-worker@npm:^29.7.0": version: 29.7.0 resolution: "jest-worker@npm:29.7.0" @@ -6396,6 +7498,25 @@ __metadata: languageName: node linkType: hard +"jest@npm:~29.7.0": + version: 29.7.0 + resolution: "jest@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.7.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b + languageName: node + linkType: hard + "jimp-compact@npm:0.16.1": version: 0.16.1 resolution: "jimp-compact@npm:0.16.1" @@ -6403,13 +7524,6 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^10.0.0": - version: 10.0.0 - resolution: "js-tokens@npm:10.0.0" - checksum: 10c0/a93498747812ba3e0c8626f95f75ab29319f2a13613a0de9e610700405760931624433a0de59eb7c27ff8836e526768fb20783861b86ef89be96676f2c996b64 - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -6417,6 +7531,18 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^3.13.1": + version: 3.15.0 + resolution: "js-yaml@npm:3.15.0" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/ca966bd354ac5b1b7a4694ebdba46526796aa3a6a99529fa540af2abf85918bd155a50ccc0166b413130a00622999973754458ec01e7095bc902177bfdbd5b64 + languageName: node + linkType: hard + "js-yaml@npm:^4.1.0, js-yaml@npm:^4.1.1": version: 4.2.0 resolution: "js-yaml@npm:4.2.0" @@ -6435,6 +7561,45 @@ __metadata: languageName: node linkType: hard +"jsdom@npm:^20.0.0": + version: 20.0.3 + resolution: "jsdom@npm:20.0.3" + dependencies: + abab: "npm:^2.0.6" + acorn: "npm:^8.8.1" + acorn-globals: "npm:^7.0.0" + cssom: "npm:^0.5.0" + cssstyle: "npm:^2.3.0" + data-urls: "npm:^3.0.2" + decimal.js: "npm:^10.4.2" + domexception: "npm:^4.0.0" + escodegen: "npm:^2.0.0" + form-data: "npm:^4.0.0" + html-encoding-sniffer: "npm:^3.0.0" + http-proxy-agent: "npm:^5.0.0" + https-proxy-agent: "npm:^5.0.1" + is-potential-custom-element-name: "npm:^1.0.1" + nwsapi: "npm:^2.2.2" + parse5: "npm:^7.1.1" + saxes: "npm:^6.0.0" + symbol-tree: "npm:^3.2.4" + tough-cookie: "npm:^4.1.2" + w3c-xmlserializer: "npm:^4.0.0" + webidl-conversions: "npm:^7.0.0" + whatwg-encoding: "npm:^2.0.0" + whatwg-mimetype: "npm:^3.0.0" + whatwg-url: "npm:^11.0.0" + ws: "npm:^8.11.0" + xml-name-validator: "npm:^4.0.0" + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 10c0/b109073bb826a966db7828f46cb1d7371abecd30f182b143c52be5fe1ed84513bbbe995eb3d157241681fcd18331381e61e3dc004d4949f3a63bca02f6214902 + languageName: node + linkType: hard + "jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": version: 3.1.0 resolution: "jsesc@npm:3.1.0" @@ -6451,6 +7616,13 @@ __metadata: languageName: node linkType: hard +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -6636,7 +7808,7 @@ __metadata: languageName: node linkType: hard -"lightningcss@npm:^1.30.1, lightningcss@npm:^1.32.0": +"lightningcss@npm:^1.30.1": version: 1.32.0 resolution: "lightningcss@npm:1.32.0" dependencies: @@ -6679,13 +7851,19 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" dependencies: - p-locate: "npm:^3.0.0" - path-exists: "npm:^3.0.0" - checksum: 10c0/3db394b7829a7fe2f4fbdd25d3c4689b85f003c318c5da4052c7e56eed697da8f1bce5294f685c69ff76e32cba7a33629d94396976f6d05fb7f4c755c5e2ae8b + p-locate: "npm:^4.1.0" + checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 languageName: node linkType: hard @@ -6728,6 +7906,13 @@ __metadata: languageName: node linkType: hard +"lodash@npm:^4.17.19": + version: 4.18.1 + resolution: "lodash@npm:4.18.1" + checksum: 10c0/757228fc68805c59789e82185135cf85f05d0b2d3d54631d680ca79ec21944ec8314d4533639a14b8bcfbd97a517e78960933041a5af17ecb693ec6eecb99a27 + languageName: node + linkType: hard + "log-symbols@npm:^2.2.0": version: 2.2.0 resolution: "log-symbols@npm:2.2.0" @@ -6748,7 +7933,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": +"lru-cache@npm:^10.0.1": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb @@ -6771,26 +7956,6 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.21": - version: 0.30.21 - resolution: "magic-string@npm:0.30.21" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.5" - checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a - languageName: node - linkType: hard - -"magicast@npm:^0.5.2": - version: 0.5.2 - resolution: "magicast@npm:0.5.2" - dependencies: - "@babel/parser": "npm:^7.29.0" - "@babel/types": "npm:^7.29.0" - source-map-js: "npm:^1.2.1" - checksum: 10c0/924af677643c5a0a7d6cdb3247c0eb96fa7611b2ba6a5e720d35d81c503d3d9f5948eb5227f80f90f82ea3e7d38cffd10bb988f3fc09020db428e14f26e960d7 - languageName: node - linkType: hard - "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -7111,6 +8276,15 @@ __metadata: languageName: node linkType: hard +"mime-types@npm:^2.1.35, mime-types@npm:~2.1.34": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + "mime-types@npm:^3.0.0, mime-types@npm:^3.0.1": version: 3.0.2 resolution: "mime-types@npm:3.0.2" @@ -7120,15 +8294,6 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - "mime@npm:1.6.0": version: 1.6.0 resolution: "mime@npm:1.6.0" @@ -7145,6 +8310,13 @@ __metadata: languageName: node linkType: hard +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -7161,7 +8333,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.5 resolution: "minimatch@npm:3.1.5" dependencies: @@ -7170,15 +8342,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^8.0.2": - version: 8.0.7 - resolution: "minimatch@npm:8.0.7" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/46d9dee24174f8a9eadec97ba36cba2e63f1fff8b36324e1825229bd9307ffee7ffd2f5a2749b29ba796eda877cd9c1687f9d1b399a10b290346561f2a8145f8 - languageName: node - linkType: hard - "minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -7246,14 +8409,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^4.2.4": - version: 4.2.8 - resolution: "minipass@npm:4.2.8" - checksum: 10c0/4ea76b030d97079f4429d6e8a8affd90baf1b6a1898977c8ccce4701c5a2ba2792e033abc6709373f25c2c4d4d95440d9d5e9464b46b7b76ca44d2ce26d939ce - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": +"minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.3 resolution: "minipass@npm:7.1.3" checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb @@ -7402,6 +8558,13 @@ __metadata: languageName: node linkType: hard +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + "npm-package-arg@npm:^11.0.0": version: 11.0.3 resolution: "npm-package-arg@npm:11.0.3" @@ -7414,6 +8577,15 @@ __metadata: languageName: node linkType: hard +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac + languageName: node + linkType: hard + "nullthrows@npm:^1.1.1": version: 1.1.1 resolution: "nullthrows@npm:1.1.1" @@ -7421,6 +8593,13 @@ __metadata: languageName: node linkType: hard +"nwsapi@npm:^2.2.2": + version: 2.2.24 + resolution: "nwsapi@npm:2.2.24" + checksum: 10c0/9bc04ee9c7698f1b5506778d36f7382962f71667205d441d6a50f6180ee92328e770b76be78b907817ee103241b29984d3a17ae387e4723aebe0aeaed7a7c3a1 + languageName: node + linkType: hard + "ob1@npm:0.84.4": version: 0.84.4 resolution: "ob1@npm:0.84.4" @@ -7501,13 +8680,6 @@ __metadata: languageName: node linkType: hard -"obug@npm:^2.1.1": - version: 2.1.1 - resolution: "obug@npm:2.1.1" - checksum: 10c0/59dccd7de72a047e08f8649e94c1015ec72f94eefb6ddb57fb4812c4b425a813bc7e7cd30c9aca20db3c59abc3c85cc7a62bb656a968741d770f4e8e02bc2e78 - languageName: node - linkType: hard - "on-finished@npm:~2.3.0": version: 2.3.0 resolution: "on-finished@npm:2.3.0" @@ -7533,6 +8705,15 @@ __metadata: languageName: node linkType: hard +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + "onetime@npm:^2.0.0": version: 2.0.1 resolution: "onetime@npm:2.0.1" @@ -7542,6 +8723,15 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + "open@npm:^7.0.3": version: 7.4.2 resolution: "open@npm:7.4.2" @@ -7591,7 +8781,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^2.0.0": +"p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" dependencies: @@ -7600,7 +8790,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2": +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -7618,12 +8808,12 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" dependencies: - p-limit: "npm:^2.0.0" - checksum: 10c0/7b7f06f718f19e989ce6280ed4396fb3c34dabdee0df948376483032f9d5ec22fdf7077ec942143a75827bb85b11da72016497fc10dac1106c837ed593969ee8 + p-limit: "npm:^2.2.0" + checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 languageName: node linkType: hard @@ -7675,6 +8865,18 @@ __metadata: languageName: node linkType: hard +"parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + languageName: node + linkType: hard + "parse-png@npm:^2.1.0": version: 2.1.0 resolution: "parse-png@npm:2.1.0" @@ -7684,6 +8886,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.0.0, parse5@npm:^7.1.1": + version: 7.3.0 + resolution: "parse5@npm:7.3.0" + dependencies: + entities: "npm:^6.0.0" + checksum: 10c0/7fd2e4e247e85241d6f2a464d0085eed599a26d7b0a5233790c49f53473232eb85350e8133344d9b3fd58b89339e7ad7270fe1f89d28abe50674ec97b87f80b5 + languageName: node + linkType: hard + "parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -7691,13 +8902,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 - languageName: node - linkType: hard - "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -7705,7 +8909,14 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^3.1.0": +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c @@ -7719,16 +8930,6 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.6.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - "path-scurry@npm:^2.0.0": version: 2.0.1 resolution: "path-scurry@npm:2.0.1" @@ -7739,13 +8940,6 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^2.0.3": - version: 2.0.3 - resolution: "pathe@npm:2.0.3" - checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 - languageName: node - linkType: hard - "picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -7753,26 +8947,33 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.2 resolution: "picomatch@npm:2.3.2" checksum: 10c0/a554d1709e59be97d1acb9eaedbbc700a5c03dbd4579807baed95100b00420bc729335440ef15004ae2378984e2487a7c1cebd743cfdb72b6fa9ab69223c0d61 languageName: node linkType: hard -"picomatch@npm:^4.0.3, picomatch@npm:^4.0.4": +"picomatch@npm:^4.0.4": version: 4.0.4 resolution: "picomatch@npm:4.0.4" checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 languageName: node linkType: hard -"pkg-up@npm:^3.1.0": - version: 3.1.0 - resolution: "pkg-up@npm:3.1.0" +"pirates@npm:^4.0.4": + version: 4.0.7 + resolution: "pirates@npm:4.0.7" + checksum: 10c0/a51f108dd811beb779d58a76864bbd49e239fa40c7984cd11596c75a121a8cc789f1c8971d8bb15f0dbf9d48b76c05bb62fcbce840f89b688c0fa64b37e8478a + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" dependencies: - find-up: "npm:^3.0.0" - checksum: 10c0/ecb60e1f8e1f611c0bdf1a0b6a474d6dfb51185567dc6f29cdef37c8d480ecba5362e006606bb290519bbb6f49526c403fabea93c3090c20368d98bb90c999ab + find-up: "npm:^4.0.0" + checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 languageName: node linkType: hard @@ -7808,7 +9009,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.5.14, postcss@npm:^8.5.15": +"postcss@npm:^8.5.14": version: 8.5.15 resolution: "postcss@npm:8.5.15" dependencies: @@ -7895,7 +9096,7 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.3.2": +"prompts@npm:^2.0.1, prompts@npm:^2.2.1, prompts@npm:^2.3.2": version: 2.4.2 resolution: "prompts@npm:2.4.2" dependencies: @@ -7916,13 +9117,29 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0": +"psl@npm:^1.1.33": + version: 1.15.0 + resolution: "psl@npm:1.15.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10c0/d8d45a99e4ca62ca12ac3c373e63d80d2368d38892daa40cfddaa1eb908be98cd549ac059783ef3a56cfd96d57ae8e2fd9ae53d1378d90d42bc661ff924e102a + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 languageName: node linkType: hard +"pure-rand@npm:^6.0.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 + languageName: node + linkType: hard + "query-string@npm:^7.1.3": version: 7.1.3 resolution: "query-string@npm:7.1.3" @@ -7935,6 +9152,13 @@ __metadata: languageName: node linkType: hard +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 10c0/3258bc3dbdf322ff2663619afe5947c7926a6ef5fb78ad7d384602974c467fadfc8272af44f5eb8cddd0d011aae8fabf3a929a8eee4b86edcc0a21e6bd10f9aa + languageName: node + linkType: hard + "queue@npm:6.0.2": version: 6.0.2 resolution: "queue@npm:6.0.2" @@ -8031,10 +9255,10 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^19.1.0": - version: 19.2.3 - resolution: "react-is@npm:19.2.3" - checksum: 10c0/2b54c422c21b8dbd68a435a1cce21ecd5b6f06f48659531f7d53dd7368365da5a67e946f352fb2010d11ca40658aa67bec90995f0f1ec5556c0f71dbffe54994 +"react-is@npm:^19.1.0, react-is@npm:^19.2.3": + version: 19.2.7 + resolution: "react-is@npm:19.2.7" + checksum: 10c0/419fe54d5bd7fdf5414a5bb7bd9a1e0e36f9fae28ffb4cb73290fbe342bde15d8584a90d1db62547f6aa03018dce517b178a041abb522136cd4b4b51b4e94c83 languageName: node linkType: hard @@ -8295,6 +9519,18 @@ __metadata: languageName: node linkType: hard +"react-test-renderer@npm:19.2.3": + version: 19.2.3 + resolution: "react-test-renderer@npm:19.2.3" + dependencies: + react-is: "npm:^19.2.3" + scheduler: "npm:^0.27.0" + peerDependencies: + react: ^19.2.3 + checksum: 10c0/842b82239dbddbc536083a6260c3e1b0507c02a3400bd05879fc19160468fd0f8ab79fec5dceffa6113b131835cc7621212f8415b46ea5156ab66bbfd7e24297 + languageName: node + linkType: hard + "react@npm:19.2.3": version: 19.2.3 resolution: "react@npm:19.2.3" @@ -8430,10 +9666,19 @@ __metadata: languageName: node linkType: hard -"reselect@npm:^4.1.7": - version: 4.1.8 - resolution: "reselect@npm:4.1.8" - checksum: 10c0/06a305a504affcbb67dd0561ddc8306b35796199c7e15b38934c80606938a021eadcf68cfd58e7bb5e17786601c37602a3362a4665c7bf0a96c1041ceee9d0b7 +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: 10c0/b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 languageName: node linkType: hard @@ -8458,16 +9703,24 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.22.10, resolve@npm:^1.22.8": - version: 1.22.11 - resolution: "resolve@npm:1.22.11" +"resolve.exports@npm:^2.0.0": + version: 2.0.3 + resolution: "resolve.exports@npm:2.0.3" + checksum: 10c0/1ade1493f4642a6267d0a5e68faeac20b3d220f18c28b140343feb83694d8fed7a286852aef43689d16042c61e2ddb270be6578ad4a13990769e12065191200d + languageName: node + linkType: hard + +"resolve@npm:^1.20.0, resolve@npm:^1.22.10": + version: 1.22.12 + resolution: "resolve@npm:1.22.12" dependencies: + es-errors: "npm:^1.3.0" is-core-module: "npm:^2.16.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/f657191507530f2cbecb5815b1ee99b20741ea6ee02a59c57028e9ec4c2c8d7681afcc35febbd554ac0ded459db6f2d8153382c53a2f266cee2575e512674409 + checksum: 10c0/b16dc9b537c02e8c3388f7d3dcff9741d3071625f9a97ac1c885f2b0ca51e78df22328fb6d6ef214dd9101fb7cfc19aa2836fe3410402a94f3f7b8639c7149bf languageName: node linkType: hard @@ -8484,16 +9737,17 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": - version: 1.22.11 - resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.10#optional!builtin": + version: 1.22.12 + resolution: "resolve@patch:resolve@npm%3A1.22.12#optional!builtin::version=1.22.12&hash=c3c19d" dependencies: + es-errors: "npm:^1.3.0" is-core-module: "npm:^2.16.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/ee5b182f2e37cb1165465e58c6abc797fec0a80b5ba3231607beb4677db0c9291ac010c47cf092b6daa2b7f518d69a0e21888e7e2b633f68d501a874212a8c63 + checksum: 10c0/fc6519984ae1f894d877c0060ba8b1f5ba3bc0e85a02f74e141929c118c23d74d9735619a9cc2965397387e514884245c65d72a40731dcb6cfc84c7bcdc8321e languageName: node linkType: hard @@ -8527,64 +9781,6 @@ __metadata: languageName: node linkType: hard -"rolldown@npm:1.1.3, rolldown@npm:~1.1.2": - version: 1.1.3 - resolution: "rolldown@npm:1.1.3" - dependencies: - "@oxc-project/types": "npm:=0.137.0" - "@rolldown/binding-android-arm64": "npm:1.1.3" - "@rolldown/binding-darwin-arm64": "npm:1.1.3" - "@rolldown/binding-darwin-x64": "npm:1.1.3" - "@rolldown/binding-freebsd-x64": "npm:1.1.3" - "@rolldown/binding-linux-arm-gnueabihf": "npm:1.1.3" - "@rolldown/binding-linux-arm64-gnu": "npm:1.1.3" - "@rolldown/binding-linux-arm64-musl": "npm:1.1.3" - "@rolldown/binding-linux-ppc64-gnu": "npm:1.1.3" - "@rolldown/binding-linux-s390x-gnu": "npm:1.1.3" - "@rolldown/binding-linux-x64-gnu": "npm:1.1.3" - "@rolldown/binding-linux-x64-musl": "npm:1.1.3" - "@rolldown/binding-openharmony-arm64": "npm:1.1.3" - "@rolldown/binding-wasm32-wasi": "npm:1.1.3" - "@rolldown/binding-win32-arm64-msvc": "npm:1.1.3" - "@rolldown/binding-win32-x64-msvc": "npm:1.1.3" - "@rolldown/pluginutils": "npm:^1.0.0" - dependenciesMeta: - "@rolldown/binding-android-arm64": - optional: true - "@rolldown/binding-darwin-arm64": - optional: true - "@rolldown/binding-darwin-x64": - optional: true - "@rolldown/binding-freebsd-x64": - optional: true - "@rolldown/binding-linux-arm-gnueabihf": - optional: true - "@rolldown/binding-linux-arm64-gnu": - optional: true - "@rolldown/binding-linux-arm64-musl": - optional: true - "@rolldown/binding-linux-ppc64-gnu": - optional: true - "@rolldown/binding-linux-s390x-gnu": - optional: true - "@rolldown/binding-linux-x64-gnu": - optional: true - "@rolldown/binding-linux-x64-musl": - optional: true - "@rolldown/binding-openharmony-arm64": - optional: true - "@rolldown/binding-wasm32-wasi": - optional: true - "@rolldown/binding-win32-arm64-msvc": - optional: true - "@rolldown/binding-win32-x64-msvc": - optional: true - bin: - rolldown: ./bin/cli.mjs - checksum: 10c0/6dae11bee45c56d000d5d2608ac78b2c7125b7f10337e0b0bbdee7290c352104f1f76072f8c0e6ccad331f51f1a131fc37faa179d9c4a10cc16abc87f85f6e86 - languageName: node - linkType: hard - "rtl-detect@npm:^1.0.2": version: 1.1.2 resolution: "rtl-detect@npm:1.1.2" @@ -8647,6 +9843,15 @@ __metadata: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: "npm:^2.2.0" + checksum: 10c0/3847b839f060ef3476eb8623d099aa502ad658f5c40fd60c105ebce86d244389b0d76fcae30f4d0c728d7705ceb2f7e9b34bb54717b6a7dbedaf5dad2d9a4b74 + languageName: node + linkType: hard + "scheduler@npm:0.27.0, scheduler@npm:^0.27.0": version: 0.27.0 resolution: "scheduler@npm:0.27.0" @@ -8677,7 +9882,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.3.1": +"semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -8878,14 +10083,7 @@ __metadata: languageName: node linkType: hard -"siginfo@npm:^2.0.0": - version: 2.0.0 - resolution: "siginfo@npm:2.0.0" - checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.2": +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 @@ -8919,6 +10117,20 @@ __metadata: languageName: node linkType: hard +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + languageName: node + linkType: hard + +"slash@npm:^5.0.0": + version: 5.1.0 + resolution: "slash@npm:5.1.0" + checksum: 10c0/eb48b815caf0bdc390d0519d41b9e0556a14380f6799c72ba35caf03544d501d18befdeeef074bc9c052acf69654bc9e0d79d7f1de0866284137a40805299eb3 + languageName: node + linkType: hard + "slugify@npm:^1.3.4, slugify@npm:^1.6.6": version: 1.6.6 resolution: "slugify@npm:1.6.6" @@ -8961,6 +10173,16 @@ __metadata: languageName: node linkType: hard +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/137539f8c453fa0f496ea42049ab5da4569f96781f6ac8e5bfda26937be9494f4e8891f523c5f98f0e85f71b35d74127a00c46f83f6a4f54672b58d53202565e + languageName: node + linkType: hard + "source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" @@ -8971,6 +10193,13 @@ __metadata: languageName: node linkType: hard +"source-map@npm:0.5.6": + version: 0.5.6 + resolution: "source-map@npm:0.5.6" + checksum: 10c0/beb2c5974bb58954d75e86249953d47ae16f7df1a8531abb9fcae0cd262d9fa09c2db3a134e20e99358b1adba42b6b054a32c8e16b571b3efcf6af644c329f0d + languageName: node + linkType: hard + "source-map@npm:^0.5.6": version: 0.5.7 resolution: "source-map@npm:0.5.7" @@ -8978,7 +10207,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0": +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 @@ -8992,6 +10221,13 @@ __metadata: languageName: node linkType: hard +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + "ssri@npm:^13.0.0": version: 13.0.0 resolution: "ssri@npm:13.0.0" @@ -9001,10 +10237,21 @@ __metadata: languageName: node linkType: hard -"stackback@npm:0.0.2": - version: 0.0.2 - resolution: "stackback@npm:0.0.2" - checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 +"stack-generator@npm:^2.0.5": + version: 2.0.10 + resolution: "stack-generator@npm:2.0.10" + dependencies: + stackframe: "npm:^1.3.4" + checksum: 10c0/c3f6f6c580488e65c0fee806a57f6ae4b79e6435f144be471c1f20328a8d9d8492d4f3beed31840f6dae03e2633325e2764fd3aca5c3126a0639e7c9ddfa45ce + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a languageName: node linkType: hard @@ -9015,6 +10262,27 @@ __metadata: languageName: node linkType: hard +"stacktrace-gps@npm:^3.0.4": + version: 3.1.2 + resolution: "stacktrace-gps@npm:3.1.2" + dependencies: + source-map: "npm:0.5.6" + stackframe: "npm:^1.3.4" + checksum: 10c0/0dcc1aa46e364a2b4d1eabce4777fecf337576a11ee3cfc92f07b9ec79ccb76810752431eeb9771289d250d0bb58dbe19a178b96bf7b2e9f773334d03aa96bb9 + languageName: node + linkType: hard + +"stacktrace-js@npm:^2.0.2": + version: 2.0.2 + resolution: "stacktrace-js@npm:2.0.2" + dependencies: + error-stack-parser: "npm:^2.0.6" + stack-generator: "npm:^2.0.5" + stacktrace-gps: "npm:^3.0.4" + checksum: 10c0/9a10c222524ca03690bcb27437b39039885223e39320367f2be36e6f750c2d198ae99189869a22c255bf60072631eb609d47e8e33661e95133686904e01121ec + languageName: node + linkType: hard + "stacktrace-parser@npm:^0.1.10": version: 0.1.11 resolution: "stacktrace-parser@npm:0.1.11" @@ -9045,13 +10313,6 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^4.0.0-rc.1": - version: 4.0.0 - resolution: "std-env@npm:4.0.0" - checksum: 10c0/63b1716eae27947adde49e21b7225a0f75fb2c3d410273ae9de8333c07c7d5fc7a0628ae4c8af6b4b49b4274ed46c2bf118ed69b64f1261c9d8213d76ed1c16c - languageName: node - linkType: hard - "stop-iteration-iterator@npm:^1.1.0": version: 1.1.0 resolution: "stop-iteration-iterator@npm:1.1.0" @@ -9076,6 +10337,26 @@ __metadata: languageName: node linkType: hard +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: "npm:^1.0.2" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/1cd77409c3d7db7bc59406f6bcc9ef0783671dcbabb23597a1177c166906ef2ee7c8290f78cae73a8aec858768f189d2cb417797df5e15ec4eb5e16b3346340c + languageName: node + linkType: hard + +"string-length@npm:^5.0.1": + version: 5.0.1 + resolution: "string-length@npm:5.0.1" + dependencies: + char-regex: "npm:^2.0.0" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/311fa5758d397bd616be17150dfefaab4755ed292a3112237924d10ba5122f606064ad4880a293387401c1d7aa20d79f7936728bac2abed17a5e48f5b317cbc8 + languageName: node + linkType: hard + "string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -9174,6 +10455,29 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^7.0.1": + version: 7.2.0 + resolution: "strip-ansi@npm:7.2.0" + dependencies: + ansi-regex: "npm:^6.2.2" + checksum: 10c0/544d13b7582f8254811ea97db202f519e189e59d35740c46095897e254e4f1aa9fe1524a83ad6bc5ad67d4dd6c0281d2e0219ed62b880a6238a16a17d375f221 + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 10c0/26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + "strip-indent@npm:^3.0.0": version: 3.0.0 resolution: "strip-indent@npm:3.0.0" @@ -9248,6 +10552,13 @@ __metadata: languageName: node linkType: hard +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: 10c0/dfbe201ae09ac6053d163578778c53aa860a784147ecf95705de0cd23f42c851e1be7889241495e95c37cabb058edb1052f141387bef68f705afc8f9dd358509 + languageName: node + linkType: hard + "tar@npm:^7.5.2": version: 7.5.16 resolution: "tar@npm:7.5.16" @@ -9285,6 +10596,17 @@ __metadata: languageName: node linkType: hard +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 + languageName: node + linkType: hard + "throat@npm:^5.0.0": version: 5.0.0 resolution: "throat@npm:5.0.0" @@ -9300,22 +10622,20 @@ __metadata: "@eslint/js": "npm:9.39.2" "@expo/log-box": "npm:57.0.0" "@expo/ui": "npm:~57.0.3" + "@jest/globals": "npm:^29.7.0" "@maplibre/maplibre-react-native": "npm:11.3.6" "@react-native-community/slider": "npm:5.2.0" "@react-native-vector-icons/material-design-icons": "npm:^13.1.2" + "@react-native/jest-preset": "npm:0.86.0" "@react-native/metro-config": "npm:0.86.0" - "@rolldown/plugin-babel": "npm:0.2.3" "@types/papaparse": "npm:5.5.2" "@types/react": "npm:~19.2.14" "@types/react-dom": "npm:~19.2.0" "@types/react-native-web": "npm:0.19.2" - "@vitejs/plugin-react": "npm:6.0.3" - "@vitest/coverage-v8": "npm:4.1.9" - "@vitest/eslint-plugin": "npm:1.6.20" - babel-plugin-module-resolver: "npm:5.0.3" cross-env: "npm:10.1.0" eslint: "npm:9.39.2" eslint-config-prettier: "npm:10.1.8" + eslint-plugin-jest: "npm:29.15.4" eslint-plugin-react: "npm:7.37.5" eslint-plugin-react-hooks: "npm:7.1.1" eslint-plugin-sonarjs: "npm:4.1.0" @@ -9335,6 +10655,9 @@ __metadata: expo-system-ui: "npm:~57.0.0" expo-task-manager: "npm:~57.0.2" i18next: "npm:26.3.3" + jest: "npm:~29.7.0" + jest-expo: "npm:~57.0.1" + jest-junit: "npm:17.0.0" papaparse: "npm:5.5.4" prettier: "npm:3.9.4" react: "npm:19.2.3" @@ -9349,29 +10672,12 @@ __metadata: react-native-screens: "npm:4.25.2" react-native-web: "npm:0.21.2" react-native-worklets: "npm:0.10.0" - rolldown: "npm:1.1.3" typescript: "npm:~6.0.3" typescript-eslint: "npm:8.62.1" - vite: "npm:8.1.0" - vitest: "npm:4.1.9" languageName: unknown linkType: soft -"tinybench@npm:^2.9.0": - version: 2.9.0 - resolution: "tinybench@npm:2.9.0" - checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c - languageName: node - linkType: hard - -"tinyexec@npm:^1.0.2": - version: 1.0.2 - resolution: "tinyexec@npm:1.0.2" - checksum: 10c0/1261a8e34c9b539a9aae3b7f0bb5372045ff28ee1eba035a2a059e532198fe1a182ec61ac60fa0b4a4129f0c4c4b1d2d57355b5cb9aa2d17ac9454ecace502ee - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.17": +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15": version: 0.2.17 resolution: "tinyglobby@npm:0.2.17" dependencies: @@ -9388,13 +10694,6 @@ __metadata: languageName: node linkType: hard -"tinyrainbow@npm:^3.1.0": - version: 3.1.0 - resolution: "tinyrainbow@npm:3.1.0" - checksum: 10c0/f11cf387a26c5c9255bec141a90ac511b26172981b10c3e50053bc6700ea7d2336edcc4a3a21dbb8412fe7c013477d2ba4d7e4877800f3f8107be5105aad6511 - languageName: node - linkType: hard - "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -9425,6 +10724,27 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^4.1.2": + version: 4.1.4 + resolution: "tough-cookie@npm:4.1.4" + dependencies: + psl: "npm:^1.1.33" + punycode: "npm:^2.1.1" + universalify: "npm:^0.2.0" + url-parse: "npm:^1.5.3" + checksum: 10c0/aca7ff96054f367d53d1e813e62ceb7dd2eda25d7752058a74d64b7266fd07be75908f3753a32ccf866a2f997604b414cfb1916d6e7f69bc64d9d9939b0d6c45 + languageName: node + linkType: hard + +"tr46@npm:^3.0.0": + version: 3.0.0 + resolution: "tr46@npm:3.0.0" + dependencies: + punycode: "npm:^2.1.1" + checksum: 10c0/cdc47cad3a9d0b6cb293e39ccb1066695ae6fdd39b9e4f351b010835a1f8b4f3a6dc3a55e896b421371187f22b48d7dac1b693de4f6551bdef7b6ab6735dfe3b + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -9441,7 +10761,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.8.1": +"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -9457,6 +10777,13 @@ __metadata: languageName: node linkType: hard +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd + languageName: node + linkType: hard + "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -9650,6 +10977,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: 10c0/cedbe4d4ca3967edf24c0800cfc161c5a15e240dac28e3ce575c689abc11f2c81ccc6532c8752af3b40f9120fb5e454abecd359e164f4f6aa44c29cd37e194fe + languageName: node + linkType: hard + "unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" @@ -9680,6 +11014,16 @@ __metadata: languageName: node linkType: hard +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: "npm:^2.1.1" + requires-port: "npm:^1.0.0" + checksum: 10c0/bd5aa9389f896974beb851c112f63b466505a04b4807cea2e5a3b7092f6fbb75316f0491ea84e44f66fed55f1b440df5195d7e3a8203f64fcefa19d182f5be87 + languageName: node + linkType: hard + "use-callback-ref@npm:^1.3.3": version: 1.3.3 resolution: "use-callback-ref@npm:1.3.3" @@ -9736,6 +11080,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^14.0.0": + version: 14.0.1 + resolution: "uuid@npm:14.0.1" + bin: + uuid: dist-node/bin/uuid + checksum: 10c0/2d961289097cb68c37d93d1da0b5c3aafc1eb9948a455cca8d0ae53a099b2fe583b8933254a84097f700e6bac2e23033364904df0467c22551d5d9611febcaf6 + languageName: node + linkType: hard + "uuid@npm:^7.0.3": version: 7.0.3 resolution: "uuid@npm:7.0.3" @@ -9745,6 +11098,17 @@ __metadata: languageName: node linkType: hard +"v8-to-istanbul@npm:^9.0.1": + version: 9.3.0 + resolution: "v8-to-istanbul@npm:9.3.0" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: 10c0/968bcf1c7c88c04df1ffb463c179558a2ec17aa49e49376120504958239d9e9dad5281aa05f2a78542b8557f2be0b0b4c325710262f3b838b40d703d5ed30c23 + languageName: node + linkType: hard + "validate-npm-package-name@npm:^5.0.0": version: 5.0.1 resolution: "validate-npm-package-name@npm:5.0.1" @@ -9771,131 +11135,6 @@ __metadata: languageName: node linkType: hard -"vite@npm:8.1.0, vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.1.0 - resolution: "vite@npm:8.1.0" - dependencies: - fsevents: "npm:~2.3.3" - lightningcss: "npm:^1.32.0" - picomatch: "npm:^4.0.4" - postcss: "npm:^8.5.15" - rolldown: "npm:~1.1.2" - tinyglobby: "npm:^0.2.17" - peerDependencies: - "@types/node": ^20.19.0 || >=22.12.0 - "@vitejs/devtools": ^0.3.0 - esbuild: ^0.27.0 || ^0.28.0 - jiti: ">=1.21.0" - less: ^4.0.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: ">=0.54.8" - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - "@vitejs/devtools": - optional: true - esbuild: - optional: true - jiti: - optional: true - less: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - bin: - vite: bin/vite.js - checksum: 10c0/d7e2da70169a7d93c68f5d0e246bdf2fb35d8835170663a28f01191d73e16b80322b5f229973ce754de80136be843481b0afa616bb8530b51e7454e4887c4b45 - languageName: node - linkType: hard - -"vitest@npm:4.1.9": - version: 4.1.9 - resolution: "vitest@npm:4.1.9" - dependencies: - "@vitest/expect": "npm:4.1.9" - "@vitest/mocker": "npm:4.1.9" - "@vitest/pretty-format": "npm:4.1.9" - "@vitest/runner": "npm:4.1.9" - "@vitest/snapshot": "npm:4.1.9" - "@vitest/spy": "npm:4.1.9" - "@vitest/utils": "npm:4.1.9" - es-module-lexer: "npm:^2.0.0" - expect-type: "npm:^1.3.0" - magic-string: "npm:^0.30.21" - obug: "npm:^2.1.1" - pathe: "npm:^2.0.3" - picomatch: "npm:^4.0.3" - std-env: "npm:^4.0.0-rc.1" - tinybench: "npm:^2.9.0" - tinyexec: "npm:^1.0.2" - tinyglobby: "npm:^0.2.15" - tinyrainbow: "npm:^3.1.0" - vite: "npm:^6.0.0 || ^7.0.0 || ^8.0.0" - why-is-node-running: "npm:^2.3.0" - peerDependencies: - "@edge-runtime/vm": "*" - "@opentelemetry/api": ^1.9.0 - "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 - "@vitest/browser-playwright": 4.1.9 - "@vitest/browser-preview": 4.1.9 - "@vitest/browser-webdriverio": 4.1.9 - "@vitest/coverage-istanbul": 4.1.9 - "@vitest/coverage-v8": 4.1.9 - "@vitest/ui": 4.1.9 - happy-dom: "*" - jsdom: "*" - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - "@edge-runtime/vm": - optional: true - "@opentelemetry/api": - optional: true - "@types/node": - optional: true - "@vitest/browser-playwright": - optional: true - "@vitest/browser-preview": - optional: true - "@vitest/browser-webdriverio": - optional: true - "@vitest/coverage-istanbul": - optional: true - "@vitest/coverage-v8": - optional: true - "@vitest/ui": - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vite: - optional: false - bin: - vitest: ./vitest.mjs - checksum: 10c0/1ac80ef4991be82822a52aea48415f1bc64ddf8fd88ee24c172ec368f1d480fefacbde622c3c951982f7961a1d07313e18deaafc774d29e42ad6f6ffa63334a7 - languageName: node - linkType: hard - "vlq@npm:^1.0.0": version: 1.0.1 resolution: "vlq@npm:1.0.1" @@ -9910,6 +11149,15 @@ __metadata: languageName: node linkType: hard +"w3c-xmlserializer@npm:^4.0.0": + version: 4.0.0 + resolution: "w3c-xmlserializer@npm:4.0.0" + dependencies: + xml-name-validator: "npm:^4.0.0" + checksum: 10c0/02cc66d6efc590bd630086cd88252444120f5feec5c4043932b0d0f74f8b060512f79dc77eb093a7ad04b4f02f39da79ce4af47ceb600f2bf9eacdc83204b1a8 + languageName: node + linkType: hard + "walker@npm:^1.0.7, walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -9942,6 +11190,22 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: 10c0/228d8cb6d270c23b0720cb2d95c579202db3aaf8f633b4e9dd94ec2000a04e7e6e43b76a94509cdb30479bd00ae253ab2371a2da9f81446cc313f89a4213a2c4 + languageName: node + linkType: hard + +"whatwg-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "whatwg-encoding@npm:2.0.0" + dependencies: + iconv-lite: "npm:0.6.3" + checksum: 10c0/91b90a49f312dc751496fd23a7e68981e62f33afe938b97281ad766235c4872fc4e66319f925c5e9001502b3040dd25a33b02a9c693b73a4cbbfdc4ad10c3e3e + languageName: node + linkType: hard + "whatwg-fetch@npm:^3.0.0": version: 3.6.20 resolution: "whatwg-fetch@npm:3.6.20" @@ -9949,6 +11213,13 @@ __metadata: languageName: node linkType: hard +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: 10c0/323895a1cda29a5fb0b9ca82831d2c316309fede0365047c4c323073e3239067a304a09a1f4b123b9532641ab604203f33a1403b5ca6a62ef405bcd7a204080f + languageName: node + linkType: hard + "whatwg-url-minimum@npm:^0.1.2": version: 0.1.2 resolution: "whatwg-url-minimum@npm:0.1.2" @@ -9956,6 +11227,16 @@ __metadata: languageName: node linkType: hard +"whatwg-url@npm:^11.0.0": + version: 11.0.0 + resolution: "whatwg-url@npm:11.0.0" + dependencies: + tr46: "npm:^3.0.0" + webidl-conversions: "npm:^7.0.0" + checksum: 10c0/f7ec264976d7c725e0696fcaf9ebe056e14422eacbf92fdbb4462034609cba7d0c85ffa1aab05e9309d42969bcf04632ba5ed3f3882c516d7b093053315bf4c1 + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -10049,18 +11330,6 @@ __metadata: languageName: node linkType: hard -"why-is-node-running@npm:^2.3.0": - version: 2.3.0 - resolution: "why-is-node-running@npm:2.3.0" - dependencies: - siginfo: "npm:^2.0.0" - stackback: "npm:0.0.2" - bin: - why-is-node-running: cli.js - checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 - languageName: node - linkType: hard - "word-wrap@npm:^1.2.5": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -10079,6 +11348,23 @@ __metadata: languageName: node linkType: hard +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.7" + checksum: 10c0/a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7 + languageName: node + linkType: hard + "ws@npm:^7, ws@npm:^7.5.10": version: 7.5.11 resolution: "ws@npm:7.5.11" @@ -10094,9 +11380,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.12.1": - version: 8.19.0 - resolution: "ws@npm:8.19.0" +"ws@npm:^8.11.0, ws@npm:^8.12.1": + version: 8.21.0 + resolution: "ws@npm:8.21.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -10105,7 +11391,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/4741d9b9bc3f9c791880882414f96e36b8b254e34d4b503279d6400d9a4b87a033834856dbdd94ee4b637944df17ea8afc4bce0ff4a1560d2166be8855da5b04 + checksum: 10c0/ef4a243476283fc49bc7550966c4af4aa0eef56273837211e700de3b664e08604a760cdddcb5ba43c049140e74ccfec5b0ee0bb439e08c2adf9138902fdde5f9 languageName: node linkType: hard @@ -10119,6 +11405,13 @@ __metadata: languageName: node linkType: hard +"xml-name-validator@npm:^4.0.0": + version: 4.0.0 + resolution: "xml-name-validator@npm:4.0.0" + checksum: 10c0/c1bfa219d64e56fee265b2bd31b2fcecefc063ee802da1e73bad1f21d7afd89b943c9e2c97af2942f60b1ad46f915a4c81e00039c7d398b53cf410e29d3c30bd + languageName: node + linkType: hard + "xml2js@npm:0.6.0": version: 0.6.0 resolution: "xml2js@npm:0.6.0" @@ -10129,6 +11422,13 @@ __metadata: languageName: node linkType: hard +"xml@npm:^1.0.1": + version: 1.0.1 + resolution: "xml@npm:1.0.1" + checksum: 10c0/04bcc9b8b5e7b49392072fbd9c6b0f0958bd8e8f8606fee460318e43991349a68cbc5384038d179ff15aef7d222285f69ca0f067f53d071084eb14c7fdb30411 + languageName: node + linkType: hard + "xmlbuilder@npm:^15.1.1": version: 15.1.1 resolution: "xmlbuilder@npm:15.1.1" @@ -10143,6 +11443,13 @@ __metadata: languageName: node linkType: hard +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 10c0/b64b535861a6f310c5d9bfa10834cf49127c71922c297da9d4d1b45eeaae40bf9b4363275876088fbe2667e5db028d2cd4f8ee72eed9bede840a67d57dab7593 + languageName: node + linkType: hard + "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" @@ -10187,9 +11494,9 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.6.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" +"yargs@npm:^17.3.1, yargs@npm:^17.6.2": + version: 17.7.3 + resolution: "yargs@npm:17.7.3" dependencies: cliui: "npm:^8.0.1" escalade: "npm:^3.1.1" @@ -10198,7 +11505,7 @@ __metadata: string-width: "npm:^4.2.3" y18n: "npm:^5.0.5" yargs-parser: "npm:^21.1.1" - checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + checksum: 10c0/7a28572f7e785a57886e34fdbddb9b28756dec552e1453d5f6e7cdd00ad8721a4e8c4321d33683f5e61cacb36ad43258adbb48396b71ec4ed14abee0fc0d0c1f languageName: node linkType: hard