From 36a26ba6a2c035e1b3b8dc52b8371a3ed1883b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Thu, 18 Dec 2025 12:20:20 +0100 Subject: [PATCH 01/49] feat: migrate to v4 version of the agent BREAKING CHANGE: The SDK api has changed to match changes introduced in V4 version of the agent. --- __tests__/fpjs-provider.test.tsx | 55 +++--- __tests__/helpers.tsx | 11 +- __tests__/use-visitor-data.test.tsx | 155 +++++++++-------- .../src/in_memory_cache/InMemoryCache.tsx | 12 +- .../local_storage_cache/LocalStorageCache.tsx | 22 +-- .../src/no_cache/WithoutCache.tsx | 12 +- .../SessionStorageCache.tsx | 12 +- .../components/VisitorDataPresenter.tsx | 6 +- .../src/shared/pages/HomePage.tsx | 11 +- .../src/shared/pages/SignInPage.tsx | 33 +--- package.json | 1 + pnpm-lock.yaml | 31 ++-- src/components/fp-provider.tsx | 112 ++++++++++++ src/components/fpjs-provider.tsx | 161 ------------------ src/fp-context.ts | 22 +++ src/fpjs-context.ts | 54 ------ src/index.ts | 36 +--- src/query.ts | 29 ++++ src/use-visitor-data.ts | 115 +++++++------ 19 files changed, 390 insertions(+), 500 deletions(-) create mode 100644 src/components/fp-provider.tsx delete mode 100644 src/components/fpjs-provider.tsx create mode 100644 src/fp-context.ts delete mode 100644 src/fpjs-context.ts create mode 100644 src/query.ts diff --git a/__tests__/fpjs-provider.test.tsx b/__tests__/fpjs-provider.test.tsx index 14de2aee..b5adcfd1 100644 --- a/__tests__/fpjs-provider.test.tsx +++ b/__tests__/fpjs-provider.test.tsx @@ -1,42 +1,39 @@ import { useContext } from 'react' import { renderHook } from '@testing-library/react' -import { FpjsContext } from '../src' +import { FpContext } from '../src' import { createWrapper, getDefaultLoadOptions } from './helpers' -import { CacheLocation, FpjsClient, FpjsClientOptions } from '@fingerprintjs/fingerprintjs-pro-spa' -import * as packageInfo from '../package.json' +import { version } from '../package.json' -jest.mock('@fingerprintjs/fingerprintjs-pro-spa', () => { +jest.mock('@fingerprint/agent', () => { return { - ...jest.requireActual('@fingerprintjs/fingerprintjs-pro-spa'), - FpjsClient: jest.fn(() => ({ - init: jest.fn(), - })), + ...jest.requireActual('@fingerprint/agent'), + start: jest.fn(), } }) -describe(`FpjsProvider`, () => { - it('should configure an instance of the FpjsClient', async () => { +const mockStart = jest.requireMock('@fingerprint/agent').start as jest.Mock + +describe('FpProvider', () => { + it('should configure an instance of the Fp Agent', async () => { const loadOptions = getDefaultLoadOptions() - const options: FpjsClientOptions = { - loadOptions, - cacheLocation: CacheLocation.LocalStorage, - cachePrefix: 'TEST_PREFIX', - cacheTimeInSeconds: 60 * 15, - } - const wrapper = createWrapper(options) - renderHook(() => useContext(FpjsContext), { + const wrapper = createWrapper({ + cache: { + cachePrefix: 'cache', + storage: 'sessionStorage', + duration: 100, + }, + }) + renderHook(() => useContext(FpContext), { wrapper, }) - expect(FpjsClient).toHaveBeenCalledWith( - expect.objectContaining({ - loadOptions: expect.objectContaining({ - ...loadOptions, - integrationInfo: [`react-sdk/${packageInfo.version}/react`], - }), - cacheLocation: CacheLocation.LocalStorage, - cachePrefix: 'TEST_PREFIX', - cacheTimeInSeconds: 60 * 15, - }) - ) + expect(mockStart).toHaveBeenCalledWith({ + ...loadOptions, + integrationInfo: [`react-sdk/${version}/react`], + cache: { + cachePrefix: 'cache', + storage: 'sessionStorage', + duration: 100, + }, + }) }) }) diff --git a/__tests__/helpers.tsx b/__tests__/helpers.tsx index 29f8203a..948e211c 100644 --- a/__tests__/helpers.tsx +++ b/__tests__/helpers.tsx @@ -1,6 +1,5 @@ import { PropsWithChildren } from 'react' -import { FpjsClientOptions } from '@fingerprintjs/fingerprintjs-pro-spa' -import { FpjsProvider } from '../src' +import { FpProvider, FpProviderOptions } from '../src' import { act } from 'react-dom/test-utils' export const getDefaultLoadOptions = () => ({ @@ -8,11 +7,11 @@ export const getDefaultLoadOptions = () => ({ }) export const createWrapper = - ({ loadOptions = getDefaultLoadOptions(), ...options }: Partial = {}) => - ({ children }: PropsWithChildren<{}>): JSX.Element => ( - + (providerProps: Partial = {}) => + ({ children }: PropsWithChildren<{}>) => ( + {children} - + ) export const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) diff --git a/__tests__/use-visitor-data.test.tsx b/__tests__/use-visitor-data.test.tsx index e2065616..e3e6eb25 100644 --- a/__tests__/use-visitor-data.test.tsx +++ b/__tests__/use-visitor-data.test.tsx @@ -1,36 +1,42 @@ -import { useVisitorData, VisitorQueryContext } from '../src' +import { useVisitorData, UseVisitorDataReturn } from '../src' import { render, renderHook } from '@testing-library/react' import { actWait, createWrapper } from './helpers' import { act } from 'react-dom/test-utils' import { useEffect, useState } from 'react' import userEvent from '@testing-library/user-event' import { FingerprintJSPro } from '@fingerprintjs/fingerprintjs-pro-spa' - -const testData = { - visitorId: 'abcdef123456', +import { GetResult } from '@fingerprint/agent' + +const mockGetResult = { + visitor_id: 'kOzFgO0kw2Eivvb14mRL', + event_id: '1765898371879.Sad9kq', + sealed_result: null, + cache_hit: false, + suspect_score: 0.5, +} satisfies GetResult + +const mockGet = jest.fn() +const mockAgent = { + get: mockGet, } -const init = jest.fn() -const getVisitorData = jest.fn() -jest.mock('@fingerprintjs/fingerprintjs-pro-spa', () => { +const mockStart = jest.requireMock('@fingerprint/agent').start as jest.Mock + +jest.mock('@fingerprint/agent', () => { return { - ...(jest.requireActual('@fingerprintjs/fingerprintjs-pro-spa') as any), - FpjsClient: jest.fn(() => { - return { - init, - getVisitorData, - clearCache: jest.fn(), - } - }), + ...jest.requireActual('@fingerprint/agent'), + start: jest.fn(), } }) describe('useVisitorData', () => { beforeEach(() => { - getVisitorData.mockReset() + jest.resetAllMocks() + + mockStart.mockReturnValue(mockAgent) }) - it('should provide the Fpjs context', async () => { + it('should provide the Fp context', async () => { const wrapper = createWrapper() const { result: { current }, @@ -43,10 +49,10 @@ describe('useVisitorData', () => { }) it('should call getData on mount by default', async () => { - getVisitorData.mockImplementation(() => testData) + mockGet.mockImplementation(() => mockGetResult) const wrapper = createWrapper() - const { result } = renderHook(() => useVisitorData({}, { immediate: true }), { wrapper }) + const { result } = renderHook(() => useVisitorData({ immediate: true }), { wrapper }) expect(result.current).toMatchObject( expect.objectContaining({ isLoading: true, @@ -56,61 +62,61 @@ describe('useVisitorData', () => { await actWait(500) - expect(init).toHaveBeenCalled() - expect(getVisitorData).toHaveBeenCalled() + expect(mockStart).toHaveBeenCalled() + expect(mockGet).toHaveBeenCalled() expect(result.current).toMatchObject( expect.objectContaining({ isLoading: false, - data: testData, + data: mockGetResult, }) ) }) it("shouldn't call getData on mount if 'immediate' option is set to false", async () => { - getVisitorData.mockImplementation(() => testData) + mockGet.mockImplementation(() => mockGetResult) const wrapper = createWrapper() - const { rerender } = renderHook(() => useVisitorData({}, { immediate: false }), { wrapper }) + const { rerender } = renderHook(() => useVisitorData({ immediate: false }), { wrapper }) - expect(getVisitorData).not.toHaveBeenCalled() + expect(mockGet).not.toHaveBeenCalled() - await rerender() + rerender() - expect(getVisitorData).not.toHaveBeenCalled() + expect(mockGet).not.toHaveBeenCalled() }) it('should support immediate fetch with cache disabled', async () => { const wrapper = createWrapper() - renderHook(() => useVisitorData({ ignoreCache: true }, { immediate: true }), { wrapper }) + renderHook(() => useVisitorData({ immediate: true }), { wrapper }) await actWait(500) - expect(getVisitorData).toHaveBeenCalledTimes(1) - expect(getVisitorData).toHaveBeenCalledWith({}, true) + expect(mockGet).toHaveBeenCalledTimes(1) + expect(mockGet).toHaveBeenCalledWith({}) }) it('should support overwriting default cache option in getData call', async () => { const wrapper = createWrapper() - const hook = renderHook(() => useVisitorData({ ignoreCache: true }, { immediate: false }), { wrapper }) + const hook = renderHook(() => useVisitorData({ immediate: false }), { + wrapper, + }) await act(async () => { - await hook.result.current.getData({ - ignoreCache: false, - }) + await hook.result.current.getData() }) - expect(getVisitorData).toHaveBeenCalledTimes(1) - expect(getVisitorData).toHaveBeenCalledWith({}, false) + expect(mockGet).toHaveBeenCalledTimes(1) + expect(mockGet).toHaveBeenCalledWith({}) }) it('should re-fetch data when options change if "immediate" is set to true', async () => { const Component = () => { - const [extended, setExtended] = useState(false) - const { data } = useVisitorData({ extendedResult: extended }, { immediate: true }) + const [tag, setTag] = useState(1) + const { data } = useVisitorData({ immediate: true, tag }) return ( <> - +
{JSON.stringify(data)}
) @@ -132,21 +138,19 @@ describe('useVisitorData', () => { await actWait(1000) - expect(getVisitorData).toHaveBeenCalledTimes(2) - expect(getVisitorData).toHaveBeenNthCalledWith(1, { extendedResult: false }, undefined) - expect(getVisitorData).toHaveBeenNthCalledWith(2, { extendedResult: true }, undefined) + expect(mockGet).toHaveBeenCalledTimes(2) + expect(mockGet).toHaveBeenNthCalledWith(1, { tag: 1 }) + expect(mockGet).toHaveBeenNthCalledWith(2, { tag: 2 }) }) it('should correctly pass errors from SPA library', async () => { - getVisitorData.mockRejectedValue(new Error(FingerprintJSPro.ERROR_CLIENT_TIMEOUT)) + mockGet.mockRejectedValue(new Error(FingerprintJSPro.ERROR_CLIENT_TIMEOUT)) const wrapper = createWrapper() - const hook = renderHook(() => useVisitorData({ ignoreCache: true }, { immediate: false }), { wrapper }) + const hook = renderHook(() => useVisitorData({ immediate: false }), { wrapper }) await act(async () => { - const promise = hook.result.current.getData({ - ignoreCache: false, - }) + const promise = hook.result.current.getData() await expect(promise).rejects.toThrow(FingerprintJSPro.ERROR_CLIENT_TIMEOUT) }) @@ -159,24 +163,19 @@ describe('useVisitorData', () => { const wrapper = createWrapper() const hook = renderHook( () => - useVisitorData( - { - linkedId: useVisitorDataId, - tag: { tagA: useVisitorDataId }, - }, - { immediate: false } - ), + useVisitorData({ + linkedId: useVisitorDataId, + tag: { tagA: useVisitorDataId }, + immediate: false, + }), { wrapper } ) await act(async () => { await hook.result.current.getData() }) - expect(getVisitorData).toHaveBeenCalledTimes(1) - expect(getVisitorData).toHaveBeenCalledWith( - { linkedId: useVisitorDataId, tag: { tagA: useVisitorDataId } }, - undefined - ) + expect(mockGet).toHaveBeenCalledTimes(1) + expect(mockGet).toHaveBeenCalledWith({ linkedId: useVisitorDataId, tag: { tagA: useVisitorDataId } }) }) it('`getData` `getOptions` should be more important than `getVisitorData` `getOptions`', async () => { @@ -185,13 +184,11 @@ describe('useVisitorData', () => { const wrapper = createWrapper() const hook = renderHook( () => - useVisitorData( - { - linkedId: useVisitorDataId, - tag: { tagA: useVisitorDataId }, - }, - { immediate: false } - ), + useVisitorData({ + linkedId: useVisitorDataId, + tag: { tagA: useVisitorDataId }, + immediate: false, + }), { wrapper } ) @@ -201,8 +198,8 @@ describe('useVisitorData', () => { tag: { tagA: getDataId }, }) }) - expect(getVisitorData).toHaveBeenCalledTimes(1) - expect(getVisitorData).toHaveBeenCalledWith({ linkedId: getDataId, tag: { tagA: getDataId } }, undefined) + expect(mockGet).toHaveBeenCalledTimes(1) + expect(mockGet).toHaveBeenCalledWith({ linkedId: getDataId, tag: { tagA: getDataId } }) }) it('`getData` `getOptions` should extend `getVisitorData` `getOptions`', async () => { @@ -211,13 +208,11 @@ describe('useVisitorData', () => { const wrapper = createWrapper() const hook = renderHook( () => - useVisitorData( - { - linkedId: useVisitorDataId, - tag: { tagA: useVisitorDataId }, - }, - { immediate: false } - ), + useVisitorData({ + linkedId: useVisitorDataId, + tag: { tagA: useVisitorDataId }, + immediate: false, + }), { wrapper } ) @@ -226,8 +221,8 @@ describe('useVisitorData', () => { linkedId: getDataId, }) }) - expect(getVisitorData).toHaveBeenCalledTimes(1) - expect(getVisitorData).toHaveBeenCalledWith({ linkedId: getDataId, tag: { tagA: useVisitorDataId } }, undefined) + expect(mockGet).toHaveBeenCalledTimes(1) + expect(mockGet).toHaveBeenCalledWith({ linkedId: getDataId, tag: { tagA: useVisitorDataId } }) }) it('getData should only change if the getOptions semantically changes', async () => { @@ -242,11 +237,13 @@ describe('useVisitorData', () => { // More information about this pattern can be found at: // https://react.dev/reference/react/useState#storing-information-from-previous-renders - const getDataValues: VisitorQueryContext['getData'][] = [] + const getDataValues: UseVisitorDataReturn['getData'][] = [] let effectCount = 0 const Component = () => { const [count, setCount] = useState(0) - const { data, getData } = useVisitorData(count <= 1 ? { timeout: 1000 } : { timeout: 2000 }, { immediate: false }) + const { data, getData } = useVisitorData( + count <= 1 ? { timeout: 1000, immediate: false } : { timeout: 2000, immediate: false } + ) useEffect(() => { effectCount++ diff --git a/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx b/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx index d9ba36e1..eac5950c 100644 --- a/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx +++ b/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx @@ -1,17 +1,11 @@ -import { FpjsProvider } from '@fingerprintjs/fingerprintjs-pro-react' -import { useState } from 'react' +import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' import { Outlet } from 'react-router-dom' import { FPJS_API_KEY } from '../shared/utils/env' import { Nav } from '../shared/components/Nav' -import { CacheLocation, FingerprintJSPro } from '@fingerprintjs/fingerprintjs-pro-spa' function InMemoryCache() { - const [loadOptions] = useState({ - apiKey: FPJS_API_KEY, - }) - return ( - +

Solution with an in-memory cache

@@ -22,7 +16,7 @@ function InMemoryCache() {
-
+ ) } diff --git a/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx b/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx index 9e625d61..7bf4aa92 100644 --- a/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx +++ b/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx @@ -1,21 +1,17 @@ -import { useState } from 'react' import { Outlet } from 'react-router-dom' import { Nav } from '../shared/components/Nav' import { FPJS_API_KEY } from '../shared/utils/env' -import { FpjsProvider } from '@fingerprintjs/fingerprintjs-pro-react' -import { CacheLocation, FingerprintJSPro } from '@fingerprintjs/fingerprintjs-pro-spa' +import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' function LocalStorageCache() { - const [loadOptions] = useState({ - apiKey: FPJS_API_KEY, - }) - return ( -
@@ -25,7 +21,7 @@ function LocalStorageCache() {
-
+ ) } diff --git a/examples/create-react-app/src/no_cache/WithoutCache.tsx b/examples/create-react-app/src/no_cache/WithoutCache.tsx index eeee4260..bb92012c 100644 --- a/examples/create-react-app/src/no_cache/WithoutCache.tsx +++ b/examples/create-react-app/src/no_cache/WithoutCache.tsx @@ -1,17 +1,11 @@ -import { FpjsProvider } from '@fingerprintjs/fingerprintjs-pro-react' -import { useState } from 'react' +import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' import { Outlet } from 'react-router-dom' import { Nav } from '../shared/components/Nav' import { FPJS_API_KEY } from '../shared/utils/env' -import { CacheLocation, FingerprintJSPro } from '@fingerprintjs/fingerprintjs-pro-spa' function WithoutCache() { - const [loadOptions] = useState({ - apiKey: FPJS_API_KEY, - }) - return ( - +

Solution without cache

@@ -20,7 +14,7 @@ function WithoutCache() {
-
+ ) } diff --git a/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx b/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx index 4d66dc2b..6911835b 100644 --- a/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx +++ b/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx @@ -1,17 +1,11 @@ -import { FpjsProvider } from '@fingerprintjs/fingerprintjs-pro-react' -import { useState } from 'react' +import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' import { Outlet } from 'react-router-dom' import { Nav } from '../shared/components/Nav' import { FPJS_API_KEY } from '../shared/utils/env' -import { CacheLocation, FingerprintJSPro } from '@fingerprintjs/fingerprintjs-pro-spa' function SessionStorageCache() { - const [loadOptions] = useState({ - apiKey: FPJS_API_KEY, - }) - return ( - +

Solution with a custom implementation of a session storage cache

@@ -20,7 +14,7 @@ function SessionStorageCache() {
-
+ ) } diff --git a/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx b/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx index ae4ff695..04d11d18 100644 --- a/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx +++ b/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx @@ -1,6 +1,6 @@ -import { VisitorData } from '@fingerprintjs/fingerprintjs-pro-spa' +import { GetResult } from '@fingerprintjs/fingerprintjs-pro-react' -function VisitorDataPresenter({ data, isLoading, error }: { data?: VisitorData; isLoading?: boolean; error?: Error }) { +function VisitorDataPresenter({ data, isLoading, error }: { data?: GetResult; isLoading?: boolean; error?: Error }) { if (error) { return

An error occurred: {error.message}

} @@ -8,7 +8,7 @@ function VisitorDataPresenter({ data, isLoading, error }: { data?: VisitorData; return (

- Visitor ID: {isLoading ? 'Loading...' : data ? data.visitorId : 'not established yet'} + Visitor ID: {isLoading ? 'Loading...' : data ? data.visitor_id : 'not established yet'}

{data && ( <> diff --git a/examples/create-react-app/src/shared/pages/HomePage.tsx b/examples/create-react-app/src/shared/pages/HomePage.tsx index 9fdaad48..f32657c4 100644 --- a/examples/create-react-app/src/shared/pages/HomePage.tsx +++ b/examples/create-react-app/src/shared/pages/HomePage.tsx @@ -1,10 +1,13 @@ import Toggler from '../components/Toggler' import VisitorDataPresenter from '../components/VisitorDataPresenter' -import { useContext } from 'react' -import { FpjsContext, useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' +import { useCallback } from 'react' +import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' function HomePage() { - const { clearCache } = useContext(FpjsContext) + const clearCache = useCallback(() => { + localStorage.clear() + sessionStorage.clear() + }, []) return (
@@ -24,7 +27,7 @@ function HomePage() { } function VisitorDataComponent() { - const { data, isLoading, error } = useVisitorData({ extendedResult: true }) + const { data, isLoading, error } = useVisitorData() return } diff --git a/examples/create-react-app/src/shared/pages/SignInPage.tsx b/examples/create-react-app/src/shared/pages/SignInPage.tsx index d706e253..3b35e758 100644 --- a/examples/create-react-app/src/shared/pages/SignInPage.tsx +++ b/examples/create-react-app/src/shared/pages/SignInPage.tsx @@ -7,13 +7,7 @@ function SignInPage() { const [password, setPassword] = useState('') const [tag, setTag] = useState('') - const [ignoreCache, setIgnoreCache] = useState(false) - const [extendedResult, setExtendedResult] = useState(false) - - const { getData, data, isLoading, error } = useVisitorData( - { extendedResult, tag, linkedId: login }, - { immediate: false } - ) + const { getData, data, isLoading, error } = useVisitorData({ tag, linkedId: login, immediate: false }) return (
@@ -27,34 +21,11 @@ function SignInPage() {

Try submitting the form with any values and notice that a fingerprint will be calculated.

-
- -
-
- - will be used as extended_result param for the request -
{ e.preventDefault() - getData({ ignoreCache }).then((data) => { + getData().then((data) => { if (data) { // do something with the visitor data // for example, append visitor data to the form data to send to your server diff --git a/package.json b/package.json index 9102a1a4..db57f7b0 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ }, "devDependencies": { "@commitlint/cli": "^19.2.0", + "@fingerprint/agent": "4.0.0-beta.0", "@fingerprintjs/commit-lint-dx-team": "^0.0.2", "@fingerprintjs/conventional-changelog-dx-team": "^0.1.0", "@fingerprintjs/eslint-config-dx-team": "^0.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b172cc54..56deed2f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,9 @@ importers: '@commitlint/cli': specifier: ^19.2.0 version: 19.2.0(@types/node@20.11.28)(typescript@5.4.2) + '@fingerprint/agent': + specifier: 4.0.0-beta.0 + version: 4.0.0-beta.0 '@fingerprintjs/commit-lint-dx-team': specifier: ^0.0.2 version: 0.0.2 @@ -1257,6 +1260,9 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fingerprint/agent@4.0.0-beta.0': + resolution: {integrity: sha512-fzsJczCatkDJm5JaB2pt5RldO3HyENdM5AexpyFHD4FEpZBoyp5rmNIOvyFZCtKQAmy4S0YEKAwJnZ4tiN4/Pg==} + '@fingerprintjs/commit-lint-dx-team@0.0.2': resolution: {integrity: sha512-8FDlPI+KhnWsfbf4Lo/TERdiHl9daMhnZb4MsV5nhrta13XXGRSxOvLPUnFmZA0FsxR4HHzpszlr7ZSoPVaLSg==} @@ -3818,6 +3824,7 @@ packages: deepcopy@1.0.0: resolution: {integrity: sha512-WJrecobaoqqgQHtvRI2/VCzWoWXPAnFYyAkF/spmL46lZMnd0gW0gLGuyeFVSrqt2B3s0oEEj6i+j2L/2QiS4g==} + deprecated: No longer maintained. Use structuredClone instead. deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} @@ -10740,6 +10747,8 @@ snapshots: '@eslint/js@8.57.0': {} + '@fingerprint/agent@4.0.0-beta.0': {} + '@fingerprintjs/commit-lint-dx-team@0.0.2': dependencies: '@commitlint/config-conventional': 17.8.1 @@ -10750,7 +10759,7 @@ snapshots: '@fingerprintjs/eslint-config-dx-team@0.1.0(@types/eslint@9.6.1)(prettier@3.2.5)(typescript@5.4.2)': dependencies: - '@typescript-eslint/eslint-plugin': 6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.56.0)(typescript@5.4.2) + '@typescript-eslint/eslint-plugin': 6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.4.2))(eslint@8.56.0)(typescript@5.4.2) '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.4.2) eslint: 8.56.0 eslint-config-prettier: 9.1.0(eslint@8.56.0) @@ -11727,7 +11736,7 @@ snapshots: - supports-color optional: true - '@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.56.0)(typescript@5.4.2)': + '@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.4.2))(eslint@8.56.0)(typescript@5.4.2)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.4.2) @@ -14388,7 +14397,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -14479,7 +14488,7 @@ snapshots: enhanced-resolve: 5.18.3 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -14557,7 +14566,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.4 @@ -15044,17 +15053,17 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@4.47.0): + file-loader@6.2.0(webpack@5.90.3): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 4.47.0 + webpack: 5.90.3 - file-loader@6.2.0(webpack@5.90.3): + file-loader@6.2.0(webpack@5.97.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.90.3 + webpack: 5.97.0(webpack-cli@5.1.4) file-uri-to-path@1.0.0: optional: true @@ -18392,7 +18401,7 @@ snapshots: ejs-loader: 0.5.0 envinfo: 7.11.1 esm: 3.2.25 - file-loader: 6.2.0(webpack@4.47.0) + file-loader: 6.2.0(webpack@5.97.0) fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.4.2)(webpack@4.47.0) get-port: 5.1.1 gittar: 0.1.1 @@ -20364,7 +20373,7 @@ snapshots: schema-utils: 3.3.0 webpack: 4.47.0 optionalDependencies: - file-loader: 6.2.0(webpack@4.47.0) + file-loader: 6.2.0(webpack@5.97.0) url-parse-lax@3.0.0: dependencies: diff --git a/src/components/fp-provider.tsx b/src/components/fp-provider.tsx new file mode 100644 index 00000000..0f735129 --- /dev/null +++ b/src/components/fp-provider.tsx @@ -0,0 +1,112 @@ +import { PropsWithChildren, useCallback, useEffect, useMemo, useRef } from 'react' +import { FpContext } from '../fp-context' +import { Agent, GetOptions, StartOptions, start } from '@fingerprint/agent' +import * as packageInfo from '../../package.json' +import { isSSR } from '../ssr' +import { WithEnvironment } from './with-environment' +import type { EnvDetails } from '../env.types' + +export interface FpProviderOptions extends StartOptions { + /** + * If set to `true`, will force FpjsClient to be rebuilt with the new options. Should be used with caution + * since it can be triggered too often (e.g. on every render) and negatively affect performance of the JS agent. + */ + forceRebuild?: boolean +} + +/** + * @example + * ```jsx + * + * + * + * ``` + * + * Provides the FpContext to its child components. + * + * @privateRemarks + * This is just a wrapper around the actual provider. + * For the implementation, see `ProviderWithEnv` component. + */ +export function FpProvider(props: PropsWithChildren) { + const propsWithEnv = props as PropsWithChildren + + return ( + + + + ) +} + +interface ProviderWithEnvProps extends FpProviderOptions { + /** + * Contains details about the env we're currently running in (e.g. framework, version) + */ + env: EnvDetails + getOptions?: GetOptions +} + +function ProviderWithEnv({ + children, + forceRebuild, + env, + getOptions, + ...agentOptions +}: PropsWithChildren) { + const createClient = useCallback(() => { + let integrationInfo = `react-sdk/${packageInfo.version}` + + if (env) { + const envInfo = env.version ? `${env.name}/${env.version}` : env.name + + integrationInfo += `/${envInfo}` + } + + const mergedIntegrationInfo = [...(agentOptions.integrationInfo || []), integrationInfo] + + return start({ + ...agentOptions, + integrationInfo: mergedIntegrationInfo, + }) + }, [agentOptions, env]) + + const clientRef = useRef(createClient()) + + const getClient = useCallback(() => { + if (isSSR()) { + throw new Error('FpjsProvider client cannot be used in SSR') + } + + return clientRef.current + }, []) + + const getVisitorData = useCallback( + (options?: GetOptions) => { + const client = getClient() + + return client.get({ + ...getOptions, + ...options, + }) + }, + [getClient, getOptions] + ) + + const contextValue = useMemo(() => { + return { + getVisitorData, + } + }, [getVisitorData]) + + useEffect(() => { + // By default, the client is always initialized once during the first render and won't be updated + // if the configuration changes. Use `forceRebuilt` flag to disable this behaviour. + if (!clientRef.current || forceRebuild) { + clientRef.current = createClient() + } + }, [forceRebuild, agentOptions, getOptions, createClient]) + + return {children} +} diff --git a/src/components/fpjs-provider.tsx b/src/components/fpjs-provider.tsx deleted file mode 100644 index f13b8b72..00000000 --- a/src/components/fpjs-provider.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { PropsWithChildren, useCallback, useEffect, useMemo, useRef } from 'react' -import { FpjsContext } from '../fpjs-context' -import { FpjsClient, FpjsClientOptions, FingerprintJSPro } from '@fingerprintjs/fingerprintjs-pro-spa' -import * as packageInfo from '../../package.json' -import { isSSR } from '../ssr' -import { waitUntil } from '../utils/wait-until' -import { WithEnvironment } from './with-environment' -import type { EnvDetails } from '../env.types' - -export interface CustomAgent { - load: (options: FingerprintJSPro.LoadOptions) => Promise -} -export interface FpjsProviderOptions extends FpjsClientOptions { - /** - * If set to `true`, will force FpjsClient to be rebuilt with the new options. Should be used with caution - * since it can be triggered too often (e.g. on every render) and negatively affect performance of the JS agent. - */ - forceRebuild?: boolean - customAgent?: CustomAgent -} - -/** - * @example - * ```jsx - * " - * }} - * cacheTime={60 * 10} - * cacheLocation={CacheLocation.LocalStorage} - * > - * - * - * ``` - * - * Provides the FpjsContext to its child components. - * - * @privateRemarks - * This is just a wrapper around the actual provider. - * For the implementation, see `ProviderWithEnv` component. - */ -export function FpjsProvider(props: PropsWithChildren) { - const propsWithEnv = props as PropsWithChildren - - return ( - - {...propsWithEnv} /> - - ) -} - -interface ProviderWithEnvProps extends FpjsProviderOptions { - /** - * Contains details about the env we're currently running in (e.g. framework, version) - */ - env: EnvDetails -} - -function ProviderWithEnv({ - children, - forceRebuild, - cache, - cacheTimeInSeconds, - cachePrefix, - cacheLocation, - customAgent, - loadOptions, - env, -}: PropsWithChildren) { - const clientRef = useRef() - const clientInitPromiseRef = useRef>() - - const clientOptions = useMemo(() => { - return { - cache, - cacheTimeInSeconds, - cachePrefix, - cacheLocation, - customAgent, - loadOptions, - } - }, [loadOptions, cache, cacheTimeInSeconds, cachePrefix, cacheLocation, customAgent]) - - const createClient = useCallback(() => { - let integrationInfo = `react-sdk/${packageInfo.version}` - - if (env) { - const envInfo = env.version ? `${env.name}/${env.version}` : env.name - - integrationInfo += `/${envInfo}` - } - - const parsedClientOptions = { - ...clientOptions, - loadOptions: { - ...loadOptions, - integrationInfo: [...(loadOptions.integrationInfo || []), integrationInfo], - }, - } - - const createdClient = new FpjsClient(parsedClientOptions) - - clientInitPromiseRef.current = createdClient.init() - - return createdClient - }, [clientOptions, env, loadOptions]) - - const getClient = useCallback(async () => { - if (isSSR()) { - throw new Error('FpjsProvider client cannot be used in SSR') - } - - if (!clientRef.current) { - await waitUntil({ - checkCondition: () => Boolean(clientRef.current), - }).catch(async () => { - /** - * We did timeout waiting for ideal condition to create client (eg: env detection) - * Attempt to create client now, potentially without some additional information that might be useful but are not required. - * */ - createClient() - }) - } - - return clientRef.current! - }, [createClient]) - - const getVisitorData = useCallback( - async (options?: FingerprintJSPro.GetOptions, ignoreCache?: boolean) => { - const client = await getClient() - - await clientInitPromiseRef.current - - return client.getVisitorData(options, ignoreCache) - }, - [getClient] - ) - - const clearCache = useCallback(async () => { - const client = await getClient() - - await client.clearCache() - }, [getClient]) - - const contextValue = useMemo(() => { - return { - clearCache, - getVisitorData, - } - }, [clearCache, getVisitorData]) - - useEffect(() => { - // By default, the client is always initialized once during the first render and won't be updated - // if the configuration changes. Use `forceRebuilt` flag to disable this behaviour. - if (!clientRef.current || forceRebuild) { - clientRef.current = createClient() - } - }, [forceRebuild, clientOptions, createClient]) - - return {children} -} diff --git a/src/fp-context.ts b/src/fp-context.ts new file mode 100644 index 00000000..2e69dce5 --- /dev/null +++ b/src/fp-context.ts @@ -0,0 +1,22 @@ +import { createContext } from 'react' +import { GetOptions, GetResult } from '@fingerprint/agent' +import { QueryResult } from './query' + +export type VisitorQueryResult = QueryResult + +const stub = (): never => { + throw new Error('You forgot to wrap your component in .') +} + +const initialContext = { + getVisitorData: stub, +} + +/** + * The Fingerprint Context + */ +export interface FpContextInterface { + getVisitorData: (config?: GetOptions) => Promise +} + +export const FpContext = createContext(initialContext) diff --git a/src/fpjs-context.ts b/src/fpjs-context.ts deleted file mode 100644 index 6f83c008..00000000 --- a/src/fpjs-context.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { createContext } from 'react' -import { VisitorData, GetOptions, FingerprintJSPro } from '@fingerprintjs/fingerprintjs-pro-spa' - -export interface QueryResult { - /** - * Stores current query data - * */ - data?: TData - /** - * Is true while query is loading - * */ - isLoading?: boolean - /** - * Stores current query error - * */ - error?: TError -} - -export interface VisitorQueryResult extends QueryResult> { - data?: VisitorData -} - -export interface GetDataOptions extends FingerprintJSPro.GetOptions { - /** - * When set to true, the visitor data will always be fetched from our API. - * */ - ignoreCache?: boolean -} - -export interface VisitorQueryContext extends VisitorQueryResult { - /** - * Performs identification request to server and returns visitors data. - * */ - getData: (getDataOptions?: GetDataOptions) => Promise> -} - -const stub = (): never => { - throw new Error('You forgot to wrap your component in .') -} - -const initialContext = { - getVisitorData: stub, - clearCache: stub, -} - -/** - * The FingerprintJS Context - */ -export interface FpjsContextInterface { - getVisitorData: (config?: GetOptions, ignoreCache?: boolean) => Promise> - clearCache: () => void -} - -export const FpjsContext = createContext>(initialContext) diff --git a/src/index.ts b/src/index.ts index d241df21..f24f92aa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,32 +1,8 @@ -export * from './fpjs-context' -export * from './components/fpjs-provider' +export * from './fp-context' +export * from './components/fp-provider' export * from './use-visitor-data' -export type { - FpjsContextInterface, - QueryResult, - VisitorQueryResult, - VisitorQueryContext, - GetDataOptions, -} from './fpjs-context' -export { - CacheLocation, - CacheStub, - FpjsClient, - InMemoryCache, - LocalStorageCache, - SessionStorageCache, - defaultEndpoint, - defaultScriptUrlPattern, - defaultTlsEndpoint, - FingerprintJSPro, -} from '@fingerprintjs/fingerprintjs-pro-spa' -export type { - Agent, - Cacheable, - FpjsClientOptions, - GetOptions, - ICache, - LoadOptions, - VisitorData, -} from '@fingerprintjs/fingerprintjs-pro-spa' +export * from './fp-context' +export * from './query' + +export * from '@fingerprint/agent' diff --git a/src/query.ts b/src/query.ts new file mode 100644 index 00000000..d1ae702a --- /dev/null +++ b/src/query.ts @@ -0,0 +1,29 @@ +export type QueryIdle = { + data: undefined + isLoading: false + isFetched: false + error: undefined +} + +export type QueryLoading = { + data: undefined + isLoading: true + isFetched: false + error: undefined +} + +export type QueryFetched = { + data: TData + isLoading: false + isFetched: true + error: undefined +} + +export type QueryError = { + data: undefined + isLoading: false + isFetched: false + error: TError +} + +export type QueryResult = QueryIdle | QueryLoading | QueryFetched | QueryError diff --git a/src/use-visitor-data.ts b/src/use-visitor-data.ts index 685d3249..471ebc5b 100644 --- a/src/use-visitor-data.ts +++ b/src/use-visitor-data.ts @@ -1,11 +1,25 @@ -import { FpjsContextInterface, FpjsContext, GetDataOptions, QueryResult, VisitorQueryContext } from './fpjs-context' -import { useCallback, useContext, useEffect, useState } from 'react' -import { VisitorData, FingerprintJSPro } from '@fingerprintjs/fingerprintjs-pro-spa' +import { FpContext, FpContextInterface, VisitorQueryResult } from './fp-context' +import { useCallback, useContext, useEffect, useMemo, useState } from 'react' import deepEquals from 'fast-deep-equal' import { toError } from './utils/to-error' import { assertIsTruthy } from './utils/assert-is-truthy' +import { GetOptions, GetResult } from '@fingerprint/agent' -export type UseVisitorDataOptions = GetDataOptions +export interface UseVisitorDataConfig { + /** + * Determines whether the `getData()` method will be called immediately after the hook mounts or not + */ + immediate: boolean +} + +export type UseVisitorDataOptions = GetOptions & UseVisitorDataConfig + +export type UseVisitorDataReturn = VisitorQueryResult & { + /** + * Performs identification request to server and returns visitors data. + * */ + getData: (getDataOptions?: GetOptions) => Promise +} /** * @example @@ -17,59 +31,66 @@ export type UseVisitorDataOptions = GetDataOptions( - getOptions: UseVisitorDataOptions = {}, - config: UseVisitorDataConfig = defaultUseVisitorDataConfig -): VisitorQueryContext { +export function useVisitorData( + { immediate, ...getOptions }: UseVisitorDataOptions = { immediate: true } +): UseVisitorDataReturn { assertIsTruthy(getOptions, 'getOptions') - const { immediate } = config - const { getVisitorData } = useContext>(FpjsContext) + const { getVisitorData } = useContext(FpContext) - const [currentGetOptions, setCurrentGetOptions] = useState>(getOptions) - const [queryState, setQueryState] = useState>>({ + const [currentGetOptions, setCurrentGetOptions] = useState(getOptions) + const [queryState, setQueryState] = useState({ isLoading: immediate, + data: undefined, + isFetched: false, + error: undefined, }) - const getData = useCallback['getData']>( + const getData = useCallback( async (params = {}) => { assertIsTruthy(params, 'getDataParams') - const { ignoreCache, ...getDataPassedOptions } = params - try { - setQueryState((state) => ({ ...state, isLoading: true })) - - const { ignoreCache: defaultIgnoreCache, ...getVisitorDataOptions } = currentGetOptions - - const getDataOptions: FingerprintJSPro.GetOptions = { - ...getVisitorDataOptions, - ...getDataPassedOptions, + setQueryState({ + isLoading: true, + isFetched: false, + data: undefined, + error: undefined, + }) + + const getDataOptions: GetOptions = { + ...currentGetOptions, + ...params, } - const result = await getVisitorData( - getDataOptions, - typeof ignoreCache === 'boolean' ? ignoreCache : defaultIgnoreCache - ) - setQueryState((state) => ({ ...state, data: result, isLoading: false, error: undefined })) + const result = await getVisitorData(getDataOptions) + setQueryState({ + isLoading: false, + isFetched: true, + data: result, + error: undefined, + }) + return result } catch (unknownError) { const error = toError(unknownError) - error.name = 'FPJSAgentError' + error.name = 'FPAgentError' - setQueryState((state) => ({ ...state, data: undefined, error })) + setQueryState({ + isLoading: false, + isFetched: false, + data: undefined, + error: error, + }) throw error - } finally { - setQueryState((state) => (state.isLoading ? { ...state, isLoading: false } : state)) } }, [currentGetOptions, getVisitorData] @@ -87,21 +108,11 @@ export function useVisitorData( setCurrentGetOptions(getOptions) } - const { isLoading, data, error } = queryState - - return { - getData, - isLoading, - data, - error, - } -} - -export interface UseVisitorDataConfig { - /** - * Determines whether the `getData()` method will be called immediately after the hook mounts or not - */ - immediate: boolean + return useMemo( + () => ({ + ...queryState, + getData, + }), + [queryState, getData] + ) } - -const defaultUseVisitorDataConfig = { immediate: true } From 883a44c00f469c07da31795841338cdad1a9e75f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Thu, 18 Dec 2025 12:28:31 +0100 Subject: [PATCH 02/49] chore: use FpProvider in error message for ssr --- src/components/fp-provider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/fp-provider.tsx b/src/components/fp-provider.tsx index 0f735129..ab333462 100644 --- a/src/components/fp-provider.tsx +++ b/src/components/fp-provider.tsx @@ -76,7 +76,7 @@ function ProviderWithEnv({ const getClient = useCallback(() => { if (isSSR()) { - throw new Error('FpjsProvider client cannot be used in SSR') + throw new Error('FpProvider client cannot be used in SSR') } return clientRef.current From c46b0eb328204664313be071fab974091df45779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Thu, 18 Dec 2025 15:39:23 +0100 Subject: [PATCH 03/49] chore: move agent to dependencies --- package.json | 3 +-- pnpm-lock.yaml | 42 +++++++++++++----------------------------- 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index db57f7b0..99bfe188 100644 --- a/package.json +++ b/package.json @@ -53,12 +53,11 @@ }, "homepage": "https://github.com/fingerprintjs/fingerprintjs-pro-react#readme", "dependencies": { - "@fingerprintjs/fingerprintjs-pro-spa": "^1.3.3", + "@fingerprint/agent": "4.0.0-beta.3", "fast-deep-equal": "3.1.3" }, "devDependencies": { "@commitlint/cli": "^19.2.0", - "@fingerprint/agent": "4.0.0-beta.0", "@fingerprintjs/commit-lint-dx-team": "^0.0.2", "@fingerprintjs/conventional-changelog-dx-team": "^0.1.0", "@fingerprintjs/eslint-config-dx-team": "^0.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 56deed2f..c49cf6f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,9 @@ importers: .: dependencies: - '@fingerprintjs/fingerprintjs-pro-spa': - specifier: ^1.3.3 - version: 1.3.3 + '@fingerprint/agent': + specifier: 4.0.0-beta.3 + version: 4.0.0-beta.3 fast-deep-equal: specifier: 3.1.3 version: 3.1.3 @@ -18,9 +18,6 @@ importers: '@commitlint/cli': specifier: ^19.2.0 version: 19.2.0(@types/node@20.11.28)(typescript@5.4.2) - '@fingerprint/agent': - specifier: 4.0.0-beta.0 - version: 4.0.0-beta.0 '@fingerprintjs/commit-lint-dx-team': specifier: ^0.0.2 version: 0.0.2 @@ -1260,8 +1257,8 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@fingerprint/agent@4.0.0-beta.0': - resolution: {integrity: sha512-fzsJczCatkDJm5JaB2pt5RldO3HyENdM5AexpyFHD4FEpZBoyp5rmNIOvyFZCtKQAmy4S0YEKAwJnZ4tiN4/Pg==} + '@fingerprint/agent@4.0.0-beta.3': + resolution: {integrity: sha512-VXWSDfcWXGm3AJ6BDwBS9aB4I+EKPkCVwnBWj9G/9P159VBIgUadjoaPhPKkUrGMNEwevOHKXHk4nOWQ2laC8g==} '@fingerprintjs/commit-lint-dx-team@0.0.2': resolution: {integrity: sha512-8FDlPI+KhnWsfbf4Lo/TERdiHl9daMhnZb4MsV5nhrta13XXGRSxOvLPUnFmZA0FsxR4HHzpszlr7ZSoPVaLSg==} @@ -1274,12 +1271,6 @@ packages: peerDependencies: prettier: '>=3' - '@fingerprintjs/fingerprintjs-pro-spa@1.3.3': - resolution: {integrity: sha512-jM5k30S9RT/WW6gnmNWACc7UHeK1md9NbZg8kUsdxvPtDeW8xKnA6tb58Rqfkg6kvqHTq5aHFzw9hgsTH3DbNQ==} - - '@fingerprintjs/fingerprintjs-pro@3.12.1': - resolution: {integrity: sha512-lJSfafyXn0dQeZeg1MjRkGWtw4dbyPcARw6hfce43tRBZvFSCpih+6DPD0OWIu22B4yZcaS/9ESk5e8mkhhk4w==} - '@fingerprintjs/prettier-config-dx-team@0.2.0': resolution: {integrity: sha512-fbtRuqF8YI4SKjvv9SQ2FoQxoTp4drKN15vXkhi2/SimC5ALpz7SFh1S0jbfmjM/rvDJ/z2x+sGFpp9ZsQZ6vg==} @@ -10747,7 +10738,7 @@ snapshots: '@eslint/js@8.57.0': {} - '@fingerprint/agent@4.0.0-beta.0': {} + '@fingerprint/agent@4.0.0-beta.3': {} '@fingerprintjs/commit-lint-dx-team@0.0.2': dependencies: @@ -10759,24 +10750,17 @@ snapshots: '@fingerprintjs/eslint-config-dx-team@0.1.0(@types/eslint@9.6.1)(prettier@3.2.5)(typescript@5.4.2)': dependencies: - '@typescript-eslint/eslint-plugin': 6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.4.2))(eslint@8.56.0)(typescript@5.4.2) + '@typescript-eslint/eslint-plugin': 6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.56.0)(typescript@5.4.2) '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.4.2) eslint: 8.56.0 eslint-config-prettier: 9.1.0(eslint@8.56.0) - eslint-plugin-prettier: 5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5) + eslint-plugin-prettier: 5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.56.0)(prettier@3.2.5) prettier: 3.2.5 transitivePeerDependencies: - '@types/eslint' - supports-color - typescript - '@fingerprintjs/fingerprintjs-pro-spa@1.3.3': - dependencies: - '@fingerprintjs/fingerprintjs-pro': 3.12.1 - tslib: 2.8.1 - - '@fingerprintjs/fingerprintjs-pro@3.12.1': {} - '@fingerprintjs/prettier-config-dx-team@0.2.0': dependencies: prettier: 3.2.4 @@ -11736,7 +11720,7 @@ snapshots: - supports-color optional: true - '@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.4.2))(eslint@8.56.0)(typescript@5.4.2)': + '@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.56.0)(typescript@5.4.2)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.4.2) @@ -14397,7 +14381,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -14488,7 +14472,7 @@ snapshots: enhanced-resolve: 5.18.3 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -14566,7 +14550,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.4 @@ -14646,7 +14630,7 @@ snapshots: object.entries: 1.1.7 object.fromentries: 2.0.7 - eslint-plugin-prettier@5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5): + eslint-plugin-prettier@5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.56.0)(prettier@3.2.5): dependencies: eslint: 8.56.0 prettier: 3.2.5 From ac3aa9781e2b54e84a7dfa9f8f50ea9464724d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Fri, 19 Dec 2025 10:10:52 +0100 Subject: [PATCH 04/49] chore: add vite app example --- .../src/no_cache/WithoutCache.tsx | 2 +- examples/preact/.env.example | 2 +- examples/preact/src/components/app.tsx | 6 +- examples/preact/src/index.tsx | 8 +- examples/vite/.env.example | 1 + examples/vite/.gitignore | 25 + examples/vite/README.md | 73 + examples/vite/eslint.config.js | 23 + examples/vite/index.html | 13 + examples/vite/package.json | 31 + examples/vite/public/vite.svg | 1 + examples/vite/src/App.tsx | 19 + examples/vite/src/index.css | 68 + examples/vite/src/main.tsx | 15 + examples/vite/tsconfig.app.json | 28 + examples/vite/tsconfig.json | 7 + examples/vite/tsconfig.node.json | 26 + examples/vite/vite.config.ts | 7 + examples/webpack-based/.env.example | 2 +- examples/webpack-based/src/App.js | 4 +- examples/webpack-based/src/index.js | 10 +- pnpm-lock.yaml | 1438 ++++++++++++++++- 22 files changed, 1701 insertions(+), 108 deletions(-) create mode 100644 examples/vite/.env.example create mode 100644 examples/vite/.gitignore create mode 100644 examples/vite/README.md create mode 100644 examples/vite/eslint.config.js create mode 100644 examples/vite/index.html create mode 100644 examples/vite/package.json create mode 100644 examples/vite/public/vite.svg create mode 100644 examples/vite/src/App.tsx create mode 100644 examples/vite/src/index.css create mode 100644 examples/vite/src/main.tsx create mode 100644 examples/vite/tsconfig.app.json create mode 100644 examples/vite/tsconfig.json create mode 100644 examples/vite/tsconfig.node.json create mode 100644 examples/vite/vite.config.ts diff --git a/examples/create-react-app/src/no_cache/WithoutCache.tsx b/examples/create-react-app/src/no_cache/WithoutCache.tsx index bb92012c..1aa0f23c 100644 --- a/examples/create-react-app/src/no_cache/WithoutCache.tsx +++ b/examples/create-react-app/src/no_cache/WithoutCache.tsx @@ -5,7 +5,7 @@ import { FPJS_API_KEY } from '../shared/utils/env' function WithoutCache() { return ( - +

Solution without cache

diff --git a/examples/preact/.env.example b/examples/preact/.env.example index fd184689..d85f6d9d 100644 --- a/examples/preact/.env.example +++ b/examples/preact/.env.example @@ -1 +1 @@ -PREACT_APP_FPJS_PUBLIC_API_KEY= \ No newline at end of file +PREACT_APP_FPJS_PUBLIC_API_KEY=uxA8kJe9InOmy1MQz12y \ No newline at end of file diff --git a/examples/preact/src/components/app.tsx b/examples/preact/src/components/app.tsx index a9c04474..0631af6e 100644 --- a/examples/preact/src/components/app.tsx +++ b/examples/preact/src/components/app.tsx @@ -5,10 +5,10 @@ import { JSX } from 'preact/compat' const App: FunctionalComponent = () => { const [extendedResult, updateExtendedResult] = useState(false) - const { isLoading, error, data, getData } = useVisitorData({ extendedResult }, { immediate: true }) + const { isLoading, error, data, getData } = useVisitorData({ immediate: true }) const reloadData = (): void => { - getData({ ignoreCache: true }) + getData() } const onChangeExtendedResult = (e: JSX.TargetedEvent): void => { @@ -38,7 +38,7 @@ const App: FunctionalComponent = () => {

- VisitorId: {isLoading ? 'Loading...' : data?.visitorId} + VisitorId: {isLoading ? 'Loading...' : data?.visitor_id}

Full visitor data:

{error ? error.message : JSON.stringify(data, null, 2)}
diff --git a/examples/preact/src/index.tsx b/examples/preact/src/index.tsx index a8289642..50a3a164 100644 --- a/examples/preact/src/index.tsx +++ b/examples/preact/src/index.tsx @@ -1,14 +1,14 @@ import { FunctionalComponent } from 'preact' import './style/index.css' import App from './components/app' -import { FpjsProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' const WrappedApp: FunctionalComponent = () => { - const apiKey = process.env.PREACT_APP_FPJS_PUBLIC_API_KEY as string + const apiKey = 'uxA8kJe9InOmy1MQz12y' return ( - + - +
) } diff --git a/examples/vite/.env.example b/examples/vite/.env.example new file mode 100644 index 00000000..acd0b4e5 --- /dev/null +++ b/examples/vite/.env.example @@ -0,0 +1 @@ +VITE_FPJS_PUBLIC_API_KEY= diff --git a/examples/vite/.gitignore b/examples/vite/.gitignore new file mode 100644 index 00000000..438657a9 --- /dev/null +++ b/examples/vite/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local +.env + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/vite/README.md b/examples/vite/README.md new file mode 100644 index 00000000..d2e77611 --- /dev/null +++ b/examples/vite/README.md @@ -0,0 +1,73 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/examples/vite/eslint.config.js b/examples/vite/eslint.config.js new file mode 100644 index 00000000..5e6b472f --- /dev/null +++ b/examples/vite/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/examples/vite/index.html b/examples/vite/index.html new file mode 100644 index 00000000..5ec37c5f --- /dev/null +++ b/examples/vite/index.html @@ -0,0 +1,13 @@ + + + + + + + vite + + +
+ + + diff --git a/examples/vite/package.json b/examples/vite/package.json new file mode 100644 index 00000000..5f032067 --- /dev/null +++ b/examples/vite/package.json @@ -0,0 +1,31 @@ +{ + "name": "vite", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@fingerprintjs/fingerprintjs-pro-react": "workspace:*", + "react": "^19.2.0", + "react-dom": "^19.2.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4" + } +} diff --git a/examples/vite/public/vite.svg b/examples/vite/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/examples/vite/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/vite/src/App.tsx b/examples/vite/src/App.tsx new file mode 100644 index 00000000..a04398c8 --- /dev/null +++ b/examples/vite/src/App.tsx @@ -0,0 +1,19 @@ +import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' + +function App() { + const { isLoading, error, isFetched, data } = useVisitorData() + + if (isLoading) { + return
Loading...
+ } + if (error) { + return
An error occurred: {error.message}
+ } + + if (isFetched) { + return
Welcome {data.visitor_id}!
+ } + return null +} + +export default App diff --git a/examples/vite/src/index.css b/examples/vite/src/index.css new file mode 100644 index 00000000..08a3ac9e --- /dev/null +++ b/examples/vite/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/examples/vite/src/main.tsx b/examples/vite/src/main.tsx new file mode 100644 index 00000000..f00ac65a --- /dev/null +++ b/examples/vite/src/main.tsx @@ -0,0 +1,15 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' +import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' + +const apiKey = import.meta.env.VITE_FPJS_PUBLIC_API_KEY + +createRoot(document.getElementById('root')!).render( + + + + + +) diff --git a/examples/vite/tsconfig.app.json b/examples/vite/tsconfig.app.json new file mode 100644 index 00000000..a9b5a59c --- /dev/null +++ b/examples/vite/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/examples/vite/tsconfig.json b/examples/vite/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/examples/vite/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/examples/vite/tsconfig.node.json b/examples/vite/tsconfig.node.json new file mode 100644 index 00000000..8a67f62f --- /dev/null +++ b/examples/vite/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/vite/vite.config.ts b/examples/vite/vite.config.ts new file mode 100644 index 00000000..8b0f57b9 --- /dev/null +++ b/examples/vite/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/examples/webpack-based/.env.example b/examples/webpack-based/.env.example index f14dc59e..d3c0e62c 100644 --- a/examples/webpack-based/.env.example +++ b/examples/webpack-based/.env.example @@ -1 +1 @@ -REACT_APP_FPJS_PUBLIC_API_KEY= +REACT_APP_FPJS_PUBLIC_API_KEY=uxA8kJe9InOmy1MQz12y diff --git a/examples/webpack-based/src/App.js b/examples/webpack-based/src/App.js index 3a40dbeb..02d375a7 100644 --- a/examples/webpack-based/src/App.js +++ b/examples/webpack-based/src/App.js @@ -1,4 +1,3 @@ -import React from 'react' import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' function App() { @@ -12,8 +11,7 @@ function App() { } if (data) { - // perform some logic based on the visitor data - return
Welcome {data.visitorFound ? `back ${data.visitorId}` : ''}!
+ return
Welcome {data.visitor_id}!
} return null } diff --git a/examples/webpack-based/src/index.js b/examples/webpack-based/src/index.js index a6810563..a9d4fe5d 100644 --- a/examples/webpack-based/src/index.js +++ b/examples/webpack-based/src/index.js @@ -1,6 +1,6 @@ import React from 'react' import { createRoot } from 'react-dom/client' -import { FpjsProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' import App from './App' const rootElement = document.getElementById('root') @@ -9,12 +9,8 @@ const apiKey = process.env.REACT_APP_FPJS_PUBLIC_API_KEY root.render( - + - +
) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c49cf6f0..0822920b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -119,7 +119,7 @@ importers: version: 6.2.1(rollup@4.43.0)(typescript@5.4.2) rollup-plugin-license: specifier: ^3.6.0 - version: 3.6.0(rollup@4.43.0) + version: 3.6.0(picomatch@4.0.3)(rollup@4.43.0) rollup-plugin-peer-deps-external: specifier: ^2.2.4 version: 2.2.4(rollup@4.43.0) @@ -152,7 +152,7 @@ importers: version: 6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(@types/babel__core@7.20.5)(@types/webpack@4.41.38)(eslint@8.57.0)(react@18.2.0)(type-fest@3.13.1)(typescript@5.4.2) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(@types/babel__core@7.20.5)(@types/webpack@4.41.38)(eslint@9.39.2(jiti@1.21.0))(react@18.2.0)(type-fest@3.13.1)(typescript@5.4.2) typescript: specifier: '*' version: 5.4.2 @@ -248,6 +248,55 @@ importers: specifier: ^2.0.2 version: 2.0.2 + examples/vite: + dependencies: + '@fingerprintjs/fingerprintjs-pro-react': + specifier: workspace:* + version: link:../.. + react: + specifier: ^19.2.0 + version: 19.2.3 + react-dom: + specifier: ^19.2.0 + version: 19.2.3(react@19.2.3) + devDependencies: + '@eslint/js': + specifier: ^9.39.1 + version: 9.39.2 + '@types/node': + specifier: ^24.10.1 + version: 24.10.4 + '@types/react': + specifier: ^19.2.5 + version: 19.2.7 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.7) + '@vitejs/plugin-react': + specifier: ^5.1.1 + version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@1.21.0)(terser@5.43.1)) + eslint: + specifier: ^9.39.1 + version: 9.39.2(jiti@1.21.0) + eslint-plugin-react-hooks: + specifier: ^7.0.1 + version: 7.0.1(eslint@9.39.2(jiti@1.21.0)) + eslint-plugin-react-refresh: + specifier: ^0.4.24 + version: 0.4.26(eslint@9.39.2(jiti@1.21.0)) + globals: + specifier: ^16.5.0 + version: 16.5.0 + typescript: + specifier: ~5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.46.4 + version: 8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + vite: + specifier: ^7.2.4 + version: 7.3.0(@types/node@24.10.4)(jiti@1.21.0)(terser@5.43.1) + examples/webpack-based: dependencies: '@fingerprintjs/fingerprintjs-pro-react': @@ -324,10 +373,18 @@ packages: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + '@babel/core@7.24.0': resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} engines: {node: '>=6.9.0'} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + '@babel/eslint-parser@7.23.10': resolution: {integrity: sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} @@ -339,6 +396,10 @@ packages: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.22.5': resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -351,6 +412,10 @@ packages: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.24.0': resolution: {integrity: sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==} engines: {node: '>=6.9.0'} @@ -381,6 +446,10 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.22.5': resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} @@ -393,12 +462,22 @@ packages: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.23.3': resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.22.5': resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} @@ -439,6 +518,10 @@ packages: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} @@ -447,10 +530,18 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.23.5': resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.22.20': resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} @@ -459,6 +550,10 @@ packages: resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.23.4': resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} @@ -472,6 +567,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3': resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} @@ -934,6 +1034,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.23.4': resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} @@ -1058,14 +1170,26 @@ packages: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.24.0': resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.24.0': resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1235,20 +1359,202 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.10.0': resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.56.0': resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1257,6 +1563,18 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@fingerprint/agent@4.0.0-beta.3': resolution: {integrity: sha512-VXWSDfcWXGm3AJ6BDwBS9aB4I+EKPkCVwnBWj9G/9P159VBIgUadjoaPhPKkUrGMNEwevOHKXHk4nOWQ2laC8g==} @@ -1280,6 +1598,14 @@ packages: '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -1293,6 +1619,10 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1394,6 +1724,9 @@ packages: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1595,6 +1928,9 @@ packages: resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} engines: {node: '>=14.0.0'} + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + '@rollup/plugin-babel@5.3.1': resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} @@ -1988,8 +2324,8 @@ packages: '@types/node@20.11.28': resolution: {integrity: sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==} - '@types/node@24.0.3': - resolution: {integrity: sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==} + '@types/node@24.10.4': + resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -2015,9 +2351,17 @@ packages: '@types/react-dom@18.2.22': resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + '@types/react@18.2.66': resolution: {integrity: sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==} + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -2120,6 +2464,14 @@ packages: typescript: optional: true + '@typescript-eslint/eslint-plugin@8.50.0': + resolution: {integrity: sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.50.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/experimental-utils@5.62.0': resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2166,6 +2518,19 @@ packages: typescript: optional: true + '@typescript-eslint/parser@8.50.0': + resolution: {integrity: sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.50.0': + resolution: {integrity: sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@5.62.0': resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2182,6 +2547,16 @@ packages: resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@8.50.0': + resolution: {integrity: sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.50.0': + resolution: {integrity: sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@5.62.0': resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2212,6 +2587,13 @@ packages: typescript: optional: true + '@typescript-eslint/type-utils@8.50.0': + resolution: {integrity: sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2228,6 +2610,10 @@ packages: resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/types@8.50.0': + resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2264,6 +2650,12 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@8.50.0': + resolution: {integrity: sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@5.62.0': resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2282,6 +2674,13 @@ packages: peerDependencies: eslint: ^8.56.0 + '@typescript-eslint/utils@8.50.0': + resolution: {integrity: sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2298,9 +2697,19 @@ packages: resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@8.50.0': + resolution: {integrity: sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@vitejs/plugin-react@5.1.2': + resolution: {integrity: sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -3550,6 +3959,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crypto-browserify@3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} @@ -3726,6 +4139,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + cyclist@1.0.2: resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} @@ -4171,6 +4587,11 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -4332,6 +4753,17 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-refresh@0.4.26: + resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==} + peerDependencies: + eslint: '>=8.40' + eslint-plugin-react@7.34.0: resolution: {integrity: sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==} engines: {node: '>=4'} @@ -4356,6 +4788,10 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -4364,6 +4800,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-webpack-plugin@3.2.0: resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} @@ -4383,10 +4823,24 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4544,6 +4998,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figgy-pudding@3.5.2: resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} deprecated: This module is no longer supported. @@ -4556,6 +5019,10 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + file-loader@6.2.0: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} @@ -4638,6 +5105,10 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true @@ -4904,6 +5375,14 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -5021,6 +5500,12 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hex-color-regex@1.1.0: resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} @@ -5195,6 +5680,10 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} @@ -5827,6 +6316,10 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} @@ -5852,6 +6345,11 @@ packages: engines: {node: '>=4'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.0: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} @@ -6310,6 +6808,10 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} @@ -6404,6 +6906,11 @@ packages: nan@2.19.0: resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -6820,6 +7327,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -7431,6 +7942,10 @@ packages: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + preact-cli@3.5.1: resolution: {integrity: sha512-6sRewJOtPAWkIVc+cycU4cjk9294stdh4hyw2ENpJ5N5lWJ8Y3r9r5Ly6Hmo5rzvcUq4cnlshMwTTwGq7ip/1w==} engines: {node: '>=12'} @@ -7673,6 +8188,11 @@ packages: peerDependencies: react: ^18.2.0 + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} + peerDependencies: + react: ^19.2.3 + react-error-overlay@6.0.11: resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} @@ -7693,6 +8213,10 @@ packages: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} engines: {node: '>=0.10.0'} + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + react-router-dom@6.22.3: resolution: {integrity: sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==} engines: {node: '>=14.0.0'} @@ -7722,6 +8246,10 @@ packages: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -8061,6 +8589,9 @@ packages: scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + schema-utils@1.0.0: resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} engines: {node: '>= 4'} @@ -8282,6 +8813,10 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-loader@1.1.3: resolution: {integrity: sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==} engines: {node: '>= 10.13.0'} @@ -8744,6 +9279,10 @@ packages: resolution: {integrity: sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==} engines: {node: '>=4'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -8822,6 +9361,12 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -8943,11 +9488,23 @@ packages: peerDependencies: typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x + typescript-eslint@8.50.0: + resolution: {integrity: sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@5.4.2: resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} hasBin: true + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + uglify-js@3.4.10: resolution: {integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==} engines: {node: '>=0.8.0'} @@ -8962,8 +9519,8 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} @@ -9134,6 +9691,46 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} + vite@7.3.0: + resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.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 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} @@ -9586,6 +10183,15 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.2.1: + resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} + snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} @@ -9597,9 +10203,9 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@apideck/better-ajv-errors@0.3.6(ajv@8.12.0)': + '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)': dependencies: - ajv: 8.12.0 + ajv: 8.17.1 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 @@ -9619,10 +10225,11 @@ snapshots: '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - optional: true '@babel/compat-data@7.23.5': {} + '@babel/compat-data@7.28.5': {} + '@babel/core@7.24.0': dependencies: '@ampproject/remapping': 2.3.0 @@ -9643,6 +10250,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/eslint-parser@7.23.10(@babel/core@7.24.0)(eslint@8.57.0)': dependencies: '@babel/core': 7.24.0 @@ -9651,6 +10278,14 @@ snapshots: eslint-visitor-keys: 2.1.0 semver: 6.3.1 + '@babel/eslint-parser@7.23.10(@babel/core@7.24.0)(eslint@9.39.2(jiti@1.21.0))': + dependencies: + '@babel/core': 7.24.0 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 9.39.2(jiti@1.21.0) + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + '@babel/generator@7.23.6': dependencies: '@babel/types': 7.24.0 @@ -9658,6 +10293,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.22.5': dependencies: '@babel/types': 7.24.0 @@ -9674,6 +10317,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.4 + lru-cache: 5.1.1 + semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.24.0(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 @@ -9723,6 +10374,8 @@ snapshots: '@babel/template': 7.24.0 '@babel/types': 7.24.0 + '@babel/helper-globals@7.28.0': {} + '@babel/helper-hoist-variables@7.22.5': dependencies: '@babel/types': 7.24.0 @@ -9735,6 +10388,13 @@ snapshots: dependencies: '@babel/types': 7.24.0 + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 @@ -9744,6 +10404,15 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.22.5': dependencies: '@babel/types': 7.24.0 @@ -9780,13 +10449,18 @@ snapshots: '@babel/helper-string-parser@7.23.4': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.22.20': {} - '@babel/helper-validator-identifier@7.27.1': - optional: true + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-wrap-function@7.22.20': dependencies: '@babel/helper-function-name': 7.23.0 @@ -9801,6 +10475,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + '@babel/highlight@7.23.4': dependencies: '@babel/helper-validator-identifier': 7.22.20 @@ -9818,6 +10497,10 @@ snapshots: dependencies: '@babel/types': 7.24.0 + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 @@ -9903,7 +10586,7 @@ snapshots: '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0)': dependencies: @@ -10274,6 +10957,16 @@ snapshots: '@babel/core': 7.24.0 '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 @@ -10493,6 +11186,12 @@ snapshots: '@babel/parser': 7.24.0 '@babel/types': 7.24.0 + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@babel/traverse@7.24.0': dependencies: '@babel/code-frame': 7.23.5 @@ -10508,12 +11207,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + '@babel/types@7.24.0': dependencies: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@bcoe/v8-coverage@0.2.3': {} '@commitlint/cli@19.2.0(@types/node@20.11.28)(typescript@5.4.2)': @@ -10708,6 +11424,84 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': dependencies: eslint: 8.56.0 @@ -10718,8 +11512,36 @@ snapshots: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.0(eslint@9.39.2(jiti@1.21.0))': + dependencies: + eslint: 9.39.2(jiti@1.21.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@1.21.0))': + dependencies: + eslint: 9.39.2(jiti@1.21.0) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -10734,10 +11556,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/js@8.56.0': {} '@eslint/js@8.57.0': {} + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + '@fingerprint/agent@4.0.0-beta.3': {} '@fingerprintjs/commit-lint-dx-team@0.0.2': @@ -10769,6 +11614,13 @@ snapshots: '@gar/promisify@1.1.3': {} + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.2 @@ -10781,6 +11633,8 @@ snapshots: '@humanwhocodes/object-schema@2.0.2': {} + '@humanwhocodes/retry@0.4.3': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -11005,6 +11859,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -11163,6 +12022,8 @@ snapshots: '@remix-run/router@1.15.3': {} + '@rolldown/pluginutils@1.0.0-beta.53': {} + '@rollup/plugin-babel@5.3.1(@babel/core@7.24.0)(@types/babel__core@7.20.5)(rollup@2.79.2)': dependencies: '@babel/core': 7.24.0 @@ -11448,25 +12309,25 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.6 - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/connect@3.4.38': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/conventional-commits-parser@5.0.0': dependencies: @@ -11495,7 +12356,7 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -11526,11 +12387,11 @@ snapshots: '@types/http-proxy@1.17.14': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/http-proxy@1.17.16': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/istanbul-lib-coverage@2.0.6': {} @@ -11553,7 +12414,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/mime@1.3.5': {} @@ -11561,15 +12422,15 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/node@20.11.28': dependencies: undici-types: 5.26.5 - '@types/node@24.0.3': + '@types/node@24.10.4': dependencies: - undici-types: 7.8.0 + undici-types: 7.16.0 '@types/parse-json@4.0.2': {} @@ -11589,19 +12450,27 @@ snapshots: dependencies: '@types/react': 18.2.66 + '@types/react-dom@19.2.3(@types/react@19.2.7)': + dependencies: + '@types/react': 19.2.7 + '@types/react@18.2.66': dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 csstype: 3.1.3 + '@types/react@19.2.7': + dependencies: + csstype: 3.2.3 + '@types/resolve@1.17.1': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/responselike@1.0.3': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/retry@0.12.0': {} @@ -11614,7 +12483,7 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/serve-index@1.9.4': dependencies: @@ -11629,12 +12498,12 @@ snapshots: '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/send': 0.17.5 '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/source-list-map@0.1.6': {} @@ -11665,7 +12534,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.0.3 + '@types/node': 20.11.28 '@types/ws@8.5.10': dependencies: @@ -11681,15 +12550,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - debug: 4.3.4 - eslint: 8.57.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) + debug: 4.4.1 + eslint: 9.39.2(jiti@1.21.0) graphemer: 1.4.0 ignore: 5.3.1 natural-compare-lite: 1.4.0 @@ -11707,7 +12576,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - debug: 4.3.4 + debug: 4.4.1 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -11760,6 +12629,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.0 + eslint: 9.39.2(jiti@1.21.0) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) @@ -11768,13 +12653,21 @@ snapshots: - supports-color - typescript - '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2)': + '@typescript-eslint/experimental-utils@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)': + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) + eslint: 9.39.2(jiti@1.21.0) + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) - debug: 4.3.4 - eslint: 8.57.0 + debug: 4.4.1 + eslint: 9.39.2(jiti@1.21.0) optionalDependencies: typescript: 5.4.2 transitivePeerDependencies: @@ -11819,6 +12712,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.0 + debug: 4.4.1 + eslint: 9.39.2(jiti@1.21.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.50.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) + '@typescript-eslint/types': 8.50.0 + debug: 4.4.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -11839,17 +12753,39 @@ snapshots: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/scope-manager@8.50.0': + dependencies: + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/visitor-keys': 8.50.0 + + '@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - debug: 4.3.4 + debug: 4.4.1 eslint: 8.57.0 tsutils: 3.21.0(typescript@5.4.2) optionalDependencies: typescript: 5.4.2 transitivePeerDependencies: - supports-color + optional: true + + '@typescript-eslint/type-utils@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) + debug: 4.4.1 + eslint: 9.39.2(jiti@1.21.0) + tsutils: 3.21.0(typescript@5.4.2) + optionalDependencies: + typescript: 5.4.2 + transitivePeerDependencies: + - supports-color '@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.4.2)': dependencies: @@ -11875,6 +12811,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + debug: 4.4.1 + eslint: 9.39.2(jiti@1.21.0) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@5.62.0': {} '@typescript-eslint/types@6.19.1': {} @@ -11883,11 +12831,13 @@ snapshots: '@typescript-eslint/types@7.2.0': {} + '@typescript-eslint/types@8.50.0': {} + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.2)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.0 @@ -11942,6 +12892,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.50.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/visitor-keys': 8.50.0 + debug: 4.4.1 + minimatch: 9.0.5 + semver: 7.6.0 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -11957,6 +12922,21 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.39.2(jiti@1.21.0)) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) + eslint: 9.39.2(jiti@1.21.0) + eslint-scope: 5.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.4.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) @@ -11985,6 +12965,17 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.0)) + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -12005,8 +12996,25 @@ snapshots: '@typescript-eslint/types': 7.2.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.50.0': + dependencies: + '@typescript-eslint/types': 8.50.0 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.2.0': {} + '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@1.21.0)(terser@5.43.1))': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.53 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.3.0(@types/node@24.10.4)(jiti@1.21.0)(terser@5.43.1) + transitivePeerDependencies: + - supports-color + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 @@ -13624,6 +14632,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crypto-browserify@3.12.0: dependencies: browserify-cipher: 1.0.1 @@ -13856,6 +14870,8 @@ snapshots: csstype@3.1.3: {} + csstype@3.2.3: {} + cyclist@1.0.2: {} cz-conventional-changelog@3.3.0(@types/node@20.11.28)(typescript@5.4.2): @@ -14342,6 +15358,35 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + escalade@3.1.2: {} escalade@3.2.0: {} @@ -14431,23 +15476,23 @@ snapshots: dependencies: eslint: 8.56.0 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(eslint@9.39.2(jiti@1.21.0))(jest@27.5.1)(typescript@5.4.2): dependencies: '@babel/core': 7.24.0 - '@babel/eslint-parser': 7.23.10(@babel/core@7.24.0)(eslint@8.57.0) + '@babel/eslint-parser': 7.23.10(@babel/core@7.24.0)(eslint@9.39.2(jiti@1.21.0)) '@rushstack/eslint-patch': 1.7.2 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-react: 7.34.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@5.4.2) + eslint: 9.39.2(jiti@1.21.0) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(eslint@9.39.2(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint@9.39.2(jiti@1.21.0)) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint@9.39.2(jiti@1.21.0))(jest@27.5.1)(typescript@5.4.2) + eslint-plugin-jsx-a11y: 6.8.0(eslint@9.39.2(jiti@1.21.0)) + eslint-plugin-react: 7.34.0(eslint@9.39.2(jiti@1.21.0)) + eslint-plugin-react-hooks: 4.6.0(eslint@9.39.2(jiti@1.21.0)) + eslint-plugin-testing-library: 5.11.1(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) optionalDependencies: typescript: 5.4.2 transitivePeerDependencies: @@ -14483,12 +15528,12 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@1.21.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - eslint: 8.57.0 + '@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) + eslint: 9.39.2(jiti@1.21.0) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color @@ -14515,15 +15560,15 @@ snapshots: lodash.memoize: 4.1.2 semver: 7.6.0 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(eslint@8.57.0): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(eslint@9.39.2(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.0) '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0) - eslint: 8.57.0 + eslint: 9.39.2(jiti@1.21.0) lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint@9.39.2(jiti@1.21.0)): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.4 @@ -14531,9 +15576,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.0 + eslint: 9.39.2(jiti@1.21.0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@1.21.0)) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -14544,7 +15589,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -14577,12 +15622,12 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint@9.39.2(jiti@1.21.0))(jest@27.5.1)(typescript@5.4.2): dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - eslint: 8.57.0 + '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) + eslint: 9.39.2(jiti@1.21.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2))(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) jest: 27.5.1 transitivePeerDependencies: - supports-color @@ -14630,6 +15675,26 @@ snapshots: object.entries: 1.1.7 object.fromentries: 2.0.7 + eslint-plugin-jsx-a11y@6.8.0(eslint@9.39.2(jiti@1.21.0)): + dependencies: + '@babel/runtime': 7.24.0 + aria-query: 5.3.0 + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.17 + eslint: 9.39.2(jiti@1.21.0) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + eslint-plugin-prettier@5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.56.0)(prettier@3.2.5): dependencies: eslint: 8.56.0 @@ -14644,6 +15709,25 @@ snapshots: dependencies: eslint: 8.57.0 + eslint-plugin-react-hooks@4.6.0(eslint@9.39.2(jiti@1.21.0)): + dependencies: + eslint: 9.39.2(jiti@1.21.0) + + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@1.21.0)): + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + eslint: 9.39.2(jiti@1.21.0) + hermes-parser: 0.25.1 + zod: 4.2.1 + zod-validation-error: 4.0.2(zod@4.2.1) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@1.21.0)): + dependencies: + eslint: 9.39.2(jiti@1.21.0) + eslint-plugin-react@7.34.0(eslint@8.57.0): dependencies: array-includes: 3.1.7 @@ -14666,10 +15750,32 @@ snapshots: semver: 6.3.1 string.prototype.matchall: 4.0.10 - eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.4.2): + eslint-plugin-react@7.34.0(eslint@9.39.2(jiti@1.21.0)): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - eslint: 8.57.0 + array-includes: 3.1.7 + array.prototype.findlast: 1.2.4 + array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.3 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.17 + eslint: 9.39.2(jiti@1.21.0) + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.10 + + eslint-plugin-testing-library@5.11.1(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2) + eslint: 9.39.2(jiti@1.21.0) transitivePeerDependencies: - supports-color - typescript @@ -14689,14 +15795,21 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} - eslint-webpack-plugin@3.2.0(eslint@8.57.0)(webpack@5.90.3): + eslint-visitor-keys@4.2.1: {} + + eslint-webpack-plugin@3.2.0(eslint@9.39.2(jiti@1.21.0))(webpack@5.90.3): dependencies: '@types/eslint': 8.56.5 - eslint: 8.57.0 + eslint: 9.39.2(jiti@1.21.0) jest-worker: 28.1.3 micromatch: 4.0.5 normalize-path: 3.0.0 @@ -14789,8 +15902,55 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.39.2(jiti@1.21.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + optionalDependencies: + jiti: 1.21.0 + transitivePeerDependencies: + - supports-color + esm@3.2.25: {} + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + espree@9.6.1: dependencies: acorn: 8.15.0 @@ -15025,7 +16185,13 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.4.6: {} + fdir@6.4.6(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 figgy-pudding@3.5.2: {} @@ -15037,6 +16203,10 @@ snapshots: dependencies: flat-cache: 3.2.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + file-loader@6.2.0(webpack@5.90.3): dependencies: loader-utils: 2.0.4 @@ -15159,6 +16329,11 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + flat@5.0.2: {} flatted@3.3.1: {} @@ -15205,7 +16380,7 @@ snapshots: optionalDependencies: eslint: 8.57.0 - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.4.2)(webpack@5.90.3): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)(webpack@5.90.3): dependencies: '@babel/code-frame': 7.24.2 '@types/json-schema': 7.0.15 @@ -15223,7 +16398,7 @@ snapshots: typescript: 5.4.2 webpack: 5.90.3 optionalDependencies: - eslint: 8.57.0 + eslint: 9.39.2(jiti@1.21.0) form-data@2.3.3: dependencies: @@ -15462,6 +16637,10 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + + globals@16.5.0: {} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 @@ -15581,6 +16760,12 @@ snapshots: he@1.2.0: {} + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + hex-color-regex@1.1.0: {} hmac-drbg@1.0.1: @@ -15786,6 +16971,8 @@ snapshots: ignore@5.3.1: {} + ignore@7.0.5: {} + immer@9.0.21: {} import-fresh@2.0.0: @@ -16383,7 +17570,7 @@ snapshots: jest-message-util@28.1.3: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.27.1 '@jest/types': 28.1.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -16638,6 +17825,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsbn@0.1.1: {} jsdom@12.2.0: @@ -16709,6 +17900,8 @@ snapshots: jsesc@2.5.2: {} + jsesc@3.1.0: {} + json-buffer@3.0.0: {} json-buffer@3.0.1: {} @@ -17146,6 +18339,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + minimist@1.2.7: {} minimist@1.2.8: {} @@ -17245,6 +18442,8 @@ snapshots: nan@2.19.0: optional: true + nanoid@3.3.11: {} + nanoid@3.3.7: {} nanomatch@1.2.13: @@ -17698,6 +18897,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.3: {} + pidtree@0.6.0: {} pify@2.3.0: {} @@ -18354,6 +19555,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.0.2 + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + preact-cli@3.5.1(@types/babel__core@7.20.5)(eslint@8.57.0)(preact-render-to-string@6.4.0(preact@10.19.6))(preact@10.19.6)(typescript@5.4.2): dependencies: '@babel/core': 7.24.0 @@ -18654,7 +19861,7 @@ snapshots: regenerator-runtime: 0.13.11 whatwg-fetch: 3.6.20 - react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.4.2)(webpack@5.90.3): + react-dev-utils@12.0.1(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)(webpack@5.90.3): dependencies: '@babel/code-frame': 7.24.2 address: 1.2.2 @@ -18665,7 +19872,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.4.2)(webpack@5.90.3) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)(webpack@5.90.3) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -18694,6 +19901,11 @@ snapshots: react: 18.2.0 scheduler: 0.23.0 + react-dom@19.2.3(react@19.2.3): + dependencies: + react: 19.2.3 + scheduler: 0.27.0 + react-error-overlay@6.0.11: {} react-is@16.13.1: {} @@ -18706,6 +19918,8 @@ snapshots: react-refresh@0.11.0: {} + react-refresh@0.18.0: {} + react-router-dom@6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@remix-run/router': 1.15.3 @@ -18718,7 +19932,7 @@ snapshots: '@remix-run/router': 1.15.3 react: 18.2.0 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(@types/babel__core@7.20.5)(@types/webpack@4.41.38)(eslint@8.57.0)(react@18.2.0)(type-fest@3.13.1)(typescript@5.4.2): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(@types/babel__core@7.20.5)(@types/webpack@4.41.38)(eslint@9.39.2(jiti@1.21.0))(react@18.2.0)(type-fest@3.13.1)(typescript@5.4.2): dependencies: '@babel/core': 7.24.0 '@pmmmwh/react-refresh-webpack-plugin': 0.5.11(@types/webpack@4.41.38)(react-refresh@0.11.0)(type-fest@3.13.1)(webpack-dev-server@4.15.1(webpack@5.90.3))(webpack@5.90.3) @@ -18735,9 +19949,9 @@ snapshots: css-minimizer-webpack-plugin: 3.4.1(webpack@5.90.3) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2) - eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.90.3) + eslint: 9.39.2(jiti@1.21.0) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(eslint@9.39.2(jiti@1.21.0))(jest@27.5.1)(typescript@5.4.2) + eslint-webpack-plugin: 3.2.0(eslint@9.39.2(jiti@1.21.0))(webpack@5.90.3) file-loader: 6.2.0(webpack@5.90.3) fs-extra: 10.1.0 html-webpack-plugin: 5.6.0(webpack@5.90.3) @@ -18754,7 +19968,7 @@ snapshots: prompts: 2.4.2 react: 18.2.0 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.4.2)(webpack@5.90.3) + react-dev-utils: 12.0.1(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)(webpack@5.90.3) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 @@ -18809,6 +20023,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + react@19.2.3: {} + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -19071,10 +20287,10 @@ snapshots: optionalDependencies: '@babel/code-frame': 7.27.1 - rollup-plugin-license@3.6.0(rollup@4.43.0): + rollup-plugin-license@3.6.0(picomatch@4.0.3)(rollup@4.43.0): dependencies: commenting: 1.1.0 - fdir: 6.4.6 + fdir: 6.4.6(picomatch@4.0.3) lodash: 4.17.21 magic-string: 0.30.8 moment: 2.30.1 @@ -19192,6 +20408,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + scheduler@0.27.0: {} + schema-utils@1.0.0: dependencies: ajv: 6.12.6 @@ -19513,6 +20731,8 @@ snapshots: source-map-js@1.0.2: {} + source-map-js@1.2.1: {} + source-map-loader@1.1.3(webpack@4.47.0): dependencies: abab: 2.0.6 @@ -20053,6 +21273,11 @@ snapshots: tinydate@1.3.0: {} + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -20123,6 +21348,10 @@ snapshots: dependencies: typescript: 5.4.2 + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-interface-checker@0.1.13: {} ts-jest@29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(jest@27.5.1)(typescript@5.4.2): @@ -20240,8 +21469,21 @@ snapshots: shiki: 0.14.7 typescript: 5.4.2 + typescript-eslint@8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + typescript@5.4.2: {} + typescript@5.9.3: {} + uglify-js@3.4.10: dependencies: commander: 2.19.0 @@ -20258,7 +21500,7 @@ snapshots: undici-types@5.26.5: {} - undici-types@7.8.0: {} + undici-types@7.16.0: {} unfetch@4.2.0: {} @@ -20435,6 +21677,20 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 + vite@7.3.0(@types/node@24.10.4)(jiti@1.21.0)(terser@5.43.1): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.43.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.4 + fsevents: 2.3.3 + jiti: 1.21.0 + terser: 5.43.1 + vm-browserify@1.1.2: {} vscode-oniguruma@1.7.0: {} @@ -20912,7 +22168,7 @@ snapshots: workbox-build@6.6.0(@types/babel__core@7.20.5): dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) + '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) '@babel/core': 7.24.0 '@babel/preset-env': 7.24.0(@babel/core@7.24.0) '@babel/runtime': 7.24.0 @@ -20920,7 +22176,7 @@ snapshots: '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.2) '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.12.0 + ajv: 8.17.1 common-tags: 1.8.2 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 @@ -21132,3 +22388,9 @@ snapshots: yocto-queue@0.1.0: {} yocto-queue@1.0.0: {} + + zod-validation-error@4.0.2(zod@4.2.1): + dependencies: + zod: 4.2.1 + + zod@4.2.1: {} From 66011fd623fe10053822cc2cded58b5d73dfb938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Fri, 19 Dec 2025 10:14:38 +0100 Subject: [PATCH 05/49] docs: update docs for v4 --- README.md | 51 ++++++++++----------------------------------------- 1 file changed, 10 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index a03820de..23748575 100644 --- a/README.md +++ b/README.md @@ -85,30 +85,20 @@ To get your API key and get started, see the [Fingerprint Pro Quick Start Guide] import React from 'react' import ReactDOM from 'react-dom/client' import { - FpjsProvider, + FpProvider, FingerprintJSPro, } from '@fingerprintjs/fingerprintjs-pro-react' import App from './App' const root = ReactDOM.createRoot(document.getElementById('app')) +// supports the same options as `start()` function. root.render( - //loader_v.js', - FingerprintJSPro.defaultScriptUrlPattern, - ], - }} + - + ) ``` @@ -120,7 +110,7 @@ import React from 'react' import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' function App() { - const { isLoading, error, data } = useVisitorData() + const { isLoading, error, isFetched, data } = useVisitorData() if (isLoading) { return
Loading...
@@ -129,16 +119,11 @@ function App() { return
An error occured: {error.message}
} - if (data) { - // Perform some logic based on the visitor data - return ( -
- Welcome {data.visitorFound ? 'back' : ''}, {data.visitorId}! -
- ) - } else { - return null + if (isFetched) { + return
Welcome {data.visitor_id}!
} + + return null } export default App @@ -146,7 +131,6 @@ export default App The `useVisitorData` hook also returns a `getData` method you can use to make an API call on command. -- You can pass `{ ignoreCache: true }` to `useVisitorData` to force a fresh identification request. - You can pass `{ immediate: false }` to `useVisitorData` to disable automatic visitor identification on render. Both `useVisitorData` and `getData` accept all the [get options](https://dev.fingerprint.com/reference/get-function#get-options) available in the JavaScript agent `get` function. @@ -158,7 +142,6 @@ import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' function App() { const { isLoading, error, getData } = useVisitorData( - { ignoreCache: true }, { immediate: false } ) const [email, setEmail] = useState('') @@ -224,20 +207,6 @@ function App() { // ... ``` -## Caching strategy - -Fingerprint Pro usage is billed per API call. To avoid unnecessary API calls, it is a good practice to cache identification results. By default, the SDK uses `sessionStorage` to cache results. - -- Specify the `cacheLocation` prop on `` to instead store results in `memory` or `localStorage`. Use `none` to disable caching completely. -- Specify the `cacheTimeInSeconds` prop on `` to set the cache time in seconds. It cannot exceed 86400 seconds (24 hours). -- Specify the `cache` prop on `` to use your custom cache implementation instead. For more details, see [Creating a custom cache](https://github.com/fingerprintjs/fingerprintjs-pro-spa#creating-a-custom-cache) - in the Fingerprint Pro SPA repository (a lower-level Fingerprint library used by this SDK). -- Pass `{ignoreCache: true}` to the `getData()` function to ignore cached results for that specific API call. - -> [!NOTE] -> If you use data from [`extendedResult`](https://dev.fingerprint.com/reference/get-function#extendedresult), pay additional attention to your caching strategy. -> Some fields, for example, `ip` or `lastSeenAt`, might change over time for the same visitor. Use `getData({ ignoreCache: true })` to fetch the latest identification results. - ## Error handling The `getData` function throws errors directly from the JS Agent without changing them. See [JS Agent error handling](https://dev.fingerprint.com/reference/error-handling) for more details. From 254a9cc8ffa911901296dfcdfd517e4af640fa4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Fri, 19 Dec 2025 10:29:12 +0100 Subject: [PATCH 06/49] chore: fix broken SSR --- src/components/fp-provider.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/fp-provider.tsx b/src/components/fp-provider.tsx index ab333462..cc00ba82 100644 --- a/src/components/fp-provider.tsx +++ b/src/components/fp-provider.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren, useCallback, useEffect, useMemo, useRef } from 'react' import { FpContext } from '../fp-context' -import { Agent, GetOptions, StartOptions, start } from '@fingerprint/agent' +import { Agent, GetOptions, start, StartOptions } from '@fingerprint/agent' import * as packageInfo from '../../package.json' import { isSSR } from '../ssr' import { WithEnvironment } from './with-environment' @@ -72,15 +72,19 @@ function ProviderWithEnv({ }) }, [agentOptions, env]) - const clientRef = useRef(createClient()) + const clientRef = useRef() const getClient = useCallback(() => { if (isSSR()) { throw new Error('FpProvider client cannot be used in SSR') } + if (!clientRef.current) { + clientRef.current = createClient() + } + return clientRef.current - }, []) + }, [createClient]) const getVisitorData = useCallback( (options?: GetOptions) => { From 81a09a78f689a82f4e3662df034a87fe91d33216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Fri, 19 Dec 2025 10:29:22 +0100 Subject: [PATCH 07/49] chore: use new sdk in next example --- examples/next/next-env.d.ts | 2 +- examples/next/pages/_app.tsx | 10 +++------- examples/next/pages/index.tsx | 16 +++------------- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/examples/next/next-env.d.ts b/examples/next/next-env.d.ts index 4f11a03d..a4a7b3f5 100644 --- a/examples/next/next-env.d.ts +++ b/examples/next/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/examples/next/pages/_app.tsx b/examples/next/pages/_app.tsx index f8ee6a46..f1ee9fe7 100644 --- a/examples/next/pages/_app.tsx +++ b/examples/next/pages/_app.tsx @@ -1,18 +1,14 @@ import '../styles/globals.css' import type { AppProps } from 'next/app' -import { FpjsProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' const fpjsPublicApiKey = process.env.NEXT_PUBLIC_FPJS_PUBLIC_API_KEY as string function MyApp({ Component, pageProps }: AppProps) { return ( - + - + ) } diff --git a/examples/next/pages/index.tsx b/examples/next/pages/index.tsx index 65cd509a..6277346f 100644 --- a/examples/next/pages/index.tsx +++ b/examples/next/pages/index.tsx @@ -2,18 +2,12 @@ import type { NextPage } from 'next' import Head from 'next/head' import styles from '../styles/Home.module.css' import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' -import { useState } from 'react' const Home: NextPage = () => { - const [extendedResult, updateExtendedResult] = useState(false) - const { isLoading, error, data, getData } = useVisitorData({ extendedResult }, { immediate: true }) + const { isLoading, error, data } = useVisitorData({ immediate: true }) const reloadData = () => { - getData({ ignoreCache: true }) - } - - const onChangeExtendedResult = (e: React.ChangeEvent) => { - updateExtendedResult(e.target.checked) + //getData({ ignoreCache: true }) } return ( @@ -39,13 +33,9 @@ const Home: NextPage = () => { -

- VisitorId: {isLoading ? 'Loading...' : data?.visitorId} + VisitorId: {isLoading ? 'Loading...' : data?.visitor_id}

Full visitor data:

{error ? error.message : JSON.stringify(data, null, 2)}
From 066b2ad329860fcbc3610d21c3b47ca87b35d07a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Fri, 19 Dec 2025 10:31:15 +0100 Subject: [PATCH 08/49] test: fix tests --- __tests__/use-visitor-data.test.tsx | 10 +++++----- examples/preact/.env.example | 2 +- examples/preact/src/index.tsx | 2 +- examples/webpack-based/.env.example | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/__tests__/use-visitor-data.test.tsx b/__tests__/use-visitor-data.test.tsx index e3e6eb25..4abd1b02 100644 --- a/__tests__/use-visitor-data.test.tsx +++ b/__tests__/use-visitor-data.test.tsx @@ -4,7 +4,6 @@ import { actWait, createWrapper } from './helpers' import { act } from 'react-dom/test-utils' import { useEffect, useState } from 'react' import userEvent from '@testing-library/user-event' -import { FingerprintJSPro } from '@fingerprintjs/fingerprintjs-pro-spa' import { GetResult } from '@fingerprint/agent' const mockGetResult = { @@ -143,8 +142,9 @@ describe('useVisitorData', () => { expect(mockGet).toHaveBeenNthCalledWith(2, { tag: 2 }) }) - it('should correctly pass errors from SPA library', async () => { - mockGet.mockRejectedValue(new Error(FingerprintJSPro.ERROR_CLIENT_TIMEOUT)) + it('should correctly pass errors from agent', async () => { + const ERROR_CLIENT_TIMEOUT = 'timeout' + mockGet.mockRejectedValue(new Error(ERROR_CLIENT_TIMEOUT)) const wrapper = createWrapper() const hook = renderHook(() => useVisitorData({ immediate: false }), { wrapper }) @@ -152,10 +152,10 @@ describe('useVisitorData', () => { await act(async () => { const promise = hook.result.current.getData() - await expect(promise).rejects.toThrow(FingerprintJSPro.ERROR_CLIENT_TIMEOUT) + await expect(promise).rejects.toThrow(ERROR_CLIENT_TIMEOUT) }) - expect(hook.result.current.error?.message).toBe(FingerprintJSPro.ERROR_CLIENT_TIMEOUT) + expect(hook.result.current.error?.message).toBe(ERROR_CLIENT_TIMEOUT) }) it('`getVisitorData` `getOptions` should be passed from `getVisitorData` `getOptions`', async () => { diff --git a/examples/preact/.env.example b/examples/preact/.env.example index d85f6d9d..8961791d 100644 --- a/examples/preact/.env.example +++ b/examples/preact/.env.example @@ -1 +1 @@ -PREACT_APP_FPJS_PUBLIC_API_KEY=uxA8kJe9InOmy1MQz12y \ No newline at end of file +PREACT_APP_FPJS_PUBLIC_API_KEY= \ No newline at end of file diff --git a/examples/preact/src/index.tsx b/examples/preact/src/index.tsx index 50a3a164..53fcd2b5 100644 --- a/examples/preact/src/index.tsx +++ b/examples/preact/src/index.tsx @@ -4,7 +4,7 @@ import App from './components/app' import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' const WrappedApp: FunctionalComponent = () => { - const apiKey = 'uxA8kJe9InOmy1MQz12y' + const apiKey = process.env.PREACT_APP_FPJS_PUBLIC_API_KEY as string return ( diff --git a/examples/webpack-based/.env.example b/examples/webpack-based/.env.example index d3c0e62c..994ffaea 100644 --- a/examples/webpack-based/.env.example +++ b/examples/webpack-based/.env.example @@ -1 +1 @@ -REACT_APP_FPJS_PUBLIC_API_KEY=uxA8kJe9InOmy1MQz12y +REACT_APP_FPJS_PUBLIC_API_KEY= From 5107846fa0592a48ccaef2fbded3728b192552ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Fri, 19 Dec 2025 14:15:12 +0100 Subject: [PATCH 09/49] chore: apply copilot suggestions Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/components/fp-provider.tsx | 8 ++++---- src/fp-context.ts | 2 +- src/use-visitor-data.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/fp-provider.tsx b/src/components/fp-provider.tsx index cc00ba82..510b6205 100644 --- a/src/components/fp-provider.tsx +++ b/src/components/fp-provider.tsx @@ -8,7 +8,7 @@ import type { EnvDetails } from '../env.types' export interface FpProviderOptions extends StartOptions { /** - * If set to `true`, will force FpjsClient to be rebuilt with the new options. Should be used with caution + * If set to `true`, will force the agent to be rebuilt with the new options. Should be used with caution * since it can be triggered too often (e.g. on every render) and negatively affect performance of the JS agent. */ forceRebuild?: boolean @@ -17,11 +17,11 @@ export interface FpProviderOptions extends StartOptions { /** * @example * ```jsx - * * - * + * * ``` * * Provides the FpContext to its child components. @@ -106,7 +106,7 @@ function ProviderWithEnv({ useEffect(() => { // By default, the client is always initialized once during the first render and won't be updated - // if the configuration changes. Use `forceRebuilt` flag to disable this behaviour. + // if the configuration changes. Use `forceRebuild` flag to disable this behaviour. if (!clientRef.current || forceRebuild) { clientRef.current = createClient() } diff --git a/src/fp-context.ts b/src/fp-context.ts index 2e69dce5..9460d4da 100644 --- a/src/fp-context.ts +++ b/src/fp-context.ts @@ -5,7 +5,7 @@ import { QueryResult } from './query' export type VisitorQueryResult = QueryResult const stub = (): never => { - throw new Error('You forgot to wrap your component in .') + throw new Error('You forgot to wrap your component in .') } const initialContext = { diff --git a/src/use-visitor-data.ts b/src/use-visitor-data.ts index 471ebc5b..9a6284a1 100644 --- a/src/use-visitor-data.ts +++ b/src/use-visitor-data.ts @@ -87,7 +87,7 @@ export function useVisitorData( isLoading: false, isFetched: false, data: undefined, - error: error, + error, }) throw error From 074378bff171db0598203bd1e4b154daa85b11ba Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 19 Dec 2025 13:19:01 +0000 Subject: [PATCH 10/49] chore(release): 3.0.0-test.1 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [3.0.0-test.1](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v2.7.1...v3.0.0-test.1) (2025-12-19) ### ⚠ BREAKING CHANGES * The SDK api has changed to match changes introduced in V4 version of the agent. ### Features * migrate to v4 version of the agent ([36a26ba](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/36a26ba6a2c035e1b3b8dc52b8371a3ed1883b7b)) --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 388922b8..9cb6a26b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## [3.0.0-test.1](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v2.7.1...v3.0.0-test.1) (2025-12-19) + + +### ⚠ BREAKING CHANGES + +* The SDK api has changed to match changes introduced in V4 version of the agent. + +### Features + +* migrate to v4 version of the agent ([36a26ba](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/36a26ba6a2c035e1b3b8dc52b8371a3ed1883b7b)) + ## [2.7.1](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v2.7.0...v2.7.1) (2025-09-15) diff --git a/package.json b/package.json index 99bfe188..4d0702ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@fingerprintjs/fingerprintjs-pro-react", - "version": "2.7.1", + "version": "3.0.0-test.1", "description": "FingerprintJS Pro React SDK", "main": "dist/fp-pro-react.cjs.js", "module": "dist/fp-pro-react.esm.js", From 537e14a0823f81822a64b67ac8ee3f9866c44a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 6 Jan 2026 11:24:46 +0100 Subject: [PATCH 11/49] chore: adjust cache parameter --- examples/create-react-app/src/no_cache/WithoutCache.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/create-react-app/src/no_cache/WithoutCache.tsx b/examples/create-react-app/src/no_cache/WithoutCache.tsx index 1aa0f23c..56a5e32d 100644 --- a/examples/create-react-app/src/no_cache/WithoutCache.tsx +++ b/examples/create-react-app/src/no_cache/WithoutCache.tsx @@ -5,7 +5,7 @@ import { FPJS_API_KEY } from '../shared/utils/env' function WithoutCache() { return ( - +

Solution without cache

From c5d217d36c08fddcf955e2f4b198ff5e37320f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 6 Jan 2026 11:25:51 +0100 Subject: [PATCH 12/49] feat: bump @fingerprint/agent to 4.0.0-beta.5 --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 99bfe188..a614f066 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ }, "homepage": "https://github.com/fingerprintjs/fingerprintjs-pro-react#readme", "dependencies": { - "@fingerprint/agent": "4.0.0-beta.3", + "@fingerprint/agent": "4.0.0-beta.5", "fast-deep-equal": "3.1.3" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0822920b..9ef20074 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@fingerprint/agent': - specifier: 4.0.0-beta.3 - version: 4.0.0-beta.3 + specifier: 4.0.0-beta.5 + version: 4.0.0-beta.5 fast-deep-equal: specifier: 3.1.3 version: 3.1.3 @@ -1575,8 +1575,8 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fingerprint/agent@4.0.0-beta.3': - resolution: {integrity: sha512-VXWSDfcWXGm3AJ6BDwBS9aB4I+EKPkCVwnBWj9G/9P159VBIgUadjoaPhPKkUrGMNEwevOHKXHk4nOWQ2laC8g==} + '@fingerprint/agent@4.0.0-beta.5': + resolution: {integrity: sha512-XtylYPFIv5lh2x6iXTjOeZmQy1UYFaEhDxwtCk/mPUExOOb/htWt617q9XQb4ShoHta+BTsh63yeFHrWTYFzYQ==} '@fingerprintjs/commit-lint-dx-team@0.0.2': resolution: {integrity: sha512-8FDlPI+KhnWsfbf4Lo/TERdiHl9daMhnZb4MsV5nhrta13XXGRSxOvLPUnFmZA0FsxR4HHzpszlr7ZSoPVaLSg==} @@ -11583,7 +11583,7 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@fingerprint/agent@4.0.0-beta.3': {} + '@fingerprint/agent@4.0.0-beta.5': {} '@fingerprintjs/commit-lint-dx-team@0.0.2': dependencies: From 60a42ca148f968e3f935526fa2ea4cff9eb26239 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 6 Jan 2026 10:53:52 +0000 Subject: [PATCH 13/49] chore(release): 3.0.0-test.2 [skip ci] ## [3.0.0-test.2](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.1...v3.0.0-test.2) (2026-01-06) ### Features * bump @fingerprint/agent to 4.0.0-beta.5 ([c5d217d](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/c5d217d36c08fddcf955e2f4b198ff5e37320f4f)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cb6a26b..fd7a12a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [3.0.0-test.2](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.1...v3.0.0-test.2) (2026-01-06) + + +### Features + +* bump @fingerprint/agent to 4.0.0-beta.5 ([c5d217d](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/c5d217d36c08fddcf955e2f4b198ff5e37320f4f)) + ## [3.0.0-test.1](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v2.7.1...v3.0.0-test.1) (2025-12-19) diff --git a/package.json b/package.json index 67b25e55..ad065407 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@fingerprintjs/fingerprintjs-pro-react", - "version": "3.0.0-test.1", + "version": "3.0.0-test.2", "description": "FingerprintJS Pro React SDK", "main": "dist/fp-pro-react.cjs.js", "module": "dist/fp-pro-react.esm.js", From 76a2fec8341cefdcfd323ca69ca80780d68a5c89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 13 Jan 2026 11:01:17 +0100 Subject: [PATCH 14/49] build(deps): use stable 4.0.0 version of the @fingerprint/agent --- package.json | 4 ++-- pnpm-lock.yaml | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index a614f066..44b0c5ba 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "scripts": { "postinstall": "node scripts/detect-env.js", "prepare": "husky install", - "watch": "rollup -c rollup.config.js -w", + "watch": "rollup -c rollup.config.js -w --bundleConfigAsCjs", "build": "rimraf dist && rollup -c rollup.config.js --bundleConfigAsCjs", "start:spa": "pnpm start --prefix=examples/spa", "lint": "eslint --ext .js,.ts,.tsx --ignore-path .gitignore --max-warnings 0 .", @@ -53,7 +53,7 @@ }, "homepage": "https://github.com/fingerprintjs/fingerprintjs-pro-react#readme", "dependencies": { - "@fingerprint/agent": "4.0.0-beta.5", + "@fingerprint/agent": "^4.0.0", "fast-deep-equal": "3.1.3" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ef20074..145cad58 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@fingerprint/agent': - specifier: 4.0.0-beta.5 - version: 4.0.0-beta.5 + specifier: ^4.0.0 + version: 4.0.0 fast-deep-equal: specifier: 3.1.3 version: 3.1.3 @@ -1575,8 +1575,8 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fingerprint/agent@4.0.0-beta.5': - resolution: {integrity: sha512-XtylYPFIv5lh2x6iXTjOeZmQy1UYFaEhDxwtCk/mPUExOOb/htWt617q9XQb4ShoHta+BTsh63yeFHrWTYFzYQ==} + '@fingerprint/agent@4.0.0': + resolution: {integrity: sha512-GdFdBeaDqLc3hVQLcxPwckk+1217raR/ouxBkGXSykxAswl1xxrt6GLaR93cKY8ehjp7ZFYSjSu4aLKUesgvIg==} '@fingerprintjs/commit-lint-dx-team@0.0.2': resolution: {integrity: sha512-8FDlPI+KhnWsfbf4Lo/TERdiHl9daMhnZb4MsV5nhrta13XXGRSxOvLPUnFmZA0FsxR4HHzpszlr7ZSoPVaLSg==} @@ -11583,7 +11583,7 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@fingerprint/agent@4.0.0-beta.5': {} + '@fingerprint/agent@4.0.0': {} '@fingerprintjs/commit-lint-dx-team@0.0.2': dependencies: From fb59d7fafc7890e29678e2dae53a9f8c549f0acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 10:45:21 +0100 Subject: [PATCH 15/49] feat: add usePromiseStore to prevent duplicate async requests --- __tests__/use-visitor-data.test.tsx | 31 +++++++++++++++++- src/components/fp-provider.tsx | 11 +++++-- src/utils/use-promise-store.ts | 50 +++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/utils/use-promise-store.ts diff --git a/__tests__/use-visitor-data.test.tsx b/__tests__/use-visitor-data.test.tsx index 4abd1b02..34b7fbd9 100644 --- a/__tests__/use-visitor-data.test.tsx +++ b/__tests__/use-visitor-data.test.tsx @@ -1,6 +1,6 @@ import { useVisitorData, UseVisitorDataReturn } from '../src' import { render, renderHook } from '@testing-library/react' -import { actWait, createWrapper } from './helpers' +import { actWait, createWrapper, wait } from './helpers' import { act } from 'react-dom/test-utils' import { useEffect, useState } from 'react' import userEvent from '@testing-library/user-event' @@ -71,6 +71,35 @@ describe('useVisitorData', () => { ) }) + it('should avoid duplicate requests if one is already pending', async () => { + mockGet.mockImplementation(async () => { + await wait(250) + return mockGetResult + }) + + const wrapper = createWrapper() + const { result } = renderHook(() => useVisitorData({ immediate: false }), { wrapper }) + expect(result.current).toMatchObject( + expect.objectContaining({ + isLoading: false, + data: undefined, + }) + ) + + await Promise.all([result.current.getData(), result.current.getData()]) + + await actWait(500) + + expect(mockStart).toHaveBeenCalled() + expect(mockGet).toHaveBeenCalledTimes(1) + expect(result.current).toMatchObject( + expect.objectContaining({ + isLoading: false, + data: mockGetResult, + }) + ) + }) + it("shouldn't call getData on mount if 'immediate' option is set to false", async () => { mockGet.mockImplementation(() => mockGetResult) diff --git a/src/components/fp-provider.tsx b/src/components/fp-provider.tsx index cc00ba82..c31ad5cb 100644 --- a/src/components/fp-provider.tsx +++ b/src/components/fp-provider.tsx @@ -5,6 +5,7 @@ import * as packageInfo from '../../package.json' import { isSSR } from '../ssr' import { WithEnvironment } from './with-environment' import type { EnvDetails } from '../env.types' +import { usePromiseStore } from '../utils/use-promise-store' export interface FpProviderOptions extends StartOptions { /** @@ -86,16 +87,20 @@ function ProviderWithEnv({ return clientRef.current }, [createClient]) + const { doRequest } = usePromiseStore() + const getVisitorData = useCallback( (options?: GetOptions) => { const client = getClient() - return client.get({ + const mergedOptions = { ...getOptions, ...options, - }) + } + + return doRequest(async () => client.get(mergedOptions), mergedOptions) }, - [getClient, getOptions] + [doRequest, getClient, getOptions] ) const contextValue = useMemo(() => { diff --git a/src/utils/use-promise-store.ts b/src/utils/use-promise-store.ts new file mode 100644 index 00000000..8947bf20 --- /dev/null +++ b/src/utils/use-promise-store.ts @@ -0,0 +1,50 @@ +import { GetOptions, GetResult } from '@fingerprint/agent' +import { useCallback, useRef } from 'react' + +function getCacheKey(options?: GetOptions) { + if (!options) { + return '' + } + + return `${options.tag}-${options.linkedId}-${options.timeout}` +} + +export type UsePromiseStoreReturn = { + /** + * Accepts a callback that returns a promise (`requestCallback`) + * and optional parameters (`options`). Ensures that the same request identified by a cache key is + * only executed once at a time, and returns the stored promise for the request. The promise is + * removed from the store once it is resolved or rejected. + * */ + doRequest: (requestCallback: () => Promise, options?: GetOptions) => Promise +} + +/** + * Manages a store of promises to handle unique asynchronous requests, ensuring that + * requests with the same key are not duplicated while they are still pending. + */ +export function usePromiseStore(): UsePromiseStoreReturn { + const store = useRef(new Map>()).current + + const doRequest = useCallback( + (requestCallback: () => Promise, options?: GetOptions) => { + const cacheKey = getCacheKey(options) + let cachedPromise = store.get(cacheKey) + + if (!cachedPromise) { + cachedPromise = requestCallback().finally(() => { + store.delete(cacheKey) + }) + + store.set(cacheKey, cachedPromise) + } + + return cachedPromise + }, + [store] + ) + + return { + doRequest, + } +} From 3f4afafd0fb52b5fc49be88237035287b62d3091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 13:07:11 +0100 Subject: [PATCH 16/49] build: migrate to vite and vitest --- .github/workflows/coverage-diff.yml | 2 + __tests__/detect-env.test.ts | 1 + __tests__/fpjs-provider.test.tsx | 11 +- __tests__/helpers.tsx | 2 +- __tests__/use-visitor-data.test.tsx | 19 +- __tests__/with-environment.preact.test.tsx | 14 +- __tests__/with-environment.test.tsx | 3 +- contributing.md | 2 +- jest.config.js | 8 - package.json | 41 +- pnpm-lock.yaml | 1305 +++++++++++++------- pnpm-workspace.yaml | 8 +- resources/license_banner.txt | 2 - rollup.config.js | 64 - scripts/detect-env.js | 2 +- src/env.types.ts | 6 + src/get-env.ts | 11 +- vite.config.ts | 38 + vitest.config.ts | 14 + 19 files changed, 955 insertions(+), 598 deletions(-) delete mode 100644 jest.config.js delete mode 100644 resources/license_banner.txt delete mode 100644 rollup.config.js create mode 100644 vite.config.ts create mode 100644 vitest.config.ts diff --git a/.github/workflows/coverage-diff.yml b/.github/workflows/coverage-diff.yml index 02c95217..34044ea0 100644 --- a/.github/workflows/coverage-diff.yml +++ b/.github/workflows/coverage-diff.yml @@ -10,3 +10,5 @@ jobs: checks: write pull-requests: write uses: fingerprintjs/dx-team-toolkit/.github/workflows/coverage-diff.yml@v1 + with: + testScript: pnpm test:coverage:diff diff --git a/__tests__/detect-env.test.ts b/__tests__/detect-env.test.ts index 6d89a5b3..afd706c7 100644 --- a/__tests__/detect-env.test.ts +++ b/__tests__/detect-env.test.ts @@ -1,5 +1,6 @@ import { detectEnvironment } from '../src/detect-env' import { Env } from '../src/env.types' +import { describe, it, expect } from 'vitest' describe('Detect user env', () => { describe('Preact', () => { diff --git a/__tests__/fpjs-provider.test.tsx b/__tests__/fpjs-provider.test.tsx index b5adcfd1..d054ebd8 100644 --- a/__tests__/fpjs-provider.test.tsx +++ b/__tests__/fpjs-provider.test.tsx @@ -3,15 +3,12 @@ import { renderHook } from '@testing-library/react' import { FpContext } from '../src' import { createWrapper, getDefaultLoadOptions } from './helpers' import { version } from '../package.json' +import { describe, it, expect, vi } from 'vitest' +import * as agent from '@fingerprint/agent' -jest.mock('@fingerprint/agent', () => { - return { - ...jest.requireActual('@fingerprint/agent'), - start: jest.fn(), - } -}) +vi.mock('@fingerprint/agent', { spy: true }) -const mockStart = jest.requireMock('@fingerprint/agent').start as jest.Mock +const mockStart = vi.mocked(agent.start) describe('FpProvider', () => { it('should configure an instance of the Fp Agent', async () => { diff --git a/__tests__/helpers.tsx b/__tests__/helpers.tsx index 948e211c..d966b4ed 100644 --- a/__tests__/helpers.tsx +++ b/__tests__/helpers.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren } from 'react' import { FpProvider, FpProviderOptions } from '../src' -import { act } from 'react-dom/test-utils' +import { act } from '@testing-library/react' export const getDefaultLoadOptions = () => ({ apiKey: 'test_api_key', diff --git a/__tests__/use-visitor-data.test.tsx b/__tests__/use-visitor-data.test.tsx index 34b7fbd9..601342f1 100644 --- a/__tests__/use-visitor-data.test.tsx +++ b/__tests__/use-visitor-data.test.tsx @@ -1,10 +1,11 @@ import { useVisitorData, UseVisitorDataReturn } from '../src' -import { render, renderHook } from '@testing-library/react' +import { act, render, renderHook } from '@testing-library/react' import { actWait, createWrapper, wait } from './helpers' -import { act } from 'react-dom/test-utils' import { useEffect, useState } from 'react' import userEvent from '@testing-library/user-event' +import * as agent from '@fingerprint/agent' import { GetResult } from '@fingerprint/agent' +import { beforeEach, describe, expect, it, vi } from 'vitest' const mockGetResult = { visitor_id: 'kOzFgO0kw2Eivvb14mRL', @@ -14,23 +15,19 @@ const mockGetResult = { suspect_score: 0.5, } satisfies GetResult -const mockGet = jest.fn() +const mockGet = vi.fn() const mockAgent = { get: mockGet, + collect: vi.fn(), } -const mockStart = jest.requireMock('@fingerprint/agent').start as jest.Mock +vi.mock('@fingerprint/agent', { spy: true }) -jest.mock('@fingerprint/agent', () => { - return { - ...jest.requireActual('@fingerprint/agent'), - start: jest.fn(), - } -}) +const mockStart = vi.mocked(agent.start) describe('useVisitorData', () => { beforeEach(() => { - jest.resetAllMocks() + vi.resetAllMocks() mockStart.mockReturnValue(mockAgent) }) diff --git a/__tests__/with-environment.preact.test.tsx b/__tests__/with-environment.preact.test.tsx index 7bde8a12..6f609211 100644 --- a/__tests__/with-environment.preact.test.tsx +++ b/__tests__/with-environment.preact.test.tsx @@ -1,21 +1,23 @@ import { render as preactRender } from '@testing-library/preact' import { h } from 'preact' +import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest' +import * as compat from 'preact/compat' describe('WithEnvironment', () => { describe('when running within Preact', () => { beforeEach(() => { - jest.doMock('react-dom', () => require('preact/compat')) - jest.doMock('react', () => require('preact/compat')) + vi.doMock('react', () => compat) + vi.doMock('react-dom', () => compat) }) afterEach(() => { - jest.resetModules() + vi.resetAllMocks() }) - - it('should detect env as "preact"', () => { - const { WithEnvironment } = require('../src/components/with-environment') + it('should detect env as "preact"', async () => { + const { WithEnvironment } = await import('../src/components/with-environment') const PrintEnv = (props: any) => h('div', null, props?.env?.name) + // @ts-ignore const { container } = preactRender(h(WithEnvironment, null, h(PrintEnv, null))) expect(container.innerHTML).toContain('preact') diff --git a/__tests__/with-environment.test.tsx b/__tests__/with-environment.test.tsx index 427d0254..f8352c86 100644 --- a/__tests__/with-environment.test.tsx +++ b/__tests__/with-environment.test.tsx @@ -4,10 +4,11 @@ import { WithEnvironment } from '../src/components/with-environment' import { Link, MemoryRouter, Route, Routes } from 'react-router-dom' import userEvent from '@testing-library/user-event' import { actWait } from './helpers' +import { describe, it, expect, vi } from 'vitest' describe('WithEnvironment', () => { it('enhances provided element with `env` prop', () => { - const Mock = jest.fn(() =>
foo
) as FunctionComponent + const Mock = vi.fn(() =>
foo
) as FunctionComponent render( diff --git a/contributing.md b/contributing.md index 01139fc1..1c354cfc 100644 --- a/contributing.md +++ b/contributing.md @@ -44,7 +44,7 @@ pnpm lint:fix ### How to test -Tests are located in `__tests__` folder and run by [jest](https://jestjs.io/) in [jsdom](https://github.com/jsdom/jsdom) environment. +Tests are located in `__tests__` folder and run by [vitest](https://vitest.dev/) in [jsdom](https://github.com/jsdom/jsdom) environment. To run tests you can use IDE instruments or just run: diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 495b28f8..00000000 --- a/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'jsdom', - testRegex: '/__tests__/.+test.tsx?$', - collectCoverageFrom: ['./src/**/**.{ts,tsx}'], - coverageReporters: ['lcov', 'json-summary', ['text', { file: 'coverage.txt', path: './' }]], -} diff --git a/package.json b/package.json index 44b0c5ba..c483b053 100644 --- a/package.json +++ b/package.json @@ -2,15 +2,14 @@ "name": "@fingerprintjs/fingerprintjs-pro-react", "version": "2.7.1", "description": "FingerprintJS Pro React SDK", - "main": "dist/fp-pro-react.cjs.js", - "module": "dist/fp-pro-react.esm.js", + "main": "dist/fp-pro-react.js", + "module": "dist/fp-pro-react.mjs", "types": "dist/fp-pro-react.d.ts", "exports": { ".": { "types": "./dist/fp-pro-react.d.ts", - "import": "./dist/fp-pro-react.esm.js", - "require": "./dist/fp-pro-react.cjs.js", - "node": "./dist/fp-pro-react.esm.js" + "import": "./dist/fp-pro-react.mjs", + "require": "./dist/fp-pro-react.js" } }, "keywords": [ @@ -28,13 +27,14 @@ "scripts": { "postinstall": "node scripts/detect-env.js", "prepare": "husky install", - "watch": "rollup -c rollup.config.js -w --bundleConfigAsCjs", - "build": "rimraf dist && rollup -c rollup.config.js --bundleConfigAsCjs", + "watch": "vite build --watch", + "build": "vite build", "start:spa": "pnpm start --prefix=examples/spa", "lint": "eslint --ext .js,.ts,.tsx --ignore-path .gitignore --max-warnings 0 .", "lint:fix": "pnpm lint --fix", - "test": "jest", - "test:coverage": "jest --coverage", + "test": "vitest", + "test:coverage": "vitest run --coverage", + "test:coverage:diff": "vitest run --coverage --reporter json --outputFile.json=report.json", "test:dts": "tsc --noEmit --isolatedModules dist/fp-pro-react.d.ts", "docs": "typedoc src/index.ts --out docs" }, @@ -63,15 +63,13 @@ "@fingerprintjs/eslint-config-dx-team": "^0.1.0", "@fingerprintjs/prettier-config-dx-team": "^0.2.0", "@fingerprintjs/tsconfig-dx-team": "^0.0.2", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-typescript": "^11.1.6", - "@testing-library/preact": "^3.2.3", - "@testing-library/react": "^14.2.1", - "@testing-library/user-event": "^14.5.2", - "@types/jest": "^29.5.12", + "@testing-library/preact": "^3.2.4", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", "@types/node": "^20.11.28", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", + "@vitest/coverage-istanbul": "^4.0.18", "commitizen": "^4.3.0", "cz-conventional-changelog": "^3.3.0", "eslint": "8.57.0", @@ -80,23 +78,20 @@ "eslint-plugin-react": "7.34.0", "eslint-plugin-react-hooks": "^4.6.0", "husky": "^9.0.11", - "jest": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", "lint-staged": "^15.2.2", "preact": "^10.19.6", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.22.3", "rimraf": "^5.0.5", - "rollup": "^4.43.0", "rollup-plugin-banner2": "^1.3.1", - "rollup-plugin-dts": "^6.2.1", - "rollup-plugin-license": "^3.6.0", - "rollup-plugin-peer-deps-external": "^2.2.4", - "ts-jest": "^29.1.2", "tslib": "^2.6.2", "typedoc": "^0.25.12", - "typescript": "^5.4.2" + "typescript": "^5.4.2", + "vite": "^7.3.0", + "vite-plugin-banner": "^0.8.1", + "vite-plugin-dts": "^4.5.4", + "vitest": "^4.0.18" }, "lint-staged": { "*.ts": "pnpm lint:fix", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 145cad58..0a21bee2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,24 +33,15 @@ importers: '@fingerprintjs/tsconfig-dx-team': specifier: ^0.0.2 version: 0.0.2 - '@rollup/plugin-json': - specifier: ^6.1.0 - version: 6.1.0(rollup@4.43.0) - '@rollup/plugin-typescript': - specifier: ^11.1.6 - version: 11.1.6(rollup@4.43.0)(tslib@2.6.2)(typescript@5.4.2) '@testing-library/preact': - specifier: ^3.2.3 - version: 3.2.3(preact@10.19.6) + specifier: ^3.2.4 + version: 3.2.4(preact@10.19.6) '@testing-library/react': - specifier: ^14.2.1 - version: 14.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^16.3.2 + version: 16.3.2(@testing-library/dom@9.3.4)(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@testing-library/user-event': - specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@9.3.4) - '@types/jest': - specifier: ^29.5.12 - version: 29.5.12 + specifier: ^14.6.1 + version: 14.6.1(@testing-library/dom@9.3.4) '@types/node': specifier: ^20.11.28 version: 20.11.28 @@ -60,6 +51,9 @@ importers: '@types/react-dom': specifier: ^18.2.22 version: 18.2.22 + '@vitest/coverage-istanbul': + specifier: ^4.0.18 + version: 4.0.18(vitest@4.0.18(@types/node@20.11.28)(jiti@1.21.0)(jsdom@16.7.0)(terser@5.43.1)) commitizen: specifier: ^4.3.0 version: 4.3.0(@types/node@20.11.28)(typescript@5.4.2) @@ -74,7 +68,7 @@ importers: version: 14.1.3(eslint@8.57.0)(typescript@5.4.2) eslint-config-preact: specifier: ^1.3.0 - version: 1.3.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2) + version: 1.3.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) eslint-plugin-react: specifier: 7.34.0 version: 7.34.0(eslint@8.57.0) @@ -84,12 +78,6 @@ importers: husky: specifier: ^9.0.11 version: 9.0.11 - jest: - specifier: ^27.5.1 - version: 27.5.1 - jest-environment-jsdom: - specifier: ^27.5.1 - version: 27.5.1 lint-staged: specifier: ^15.2.2 version: 15.2.2 @@ -108,24 +96,9 @@ importers: rimraf: specifier: ^5.0.5 version: 5.0.5 - rollup: - specifier: ^4.43.0 - version: 4.43.0 rollup-plugin-banner2: specifier: ^1.3.1 version: 1.3.1 - rollup-plugin-dts: - specifier: ^6.2.1 - version: 6.2.1(rollup@4.43.0)(typescript@5.4.2) - rollup-plugin-license: - specifier: ^3.6.0 - version: 3.6.0(picomatch@4.0.3)(rollup@4.43.0) - rollup-plugin-peer-deps-external: - specifier: ^2.2.4 - version: 2.2.4(rollup@4.43.0) - ts-jest: - specifier: ^29.1.2 - version: 29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(jest@27.5.1)(typescript@5.4.2) tslib: specifier: ^2.6.2 version: 2.6.2 @@ -135,6 +108,18 @@ importers: typescript: specifier: ^5.4.2 version: 5.4.2 + vite: + specifier: ^7.3.0 + version: 7.3.0(@types/node@20.11.28)(jiti@1.21.0)(terser@5.43.1) + vite-plugin-banner: + specifier: ^0.8.1 + version: 0.8.1 + vite-plugin-dts: + specifier: ^4.5.4 + version: 4.5.4(@types/node@20.11.28)(rollup@4.43.0)(typescript@5.4.2)(vite@7.3.0(@types/node@20.11.28)(jiti@1.21.0)(terser@5.43.1)) + vitest: + specifier: ^4.0.18 + version: 4.0.18(@types/node@20.11.28)(jiti@1.21.0)(jsdom@16.7.0)(terser@5.43.1) examples/create-react-app: dependencies: @@ -227,7 +212,7 @@ importers: version: 8.57.0 eslint-config-preact: specifier: '*' - version: 1.3.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2) + version: 1.3.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) preact: specifier: 10.19.6 version: 10.19.6 @@ -1623,6 +1608,14 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1656,10 +1649,6 @@ packages: resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/fake-timers@27.5.1': resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -1681,10 +1670,6 @@ packages: resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/source-map@27.5.1': resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -1713,10 +1698,6 @@ packages: resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1741,12 +1722,6 @@ packages: '@jridgewell/source-map@0.3.6': resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -1756,6 +1731,9 @@ packages: '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -1780,6 +1758,19 @@ packages: '@mdn/browser-compat-data@5.5.15': resolution: {integrity: sha512-BWm+TMK60HSepXOZcu39bDs/2sJZVetHO5w0mkuxhpkZvz0G5yGAoyimfaru8g5nK6LXXUIeX6Uk/SWzOfph3g==} + '@microsoft/api-extractor-model@7.32.2': + resolution: {integrity: sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww==} + + '@microsoft/api-extractor@7.55.2': + resolution: {integrity: sha512-1jlWO4qmgqYoVUcyh+oXYRztZde/pAi7cSVzBz/rc+S7CoVzDasy8QE13dx6sLG4VRo8SfkkLbFORR6tBw4uGQ==} + hasBin: true + + '@microsoft/tsdoc-config@0.18.0': + resolution: {integrity: sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw==} + + '@microsoft/tsdoc@0.16.0': + resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + '@next/env@14.2.32': resolution: {integrity: sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==} @@ -1942,15 +1933,6 @@ packages: '@types/babel__core': optional: true - '@rollup/plugin-json@6.1.0': - resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-node-resolve@11.2.1': resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} @@ -1962,27 +1944,14 @@ packages: peerDependencies: rollup: ^1.20.0 || ^2.0.0 - '@rollup/plugin-typescript@11.1.6': - resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0||^4.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true - '@rollup/pluginutils@3.1.0': resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2093,12 +2062,39 @@ packages: '@rushstack/eslint-patch@1.7.2': resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} + '@rushstack/node-core-library@5.19.1': + resolution: {integrity: sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/problem-matcher@0.1.1': + resolution: {integrity: sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.6.0': + resolution: {integrity: sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==} + + '@rushstack/terminal@0.19.5': + resolution: {integrity: sha512-6k5tpdB88G0K7QrH/3yfKO84HK9ggftfUZ51p7fePyCE7+RLLHkWZbID9OFWbXuna+eeCFE7AkKnRMHMxNbz7Q==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@5.1.5': + resolution: {integrity: sha512-YmrFTFUdHXblYSa+Xc9OO9FsL/XFcckZy0ycQ6q7VSBsVs5P0uD9vcges5Q9vctGlVdu27w+Ct6IuJ458V0cTQ==} + '@sinclair/typebox@0.24.51': resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/is@0.14.0': resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} @@ -2109,6 +2105,9 @@ packages: '@sinonjs/fake-timers@8.1.0': resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} @@ -2186,21 +2185,29 @@ packages: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} - '@testing-library/preact@3.2.3': - resolution: {integrity: sha512-y6Kklp1XK3f1X2fWCbujmJyzkf+1BgLYXNgAx21j9+D4CoqMTz5qC4SQufb1L6q/jxLGACzrQ90ewVOTBvHOfg==} + '@testing-library/preact@3.2.4': + resolution: {integrity: sha512-F+kJ243LP6VmEK1M809unzTE/ijg+bsMNuiRN0JEDIJBELKKDNhdgC/WrUSZ7klwJvtlO3wQZ9ix+jhObG07Fg==} engines: {node: '>= 12'} peerDependencies: preact: '>=10 || ^10.0.0-alpha.0 || ^10.0.0-beta.0' - '@testing-library/react@14.2.1': - resolution: {integrity: sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A==} - engines: {node: '>=14'} + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + engines: {node: '>=18'} peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' @@ -2213,6 +2220,9 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -2237,6 +2247,9 @@ packages: '@types/bonjour@3.5.13': resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} @@ -2246,6 +2259,9 @@ packages: '@types/conventional-commits-parser@5.0.0': resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -2300,9 +2316,6 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.12': - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -2710,6 +2723,69 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/coverage-istanbul@4.0.18': + resolution: {integrity: sha512-0OhjP30owEDihYTZGWuq20rNtV1RjjJs1Mv4MaZIKcFBmiLUXX7HJLX4fU7wE+Mrc3lQxI2HKq6WrSXi5FGuCQ==} + peerDependencies: + vitest: 4.0.18 + + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + + '@volar/language-core@2.4.27': + resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} + + '@volar/source-map@2.4.27': + resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} + + '@volar/typescript@2.4.27': + resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} + + '@vue/compiler-core@3.5.27': + resolution: {integrity: sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==} + + '@vue/compiler-dom@3.5.27': + resolution: {integrity: sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/shared@3.5.27': + resolution: {integrity: sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==} + '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -2962,6 +3038,14 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-errors@1.0.1: resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} peerDependencies: @@ -2975,6 +3059,14 @@ packages: ajv: optional: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -2991,9 +3083,15 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + alphanum-sort@1.0.2: resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} @@ -3095,10 +3193,6 @@ packages: array-equal@1.0.2: resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} - array-find-index@1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} - array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -3167,6 +3261,10 @@ packages: assert@1.5.1: resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} @@ -3425,10 +3523,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -3551,6 +3645,10 @@ packages: caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + chalk@2.4.1: resolution: {integrity: sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==} engines: {node: '>=4'} @@ -3758,9 +3856,6 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - commenting@1.1.0: - resolution: {integrity: sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==} - commitizen@4.3.0: resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} @@ -3779,6 +3874,9 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} @@ -3807,6 +3905,12 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + configstore@5.0.1: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} engines: {node: '>=8'} @@ -4167,6 +4271,9 @@ packages: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} engines: {node: '>=10'} + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} @@ -4333,9 +4440,9 @@ packages: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} @@ -4521,6 +4628,10 @@ packages: entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -4566,9 +4677,6 @@ packages: resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} engines: {node: '>= 0.4'} - es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -4877,6 +4985,9 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -4918,14 +5029,14 @@ packages: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + expect@27.5.1: resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - express@4.18.3: resolution: {integrity: sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==} engines: {node: '>= 0.10.0'} @@ -4934,6 +5045,9 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -4990,14 +5104,6 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -5195,6 +5301,10 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -5699,6 +5809,10 @@ packages: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} engines: {node: '>=4'} + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} @@ -6089,6 +6203,10 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} @@ -6101,6 +6219,10 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} @@ -6144,10 +6266,6 @@ packages: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-docblock@27.5.1: resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -6168,10 +6286,6 @@ packages: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@27.5.1: resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -6188,10 +6302,6 @@ packages: resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-message-util@27.5.1: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -6200,10 +6310,6 @@ packages: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-mock@27.5.1: resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -6257,10 +6363,6 @@ packages: resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-validate@27.5.1: resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -6305,6 +6407,9 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -6445,6 +6550,9 @@ packages: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + language-subtag-registry@0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} @@ -6528,6 +6636,10 @@ packages: resolution: {integrity: sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==} engines: {node: '>=6'} + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -6640,12 +6752,11 @@ packages: magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -6659,9 +6770,6 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -6797,6 +6905,10 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -6869,8 +6981,8 @@ packages: engines: {node: '>=10'} hasBin: true - moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} move-concurrently@1.0.1: resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} @@ -6893,6 +7005,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true @@ -6943,6 +7058,7 @@ packages: next@14.2.32: resolution: {integrity: sha512-fg5g0GZ7/nFc09X8wLe6pNSU8cLWbLRG3TZzPJ1BJvi2s9m7eF991se67wliM9kR5yLHRkyGKU49MMx58s3LJg==} engines: {node: '>=18.17.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -7097,6 +7213,9 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -7204,10 +7323,6 @@ packages: resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} engines: {node: '>=8'} - package-name-regex@2.0.6: - resolution: {integrity: sha512-gFL35q7kbE/zBaPA3UKhp2vSzcPYx2ecbYuwv1ucE9Il6IIgBDweBlH8D68UFGZic2MkllKa2KHCfC1IQBQUYA==} - engines: {node: '>=12'} - pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -7263,6 +7378,9 @@ packages: path-browserify@0.0.1: resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-dirname@1.0.2: resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} @@ -7307,6 +7425,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} @@ -7360,6 +7481,12 @@ packages: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} engines: {node: '>=14.16'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} @@ -8023,10 +8150,6 @@ packages: resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} @@ -8127,6 +8250,9 @@ packages: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + querystring-es3@0.2.1: resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} engines: {node: '>=0.4.x'} @@ -8478,24 +8604,6 @@ packages: resolution: {integrity: sha512-BUxYj2FbSCxgfyvln6f1AWG1n+b1ZUXXb/LkKpClB12CTIjwDFexWw35V/STz7xT+BLat475I204aRzpxRQwKg==} engines: {node: '>=12.13'} - rollup-plugin-dts@6.2.1: - resolution: {integrity: sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==} - engines: {node: '>=16'} - peerDependencies: - rollup: ^3.29.4 || ^4 - typescript: ^4.5 || ^5.0 - - rollup-plugin-license@3.6.0: - resolution: {integrity: sha512-1ieLxTCaigI5xokIfszVDRoy6c/Wmlot1fDEnea7Q/WXSR8AqOjYljHDLObAx7nFxHC2mbxT3QnTSPhaic2IYw==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - - rollup-plugin-peer-deps-external@2.2.4: - resolution: {integrity: sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==} - peerDependencies: - rollup: '*' - rollup-plugin-terser@7.0.2: resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser @@ -8639,6 +8747,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} @@ -8748,6 +8861,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -8861,27 +8977,6 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - spdx-compare@1.0.0: - resolution: {integrity: sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-expression-validate@2.0.0: - resolution: {integrity: sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==} - - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - - spdx-ranges@2.1.1: - resolution: {integrity: sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==} - - spdx-satisfies@5.0.1: - resolution: {integrity: sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==} - spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -8923,6 +9018,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -8941,6 +9039,9 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stealthy-require@1.1.1: resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} engines: {node: '>=0.10.0'} @@ -9275,14 +9376,25 @@ packages: timsort@0.3.0: resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinydate@1.3.0: resolution: {integrity: sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==} engines: {node: '>=4'} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -9370,27 +9482,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-jest@29.1.2: - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - ts-pnp@1.2.0: resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} engines: {node: '>=6'} @@ -9500,11 +9591,19 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + uglify-js@3.4.10: resolution: {integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==} engines: {node: '>=0.8.0'} @@ -9691,6 +9790,18 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} + vite-plugin-banner@0.8.1: + resolution: {integrity: sha512-0+gGguHk3MH0HvzMSOCJC6fGgH4+jtY9KlKVZh+hwwE+PBkGVzY8xe657JL74vEgbeUJD37XjVqTrmve8XvZBQ==} + + vite-plugin-dts@4.5.4: + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + vite@7.3.0: resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -9731,6 +9842,40 @@ packages: yaml: optional: true + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 + happy-dom: '*' + jsdom: '*' + 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/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} @@ -9740,6 +9885,9 @@ packages: vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} deprecated: Use your platform's native performance.now() and performance.timeOrigin. @@ -9927,6 +10075,7 @@ packages: whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -9968,6 +10117,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} @@ -10382,7 +10536,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.23.0': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.28.5 '@babel/helper-module-imports@7.22.15': dependencies: @@ -10415,7 +10569,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.22.5': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.28.5 '@babel/helper-plugin-utils@7.24.0': {} @@ -10465,7 +10619,7 @@ snapshots: dependencies: '@babel/helper-function-name': 7.23.0 '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/types': 7.28.5 '@babel/helpers@7.24.0': dependencies: @@ -10491,7 +10645,7 @@ snapshots: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.0 + picocolors: 1.1.1 '@babel/parser@7.24.0': dependencies: @@ -11202,7 +11356,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.24.0 '@babel/types': 7.24.0 - debug: 4.3.4 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -11599,7 +11753,7 @@ snapshots: '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.4.2) eslint: 8.56.0 eslint-config-prettier: 9.1.0(eslint@8.56.0) - eslint-plugin-prettier: 5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.56.0)(prettier@3.2.5) + eslint-plugin-prettier: 5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5) prettier: 3.2.5 transitivePeerDependencies: - '@types/eslint' @@ -11635,6 +11789,12 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -11716,10 +11876,6 @@ snapshots: '@types/node': 20.11.28 jest-mock: 27.5.1 - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - '@jest/fake-timers@27.5.1': dependencies: '@jest/types': 27.5.1 @@ -11769,10 +11925,6 @@ snapshots: dependencies: '@sinclair/typebox': 0.24.51 - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - '@jest/source-map@27.5.1': dependencies: callsites: 3.1.0 @@ -11839,25 +11991,16 @@ snapshots: '@types/yargs': 17.0.32 chalk: 4.1.2 - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.28 - '@types/yargs': 17.0.32 - chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/remapping@2.3.5': dependencies: @@ -11875,25 +12018,26 @@ snapshots: '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.30': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -11914,6 +12058,42 @@ snapshots: '@mdn/browser-compat-data@5.5.15': {} + '@microsoft/api-extractor-model@7.32.2(@types/node@20.11.28)': + dependencies: + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.0 + '@rushstack/node-core-library': 5.19.1(@types/node@20.11.28) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.55.2(@types/node@20.11.28)': + dependencies: + '@microsoft/api-extractor-model': 7.32.2(@types/node@20.11.28) + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.0 + '@rushstack/node-core-library': 5.19.1(@types/node@20.11.28) + '@rushstack/rig-package': 0.6.0 + '@rushstack/terminal': 0.19.5(@types/node@20.11.28) + '@rushstack/ts-command-line': 5.1.5(@types/node@20.11.28) + diff: 8.0.3 + lodash: 4.17.21 + minimatch: 10.0.3 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.18.0': + dependencies: + '@microsoft/tsdoc': 0.16.0 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.8 + + '@microsoft/tsdoc@0.16.0': {} + '@next/env@14.2.32': {} '@next/eslint-plugin-next@14.1.3': @@ -12033,12 +12213,6 @@ snapshots: optionalDependencies: '@types/babel__core': 7.20.5 - '@rollup/plugin-json@6.1.0(rollup@4.43.0)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.43.0) - optionalDependencies: - rollup: 4.43.0 - '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.2)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.2) @@ -12055,15 +12229,6 @@ snapshots: magic-string: 0.25.9 rollup: 2.79.2 - '@rollup/plugin-typescript@11.1.6(rollup@4.43.0)(tslib@2.6.2)(typescript@5.4.2)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.43.0) - resolve: 1.22.8 - typescript: 5.4.2 - optionalDependencies: - rollup: 4.43.0 - tslib: 2.6.2 - '@rollup/pluginutils@3.1.0(rollup@2.79.2)': dependencies: '@types/estree': 0.0.39 @@ -12071,11 +12236,11 @@ snapshots: picomatch: 2.3.1 rollup: 2.79.2 - '@rollup/pluginutils@5.1.0(rollup@4.43.0)': + '@rollup/pluginutils@5.3.0(rollup@4.43.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.3 optionalDependencies: rollup: 4.43.0 @@ -12141,9 +12306,46 @@ snapshots: '@rushstack/eslint-patch@1.7.2': {} - '@sinclair/typebox@0.24.51': {} + '@rushstack/node-core-library@5.19.1(@types/node@20.11.28)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.3 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + optionalDependencies: + '@types/node': 20.11.28 - '@sinclair/typebox@0.27.8': {} + '@rushstack/problem-matcher@0.1.1(@types/node@20.11.28)': + optionalDependencies: + '@types/node': 20.11.28 + + '@rushstack/rig-package@0.6.0': + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.19.5(@types/node@20.11.28)': + dependencies: + '@rushstack/node-core-library': 5.19.1(@types/node@20.11.28) + '@rushstack/problem-matcher': 0.1.1(@types/node@20.11.28) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 20.11.28 + + '@rushstack/ts-command-line@5.1.5(@types/node@20.11.28)': + dependencies: + '@rushstack/terminal': 0.19.5(@types/node@20.11.28) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@sinclair/typebox@0.24.51': {} '@sindresorhus/is@0.14.0': {} @@ -12155,6 +12357,8 @@ snapshots: dependencies: '@sinonjs/commons': 1.8.6 + '@standard-schema/spec@1.1.0': {} + '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: ejs: 3.1.9 @@ -12199,7 +12403,7 @@ snapshots: '@svgr/hast-util-to-babel-ast@5.5.0': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.28.5 '@svgr/plugin-jsx@5.5.0': dependencies: @@ -12242,7 +12446,7 @@ snapshots: '@testing-library/dom@8.20.1': dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.27.1 '@babel/runtime': 7.24.0 '@types/aria-query': 5.0.4 aria-query: 5.1.3 @@ -12253,7 +12457,7 @@ snapshots: '@testing-library/dom@9.3.4': dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.27.1 '@babel/runtime': 7.24.0 '@types/aria-query': 5.0.4 aria-query: 5.1.3 @@ -12262,20 +12466,22 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/preact@3.2.3(preact@10.19.6)': + '@testing-library/preact@3.2.4(preact@10.19.6)': dependencies: '@testing-library/dom': 8.20.1 preact: 10.19.6 - '@testing-library/react@14.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@testing-library/react@16.3.2(@testing-library/dom@9.3.4)(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.0 '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.66 + '@types/react-dom': 18.2.22 - '@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4)': + '@testing-library/user-event@14.6.1(@testing-library/dom@9.3.4)': dependencies: '@testing-library/dom': 9.3.4 @@ -12283,6 +12489,8 @@ snapshots: '@trysound/sax@0.2.0': {} + '@types/argparse@1.0.38': {} + '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -12320,6 +12528,11 @@ snapshots: dependencies: '@types/node': 20.11.28 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.6 @@ -12333,6 +12546,8 @@ snapshots: dependencies: '@types/node': 20.11.28 + '@types/deep-eql@4.0.2': {} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -12403,11 +12618,6 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.12': - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -12791,7 +13001,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.4.2) '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.4.2) - debug: 4.3.4 + debug: 4.4.1 eslint: 8.56.0 ts-api-utils: 1.3.0(typescript@5.4.2) optionalDependencies: @@ -12851,7 +13061,7 @@ snapshots: dependencies: '@typescript-eslint/types': 6.19.1 '@typescript-eslint/visitor-keys': 6.19.1 - debug: 4.3.4 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -12866,7 +13076,7 @@ snapshots: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -12881,7 +13091,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -13015,6 +13225,106 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/coverage-istanbul@4.0.18(vitest@4.0.18(@types/node@20.11.28)(jiti@1.21.0)(jsdom@16.7.0)(terser@5.43.1))': + dependencies: + '@istanbuljs/schema': 0.1.3 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.1 + obug: 2.1.1 + tinyrainbow: 3.0.3 + vitest: 4.0.18(@types/node@20.11.28)(jiti@1.21.0)(jsdom@16.7.0)(terser@5.43.1) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@4.0.18': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.18(vite@7.3.0(@types/node@20.11.28)(jiti@1.21.0)(terser@5.43.1))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.0(@types/node@20.11.28)(jiti@1.21.0)(terser@5.43.1) + + '@vitest/pretty-format@4.0.18': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.18': + dependencies: + '@vitest/utils': 4.0.18 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.18': {} + + '@vitest/utils@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 + + '@volar/language-core@2.4.27': + dependencies: + '@volar/source-map': 2.4.27 + + '@volar/source-map@2.4.27': {} + + '@volar/typescript@2.4.27': + dependencies: + '@volar/language-core': 2.4.27 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.27': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.27 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.27': + dependencies: + '@vue/compiler-core': 3.5.27 + '@vue/shared': 3.5.27 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.0(typescript@5.4.2)': + dependencies: + '@volar/language-core': 2.4.27 + '@vue/compiler-dom': 3.5.27 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.27 + alien-signals: 0.4.14 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.4.2 + + '@vue/shared@3.5.27': {} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 @@ -13341,6 +13651,10 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + ajv-errors@1.0.1(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -13353,6 +13667,10 @@ snapshots: optionalDependencies: ajv: 8.17.1 + ajv-formats@3.0.1(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -13381,6 +13699,13 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ajv@8.13.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 @@ -13388,6 +13713,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + alien-signals@0.4.14: {} + alphanum-sort@1.0.2: {} ansi-align@3.0.1: @@ -13472,8 +13799,6 @@ snapshots: array-equal@1.0.2: {} - array-find-index@1.0.2: {} - array-flatten@1.1.1: {} array-ify@1.0.0: {} @@ -13558,7 +13883,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.5 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 @@ -13581,6 +13906,8 @@ snapshots: object.assign: 4.1.5 util: 0.10.4 + assertion-error@2.0.1: {} + assign-symbols@1.0.0: {} ast-metadata-inferer@0.8.0: @@ -13694,7 +14021,7 @@ snapshots: babel-plugin-jest-hoist@27.5.1: dependencies: '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/types': 7.28.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 @@ -13983,10 +14310,6 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.4) - bs-logger@0.2.6: - dependencies: - fast-json-stable-stringify: 2.1.0 - bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -14152,6 +14475,8 @@ snapshots: caseless@0.12.0: {} + chai@6.2.2: {} + chalk@2.4.1: dependencies: ansi-styles: 3.2.1 @@ -14359,8 +14684,6 @@ snapshots: commander@8.3.0: {} - commenting@1.1.0: {} - commitizen@4.3.0(@types/node@20.11.28)(typescript@5.4.2): dependencies: cachedir: 2.3.0 @@ -14392,6 +14715,8 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 + compare-versions@6.1.1: {} + component-emitter@1.3.1: {} compressible@2.0.18: @@ -14442,6 +14767,10 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 + confbox@0.1.8: {} + + confbox@0.2.2: {} + configstore@5.0.1: dependencies: dot-prop: 5.3.0 @@ -14908,6 +15237,8 @@ snapshots: whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 + de-indent@1.0.2: {} + debounce@1.2.1: {} debug@2.6.9: @@ -14941,7 +15272,7 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-arguments: 1.1.1 is-array-buffer: 3.0.4 is-date-object: 1.0.5 @@ -15047,7 +15378,7 @@ snapshots: diff-sequences@27.5.1: {} - diff-sequences@29.6.3: {} + diff@8.0.3: {} diffie-hellman@5.0.3: dependencies: @@ -15234,6 +15565,8 @@ snapshots: entities@2.2.0: {} + entities@7.0.1: {} + env-paths@2.2.1: {} envinfo@7.11.1: {} @@ -15298,7 +15631,7 @@ snapshots: es-define-property@1.0.0: dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 es-define-property@1.0.1: {} @@ -15307,8 +15640,8 @@ snapshots: es-get-iterator@1.1.3: dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 is-arguments: 1.1.1 is-map: 2.0.3 is-set: 2.0.3 @@ -15334,8 +15667,6 @@ snapshots: iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 - es-module-lexer@1.4.1: {} - es-module-lexer@1.7.0: {} es-object-atoms@1.1.1: @@ -15436,7 +15767,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-preact@1.3.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2): + eslint-config-preact@1.3.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2): dependencies: '@babel/core': 7.24.0 '@babel/eslint-parser': 7.23.10(@babel/core@7.24.0)(eslint@8.57.0) @@ -15445,7 +15776,7 @@ snapshots: '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) eslint: 8.57.0 eslint-plugin-compat: 4.2.0(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) eslint-plugin-react: 7.34.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) transitivePeerDependencies: @@ -15454,7 +15785,7 @@ snapshots: - supports-color - typescript - eslint-config-preact@1.3.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2): + eslint-config-preact@1.3.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2): dependencies: '@babel/core': 7.24.0 '@babel/eslint-parser': 7.23.10(@babel/core@7.24.0)(eslint@8.57.0) @@ -15463,7 +15794,7 @@ snapshots: '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) eslint: 8.57.0 eslint-plugin-compat: 4.2.0(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) eslint-plugin-react: 7.34.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) transitivePeerDependencies: @@ -15633,24 +15964,22 @@ snapshots: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) - jest: 27.5.1 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) - jest: 27.5.1 transitivePeerDependencies: - supports-color - typescript @@ -15695,7 +16024,7 @@ snapshots: object.entries: 1.1.7 object.fromentries: 2.0.7 - eslint-plugin-prettier@5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.56.0)(prettier@3.2.5): + eslint-plugin-prettier@5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5): dependencies: eslint: 8.56.0 prettier: 3.2.5 @@ -15977,6 +16306,10 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} etag@1.8.1: {} @@ -16034,6 +16367,8 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 + expect-type@1.3.0: {} + expect@27.5.1: dependencies: '@jest/types': 27.5.1 @@ -16041,14 +16376,6 @@ snapshots: jest-matcher-utils: 27.5.1 jest-message-util: 27.5.1 - expect@29.7.0: - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - express@4.18.3: dependencies: accepts: 1.3.8 @@ -16121,6 +16448,8 @@ snapshots: transitivePeerDependencies: - supports-color + exsolve@1.0.8: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -16185,10 +16514,6 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.4.6(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -16433,6 +16758,12 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-extra@11.3.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -16535,7 +16866,7 @@ snapshots: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 get-tsconfig@4.7.3: dependencies: @@ -16656,7 +16987,7 @@ snapshots: gopd@1.0.1: dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 gopd@1.2.0: {} @@ -16987,6 +17318,8 @@ snapshots: import-lazy@2.1.0: {} + import-lazy@4.0.0: {} + import-local@3.1.0: dependencies: pkg-dir: 4.2.0 @@ -17065,7 +17398,7 @@ snapshots: is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} @@ -17247,7 +17580,7 @@ snapshots: is-symbol@1.0.4: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 is-text-path@2.0.0: dependencies: @@ -17272,7 +17605,7 @@ snapshots: is-weakset@2.0.3: dependencies: call-bind: 1.0.7 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-windows@1.0.2: {} @@ -17313,14 +17646,24 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 @@ -17340,6 +17683,11 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 @@ -17451,13 +17799,6 @@ snapshots: jest-get-type: 27.5.1 pretty-format: 27.5.1 - jest-diff@29.7.0: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - jest-docblock@27.5.1: dependencies: detect-newline: 3.1.0 @@ -17496,8 +17837,6 @@ snapshots: jest-get-type@27.5.1: {} - jest-get-type@29.6.3: {} - jest-haste-map@27.5.1: dependencies: '@jest/types': 27.5.1 @@ -17549,13 +17888,6 @@ snapshots: jest-get-type: 27.5.1 pretty-format: 27.5.1 - jest-matcher-utils@29.7.0: - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - jest-message-util@27.5.1: dependencies: '@babel/code-frame': 7.24.2 @@ -17580,18 +17912,6 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-message-util@29.7.0: - dependencies: - '@babel/code-frame': 7.24.2 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - jest-mock@27.5.1: dependencies: '@jest/types': 27.5.1 @@ -17732,15 +18052,6 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.11.28 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - jest-validate@27.5.1: dependencies: '@jest/types': 27.5.1 @@ -17814,6 +18125,8 @@ snapshots: jiti@1.21.0: {} + jju@1.4.0: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -17984,6 +18297,8 @@ snapshots: klona@2.0.6: {} + kolorist@1.8.0: {} + language-subtag-registry@0.3.22: {} language-tags@1.0.9: @@ -18080,6 +18395,12 @@ snapshots: local-access@1.1.0: {} + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -18177,13 +18498,15 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 - magic-string@0.30.17: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.8: + magicast@0.5.1: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 make-dir@2.1.0: dependencies: @@ -18198,8 +18521,6 @@ snapshots: dependencies: semver: 7.6.0 - make-error@1.3.6: {} - makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -18327,6 +18648,10 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -18405,7 +18730,12 @@ snapshots: mkdirp@1.0.4: {} - moment@2.30.1: {} + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 move-concurrently@1.0.1: dependencies: @@ -18426,6 +18756,8 @@ snapshots: ms@2.1.3: {} + muggle-string@0.4.1: {} + multicast-dns@7.2.5: dependencies: dns-packet: 5.6.1 @@ -18660,6 +18992,8 @@ snapshots: obuf@1.1.2: {} + obug@2.1.1: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -18788,8 +19122,6 @@ snapshots: registry-url: 5.1.0 semver: 6.3.1 - package-name-regex@2.0.6: {} - pako@1.0.11: {} parallel-transform@1.2.0: @@ -18827,7 +19159,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -18851,6 +19183,8 @@ snapshots: path-browserify@0.0.1: {} + path-browserify@1.0.1: {} + path-dirname@1.0.2: optional: true @@ -18879,6 +19213,8 @@ snapshots: path-type@4.0.0: {} + pathe@2.0.3: {} + pbkdf2@3.1.2: dependencies: create-hash: 1.2.0 @@ -18919,6 +19255,18 @@ snapshots: dependencies: find-up: 6.3.0 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + pkg-up@3.1.0: dependencies: find-up: 3.0.0 @@ -19708,12 +20056,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.2.0 - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - pretty-format@3.8.0: {} process-nextick-args@2.0.1: {} @@ -19797,7 +20139,7 @@ snapshots: qs@6.11.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 qs@6.13.0: dependencies: @@ -19809,6 +20151,8 @@ snapshots: qs@6.5.3: {} + quansync@0.2.11: {} + querystring-es3@0.2.1: {} querystring@0.2.1: {} @@ -20072,7 +20416,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.5 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 globalthis: 1.0.3 which-builtin-type: 1.1.3 @@ -20279,35 +20623,9 @@ snapshots: dependencies: magic-string: 0.25.9 - rollup-plugin-dts@6.2.1(rollup@4.43.0)(typescript@5.4.2): - dependencies: - magic-string: 0.30.17 - rollup: 4.43.0 - typescript: 5.4.2 - optionalDependencies: - '@babel/code-frame': 7.27.1 - - rollup-plugin-license@3.6.0(picomatch@4.0.3)(rollup@4.43.0): - dependencies: - commenting: 1.1.0 - fdir: 6.4.6(picomatch@4.0.3) - lodash: 4.17.21 - magic-string: 0.30.8 - moment: 2.30.1 - package-name-regex: 2.0.6 - rollup: 4.43.0 - spdx-expression-validate: 2.0.0 - spdx-satisfies: 5.0.1 - transitivePeerDependencies: - - picomatch - - rollup-plugin-peer-deps-external@2.2.4(rollup@4.43.0): - dependencies: - rollup: 4.43.0 - rollup-plugin-terser@7.0.2(rollup@2.79.2): dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.27.1 jest-worker: 26.6.2 rollup: 2.79.2 serialize-javascript: 4.0.0 @@ -20465,6 +20783,10 @@ snapshots: semver@6.3.1: {} + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + semver@7.6.0: dependencies: lru-cache: 6.0.0 @@ -20552,7 +20874,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 gopd: 1.0.1 has-property-descriptors: 1.0.2 @@ -20643,6 +20965,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -20777,33 +21101,6 @@ snapshots: sourcemap-codec@1.4.8: {} - spdx-compare@1.0.0: - dependencies: - array-find-index: 1.0.2 - spdx-expression-parse: 3.0.1 - spdx-ranges: 2.1.1 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - - spdx-expression-validate@2.0.0: - dependencies: - spdx-expression-parse: 3.0.1 - - spdx-license-ids@3.0.17: {} - - spdx-ranges@2.1.1: {} - - spdx-satisfies@5.0.1: - dependencies: - spdx-compare: 1.0.0 - spdx-expression-parse: 3.0.1 - spdx-ranges: 2.1.1 - spdy-transport@3.0.0: dependencies: debug: 4.4.1 @@ -20861,6 +21158,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + stackframe@1.3.4: {} static-eval@2.0.2: @@ -20876,6 +21175,8 @@ snapshots: statuses@2.0.1: {} + std-env@3.10.0: {} + stealthy-require@1.1.1: {} stop-iteration-iterator@1.0.0: @@ -21037,7 +21338,7 @@ snapshots: sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 glob: 10.3.10 lines-and-columns: 1.2.4 @@ -21271,13 +21572,19 @@ snapshots: timsort@0.3.0: {} + tinybench@2.9.0: {} + tinydate@1.3.0: {} + tinyexec@1.0.2: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyrainbow@3.0.3: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -21354,22 +21661,6 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(jest@27.5.1)(typescript@5.4.2): - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 27.5.1 - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.0 - typescript: 5.4.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.24.0 - '@jest/types': 29.6.3 - ts-pnp@1.2.0(typescript@5.4.2): optionalDependencies: typescript: 5.4.2 @@ -21482,8 +21773,12 @@ snapshots: typescript@5.4.2: {} + typescript@5.8.2: {} + typescript@5.9.3: {} + ufo@1.6.3: {} + uglify-js@3.4.10: dependencies: commander: 2.19.0 @@ -21628,7 +21923,7 @@ snapshots: dependencies: define-properties: 1.2.1 es-abstract: 1.22.5 - has-symbols: 1.0.3 + has-symbols: 1.1.0 object.getownpropertydescriptors: 2.1.7 util.promisify@1.1.2: @@ -21677,6 +21972,41 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 + vite-plugin-banner@0.8.1: {} + + vite-plugin-dts@4.5.4(@types/node@20.11.28)(rollup@4.43.0)(typescript@5.4.2)(vite@7.3.0(@types/node@20.11.28)(jiti@1.21.0)(terser@5.43.1)): + dependencies: + '@microsoft/api-extractor': 7.55.2(@types/node@20.11.28) + '@rollup/pluginutils': 5.3.0(rollup@4.43.0) + '@volar/typescript': 2.4.27 + '@vue/language-core': 2.2.0(typescript@5.4.2) + compare-versions: 6.1.1 + debug: 4.4.1 + kolorist: 1.8.0 + local-pkg: 1.1.2 + magic-string: 0.30.21 + typescript: 5.4.2 + optionalDependencies: + vite: 7.3.0(@types/node@20.11.28)(jiti@1.21.0)(terser@5.43.1) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite@7.3.0(@types/node@20.11.28)(jiti@1.21.0)(terser@5.43.1): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.43.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.11.28 + fsevents: 2.3.3 + jiti: 1.21.0 + terser: 5.43.1 + vite@7.3.0(@types/node@24.10.4)(jiti@1.21.0)(terser@5.43.1): dependencies: esbuild: 0.27.2 @@ -21691,12 +22021,52 @@ snapshots: jiti: 1.21.0 terser: 5.43.1 + vitest@4.0.18(@types/node@20.11.28)(jiti@1.21.0)(jsdom@16.7.0)(terser@5.43.1): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.0(@types/node@20.11.28)(jiti@1.21.0)(terser@5.43.1)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.0(@types/node@20.11.28)(jiti@1.21.0)(terser@5.43.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.11.28 + jsdom: 16.7.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + vm-browserify@1.1.2: {} vscode-oniguruma@1.7.0: {} vscode-textmate@8.0.0: {} + vscode-uri@3.1.0: {} + w3c-hr-time@1.0.2: dependencies: browser-process-hrtime: 1.0.0 @@ -22019,7 +22389,7 @@ snapshots: browserslist: 4.23.0 chrome-trace-event: 1.0.3 enhanced-resolve: 5.16.0 - es-module-lexer: 1.4.1 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -22138,7 +22508,7 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 which@1.3.1: @@ -22149,6 +22519,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + widest-line@3.1.0: dependencies: string-width: 4.2.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 84f1fafc..c9e19fa1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,7 @@ packages: - - "examples/*" - - "./" + - examples/* + - ./ + +onlyBuiltDependencies: + - core-js + - core-js-pure diff --git a/resources/license_banner.txt b/resources/license_banner.txt deleted file mode 100644 index 903f6f6d..00000000 --- a/resources/license_banner.txt +++ /dev/null @@ -1,2 +0,0 @@ -FingerprintJS Pro React v<%= pkg.version %> - Copyright (c) FingerprintJS, Inc, <%= new Date().getFullYear() %> (https://fingerprint.com) -Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 6047cffb..00000000 --- a/rollup.config.js +++ /dev/null @@ -1,64 +0,0 @@ -import typescript from '@rollup/plugin-typescript' -import jsonPlugin from '@rollup/plugin-json' -import external from 'rollup-plugin-peer-deps-external' -import { dts } from 'rollup-plugin-dts' -import licensePlugin from 'rollup-plugin-license' -import banner2 from 'rollup-plugin-banner2' -import { join } from 'path' -const { dependencies } = require('./package.json') - -const inputFile = 'src/index.ts' -const outputDirectory = 'dist' - -const commonBanner = licensePlugin({ - banner: { - content: { - file: join(__dirname, 'resources', 'license_banner.txt'), - }, - }, -}) - -const commonInput = { - input: inputFile, - plugins: [jsonPlugin(), typescript(), external(), commonBanner, banner2(() => `'use client';\n`)], -} - -const commonOutput = { - exports: 'named', - sourcemap: true, -} - -const RollupConfig = [ - // NPM bundles. They have all the dependencies excluded for end code size optimization. - { - ...commonInput, - external: Object.keys(dependencies), - output: [ - // CJS for usage with `require()` - { - ...commonOutput, - file: `${outputDirectory}/fp-pro-react.cjs.js`, - format: 'cjs', - }, - - // ESM for usage with `import` - { - ...commonOutput, - file: `${outputDirectory}/fp-pro-react.esm.js`, - format: 'es', - }, - ], - }, - - // TypeScript definition - { - ...commonInput, - plugins: [dts(), commonBanner], - output: { - file: `${outputDirectory}/fp-pro-react.d.ts`, - format: 'es', - }, - }, -] - -export default RollupConfig diff --git a/scripts/detect-env.js b/scripts/detect-env.js index d0469ff8..0be5fe41 100644 --- a/scripts/detect-env.js +++ b/scripts/detect-env.js @@ -32,7 +32,7 @@ function writeDetectedEnv(env, version) { const fullDistPath = path.resolve(__dirname, '../', distPath) const contents = fs.readFileSync(fullDistPath).toString() - const newContents = contents.replace(token, JSON.stringify({ name: env, version })) + const newContents = contents.replace(token, JSON.stringify({ name: env, version }).replace(/"/g, '\\"')) fs.writeFileSync(fullDistPath, newContents) }) diff --git a/src/env.types.ts b/src/env.types.ts index 62194bb1..b3907f41 100644 --- a/src/env.types.ts +++ b/src/env.types.ts @@ -9,3 +9,9 @@ export interface EnvDetails { name: Env version?: string } + +export function isEnvDetails(value: unknown): value is EnvDetails { + console.log('isEnvDetails') + /* @__PURE__ */ + return typeof value === 'object' && value !== null && 'name' in value +} diff --git a/src/get-env.ts b/src/get-env.ts index d99a2669..42359cbb 100644 --- a/src/get-env.ts +++ b/src/get-env.ts @@ -1,13 +1,12 @@ import { env } from './env' -import { EnvDetails } from './env.types' +import { EnvDetails, isEnvDetails } from './env.types' import { detectEnvironment, type DetectEnvParams } from './detect-env' -export function getEnvironment(params: DetectEnvParams) { +export function getEnvironment(params: DetectEnvParams): EnvDetails { try { - const parsedEnv = JSON.parse(env) - - if (typeof parsedEnv === 'object') { - return parsedEnv as EnvDetails + const jsonEnv = JSON.parse(env) + if (isEnvDetails(jsonEnv)) { + return jsonEnv } } catch { // Nothing here... diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..59aa9ce8 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,38 @@ +import { defineConfig } from 'vite' +import dts from 'vite-plugin-dts' +import licensePlugin from 'vite-plugin-banner' +import { dependencies, version } from './package.json' +import banner2 from 'rollup-plugin-banner2' + +const licenseContents = `FingerprintJS Pro React v${version} - Copyright (c) FingerprintJS, Inc, ${new Date().getFullYear()} (https://fingerprint.com) +Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.` + +export default defineConfig({ + build: { + // Bundle source maps for easier debugging + sourcemap: true, + lib: { + entry: 'src/index.ts', + fileName: 'fp-pro-react', + formats: ['cjs', 'es'], + }, + rollupOptions: { + output: { + globals: { + react: 'React', + 'react-dom': 'ReactDOM', + }, + }, + plugins: [banner2(() => `'use client';\n`)], + external: ['react', 'react-dom', ...Object.keys(dependencies)], + }, + }, + plugins: [ + licensePlugin({ + content: licenseContents, + }), + dts({ + rollupTypes: true, + }), + ], +}) diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..7c369cf4 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + environment: 'jsdom', + include: ['__tests__/**/*'], + passWithNoTests: true, + coverage: { + provider: 'istanbul', + reporter: [['text', { file: 'coverage.txt' }], ['json'], ['json-summary'], ['lcov']], + include: ['src/**/*'], + }, + }, +}) From 444587b71795bf2c39ed2942f8fca0c926c2c061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 14:20:10 +0100 Subject: [PATCH 17/49] refactor: add useConst hook and update usePromiseStore to utilize it --- src/utils/use-const.ts | 7 +++++++ src/utils/use-promise-store.ts | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 src/utils/use-const.ts diff --git a/src/utils/use-const.ts b/src/utils/use-const.ts new file mode 100644 index 00000000..0a6a251a --- /dev/null +++ b/src/utils/use-const.ts @@ -0,0 +1,7 @@ +import { useRef } from 'react' + +export function useConst(initialValue: T | (() => T)): T { + const ref = useRef(typeof initialValue === 'function' ? (initialValue as () => T)() : initialValue) + + return ref.current +} diff --git a/src/utils/use-promise-store.ts b/src/utils/use-promise-store.ts index 8947bf20..b6c9de14 100644 --- a/src/utils/use-promise-store.ts +++ b/src/utils/use-promise-store.ts @@ -1,5 +1,6 @@ import { GetOptions, GetResult } from '@fingerprint/agent' -import { useCallback, useRef } from 'react' +import { useCallback } from 'react' +import { useConst } from './use-const' function getCacheKey(options?: GetOptions) { if (!options) { @@ -24,7 +25,7 @@ export type UsePromiseStoreReturn = { * requests with the same key are not duplicated while they are still pending. */ export function usePromiseStore(): UsePromiseStoreReturn { - const store = useRef(new Map>()).current + const store = useConst(new Map>()) const doRequest = useCallback( (requestCallback: () => Promise, options?: GetOptions) => { From f7c61b5785600c49de282392fc4b2f561234f1c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 14:20:24 +0100 Subject: [PATCH 18/49] refactor: adjust @fingerprint/agent export structure --- src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index f24f92aa..07945d81 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,5 @@ +import * as Fp from '@fingerprint/agent' + export * from './fp-context' export * from './components/fp-provider' export * from './use-visitor-data' @@ -5,4 +7,4 @@ export * from './use-visitor-data' export * from './fp-context' export * from './query' -export * from '@fingerprint/agent' +export { Fp } From aba662c88c42ab18eebeb7d2ea5ac4c36dcd1154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 14:20:32 +0100 Subject: [PATCH 19/49] refactor: remove unnecessary console log in isEnvDetails function --- src/env.types.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/env.types.ts b/src/env.types.ts index b3907f41..95038743 100644 --- a/src/env.types.ts +++ b/src/env.types.ts @@ -11,7 +11,5 @@ export interface EnvDetails { } export function isEnvDetails(value: unknown): value is EnvDetails { - console.log('isEnvDetails') - /* @__PURE__ */ return typeof value === 'object' && value !== null && 'name' in value } From e28d921be349374965291fb5d02b98f54577e5d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 14:20:42 +0100 Subject: [PATCH 20/49] build: update lock --- pnpm-lock.yaml | 1071 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 888 insertions(+), 183 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a21bee2..a5f0a5dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -203,32 +203,38 @@ importers: version: link:../.. '@typescript-eslint/eslint-plugin': specifier: '*' - version: 7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) + version: 7.2.0(@typescript-eslint/parser@7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) '@typescript-eslint/parser': specifier: '*' - version: 7.2.0(eslint@8.57.0)(typescript@5.4.2) + version: 7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) eslint: specifier: '*' - version: 8.57.0 + version: 9.39.2(jiti@1.21.0) eslint-config-preact: specifier: '*' - version: 1.3.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) + version: 1.3.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) preact: specifier: 10.19.6 version: 10.19.6 preact-render-to-string: specifier: ^6.4.0 version: 6.4.0(preact@10.19.6) + react: + specifier: npm:@preact/compat + version: '@preact/compat@18.3.1(preact@10.19.6)' + react-dom: + specifier: npm:@preact/compat + version: '@preact/compat@18.3.1(preact@10.19.6)' typescript: specifier: '*' - version: 5.4.2 + version: 5.9.3 devDependencies: dotenv: specifier: ^16.4.5 version: 16.4.5 preact-cli: specifier: ^3.5.1 - version: 3.5.1(@types/babel__core@7.20.5)(eslint@8.57.0)(preact-render-to-string@6.4.0(preact@10.19.6))(preact@10.19.6)(typescript@5.4.2) + version: 3.5.1(@types/babel__core@7.20.5)(eslint@9.39.2(jiti@1.21.0))(preact-render-to-string@6.4.0(preact@10.19.6))(preact@10.19.6)(typescript@5.9.3) sirv-cli: specifier: ^2.0.2 version: 2.0.2 @@ -1897,6 +1903,11 @@ packages: peerDependencies: preact: '>= 10.0.0' + '@preact/compat@18.3.1': + resolution: {integrity: sha512-Kog4PSRxtT4COtOXjsuQPV1vMXpUzREQfv+6Dmcy9/rMk0HOPK0HTE9fspFjAmY8R80T/T8gtgmZ68u5bOSngw==} + peerDependencies: + preact: '*' + '@prefresh/babel-plugin@0.4.4': resolution: {integrity: sha512-/EvgIFMDL+nd20WNvMO0JQnzIl1EJPgmSaSYrZUww7A+aSdKsi37aL07TljrZR1cBMuzFxcr4xvqsUQLFJEukw==} @@ -10452,7 +10463,7 @@ snapshots: '@babel/parser': 7.28.5 '@babel/types': 7.28.5 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.22.5': @@ -10492,6 +10503,19 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.24.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 @@ -10499,11 +10523,29 @@ snapshots: regexpu-core: 5.3.2 semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.1 lodash.debounce: 4.0.8 resolve: 1.22.8 @@ -10514,7 +10556,18 @@ snapshots: dependencies: '@babel/core': 7.24.0 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.1 lodash.debounce: 4.0.8 resolve: 1.22.8 @@ -10558,11 +10611,20 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-module-transforms@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -10582,6 +10644,13 @@ snapshots: '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 + '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + '@babel/helper-replace-supers@7.22.20(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 @@ -10589,6 +10658,13 @@ snapshots: '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers@7.22.20(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-simple-access@7.22.5': dependencies: '@babel/types': 7.24.0 @@ -10618,7 +10694,7 @@ snapshots: '@babel/helper-wrap-function@7.22.20': dependencies: '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 + '@babel/template': 7.27.2 '@babel/types': 7.28.5 '@babel/helpers@7.24.0': @@ -10658,20 +10734,38 @@ snapshots: '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.0)': dependencies: @@ -10689,13 +10783,13 @@ snapshots: '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.0)': @@ -10710,7 +10804,7 @@ snapshots: '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) @@ -10718,39 +10812,63 @@ snapshots: dependencies: '@babel/core': 7.24.0 '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.0) '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators@7.24.0(@babel/core@7.24.0)': dependencies: @@ -10762,15 +10880,25 @@ snapshots: '@babel/core': 7.24.0 '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-flow@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0)': dependencies: @@ -10780,22 +10908,42 @@ snapshots: '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0)': dependencies: @@ -10805,97 +10953,191 @@ snapshots: '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.0) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) + '@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.28.5) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) + '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.0) + '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.24.0)': + '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.0) + '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-transform-classes@7.23.8(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 @@ -10903,61 +11145,119 @@ snapshots: '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 + '@babel/plugin-transform-classes@7.23.8(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.28.5) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.24.0 + + '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.24.0 '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.24.0) '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + + '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.24.0)': @@ -10965,41 +11265,83 @@ snapshots: '@babel/core': 7.24.0 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-literals@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-simple-access': 7.22.5 + + '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-simple-access': 7.22.5 '@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.24.0)': @@ -11007,38 +11349,75 @@ snapshots: '@babel/core': 7.24.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.22.20 + + '@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.22.20 '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-transform-object-assign@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 @@ -11049,62 +11428,114 @@ snapshots: '@babel/compat-data': 7.23.5 '@babel/core': 7.24.0 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-object-rest-spread@7.24.0(@babel/core@7.28.5)': + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.28.5) + '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.0) + '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-constant-elements@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.0)': dependencies: @@ -11134,24 +11565,35 @@ snapshots: dependencies: '@babel/core': 7.24.0 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 regenerator-transform: 0.15.2 '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-runtime@7.24.0(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.0) babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.24.0) babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.24.0) @@ -11162,59 +11604,108 @@ snapshots: '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-spread@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + + '@babel/plugin-transform-spread@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-typescript@7.23.6(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 '@babel/preset-env@7.24.0(@babel/core@7.24.0)': dependencies: @@ -11302,10 +11793,103 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-env@7.24.0(@babel/core@7.28.5)': + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.28.5) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.28.5) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.28.5) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.28.5) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.28.5) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.28.5) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-object-rest-spread': 7.24.0(@babel/core@7.28.5) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.28.5) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.28.5) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.28.5) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.28.5) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.28.5) + core-js-compat: 3.36.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.0)': dependencies: '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.24.0 + esutils: 2.0.3 + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/types': 7.24.0 esutils: 2.0.3 @@ -11956,7 +12540,7 @@ snapshots: '@jest/transform@27.5.1': dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.28.5 '@jest/types': 27.5.1 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -12005,7 +12589,7 @@ snapshots: '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} @@ -12184,6 +12768,10 @@ snapshots: loader-utils: 2.0.4 preact: 10.19.6 + '@preact/compat@18.3.1(preact@10.19.6)': + dependencies: + preact: 10.19.6 + '@prefresh/babel-plugin@0.4.4': {} '@prefresh/core@1.5.2(preact@10.19.6)': @@ -12204,9 +12792,9 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.53': {} - '@rollup/plugin-babel@5.3.1(@babel/core@7.24.0)(@types/babel__core@7.20.5)(rollup@2.79.2)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.28.5)(@types/babel__core@7.20.5)(rollup@2.79.2)': dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.22.15 '@rollup/pluginutils': 3.1.0(rollup@2.79.2) rollup: 2.79.2 @@ -12407,7 +12995,7 @@ snapshots: '@svgr/plugin-jsx@5.5.0': dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.28.5 '@svgr/babel-preset': 5.5.0 '@svgr/hast-util-to-babel-ast': 5.5.0 svg-parser: 2.0.4 @@ -12495,24 +13083,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.28.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__traverse@7.20.5': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.28.5 '@types/body-parser@1.19.5': dependencies: @@ -12819,23 +13407,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2)': + '@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/type-utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/type-utils': 7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + '@typescript-eslint/utils': 7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 7.2.0 debug: 4.3.4 - eslint: 8.57.0 + eslint: 9.39.2(jiti@1.21.0) graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) + ts-api-utils: 1.3.0(typescript@5.9.3) optionalDependencies: - typescript: 5.4.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -12871,6 +13459,14 @@ snapshots: - supports-color - typescript + '@typescript-eslint/experimental-utils@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.0) + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/parser@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 @@ -12909,16 +13505,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2)': + '@typescript-eslint/parser@7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 7.2.0 '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 7.2.0 debug: 4.3.4 - eslint: 8.57.0 + eslint: 9.39.2(jiti@1.21.0) optionalDependencies: - typescript: 5.4.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -13009,15 +13605,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.4.2)': + '@typescript-eslint/type-utils@7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) - '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.9.3) + '@typescript-eslint/utils': 7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) debug: 4.3.4 - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.2) + eslint: 9.39.2(jiti@1.21.0) + ts-api-utils: 1.3.0(typescript@5.9.3) optionalDependencies: - typescript: 5.4.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -13057,6 +13653,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@6.19.1(typescript@5.4.2)': dependencies: '@typescript-eslint/types': 6.19.1 @@ -13087,7 +13697,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.2)': + '@typescript-eslint/typescript-estree@7.2.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 @@ -13096,9 +13706,9 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) + ts-api-utils: 1.3.0(typescript@5.9.3) optionalDependencies: - typescript: 5.4.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -13147,6 +13757,21 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.39.2(jiti@1.21.0)) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.0) + eslint-scope: 5.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.4.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) @@ -13161,15 +13786,15 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.4.2)': + '@typescript-eslint/utils@7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.39.2(jiti@1.21.0)) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 7.2.0 '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) - eslint: 8.57.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.0) semver: 7.6.0 transitivePeerDependencies: - supports-color @@ -13983,6 +14608,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@27.5.1(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.28.5) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + babel-loader@8.3.0(@babel/core@7.24.0)(webpack@4.47.0): dependencies: '@babel/core': 7.24.0 @@ -14010,7 +14649,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -14020,7 +14659,7 @@ snapshots: babel-plugin-jest-hoist@27.5.1: dependencies: - '@babel/template': 7.24.0 + '@babel/template': 7.27.2 '@babel/types': 7.28.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 @@ -14044,6 +14683,15 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.28.5): + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.28.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.24.0): dependencies: '@babel/core': 7.24.0 @@ -14052,6 +14700,14 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.28.5) + core-js-compat: 3.36.0 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.24.0): dependencies: '@babel/core': 7.24.0 @@ -14059,6 +14715,13 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + babel-plugin-transform-react-remove-prop-types@0.4.24: {} babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.0): @@ -14077,12 +14740,34 @@ snapshots: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) + babel-preset-current-node-syntax@1.0.1(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) + babel-preset-jest@27.5.1(@babel/core@7.24.0): dependencies: '@babel/core': 7.24.0 babel-plugin-jest-hoist: 27.5.1 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + babel-preset-jest@27.5.1(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.28.5) + babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.24.0 @@ -14462,7 +15147,7 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 caniuse-lite: 1.0.30001737 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -15785,18 +16470,18 @@ snapshots: - supports-color - typescript - eslint-config-preact@1.3.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2): + eslint-config-preact@1.3.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3): dependencies: '@babel/core': 7.24.0 - '@babel/eslint-parser': 7.23.10(@babel/core@7.24.0)(eslint@8.57.0) + '@babel/eslint-parser': 7.23.10(@babel/core@7.24.0)(eslint@9.39.2(jiti@1.21.0)) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) '@babel/plugin-syntax-decorators': 7.24.0(@babel/core@7.24.0) '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - eslint: 8.57.0 - eslint-plugin-compat: 4.2.0(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) - eslint-plugin-react: 7.34.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint: 9.39.2(jiti@1.21.0) + eslint-plugin-compat: 4.2.0(eslint@9.39.2(jiti@1.21.0)) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + eslint-plugin-react: 7.34.0(eslint@9.39.2(jiti@1.21.0)) + eslint-plugin-react-hooks: 4.6.0(eslint@9.39.2(jiti@1.21.0)) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - jest @@ -15891,6 +16576,17 @@ snapshots: lodash.memoize: 4.1.2 semver: 7.6.0 + eslint-plugin-compat@4.2.0(eslint@9.39.2(jiti@1.21.0)): + dependencies: + '@mdn/browser-compat-data': 5.5.15 + ast-metadata-inferer: 0.8.0 + browserslist: 4.25.4 + caniuse-lite: 1.0.30001597 + eslint: 9.39.2(jiti@1.21.0) + find-up: 5.0.0 + lodash.memoize: 4.1.2 + semver: 7.6.0 + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.0))(@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0))(eslint@9.39.2(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.0) @@ -15974,12 +16670,12 @@ snapshots: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) - eslint: 8.57.0 + '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3) transitivePeerDependencies: - supports-color - typescript @@ -16685,7 +17381,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.4.2)(webpack@4.47.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)(webpack@5.90.3): dependencies: '@babel/code-frame': 7.24.2 '@types/json-schema': 7.0.15 @@ -16701,11 +17397,11 @@ snapshots: semver: 7.6.0 tapable: 1.1.3 typescript: 5.4.2 - webpack: 4.47.0 + webpack: 5.90.3 optionalDependencies: - eslint: 8.57.0 + eslint: 9.39.2(jiti@1.21.0) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@1.21.0))(typescript@5.4.2)(webpack@5.90.3): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)(webpack@4.47.0): dependencies: '@babel/code-frame': 7.24.2 '@types/json-schema': 7.0.15 @@ -16720,8 +17416,8 @@ snapshots: schema-utils: 2.7.0 semver: 7.6.0 tapable: 1.1.3 - typescript: 5.4.2 - webpack: 5.90.3 + typescript: 5.9.3 + webpack: 4.47.0 optionalDependencies: eslint: 9.39.2(jiti@1.21.0) @@ -17762,10 +18458,10 @@ snapshots: jest-config@27.5.1: dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.28.5 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.24.0) + babel-jest: 27.5.1(@babel/core@7.28.5) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -17890,7 +18586,7 @@ snapshots: jest-message-util@27.5.1: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.27.1 '@jest/types': 27.5.1 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -18009,16 +18705,16 @@ snapshots: jest-snapshot@27.5.1: dependencies: - '@babel/core': 7.24.0 - '@babel/generator': 7.23.6 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.20.5 '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.28.5) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.11 @@ -19273,9 +19969,9 @@ snapshots: pn@1.1.0: {} - pnp-webpack-plugin@1.7.0(typescript@5.4.2): + pnp-webpack-plugin@1.7.0(typescript@5.9.3): dependencies: - ts-pnp: 1.2.0(typescript@5.4.2) + ts-pnp: 1.2.0(typescript@5.9.3) transitivePeerDependencies: - typescript @@ -19327,7 +20023,7 @@ snapshots: postcss-colormin@4.0.3: dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 color: 3.2.1 has: 1.0.4 postcss: 7.0.39 @@ -19335,7 +20031,7 @@ snapshots: postcss-colormin@5.3.1(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.35 @@ -19348,7 +20044,7 @@ snapshots: postcss-convert-values@5.1.3(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 postcss: 8.4.35 postcss-value-parser: 4.2.0 @@ -19519,7 +20215,7 @@ snapshots: postcss-merge-rules@4.0.3: dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 caniuse-api: 3.0.0 cssnano-util-same-parent: 4.0.1 postcss: 7.0.39 @@ -19528,7 +20224,7 @@ snapshots: postcss-merge-rules@5.1.4(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.4.35) postcss: 8.4.35 @@ -19561,7 +20257,7 @@ snapshots: postcss-minify-params@4.0.2: dependencies: alphanum-sort: 1.0.2 - browserslist: 4.23.0 + browserslist: 4.25.4 cssnano-util-get-arguments: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 @@ -19569,7 +20265,7 @@ snapshots: postcss-minify-params@5.1.4(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 cssnano-utils: 3.1.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 @@ -19685,13 +20381,13 @@ snapshots: postcss-normalize-unicode@4.0.1: dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 postcss-normalize-unicode@5.1.1(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 postcss: 8.4.35 postcss-value-parser: 4.2.0 @@ -19816,14 +20512,14 @@ snapshots: postcss-reduce-initial@4.0.3: dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 caniuse-api: 3.0.0 has: 1.0.4 postcss: 7.0.39 postcss-reduce-initial@5.1.2(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 caniuse-api: 3.0.0 postcss: 8.4.35 @@ -19909,7 +20605,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact-cli@3.5.1(@types/babel__core@7.20.5)(eslint@8.57.0)(preact-render-to-string@6.4.0(preact@10.19.6))(preact@10.19.6)(typescript@5.4.2): + preact-cli@3.5.1(@types/babel__core@7.20.5)(eslint@9.39.2(jiti@1.21.0))(preact-render-to-string@6.4.0(preact@10.19.6))(preact@10.19.6)(typescript@5.9.3): dependencies: '@babel/core': 7.24.0 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.0) @@ -19941,7 +20637,7 @@ snapshots: envinfo: 7.11.1 esm: 3.2.25 file-loader: 6.2.0(webpack@5.97.0) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.4.2)(webpack@4.47.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@1.21.0))(typescript@5.9.3)(webpack@4.47.0) get-port: 5.1.1 gittar: 0.1.1 glob: 8.1.0 @@ -19956,7 +20652,7 @@ snapshots: native-url: 0.3.4 optimize-css-assets-webpack-plugin: 6.0.1(webpack@4.47.0) ora: 5.4.1 - pnp-webpack-plugin: 1.7.0(typescript@5.4.2) + pnp-webpack-plugin: 1.7.0(typescript@5.9.3) postcss: 8.4.35 postcss-load-config: 3.1.4(postcss@8.4.35) postcss-loader: 4.3.0(postcss@8.4.35)(webpack@4.47.0) @@ -19993,7 +20689,7 @@ snapshots: workbox-strategies: 6.6.0 workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@4.47.0) optionalDependencies: - typescript: 5.4.2 + typescript: 5.9.3 transitivePeerDependencies: - '@types/babel__core' - bluebird @@ -21326,13 +22022,13 @@ snapshots: stylehacks@4.0.3: dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 postcss: 7.0.39 postcss-selector-parser: 3.1.2 stylehacks@5.1.1(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.25.4 postcss: 8.4.35 postcss-selector-parser: 6.0.16 @@ -21655,15 +22351,19 @@ snapshots: dependencies: typescript: 5.4.2 + ts-api-utils@1.3.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: typescript: 5.9.3 ts-interface-checker@0.1.13: {} - ts-pnp@1.2.0(typescript@5.4.2): + ts-pnp@1.2.0(typescript@5.9.3): optionalDependencies: - typescript: 5.4.2 + typescript: 5.9.3 tsconfig-paths@3.15.0: dependencies: @@ -21683,6 +22383,11 @@ snapshots: tslib: 1.14.1 typescript: 5.4.2 + tsutils@3.21.0(typescript@5.9.3): + dependencies: + tslib: 1.14.1 + typescript: 5.9.3 + tty-browserify@0.0.0: {} tunnel-agent@0.6.0: @@ -22544,10 +23249,10 @@ snapshots: workbox-build@6.6.0(@types/babel__core@7.20.5): dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) - '@babel/core': 7.24.0 - '@babel/preset-env': 7.24.0(@babel/core@7.24.0) + '@babel/core': 7.28.5 + '@babel/preset-env': 7.24.0(@babel/core@7.28.5) '@babel/runtime': 7.24.0 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.0)(@types/babel__core@7.20.5)(rollup@2.79.2) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.5)(@types/babel__core@7.20.5)(rollup@2.79.2) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.2) '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) '@surma/rollup-plugin-off-main-thread': 2.2.3 From 87bbb80403f817c7a2ea2a3629dfdafbf908ebe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 14:20:57 +0100 Subject: [PATCH 21/49] refactor: replace FpjsProvider with FpProvider in Next.js app example --- examples/next-appDir/app/layout.tsx | 10 ++-------- examples/next-appDir/next-env.d.ts | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/examples/next-appDir/app/layout.tsx b/examples/next-appDir/app/layout.tsx index 844552c0..69de4d2e 100644 --- a/examples/next-appDir/app/layout.tsx +++ b/examples/next-appDir/app/layout.tsx @@ -1,5 +1,5 @@ import '../styles/globals.css' -import { FpjsProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' import { PropsWithChildren } from 'react' const fpjsPublicApiKey = process.env.NEXT_PUBLIC_FPJS_PUBLIC_API_KEY as string @@ -8,13 +8,7 @@ function RootLayout({ children }: PropsWithChildren) { return ( - - {children} - + {children} ) diff --git a/examples/next-appDir/next-env.d.ts b/examples/next-appDir/next-env.d.ts index 4f11a03d..40c3d680 100644 --- a/examples/next-appDir/next-env.d.ts +++ b/examples/next-appDir/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. From e9b5998b02c7d94ec10cb7ef8cb7a1783836aaf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 14:21:33 +0100 Subject: [PATCH 22/49] build: update lock --- pnpm-lock.yaml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5f0a5dd..6cc5f733 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -219,12 +219,6 @@ importers: preact-render-to-string: specifier: ^6.4.0 version: 6.4.0(preact@10.19.6) - react: - specifier: npm:@preact/compat - version: '@preact/compat@18.3.1(preact@10.19.6)' - react-dom: - specifier: npm:@preact/compat - version: '@preact/compat@18.3.1(preact@10.19.6)' typescript: specifier: '*' version: 5.9.3 @@ -1800,24 +1794,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@14.2.32': resolution: {integrity: sha512-tA6sIKShXtSJBTH88i0DRd6I9n3ZTirmwpwAqH5zdJoQF7/wlJXR8DkPmKwYl5mFWhEKr5IIa3LfpMW9RRwKmQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@14.2.32': resolution: {integrity: sha512-7S1GY4TdnlGVIdeXXKQdDkfDysoIVFMD0lJuVVMeb3eoVjrknQ0JNN7wFlhCvea0hEk0Sd4D1hedVChDKfV2jw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@14.2.32': resolution: {integrity: sha512-OHHC81P4tirVa6Awk6eCQ6RBfWl8HpFsZtfEkMpJ5GjPsJ3nhPe6wKAJUZ/piC8sszUkAgv3fLflgzPStIwfWg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@14.2.32': resolution: {integrity: sha512-rORQjXsAFeX6TLYJrCG5yoIDj+NKq31Rqwn8Wpn/bkPNy5rTHvOXkW8mLFonItS7QC6M+1JIIcLe+vOCTOYpvg==} @@ -1903,11 +1901,6 @@ packages: peerDependencies: preact: '>= 10.0.0' - '@preact/compat@18.3.1': - resolution: {integrity: sha512-Kog4PSRxtT4COtOXjsuQPV1vMXpUzREQfv+6Dmcy9/rMk0HOPK0HTE9fspFjAmY8R80T/T8gtgmZ68u5bOSngw==} - peerDependencies: - preact: '*' - '@prefresh/babel-plugin@0.4.4': resolution: {integrity: sha512-/EvgIFMDL+nd20WNvMO0JQnzIl1EJPgmSaSYrZUww7A+aSdKsi37aL07TljrZR1cBMuzFxcr4xvqsUQLFJEukw==} @@ -2004,56 +1997,67 @@ packages: resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.43.0': resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.43.0': resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.43.0': resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.43.0': resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.43.0': resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.43.0': resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.43.0': resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.43.0': resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.43.0': resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.43.0': resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} @@ -12337,7 +12341,7 @@ snapshots: '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.4.2) eslint: 8.56.0 eslint-config-prettier: 9.1.0(eslint@8.56.0) - eslint-plugin-prettier: 5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5) + eslint-plugin-prettier: 5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.56.0)(prettier@3.2.5) prettier: 3.2.5 transitivePeerDependencies: - '@types/eslint' @@ -12768,10 +12772,6 @@ snapshots: loader-utils: 2.0.4 preact: 10.19.6 - '@preact/compat@18.3.1(preact@10.19.6)': - dependencies: - preact: 10.19.6 - '@prefresh/babel-plugin@0.4.4': {} '@prefresh/core@1.5.2(preact@10.19.6)': @@ -16720,7 +16720,7 @@ snapshots: object.entries: 1.1.7 object.fromentries: 2.0.7 - eslint-plugin-prettier@5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5): + eslint-plugin-prettier@5.1.3(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.56.0)(prettier@3.2.5): dependencies: eslint: 8.56.0 prettier: 3.2.5 From d94c8d98f3aa6236ca80210908e93234ec4d9810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 14:21:40 +0100 Subject: [PATCH 23/49] build: update Vite external dependencies configuration --- vite.config.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/vite.config.ts b/vite.config.ts index 59aa9ce8..8d4ea572 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -17,14 +17,8 @@ export default defineConfig({ formats: ['cjs', 'es'], }, rollupOptions: { - output: { - globals: { - react: 'React', - 'react-dom': 'ReactDOM', - }, - }, plugins: [banner2(() => `'use client';\n`)], - external: ['react', 'react-dom', ...Object.keys(dependencies)], + external: ['react', 'react-dom', 'react/jsx-runtime', ...Object.keys(dependencies)], }, }, plugins: [ From 979e3ee68978687d69e1570299089957007a9c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 14:23:50 +0100 Subject: [PATCH 24/49] refactor: replace FpjsProvider with FpProvider in documentation and error messages --- README.md | 4 ++-- src/components/fp-provider.tsx | 4 ++-- src/fp-context.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 23748575..d7db34f8 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Fingerprint is a device intelligence platform offering industry-leading accuracy - [Requirements](#requirements) - [Installation](#installation) - [Getting started](#getting-started) - - [1. Wrap your application (or component) in ``.](#1-wrap-your-application-or-component-in-fpjsprovider) + - [1. Wrap your application (or component) in ``.](#1-wrap-your-application-or-component-in-FpProvider) - [2. Use the `useVisitorData()` hook in your components to identify visitors](#2-use-the-usevisitordata-hook-in-your-components-to-identify-visitors) - [Linking and tagging information](#linking-and-tagging-information) - [Caching strategy](#caching-strategy) @@ -73,7 +73,7 @@ pnpm add @fingerprintjs/fingerprintjs-pro-react In order to identify visitors, you'll need a Fingerprint Pro account (you can [sign up for free](https://dashboard.fingerprint.com/signup/)). To get your API key and get started, see the [Fingerprint Pro Quick Start Guide](https://dev.fingerprint.com/docs/quick-start-guide). -### 1. Wrap your application (or component) in ``. +### 1. Wrap your application (or component) in ``. - Set `apiKey` to your Fingerprint [Public API Key](https://dashboard.fingerprint.com/api-keys). - Set `region` if you have chosen a non-global [region](https://dev.fingerprint.com/docs/regions) during registration. diff --git a/src/components/fp-provider.tsx b/src/components/fp-provider.tsx index c31ad5cb..66a47fa3 100644 --- a/src/components/fp-provider.tsx +++ b/src/components/fp-provider.tsx @@ -18,11 +18,11 @@ export interface FpProviderOptions extends StartOptions { /** * @example * ```jsx - * * - * + * * ``` * * Provides the FpContext to its child components. diff --git a/src/fp-context.ts b/src/fp-context.ts index 2e69dce5..9460d4da 100644 --- a/src/fp-context.ts +++ b/src/fp-context.ts @@ -5,7 +5,7 @@ import { QueryResult } from './query' export type VisitorQueryResult = QueryResult const stub = (): never => { - throw new Error('You forgot to wrap your component in .') + throw new Error('You forgot to wrap your component in .') } const initialContext = { From b196ff5c2e1f9453164a0cc4a039a5dc0a3f797f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 14:27:46 +0100 Subject: [PATCH 25/49] refactor: remove redundant error name assignment in use-visitor-data --- src/use-visitor-data.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/use-visitor-data.ts b/src/use-visitor-data.ts index 471ebc5b..4a792351 100644 --- a/src/use-visitor-data.ts +++ b/src/use-visitor-data.ts @@ -81,8 +81,6 @@ export function useVisitorData( } catch (unknownError) { const error = toError(unknownError) - error.name = 'FPAgentError' - setQueryState({ isLoading: false, isFetched: false, From d9d9835d6b43d57343b4f81cf0242002a00fc4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 14:29:07 +0100 Subject: [PATCH 26/49] docs: update links and integration instructions in README and contributing guide --- README.md | 16 ++++++++-------- contributing.md | 4 +--- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index d7db34f8..f3ee8d25 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Fingerprint is a device intelligence platform offering industry-leading accuracy - For Typescript users: Typescript 4.8 or higher > [!NOTE] -> This package assumes you have a Fingerprint Pro subscription or trial, it is not compatible with the [source-available FingerprintJS](https://github.com/fingerprintjs/fingerprintjs). See our documentation to learn more about the [differences between Fingerprint Pro and FingerprintJS](https://dev.fingerprint.com/docs/identification-vs-fingerprintjs). +> This package assumes you have a Fingerprint Pro subscription or trial, it is not compatible with the [source-available FingerprintJS](https://github.com/fingerprintjs/fingerprintjs). See our documentation to learn more about the [differences between Fingerprint Pro and FingerprintJS](https://docs.fingerprint.com/docs/identification-vs-fingerprintjs). ## Installation @@ -71,14 +71,14 @@ pnpm add @fingerprintjs/fingerprintjs-pro-react ## Getting started In order to identify visitors, you'll need a Fingerprint Pro account (you can [sign up for free](https://dashboard.fingerprint.com/signup/)). -To get your API key and get started, see the [Fingerprint Pro Quick Start Guide](https://dev.fingerprint.com/docs/quick-start-guide). +To get your API key and get started, see the [Fingerprint Pro Quick Start Guide](https://docs.fingerprint.com/docs/quick-start-guide). ### 1. Wrap your application (or component) in ``. - Set `apiKey` to your Fingerprint [Public API Key](https://dashboard.fingerprint.com/api-keys). -- Set `region` if you have chosen a non-global [region](https://dev.fingerprint.com/docs/regions) during registration. -- Set `endpoint` and `scriptUrlPattern` if you are using [one of our proxy integrations to increase accuracy](https://dev.fingerprint.com/docs/protecting-the-javascript-agent-from-adblockers) and effectiveness of visitor identification. -- You can use all the [load options](https://dev.fingerprint.com/reference/load-function#load-options) available in the JavaScript agent `load` function. +- Set `region` if you have chosen a non-global [region](https://docs.fingerprint.com/docs/regions) during registration. +- Set `endpoint`` if you are using [one of our proxy integrations to increase accuracy](https://docs.fingerprint.com/docs/protecting-the-javascript-agent-from-adblockers) and effectiveness of visitor identification. +- You can use all the [start options](https://docs.fingerprint.com/reference/js-agent-v4-start-function#start-options) available in the JavaScript agent `load` function. ```jsx // src/index.js @@ -133,7 +133,7 @@ The `useVisitorData` hook also returns a `getData` method you can use to make an - You can pass `{ immediate: false }` to `useVisitorData` to disable automatic visitor identification on render. -Both `useVisitorData` and `getData` accept all the [get options](https://dev.fingerprint.com/reference/get-function#get-options) available in the JavaScript agent `get` function. +Both `useVisitorData` and `getData` accept all the [get options](https://docs.fingerprint.com/reference/get-function#get-options) available in the JavaScript agent `get` function. ```jsx // src/App.js @@ -189,7 +189,7 @@ export default App ## Linking and tagging information -The `visitorId` provided by Fingerprint Identification is especially useful when combined with information you already know about your users, for example, account IDs, order IDs, etc. To learn more about various applications of the `linkedId` and `tag`, see [Linking and tagging information](https://dev.fingerprint.com/docs/tagging-information). +The `visitorId` provided by Fingerprint Identification is especially useful when combined with information you already know about your users, for example, account IDs, order IDs, etc. To learn more about various applications of the `linkedId` and `tag`, see [Linking and tagging information](https://docs.fingerprint.com/docs/tagging-information). Associate the visitor ID with your data using the `linkedId` or `tag` parameter of the options object passed into the `useVisitorData()` hook or the `getData` function: @@ -209,7 +209,7 @@ function App() { ## Error handling -The `getData` function throws errors directly from the JS Agent without changing them. See [JS Agent error handling](https://dev.fingerprint.com/reference/error-handling) for more details. +The `getData` function throws errors directly from the JS Agent without changing them. See [JS Agent error handling](https://docs.fingerprint.com/reference/js-agent-v4-error-handling) for more details. ## API Reference diff --git a/contributing.md b/contributing.md index 1c354cfc..d54a17b6 100644 --- a/contributing.md +++ b/contributing.md @@ -16,9 +16,7 @@ There are 4 demo pages for this integration: 4. In `/examples/preact` folder. It is a demo built with Preact. You can find more info about configuration and starting demo in the [readme](examples/preact/README.md). 5. In `/examples/webpack-based` folder. It is a simple demo built with raw webpack. -If you want to test integration with [fingerprintjs-pro-spa](https://github.com/fingerprintjs/fingerprintjs-pro-spa), just [link the package](https://pnpm.io/cli/link#replace-an-installed-package-with-a-local-version-of-it) with the `pnpm link `. - -❗ Build projects before testing integration. First build `fingerprintjs-pro-spa`, then `fingerprintjs-pro-react`, and then start spa example app. +❗ Build projects before testing integration. First build `fingerprintjs-pro-react`, and then start any of the example apps. ### How to build From 4714fdf8526e1b62ab3ad4d84404672c02440da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 15:49:19 +0100 Subject: [PATCH 27/49] feat: rename package to `@fingerprint/react` --- README.md | 16 ++++++++-------- examples/create-react-app/package.json | 2 +- .../src/in_memory_cache/InMemoryCache.tsx | 2 +- .../local_storage_cache/LocalStorageCache.tsx | 2 +- .../src/no_cache/WithoutCache.tsx | 2 +- .../SessionStorageCache.tsx | 2 +- .../shared/components/VisitorDataPresenter.tsx | 2 +- .../src/shared/pages/HomePage.tsx | 2 +- .../src/shared/pages/SignInPage.tsx | 2 +- examples/next-appDir/app/HomePage.tsx | 2 +- examples/next-appDir/app/layout.tsx | 2 +- examples/next-appDir/package.json | 2 +- examples/next/package.json | 2 +- examples/next/pages/_app.tsx | 2 +- examples/next/pages/index.tsx | 2 +- examples/preact/package.json | 2 +- examples/preact/src/components/app.tsx | 2 +- examples/preact/src/index.tsx | 2 +- examples/vite/package.json | 2 +- examples/vite/src/App.tsx | 2 +- examples/vite/src/main.tsx | 2 +- examples/webpack-based/package.json | 2 +- examples/webpack-based/src/App.js | 2 +- examples/webpack-based/src/index.js | 2 +- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 26 files changed, 38 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index f3ee8d25..f00cfd8b 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@

CI badge coverage - Current NPM version - Monthly downloads from NPM + Current NPM version + Monthly downloads from NPM MIT license Discord server Discord server @@ -53,19 +53,19 @@ Fingerprint is a device intelligence platform offering industry-leading accuracy Using [npm](https://npmjs.org): ```sh -npm install @fingerprintjs/fingerprintjs-pro-react +npm install @fingerprint/react ``` Using [yarn](https://yarnpkg.com): ```sh -yarn add @fingerprintjs/fingerprintjs-pro-react +yarn add @fingerprint/react ``` Using [pnpm](https://pnpm.js.org): ```sh -pnpm add @fingerprintjs/fingerprintjs-pro-react +pnpm add @fingerprint/react ``` ## Getting started @@ -87,7 +87,7 @@ import ReactDOM from 'react-dom/client' import { FpProvider, FingerprintJSPro, -} from '@fingerprintjs/fingerprintjs-pro-react' +} from '@fingerprint/react' import App from './App' const root = ReactDOM.createRoot(document.getElementById('app')) @@ -107,7 +107,7 @@ root.render( ```jsx // src/App.js import React from 'react' -import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' +import { useVisitorData } from '@fingerprint/react' function App() { const { isLoading, error, isFetched, data } = useVisitorData() @@ -138,7 +138,7 @@ Both `useVisitorData` and `getData` accept all the [get options](https://docs.fi ```jsx // src/App.js import React, { useState } from 'react' -import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' +import { useVisitorData } from '@fingerprint/react' function App() { const { isLoading, error, getData } = useVisitorData( diff --git a/examples/create-react-app/package.json b/examples/create-react-app/package.json index a0944e23..c9ffb619 100644 --- a/examples/create-react-app/package.json +++ b/examples/create-react-app/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fingerprintjs/fingerprintjs-pro-react": "workspace:*", + "@fingerprint/react": "workspace:*", "react-router-dom": "^6.22.3", "react-scripts": "5.0.1" }, diff --git a/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx b/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx index eac5950c..22d6dd91 100644 --- a/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx +++ b/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx @@ -1,4 +1,4 @@ -import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprint/react' import { Outlet } from 'react-router-dom' import { FPJS_API_KEY } from '../shared/utils/env' import { Nav } from '../shared/components/Nav' diff --git a/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx b/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx index 7bf4aa92..16365c49 100644 --- a/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx +++ b/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx @@ -1,7 +1,7 @@ import { Outlet } from 'react-router-dom' import { Nav } from '../shared/components/Nav' import { FPJS_API_KEY } from '../shared/utils/env' -import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprint/react' function LocalStorageCache() { return ( diff --git a/examples/create-react-app/src/no_cache/WithoutCache.tsx b/examples/create-react-app/src/no_cache/WithoutCache.tsx index 56a5e32d..f699d7b2 100644 --- a/examples/create-react-app/src/no_cache/WithoutCache.tsx +++ b/examples/create-react-app/src/no_cache/WithoutCache.tsx @@ -1,4 +1,4 @@ -import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprint/react' import { Outlet } from 'react-router-dom' import { Nav } from '../shared/components/Nav' import { FPJS_API_KEY } from '../shared/utils/env' diff --git a/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx b/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx index 6911835b..3b58b40e 100644 --- a/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx +++ b/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx @@ -1,4 +1,4 @@ -import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprint/react' import { Outlet } from 'react-router-dom' import { Nav } from '../shared/components/Nav' import { FPJS_API_KEY } from '../shared/utils/env' diff --git a/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx b/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx index 04d11d18..cf270bac 100644 --- a/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx +++ b/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx @@ -1,4 +1,4 @@ -import { GetResult } from '@fingerprintjs/fingerprintjs-pro-react' +import { GetResult } from '@fingerprint/react' function VisitorDataPresenter({ data, isLoading, error }: { data?: GetResult; isLoading?: boolean; error?: Error }) { if (error) { diff --git a/examples/create-react-app/src/shared/pages/HomePage.tsx b/examples/create-react-app/src/shared/pages/HomePage.tsx index f32657c4..15ccd0e1 100644 --- a/examples/create-react-app/src/shared/pages/HomePage.tsx +++ b/examples/create-react-app/src/shared/pages/HomePage.tsx @@ -1,7 +1,7 @@ import Toggler from '../components/Toggler' import VisitorDataPresenter from '../components/VisitorDataPresenter' import { useCallback } from 'react' -import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' +import { useVisitorData } from '@fingerprint/react' function HomePage() { const clearCache = useCallback(() => { diff --git a/examples/create-react-app/src/shared/pages/SignInPage.tsx b/examples/create-react-app/src/shared/pages/SignInPage.tsx index 3b35e758..e62f7092 100644 --- a/examples/create-react-app/src/shared/pages/SignInPage.tsx +++ b/examples/create-react-app/src/shared/pages/SignInPage.tsx @@ -1,5 +1,5 @@ import { useState } from 'react' -import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' +import { useVisitorData } from '@fingerprint/react' import VisitorDataPresenter from '../components/VisitorDataPresenter' function SignInPage() { diff --git a/examples/next-appDir/app/HomePage.tsx b/examples/next-appDir/app/HomePage.tsx index f8f22fe3..46b38a8c 100644 --- a/examples/next-appDir/app/HomePage.tsx +++ b/examples/next-appDir/app/HomePage.tsx @@ -1,7 +1,7 @@ 'use client' import styles from '../styles/Home.module.css' -import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' +import { useVisitorData } from '@fingerprint/react' import { useState } from 'react' const HomePage = () => { diff --git a/examples/next-appDir/app/layout.tsx b/examples/next-appDir/app/layout.tsx index 69de4d2e..39143bee 100644 --- a/examples/next-appDir/app/layout.tsx +++ b/examples/next-appDir/app/layout.tsx @@ -1,5 +1,5 @@ import '../styles/globals.css' -import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprint/react' import { PropsWithChildren } from 'react' const fpjsPublicApiKey = process.env.NEXT_PUBLIC_FPJS_PUBLIC_API_KEY as string diff --git a/examples/next-appDir/package.json b/examples/next-appDir/package.json index a5cc7fda..ce23f84e 100644 --- a/examples/next-appDir/package.json +++ b/examples/next-appDir/package.json @@ -9,7 +9,7 @@ "lint": "next lint" }, "dependencies": { - "@fingerprintjs/fingerprintjs-pro-react": "workspace:*", + "@fingerprint/react": "workspace:*", "next": "14.2.32" }, "peerDependencies": { diff --git a/examples/next/package.json b/examples/next/package.json index c7e79a3d..3d7d35ac 100644 --- a/examples/next/package.json +++ b/examples/next/package.json @@ -9,7 +9,7 @@ "lint": "next lint" }, "dependencies": { - "@fingerprintjs/fingerprintjs-pro-react": "workspace:*", + "@fingerprint/react": "workspace:*", "next": "14.2.32" }, "peerDependencies": { diff --git a/examples/next/pages/_app.tsx b/examples/next/pages/_app.tsx index f1ee9fe7..20c60587 100644 --- a/examples/next/pages/_app.tsx +++ b/examples/next/pages/_app.tsx @@ -1,6 +1,6 @@ import '../styles/globals.css' import type { AppProps } from 'next/app' -import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprint/react' const fpjsPublicApiKey = process.env.NEXT_PUBLIC_FPJS_PUBLIC_API_KEY as string diff --git a/examples/next/pages/index.tsx b/examples/next/pages/index.tsx index 6277346f..53db6973 100644 --- a/examples/next/pages/index.tsx +++ b/examples/next/pages/index.tsx @@ -1,7 +1,7 @@ import type { NextPage } from 'next' import Head from 'next/head' import styles from '../styles/Home.module.css' -import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' +import { useVisitorData } from '@fingerprint/react' const Home: NextPage = () => { const { isLoading, error, data } = useVisitorData({ immediate: true }) diff --git a/examples/preact/package.json b/examples/preact/package.json index 09fad122..83991956 100644 --- a/examples/preact/package.json +++ b/examples/preact/package.json @@ -10,7 +10,7 @@ "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'" }, "dependencies": { - "@fingerprintjs/fingerprintjs-pro-react": "workspace:*", + "@fingerprint/react": "workspace:*", "preact": "10.19.6", "preact-render-to-string": "^6.4.0" }, diff --git a/examples/preact/src/components/app.tsx b/examples/preact/src/components/app.tsx index 0631af6e..28939f2f 100644 --- a/examples/preact/src/components/app.tsx +++ b/examples/preact/src/components/app.tsx @@ -1,5 +1,5 @@ import { FunctionalComponent } from 'preact' -import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' +import { useVisitorData } from '@fingerprint/react' import { useState } from 'preact/hooks' import { JSX } from 'preact/compat' diff --git a/examples/preact/src/index.tsx b/examples/preact/src/index.tsx index 53fcd2b5..d6fb251e 100644 --- a/examples/preact/src/index.tsx +++ b/examples/preact/src/index.tsx @@ -1,7 +1,7 @@ import { FunctionalComponent } from 'preact' import './style/index.css' import App from './components/app' -import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprint/react' const WrappedApp: FunctionalComponent = () => { const apiKey = process.env.PREACT_APP_FPJS_PUBLIC_API_KEY as string diff --git a/examples/vite/package.json b/examples/vite/package.json index 5f032067..de899391 100644 --- a/examples/vite/package.json +++ b/examples/vite/package.json @@ -10,7 +10,7 @@ "preview": "vite preview" }, "dependencies": { - "@fingerprintjs/fingerprintjs-pro-react": "workspace:*", + "@fingerprint/react": "workspace:*", "react": "^19.2.0", "react-dom": "^19.2.0" }, diff --git a/examples/vite/src/App.tsx b/examples/vite/src/App.tsx index a04398c8..5b9b35e6 100644 --- a/examples/vite/src/App.tsx +++ b/examples/vite/src/App.tsx @@ -1,4 +1,4 @@ -import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' +import { useVisitorData } from '@fingerprint/react' function App() { const { isLoading, error, isFetched, data } = useVisitorData() diff --git a/examples/vite/src/main.tsx b/examples/vite/src/main.tsx index f00ac65a..284f2b9f 100644 --- a/examples/vite/src/main.tsx +++ b/examples/vite/src/main.tsx @@ -2,7 +2,7 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import './index.css' import App from './App.tsx' -import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprint/react' const apiKey = import.meta.env.VITE_FPJS_PUBLIC_API_KEY diff --git a/examples/webpack-based/package.json b/examples/webpack-based/package.json index d38d60ed..cb9b429f 100644 --- a/examples/webpack-based/package.json +++ b/examples/webpack-based/package.json @@ -19,7 +19,7 @@ "webpack-dev-server": "^5.0.3" }, "dependencies": { - "@fingerprintjs/fingerprintjs-pro-react": "workspace:*" + "@fingerprint/react": "workspace:*" }, "peerDependencies": { "react": "*", diff --git a/examples/webpack-based/src/App.js b/examples/webpack-based/src/App.js index 02d375a7..b437892f 100644 --- a/examples/webpack-based/src/App.js +++ b/examples/webpack-based/src/App.js @@ -1,4 +1,4 @@ -import { useVisitorData } from '@fingerprintjs/fingerprintjs-pro-react' +import { useVisitorData } from '@fingerprint/react' function App() { const { isLoading, error, data } = useVisitorData() diff --git a/examples/webpack-based/src/index.js b/examples/webpack-based/src/index.js index a9d4fe5d..ab46b008 100644 --- a/examples/webpack-based/src/index.js +++ b/examples/webpack-based/src/index.js @@ -1,6 +1,6 @@ import React from 'react' import { createRoot } from 'react-dom/client' -import { FpProvider } from '@fingerprintjs/fingerprintjs-pro-react' +import { FpProvider } from '@fingerprint/react' import App from './App' const rootElement = document.getElementById('root') diff --git a/package.json b/package.json index c483b053..b5c3b7c1 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@fingerprintjs/fingerprintjs-pro-react", + "name": "@fingerprint/react", "version": "2.7.1", "description": "FingerprintJS Pro React SDK", "main": "dist/fp-pro-react.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6cc5f733..02621474 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -123,7 +123,7 @@ importers: examples/create-react-app: dependencies: - '@fingerprintjs/fingerprintjs-pro-react': + '@fingerprint/react': specifier: workspace:* version: link:../.. react: @@ -144,7 +144,7 @@ importers: examples/next: dependencies: - '@fingerprintjs/fingerprintjs-pro-react': + '@fingerprint/react': specifier: workspace:* version: link:../.. '@types/node': @@ -171,7 +171,7 @@ importers: examples/next-appDir: dependencies: - '@fingerprintjs/fingerprintjs-pro-react': + '@fingerprint/react': specifier: workspace:* version: link:../.. '@types/node': @@ -198,7 +198,7 @@ importers: examples/preact: dependencies: - '@fingerprintjs/fingerprintjs-pro-react': + '@fingerprint/react': specifier: workspace:* version: link:../.. '@typescript-eslint/eslint-plugin': @@ -235,7 +235,7 @@ importers: examples/vite: dependencies: - '@fingerprintjs/fingerprintjs-pro-react': + '@fingerprint/react': specifier: workspace:* version: link:../.. react: @@ -284,7 +284,7 @@ importers: examples/webpack-based: dependencies: - '@fingerprintjs/fingerprintjs-pro-react': + '@fingerprint/react': specifier: workspace:* version: link:../.. react: From e1eb0a1f385832f4125890e08945f88b91ae38ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 15:51:04 +0100 Subject: [PATCH 28/49] docs: fix typo Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f00cfd8b..6cccbde7 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ To get your API key and get started, see the [Fingerprint Pro Quick Start Guide] - Set `apiKey` to your Fingerprint [Public API Key](https://dashboard.fingerprint.com/api-keys). - Set `region` if you have chosen a non-global [region](https://docs.fingerprint.com/docs/regions) during registration. -- Set `endpoint`` if you are using [one of our proxy integrations to increase accuracy](https://docs.fingerprint.com/docs/protecting-the-javascript-agent-from-adblockers) and effectiveness of visitor identification. +- Set `endpoint` if you are using [one of our proxy integrations to increase accuracy](https://docs.fingerprint.com/docs/protecting-the-javascript-agent-from-adblockers) and effectiveness of visitor identification. - You can use all the [start options](https://docs.fingerprint.com/reference/js-agent-v4-start-function#start-options) available in the JavaScript agent `load` function. ```jsx From 3ff78107e47556676773dc6223e2c6df60928b59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 15:51:30 +0100 Subject: [PATCH 29/49] test: use resetModules() Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- __tests__/with-environment.preact.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/with-environment.preact.test.tsx b/__tests__/with-environment.preact.test.tsx index 6f609211..c030424c 100644 --- a/__tests__/with-environment.preact.test.tsx +++ b/__tests__/with-environment.preact.test.tsx @@ -11,7 +11,7 @@ describe('WithEnvironment', () => { }) afterEach(() => { - vi.resetAllMocks() + vi.resetModules() }) it('should detect env as "preact"', async () => { const { WithEnvironment } = await import('../src/components/with-environment') From 149a4a1d9367462a6b6094a48e2861ce9eb2bb79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 15:51:44 +0100 Subject: [PATCH 30/49] docs: fix link Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6cccbde7..6da298cf 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Fingerprint is a device intelligence platform offering industry-leading accuracy - [Requirements](#requirements) - [Installation](#installation) - [Getting started](#getting-started) - - [1. Wrap your application (or component) in ``.](#1-wrap-your-application-or-component-in-FpProvider) + - [1. Wrap your application (or component) in ``.](#1-wrap-your-application-or-component-in-fpprovider) - [2. Use the `useVisitorData()` hook in your components to identify visitors](#2-use-the-usevisitordata-hook-in-your-components-to-identify-visitors) - [Linking and tagging information](#linking-and-tagging-information) - [Caching strategy](#caching-strategy) From c6ad1b6d4ecdfa71ebe01aace73e2af36128a6f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 15:52:13 +0100 Subject: [PATCH 31/49] build: update package output filenames and references to `fp-react` --- package.json | 14 +++++++------- vite.config.ts | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index b5c3b7c1..44a45788 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,14 @@ "name": "@fingerprint/react", "version": "2.7.1", "description": "FingerprintJS Pro React SDK", - "main": "dist/fp-pro-react.js", - "module": "dist/fp-pro-react.mjs", - "types": "dist/fp-pro-react.d.ts", + "main": "dist/fp-react.js", + "module": "dist/fp-react.mjs", + "types": "dist/fp-react.d.ts", "exports": { ".": { - "types": "./dist/fp-pro-react.d.ts", - "import": "./dist/fp-pro-react.mjs", - "require": "./dist/fp-pro-react.js" + "types": "./dist/fp-react.d.ts", + "import": "./dist/fp-react.mjs", + "require": "./dist/fp-react.js" } }, "keywords": [ @@ -35,7 +35,7 @@ "test": "vitest", "test:coverage": "vitest run --coverage", "test:coverage:diff": "vitest run --coverage --reporter json --outputFile.json=report.json", - "test:dts": "tsc --noEmit --isolatedModules dist/fp-pro-react.d.ts", + "test:dts": "tsc --noEmit --isolatedModules dist/fp-react.d.ts", "docs": "typedoc src/index.ts --out docs" }, "files": [ diff --git a/vite.config.ts b/vite.config.ts index 8d4ea572..8275300f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ sourcemap: true, lib: { entry: 'src/index.ts', - fileName: 'fp-pro-react', + fileName: 'fp-react', formats: ['cjs', 'es'], }, rollupOptions: { From 1b6ca6ed1ceba7a155e4f28155bfa26e8cb09555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 15:53:38 +0100 Subject: [PATCH 32/49] refactor: rename `Fp` to `Fingerprint` in exports --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 07945d81..f7a90275 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import * as Fp from '@fingerprint/agent' +import * as Fingerprint from '@fingerprint/agent' export * from './fp-context' export * from './components/fp-provider' @@ -7,4 +7,4 @@ export * from './use-visitor-data' export * from './fp-context' export * from './query' -export { Fp } +export { Fingerprint } From 64c0c9c9d9991689aa9bae9334456809e311ab95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 16:51:59 +0100 Subject: [PATCH 33/49] refactor: replace `Fp` with `Fingerprint` in components, context, and exports --- README.md | 12 ++++++------ __tests__/fpjs-provider.test.tsx | 6 +++--- __tests__/helpers.tsx | 8 ++++---- .../src/in_memory_cache/InMemoryCache.tsx | 6 +++--- .../local_storage_cache/LocalStorageCache.tsx | 6 +++--- .../src/no_cache/WithoutCache.tsx | 6 +++--- .../SessionStorageCache.tsx | 6 +++--- examples/next-appDir/app/layout.tsx | 4 ++-- examples/next/pages/_app.tsx | 6 +++--- examples/preact/src/index.tsx | 6 +++--- examples/vite/src/main.tsx | 6 +++--- examples/webpack-based/src/index.js | 6 +++--- package.json | 14 +++++++------- ...{fp-provider.tsx => fingerprint-provider.tsx} | 16 ++++++++-------- src/{fp-context.ts => fingerprint-context.ts} | 6 +++--- src/index.ts | 6 +++--- src/use-visitor-data.ts | 6 +++--- vite.config.ts | 2 +- 18 files changed, 64 insertions(+), 64 deletions(-) rename src/components/{fp-provider.tsx => fingerprint-provider.tsx} (85%) rename src/{fp-context.ts => fingerprint-context.ts} (62%) diff --git a/README.md b/README.md index 6da298cf..097b08a7 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Fingerprint is a device intelligence platform offering industry-leading accuracy - [Requirements](#requirements) - [Installation](#installation) - [Getting started](#getting-started) - - [1. Wrap your application (or component) in ``.](#1-wrap-your-application-or-component-in-fpprovider) + - [1. Wrap your application (or component) in ``.](#1-wrap-your-application-or-component-in-FingerprintProvider) - [2. Use the `useVisitorData()` hook in your components to identify visitors](#2-use-the-usevisitordata-hook-in-your-components-to-identify-visitors) - [Linking and tagging information](#linking-and-tagging-information) - [Caching strategy](#caching-strategy) @@ -73,7 +73,7 @@ pnpm add @fingerprint/react In order to identify visitors, you'll need a Fingerprint Pro account (you can [sign up for free](https://dashboard.fingerprint.com/signup/)). To get your API key and get started, see the [Fingerprint Pro Quick Start Guide](https://docs.fingerprint.com/docs/quick-start-guide). -### 1. Wrap your application (or component) in ``. +### 1. Wrap your application (or component) in ``. - Set `apiKey` to your Fingerprint [Public API Key](https://dashboard.fingerprint.com/api-keys). - Set `region` if you have chosen a non-global [region](https://docs.fingerprint.com/docs/regions) during registration. @@ -85,20 +85,20 @@ To get your API key and get started, see the [Fingerprint Pro Quick Start Guide] import React from 'react' import ReactDOM from 'react-dom/client' import { - FpProvider, + FingerprintProvider, FingerprintJSPro, } from '@fingerprint/react' import App from './App' const root = ReactDOM.createRoot(document.getElementById('app')) -// supports the same options as `start()` function. +// supports the same options as `start()` function. root.render( - - + ) ``` diff --git a/__tests__/fpjs-provider.test.tsx b/__tests__/fpjs-provider.test.tsx index d054ebd8..ba301c15 100644 --- a/__tests__/fpjs-provider.test.tsx +++ b/__tests__/fpjs-provider.test.tsx @@ -1,6 +1,6 @@ import { useContext } from 'react' import { renderHook } from '@testing-library/react' -import { FpContext } from '../src' +import { FingerprintContext } from '../src' import { createWrapper, getDefaultLoadOptions } from './helpers' import { version } from '../package.json' import { describe, it, expect, vi } from 'vitest' @@ -10,7 +10,7 @@ vi.mock('@fingerprint/agent', { spy: true }) const mockStart = vi.mocked(agent.start) -describe('FpProvider', () => { +describe('FingerprintProvider', () => { it('should configure an instance of the Fp Agent', async () => { const loadOptions = getDefaultLoadOptions() const wrapper = createWrapper({ @@ -20,7 +20,7 @@ describe('FpProvider', () => { duration: 100, }, }) - renderHook(() => useContext(FpContext), { + renderHook(() => useContext(FingerprintContext), { wrapper, }) expect(mockStart).toHaveBeenCalledWith({ diff --git a/__tests__/helpers.tsx b/__tests__/helpers.tsx index d966b4ed..d799b015 100644 --- a/__tests__/helpers.tsx +++ b/__tests__/helpers.tsx @@ -1,5 +1,5 @@ import { PropsWithChildren } from 'react' -import { FpProvider, FpProviderOptions } from '../src' +import { FingerprintProvider, FingerprintProviderOptions } from '../src' import { act } from '@testing-library/react' export const getDefaultLoadOptions = () => ({ @@ -7,11 +7,11 @@ export const getDefaultLoadOptions = () => ({ }) export const createWrapper = - (providerProps: Partial = {}) => + (providerProps: Partial = {}) => ({ children }: PropsWithChildren<{}>) => ( - + {children} - + ) export const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) diff --git a/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx b/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx index 22d6dd91..0e552a59 100644 --- a/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx +++ b/examples/create-react-app/src/in_memory_cache/InMemoryCache.tsx @@ -1,11 +1,11 @@ -import { FpProvider } from '@fingerprint/react' +import { FingerprintProvider } from '@fingerprint/react' import { Outlet } from 'react-router-dom' import { FPJS_API_KEY } from '../shared/utils/env' import { Nav } from '../shared/components/Nav' function InMemoryCache() { return ( - +

Solution with an in-memory cache

@@ -16,7 +16,7 @@ function InMemoryCache() {
-
+ ) } diff --git a/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx b/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx index 16365c49..0524e684 100644 --- a/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx +++ b/examples/create-react-app/src/local_storage_cache/LocalStorageCache.tsx @@ -1,11 +1,11 @@ import { Outlet } from 'react-router-dom' import { Nav } from '../shared/components/Nav' import { FPJS_API_KEY } from '../shared/utils/env' -import { FpProvider } from '@fingerprint/react' +import { FingerprintProvider } from '@fingerprint/react' function LocalStorageCache() { return ( -
-
+ ) } diff --git a/examples/create-react-app/src/no_cache/WithoutCache.tsx b/examples/create-react-app/src/no_cache/WithoutCache.tsx index f699d7b2..829e8e2e 100644 --- a/examples/create-react-app/src/no_cache/WithoutCache.tsx +++ b/examples/create-react-app/src/no_cache/WithoutCache.tsx @@ -1,11 +1,11 @@ -import { FpProvider } from '@fingerprint/react' +import { FingerprintProvider } from '@fingerprint/react' import { Outlet } from 'react-router-dom' import { Nav } from '../shared/components/Nav' import { FPJS_API_KEY } from '../shared/utils/env' function WithoutCache() { return ( - +

Solution without cache

@@ -14,7 +14,7 @@ function WithoutCache() {
-
+ ) } diff --git a/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx b/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx index 3b58b40e..f76addca 100644 --- a/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx +++ b/examples/create-react-app/src/session_storage_cache/SessionStorageCache.tsx @@ -1,11 +1,11 @@ -import { FpProvider } from '@fingerprint/react' +import { FingerprintProvider } from '@fingerprint/react' import { Outlet } from 'react-router-dom' import { Nav } from '../shared/components/Nav' import { FPJS_API_KEY } from '../shared/utils/env' function SessionStorageCache() { return ( - +

Solution with a custom implementation of a session storage cache

@@ -14,7 +14,7 @@ function SessionStorageCache() {
-
+ ) } diff --git a/examples/next-appDir/app/layout.tsx b/examples/next-appDir/app/layout.tsx index 39143bee..2c913c8a 100644 --- a/examples/next-appDir/app/layout.tsx +++ b/examples/next-appDir/app/layout.tsx @@ -1,5 +1,5 @@ import '../styles/globals.css' -import { FpProvider } from '@fingerprint/react' +import { FingerprintProvider } from '@fingerprint/react' import { PropsWithChildren } from 'react' const fpjsPublicApiKey = process.env.NEXT_PUBLIC_FPJS_PUBLIC_API_KEY as string @@ -8,7 +8,7 @@ function RootLayout({ children }: PropsWithChildren) { return ( - {children} + {children} ) diff --git a/examples/next/pages/_app.tsx b/examples/next/pages/_app.tsx index 20c60587..f7aa0eaa 100644 --- a/examples/next/pages/_app.tsx +++ b/examples/next/pages/_app.tsx @@ -1,14 +1,14 @@ import '../styles/globals.css' import type { AppProps } from 'next/app' -import { FpProvider } from '@fingerprint/react' +import { FingerprintProvider } from '@fingerprint/react' const fpjsPublicApiKey = process.env.NEXT_PUBLIC_FPJS_PUBLIC_API_KEY as string function MyApp({ Component, pageProps }: AppProps) { return ( - + - + ) } diff --git a/examples/preact/src/index.tsx b/examples/preact/src/index.tsx index d6fb251e..ce1f5c1a 100644 --- a/examples/preact/src/index.tsx +++ b/examples/preact/src/index.tsx @@ -1,14 +1,14 @@ import { FunctionalComponent } from 'preact' import './style/index.css' import App from './components/app' -import { FpProvider } from '@fingerprint/react' +import { FingerprintProvider } from '@fingerprint/react' const WrappedApp: FunctionalComponent = () => { const apiKey = process.env.PREACT_APP_FPJS_PUBLIC_API_KEY as string return ( - + - + ) } diff --git a/examples/vite/src/main.tsx b/examples/vite/src/main.tsx index 284f2b9f..5d5114bc 100644 --- a/examples/vite/src/main.tsx +++ b/examples/vite/src/main.tsx @@ -2,14 +2,14 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import './index.css' import App from './App.tsx' -import { FpProvider } from '@fingerprint/react' +import { FingerprintProvider } from '@fingerprint/react' const apiKey = import.meta.env.VITE_FPJS_PUBLIC_API_KEY createRoot(document.getElementById('root')!).render( - + - + ) diff --git a/examples/webpack-based/src/index.js b/examples/webpack-based/src/index.js index ab46b008..3ba95769 100644 --- a/examples/webpack-based/src/index.js +++ b/examples/webpack-based/src/index.js @@ -1,6 +1,6 @@ import React from 'react' import { createRoot } from 'react-dom/client' -import { FpProvider } from '@fingerprint/react' +import { FingerprintProvider } from '@fingerprint/react' import App from './App' const rootElement = document.getElementById('root') @@ -9,8 +9,8 @@ const apiKey = process.env.REACT_APP_FPJS_PUBLIC_API_KEY root.render( - + - + ) diff --git a/package.json b/package.json index 6ad08738..0990db8f 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,14 @@ "name": "@fingerprint/react", "version": "3.0.0-test.2", "description": "FingerprintJS Pro React SDK", - "main": "dist/fp-react.js", - "module": "dist/fp-react.mjs", - "types": "dist/fp-react.d.ts", + "main": "dist/fingerprint-react.js", + "module": "dist/fingerprint-react.mjs", + "types": "dist/fingerprint-react.d.ts", "exports": { ".": { - "types": "./dist/fp-react.d.ts", - "import": "./dist/fp-react.mjs", - "require": "./dist/fp-react.js" + "types": "./dist/fingerprint-react.d.ts", + "import": "./dist/fingerprint-react.mjs", + "require": "./dist/fingerprint-react.js" } }, "keywords": [ @@ -35,7 +35,7 @@ "test": "vitest", "test:coverage": "vitest run --coverage", "test:coverage:diff": "vitest run --coverage --reporter json --outputFile.json=report.json", - "test:dts": "tsc --noEmit --isolatedModules dist/fp-react.d.ts", + "test:dts": "tsc --noEmit --isolatedModules dist/fingerprint-react.d.ts", "docs": "typedoc src/index.ts --out docs" }, "files": [ diff --git a/src/components/fp-provider.tsx b/src/components/fingerprint-provider.tsx similarity index 85% rename from src/components/fp-provider.tsx rename to src/components/fingerprint-provider.tsx index 0accc07d..9d26ad3b 100644 --- a/src/components/fp-provider.tsx +++ b/src/components/fingerprint-provider.tsx @@ -1,5 +1,5 @@ import { PropsWithChildren, useCallback, useEffect, useMemo, useRef } from 'react' -import { FpContext } from '../fp-context' +import { FingerprintContext } from '../fingerprint-context' import { Agent, GetOptions, start, StartOptions } from '@fingerprint/agent' import * as packageInfo from '../../package.json' import { isSSR } from '../ssr' @@ -7,7 +7,7 @@ import { WithEnvironment } from './with-environment' import type { EnvDetails } from '../env.types' import { usePromiseStore } from '../utils/use-promise-store' -export interface FpProviderOptions extends StartOptions { +export interface FingerprintProviderOptions extends StartOptions { /** * If set to `true`, will force the agent to be rebuilt with the new options. Should be used with caution * since it can be triggered too often (e.g. on every render) and negatively affect performance of the JS agent. @@ -18,11 +18,11 @@ export interface FpProviderOptions extends StartOptions { /** * @example * ```jsx - * * - * + * * ``` * * Provides the FpContext to its child components. @@ -31,7 +31,7 @@ export interface FpProviderOptions extends StartOptions { * This is just a wrapper around the actual provider. * For the implementation, see `ProviderWithEnv` component. */ -export function FpProvider(props: PropsWithChildren) { +export function FingerprintProvider(props: PropsWithChildren) { const propsWithEnv = props as PropsWithChildren return ( @@ -41,7 +41,7 @@ export function FpProvider(props: PropsWithChildren) { ) } -interface ProviderWithEnvProps extends FpProviderOptions { +interface ProviderWithEnvProps extends FingerprintProviderOptions { /** * Contains details about the env we're currently running in (e.g. framework, version) */ @@ -77,7 +77,7 @@ function ProviderWithEnv({ const getClient = useCallback(() => { if (isSSR()) { - throw new Error('FpProvider client cannot be used in SSR') + throw new Error('FingerprintProvider client cannot be used in SSR') } if (!clientRef.current) { @@ -117,5 +117,5 @@ function ProviderWithEnv({ } }, [forceRebuild, agentOptions, getOptions, createClient]) - return {children} + return {children} } diff --git a/src/fp-context.ts b/src/fingerprint-context.ts similarity index 62% rename from src/fp-context.ts rename to src/fingerprint-context.ts index 9460d4da..642799bc 100644 --- a/src/fp-context.ts +++ b/src/fingerprint-context.ts @@ -5,7 +5,7 @@ import { QueryResult } from './query' export type VisitorQueryResult = QueryResult const stub = (): never => { - throw new Error('You forgot to wrap your component in .') + throw new Error('You forgot to wrap your component in .') } const initialContext = { @@ -15,8 +15,8 @@ const initialContext = { /** * The Fingerprint Context */ -export interface FpContextInterface { +export interface FingerprintContextInterface { getVisitorData: (config?: GetOptions) => Promise } -export const FpContext = createContext(initialContext) +export const FingerprintContext = createContext(initialContext) diff --git a/src/index.ts b/src/index.ts index f7a90275..9d8a4a5d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,10 @@ import * as Fingerprint from '@fingerprint/agent' -export * from './fp-context' -export * from './components/fp-provider' +export * from './fingerprint-context' +export * from './components/fingerprint-provider' export * from './use-visitor-data' -export * from './fp-context' +export * from './fingerprint-context' export * from './query' export { Fingerprint } diff --git a/src/use-visitor-data.ts b/src/use-visitor-data.ts index 4b1c9515..cf1d917f 100644 --- a/src/use-visitor-data.ts +++ b/src/use-visitor-data.ts @@ -1,4 +1,4 @@ -import { FpContext, FpContextInterface, VisitorQueryResult } from './fp-context' +import { FingerprintContext, FingerprintContextInterface, VisitorQueryResult } from './fingerprint-context' import { useCallback, useContext, useEffect, useMemo, useState } from 'react' import deepEquals from 'fast-deep-equal' import { toError } from './utils/to-error' @@ -35,14 +35,14 @@ export type UseVisitorDataReturn = VisitorQueryResult & { * ``` * Use the `useVisitorData` hook in your components to perform identification requests with the Fingerprint API. The returned object contains information about loading status, errors, and visitor. * - * @param {UseVisitorDataOptions} options for the `fp.get()` request and for hook + * @param {UseVisitorDataOptions} options for the `agent.get()` request and for hook */ export function useVisitorData( { immediate, ...getOptions }: UseVisitorDataOptions = { immediate: true } ): UseVisitorDataReturn { assertIsTruthy(getOptions, 'getOptions') - const { getVisitorData } = useContext(FpContext) + const { getVisitorData } = useContext(FingerprintContext) const [currentGetOptions, setCurrentGetOptions] = useState(getOptions) const [queryState, setQueryState] = useState({ diff --git a/vite.config.ts b/vite.config.ts index 8275300f..4f39591e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ sourcemap: true, lib: { entry: 'src/index.ts', - fileName: 'fp-react', + fileName: 'fingerprint-react', formats: ['cjs', 'es'], }, rollupOptions: { From 6feb6beb22ff974130fc88710276ffd0268dd860 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 27 Jan 2026 16:17:29 +0000 Subject: [PATCH 34/49] chore(release): 3.0.0-test.3 [skip ci] ## [3.0.0-test.3](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.2...v3.0.0-test.3) (2026-01-27) ### Features * add usePromiseStore to prevent duplicate async requests ([fb59d7f](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/fb59d7fafc7890e29678e2dae53a9f8c549f0acf)) * rename package to `@fingerprint/react` ([4714fdf](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/4714fdf8526e1b62ab3ad4d84404672c02440da3)) ### Build System * **deps:** use stable 4.0.0 version of the @fingerprint/agent ([76a2fec](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/76a2fec8341cefdcfd323ca69ca80780d68a5c89)) --- CHANGELOG.md | 13 +++++++++++++ package.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd7a12a2..c43733b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## [3.0.0-test.3](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.2...v3.0.0-test.3) (2026-01-27) + + +### Features + +* add usePromiseStore to prevent duplicate async requests ([fb59d7f](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/fb59d7fafc7890e29678e2dae53a9f8c549f0acf)) +* rename package to `@fingerprint/react` ([4714fdf](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/4714fdf8526e1b62ab3ad4d84404672c02440da3)) + + +### Build System + +* **deps:** use stable 4.0.0 version of the @fingerprint/agent ([76a2fec](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/76a2fec8341cefdcfd323ca69ca80780d68a5c89)) + ## [3.0.0-test.2](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.1...v3.0.0-test.2) (2026-01-06) diff --git a/package.json b/package.json index 0990db8f..625f9d9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@fingerprint/react", - "version": "3.0.0-test.2", + "version": "3.0.0-test.3", "description": "FingerprintJS Pro React SDK", "main": "dist/fingerprint-react.js", "module": "dist/fingerprint-react.mjs", From 1957d6b0c8f2002afe2fea40d84b0777d23aa0b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 17:25:57 +0100 Subject: [PATCH 35/49] chore: revert pre-release version bump --- CHANGELOG.md | 13 ------------- package.json | 2 +- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c43733b5..fd7a12a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,3 @@ -## [3.0.0-test.3](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.2...v3.0.0-test.3) (2026-01-27) - - -### Features - -* add usePromiseStore to prevent duplicate async requests ([fb59d7f](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/fb59d7fafc7890e29678e2dae53a9f8c549f0acf)) -* rename package to `@fingerprint/react` ([4714fdf](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/4714fdf8526e1b62ab3ad4d84404672c02440da3)) - - -### Build System - -* **deps:** use stable 4.0.0 version of the @fingerprint/agent ([76a2fec](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/76a2fec8341cefdcfd323ca69ca80780d68a5c89)) - ## [3.0.0-test.2](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.1...v3.0.0-test.2) (2026-01-06) diff --git a/package.json b/package.json index 625f9d9d..0990db8f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@fingerprint/react", - "version": "3.0.0-test.3", + "version": "3.0.0-test.2", "description": "FingerprintJS Pro React SDK", "main": "dist/fingerprint-react.js", "module": "dist/fingerprint-react.mjs", From 90133076e3e890f2d0b2c1821583fc88aeeb50d6 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 27 Jan 2026 16:46:10 +0000 Subject: [PATCH 36/49] chore(release): 3.0.0-test.3 [skip ci] ## [3.0.0-test.3](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.2...v3.0.0-test.3) (2026-01-27) ### Features * add usePromiseStore to prevent duplicate async requests ([fb59d7f](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/fb59d7fafc7890e29678e2dae53a9f8c549f0acf)) * rename package to `@fingerprint/react` ([4714fdf](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/4714fdf8526e1b62ab3ad4d84404672c02440da3)) ### Build System * **deps:** use stable 4.0.0 version of the @fingerprint/agent ([76a2fec](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/76a2fec8341cefdcfd323ca69ca80780d68a5c89)) --- CHANGELOG.md | 13 +++++++++++++ package.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd7a12a2..c43733b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## [3.0.0-test.3](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.2...v3.0.0-test.3) (2026-01-27) + + +### Features + +* add usePromiseStore to prevent duplicate async requests ([fb59d7f](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/fb59d7fafc7890e29678e2dae53a9f8c549f0acf)) +* rename package to `@fingerprint/react` ([4714fdf](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/4714fdf8526e1b62ab3ad4d84404672c02440da3)) + + +### Build System + +* **deps:** use stable 4.0.0 version of the @fingerprint/agent ([76a2fec](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/76a2fec8341cefdcfd323ca69ca80780d68a5c89)) + ## [3.0.0-test.2](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.1...v3.0.0-test.2) (2026-01-06) diff --git a/package.json b/package.json index 0990db8f..625f9d9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@fingerprint/react", - "version": "3.0.0-test.2", + "version": "3.0.0-test.3", "description": "FingerprintJS Pro React SDK", "main": "dist/fingerprint-react.js", "module": "dist/fingerprint-react.mjs", From d2117dd3176c47279b8147ea53a4222e09b84d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 17:55:38 +0100 Subject: [PATCH 37/49] chore: revert pre-release version bump --- CHANGELOG.md | 13 ------------- package.json | 2 +- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c43733b5..fd7a12a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,3 @@ -## [3.0.0-test.3](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.2...v3.0.0-test.3) (2026-01-27) - - -### Features - -* add usePromiseStore to prevent duplicate async requests ([fb59d7f](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/fb59d7fafc7890e29678e2dae53a9f8c549f0acf)) -* rename package to `@fingerprint/react` ([4714fdf](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/4714fdf8526e1b62ab3ad4d84404672c02440da3)) - - -### Build System - -* **deps:** use stable 4.0.0 version of the @fingerprint/agent ([76a2fec](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/76a2fec8341cefdcfd323ca69ca80780d68a5c89)) - ## [3.0.0-test.2](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.1...v3.0.0-test.2) (2026-01-06) diff --git a/package.json b/package.json index 625f9d9d..0990db8f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@fingerprint/react", - "version": "3.0.0-test.3", + "version": "3.0.0-test.2", "description": "FingerprintJS Pro React SDK", "main": "dist/fingerprint-react.js", "module": "dist/fingerprint-react.mjs", From 2bffeff524ae301e313a3f15be449b349ba87a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Tue, 27 Jan 2026 17:55:46 +0100 Subject: [PATCH 38/49] chore: update package.json to set publishConfig access to public --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 0990db8f..e0a44cc4 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,9 @@ "main": "dist/fingerprint-react.js", "module": "dist/fingerprint-react.mjs", "types": "dist/fingerprint-react.d.ts", + "publishConfig": { + "access": "public" + }, "exports": { ".": { "types": "./dist/fingerprint-react.d.ts", From c8fad2d0acbac3ac47b015872c4940a1ee643de4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Wed, 28 Jan 2026 11:10:59 +0100 Subject: [PATCH 39/49] chore: add custom agent loader support --- src/components/fingerprint-provider.tsx | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/components/fingerprint-provider.tsx b/src/components/fingerprint-provider.tsx index 9d26ad3b..d49afe76 100644 --- a/src/components/fingerprint-provider.tsx +++ b/src/components/fingerprint-provider.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren, useCallback, useEffect, useMemo, useRef } from 'react' import { FingerprintContext } from '../fingerprint-context' -import { Agent, GetOptions, start, StartOptions } from '@fingerprint/agent' +import { Agent, GetOptions, start, StartOptions, default as Loader } from '@fingerprint/agent' import * as packageInfo from '../../package.json' import { isSSR } from '../ssr' import { WithEnvironment } from './with-environment' @@ -49,6 +49,18 @@ interface ProviderWithEnvProps extends FingerprintProviderOptions { getOptions?: GetOptions } +function isLoader(value: unknown): value is Pick { + return typeof value === 'object' && value !== null && 'start' in value && typeof value.start === 'function' +} + +function getCustomLoader(props: Record) { + if ('customAgent' in props && isLoader(props.customAgent)) { + return props.customAgent + } + + return undefined +} + function ProviderWithEnv({ children, forceRebuild, @@ -57,6 +69,8 @@ function ProviderWithEnv({ ...agentOptions }: PropsWithChildren) { const createClient = useCallback(() => { + const customLoader = getCustomLoader(agentOptions) + let integrationInfo = `react-sdk/${packageInfo.version}` if (env) { @@ -67,10 +81,12 @@ function ProviderWithEnv({ const mergedIntegrationInfo = [...(agentOptions.integrationInfo || []), integrationInfo] - return start({ + const startParams = { ...agentOptions, integrationInfo: mergedIntegrationInfo, - }) + } + + return customLoader ? customLoader.start(startParams) : start(startParams) }, [agentOptions, env]) const clientRef = useRef() From 7c4697d14ca133619db952b73310b96fd01be0ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Wed, 28 Jan 2026 13:26:36 +0100 Subject: [PATCH 40/49] refactor: remove extendedResult logic from examples --- examples/next-appDir/app/HomePage.tsx | 16 +++------------- examples/preact/src/components/app.tsx | 11 ----------- 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/examples/next-appDir/app/HomePage.tsx b/examples/next-appDir/app/HomePage.tsx index 46b38a8c..399424c3 100644 --- a/examples/next-appDir/app/HomePage.tsx +++ b/examples/next-appDir/app/HomePage.tsx @@ -2,18 +2,12 @@ import styles from '../styles/Home.module.css' import { useVisitorData } from '@fingerprint/react' -import { useState } from 'react' const HomePage = () => { - const [extendedResult, updateExtendedResult] = useState(false) - const { isLoading, error, data, getData } = useVisitorData({ extendedResult }, { immediate: true }) + const { isLoading, error, data, getData } = useVisitorData({ immediate: true }) const reloadData = () => { - getData({ ignoreCache: true }) - } - - const onChangeExtendedResult = (e: React.ChangeEvent) => { - updateExtendedResult(e.target.checked) + getData({}) } return ( @@ -33,13 +27,9 @@ const HomePage = () => { -

- VisitorId: {isLoading ? 'Loading...' : data?.visitorId} + VisitorId: {isLoading ? 'Loading...' : data?.visitor_id}

Full visitor data:

{error ? error.message : JSON.stringify(data, null, 2)}
diff --git a/examples/preact/src/components/app.tsx b/examples/preact/src/components/app.tsx index 28939f2f..7c0c4485 100644 --- a/examples/preact/src/components/app.tsx +++ b/examples/preact/src/components/app.tsx @@ -1,20 +1,13 @@ import { FunctionalComponent } from 'preact' import { useVisitorData } from '@fingerprint/react' -import { useState } from 'preact/hooks' -import { JSX } from 'preact/compat' const App: FunctionalComponent = () => { - const [extendedResult, updateExtendedResult] = useState(false) const { isLoading, error, data, getData } = useVisitorData({ immediate: true }) const reloadData = (): void => { getData() } - const onChangeExtendedResult = (e: JSX.TargetedEvent): void => { - updateExtendedResult((e.target as HTMLInputElement).checked) - } - return (

FingerprintJS Pro Preact Demo

@@ -32,10 +25,6 @@ const App: FunctionalComponent = () => { -

VisitorId: {isLoading ? 'Loading...' : data?.visitor_id} From cf939ff87d92271a1c6b7fb93075ffc1a8f36c2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Wed, 28 Jan 2026 13:27:17 +0100 Subject: [PATCH 41/49] chore: remove pre-release changelog notes --- CHANGELOG.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd7a12a2..388922b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,21 +1,3 @@ -## [3.0.0-test.2](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v3.0.0-test.1...v3.0.0-test.2) (2026-01-06) - - -### Features - -* bump @fingerprint/agent to 4.0.0-beta.5 ([c5d217d](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/c5d217d36c08fddcf955e2f4b198ff5e37320f4f)) - -## [3.0.0-test.1](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v2.7.1...v3.0.0-test.1) (2025-12-19) - - -### ⚠ BREAKING CHANGES - -* The SDK api has changed to match changes introduced in V4 version of the agent. - -### Features - -* migrate to v4 version of the agent ([36a26ba](https://github.com/fingerprintjs/fingerprintjs-pro-react/commit/36a26ba6a2c035e1b3b8dc52b8371a3ed1883b7b)) - ## [2.7.1](https://github.com/fingerprintjs/fingerprintjs-pro-react/compare/v2.7.0...v2.7.1) (2025-09-15) From 1c4c87778aa9e1f87b3c021c231bffa795d8dcc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Wed, 28 Jan 2026 14:38:08 +0100 Subject: [PATCH 42/49] chore: enable trusted publishing in release workflow --- .github/workflows/release.yml | 1 + .releaserc | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6ccec65e..17b6b4b4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,6 +11,7 @@ jobs: uses: fingerprintjs/dx-team-toolkit/.github/workflows/release-typescript-project.yml@v1 with: appId: ${{ vars.APP_ID }} + useTrustedPublishing: true secrets: APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }} NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} diff --git a/.releaserc b/.releaserc index bef5c32c..d589bfbd 100644 --- a/.releaserc +++ b/.releaserc @@ -21,7 +21,12 @@ } ], "@semantic-release/changelog", - "@semantic-release/npm", + [ + "@semantic-release/npm", + { + "npmPublish": false + } + ], [ "@semantic-release/exec", { From aa7c5cd3554b0cccb75d50bfc15f9b0d436f18de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Thu, 29 Jan 2026 10:57:31 +0100 Subject: [PATCH 43/49] chore: update README title to "Fingerprint React" --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 097b08a7..c05faf5a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Discord server

-# Fingerprint Pro React +# Fingerprint React Fingerprint is a device intelligence platform offering industry-leading accuracy. Fingerprint Pro React SDK is an easy way to integrate **[Fingerprint Pro](https://fingerprint.com/)** into your React application. It's also compatible with Next.js and Preact. See application demos in the [examples](https://github.com/fingerprintjs/fingerprintjs-pro-react/tree/main/examples) folder. From 1cf76024e4c4586da466dda64b78e9fd8f5607b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Thu, 29 Jan 2026 10:58:05 +0100 Subject: [PATCH 44/49] chore: update README URLs to reflect repository rename to "react" --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c05faf5a..c10895db 100644 --- a/README.md +++ b/README.md @@ -8,18 +8,18 @@

- CI badge - coverage + CI badge + coverage Current NPM version Monthly downloads from NPM MIT license Discord server - Discord server + Discord server

# Fingerprint React -Fingerprint is a device intelligence platform offering industry-leading accuracy. Fingerprint Pro React SDK is an easy way to integrate **[Fingerprint Pro](https://fingerprint.com/)** into your React application. It's also compatible with Next.js and Preact. See application demos in the [examples](https://github.com/fingerprintjs/fingerprintjs-pro-react/tree/main/examples) folder. +Fingerprint is a device intelligence platform offering industry-leading accuracy. Fingerprint Pro React SDK is an easy way to integrate **[Fingerprint Pro](https://fingerprint.com/)** into your React application. It's also compatible with Next.js and Preact. See application demos in the [examples](https://github.com/fingerprintjs/react/tree/main/examples) folder. ## Table of contents @@ -213,12 +213,12 @@ The `getData` function throws errors directly from the JS Agent without changing ## API Reference -See the full [generated API reference](https://fingerprintjs.github.io/fingerprintjs-pro-react/). +See the full [generated API reference](https://fingerprintjs.github.io/react/). ## Support and feedback -To ask questions or provide feedback, use [Issues](https://github.com/fingerprintjs/fingerprintjs-pro-react/issues). If you need private support, please email us at `oss-support@fingerprint.com`. If you'd like to have a similar React wrapper for the [source-availalbe FingerprintJS](https://github.com/fingerprintjs/fingerprintjs), consider creating an issue in the main [FingerprintJS repository](https://github.com/fingerprintjs/fingerprintjs/issues). +To ask questions or provide feedback, use [Issues](https://github.com/fingerprintjs/react/issues). If you need private support, please email us at `oss-support@fingerprint.com`. If you'd like to have a similar React wrapper for the [source-availalbe FingerprintJS](https://github.com/fingerprintjs/fingerprintjs), consider creating an issue in the main [FingerprintJS repository](https://github.com/fingerprintjs/fingerprintjs/issues). ## License -This project is licensed under the MIT license. See the [LICENSE](https://github.com/fingerprintjs/fingerprintjs-pro-react/blob/main/LICENSE) file for more info. +This project is licensed under the MIT license. See the [LICENSE](https://github.com/fingerprintjs/react/blob/main/LICENSE) file for more info. From 6e9b8aaf747cc129dde95df5584f117603461a8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Thu, 29 Jan 2026 10:59:07 +0100 Subject: [PATCH 45/49] chore: update contributing guide to reflect repository rename to "Fingerprint React" --- contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing.md b/contributing.md index d54a17b6..d1a9f0e6 100644 --- a/contributing.md +++ b/contributing.md @@ -1,4 +1,4 @@ -# Contributing to FingerprintJS Pro React integration +# Contributing to Fingerprint React integration ## Working with code From 45e78af8db65ae2b9ea0d8473c4313d9c48ef094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Thu, 29 Jan 2026 11:00:13 +0100 Subject: [PATCH 46/49] chore: update README references to "Fingerprint React" for consistency --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c10895db..b2dd8a62 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,12 @@ # Fingerprint React -Fingerprint is a device intelligence platform offering industry-leading accuracy. Fingerprint Pro React SDK is an easy way to integrate **[Fingerprint Pro](https://fingerprint.com/)** into your React application. It's also compatible with Next.js and Preact. See application demos in the [examples](https://github.com/fingerprintjs/react/tree/main/examples) folder. +Fingerprint is a device intelligence platform offering industry-leading accuracy. Fingerprint React SDK is an easy way to integrate **[Fingerprint](https://fingerprint.com/)** into your React application. It's also compatible with Next.js and Preact. See application demos in the [examples](https://github.com/fingerprintjs/react/tree/main/examples) folder. ## Table of contents -- [Fingerprint Pro React](#fingerprint-pro-react) +- [Fingerprint React](#fingerprint-react) - [Table of contents](#table-of-contents) - [Requirements](#requirements) - [Installation](#installation) From fef9d9171387517a35590d2f24bd3c463953d737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Thu, 29 Jan 2026 11:01:58 +0100 Subject: [PATCH 47/49] chore: update contributing guide to clarify package name as "@fingerprint/react" --- contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing.md b/contributing.md index d1a9f0e6..27d99486 100644 --- a/contributing.md +++ b/contributing.md @@ -16,7 +16,7 @@ There are 4 demo pages for this integration: 4. In `/examples/preact` folder. It is a demo built with Preact. You can find more info about configuration and starting demo in the [readme](examples/preact/README.md). 5. In `/examples/webpack-based` folder. It is a simple demo built with raw webpack. -❗ Build projects before testing integration. First build `fingerprintjs-pro-react`, and then start any of the example apps. +❗ Build projects before testing integration. First build the `@fingerprint/react` package, and then start any of the example apps. ### How to build From 353e20b3a8d4f015ba5ae87c64f16dfa09fa199b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Thu, 29 Jan 2026 11:36:40 +0100 Subject: [PATCH 48/49] chore: update README to replace "Fingerprint Pro" with "Fingerprint" --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b2dd8a62..2ed85568 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Fingerprint is a device intelligence platform offering industry-leading accuracy - For Typescript users: Typescript 4.8 or higher > [!NOTE] -> This package assumes you have a Fingerprint Pro subscription or trial, it is not compatible with the [source-available FingerprintJS](https://github.com/fingerprintjs/fingerprintjs). See our documentation to learn more about the [differences between Fingerprint Pro and FingerprintJS](https://docs.fingerprint.com/docs/identification-vs-fingerprintjs). +> This package assumes you have a Fingerprint subscription or trial, it is not compatible with the [source-available FingerprintJS](https://github.com/fingerprintjs/fingerprintjs). See our documentation to learn more about the [differences between Fingerprint and FingerprintJS](https://docs.fingerprint.com/docs/identification-vs-fingerprintjs). ## Installation @@ -70,8 +70,8 @@ pnpm add @fingerprint/react ## Getting started -In order to identify visitors, you'll need a Fingerprint Pro account (you can [sign up for free](https://dashboard.fingerprint.com/signup/)). -To get your API key and get started, see the [Fingerprint Pro Quick Start Guide](https://docs.fingerprint.com/docs/quick-start-guide). +In order to identify visitors, you'll need a Fingerprint account (you can [sign up for free](https://dashboard.fingerprint.com/signup/)). +To get your API key and get started, see the [Fingerprint Quick Start Guide](https://docs.fingerprint.com/docs/quick-start-guide). ### 1. Wrap your application (or component) in ``. From c8eca763515b8aaa00d97b32e95935bbc57b2c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20=C5=BBydek?= Date: Thu, 29 Jan 2026 12:34:02 +0100 Subject: [PATCH 49/49] refactor: update VisitorDataPresenter to use Fingerprint.GetResult and display sealed results --- .../src/shared/components/VisitorDataPresenter.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx b/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx index cf270bac..7737d200 100644 --- a/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx +++ b/examples/create-react-app/src/shared/components/VisitorDataPresenter.tsx @@ -1,6 +1,14 @@ -import { GetResult } from '@fingerprint/react' +import { Fingerprint } from '@fingerprint/react' -function VisitorDataPresenter({ data, isLoading, error }: { data?: GetResult; isLoading?: boolean; error?: Error }) { +function VisitorDataPresenter({ + data, + isLoading, + error, +}: { + data?: Fingerprint.GetResult + isLoading?: boolean + error?: Error +}) { if (error) { return

An error occurred: {error.message}

}