diff --git a/.ts-prunerc b/.ts-prunerc new file mode 100644 index 0000000000..c81f365e37 --- /dev/null +++ b/.ts-prunerc @@ -0,0 +1,4 @@ +{ + "project": "tsconfig.json", + "ignore": "(^generated/|^src/generated/|\\.test\\.|\\.spec\\.|/__tests__/|/stories/|^src/middleware\\.ts|/route\\.(ts|tsx)$|^src/(app|pages)/)" +} diff --git a/.unimportedrc.json b/.unimportedrc.json new file mode 100644 index 0000000000..79134b889a --- /dev/null +++ b/.unimportedrc.json @@ -0,0 +1,22 @@ +{ + "entry": [ + "src/app/**/page.{ts,tsx,js,jsx}", + "src/app/**/layout.{ts,tsx,js,jsx}", + "src/app/**/route.{ts,tsx,js,jsx}", + "src/pages/**/*.{ts,tsx,js,jsx}", + "src/middleware.ts", + "scripts/**/*.{ts,js,cjs,mjs}" + ], + "extensions": [".ts", ".tsx", ".js", ".jsx"], + "ignorePatterns": [ + "**/.next/**", + "coverage/**", + "generated/**", + "tmp_gen_outp/**" + ], + "aliases": { "@/*": ["./src/*"] }, + "rootDir": ".", + "respectGitignore": true, + "scannedDirs": ["src", "app", "pages", "components", "lib", "hooks", "scripts"] + } + \ No newline at end of file diff --git a/__tests__/app/api/farcaster.route.test.ts b/__tests__/app/api/farcaster.route.test.ts index 9e0283e45a..d65326d6b2 100644 --- a/__tests__/app/api/farcaster.route.test.ts +++ b/__tests__/app/api/farcaster.route.test.ts @@ -45,7 +45,7 @@ const UrlGuardError = MockUrlGuardError; const originalFetch = global.fetch; const mockFetch = jest.fn(); -let GET: typeof import("../../app/api/farcaster/route").GET; +let GET: typeof import("@/app/api/farcaster/route").GET; const resetUrlGuardMocks = () => { parsePublicUrlMock.mockReset(); @@ -58,7 +58,7 @@ const resetUrlGuardMocks = () => { const loadRoute = async () => { jest.resetModules(); resetUrlGuardMocks(); - ({ GET } = await import("../../../app/api/farcaster/route")); + ({ GET } = await import("@/app/api/farcaster/route")); }; describe("farcaster API route", () => { diff --git a/__tests__/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTable.test.tsx b/__tests__/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTable.test.tsx index 25f6aa1a1a..68f3c8ac59 100644 --- a/__tests__/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTable.test.tsx +++ b/__tests__/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTable.test.tsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react'; import React from 'react'; -import ReviewDistributionPlanTable from 'components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTable'; -import { DistributionPlanToolContext } from 'components/distribution-plan-tool/DistributionPlanToolContext'; +import ReviewDistributionPlanTable from '@/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTable'; +import { DistributionPlanToolContext } from '@/components/distribution-plan-tool/DistributionPlanToolContext'; const headerMock = jest.fn(() =>
); const bodyMock = jest.fn(() =>
); diff --git a/__tests__/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTableRow.test.tsx b/__tests__/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTableRow.test.tsx index 11164e6a99..d4ef72168b 100644 --- a/__tests__/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTableRow.test.tsx +++ b/__tests__/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTableRow.test.tsx @@ -1,10 +1,10 @@ import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; -import ReviewDistributionPlanTableRow from 'components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTableRow'; -import { DistributionPlanToolContext } from 'components/distribution-plan-tool/DistributionPlanToolContext'; -import { ReviewDistributionPlanTableItemType } from 'components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTable'; -import { distributionPlanApiFetch } from 'services/distribution-plan-api'; +import ReviewDistributionPlanTableRow from '@/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTableRow'; +import { DistributionPlanToolContext } from '@/components/distribution-plan-tool/DistributionPlanToolContext'; +import { ReviewDistributionPlanTableItemType } from '@/components/distribution-plan-tool/review-distribution-plan/table/ReviewDistributionPlanTable'; +import { distributionPlanApiFetch } from '@/services/distribution-plan-api'; jest.mock('services/distribution-plan-api', () => ({ distributionPlanApiFetch: jest.fn(async () => ({ success: true, data: [{ wallet: '0x1', amount: 1, phaseId: 'p1', phaseComponentId: 'c1' }] })) diff --git a/__tests__/components/drops/create/lexical/plugins/mentions/MentionsTypeaheadMenu.test.tsx b/__tests__/components/drops/create/lexical/plugins/mentions/MentionsTypeaheadMenu.test.tsx index 90432346a1..135e3513ef 100644 --- a/__tests__/components/drops/create/lexical/plugins/mentions/MentionsTypeaheadMenu.test.tsx +++ b/__tests__/components/drops/create/lexical/plugins/mentions/MentionsTypeaheadMenu.test.tsx @@ -5,7 +5,7 @@ jest.mock('react-use', () => ({ useKeyPressEvent: mockUseKeyPressEvent })); -import MentionsTypeaheadMenu from 'components/drops/create/lexical/plugins/mentions/MentionsTypeaheadMenu'; +import MentionsTypeaheadMenu from '@/components/drops/create/lexical/plugins/mentions/MentionsTypeaheadMenu'; const options = [{ key: '1', label: 'one' }]; diff --git a/__tests__/components/drops/view/part/dropPartMarkdown/linkHandlersRegistry.test.tsx b/__tests__/components/drops/view/part/dropPartMarkdown/linkHandlersRegistry.test.tsx index f3fbd3b673..8f11d1276a 100644 --- a/__tests__/components/drops/view/part/dropPartMarkdown/linkHandlersRegistry.test.tsx +++ b/__tests__/components/drops/view/part/dropPartMarkdown/linkHandlersRegistry.test.tsx @@ -30,7 +30,6 @@ jest.mock("@/components/drops/view/part/dropPartMarkdown/renderers", () => ({ renderTweetEmbed: jest.fn((href: string) => (
)), - TweetFallback: () => null, })); jest.mock("@/src/components/waves/ArtBlocksTokenCard", () => ({ diff --git a/__tests__/components/groups/page/create/config/wallets/CreateGroupWalletsEmma.test.tsx b/__tests__/components/groups/page/create/config/wallets/CreateGroupWalletsEmma.test.tsx index 2feec809b9..23304d1e38 100644 --- a/__tests__/components/groups/page/create/config/wallets/CreateGroupWalletsEmma.test.tsx +++ b/__tests__/components/groups/page/create/config/wallets/CreateGroupWalletsEmma.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; -import CreateGroupWalletsEmma from 'components/groups/page/create/config/wallets/CreateGroupWalletsEmma'; -import { AuthContext } from 'components/auth/Auth'; +import CreateGroupWalletsEmma from '@/components/groups/page/create/config/wallets/CreateGroupWalletsEmma'; +import { AuthContext } from '@/components/auth/Auth'; jest.mock('components/utils/input/emma/EmmaListSearch', () => ({ __esModule: true, diff --git a/__tests__/components/groups/page/list/card/utils/GroupCardActionStats.test.tsx b/__tests__/components/groups/page/list/card/utils/GroupCardActionStats.test.tsx index 7fc8d702ab..24e8c3dc46 100644 --- a/__tests__/components/groups/page/list/card/utils/GroupCardActionStats.test.tsx +++ b/__tests__/components/groups/page/list/card/utils/GroupCardActionStats.test.tsx @@ -1,9 +1,9 @@ import { render, screen } from '@testing-library/react'; import React from 'react'; -import GroupCardActionStats from 'components/groups/page/list/card/utils/GroupCardActionStats'; -import { AuthContext } from 'components/auth/Auth'; +import GroupCardActionStats from '@/components/groups/page/list/card/utils/GroupCardActionStats'; +import { AuthContext } from '@/components/auth/Auth'; import { useQuery } from '@tanstack/react-query'; -import { ApiRateMatter } from 'generated/models/ApiRateMatter'; +import { ApiRateMatter } from '@/generated/models/ApiRateMatter'; jest.mock('@tanstack/react-query', () => ({ useQuery: jest.fn() })); jest.mock('components/distribution-plan-tool/common/CircleLoader', () => ({ diff --git a/__tests__/components/memes/drops/meme-participation-drop/MemeDropVoteStats.test.tsx b/__tests__/components/memes/drops/meme-participation-drop/MemeDropVoteStats.test.tsx index 59fa73e1c4..895ae0ab89 100644 --- a/__tests__/components/memes/drops/meme-participation-drop/MemeDropVoteStats.test.tsx +++ b/__tests__/components/memes/drops/meme-participation-drop/MemeDropVoteStats.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import MemeDropVoteStats from '@/components/memes/drops/meme-participation-drop/MemeDropVoteStats'; -import { ApiDropRater } from '@/__tests__/generated/models/ApiDropRater'; +import { ApiDropRater } from '@/generated/models/ApiDropRater'; jest.mock('next/link', () => ({__esModule:true, default: ({href,children}:any) => {children}})); diff --git a/__tests__/components/providers/AppKitAdapterManager.test.ts b/__tests__/components/providers/AppKitAdapterManager.test.ts index 6170b0f57c..8ae2ac14b0 100644 --- a/__tests__/components/providers/AppKitAdapterManager.test.ts +++ b/__tests__/components/providers/AppKitAdapterManager.test.ts @@ -4,6 +4,9 @@ import { WalletValidationError } from '@/src/errors/wallet-validation' import { AppWallet } from '@/components/app-wallets/AppWalletsContext' import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' +const VALID_PRIVATE_KEY = + '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' + // Jest helper const fail = (message?: string): never => { throw new Error(message || 'Test failed') @@ -29,7 +32,7 @@ describe('AppKitAdapterManager', () => { name: 'Test Wallet', created_at: Date.now(), mnemonic: '', - private_key: '', + private_key: VALID_PRIVATE_KEY, imported: false } @@ -49,7 +52,7 @@ describe('AppKitAdapterManager', () => { name: 'Test Wallet 2', created_at: Date.now(), mnemonic: '', - private_key: '', + private_key: VALID_PRIVATE_KEY, imported: false } @@ -127,12 +130,13 @@ describe('AppKitAdapterManager', () => { }) it('should validate mnemonic format without exposing content', () => { - const walletWithValidMnemonic = { - address: '0x742D35A1CbF05C7A56C1Bf2dF5e8Dd6cf0DA8c4c', - address_hashed: 'hash123456789012345678901234567890123456789012345678901234567890', - name: 'Test', - mnemonic: 'word1 word2 word3' // Valid mnemonic with proper words - } + const walletWithValidMnemonic = { + address: '0x742D35A1CbF05C7A56C1Bf2dF5e8Dd6cf0DA8c4c', + address_hashed: 'hash123456789012345678901234567890123456789012345678901234567890', + name: 'Test', + mnemonic: 'word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12', + private_key: VALID_PRIVATE_KEY + } // Current implementation only validates empty words, which won't occur with split(/\s+/) // So any mnemonic with actual words should pass @@ -169,12 +173,13 @@ describe('AppKitAdapterManager', () => { }) it('should throw WalletSecurityError for invalid mnemonic type', () => { - const walletWithInvalidMnemonicType = { - address: '0x742D35A1CbF05C7A56C1Bf2dF5e8Dd6cf0DA8c4c', - address_hashed: 'hash123456789012345678901234567890123456789012345678901234567890', - name: 'Test Wallet', - mnemonic: 123 - } as any + const walletWithInvalidMnemonicType = { + address: '0x742D35A1CbF05C7A56C1Bf2dF5e8Dd6cf0DA8c4c', + address_hashed: 'hash123456789012345678901234567890123456789012345678901234567890', + name: 'Test Wallet', + mnemonic: 123, + private_key: VALID_PRIVATE_KEY + } as any expect(() => manager.createAdapter([walletWithInvalidMnemonicType])) .toThrow(WalletValidationError) @@ -183,12 +188,14 @@ describe('AppKitAdapterManager', () => { }) it('should accept mnemonic with multiple spaces between words', () => { - const walletWithSpacedMnemonic = { - address: '0x742D35A1CbF05C7A56C1Bf2dF5e8Dd6cf0DA8c4c', - address_hashed: 'hash123456789012345678901234567890123456789012345678901234567890', - name: 'Test Wallet', - mnemonic: 'word1 word2 word3' // Multiple spaces between words - should be normalized - } as AppWallet + const walletWithSpacedMnemonic = { + address: '0x742D35A1CbF05C7A56C1Bf2dF5e8Dd6cf0DA8c4c', + address_hashed: 'hash123456789012345678901234567890123456789012345678901234567890', + name: 'Test Wallet', + mnemonic: + 'word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12', + private_key: VALID_PRIVATE_KEY + } as AppWallet // Current implementation trims and splits by /\s+/ which handles multiple spaces correctly expect(() => manager.createAdapter([walletWithSpacedMnemonic])) @@ -592,7 +599,7 @@ describe('AppKitAdapterManager', () => { name: `Wallet ${i}`, created_at: Date.now(), mnemonic: '', - private_key: '', + private_key: VALID_PRIVATE_KEY, imported: false } manager.createAdapterWithCache([wallet]) @@ -651,7 +658,7 @@ describe('AppKitAdapterManager', () => { name: 'Test Wallet', created_at: Date.now(), mnemonic: '', - private_key: '', + private_key: VALID_PRIVATE_KEY, imported: false } as AppWallet @@ -683,7 +690,7 @@ describe('AppKitAdapterManager', () => { name: 'Test Wallet', created_at: Date.now(), mnemonic: 'word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12', - private_key: '', + private_key: VALID_PRIVATE_KEY, imported: false } as AppWallet @@ -692,4 +699,4 @@ describe('AppKitAdapterManager', () => { expect(adapter).toBeDefined() }) }) -}) \ No newline at end of file +}) diff --git a/__tests__/components/user/identity/statements/add/UserPageIdentityAddStatements.test.tsx b/__tests__/components/user/identity/statements/add/UserPageIdentityAddStatements.test.tsx index 84072e8975..f466f395df 100644 --- a/__tests__/components/user/identity/statements/add/UserPageIdentityAddStatements.test.tsx +++ b/__tests__/components/user/identity/statements/add/UserPageIdentityAddStatements.test.tsx @@ -1,7 +1,7 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import UserPageIdentityAddStatements, { STATEMENT_ADD_VIEW } from "@/components/user/identity/statements/add/UserPageIdentityAddStatements"; -import { ApiIdentity } from '@/__tests__/generated/models/ApiIdentity'; +import { ApiIdentity } from '@/generated/models/ApiIdentity'; let clickAway: () => void; let escapeCb: () => void; diff --git a/__tests__/components/utils/CommonFilterTargetSelect.test.tsx b/__tests__/components/utils/CommonFilterTargetSelect.test.tsx index 8d4082f170..1b4fe3e9d7 100644 --- a/__tests__/components/utils/CommonFilterTargetSelect.test.tsx +++ b/__tests__/components/utils/CommonFilterTargetSelect.test.tsx @@ -1,8 +1,7 @@ -import CommonFilterTargetSelect, { - FilterTargetType, -} from "@/components/utils/CommonFilterTargetSelect"; +import CommonFilterTargetSelect from "@/components/utils/CommonFilterTargetSelect"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; +import { ProfileActivityFilterTargetType } from "@/enums"; describe("CommonFilterTargetSelect", () => { it("renders the filter target options and triggers change on click", async () => { @@ -11,7 +10,7 @@ describe("CommonFilterTargetSelect", () => { render( ); @@ -24,7 +23,9 @@ describe("CommonFilterTargetSelect", () => { await user.click(screen.getByLabelText("Outgoing")); - expect(onChange).toHaveBeenCalledWith(FilterTargetType.OUTGOING); + expect(onChange).toHaveBeenCalledWith( + ProfileActivityFilterTargetType.OUTGOING + ); }); it("supports keyboard navigation between targets", async () => { @@ -33,7 +34,7 @@ describe("CommonFilterTargetSelect", () => { const { rerender } = render( ); @@ -45,13 +46,15 @@ describe("CommonFilterTargetSelect", () => { await user.keyboard("{ArrowRight}"); - expect(onChange).toHaveBeenCalledWith(FilterTargetType.OUTGOING); + expect(onChange).toHaveBeenCalledWith( + ProfileActivityFilterTargetType.OUTGOING + ); onChange.mockClear(); rerender( ); @@ -62,6 +65,8 @@ describe("CommonFilterTargetSelect", () => { await user.keyboard("{ArrowLeft}"); - expect(onChange).toHaveBeenCalledWith(FilterTargetType.ALL); + expect(onChange).toHaveBeenCalledWith( + ProfileActivityFilterTargetType.ALL + ); }); }); diff --git a/__tests__/components/waves/CreateDropReplying.test.tsx b/__tests__/components/waves/CreateDropReplying.test.tsx index b47e694515..fac3c9c76f 100644 --- a/__tests__/components/waves/CreateDropReplying.test.tsx +++ b/__tests__/components/waves/CreateDropReplying.test.tsx @@ -1,7 +1,7 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import CreateDropReplying from '@/components/waves/CreateDropReplying'; -import { ApiDrop } from '@/__tests__/generated/models/ApiDrop'; +import { ApiDrop } from '@/generated/models/ApiDrop'; import { ActiveDropAction } from '@/types/dropInteractionTypes'; describe('CreateDropReplying', () => { diff --git a/__tests__/components/waves/WaveDropQuoteWithSerialNo.test.tsx b/__tests__/components/waves/WaveDropQuoteWithSerialNo.test.tsx index 4e63e52229..162ecc3eb6 100644 --- a/__tests__/components/waves/WaveDropQuoteWithSerialNo.test.tsx +++ b/__tests__/components/waves/WaveDropQuoteWithSerialNo.test.tsx @@ -32,7 +32,7 @@ describe('WaveDropQuoteWithSerialNo', () => { limit: 1, dropId: null, serialNo: 5, - strategy: WaveDropsSearchStrategy.FIND_BOTH, + strategy: WaveDropsSearchStrategy.Both, }, ], queryFn: expect.any(Function), diff --git a/__tests__/components/waves/drops/winner/WinnerDropBadge.test.tsx b/__tests__/components/waves/drops/winner/WinnerDropBadge.test.tsx index d204ba0554..a2d7d22151 100644 --- a/__tests__/components/waves/drops/winner/WinnerDropBadge.test.tsx +++ b/__tests__/components/waves/drops/winner/WinnerDropBadge.test.tsx @@ -1,5 +1,5 @@ import { render } from '@testing-library/react'; -import WinnerDropBadge from 'components/waves/drops/winner/WinnerDropBadge'; +import WinnerDropBadge from '@/components/waves/drops/winner/WinnerDropBadge'; describe('WinnerDropBadge', () => { it('returns null when no rank or position', () => { diff --git a/__tests__/components/waves/memes/traits/DropdownTrait.test.tsx b/__tests__/components/waves/memes/traits/DropdownTrait.test.tsx index f145a4a92f..9ea4336012 100644 --- a/__tests__/components/waves/memes/traits/DropdownTrait.test.tsx +++ b/__tests__/components/waves/memes/traits/DropdownTrait.test.tsx @@ -1,5 +1,5 @@ import { render, screen, fireEvent } from '@testing-library/react'; -import { DropdownTrait } from 'components/waves/memes/traits/DropdownTrait'; +import { DropdownTrait } from '@/components/waves/memes/traits/DropdownTrait'; jest.mock('components/waves/memes/traits/TraitWrapper', () => ({ TraitWrapper: ({ children }: any) =>
{children}
diff --git a/__tests__/components/waves/winners/drops/DefaultWaveWinnerDrop.test.tsx b/__tests__/components/waves/winners/drops/DefaultWaveWinnerDrop.test.tsx index 98eafe0ddc..acc9ec2251 100644 --- a/__tests__/components/waves/winners/drops/DefaultWaveWinnerDrop.test.tsx +++ b/__tests__/components/waves/winners/drops/DefaultWaveWinnerDrop.test.tsx @@ -1,4 +1,4 @@ -import * as mod from 'components/waves/winners/drops/DefaultWaveWinnerDrop'; +import * as mod from '@/components/waves/winners/drops/DefaultWaveWinnerDrop'; describe('DefaultWaveWinnerDrop module', () => { it('exports component', () => { diff --git a/__tests__/fixtures/gradientFixtures.ts b/__tests__/fixtures/gradientFixtures.ts index c7db46c78a..eb6ed8029c 100644 --- a/__tests__/fixtures/gradientFixtures.ts +++ b/__tests__/fixtures/gradientFixtures.ts @@ -1,6 +1,6 @@ import { GRADIENT_CONTRACT } from '@/constants'; -export const mockGradientNFT = (overrides: Partial = {}) => ({ +const mockGradientNFT = (overrides: Partial = {}) => ({ id: 1, contract: GRADIENT_CONTRACT, name: 'Gradient #1', diff --git a/__tests__/helpers/time.types.test.ts b/__tests__/helpers/time.types.test.ts index 566002cb52..c762b5002f 100644 --- a/__tests__/helpers/time.types.test.ts +++ b/__tests__/helpers/time.types.test.ts @@ -1,4 +1,4 @@ -import 'helpers/waves/time.types'; +import '@/helpers/waves/time.types'; test('module loads', () => { expect(true).toBe(true); diff --git a/__tests__/utils/editDropTestUtils.tsx b/__tests__/utils/editDropTestUtils.tsx index ba1eba2656..ebdbc548a7 100644 --- a/__tests__/utils/editDropTestUtils.tsx +++ b/__tests__/utils/editDropTestUtils.tsx @@ -1,39 +1,7 @@ -import React from 'react'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { renderHook, waitFor } from '@testing-library/react'; -import { AuthContext } from '@/components/auth/Auth'; -import { ReactQueryWrapperContext } from '@/components/react-query-wrapper/ReactQueryWrapper'; -import { useDropUpdateMutation } from '@/hooks/drops/useDropUpdateMutation'; import { ApiDrop } from '@/generated/models/ApiDrop'; import { ApiUpdateDropRequest } from '@/generated/models/ApiUpdateDropRequest'; import { ApiDropType } from '@/generated/models/ApiDropType'; -// Common mocks -export const commonMocks = { - // Mock the API - setupApiMock: () => { - jest.mock('@/services/api/common-api', () => ({ - commonApiPost: jest.fn(), - })); - }, - - // Mock the MyStreamContext - setupMyStreamMock: () => { - jest.mock('@/contexts/wave/MyStreamContext', () => ({ - useMyStream: jest.fn(() => ({ - processIncomingDrop: jest.fn(), - })), - })); - }, - - // Mock all common contexts - setupAllCommonMocks: () => { - commonMocks.setupApiMock(); - commonMocks.setupMyStreamMock(); - } -}; - -// Common test data factories export const createMockDrop = (overrides: Partial = {}): ApiDrop => ({ id: 'drop-123', serial_no: 1, @@ -76,119 +44,9 @@ export const createMockRequest = (overrides: Partial = {}) ...overrides } as any); -// Common test setup utilities -export const createTestQueryClient = () => new QueryClient({ - defaultOptions: { - queries: { retry: false }, - mutations: { retry: false }, - }, -}); - -export const createTestWrapper = (mockSetToast: jest.Mock, mockInvalidateDrops: jest.Mock, queryClient: QueryClient) => { - const authContextValue = { - setToast: mockSetToast, - } as any; - - const reactQueryContextValue = { - invalidateDrops: mockInvalidateDrops, - } as any; - - return ({ children }: { children: React.ReactNode }) => ( - - - - {children} - - - - ); -}; - -// Common expectation utilities -export const expectGenericErrorToast = async (mockSetToast: jest.Mock) => { - await waitFor(() => { - expect(mockSetToast).toHaveBeenCalledWith({ - message: 'Failed to update drop. Please try again.', - type: 'error', - }); - }); -}; - -export const expectTimeLimitErrorToast = async (mockSetToast: jest.Mock) => { - await waitFor(() => { - expect(mockSetToast).toHaveBeenCalledWith({ - message: 'This drop can no longer be edited. Drops can only be edited within 5 minutes of creation.', - type: 'error', - }); - }); -}; - -export const expectSuccessToast = async (mockSetToast: jest.Mock) => { - await waitFor(() => { - expect(mockSetToast).toHaveBeenCalledWith({ - message: 'Drop updated successfully', - type: 'success', - }); - }); -}; - -// Hook testing utilities -export const setupDropUpdateMutationTest = ( - mockedCommonApiPost: jest.MockedFunction, - mockSetToast: jest.Mock, - mockInvalidateDrops: jest.Mock, - queryClient: QueryClient -) => { - const setupErrorTest = (error: any, customRequest?: Partial) => { - mockedCommonApiPost.mockRejectedValue(error); - const wrapper = createTestWrapper(mockSetToast, mockInvalidateDrops, queryClient); - const { result } = renderHook(() => useDropUpdateMutation(), { wrapper }); - - return { - result, - triggerMutation: () => { - const request = customRequest ? { ...createMockRequest(), ...customRequest } : createMockRequest(); - result.current.mutate({ - dropId: 'drop-123', - request, - currentDrop: createMockDrop(), - }); - }, - }; - }; - - return { setupErrorTest }; -}; - // Error creation utilities export const createErrorWithStatus = (message: string, status: number) => { const error = new Error(message); (error as any).status = status; return error; }; - -// Simplified test utilities - just extract the common data and functions -export const createSimpleErrorTest = ( - mockedCommonApiPost: jest.MockedFunction, - mockSetToast: jest.Mock, - mockInvalidateDrops: jest.Mock, - queryClient: QueryClient -) => { - const wrapper = createTestWrapper(mockSetToast, mockInvalidateDrops, queryClient); - - return (error: any, customRequest?: Partial) => { - mockedCommonApiPost.mockRejectedValue(error); - const { result } = renderHook(() => useDropUpdateMutation(), { wrapper }); - - const triggerMutation = () => { - const request = customRequest ? { ...createMockRequest(), ...customRequest } : createMockRequest(); - result.current.mutate({ - dropId: 'drop-123', - request, - currentDrop: createMockDrop(), - }); - }; - - return { result, triggerMutation }; - }; -}; \ No newline at end of file diff --git a/__tests__/utils/mockFactories.ts b/__tests__/utils/mockFactories.ts index 5c593d0b6b..3f8b89fb94 100644 --- a/__tests__/utils/mockFactories.ts +++ b/__tests__/utils/mockFactories.ts @@ -21,22 +21,3 @@ export function createMockMinimalWave(overrides: Partial = {}): Min ...overrides, }; } - -/** - * Creates multiple mock MinimalWave objects for array-based tests - * @param count - Number of waves to create - * @param baseOverrides - Base properties to apply to all waves - * @returns Array of MinimalWave objects - */ -export function createMockMinimalWaves( - count: number, - baseOverrides: Partial = {} -): MinimalWave[] { - return Array.from({ length: count }, (_, index) => - createMockMinimalWave({ - id: `mock-wave-${index + 1}`, - name: `Mock Wave ${index + 1}`, - ...baseOverrides, - }) - ); -} \ No newline at end of file diff --git a/__tests__/utils/testContexts.tsx b/__tests__/utils/testContexts.tsx index 3f672eb6bf..53076321d8 100644 --- a/__tests__/utils/testContexts.tsx +++ b/__tests__/utils/testContexts.tsx @@ -1,8 +1,7 @@ import React from "react"; import { render } from "@testing-library/react"; import { AuthContext } from "@/components/auth/Auth"; -import { CookieConsentProvider } from "@/components/cookies/CookieConsentContext"; -export type AuthContextType = React.ContextType; +type AuthContextType = React.ContextType; const defaultConnectedProfile = { id: "test-id", @@ -48,16 +47,3 @@ export const renderWithAuth = ( ); }; - -export const renderWithProviders = ( - component: React.ReactElement, - authValue: Partial = {} -) => { - return render( - - - {component} - - - ); -}; diff --git a/__tests__/utils/titleTestUtils.tsx b/__tests__/utils/titleTestUtils.tsx index 3e2663956a..7be6571bf5 100644 --- a/__tests__/utils/titleTestUtils.tsx +++ b/__tests__/utils/titleTestUtils.tsx @@ -1,9 +1,7 @@ -import React from 'react'; -import { render } from '@testing-library/react'; -import { TitleProvider } from '@/contexts/TitleContext'; +import type { ReactNode } from 'react'; // Mock implementation of TitleContext hooks -export const mockTitleContext = { +const mockTitleContext = { title: 'Test Title', setTitle: jest.fn(), notificationCount: 0, @@ -20,31 +18,6 @@ export const mockTitleContextModule = () => { useSetNotificationCount: jest.fn(), useSetWaveData: jest.fn(), useSetStreamHasNewItems: jest.fn(), - TitleProvider: ({ children }: { children: React.ReactNode }) => children, + TitleProvider: ({ children }: { children: ReactNode }) => children, })); }; - -// Render with TitleProvider wrapper -export const renderWithTitleProvider = ( - component: React.ReactElement, - mockValue?: Partial -) => { - // Override mock values if provided - if (mockValue) { - Object.assign(mockTitleContext, mockValue); - } - - return render( - - {component} - - ); -}; - -// Reset all title mocks -export const resetTitleMocks = () => { - mockTitleContext.setTitle.mockClear(); - mockTitleContext.setNotificationCount.mockClear(); - mockTitleContext.setWaveData.mockClear(); - mockTitleContext.setStreamHasNewItems.mockClear(); -}; \ No newline at end of file diff --git a/app/api/farcaster/route.ts b/app/api/farcaster/route.ts index f08acd815f..f5f2731493 100644 --- a/app/api/farcaster/route.ts +++ b/app/api/farcaster/route.ts @@ -20,6 +20,7 @@ import type { FarcasterPreviewResponse, FarcasterProfilePreview, FarcasterUnavailablePreview, + FarcasterUnsupportedPreview, } from "@/types/farcaster.types"; const WARPCAST_API_BASE = @@ -653,6 +654,15 @@ const toUnavailable = ( reason, }); +const toUnsupported = ( + canonicalUrl?: string, + reason?: string +): FarcasterUnsupportedPreview => ({ + type: "unsupported", + canonicalUrl, + reason, +}); + const handleResource = async ( resource: FarcasterResourceIdentifier ): Promise => { @@ -677,7 +687,7 @@ const handleResource = async ( ); } - return { type: "unsupported" }; + return toUnsupported(undefined, "Unsupported Farcaster resource"); }; const isUrlGuardError = (error: unknown): error is UrlGuardError => @@ -729,7 +739,9 @@ export async function GET(request: NextRequest) { } } - return NextResponse.json({ type: "unsupported" }); + return NextResponse.json( + toUnsupported(targetUrl.toString(), "Unsupported Farcaster URL") + ); } catch (error) { if (isUrlGuardError(error)) { return handleGuardError(error, error.statusCode); diff --git a/app/api/open-graph/compound/registry.ts b/app/api/open-graph/compound/registry.ts index 062b0a6e6a..f49745ce0c 100644 --- a/app/api/open-graph/compound/registry.ts +++ b/app/api/open-graph/compound/registry.ts @@ -26,7 +26,7 @@ export type CompoundV3MarketConfig = { }; }; -export type CompoundRegistry = { +type CompoundRegistry = { readonly comptroller: `0x${string}`; readonly v2Markets: readonly CompoundV2MarketConfig[]; readonly v3Markets: readonly CompoundV3MarketConfig[]; diff --git a/app/nextgen/token/[token]/[[...view]]/page-utils.ts b/app/nextgen/token/[token]/[[...view]]/page-utils.ts index b1cb7b1c8d..5a1df26afa 100644 --- a/app/nextgen/token/[token]/[[...view]]/page-utils.ts +++ b/app/nextgen/token/[token]/[[...view]]/page-utils.ts @@ -7,7 +7,7 @@ import { NextgenCollectionView } from "@/enums"; import { isEmptyObject } from "@/helpers/Helpers"; import { commonApiFetch } from "@/services/api/common-api"; -export interface TokenData { +interface TokenData { tokenId: number; token: NextGenToken | null; traits: NextGenTrait[]; diff --git a/codex/STATE.md b/codex/STATE.md index be35d67b00..47ce75e183 100644 --- a/codex/STATE.md +++ b/codex/STATE.md @@ -21,7 +21,8 @@ This table is the single source of truth for active and historical tickets. Keep | TKT-0015 | Unify header search results | In-Progress | P1 | openai-assistant | [#1567](https://github.com/6529-Collections/6529seize-frontend/pull/1567) | 2025-10-24 | | TKT-0016 | Upgrade Next.js app to version 16 | In-Progress | P0 | openai-assistant | — | 2025-10-27 | | TKT-0017 | Stabilize Waves modal tests for app routing | In-Progress | P1 | openai-assistant | — | 2025-10-27 | -| TKT-0018 | Make Wave card fully clickable | In-Progress | P1 | openai-assistant | — | 2025-10-27 | +| TKT-0018 | Clean up UrlGuardHooks export | In-Progress | P1 | openai-assistant | — | 2025-10-28 | +| TKT-0019 | Make Wave card fully clickable | In-Progress | P1 | openai-assistant | — | 2025-10-27 | ## Usage Guidelines diff --git a/codex/tickets/TKT-0017.md b/codex/tickets/TKT-0017.md index 6f7d7f6f64..b8dbddea0d 100644 --- a/codex/tickets/TKT-0017.md +++ b/codex/tickets/TKT-0017.md @@ -33,4 +33,3 @@ title: Stabilize Waves modal tests for app routing - 2025-10-27T14:10:00Z – Documented the flakey Waves tests and logged the need for device info scoping before fixing the mocks. - 2025-10-27T14:45:00Z – Updated the Waves and WaveItemDropped specs to control the device mock explicitly and align avatar expectations with the production component; targeted Jest runs pass aside from coverage reporter sandbox noise. - diff --git a/codex/tickets/TKT-0018.md b/codex/tickets/TKT-0018.md index 4b4f89fd44..d71bbe1923 100644 --- a/codex/tickets/TKT-0018.md +++ b/codex/tickets/TKT-0018.md @@ -1,27 +1,26 @@ --- -created: 2025-10-27 +created: 2025-10-28 id: TKT-0018 owner: openai-assistant priority: P1 status: In-Progress -title: Make Wave card fully clickable +title: Clean up UrlGuardHooks export --- ## Context -@waveitem reported that the Wave card currently exposes an eye icon button for navigation, but the expectation is that the entire card surface should link to the wave. This change keeps the UX consistent with the rest of the interface and removes redundant affordances. +Knip flagged `UrlGuardHooks` in `lib/security/urlGuard.ts` as an unused exported type. The goal is to confirm usage and remove the export if it is only consumed internally. ## Plan -- [x] Review the current Wave card interactions and identify all navigation entry points. -- [x] Update the card to handle click and keyboard events across its surface without breaking nested controls. -- [x] Adjust and extend tests to cover the new interactions. +- [x] Inspect `UrlGuardHooks` definition and identify all in-repo consumers. +- [x] Convert the type to a local-only definition when no external usage exists. +- [x] Document any knock-on cleanups or follow-up tickets if new scope appears. ## Acceptance -- [x] Clicking any non-interactive area of a Wave card navigates to the wave detail view. -- [x] Existing interactive elements (like follow actions and contributor links) continue to work without unintended navigation. -- [x] Automated tests cover the navigation behavior. +- [x] `UrlGuardHooks` is no longer exported while keeping existing internal hooks behaviour intact. +- [x] Follow-up items, if any, are logged or new tickets opened. ## Links @@ -30,23 +29,4 @@ title: Make Wave card fully clickable ## Log -- 2025-10-27T09:37:57Z – Captured request to remove the eye icon and make the card surface navigable. -- 2025-10-27T09:45:00Z – Wired full-card navigation, removed the legacy eye icon, and added interaction coverage. -- 2025-10-27T09:58:50Z – Polished card styling with hover/contrast refinements while keeping nested controls intact. -- 2025-10-27T10:14:47Z – Inlined Tailwind surface styling on the Wave card JSX, retained guarded navigation handlers, and added a space-key interaction test (`npm run test -- --runTestsByPath __tests__/components/waves/list/WaveItem.test.tsx`). -- 2025-10-27T10:32:05Z – Hardened Wave card links, tooltips, and images (prefetch opt-out, optional chaining, memoized gradients, lazy-loading avatars) per @waveitem’s follow-up; no new tests executed per guidance. -- 2025-10-27T10:34:45Z – Rolled back the new memoization helpers to keep the card implementation straightforward while retaining the other hardening tweaks; tests still not run. -- 2025-10-27T10:36:37Z – Adjusted the subscribers row to remain a flex container at large breakpoints so the icon/count stay vertically centered. -- 2025-10-27T10:37:17Z – Replaced inline SVGs with `@heroicons/react/24/outline` icons for chat and subscriber rows per styling request. -- 2025-10-27T10:39:25Z – Swapped the subscriber icon to `UsersIcon` to match the “two user” visual preference. -- 2025-10-27T10:40:37Z – Centered the author row by flex-aligning the container/link so avatar, handle, and level pill stay vertically aligned. -- 2025-10-27T10:41:59Z – Centered drop contributor avatars/count by aligning both rows with flex utilities. -- 2025-10-27T11:27:47Z – Increased Wave card and contributor avatar image scales to `AUTOx450` / `200x200` for sharper previews. -- 2025-10-27T11:33:06Z – Re-applied the higher-resolution Wave hero/author image scales after the Card layout tweaks. -- 2025-10-27T11:34:14Z – Tightened the hero overlay to a bottom-heavy gradient so the text block stays readable without dimming the whole image. -- 2025-10-27T11:43:58Z – Boosted wave hero, author, and contributor image requests to a new `250x250` scale for sharper rendering. -- 2025-10-27T11:46:17Z – Scoped the `250x250` scale to the wave hero only and restored author/contributor avatars to their lighter `AUTOx50` variant per request. -- 2025-10-27T11:47:13Z – Reverted the hero image to `AUTOx450`; CDN lacks a `250x250` variant so the asset vanished. -- 2025-10-27T12:09:23Z – Retried `250x250` for the hero (keeping avatars on `AUTOx50`) per latest request. -- 2025-10-27T12:12:45Z – Restored the hero image scale to `AUTOx450` to ensure the CDN-served asset renders reliably. -- 2025-10-27T14:06:24Z – Moved the Wave avatar/handle/level row below the hero image and above the meta bar to match the requested layout. +- 2025-10-28T09:20:06Z – Investigated unused export and made the hooks type internal. diff --git a/codex/tickets/TKT-0019.md b/codex/tickets/TKT-0019.md new file mode 100644 index 0000000000..a06dc27893 --- /dev/null +++ b/codex/tickets/TKT-0019.md @@ -0,0 +1,52 @@ +--- +created: 2025-10-27 +id: TKT-0019 +owner: openai-assistant +priority: P1 +status: In-Progress +title: Make Wave card fully clickable +--- + +## Context + +@waveitem reported that the Wave card currently exposes an eye icon button for navigation, but the expectation is that the entire card surface should link to the wave. This change keeps the UX consistent with the rest of the interface and removes redundant affordances. + +## Plan + +- [x] Review the current Wave card interactions and identify all navigation entry points. +- [x] Update the card to handle click and keyboard events across its surface without breaking nested controls. +- [x] Adjust and extend tests to cover the new interactions. + +## Acceptance + +- [x] Clicking any non-interactive area of a Wave card navigates to the wave detail view. +- [x] Existing interactive elements (like follow actions and contributor links) continue to work without unintended navigation. +- [x] Automated tests cover the navigation behavior. + +## Links + +- Primary PR: _(add when available)_ +- Follow-ups: _(reference additional tickets or TODO items)_ + +## Log + +- 2025-10-27T09:37:57Z – Captured request to remove the eye icon and make the card surface navigable. +- 2025-10-27T09:45:00Z – Wired full-card navigation, removed the legacy eye icon, and added interaction coverage. +- 2025-10-27T09:58:50Z – Polished card styling with hover/contrast refinements while keeping nested controls intact. +- 2025-10-27T10:14:47Z – Inlined Tailwind surface styling on the Wave card JSX, retained guarded navigation handlers, and added a space-key interaction test (`npm run test -- --runTestsByPath __tests__/components/waves/list/WaveItem.test.tsx`). +- 2025-10-27T10:32:05Z – Hardened Wave card links, tooltips, and images (prefetch opt-out, optional chaining, memoized gradients, lazy-loading avatars) per @waveitem’s follow-up; no new tests executed per guidance. +- 2025-10-27T10:34:45Z – Rolled back the new memoization helpers to keep the card implementation straightforward while retaining the other hardening tweaks; tests still not run. +- 2025-10-27T10:36:37Z – Adjusted the subscribers row to remain a flex container at large breakpoints so the icon/count stay vertically centered. +- 2025-10-27T10:37:17Z – Replaced inline SVGs with `@heroicons/react/24/outline` icons for chat and subscriber rows per styling request. +- 2025-10-27T10:39:25Z – Swapped the subscriber icon to `UsersIcon` to match the “two user” visual preference. +- 2025-10-27T10:40:37Z – Centered the author row by flex-aligning the container/link so avatar, handle, and level pill stay vertically aligned. +- 2025-10-27T10:41:59Z – Centered drop contributor avatars/count by aligning both rows with flex utilities. +- 2025-10-27T11:27:47Z – Increased Wave card and contributor avatar image scales to `AUTOx450` / `200x200` for sharper previews. +- 2025-10-27T11:33:06Z – Re-applied the higher-resolution Wave hero/author image scales after the Card layout tweaks. +- 2025-10-27T11:34:14Z – Tightened the hero overlay to a bottom-heavy gradient so the text block stays readable without dimming the whole image. +- 2025-10-27T11:43:58Z – Boosted wave hero, author, and contributor image requests to a new `250x250` scale for sharper rendering. +- 2025-10-27T11:46:17Z – Scoped the `250x250` scale to the wave hero only and restored author/contributor avatars to their lighter `AUTOx50` variant per request. +- 2025-10-27T11:47:13Z – Reverted the hero image to `AUTOx450`; CDN lacks a `250x250` variant so the asset vanished. +- 2025-10-27T12:09:23Z – Retried `250x250` for the hero (keeping avatars on `AUTOx50`) per latest request. +- 2025-10-27T12:12:45Z – Restored the hero image scale to `AUTOx450` to ensure the CDN-served asset renders reliably. +- 2025-10-27T14:06:24Z – Moved the Wave avatar/handle/level row below the hero image and above the meta bar to match the requested layout. diff --git a/components/auth/error-boundary/WalletErrorBoundary.tsx b/components/auth/error-boundary/WalletErrorBoundary.tsx index ebc526a69e..08b09eb83f 100644 --- a/components/auth/error-boundary/WalletErrorBoundary.tsx +++ b/components/auth/error-boundary/WalletErrorBoundary.tsx @@ -88,5 +88,3 @@ export class WalletErrorBoundary extends Component { ); } } - -export default WalletErrorBoundary; \ No newline at end of file diff --git a/components/auth/error-boundary/index.ts b/components/auth/error-boundary/index.ts index 7b5004595c..a384475def 100644 --- a/components/auth/error-boundary/index.ts +++ b/components/auth/error-boundary/index.ts @@ -4,4 +4,3 @@ */ export { WalletErrorBoundary } from './WalletErrorBoundary'; -export { WalletErrorBoundary as default } from './WalletErrorBoundary'; \ No newline at end of file diff --git a/components/brain/left-sidebar/web/WebBrainLeftSidebarSearchWave.tsx b/components/brain/left-sidebar/web/WebBrainLeftSidebarSearchWave.tsx deleted file mode 100644 index 2a2c91b6a9..0000000000 --- a/components/brain/left-sidebar/web/WebBrainLeftSidebarSearchWave.tsx +++ /dev/null @@ -1,68 +0,0 @@ -"use client"; - -import React, { useRef, useState } from "react"; -import { useClickAway, useKeyPressEvent } from "react-use"; -import BrainLeftSidebarSearchWaveDropdown from "../search-wave/BrainLeftSidebarSearchWaveDropdown"; - -interface WebBrainLeftSidebarSearchWaveProps { - readonly listType: "waves" | "messages"; -} - -const WebBrainLeftSidebarSearchWave: React.FC = ({ - listType, -}) => { - const [isOpen, setIsOpen] = useState(false); - const onFocusChange = (newV: boolean) => { - if (newV) { - setIsOpen(true); - } - }; - - const [searchCriteria, setSearchCriteria] = useState(""); - - const onSearchCriteriaChange = (newV: string | null) => { - setSearchCriteria(newV ?? ""); - }; - - const wrapperRef = useRef(null); - useClickAway(wrapperRef, () => setIsOpen(false)); - useKeyPressEvent("Escape", () => setIsOpen(false)); - - const handleClose = () => { - setIsOpen(false); - setSearchCriteria(""); - }; - - return ( -
- - onSearchCriteriaChange(e.target.value)} - onFocus={() => onFocusChange(true)} - /> - -
- ); -}; - -export default WebBrainLeftSidebarSearchWave; \ No newline at end of file diff --git a/components/brain/left-sidebar/web/WebBrainLeftSidebarViewChange.tsx b/components/brain/left-sidebar/web/WebBrainLeftSidebarViewChange.tsx deleted file mode 100644 index 8623b2f6b6..0000000000 --- a/components/brain/left-sidebar/web/WebBrainLeftSidebarViewChange.tsx +++ /dev/null @@ -1,72 +0,0 @@ -"use client"; - -import React, { useContext, useState, useEffect } from "react"; -import Link from "next/link"; -import { useRouter, usePathname } from "next/navigation"; -import { AuthContext } from "../../../auth/Auth"; -import { useUnreadNotifications } from "../../../../hooks/useUnreadNotifications"; - -interface WebBrainLeftSidebarViewChangeProps {} - -export const WebBrainLeftSidebarViewChange: React.FC< - WebBrainLeftSidebarViewChangeProps -> = () => { - const { connectedProfile } = useContext(AuthContext); - const router = useRouter(); - const pathname = usePathname(); - const [activeTab, setActiveTab] = useState(pathname); - - const { haveUnreadNotifications } = useUnreadNotifications( - connectedProfile?.handle ?? null - ); - - useEffect(() => { - setActiveTab(pathname); - }, [pathname]); - - const isLinkActive = (path: string) => { - if (path === "/waves") { - return ( - pathname === "/waves" || - (!pathname?.startsWith("/messages") && pathname !== "/notifications") - ); - } - return activeTab?.startsWith(path); - }; - - const getLinkClasses = (path: string) => - `tw-no-underline tw-flex tw-justify-center tw-items-center tw-px-3 tw-py-2 tw-gap-2 tw-flex-1 tw-h-8 tw-rounded-lg tw-transition-colors tw-duration-300 tw-ease-in-out tw-relative z-10 ${ - isLinkActive(path) - ? "tw-text-iron-300" - : "tw-text-iron-400 hover:tw-text-iron-300" - }`; - - const onMessagesClick = (e: React.MouseEvent) => { - e.preventDefault(); - router.push("/messages", { scroll: false }); - }; - - return ( -
-
- - Waves - - - Messages - {haveUnreadNotifications && ( - - )} - -
- ); -}; diff --git a/components/brain/my-stream/layout/LayoutContext.tsx b/components/brain/my-stream/layout/LayoutContext.tsx index e0f38ab3c8..0e40d815ea 100644 --- a/components/brain/my-stream/layout/LayoutContext.tsx +++ b/components/brain/my-stream/layout/LayoutContext.tsx @@ -66,7 +66,7 @@ const calculateHeightStyle = ( // Context type definition // Define valid ref types for type safety -export type LayoutRefType = +type LayoutRefType = | "header" | "pinned" | "tabs" diff --git a/components/brain/notifications/index.tsx b/components/brain/notifications/index.tsx index 5b8bb89b9b..59b9da781d 100644 --- a/components/brain/notifications/index.tsx +++ b/components/brain/notifications/index.tsx @@ -105,5 +105,3 @@ export default function Notifications({
); } - -export type { NotificationsProps }; diff --git a/components/common/CompactMenu.tsx b/components/common/CompactMenu.tsx index 9887fd37e0..ee0ef5e212 100644 --- a/components/common/CompactMenu.tsx +++ b/components/common/CompactMenu.tsx @@ -1,5 +1,2 @@ export { CompactMenu } from "../compact-menu"; -export type { - CompactMenuItem, - CompactMenuProps, -} from "../compact-menu"; +export type { CompactMenuItem } from "../compact-menu"; diff --git a/components/compact-menu/index.tsx b/components/compact-menu/index.tsx index 89e729a676..0134454f3f 100644 --- a/components/compact-menu/index.tsx +++ b/components/compact-menu/index.tsx @@ -148,4 +148,4 @@ function CompactMenuContent({ ); } -export type { CompactMenuItem, CompactMenuProps } from "./types"; +export type { CompactMenuItem } from "./types"; diff --git a/components/distribution-plan-tool/create-custom-snapshots/form/CreateCustomSnapshotForm.tsx b/components/distribution-plan-tool/create-custom-snapshots/form/CreateCustomSnapshotForm.tsx index dbcbab0a16..747df4a80a 100644 --- a/components/distribution-plan-tool/create-custom-snapshots/form/CreateCustomSnapshotForm.tsx +++ b/components/distribution-plan-tool/create-custom-snapshots/form/CreateCustomSnapshotForm.tsx @@ -23,8 +23,8 @@ import AllowlistToolCommonModalWrapper, { } from "@/components/allowlist-tool/common/modals/AllowlistToolCommonModalWrapper"; import CreateCustomSnapshotFormAddWalletsModal from "./CreateCustomSnapshotFormAddWalletsModal"; -export const MAX_CUSTOM_SNAPSHOT_ROWS = 100000; -export const CUSTOM_SNAPSHOT_CHUNK_SIZE = 500; +const MAX_CUSTOM_SNAPSHOT_ROWS = 100000; +const CUSTOM_SNAPSHOT_CHUNK_SIZE = 500; export default function CreateCustomSnapshotForm() { const { distributionPlan, setToasts, fetchOperations } = useContext( diff --git a/components/drops/create/lexical/plugins/hashtags/HashtagsPlugin.tsx b/components/drops/create/lexical/plugins/hashtags/HashtagsPlugin.tsx index 1e3d4491e4..2c8ef33b6e 100644 --- a/components/drops/create/lexical/plugins/hashtags/HashtagsPlugin.tsx +++ b/components/drops/create/lexical/plugins/hashtags/HashtagsPlugin.tsx @@ -283,9 +283,5 @@ const NewHashtagsPlugin = forwardRef< }); NewHashtagsPlugin.displayName = "NewHashtagsPlugin"; -export { - useHashtagLookupService, - checkForAtSignHashtags, - getPossibleQueryMatch, -}; +export { useHashtagLookupService, getPossibleQueryMatch }; export default NewHashtagsPlugin; diff --git a/components/drops/view/part/dropPartMarkdown/content.tsx b/components/drops/view/part/dropPartMarkdown/content.tsx index bb5f0c77e2..97c182254d 100644 --- a/components/drops/view/part/dropPartMarkdown/content.tsx +++ b/components/drops/view/part/dropPartMarkdown/content.tsx @@ -30,7 +30,7 @@ type FindNativeEmoji = ( emojiId: string ) => { skins: NativeEmojiSkin[] } | null; -export interface MarkdownContentConfig { +interface MarkdownContentConfig { readonly textSizeClass: string; readonly mentionedUsers: Array; readonly referencedNfts: Array; @@ -39,7 +39,7 @@ export interface MarkdownContentConfig { readonly isSmartLink: (href: string) => boolean; } -export interface MarkdownContentRenderers { +interface MarkdownContentRenderers { readonly customRenderer: (content: ReactNode | undefined) => ReactNode; readonly renderParagraph: ( params: ClassAttributes & diff --git a/components/drops/view/part/dropPartMarkdown/handlers/compound.tsx b/components/drops/view/part/dropPartMarkdown/handlers/compound.tsx index ced4a866a9..d2a42fc5f8 100644 --- a/components/drops/view/part/dropPartMarkdown/handlers/compound.tsx +++ b/components/drops/view/part/dropPartMarkdown/handlers/compound.tsx @@ -28,5 +28,3 @@ export const createCompoundHandler = (): LinkHandler => ({ render: (href) => , display: "block", }); - -export type CompoundHandler = ReturnType; diff --git a/components/drops/view/part/dropPartMarkdown/handlers/ens.tsx b/components/drops/view/part/dropPartMarkdown/handlers/ens.tsx index e8a3e42149..b1c6694208 100644 --- a/components/drops/view/part/dropPartMarkdown/handlers/ens.tsx +++ b/components/drops/view/part/dropPartMarkdown/handlers/ens.tsx @@ -12,5 +12,3 @@ export const createEnsHandler = (): LinkHandler => ({ render: (href) => , display: "block", }); - -export type EnsHandler = ReturnType; diff --git a/components/drops/view/part/dropPartMarkdown/handlers/googleWorkspace.tsx b/components/drops/view/part/dropPartMarkdown/handlers/googleWorkspace.tsx index 42c25df017..9b594d9fec 100644 --- a/components/drops/view/part/dropPartMarkdown/handlers/googleWorkspace.tsx +++ b/components/drops/view/part/dropPartMarkdown/handlers/googleWorkspace.tsx @@ -29,5 +29,3 @@ export const createGoogleWorkspaceHandler = (): LinkHandler => ({ render: (href) => , display: "block", }); - -export type GoogleWorkspaceHandler = ReturnType; diff --git a/components/drops/view/part/dropPartMarkdown/handlers/index.ts b/components/drops/view/part/dropPartMarkdown/handlers/index.ts index da36f3e40a..3f02f7f92f 100644 --- a/components/drops/view/part/dropPartMarkdown/handlers/index.ts +++ b/components/drops/view/part/dropPartMarkdown/handlers/index.ts @@ -25,6 +25,4 @@ export const createLinkHandlers = (): LinkHandler[] => [ createFarcasterHandler(), ]; -export type LinkHandlers = ReturnType; - export { createSeizeHandlers } from "./seize"; diff --git a/components/drops/view/part/dropPartMarkdown/handlers/seize.tsx b/components/drops/view/part/dropPartMarkdown/handlers/seize.tsx index 548927849c..3fa274ea09 100644 --- a/components/drops/view/part/dropPartMarkdown/handlers/seize.tsx +++ b/components/drops/view/part/dropPartMarkdown/handlers/seize.tsx @@ -124,5 +124,3 @@ export const createSeizeHandlers = ({ createSeizeWaveHandler(), createSeizeDropHandler(), ]; - -export type SeizeHandlers = ReturnType; diff --git a/components/drops/view/part/dropPartMarkdown/handlers/tiktok.tsx b/components/drops/view/part/dropPartMarkdown/handlers/tiktok.tsx index f5c4692463..680b776730 100644 --- a/components/drops/view/part/dropPartMarkdown/handlers/tiktok.tsx +++ b/components/drops/view/part/dropPartMarkdown/handlers/tiktok.tsx @@ -7,5 +7,3 @@ export const createTikTokHandler = (): LinkHandler => ({ render: (href) => , display: "block", }); - -export type TikTokHandler = ReturnType; diff --git a/components/drops/view/part/dropPartMarkdown/handlers/youtube.tsx b/components/drops/view/part/dropPartMarkdown/handlers/youtube.tsx index eaa90927fa..a9e8c0d05e 100644 --- a/components/drops/view/part/dropPartMarkdown/handlers/youtube.tsx +++ b/components/drops/view/part/dropPartMarkdown/handlers/youtube.tsx @@ -7,5 +7,3 @@ export const createYoutubeHandler = (): LinkHandler => ({ render: (href) => , display: "block", }); - -export type YoutubeHandler = ReturnType; diff --git a/components/drops/view/part/dropPartMarkdown/linkHandlers.tsx b/components/drops/view/part/dropPartMarkdown/linkHandlers.tsx index b06d04f187..73f8126757 100644 --- a/components/drops/view/part/dropPartMarkdown/linkHandlers.tsx +++ b/components/drops/view/part/dropPartMarkdown/linkHandlers.tsx @@ -22,11 +22,11 @@ import { shouldUseOpenGraphPreview, } from "./linkUtils"; -export interface LinkRendererConfig { +interface LinkRendererConfig { readonly onQuoteClick: (drop: ApiDrop) => void; } -export interface LinkRenderer { +interface LinkRenderer { readonly renderAnchor: ( params: ClassAttributes & AnchorHTMLAttributes & diff --git a/components/drops/view/part/dropPartMarkdown/linkTypes.ts b/components/drops/view/part/dropPartMarkdown/linkTypes.ts index a80ebb55fd..514f03ca13 100644 --- a/components/drops/view/part/dropPartMarkdown/linkTypes.ts +++ b/components/drops/view/part/dropPartMarkdown/linkTypes.ts @@ -1,6 +1,6 @@ import type { ReactElement } from "react"; -export type LinkDisplay = "block" | "inline"; +type LinkDisplay = "block" | "inline"; export interface LinkHandler { readonly match: (href: string) => boolean; diff --git a/components/drops/view/part/dropPartMarkdown/pepe.tsx b/components/drops/view/part/dropPartMarkdown/pepe.tsx index 415b14e4a6..56b73fe269 100644 --- a/components/drops/view/part/dropPartMarkdown/pepe.tsx +++ b/components/drops/view/part/dropPartMarkdown/pepe.tsx @@ -1,6 +1,6 @@ import PepeCard, { type PepeKind } from "@/components/waves/pepe/PepeCard"; -export type PepeLinkResult = { +type PepeLinkResult = { readonly kind: PepeKind; readonly slug: string; readonly href: string; @@ -54,4 +54,4 @@ export const parsePepeLink = (href: string): PepeLinkResult | null => { export const renderPepeLink = (link: PepeLinkResult) => { return ; -}; \ No newline at end of file +}; diff --git a/components/drops/view/part/dropPartMarkdown/renderers.tsx b/components/drops/view/part/dropPartMarkdown/renderers.tsx index 7cb75367bc..64c7a7da4e 100644 --- a/components/drops/view/part/dropPartMarkdown/renderers.tsx +++ b/components/drops/view/part/dropPartMarkdown/renderers.tsx @@ -100,4 +100,4 @@ const renderSeizeQuote = ( return null; }; -export { renderGifEmbed, renderSeizeQuote, renderTweetEmbed, TweetFallback }; +export { renderGifEmbed, renderSeizeQuote, renderTweetEmbed }; diff --git a/components/drops/view/part/dropPartMarkdown/tiktok.ts b/components/drops/view/part/dropPartMarkdown/tiktok.ts index 1cc0be00a7..a09c6c9a96 100644 --- a/components/drops/view/part/dropPartMarkdown/tiktok.ts +++ b/components/drops/view/part/dropPartMarkdown/tiktok.ts @@ -1,6 +1,6 @@ -export type TikTokLinkKind = "video" | "profile" | "short"; +type TikTokLinkKind = "video" | "profile" | "short"; -export interface TikTokLinkInfo { +interface TikTokLinkInfo { readonly href: string; readonly kind: TikTokLinkKind; } diff --git a/components/drops/view/part/dropPartMarkdown/youtube.ts b/components/drops/view/part/dropPartMarkdown/youtube.ts index 3d9481c12a..3f51a51d7a 100644 --- a/components/drops/view/part/dropPartMarkdown/youtube.ts +++ b/components/drops/view/part/dropPartMarkdown/youtube.ts @@ -1,6 +1,6 @@ import { matchesDomainOrSubdomain } from "@/lib/url/domains"; -export interface YoutubeLinkInfo { +interface YoutubeLinkInfo { readonly videoId: string; readonly url: string; } diff --git a/components/drops/view/part/dropPartMarkdown/youtubePreview.tsx b/components/drops/view/part/dropPartMarkdown/youtubePreview.tsx index dcc7328312..77021c5d36 100644 --- a/components/drops/view/part/dropPartMarkdown/youtubePreview.tsx +++ b/components/drops/view/part/dropPartMarkdown/youtubePreview.tsx @@ -30,7 +30,7 @@ const normalizeYoutubeHtml = (html: string): string => { return normalized; }; -export interface YoutubePreviewProps { +interface YoutubePreviewProps { readonly href: string; } diff --git a/components/header/HeaderNavConfig.ts b/components/header/HeaderNavConfig.ts index bf6a447a3e..36e509acdd 100644 --- a/components/header/HeaderNavConfig.ts +++ b/components/header/HeaderNavConfig.ts @@ -1,18 +1,18 @@ import { AboutSection } from "@/enums"; -export interface NavLink { +interface NavLink { name: string; path: string; condition?: (context: NavContext) => boolean; } -export interface NavSection { +interface NavSection { name: string; items: NavLink[]; hasDivider?: boolean; } -export interface NavDropdown { +interface NavDropdown { title: string; condition?: (context: NavContext) => boolean; className?: string | ((context: NavContext) => string); @@ -29,8 +29,8 @@ export interface NavContext { pathname?: string; } -export function getDesktopNavigation(_context: NavContext): NavDropdown[] { - return [ +export function getDesktopNavigation(_context: NavContext) { + const navigation: NavDropdown[] = [ { title: "Brain", condition: (ctx) => ctx.showWaves, @@ -186,6 +186,8 @@ export function getDesktopNavigation(_context: NavContext): NavDropdown[] { ], }, ]; + + return navigation; } export const toolsBottomItems: NavLink[] = [ diff --git a/components/meme-calendar/meme-calendar.szn1.ts b/components/meme-calendar/meme-calendar.szn1.ts index 253105b390..fd6d3229b1 100644 --- a/components/meme-calendar/meme-calendar.szn1.ts +++ b/components/meme-calendar/meme-calendar.szn1.ts @@ -1,5 +1,5 @@ // ------------------ Historical (SZN1) mints: Jun-Dec 2022 ------------------ -export type HistoricalMint = { id: number; instantUtc: Date }; +type HistoricalMint = { id: number; instantUtc: Date }; // Keep in ascending id order. export const HISTORICAL_MINTS: HistoricalMint[] = [ diff --git a/components/navigation/navTypes.ts b/components/navigation/navTypes.ts index baee6186a9..fa84fd4ca6 100644 --- a/components/navigation/navTypes.ts +++ b/components/navigation/navTypes.ts @@ -2,7 +2,7 @@ import React from "react"; export type ViewKey = "waves" | "messages"; -export type RouteNavItem = { +type RouteNavItem = { kind: "route"; name: string; href: string; @@ -12,7 +12,7 @@ export type RouteNavItem = { disabled?: boolean; }; -export type ViewNavItem = { +type ViewNavItem = { kind: "view"; name: string; viewKey: ViewKey; @@ -22,19 +22,8 @@ export type ViewNavItem = { disabled?: boolean; }; -export type ActionNavItem = { - kind: "action"; - name: string; - action: () => void; - icon: string; - iconComponent?: React.ComponentType<{ className?: string }>; - iconSizeClass?: string; - disabled?: boolean; -}; +export type NavItem = RouteNavItem | ViewNavItem; -export type NavItem = RouteNavItem | ViewNavItem | ActionNavItem; - -// Sidebar-specific types export interface SidebarSection { key: string; name: string; @@ -46,7 +35,7 @@ export interface SidebarSection { }[]; } -export interface SidebarNavItem { +interface SidebarNavItem { name: string; href: string; -} \ No newline at end of file +} diff --git a/components/utils/CommonFilterTargetSelect.tsx b/components/utils/CommonFilterTargetSelect.tsx index 1fb6954502..f6d9a7ff83 100644 --- a/components/utils/CommonFilterTargetSelect.tsx +++ b/components/utils/CommonFilterTargetSelect.tsx @@ -4,11 +4,6 @@ import { useId } from "react"; import { ProfileActivityFilterTargetType } from "@/enums"; -export { ProfileActivityFilterTargetType } from "@/enums"; -export { - ProfileActivityFilterTargetType as FilterTargetType, -} from "@/enums"; - const TARGETS = [ { id: ProfileActivityFilterTargetType.ALL, name: "All" }, { id: ProfileActivityFilterTargetType.OUTGOING, name: "Outgoing" }, diff --git a/components/waves/FarcasterCard.tsx b/components/waves/FarcasterCard.tsx index bc472c084e..4e578761fb 100644 --- a/components/waves/FarcasterCard.tsx +++ b/components/waves/FarcasterCard.tsx @@ -16,6 +16,7 @@ import type { FarcasterFramePreview, FarcasterProfilePreview, FarcasterUnavailablePreview, + FarcasterUnsupportedPreview, FarcasterCastEmbed, } from "@/types/farcaster.types"; @@ -27,7 +28,7 @@ interface FarcasterCardProps { type SupportedPreview = Exclude< FarcasterPreviewResponse, - FarcasterUnavailablePreview | { type: "unsupported" } + FarcasterUnavailablePreview | FarcasterUnsupportedPreview >; type FarcasterCardState = diff --git a/components/waves/OpenSeaCard.tsx b/components/waves/OpenSeaCard.tsx deleted file mode 100644 index 82ceb9fff5..0000000000 --- a/components/waves/OpenSeaCard.tsx +++ /dev/null @@ -1,470 +0,0 @@ -"use client"; - -import Image from "next/image"; -import Link from "next/link"; - -import type { LinkPreviewMedia, LinkPreviewResponse } from "@/services/api/link-preview-api"; - -import { LinkPreviewCardLayout } from "./OpenGraphPreview"; - -type OpenSeaItemSupply = { - readonly total: string | null; - readonly standard: string; -}; - -type OpenSeaRoyaltyInfo = { - readonly receiver: string | null; - readonly bps: number | null; - readonly supports2981: boolean; -}; - -type OpenSeaLinks = { - readonly opensea?: string | null; - readonly etherscan?: string | null; - readonly metadata?: string | null; -}; - -type OpenSeaItemResponse = LinkPreviewResponse & { - readonly type: "opensea.item"; - readonly contract?: string; - readonly tokenId?: string; - readonly standard?: string; - readonly name?: string | null; - readonly attributes?: ReadonlyArray<{ trait_type?: string; value: unknown }>; - readonly owner?: string | null; - readonly supply?: OpenSeaItemSupply | null; - readonly royalties?: OpenSeaRoyaltyInfo | null; - readonly links?: OpenSeaLinks | null; -}; - -type OpenSeaCollectionResponse = LinkPreviewResponse & { - readonly type: "opensea.collection" | "opensea.collection.slug"; - readonly name?: string | null; - readonly symbol?: string | null; - readonly standard?: string | null; - readonly supply?: string | null; - readonly sampleImage?: string | null; - readonly links?: OpenSeaLinks | null; -}; - -type OpenSeaTxSummary = { - readonly item?: { - readonly contract: string; - readonly tokenId: string; - readonly standard: string; - } | null; - readonly price?: { - readonly amount: string; - readonly asset: string; - } | null; - readonly buyer?: string; - readonly seller?: string; -}; - -type OpenSeaTransactionResponse = LinkPreviewResponse & { - readonly type: "opensea.tx"; - readonly hash: string; - readonly status?: string | null; - readonly market?: string | null; - readonly summary?: OpenSeaTxSummary | null; - readonly links?: OpenSeaLinks | null; -}; - -export type OpenSeaResponse = - | OpenSeaItemResponse - | OpenSeaCollectionResponse - | OpenSeaTransactionResponse; - -const imageFromMedia = (media?: LinkPreviewMedia | null, fallbacks?: readonly LinkPreviewMedia[] | null) => { - if (media?.url) { - return media.url; - } - if (fallbacks) { - for (const entry of fallbacks) { - if (entry?.url) { - return entry.url; - } - } - } - return undefined; -}; - -const formatSupply = (supply?: OpenSeaItemSupply | null) => { - if (!supply) { - return undefined; - } - if (supply.total) { - if (supply.standard) { - return `${supply.total} (${supply.standard})`; - } - return supply.total; - } - return supply.standard; -}; - -const formatAttributeValue = (value: unknown): string => { - if (value === null || value === undefined) { - return ""; - } - if (Array.isArray(value)) { - return value - .map((entry) => formatAttributeValue(entry)) - .filter((entry) => entry.length > 0) - .join(", "); - } - if (value instanceof Date) { - return value.toISOString(); - } - - switch (typeof value) { - case "string": - return value; - case "number": - case "boolean": - case "bigint": - return String(value); - case "symbol": - return value.toString(); - case "function": - return value.name ? `[function ${value.name}]` : "function"; - case "object": - try { - return JSON.stringify(value); - } catch { - const fallback = (value as { toString?: () => string }).toString?.(); - if (typeof fallback === "string" && fallback !== "[object Object]") { - return fallback; - } - return "[unserializable object]"; - } - default: - return ""; - } -}; - -const formatRoyalties = (royalties?: OpenSeaRoyaltyInfo | null) => { - if (!royalties) { - return undefined; - } - if (typeof royalties.bps === "number" && royalties.receiver) { - const percent = (royalties.bps / 100).toFixed(2).replace(/\.00$/, ""); - return `${percent}% to ${shorten(royalties.receiver)}`; - } - if (royalties.receiver) { - return shorten(royalties.receiver); - } - if (typeof royalties.bps === "number") { - const percent = (royalties.bps / 100).toFixed(2).replace(/\.00$/, ""); - return `${percent}%`; - } - if (royalties.supports2981) { - return "ERC2981"; - } - return undefined; -}; - -const shorten = (value?: string | null, tail = 4) => { - if (!value) { - return undefined; - } - if (value.length <= tail * 2 + 3) { - return value; - } - return `${value.slice(0, tail + 2)}…${value.slice(-tail)}`; -}; - -const linkList = (links?: OpenSeaLinks | null) => { - if (!links) { - return null; - } - - const entries: Array<[string, string]> = []; - - if (links.opensea) { - entries.push(["OpenSea", links.opensea]); - } - if (links.metadata) { - entries.push(["Metadata", links.metadata]); - } - if (links.etherscan) { - entries.push(["Etherscan", links.etherscan]); - } - - if (entries.length === 0) { - return null; - } - - return ( -
- {entries.map(([label, href]) => ( - - {label} - - ))} -
- ); -}; - -const AttributeList = ({ - attributes, -}: { - readonly attributes: ReadonlyArray<{ trait_type?: string; value: unknown }>; -}) => { - if (!attributes.length) { - return null; - } - - return ( -
- {attributes.slice(0, 6).map((attribute, index) => { - const value = attribute?.value; - if (value === null || value === undefined || value === "") { - return null; - } - return ( -
- {attribute?.trait_type ? ( - - {attribute.trait_type} - - ) : null} - - {formatAttributeValue(value)} - -
- ); - })} -
- ); -}; - -const ImagePreview = ({ src, alt }: { src?: string; alt: string }) => { - if (!src) { - return ( -
- No image -
- ); - } - - return ( -
- {alt} -
- ); -}; - -const renderItemCard = (href: string, data: OpenSeaItemResponse) => { - const imageUrl = imageFromMedia(data.image, data.images as ReadonlyArray | undefined); - const supply = formatSupply(data.supply); - const royalty = formatRoyalties(data.royalties); - - const metadataRows: Array<{ label: string; value?: string }> = [ - { label: "Contract", value: shorten(data.contract) }, - { label: "Token ID", value: data.tokenId }, - { label: "Standard", value: data.standard }, - { label: "Owned by", value: shorten(data.owner) }, - { label: "Supply", value: supply }, - { label: "Royalties", value: royalty }, - ]; - - return ( - -
-
- -
- - OpenSea Item - -

- {data.name ?? data.title ?? data.url ?? "Item"} -

- {data.description ? ( -

- {data.description} -

- ) : null} -
- {metadataRows - .filter((row) => row.value) - .map((row) => ( -
- - {row.label} - - - {row.value} - -
- ))} -
-
-
- {Array.isArray(data.attributes) && data.attributes.length > 0 ? ( - - ) : null} - {linkList(data.links)} -
-
- ); -}; - -const renderCollectionCard = (href: string, data: OpenSeaCollectionResponse) => { - const imageUrl = imageFromMedia(data.image, data.images as ReadonlyArray | undefined) ?? data.sampleImage ?? undefined; - - const metadataRows: Array<{ label: string; value?: string }> = [ - { label: "Symbol", value: data.symbol ?? undefined }, - { label: "Standard", value: data.standard ?? undefined }, - { label: "Supply", value: data.supply ?? undefined }, - ]; - - return ( - -
-
- -
- - OpenSea Collection - -

- {data.name ?? data.title ?? data.url ?? "Collection"} -

- {data.description ? ( -

- {data.description} -

- ) : null} -
- {metadataRows - .filter((row) => row.value) - .map((row) => ( -
- - {row.label} - - - {row.value} - -
- ))} -
-
-
- {linkList(data.links)} -
-
- ); -}; - -const renderTransactionCard = (href: string, data: OpenSeaTransactionResponse) => { - const statusLabel = data.status ? data.status.toUpperCase() : undefined; - const summary = data.summary; - - const summaryRows: Array<{ label: string; value?: string }> = []; - if (summary?.item) { - summaryRows.push( - { label: "Token", value: `${shorten(summary.item.contract)} #${summary.item.tokenId}` }, - { label: "Standard", value: summary.item.standard } - ); - } - if (summary?.price) { - summaryRows.push({ label: "Price", value: `${summary.price.amount} ${summary.price.asset}` }); - } - if (summary?.buyer) { - summaryRows.push({ label: "Buyer", value: shorten(summary.buyer) }); - } - if (summary?.seller) { - summaryRows.push({ label: "Seller", value: shorten(summary.seller) }); - } - - return ( - -
-
-
- - OpenSea Transaction - -

{shorten(data.hash, 6)}

- {data.market ? ( -

Market: {data.market}

- ) : null} -
- {statusLabel ? ( - - {statusLabel} - - ) : null} -
- {summaryRows.length ? ( -
- {summaryRows.map((row) => ( -
- - {row.label} - - - {row.value} - -
- ))} -
- ) : null} - {linkList(data.links)} -
-
- ); -}; - -function isOpenSeaResponse(response: unknown): response is OpenSeaResponse { - if (!response || typeof response !== "object") { - return false; - } - const type = (response as { type?: unknown }).type; - if (typeof type !== "string") { - return false; - } - return type.startsWith("opensea."); -} - -export function toOpenSeaResponse(response: unknown): OpenSeaResponse | undefined { - if (isOpenSeaResponse(response)) { - return response; - } - return undefined; -} - -export default function OpenSeaCard({ href, data }: { readonly href: string; readonly data: OpenSeaResponse }) { - if (data.type === "opensea.item") { - return renderItemCard(href, data); - } - - if (data.type === "opensea.collection" || data.type === "opensea.collection.slug") { - return renderCollectionCard(href, data); - } - - if (data.type === "opensea.tx") { - return renderTransactionCard(href, data); - } - - return null; -} diff --git a/components/waves/compound/types.ts b/components/waves/compound/types.ts index 44cfc64b1a..edfa6c21e4 100644 --- a/components/waves/compound/types.ts +++ b/components/waves/compound/types.ts @@ -1,9 +1,9 @@ -export interface CompoundLinkGroup { +interface CompoundLinkGroup { readonly marketUrl?: string; readonly etherscan?: string; } -export interface CompoundMarketV2Metrics { +interface CompoundMarketV2Metrics { readonly supplyApy: string; readonly borrowApy: string; readonly utilization: string; @@ -14,7 +14,7 @@ export interface CompoundMarketV2Metrics { readonly exchangeRate: string; } -export interface CompoundMarketV3Metrics { +interface CompoundMarketV3Metrics { readonly supplyApy: string; readonly borrowApy: string; readonly utilization: string; @@ -40,7 +40,7 @@ export interface CompoundMarketV2Response { readonly links: CompoundLinkGroup; } -export interface CompoundCollateralConfig { +interface CompoundCollateralConfig { readonly address: string; readonly symbol: string; readonly decimals: number; @@ -64,7 +64,7 @@ export interface CompoundMarketV3Response { readonly links: CompoundLinkGroup; } -export interface CompoundAccountV2Position { +interface CompoundAccountV2Position { readonly cToken: string; readonly symbol: string; readonly supplyUnderlying: string; @@ -75,14 +75,14 @@ export interface CompoundAccountV2Position { readonly usdPrice?: string; } -export interface CompoundAccountV3CollateralPosition { +interface CompoundAccountV3CollateralPosition { readonly asset: string; readonly amount: string; readonly usdPrice?: string; readonly collateralFactor: string; } -export interface CompoundAccountV3Position { +interface CompoundAccountV3Position { readonly comet: string; readonly baseSymbol: string; readonly supplyBase: string; @@ -112,7 +112,7 @@ export interface CompoundAccountResponse { readonly links?: CompoundLinkGroup; } -export interface CompoundTxSummary { +interface CompoundTxSummary { readonly version?: "v2" | "v3"; readonly action?: string; readonly market?: { @@ -135,7 +135,7 @@ export interface CompoundTxResponse { readonly links?: CompoundLinkGroup; } -export type CompoundMarketResponse = +type CompoundMarketResponse = | CompoundMarketV2Response | CompoundMarketV3Response; diff --git a/components/waves/drop/types/slider.types.ts b/components/waves/drop/types/slider.types.ts index 1f582cd44a..20a01e4379 100644 --- a/components/waves/drop/types/slider.types.ts +++ b/components/waves/drop/types/slider.types.ts @@ -1,4 +1,4 @@ -export interface SliderTheme { +interface SliderTheme { track: { background: string; hover: string; diff --git a/components/waves/drops/EditDropLexical.tsx b/components/waves/drops/EditDropLexical.tsx index 424fbbcd61..b52b765f5f 100644 --- a/components/waves/drops/EditDropLexical.tsx +++ b/components/waves/drops/EditDropLexical.tsx @@ -54,7 +54,7 @@ import EmojiPlugin from "@/components/drops/create/lexical/plugins/emoji/EmojiPl import { EmojiNode } from "@/components/drops/create/lexical/nodes/EmojiNode"; import { SAFE_MARKDOWN_TRANSFORMERS_WITHOUT_CODE } from "@/components/drops/create/lexical/transformers/markdownTransformers"; import PlainTextPastePlugin from "@/components/drops/create/lexical/plugins/PlainTextPastePlugin"; -import normalizeDropMarkdown, { exportDropMarkdown } from "./normalizeDropMarkdown"; +import { normalizeDropMarkdown, exportDropMarkdown } from "./normalizeDropMarkdown"; import { addBlankLinePlaceholders, removeBlankLinePlaceholders, diff --git a/components/waves/drops/LightDrop.tsx b/components/waves/drops/LightDrop.tsx index 12c84ce21e..b2a09acdab 100644 --- a/components/waves/drops/LightDrop.tsx +++ b/components/waves/drops/LightDrop.tsx @@ -1,7 +1,7 @@ import { FC } from "react"; import { ApiLightDrop } from "@/generated/models/ApiLightDrop"; -export interface LightDropProps { +interface LightDropProps { readonly drop: ApiLightDrop; } diff --git a/components/waves/drops/WaveDropQuoteWithSerialNo.tsx b/components/waves/drops/WaveDropQuoteWithSerialNo.tsx index 699501a4ef..8381aea800 100644 --- a/components/waves/drops/WaveDropQuoteWithSerialNo.tsx +++ b/components/waves/drops/WaveDropQuoteWithSerialNo.tsx @@ -28,14 +28,14 @@ const WaveDropQuoteWithSerialNo: React.FC = ({ limit: 1, dropId: null, serialNo, - strategy: WaveDropsSearchStrategy.FIND_BOTH, + strategy: WaveDropsSearchStrategy.Both, }, ], queryFn: async () => { const params: Record = { limit: "1", serial_no_limit: `${serialNo}`, - search_strategy: WaveDropsSearchStrategy.FIND_BOTH, + search_strategy: WaveDropsSearchStrategy.Both, }; const results = await commonApiFetch({ diff --git a/components/waves/drops/WaveDropReactions.tsx b/components/waves/drops/WaveDropReactions.tsx index 048f57b94e..ff1367f04f 100644 --- a/components/waves/drops/WaveDropReactions.tsx +++ b/components/waves/drops/WaveDropReactions.tsx @@ -47,7 +47,7 @@ const WaveDropReactions: React.FC = ({ drop }) => { ); }; -export function WaveDropReaction({ +function WaveDropReaction({ drop, reaction, }: { diff --git a/components/waves/drops/blankLinePlaceholders.ts b/components/waves/drops/blankLinePlaceholders.ts index 981ef26c25..e826745b9a 100644 --- a/components/waves/drops/blankLinePlaceholders.ts +++ b/components/waves/drops/blankLinePlaceholders.ts @@ -23,8 +23,3 @@ export const removeBlankLinePlaceholders = (markdown: string): string => { return markdown.replaceAll(BLANK_LINE_PLACEHOLDER, ""); }; - -export default { - addBlankLinePlaceholders, - removeBlankLinePlaceholders, -}; diff --git a/components/waves/drops/normalizeDropMarkdown.ts b/components/waves/drops/normalizeDropMarkdown.ts index da70b06281..255caad563 100644 --- a/components/waves/drops/normalizeDropMarkdown.ts +++ b/components/waves/drops/normalizeDropMarkdown.ts @@ -95,5 +95,3 @@ export const normalizeDropMarkdown = (markdown: string): string => { return normalizeLineEndings(markdown); }; - -export default normalizeDropMarkdown; diff --git a/components/waves/drops/reaction-utils.ts b/components/waves/drops/reaction-utils.ts index c2ca9c05b7..8790b61856 100644 --- a/components/waves/drops/reaction-utils.ts +++ b/components/waves/drops/reaction-utils.ts @@ -2,7 +2,7 @@ import { ApiIdentity } from "@/generated/models/ObjectSerializer"; import { ApiProfileMin } from "@/generated/models/ApiProfileMin"; import { ApiDropReaction } from "@/generated/models/ApiDropReaction"; -export type ReactionEntry = { +type ReactionEntry = { reaction: string; profiles: ApiProfileMin[]; [key: string]: unknown; @@ -21,7 +21,7 @@ export const cloneReactionEntries = ( })); }; -export const duplicateProfilesWithoutUser = ( +const duplicateProfilesWithoutUser = ( profiles: ApiProfileMin[], userId: string | null ): ApiProfileMin[] => { diff --git a/components/waves/drops/wave-drops-all/index.tsx b/components/waves/drops/wave-drops-all/index.tsx index c366d0e8d1..4225f1de4f 100644 --- a/components/waves/drops/wave-drops-all/index.tsx +++ b/components/waves/drops/wave-drops-all/index.tsx @@ -17,7 +17,7 @@ import { useWaveDropsNotificationRead } from "./hooks/useWaveDropsNotificationRe import { useWaveDropsSerialScroll } from "./hooks/useWaveDropsSerialScroll"; import { WaveDropsContent } from "./subcomponents/WaveDropsContent"; -export interface WaveDropsAllProps { +interface WaveDropsAllProps { readonly waveId: string; readonly dropId: string | null; readonly onReply: ({ diff --git a/components/waves/ens/types.ts b/components/waves/ens/types.ts index c3c87b250b..2ebe5e72c2 100644 --- a/components/waves/ens/types.ts +++ b/components/waves/ens/types.ts @@ -75,13 +75,3 @@ export const isEnsPreview = (value: unknown): value is EnsPreview => { record.type === "ens.content" ); }; - -export const isEnsNamePreview = (value: unknown): value is EnsNamePreview => { - return isEnsPreview(value) && value.type === "ens.name"; -}; - -export const isEnsAddressPreview = ( - value: unknown -): value is EnsAddressPreview => { - return isEnsPreview(value) && value.type === "ens.address"; -}; diff --git a/components/waves/memes/traits/schema.ts b/components/waves/memes/traits/schema.ts index f3e6968b02..8a9b42894c 100644 --- a/components/waves/memes/traits/schema.ts +++ b/components/waves/memes/traits/schema.ts @@ -76,7 +76,7 @@ export interface BaseFieldDefinition { /** * Text input field definition */ -export interface TextFieldDefinition extends BaseFieldDefinition { +interface TextFieldDefinition extends BaseFieldDefinition { readonly type: FieldType.TEXT; readonly readOnly?: boolean; readonly placeholder?: string; @@ -97,7 +97,7 @@ export interface NumberFieldDefinition extends BaseFieldDefinition { /** * Boolean toggle field definition */ -export interface BooleanFieldDefinition extends BaseFieldDefinition { +interface BooleanFieldDefinition extends BaseFieldDefinition { readonly type: FieldType.BOOLEAN; readonly initialValue?: boolean; } @@ -119,14 +119,14 @@ export type FieldDefinition = | DropdownFieldDefinition; // Section definition -export interface SectionDefinition { +interface SectionDefinition { readonly title: string; readonly layout: "single" | "double"; readonly fields: readonly FieldDefinition[]; } // Meme name options constant -export const MEME_NAME_OPTIONS = [ +const MEME_NAME_OPTIONS = [ "Seize the Memes of Production", "WAGMI", "Don't Let the Institutions Steal Your JPGs", diff --git a/components/waves/specs/groups/group/edit/WaveGroupEditButtons.tsx b/components/waves/specs/groups/group/edit/WaveGroupEditButtons.tsx index 8b00449437..fcca801281 100644 --- a/components/waves/specs/groups/group/edit/WaveGroupEditButtons.tsx +++ b/components/waves/specs/groups/group/edit/WaveGroupEditButtons.tsx @@ -17,7 +17,7 @@ import { type WaveGroupManageIdentitiesConfirmEvent, } from "./WaveGroupManageIdentitiesModal"; -export interface WaveGroupEditButtonsProps { +interface WaveGroupEditButtonsProps { readonly haveGroup: boolean; readonly wave: ApiWave; readonly type: WaveGroupType; diff --git a/components/waves/specs/groups/group/edit/buttons/hooks/useWaveGroupEditButtonsController.ts b/components/waves/specs/groups/group/edit/buttons/hooks/useWaveGroupEditButtonsController.ts index 411a65df46..45218b4fcf 100644 --- a/components/waves/specs/groups/group/edit/buttons/hooks/useWaveGroupEditButtonsController.ts +++ b/components/waves/specs/groups/group/edit/buttons/hooks/useWaveGroupEditButtonsController.ts @@ -457,7 +457,7 @@ export enum WaveGroupIdentitiesModal { EXCLUDE = "exclude", } -export interface WaveGroupEditButtonsController { +interface WaveGroupEditButtonsController { readonly mutating: boolean; readonly canIncludeIdentity: boolean; readonly canExcludeIdentity: boolean; diff --git a/components/waves/specs/groups/group/edit/buttons/utils/waveGroupEdit.ts b/components/waves/specs/groups/group/edit/buttons/utils/waveGroupEdit.ts index 4df444818c..decf1167db 100644 --- a/components/waves/specs/groups/group/edit/buttons/utils/waveGroupEdit.ts +++ b/components/waves/specs/groups/group/edit/buttons/utils/waveGroupEdit.ts @@ -9,11 +9,6 @@ import { updateGroupIdByType, } from "../../utils/waveGroupUpdate"; -export const clearGroupIdFromUpdateBody = ( - body: ApiUpdateWaveRequest, - type: WaveGroupType, -): ApiUpdateWaveRequest => updateGroupIdByType(body, type, null); - export const buildWaveUpdateBody = ( wave: ApiWave, type: WaveGroupType, diff --git a/components/waves/specs/groups/group/edit/utils/waveGroupUpdate.ts b/components/waves/specs/groups/group/edit/utils/waveGroupUpdate.ts index 95c1c3e73d..224cc34f59 100644 --- a/components/waves/specs/groups/group/edit/utils/waveGroupUpdate.ts +++ b/components/waves/specs/groups/group/edit/utils/waveGroupUpdate.ts @@ -74,5 +74,3 @@ export const getGroupIdByType = ( return typeof current === "string" || current === null ? current : null; }; - -export { waveGroupUpdatePaths }; diff --git a/constants/sidebar.ts b/constants/sidebar.ts index 58d56b6daa..538cdb0cbf 100644 --- a/constants/sidebar.ts +++ b/constants/sidebar.ts @@ -4,19 +4,5 @@ export const SIDEBAR_WIDTHS = { SUBMENU: "14rem", } as const; -export const SIDEBAR_DIMENSIONS = { - COLLAPSED_WIDTH_REM: 5, - SUBMENU_WIDTH_REM: 14, - SUBMENU_HEADER_HEIGHT_REM: 3.5, -} as const; - export const SIDEBAR_BREAKPOINT = 1280; export const SIDEBAR_MOBILE_BREAKPOINT = 1024; - -export const COLLECTIONS_ROUTES = [ - "/the-memes", - "/meme-lab", - "/rememes", - "/6529-gradient", - "/nextgen", -] as const; diff --git a/contexts/wave/hooks/types.ts b/contexts/wave/hooks/types.ts index bb43cb1c56..261c1d9ab3 100644 --- a/contexts/wave/hooks/types.ts +++ b/contexts/wave/hooks/types.ts @@ -27,8 +27,4 @@ export type WaveMessagesUpdate = Partial & { key: string; }; -export enum WaveDropsSearchStrategy { - FIND_OLDER = "FIND_OLDER", - FIND_NEWER = "FIND_NEWER", - FIND_BOTH = "FIND_BOTH", -} +export { ApiDropSearchStrategy as WaveDropsSearchStrategy } from "@/generated/models/ApiDropSearchStrategy"; diff --git a/contexts/wave/hooks/useEnhancedDmWavesList.ts b/contexts/wave/hooks/useEnhancedDmWavesList.ts index 3c05c377fe..f7cd45d724 100644 --- a/contexts/wave/hooks/useEnhancedDmWavesList.ts +++ b/contexts/wave/hooks/useEnhancedDmWavesList.ts @@ -2,24 +2,9 @@ import { useCallback, useMemo } from "react"; import useDmWavesList from "@/hooks/useDmWavesList"; -import useNewDropCounter, { - MinimalWaveNewDropsCount, - getNewestTimestamp, -} from "./useNewDropCounter"; +import useNewDropCounter, { getNewestTimestamp } from "./useNewDropCounter"; import { ApiWave } from "@/generated/models/ApiWave"; -import { ApiWaveType } from "@/generated/models/ApiWaveType"; - -export interface MinimalWave { - id: string; - name: string; - type: ApiWaveType; - newDropsCount: MinimalWaveNewDropsCount; - picture: string | null; - contributors: { - pfp: string; - }[]; - isPinned: boolean; -} +import type { MinimalWave } from "./useEnhancedWavesList"; function useEnhancedDmWavesList(activeWaveId: string | null) { const wavesData = useDmWavesList(); diff --git a/contexts/wave/utils/wave-messages-utils.ts b/contexts/wave/utils/wave-messages-utils.ts index 9f27eff746..ede8d19b6f 100644 --- a/contexts/wave/utils/wave-messages-utils.ts +++ b/contexts/wave/utils/wave-messages-utils.ts @@ -341,7 +341,7 @@ export async function fetchNewestWaveMessages( if (sinceSerialNo !== null) { // Assuming API uses these parameters for fetching newer messages params.serial_no_limit = `${sinceSerialNo}`; - params.search_strategy = "FIND_NEWER"; + params.search_strategy = ApiDropSearchStrategy.Newer; } try { diff --git a/entities/ISeason.ts b/entities/ISeason.ts index 78bc9fdb88..f308675af0 100644 --- a/entities/ISeason.ts +++ b/entities/ISeason.ts @@ -1,9 +1,3 @@ -export interface Season { - season: number; - count: number; - token_ids: number[]; -} - export interface MemeSeason { id: number; start_index: number; diff --git a/entities/ITDH.ts b/entities/ITDH.ts index ee622bc4a2..6aeac1fee7 100644 --- a/entities/ITDH.ts +++ b/entities/ITDH.ts @@ -200,11 +200,6 @@ interface BaseTDHMetrics extends TDH { dense_rank_unique_memes_season6__ties: number; } -export interface TDHMetrics extends TDH, BaseTDHMetrics {} -export interface ConsolidatedTDHMetrics - extends ConsolidatedTDH, - BaseTDHMetrics {} - export interface TDHCalc { date: Date; block: number; diff --git a/helpers/Types.tsx b/helpers/Types.tsx index e8febacc86..bb96b213db 100644 --- a/helpers/Types.tsx +++ b/helpers/Types.tsx @@ -1,6 +1,5 @@ import { SortDirection } from "@/entities/ISort"; import { ApiDrop } from "@/generated/models/ApiDrop"; -import { ApiIdentity } from "@/generated/models/ApiIdentity"; import { ApiProfileMin } from "@/generated/models/ApiProfileMin"; export interface FullPageRequest { @@ -348,8 +347,3 @@ export interface PageSSRMetadata { ogImage: string; twitterCard: "summary" | "summary_large_image"; } - -export interface UserPageProps { - profile: ApiIdentity; - metadata: PageSSRMetadata; -} diff --git a/helpers/WalletHelpers.ts b/helpers/WalletHelpers.ts index 82d395df88..0830d85fc3 100644 --- a/helpers/WalletHelpers.ts +++ b/helpers/WalletHelpers.ts @@ -1,6 +1,3 @@ -export const normaliseWalletList = (list: readonly string[]): string[] => - list.map((wallet) => wallet.trim().toLowerCase()).sort((a, b) => a.localeCompare(b)); - export const walletListsMatch = ( lhs: readonly string[] | null, rhs: readonly string[] | null diff --git a/helpers/video.helpers.ts b/helpers/video.helpers.ts index 4d29f1db5f..fd21498695 100644 --- a/helpers/video.helpers.ts +++ b/helpers/video.helpers.ts @@ -4,7 +4,7 @@ const CLOUDFRONT_DOMAIN = publicEnv.NEXT_PUBLIC_CLOUDFRONT_DOMAIN ?? "https://d3lqz0a4bldqgf.cloudfront.net"; -export interface VideoConversions { +interface VideoConversions { readonly MP4_1080P: string; readonly MP4_720P: string; readonly HLS: string; diff --git a/hooks/breadcrumbs.config.ts b/hooks/breadcrumbs.config.ts index fd8b537b4d..8cb3cf570c 100644 --- a/hooks/breadcrumbs.config.ts +++ b/hooks/breadcrumbs.config.ts @@ -296,7 +296,7 @@ export const DYNAMIC_ROUTE_CONFIGS: ReadonlyArray = [ * pairing each `config` object from `DYNAMIC_ROUTE_CONFIGS` with its correctly typed `params`. * `DeterminedRouteInfo` then unions this with a simple `{ type: "static" }` for non-dynamic routes. */ -export type SpecificDeterminedRouteInfo = +type SpecificDeterminedRouteInfo = (typeof DYNAMIC_ROUTE_CONFIGS)[number] extends infer C ? C extends { paramExtractor: (...args: any[]) => infer P | undefined } ? { readonly config: C; readonly params: P } diff --git a/hooks/breadcrumbs.types.ts b/hooks/breadcrumbs.types.ts index e04e272861..4bed3dfd1c 100644 --- a/hooks/breadcrumbs.types.ts +++ b/hooks/breadcrumbs.types.ts @@ -3,7 +3,7 @@ import { Crumb } from "@/components/breadcrumb/Breadcrumb"; /** * Defines the recognized types for dynamic routes within the breadcrumb system. */ -export type DynamicRouteType = +type DynamicRouteType = | "gradient" | "profile" | "meme" diff --git a/hooks/errors/WalletConnectionError.ts b/hooks/errors/WalletConnectionError.ts deleted file mode 100644 index dab2cb3774..0000000000 --- a/hooks/errors/WalletConnectionError.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Base error class for wallet connection issues - */ -export class WalletConnectionError extends Error { - constructor(message: string, public readonly code: string = 'WALLET_CONNECTION_ERROR') { - super(message); - this.name = 'WalletConnectionError'; - - // Ensure proper prototype chain for instanceof checks - Object.setPrototypeOf(this, WalletConnectionError.prototype); - } -} - -/** - * Error thrown when deep link connection times out - */ -export class DeepLinkTimeoutError extends WalletConnectionError { - constructor(timeoutMs: number) { - super(`Deep link connection timed out after ${timeoutMs}ms`, 'DEEP_LINK_TIMEOUT'); - this.name = 'DeepLinkTimeoutError'; - Object.setPrototypeOf(this, DeepLinkTimeoutError.prototype); - } -} - -/** - * Error thrown when connection verification fails - */ -export class ConnectionVerificationError extends WalletConnectionError { - constructor(currentState: string, expectedState: string = 'waiting_for_return') { - super( - `Invalid connection state for verification. Expected '${expectedState}', got '${currentState}'`, - 'CONNECTION_VERIFICATION_ERROR' - ); - this.name = 'ConnectionVerificationError'; - Object.setPrototypeOf(this, ConnectionVerificationError.prototype); - } -} \ No newline at end of file diff --git a/hooks/groups/useGroupMutations.ts b/hooks/groups/useGroupMutations.ts index 9306de3178..e5a4d189a7 100644 --- a/hooks/groups/useGroupMutations.ts +++ b/hooks/groups/useGroupMutations.ts @@ -20,7 +20,7 @@ export interface SubmitArgs { readonly publish?: boolean; } -export type SubmitResult = +type SubmitResult = | { readonly ok: true; readonly group: ApiGroupFull; @@ -33,12 +33,12 @@ export type SubmitResult = readonly validation?: GroupValidationResult; }; -export interface TestArgs { +interface TestArgs { readonly payload: ApiCreateGroup; readonly nameFallback: string; } -export type TestResult = +type TestResult = | { readonly ok: true; readonly group: ApiGroupFull; @@ -55,14 +55,14 @@ interface UseGroupMutationsArgs { readonly onGroupCreate?: () => void; } -export interface UpdateVisibilityArgs { +interface UpdateVisibilityArgs { readonly groupId: string; readonly visible: boolean; readonly oldVersionId?: string | null; readonly skipAuth?: boolean; } -export type UpdateVisibilityResult = +type UpdateVisibilityResult = | { readonly ok: true; readonly groupId: string; @@ -96,10 +96,6 @@ const resolveOldVersionId = ({ : null; }; -export { GROUP_INCLUDE_LIMIT, GROUP_EXCLUDE_LIMIT } from "@/services/groups/groupMutations"; -export { validateGroupPayload } from "@/services/groups/groupMutations"; -export type { ValidationIssue, ValidationResult } from "@/services/groups/groupMutations"; - export const useGroupMutations = ({ requestAuth, onGroupCreate, diff --git a/hooks/useAuthenticatedContent.tsx b/hooks/useAuthenticatedContent.tsx index fa088d6e43..d3852974bb 100644 --- a/hooks/useAuthenticatedContent.tsx +++ b/hooks/useAuthenticatedContent.tsx @@ -5,7 +5,7 @@ import { AuthContext } from "../components/auth/Auth"; import { useLayout } from "../components/brain/my-stream/layout/LayoutContext"; import { useSeizeConnectContext } from "../components/auth/SeizeConnectContext"; -export type ContentState = +type ContentState = | "not-authenticated" | "loading" | "needs-profile" @@ -63,4 +63,4 @@ export function useAuthenticatedContent() { fetchingProfile, spaces, }; -} \ No newline at end of file +} diff --git a/hooks/useCreateModalState.ts b/hooks/useCreateModalState.ts index 4e741c8c72..b8d0509700 100644 --- a/hooks/useCreateModalState.ts +++ b/hooks/useCreateModalState.ts @@ -12,7 +12,7 @@ export const CREATE_QUERY_KEY = "create"; export const CREATE_WAVE_VALUE = "wave"; export const CREATE_DIRECT_MESSAGE_VALUE = "dm"; -export type CreateModalMode = +type CreateModalMode = | typeof CREATE_WAVE_VALUE | typeof CREATE_DIRECT_MESSAGE_VALUE | null; diff --git a/hooks/useDropMessages.ts b/hooks/useDropMessages.ts index 930524ab08..793c877df6 100644 --- a/hooks/useDropMessages.ts +++ b/hooks/useDropMessages.ts @@ -72,7 +72,7 @@ export function useDropMessages(waveId: string, dropId: string | null) { lastPage.drops.at(-1)?.serial_no ? { serialNo: lastPage.drops.at(-1)?.serial_no ?? null, - strategy: WaveDropsSearchStrategy.FIND_OLDER, + strategy: WaveDropsSearchStrategy.Older, } : null, placeholderData: keepPreviousData, diff --git a/hooks/useHlsPlayer.ts b/hooks/useHlsPlayer.ts index f13b0d37db..0f6507c12d 100644 --- a/hooks/useHlsPlayer.ts +++ b/hooks/useHlsPlayer.ts @@ -3,7 +3,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; import type HlsType from "hls.js"; -export interface UseHlsPlayerParams { +interface UseHlsPlayerParams { /** The final video URL to load (m3u8 if isHls=true, or MP4, etc.) */ src: string; /** True if the above src is an .m3u8 that needs Hls.js. */ diff --git a/hooks/usePopoverPosition.ts b/hooks/usePopoverPosition.ts deleted file mode 100644 index 3ec29ecc7a..0000000000 --- a/hooks/usePopoverPosition.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { useLayoutEffect, useRef, useState } from "react"; - -interface Position { - top: number; - left: number; -} - -interface UsePopoverPositionOptions { - offset?: number; - viewportPadding?: number; -} - -export function usePopoverPosition( - triggerPosition: Position, - options: UsePopoverPositionOptions = {} -) { - const { offset = 0, viewportPadding = 16 } = options; - const popoverRef = useRef(null); - const [adjustedPosition, setAdjustedPosition] = useState({ - top: triggerPosition.top, - left: triggerPosition.left + offset, - }); - - useLayoutEffect(() => { - // For full-height flyout, always position at top - setAdjustedPosition({ - top: 0, - left: triggerPosition.left + offset - }); - }, [triggerPosition.left, offset]); - - return { popoverRef, position: adjustedPosition }; -} \ No newline at end of file diff --git a/hooks/useVirtualizedWaves.ts b/hooks/useVirtualizedWaves.ts index c5fbccf96f..973c214ab8 100644 --- a/hooks/useVirtualizedWaves.ts +++ b/hooks/useVirtualizedWaves.ts @@ -9,7 +9,7 @@ export interface VirtualItem { size: number; } -export const SENTINEL_HEIGHT = 40; +const SENTINEL_HEIGHT = 40; export function useVirtualizedWaves( items: readonly T[], diff --git a/hooks/waves/useWaveScopePermissions.ts b/hooks/waves/useWaveScopePermissions.ts deleted file mode 100644 index aa1a18ce2a..0000000000 --- a/hooks/waves/useWaveScopePermissions.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { useMemo } from "react"; -import { useWaveData } from "@/hooks/useWaveData"; -import { useWaveEligibility } from "@/contexts/wave/WaveEligibilityContext"; -import { useAuth } from "@/components/auth/Auth"; -import { isGroupAuthor as computeIsGroupAuthor } from "@/components/waves/specs/groups/group/edit/buttons/utils/waveGroupEdit"; -import { ApiWaveScope } from "@/generated/models/ApiWaveScope"; -import { ApiGroup } from "@/generated/models/ApiGroup"; -import { ApiWave } from "@/generated/models/ApiWave"; -import { ApiIdentity } from "@/generated/models/ApiIdentity"; - -interface WaveScopeSummary { - readonly hasGroup: boolean; - readonly group: ApiGroup | null; - readonly isGroupAuthor: boolean; - /** Convenience flag: true when the user created the group or there is no group yet */ - readonly isGroupAuthorOrNoGroup: boolean; -} - -interface UseWaveScopePermissionsResult { - readonly isLoading: boolean; - readonly isFetching: boolean; - readonly isWaveAdmin: boolean; - readonly hasEligibility: boolean; - readonly eligibilityUpdatedAt: number | null; - readonly wave: ApiWave | undefined; - readonly scopes: { - readonly view: WaveScopeSummary; - readonly drop: WaveScopeSummary; - readonly vote: WaveScopeSummary; - readonly chat: WaveScopeSummary; - } | null; -} - -const buildScopeSummary = ( - scope: ApiWaveScope, - connectedProfile: ApiIdentity | null -): WaveScopeSummary => { - const group = scope.group ?? null; - const hasGroup = group !== null; - const isGroupAuthor = computeIsGroupAuthor(group, connectedProfile); - - return { - hasGroup, - group, - isGroupAuthor, - isGroupAuthorOrNoGroup: isGroupAuthor || !hasGroup, - }; -}; - -export function useWaveScopePermissions( - waveId: string | null | undefined = null -): UseWaveScopePermissionsResult { - const { data: wave, isLoading, isFetching } = useWaveData({ - waveId: waveId ?? null, - }); - const { getEligibility } = useWaveEligibility(); - const { connectedProfile } = useAuth(); - - const eligibility = waveId ? getEligibility(waveId) : null; - - const scopes = useMemo(() => { - if (!wave) { - return null; - } - - return { - view: buildScopeSummary( - wave.visibility.scope, - connectedProfile - ), - drop: buildScopeSummary( - wave.participation.scope, - connectedProfile - ), - vote: buildScopeSummary( - wave.voting.scope, - connectedProfile - ), - chat: buildScopeSummary( - wave.chat.scope, - connectedProfile - ), - }; - }, [wave, connectedProfile, connectedProfile?.id, connectedProfile?.handle]); - - const isWaveAdmin = eligibility?.authenticated_user_admin ?? false; - - return { - isLoading, - isFetching, - isWaveAdmin, - hasEligibility: !!eligibility, - eligibilityUpdatedAt: eligibility?.lastUpdated ?? null, - wave, - scopes, - }; -} - -export default useWaveScopePermissions; diff --git a/knip.jsonc b/knip.jsonc new file mode 100644 index 0000000000..fed5237e7b --- /dev/null +++ b/knip.jsonc @@ -0,0 +1,47 @@ +{ + "$schema": "https://unpkg.com/knip@5/schema-jsonc.json", + + // 1) Tell Knip where your code lives (project graph) + "project": [ + "**/*.{ts,tsx,js,jsx,cjs,mjs}", + "!{node_modules,.next,coverage,public}/**", + "!{tmp_gen_outp}/**" + ], + + // 2) Optionally add entries Knip can't infer from scripts/configs + // (Next.js entries are auto-added by the Next plugin) + "entry": [ + "scripts/**/*.{ts,js,cjs,mjs}", // local CLIs used via package.json scripts + "app/**/route.{ts,tsx}" // Next App Router route handlers (if used) + ], + + // 3) Paths: Knip auto-imports TS path aliases from tsconfig, + // but you can add manual aliases here if needed. + // "paths": { "@/*": ["./src/*"] }, + + // 4) Report unused exports even in entry files (private repos benefit from this) + "includeEntryExports": true, + + // 5) Generated code: keep analyzing, but avoid noisy "unused exports/files" here + "ignoreIssues": { + "generated/**": ["exports", "types", "enumMembers"] // ignore only these issue kinds + }, + "ignoreFiles": [ + "generated/**", // don't list generated files as "Unused files" + "tmp_gen_outp/**", + "next-sitemap.config.js", + "stubs/empty.js" + ], + "ignoreDependencies": [ + "@openapitools/openapi-generator-cli", + "bootstrap", + "pino-pretty" + ], + + // 6) Make config mistakes visible in CI + "treatConfigHintsAsErrors": true + + // Plugins: usually automatic. Example to force-enable if needed: + // "playwright": true + } + diff --git a/lib/cache/lruTtl.ts b/lib/cache/lruTtl.ts index 72bbca68d9..f478834692 100644 --- a/lib/cache/lruTtl.ts +++ b/lib/cache/lruTtl.ts @@ -1,4 +1,4 @@ -export type LruTtlOptions = { +type LruTtlOptions = { readonly max: number; readonly ttlMs: number; }; diff --git a/lib/ens/detect.ts b/lib/ens/detect.ts index 6ede46e0e6..5677bec1f5 100644 --- a/lib/ens/detect.ts +++ b/lib/ens/detect.ts @@ -106,9 +106,3 @@ export const detectEnsTarget = ( export const isLikelyEnsTarget = (value: string | null | undefined): boolean => { return detectEnsTarget(value) !== null; }; - -export const __testables = { - extractEnsNameFromUrl, - extractAddressCandidate, - extractNameCandidate, -}; diff --git a/lib/security/urlGuard.ts b/lib/security/urlGuard.ts index 139de7d16a..3836e9c9e2 100644 --- a/lib/security/urlGuard.ts +++ b/lib/security/urlGuard.ts @@ -2,7 +2,7 @@ import { lookup } from "node:dns/promises"; import { isIP } from "node:net"; import { toASCII } from "node:punycode"; -export type UrlGuardErrorKind = +type UrlGuardErrorKind = | "missing-url" | "invalid-url" | "unsupported-protocol" @@ -34,7 +34,7 @@ export interface UrlGuardHostPolicy { readonly blockedHostSuffixes?: readonly string[]; } -export interface UrlGuardHooks { +interface UrlGuardHooks { readonly onBlockedUrl?: (details: { readonly url: URL; readonly reason: UrlGuardErrorKind; readonly message: string }) => void; } @@ -44,7 +44,7 @@ export interface UrlGuardOptions { readonly hooks?: UrlGuardHooks; } -export interface ParsePublicUrlOptions { +interface ParsePublicUrlOptions { readonly allowedProtocols?: readonly string[]; readonly missingUrlMessage?: string; readonly invalidUrlMessage?: string; @@ -479,5 +479,3 @@ export async function fetchPublicJson( return (await response.json()) as T; } - -export { DEFAULT_REDIRECT_STATUS_CODES }; diff --git a/lib/text/html.ts b/lib/text/html.ts index 6bfef39c3a..279f9c40f8 100644 --- a/lib/text/html.ts +++ b/lib/text/html.ts @@ -1,4 +1,4 @@ -export interface StripHtmlTagsOptions { +interface StripHtmlTagsOptions { readonly maxLength?: number; readonly preserveTagSpacing?: boolean; } diff --git a/package-lock.json b/package-lock.json index 52413045b7..54930331a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "6529seize", "version": "1.0.0", "dependencies": { + "@adraffy/ens-normalize": "^1.11.1", "@capacitor/app": "7.0.1", "@capacitor/barcode-scanner": "^2.0.3", "@capacitor/core": "7.4.1", @@ -26,30 +27,42 @@ "@google/model-viewer": "^3.5.0", "@headlessui/react": "^2.2.2", "@heroicons/react": "^2.2.0", + "@lexical/code": "^0.14.5", + "@lexical/link": "^0.14.5", + "@lexical/list": "^0.14.5", + "@lexical/markdown": "^0.14.5", "@lexical/react": "^0.14.2", + "@lexical/rich-text": "^0.14.5", + "@lexical/selection": "^0.14.5", + "@lexical/table": "^0.14.5", + "@lexical/utils": "^0.14.5", "@mojs/core": "^1.7.1", "@openapitools/openapi-generator-cli": "^2.13.9", "@reduxjs/toolkit": "^2.2.5", "@reown/appkit": "^1.8.8", "@reown/appkit-adapter-wagmi": "^1.8.8", + "@reown/appkit-common": "^1.8.11", "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/forms": "^0.5.7", "@tanstack/query-core": "^5.45.0", "@tanstack/react-query": "^5.45.1", "@types/lodash": "^4.17.10", - "@uiw/react-md-editor": "^4.0.8", "aws-rum-web": "^1.25.0", + "axios": "^1.12.2", "bootstrap": "^5.3.3", "capacitor-secure-storage-plugin": "^0.11.0", "chart.js": "^4.4.9", "cheerio": "^1.1.2", + "clsx": "^2.1.1", "cross-env": "^7.0.3", "csv-parser": "^3.0.0", + "date-fns": "^2.30.0", "emoji-mart": "^5.6.0", "emoji-regex": "^10.6.0", "ethereum-cryptography": "^2.2.0", "ethers": "^6.13.5", "focus-trap-react": "^11.0.3", + "form-data": "^4.0.4", "framer-motion": "^11.2.11", "gif-picker-react": "^1.4.0", "hammerjs": "^2.0.8", @@ -62,11 +75,10 @@ "jwt-decode": "^4.0.0", "lexical": "^0.14.2", "lodash": "^4.17.21", - "luxon": "^3.6.1", - "multiformats": "^13.4.1", "next": "16.0.0", "next-redux-wrapper": "^8.1.0", "next-sitemap": "^4.2.3", + "p-limit": "^3.1.0", "p-retry": "^6.2.1", "qrcode": "^1.5.4", "react": "19.2.0", @@ -90,13 +102,14 @@ "sass": "^1.77.6", "swiper": "^11.1.4", "three": "^0.163.0", + "unified": "^11.0.5", "use-debounce": "^10.0.3", "uuid": "^10.0.0", "viem": "^2.37.13", "wagmi": "^2.17.5" }, "devDependencies": { - "@next/bundle-analyzer": "16.0.0", + "@jest/globals": "^30.2.0", "@playwright/test": "^1.52.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", @@ -105,7 +118,6 @@ "@types/jest": "^29.5.14", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", - "@types/luxon": "^3.6.0", "@types/node": "^20.17.30", "@types/qrcode": "^1.5.5", "@types/react": "19.2.2", @@ -114,27 +126,32 @@ "@types/react-toggle": "^4.0.5", "@types/uuid": "^9.0.8", "autoprefixer": "^10.4.19", + "babel-jest": "^29.7.0", "babel-plugin-react-compiler": "^1.0.0", + "depcheck": "^1.4.7", "dotenv": "^16.0.3", "esbuild": "^0.25.10", "eslint": "^9.38.0", "eslint-config-next": "16.0.0", + "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-unused-imports": "^4.3.0", - "glob": "^11.0.3", "identity-obj-proxy": "^3.0.0", + "istanbul-lib-coverage": "^3.2.2", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "knip": "^5.50.5", "nodemon": "^3.1.4", - "pino-pretty": "^13.0.0", + "pino-pretty": "^13.1.2", "playwright": "^1.52.0", "postcss": "^8.4.38", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.4", "ts-jest": "^29.3.2", "ts-morph": "^27.0.0", + "ts-prune": "^0.10.3", "tsx": "^4.20.6", "typescript": "^5.9.3", + "typescript-eslint": "^8.46.2", "zod": "^3.25.76" } }, @@ -146,9 +163,9 @@ "license": "MIT" }, "node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", "license": "MIT" }, "node_modules/@alloc/quick-lru": { @@ -1297,16 +1314,6 @@ "integrity": "sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==", "license": "MIT" }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@ecies/ciphers": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.4.tgz", @@ -3083,6 +3090,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -3144,273 +3161,802 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "node_modules/@jest/globals": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, "license": "MIT", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/@jest/globals/node_modules/@jest/environment": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@jest/globals/node_modules/@jest/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@jest/globals/node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@jest/get-type": "30.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@jest/globals/node_modules/@jest/fake-timers": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "node_modules/@jest/globals/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "node_modules/@jest/globals/node_modules/@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "write-file-atomic": "^5.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", + "node_modules/@jest/globals/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/globals/node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@sinonjs/commons": "^3.0.1" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "node_modules/@jest/globals/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@jest/globals/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@jest/globals/node_modules/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "node_modules/@lexical/clipboard": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.14.5.tgz", - "integrity": "sha512-22xbagoQ8jiwImRtMcRl3+pojsiqF0cSfMXbjsHc5fPAq3ULf8OvAMkiSWEOxGQA6I6VIHX30+HtwZ7TgdPJ7A==", + "node_modules/@jest/globals/node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "dev": true, "license": "MIT", "dependencies": { - "@lexical/html": "0.14.5", - "@lexical/list": "0.14.5", - "@lexical/selection": "0.14.5", - "@lexical/utils": "0.14.5", - "lexical": "0.14.5" + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@lexical/code": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.14.5.tgz", - "integrity": "sha512-eBZ5GMx2VDg7tC085qCD2+hzwGm5b6M/b4LXiPW0In6/SmJIDnEOppSz7jmHezWkLIGL2xK43gw1oqTY9igwug==", + "node_modules/@jest/globals/node_modules/jest-haste-map": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", + "dev": true, "license": "MIT", "dependencies": { - "@lexical/utils": "0.14.5", - "lexical": "0.14.5", - "prismjs": "^1.27.0" + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" } }, - "node_modules/@lexical/devtools-core": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.14.5.tgz", - "integrity": "sha512-4yTZ8Q9sDkvA5n96wEstru2NonAJ6T/zuSTcYizddwDJr56tzanSdJUFbEIG6G3ankqbKMRYNetupD/Ks3sXEg==", + "node_modules/@jest/globals/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-snapshot": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-worker": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/globals/node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/globals/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@lexical/clipboard": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.14.5.tgz", + "integrity": "sha512-22xbagoQ8jiwImRtMcRl3+pojsiqF0cSfMXbjsHc5fPAq3ULf8OvAMkiSWEOxGQA6I6VIHX30+HtwZ7TgdPJ7A==", + "license": "MIT", + "dependencies": { + "@lexical/html": "0.14.5", + "@lexical/list": "0.14.5", + "@lexical/selection": "0.14.5", + "@lexical/utils": "0.14.5", + "lexical": "0.14.5" + } + }, + "node_modules/@lexical/code": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.14.5.tgz", + "integrity": "sha512-eBZ5GMx2VDg7tC085qCD2+hzwGm5b6M/b4LXiPW0In6/SmJIDnEOppSz7jmHezWkLIGL2xK43gw1oqTY9igwug==", + "license": "MIT", + "dependencies": { + "@lexical/utils": "0.14.5", + "lexical": "0.14.5", + "prismjs": "^1.27.0" + } + }, + "node_modules/@lexical/devtools-core": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.14.5.tgz", + "integrity": "sha512-4yTZ8Q9sDkvA5n96wEstru2NonAJ6T/zuSTcYizddwDJr56tzanSdJUFbEIG6G3ankqbKMRYNetupD/Ks3sXEg==", "license": "MIT", "dependencies": { "@lexical/html": "0.14.5", @@ -4327,16 +4873,6 @@ } } }, - "node_modules/@next/bundle-analyzer": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-16.0.0.tgz", - "integrity": "sha512-OYufQoNm/Im2fYQBdXu9fqUrXaP3lPuPnryW0XNGG7kJiGxH/VWS8zc2/x4aW2LQGn+opqIJYNRXy7k5qV/09g==", - "dev": true, - "license": "MIT", - "dependencies": { - "webpack-bundle-analyzer": "4.10.1" - } - }, "node_modules/@next/env": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.0.tgz", @@ -5294,6 +5830,19 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "node_modules/@playwright/test": { "version": "1.56.0", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.0.tgz", @@ -5310,13 +5859,6 @@ "node": ">=18" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -5539,6 +6081,17 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@reown/appkit-adapter-wagmi/node_modules/@reown/appkit-common": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", + "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.37.9" + } + }, "node_modules/@reown/appkit-adapter-wagmi/node_modules/@scure/bip32": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", @@ -5785,9 +6338,9 @@ } }, "node_modules/@reown/appkit-common": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", - "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.11.tgz", + "integrity": "sha512-rRcxrah6uouqEo/VbniVH11Y3H27BsP+Psv2+Usic+3Rt4kiSImIyeDG1YBV0gZNmME9N3sXHK8Bt7iqkxdOWw==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "big.js": "6.2.2", @@ -5847,6 +6400,17 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@reown/appkit-controllers/node_modules/@reown/appkit-common": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", + "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.37.9" + } + }, "node_modules/@reown/appkit-controllers/node_modules/@scure/bip32": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", @@ -6115,6 +6679,17 @@ "@lit-labs/ssr-dom-shim": "^1.4.0" } }, + "node_modules/@reown/appkit-pay/node_modules/@reown/appkit-common": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", + "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.37.9" + } + }, "node_modules/@reown/appkit-pay/node_modules/lit": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.0.tgz", @@ -6178,6 +6753,17 @@ "@lit-labs/ssr-dom-shim": "^1.4.0" } }, + "node_modules/@reown/appkit-scaffold-ui/node_modules/@reown/appkit-common": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", + "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.37.9" + } + }, "node_modules/@reown/appkit-scaffold-ui/node_modules/lit": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.0.tgz", @@ -6232,6 +6818,17 @@ "@lit-labs/ssr-dom-shim": "^1.4.0" } }, + "node_modules/@reown/appkit-ui/node_modules/@reown/appkit-common": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", + "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.37.9" + } + }, "node_modules/@reown/appkit-ui/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -6458,6 +7055,17 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@reown/appkit-utils/node_modules/@reown/appkit-common": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", + "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.37.9" + } + }, "node_modules/@reown/appkit-utils/node_modules/@scure/bip32": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", @@ -6715,6 +7323,17 @@ "zod": "3.22.4" } }, + "node_modules/@reown/appkit-wallet/node_modules/@reown/appkit-common": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", + "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.37.9" + } + }, "node_modules/@reown/appkit-wallet/node_modules/zod": { "version": "3.22.4", "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", @@ -6763,6 +7382,17 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@reown/appkit/node_modules/@reown/appkit-common": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", + "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.37.9" + } + }, "node_modules/@reown/appkit/node_modules/@scure/bip32": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", @@ -7926,13 +8556,6 @@ "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", "license": "MIT" }, - "node_modules/@types/luxon": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", - "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -7942,6 +8565,13 @@ "@types/unist": "*" } }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", @@ -7958,10 +8588,11 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true, "license": "MIT" }, "node_modules/@types/prop-types": { @@ -8351,145 +8982,49 @@ "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", - "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@uiw/copy-to-clipboard": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@uiw/copy-to-clipboard/-/copy-to-clipboard-1.0.17.tgz", - "integrity": "sha512-O2GUHV90Iw2VrSLVLK0OmNIMdZ5fgEg4NhvtwINsX+eZ/Wf6DWD0TdsK9xwV7dNRnK/UI2mQtl0a2/kRgm1m1A==", - "license": "MIT", - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, - "node_modules/@uiw/react-markdown-preview": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@uiw/react-markdown-preview/-/react-markdown-preview-5.1.5.tgz", - "integrity": "sha512-DNOqx1a6gJR7Btt57zpGEKTfHRlb7rWbtctMRO2f82wWcuoJsxPBrM+JWebDdOD0LfD8oe2CQvW2ICQJKHQhZg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@uiw/copy-to-clipboard": "~1.0.12", - "react-markdown": "~9.0.1", - "rehype-attr": "~3.0.1", - "rehype-autolink-headings": "~7.1.0", - "rehype-ignore": "^2.0.0", - "rehype-prism-plus": "2.0.0", - "rehype-raw": "^7.0.0", - "rehype-rewrite": "~4.0.0", - "rehype-slug": "~6.0.0", - "remark-gfm": "~4.0.0", - "remark-github-blockquote-alert": "^1.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@uiw/react-markdown-preview/node_modules/react-markdown": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.3.tgz", - "integrity": "sha512-Yk7Z94dbgYTOrdk41Z74GoKA7rThnsbbqBTRYuxoe08qvfQ9tJVhmAKw6BJS/ZORG7kTy/s1QvYzSuaoBA1qfw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "@typescript-eslint/typescript-estree": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@uiw/react-markdown-preview/node_modules/rehype-prism-plus": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rehype-prism-plus/-/rehype-prism-plus-2.0.0.tgz", - "integrity": "sha512-FeM/9V2N7EvDZVdR2dqhAzlw5YI49m9Tgn7ZrYJeYHIahM6gcXpH0K1y2gNnKanZCydOMluJvX2cB9z3lhY8XQ==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", + "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "dev": true, "license": "MIT", "dependencies": { - "hast-util-to-string": "^3.0.0", - "parse-numeric-range": "^1.3.0", - "refractor": "^4.8.0", - "rehype-parse": "^9.0.0", - "unist-util-filter": "^5.0.0", - "unist-util-visit": "^5.0.0" + "@typescript-eslint/types": "8.46.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@uiw/react-md-editor": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@uiw/react-md-editor/-/react-md-editor-4.0.8.tgz", - "integrity": "sha512-S3mOzZeGmJNhzdXJxRTCwsFMDp8nBWeQUf59cK3L6QHzDUHnRoHpcmWpfVRyKGKSg8zaI2+meU5cYWf8kYn3mQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.14.6", - "@uiw/react-markdown-preview": "^5.0.6", - "rehype": "~13.0.0", - "rehype-prism-plus": "~2.0.0" + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "url": "https://opencollective.com/eslint" } }, "node_modules/@ungap/structured-clone": { @@ -8540,6 +9075,67 @@ "darwin" ] }, + "node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.19", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", + "dev": true, + "license": "MIT" + }, "node_modules/@wagmi/connectors": { "version": "5.11.2", "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.11.2.tgz", @@ -10310,6 +10906,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/array-includes": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", @@ -10333,6 +10939,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", @@ -10453,6 +11069,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", @@ -10819,16 +11445,6 @@ "node": ">=10.0.0" } }, - "node_modules/bcp-47-match": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", - "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/big.js": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", @@ -11112,6 +11728,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -11667,6 +12292,33 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -11776,22 +12428,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css-selector-parser": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.1.3.tgz", - "integrity": "sha512-gJMigczVZqYAk0hPVzx/M4Hm1D9QOtqkdQk9005TNzDIUGzo5cnHEDiKUT7jGPximL/oYb+LIitcHFQ4aKupxg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -12008,13 +12644,6 @@ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", "license": "MIT" }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true, - "license": "MIT" - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -12125,59 +12754,236 @@ "gopd": "^1.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depcheck": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/depcheck/-/depcheck-1.4.7.tgz", + "integrity": "sha512-1lklS/bV5chOxwNKA/2XUUk/hPORp8zihZsXflr8x0kLwmcZ9Y9BsS6Hs3ssvA+2wUVbG0U2Ciqvm1SokNjPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.2", + "@vue/compiler-sfc": "^3.3.4", + "callsite": "^1.0.0", + "camelcase": "^6.3.0", + "cosmiconfig": "^7.1.0", + "debug": "^4.3.4", + "deps-regex": "^0.2.0", + "findup-sync": "^5.0.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.0", + "js-yaml": "^3.14.1", + "json5": "^2.2.3", + "lodash": "^4.17.21", + "minimatch": "^7.4.6", + "multimatch": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "readdirp": "^3.6.0", + "require-package-name": "^2.0.1", + "resolve": "^1.22.3", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "yargs": "^16.2.0" + }, + "bin": { + "depcheck": "bin/depcheck.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/depcheck/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/depcheck/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/depcheck/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depcheck/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/depcheck/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/depcheck/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/depcheck/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/depcheck/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "license": "MIT" - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "node_modules/depcheck/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "license": "MIT", "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">= 14" + "node": ">=10" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", + "node_modules/depcheck/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", "engines": { - "node": ">=0.4.0" + "node": ">=10" } }, + "node_modules/deps-regex": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deps-regex/-/deps-regex-0.2.0.tgz", + "integrity": "sha512-PwuBojGMQAYbWkMXOY9Pd/NWCDNHVH12pnS7WHqZkTSeMESe4hwnKKRp0yR87g37113x4JPbo/oIvXY+s/f56Q==", + "dev": true, + "license": "MIT" + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -12208,6 +13014,16 @@ "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", "license": "MIT" }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -12266,19 +13082,6 @@ "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", "license": "MIT" }, - "node_modules/direction": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", - "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", - "license": "MIT", - "bin": { - "direction": "cli.js" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -12399,13 +13202,6 @@ "node": ">= 0.4" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" - }, "node_modules/duplexify": { "version": "4.1.3", "license": "MIT", @@ -13476,6 +14272,13 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -13616,6 +14419,12 @@ "node": ">=14.0.0" } }, + "node_modules/ethers/node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, "node_modules/ethers/node_modules/@noble/curves": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", @@ -13743,6 +14552,19 @@ "node": ">= 0.8.0" } }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -13986,6 +14808,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -14378,12 +15216,6 @@ "react-dom": ">=17" } }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "license": "ISC" - }, "node_modules/glob": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", @@ -14434,6 +15266,51 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -14489,22 +15366,6 @@ "dev": true, "license": "MIT" }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/h3": { "version": "1.15.4", "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", @@ -14637,192 +15498,40 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-from-html": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", - "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-has-property": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", - "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-heading-rank": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", - "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-sanitize": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", - "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "unist-util-position": "^5.0.0" + "function-bind": "^1.1.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" } }, - "node_modules/hast-util-select": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", - "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "bcp-47-match": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "css-selector-parser": "^3.0.0", - "devlop": "^1.0.0", - "direction": "^2.0.0", - "hast-util-has-property": "^3.0.0", - "hast-util-to-string": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "nth-check": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" + "@types/hast": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "node_modules/hast-util-sanitize": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", + "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" + "@ungap/structured-clone": "^1.0.0", + "unist-util-position": "^5.0.0" }, "funding": { "type": "opencollective", @@ -14856,48 +15565,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5/node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/hast-util-to-string": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", - "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", @@ -14911,23 +15578,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/help-me": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", @@ -14967,6 +15617,19 @@ "integrity": "sha512-hNEzjZNHf5bFrUNvdS4/1RjIanuJ6szpWNfTaX5I6WfGynWXGT7K/YQLYtemSvFExzeMdgdE4SsyVLJbd5PcZA==", "license": "Apache-2.0" }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hono": { "version": "4.9.10", "resolved": "https://registry.npmjs.org/hono/-/hono-4.9.10.tgz", @@ -15025,16 +15688,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/html5-qrcode": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz", @@ -15280,6 +15933,13 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, "node_modules/inline-style-parser": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", @@ -15757,16 +16417,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -15947,6 +16597,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -16843,6 +17503,22 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runtime/node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-runtime/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -17376,9 +18052,9 @@ } }, "node_modules/knip": { - "version": "5.64.2", - "resolved": "https://registry.npmjs.org/knip/-/knip-5.64.2.tgz", - "integrity": "sha512-gyIN+ZqZjyxdsocvkZx2HMy7D9+5WAgFrTM69sGg1QZ8wZuabtanhAP8ZnroctU26sQ5bO2RSPvjnOn0pRNuKw==", + "version": "5.66.3", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.66.3.tgz", + "integrity": "sha512-BEe9ZCI8fm4TJzehnrCt+L/Faqu6qfMH6VrwSfck+lCGotQzf0jh5dVXysPWjWqMpdUSr6+MpMu9JW/G6wiAcQ==", "dev": true, "funding": [ { @@ -17722,15 +18398,6 @@ "yallist": "^3.0.2" } }, - "node_modules/luxon": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -17742,6 +18409,16 @@ "lz-string": "bin/bin.js" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -18780,6 +19457,19 @@ } } }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/motion-dom": { "version": "11.18.1", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", @@ -18795,27 +19485,31 @@ "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", "license": "MIT" }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, - "node_modules/multiformats": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", - "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", - "license": "Apache-2.0 OR MIT" + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/mute-stream": { "version": "0.0.8", @@ -19464,16 +20158,6 @@ "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==", "license": "MIT" }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -19563,12 +20247,6 @@ } } }, - "node_modules/ox/node_modules/@adraffy/ens-normalize": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", - "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", - "license": "MIT" - }, "node_modules/ox/node_modules/@noble/ciphers": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", @@ -19670,7 +20348,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -19854,11 +20531,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", - "license": "ISC" + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/parse5": { "version": "7.3.0", @@ -19984,6 +20665,16 @@ "node": ">=16" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -20040,9 +20731,9 @@ } }, "node_modules/pino-pretty": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.1.tgz", - "integrity": "sha512-TNNEOg0eA0u+/WuqH0MH0Xui7uqVk9D74ESOpjtebSQYbNWJk/dIxCXIxFsNfeN53JmtWqYHP2OrIZjT/CBEnA==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.2.tgz", + "integrity": "sha512-3cN0tCakkT4f3zo9RXDIhy6GTvtYD6bK4CRBLN9j3E/ePqN1tugAXD5rGVfoChW6s0hiek+eyYlLNqc/BG7vBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20066,6 +20757,8 @@ }, "node_modules/pino-pretty/node_modules/on-exit-leak-free": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "dev": true, "license": "MIT", "engines": { @@ -20074,6 +20767,8 @@ }, "node_modules/pino-pretty/node_modules/pino-abstract-transport": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", "dev": true, "license": "MIT", "dependencies": { @@ -20082,6 +20777,8 @@ }, "node_modules/pino-pretty/node_modules/sonic-boom": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", "dev": true, "license": "MIT", "dependencies": { @@ -20227,6 +20924,16 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, "node_modules/pngjs": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", @@ -20284,12 +20991,6 @@ } } }, - "node_modules/porto/node_modules/@adraffy/ens-normalize": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", - "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", - "license": "MIT" - }, "node_modules/porto/node_modules/@noble/ciphers": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", @@ -21432,84 +22133,13 @@ "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/refractor": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-4.9.0.tgz", - "integrity": "sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/prismjs": "^1.0.0", - "hastscript": "^7.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/refractor/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/refractor/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/refractor/node_modules/hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/refractor/node_modules/hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/refractor/node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "license": "MIT", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexp.prototype.flags": { @@ -21533,56 +22163,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rehype": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", - "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "rehype-parse": "^9.0.0", - "rehype-stringify": "^10.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-attr": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/rehype-attr/-/rehype-attr-3.0.3.tgz", - "integrity": "sha512-Up50Xfra8tyxnkJdCzLBIBtxOcB2M1xdeKe1324U06RAvSjYm7ULSeoM+b/nYPQPVd7jsXJ9+39IG1WAJPXONw==", - "license": "MIT", - "dependencies": { - "unified": "~11.0.0", - "unist-util-visit": "~5.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, - "node_modules/rehype-autolink-headings": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz", - "integrity": "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-heading-rank": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/rehype-external-links": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", @@ -21601,84 +22181,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-ignore": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/rehype-ignore/-/rehype-ignore-2.0.2.tgz", - "integrity": "sha512-BpAT/3lU9DMJ2siYVD/dSR0A/zQgD6Fb+fxkJd4j+wDVy6TYbYpK+FZqu8eM9EuNKGvi4BJR7XTZ/+zF02Dq8w==", - "license": "MIT", - "dependencies": { - "hast-util-select": "^6.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, - "node_modules/rehype-parse": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", - "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-prism-plus": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rehype-prism-plus/-/rehype-prism-plus-2.0.1.tgz", - "integrity": "sha512-Wglct0OW12tksTUseAPyWPo3srjBOY7xKlql/DPKi7HbsdZTyaLCAoO58QBKSczFQxElTsQlOY3JDOFzB/K++Q==", - "license": "MIT", - "dependencies": { - "hast-util-to-string": "^3.0.0", - "parse-numeric-range": "^1.3.0", - "refractor": "^4.8.0", - "rehype-parse": "^9.0.0", - "unist-util-filter": "^5.0.0", - "unist-util-visit": "^5.0.0" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-rewrite": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rehype-rewrite/-/rehype-rewrite-4.0.2.tgz", - "integrity": "sha512-rjLJ3z6fIV11phwCqHp/KRo8xuUCO8o9bFJCNw5o6O2wlLk6g8r323aRswdGBQwfXPFYeSuZdAjp4tzo6RGqEg==", - "license": "MIT", - "dependencies": { - "hast-util-select": "^6.0.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, "node_modules/rehype-sanitize": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", @@ -21693,38 +22195,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-slug": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", - "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "github-slugger": "^2.0.0", - "hast-util-heading-rank": "^3.0.0", - "hast-util-to-string": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-stringify": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", - "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -21743,21 +22213,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-github-blockquote-alert": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/remark-github-blockquote-alert/-/remark-github-blockquote-alert-1.3.1.tgz", - "integrity": "sha512-OPNnimcKeozWN1w8KVQEuHOxgN3L4rah8geMOLhA5vN9wITqU4FWD+G26tkEsCGHiOVDbISx+Se5rGZ+D1p0Jg==", - "license": "MIT", - "dependencies": { - "unist-util-visit": "^5.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, "node_modules/remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", @@ -21821,6 +22276,13 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "license": "ISC" }, + "node_modules/require-package-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", + "integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==", + "dev": true, + "license": "MIT" + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -21883,6 +22345,20 @@ "node": ">=8" } }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -22198,6 +22674,13 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT" + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -22474,21 +22957,6 @@ "node": ">=10" } }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -23322,6 +23790,22 @@ "dev": true, "license": "MIT" }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", @@ -23602,16 +24086,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/touch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", @@ -23690,6 +24164,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/true-myth": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/true-myth/-/true-myth-4.1.1.tgz", + "integrity": "sha512-rqy30BSpxPznbbTcAcci90oZ1YR4DqvKcNXNerG5gQBU2v4jk0cygheiul5J6ExIMrgDVuanv/MkGfqZbKrNNg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "10.* || >= 12.*" + } + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -23792,6 +24276,65 @@ "code-block-writer": "^13.0.3" } }, + "node_modules/ts-prune": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ts-prune/-/ts-prune-0.10.3.tgz", + "integrity": "sha512-iS47YTbdIcvN8Nh/1BFyziyUqmjXz7GVzWu02RaZXqb+e/3Qe1B7IQ4860krOeCGUeJmterAlaM2FRH0Ue0hjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^6.2.1", + "cosmiconfig": "^7.0.1", + "json5": "^2.1.3", + "lodash": "^4.17.21", + "true-myth": "^4.1.0", + "ts-morph": "^13.0.1" + }, + "bin": { + "ts-prune": "lib/index.js" + } + }, + "node_modules/ts-prune/node_modules/@ts-morph/common": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.12.3.tgz", + "integrity": "sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/ts-prune/node_modules/code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-prune/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/ts-prune/node_modules/ts-morph": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-13.0.3.tgz", + "integrity": "sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.12.3", + "code-block-writer": "^11.0.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -24157,17 +24700,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-filter": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/unist-util-filter/-/unist-util-filter-5.0.1.tgz", - "integrity": "sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - } - }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -24581,20 +25113,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vfile-message": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", @@ -24639,12 +25157,6 @@ } } }, - "node_modules/viem/node_modules/@adraffy/ens-normalize": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", - "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", - "license": "MIT" - }, "node_modules/viem/node_modules/@noble/ciphers": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", @@ -24868,16 +25380,6 @@ "defaults": "^1.0.3" } }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/web-vitals": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", @@ -24900,44 +25402,6 @@ "node": ">=12" } }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", - "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "is-plain-object": "^5.0.0", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -25292,7 +25756,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" diff --git a/package.json b/package.json index f854098394..49bcb41697 100644 --- a/package.json +++ b/package.json @@ -31,9 +31,14 @@ "lint:quiet": "eslint . --quiet", "lint": "eslint .", "lint:fix": "npx eslint . --ext .ts,.tsx,.js,.jsx --fix", - "relative-to-alias-imports": "tsx scripts/relative-to-alias-imports.ts" + "relative-to-alias-imports": "tsx scripts/relative-to-alias-imports.ts", + "deadcode:knip": "knip", + "deadcode:exports": "ts-prune --error", + "deadcode:deps": "depcheck --ignores=\"eslint,eslint-*,@types/*,jest,ts-jest,playwright,@playwright/test,tailwindcss,postcss,autoprefixer\" --ignore-patterns=\".next,coverage,public,generated,tmp_gen_outp\"", + "deadcode": "npm run deadcode:knip && npm run deadcode:exports && npm run deadcode:deps" }, "dependencies": { + "@adraffy/ens-normalize": "^1.11.1", "@capacitor/app": "7.0.1", "@capacitor/barcode-scanner": "^2.0.3", "@capacitor/core": "7.4.1", @@ -52,30 +57,42 @@ "@google/model-viewer": "^3.5.0", "@headlessui/react": "^2.2.2", "@heroicons/react": "^2.2.0", + "@lexical/code": "^0.14.5", + "@lexical/link": "^0.14.5", + "@lexical/list": "^0.14.5", + "@lexical/markdown": "^0.14.5", "@lexical/react": "^0.14.2", + "@lexical/rich-text": "^0.14.5", + "@lexical/selection": "^0.14.5", + "@lexical/table": "^0.14.5", + "@lexical/utils": "^0.14.5", "@mojs/core": "^1.7.1", "@openapitools/openapi-generator-cli": "^2.13.9", "@reduxjs/toolkit": "^2.2.5", "@reown/appkit": "^1.8.8", "@reown/appkit-adapter-wagmi": "^1.8.8", + "@reown/appkit-common": "^1.8.11", "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/forms": "^0.5.7", "@tanstack/query-core": "^5.45.0", "@tanstack/react-query": "^5.45.1", "@types/lodash": "^4.17.10", - "@uiw/react-md-editor": "^4.0.8", "aws-rum-web": "^1.25.0", + "axios": "^1.12.2", "bootstrap": "^5.3.3", "capacitor-secure-storage-plugin": "^0.11.0", "chart.js": "^4.4.9", "cheerio": "^1.1.2", + "clsx": "^2.1.1", "cross-env": "^7.0.3", "csv-parser": "^3.0.0", + "date-fns": "^2.30.0", "emoji-mart": "^5.6.0", "emoji-regex": "^10.6.0", "ethereum-cryptography": "^2.2.0", "ethers": "^6.13.5", "focus-trap-react": "^11.0.3", + "form-data": "^4.0.4", "framer-motion": "^11.2.11", "gif-picker-react": "^1.4.0", "hammerjs": "^2.0.8", @@ -88,11 +105,10 @@ "jwt-decode": "^4.0.0", "lexical": "^0.14.2", "lodash": "^4.17.21", - "luxon": "^3.6.1", - "multiformats": "^13.4.1", "next": "16.0.0", "next-redux-wrapper": "^8.1.0", "next-sitemap": "^4.2.3", + "p-limit": "^3.1.0", "p-retry": "^6.2.1", "qrcode": "^1.5.4", "react": "19.2.0", @@ -116,13 +132,14 @@ "sass": "^1.77.6", "swiper": "^11.1.4", "three": "^0.163.0", + "unified": "^11.0.5", "use-debounce": "^10.0.3", "uuid": "^10.0.0", "viem": "^2.37.13", "wagmi": "^2.17.5" }, "devDependencies": { - "@next/bundle-analyzer": "16.0.0", + "@jest/globals": "^30.2.0", "@playwright/test": "^1.52.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", @@ -131,7 +148,6 @@ "@types/jest": "^29.5.14", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", - "@types/luxon": "^3.6.0", "@types/node": "^20.17.30", "@types/qrcode": "^1.5.5", "@types/react": "19.2.2", @@ -140,27 +156,32 @@ "@types/react-toggle": "^4.0.5", "@types/uuid": "^9.0.8", "autoprefixer": "^10.4.19", + "babel-jest": "^29.7.0", "babel-plugin-react-compiler": "^1.0.0", + "depcheck": "^1.4.7", "dotenv": "^16.0.3", "esbuild": "^0.25.10", "eslint": "^9.38.0", "eslint-config-next": "16.0.0", + "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-unused-imports": "^4.3.0", - "glob": "^11.0.3", "identity-obj-proxy": "^3.0.0", + "istanbul-lib-coverage": "^3.2.2", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "knip": "^5.50.5", "nodemon": "^3.1.4", - "pino-pretty": "^13.0.0", + "pino-pretty": "^13.1.2", "playwright": "^1.52.0", "postcss": "^8.4.38", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.4", "ts-jest": "^29.3.2", "ts-morph": "^27.0.0", + "ts-prune": "^0.10.3", "tsx": "^4.20.6", "typescript": "^5.9.3", + "typescript-eslint": "^8.46.2", "zod": "^3.25.76" }, "overrides": { diff --git a/services/api/pinned-waves-api.ts b/services/api/pinned-waves-api.ts index 4448633c61..e1045104a9 100644 --- a/services/api/pinned-waves-api.ts +++ b/services/api/pinned-waves-api.ts @@ -3,7 +3,7 @@ import { ApiWave } from '@/generated/models/ApiWave'; import { ApiWavesPinFilter } from '@/generated/models/ApiWavesPinFilter'; import { ApiWavesOverviewType } from '@/generated/models/ApiWavesOverviewType'; -export interface PinnedWavesService { +interface PinnedWavesService { fetchPinnedWaves: () => Promise; pinWave: (waveId: string) => Promise; unpinWave: (waveId: string) => Promise; @@ -38,4 +38,4 @@ export const pinnedWavesApi: PinnedWavesService = { endpoint: `waves/${waveId}/pins`, }); }, -}; \ No newline at end of file +}; diff --git a/services/groups/groupMutations.ts b/services/groups/groupMutations.ts index 74672f8fdc..e59b9ac1f8 100644 --- a/services/groups/groupMutations.ts +++ b/services/groups/groupMutations.ts @@ -29,7 +29,7 @@ export const toErrorMessage = (error: unknown): string => { return "Something went wrong"; }; -export const sanitiseGroupPayload = ( +const sanitiseGroupPayload = ( payload: ApiCreateGroup, name: string ): ApiCreateGroup => ({ diff --git a/services/websocket/useWaveSubscriptionManager.ts b/services/websocket/useWaveSubscriptionManager.ts deleted file mode 100644 index 67fb61b90f..0000000000 --- a/services/websocket/useWaveSubscriptionManager.ts +++ /dev/null @@ -1,142 +0,0 @@ -"use client"; - -import { useCallback, useEffect } from "react"; -import { WsMessageType } from "@/helpers/Types"; -import { useWebSocket } from "./useWebSocket"; -import { WebSocketStatus } from "./WebSocketTypes"; - -type SubscriptionRecord = { - count: number; - subscribed: boolean; -}; - -const subscriptionRegistry: Map = new Map(); - -function setRecord(waveId: string, updater: (record: SubscriptionRecord | undefined) => SubscriptionRecord | undefined) { - const next = updater(subscriptionRegistry.get(waveId)); - if (!next) { - subscriptionRegistry.delete(waveId); - return; - } - subscriptionRegistry.set(waveId, next); -} - -function ensurePositiveCount(count: number): number { - return count < 0 ? 0 : count; -} - -export function useWaveSubscriptionManager() { - const { send, status } = useWebSocket(); - - const debugLog = useCallback((message: string, waveId: string, extra?: Record) => { - // eslint-disable-next-line no-console -- intentional diagnostic logging - console.debug(`[WaveSubscription] ${message}`, { - waveId, - ...extra, - }); - }, []); - - const subscribeToWave = useCallback( - (waveId: string | null | undefined) => { - if (!waveId) return; - setRecord(waveId, (current) => { - const nextCount = ensurePositiveCount((current?.count ?? 0) + 1); - const alreadySubscribed = current?.subscribed ?? false; - const shouldSend = - !alreadySubscribed && status === WebSocketStatus.CONNECTED; - - if (shouldSend) { - send(WsMessageType.SUBSCRIBE_TO_WAVE, { - subscribe: true, - wave_id: waveId, - }); - debugLog("subscribe request sent", waveId, { - count: nextCount, - }); - } - - debugLog("subscription count updated", waveId, { - count: nextCount, - subscribed: alreadySubscribed || shouldSend, - }); - - return { - count: nextCount, - subscribed: alreadySubscribed || shouldSend, - }; - }); - }, - [debugLog, send, status] - ); - - const unsubscribeFromWave = useCallback( - (waveId: string | null | undefined) => { - if (!waveId) return; - setRecord(waveId, (current) => { - if (!current) return undefined; - const nextCount = ensurePositiveCount(current.count - 1); - - if (nextCount === 0) { - if (current.subscribed && status === WebSocketStatus.CONNECTED) { - send(WsMessageType.SUBSCRIBE_TO_WAVE, { - subscribe: false, - wave_id: waveId, - }); - debugLog("unsubscribe request sent", waveId, { count: 0 }); - } - return undefined; - } - - debugLog("subscription count updated", waveId, { - count: nextCount, - subscribed: current.subscribed, - }); - - return { - count: nextCount, - subscribed: current.subscribed, - }; - }); - }, - [debugLog, send, status] - ); - - useEffect(() => { - if (status === WebSocketStatus.CONNECTED) { - subscriptionRegistry.forEach((record, waveId) => { - if (record.count > 0 && !record.subscribed) { - send(WsMessageType.SUBSCRIBE_TO_WAVE, { - subscribe: true, - wave_id: waveId, - }); - debugLog("resubscribe on reconnect", waveId, { - count: record.count, - }); - subscriptionRegistry.set(waveId, { - count: record.count, - subscribed: true, - }); - } - }); - return; - } - - subscriptionRegistry.forEach((record, waveId) => { - if (record.subscribed) { - subscriptionRegistry.set(waveId, { - count: record.count, - subscribed: false, - }); - debugLog("mark unsubscribed (socket non-connected)", waveId, { - count: record.count, - status, - }); - } - }); - }, [debugLog, send, status]); - - return { - subscribeToWave, - unsubscribeFromWave, - }; -} diff --git a/src/errors/appkit-initialization.ts b/src/errors/appkit-initialization.ts index 1c356d0a6e..b0e15cec6b 100644 --- a/src/errors/appkit-initialization.ts +++ b/src/errors/appkit-initialization.ts @@ -1,4 +1,4 @@ -export class AppKitInitializationError extends Error { +class AppKitInitializationError extends Error { constructor(message: string, public readonly cause?: unknown) { super(message); this.name = 'AppKitInitializationError'; @@ -10,6 +10,6 @@ export class AppKitValidationError extends AppKitInitializationError { constructor(message: string, cause?: unknown) { super(`AppKit validation failed: ${message}`, cause); this.name = 'AppKitValidationError'; + Object.setPrototypeOf(this, AppKitValidationError.prototype); } } - diff --git a/src/errors/authentication.ts b/src/errors/authentication.ts deleted file mode 100644 index e99e163393..0000000000 --- a/src/errors/authentication.ts +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Authentication-specific error classes for fail-fast behavior - * These errors indicate critical authentication state inconsistencies that must halt execution immediately - */ - -export class TokenRefreshError extends Error { - constructor(message: string, public readonly cause?: unknown) { - super(message); - this.name = 'TokenRefreshError'; - Object.setPrototypeOf(this, TokenRefreshError.prototype); - } -} - -export class TokenRefreshCancelledError extends TokenRefreshError { - constructor(message: string, cause?: unknown) { - super(`Token refresh cancelled: ${message}`, cause); - this.name = 'TokenRefreshCancelledError'; - } -} - -export class TokenRefreshNetworkError extends TokenRefreshError { - constructor(message: string, cause?: unknown) { - super(`Token refresh network error: ${message}`, cause); - this.name = 'TokenRefreshNetworkError'; - } -} - -export class TokenRefreshServerError extends TokenRefreshError { - constructor( - message: string, - public readonly statusCode?: number, - public readonly response?: unknown, - cause?: unknown - ) { - super(`Token refresh server error: ${message}`, cause); - this.name = 'TokenRefreshServerError'; - } -} - -export class AuthenticationRoleError extends Error { - constructor(message: string, public readonly cause?: unknown) { - super(message); - this.name = 'AuthenticationRoleError'; - Object.setPrototypeOf(this, AuthenticationRoleError.prototype); - } -} - -/** - * RoleValidationError - thrown when server-provided role doesn't match expected role - * This indicates a critical authentication failure that requires immediate re-authentication - */ -export class RoleValidationError extends Error { - constructor( - public readonly expectedRole: string, - public readonly actualRole: string | null - ) { - super(`Role validation failed: expected '${expectedRole}' but got '${actualRole}'`); - this.name = 'RoleValidationError'; - Object.setPrototypeOf(this, RoleValidationError.prototype); - } -} - -/** - * MissingActiveProfileError - thrown when authentication requires an active profile proxy but none is set - * This indicates a critical state inconsistency that must fail immediately - */ -export class MissingActiveProfileError extends Error { - constructor() { - super('Authentication requires active profile proxy but activeProfileProxy is null or undefined'); - this.name = 'MissingActiveProfileError'; - Object.setPrototypeOf(this, MissingActiveProfileError.prototype); - } -} - -/** - * InvalidRoleStateError - thrown when role authentication fails due to invalid role state - * This indicates a critical authentication vulnerability that must be addressed immediately - */ -export class InvalidRoleStateError extends Error { - constructor(message: string, public readonly cause?: unknown) { - super(`Invalid role state: ${message}`); - this.name = 'InvalidRoleStateError'; - Object.setPrototypeOf(this, InvalidRoleStateError.prototype); - } -} \ No newline at end of file diff --git a/src/errors/wallet-connection.ts b/src/errors/wallet-connection.ts deleted file mode 100644 index 8337915f34..0000000000 --- a/src/errors/wallet-connection.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Custom error classes for wallet connection management - * These errors enforce fail-fast behavior and provide clear error messages - */ - -/** - * Base error class for wallet connection issues - * Extends Error to provide stack traces and proper error handling - */ -export class WalletConnectionError extends Error { - constructor(message: string, public readonly code?: string) { - super(message) - this.name = 'WalletConnectionError' - - // Maintain proper stack trace for where error was thrown (only available on V8) - if (Error.captureStackTrace) { - Error.captureStackTrace(this, WalletConnectionError) - } - } -} - -/** - * Specific error class for connection state validation issues - * Used when connection states are invalid or missing - */ -export class ConnectionStateError extends WalletConnectionError { - constructor(message: string, public readonly walletAddress?: string, public readonly attemptedState?: string) { - super(message, 'CONNECTION_STATE_ERROR') - this.name = 'ConnectionStateError' - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, ConnectionStateError) - } - } -} \ No newline at end of file diff --git a/src/errors/wallet.ts b/src/errors/wallet.ts index 077c9831db..3bb3d7b8ba 100644 --- a/src/errors/wallet.ts +++ b/src/errors/wallet.ts @@ -1,4 +1,4 @@ -export class WalletConnectionError extends Error { +class WalletConnectionError extends Error { constructor(message: string, public readonly cause?: unknown) { super(message); this.name = 'WalletConnectionError'; @@ -10,6 +10,7 @@ export class WalletValidationError extends WalletConnectionError { constructor(message: string, cause?: unknown) { super(`Wallet validation failed: ${message}`, cause); this.name = 'WalletValidationError'; + Object.setPrototypeOf(this, WalletValidationError.prototype); } } @@ -23,4 +24,4 @@ export class WalletInitializationError extends Error { this.name = 'WalletInitializationError'; Object.setPrototypeOf(this, WalletInitializationError.prototype); } -} \ No newline at end of file +} diff --git a/src/services/artblocks/url.ts b/src/services/artblocks/url.ts index ba87934077..092f720904 100644 --- a/src/services/artblocks/url.ts +++ b/src/services/artblocks/url.ts @@ -180,5 +180,3 @@ export const buildTokenApiUrl = ({ return endpoints; }; - -export type { ArtBlocksTokenIdentifier as ArtBlocksTokenId }; diff --git a/src/services/farcaster/url.ts b/src/services/farcaster/url.ts index 8728231e39..69c0627f99 100644 --- a/src/services/farcaster/url.ts +++ b/src/services/farcaster/url.ts @@ -13,7 +13,7 @@ export type FarcasterResourceIdentifier = | FarcasterProfileIdentifier | FarcasterChannelIdentifier; -export interface FarcasterCastIdentifier { +interface FarcasterCastIdentifier { readonly type: "cast"; readonly canonicalUrl: string; readonly castHash: string; @@ -21,13 +21,13 @@ export interface FarcasterCastIdentifier { readonly channel?: string | null; } -export interface FarcasterProfileIdentifier { +interface FarcasterProfileIdentifier { readonly type: "profile"; readonly canonicalUrl: string; readonly username: string; } -export interface FarcasterChannelIdentifier { +interface FarcasterChannelIdentifier { readonly type: "channel"; readonly canonicalUrl: string; readonly channel: string; @@ -133,12 +133,3 @@ export const parseFarcasterResource = ( return parseUserSegments(segments); }; - -export const isPotentialFarcasterUrl = (url: URL): boolean => { - if (isFarcasterHost(url.hostname)) { - return true; - } - - const protocol = url.protocol.toLowerCase(); - return protocol === "http:" || protocol === "https:"; -}; diff --git a/src/services/wikimedia/url.ts b/src/services/wikimedia/url.ts index 82e7a78840..c24a7921cf 100644 --- a/src/services/wikimedia/url.ts +++ b/src/services/wikimedia/url.ts @@ -1,4 +1,4 @@ -export interface WikimediaLinkResult { +interface WikimediaLinkResult { readonly href: string; } @@ -40,4 +40,3 @@ export const parseWikimediaLink = (href: string): WikimediaLinkResult | null => return null; } }; - diff --git a/store/store.ts b/store/store.ts index 68fc9189e2..5b369b89ed 100644 --- a/store/store.ts +++ b/store/store.ts @@ -13,8 +13,7 @@ export const makeStore = () => devTools: publicEnv.NODE_ENV !== "production", }); -export type AppStore = ReturnType; +type AppStore = ReturnType; export type AppState = ReturnType; -export type AppDispatch = AppStore["dispatch"]; export const wrapper = createWrapper(makeStore); diff --git a/tests/globalSetup.ts b/tests/globalSetup.ts deleted file mode 100644 index 689b3d2e42..0000000000 --- a/tests/globalSetup.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { chromium, FullConfig } from "@playwright/test"; -import { login } from "./testHelpers"; - -async function globalSetup(config: FullConfig) { - const { baseURL } = config.projects[0].use; - const browser = await chromium.launch(); - const context = await browser.newContext(); - const page = await context.newPage(); - - try { - if (baseURL) { - await login(page, baseURL); - } else { - throw new Error("`baseURL` is not defined in playwright config"); - } - - // Save signed-in state - await context.storageState({ - path: config.projects[0].use.storageState as string, - }); - } catch (error) { - console.error("Error during global setup:", error); - throw error; // Re-throw the error to fail the setup - } finally { - await browser.close(); - } -} - -export default globalSetup; diff --git a/tests/mocks/walletMock.ts b/tests/mocks/walletMock.ts deleted file mode 100644 index 3f1a9b14ee..0000000000 --- a/tests/mocks/walletMock.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { Page } from "@playwright/test"; - -// Interface for mock signature response -interface MockSignatureResponse { - success: boolean; - signature?: string; - error?: string; -} - -/** - * Sets up mocking for wallet signature requests - * This allows testing the entire flow including wallet signature - */ -export async function setupWalletMock(page: Page, response: MockSignatureResponse = { success: true, signature: "0x1234567890abcdef" }) { - // Mock the wagmi hooks response - await page.addInitScript(`() => { - // Store the original window.ethereum - const originalEthereum = window.ethereum; - - // Mock implementation - window.ethereum = { - ...originalEthereum, - request: async ({ method, params }: { method: string; params: any[] }) => { - // Mock common wallet methods - if (method === "eth_requestAccounts") { - return ["0x1234567890123456789012345678901234567890"]; - } - - if (method === "eth_accounts") { - return ["0x1234567890123456789012345678901234567890"]; - } - - if (method === "personal_sign" || method === "eth_sign") { - // This would be called by the signMessage function - return "0x1234567890abcdef"; // Mock signature - } - - if (method === "eth_chainId") { - return "0x1"; // Ethereum mainnet - } - - // Fall back to original implementation if available - if (originalEthereum && originalEthereum.request) { - return originalEthereum.request({ method, params }); - } - - return null; - } - }; - - // Mock wagmi hooks - if (!window.__TEST_HOOKS__) { - window.__TEST_HOOKS__ = {}; - } - - // Mock signMessage hook response - window.__TEST_HOOKS__.mockSignMessageResult = ${JSON.stringify(response)}; - - // Override any hook implementations that might be loaded later - const originalDefineProperty = Object.defineProperty; - Object.defineProperty = function(obj, prop, descriptor) { - // Capture any attempts to define the signMessage hook - if (prop === "useSignMessage" || prop === "signMessage") { - const original = descriptor.value; - descriptor.value = function(...args: any[]) { - const result = original ? original.apply(this, args) : {}; - // Override with our mock - return { - ...result, - signMessageAsync: async () => window.__TEST_HOOKS__.mockSignMessageResult.signature, - isLoading: false, - isSuccess: window.__TEST_HOOKS__.mockSignMessageResult.success, - isError: !window.__TEST_HOOKS__.mockSignMessageResult.success, - error: window.__TEST_HOOKS__.mockSignMessageResult.error - }; - }; - } - return originalDefineProperty.call(this, obj, prop, descriptor); - }; - }`); -} - -/** - * Sets up mocking for a wallet signature rejection - */ -export async function setupWalletRejection(page: Page) { - return setupWalletMock(page, { - success: false, - error: "User rejected request" - }); -} - -/** - * Sets up mocking for a wallet connection error - */ -export async function setupWalletConnectionError(page: Page) { - await page.addInitScript(() => { - // Override ethereum provider to simulate connection error - window.ethereum = undefined; - - // Mock wagmi hooks to indicate error - if (!window.__TEST_HOOKS__) { - window.__TEST_HOOKS__ = {}; - } - - window.__TEST_HOOKS__.connectionError = true; - }); -} - -// Add the type declaration for the test hooks -declare global { - interface Window { - ethereum?: any; - __TEST_HOOKS__?: { - mockSignMessageResult?: MockSignatureResponse; - connectionError?: boolean; - }; - } -} diff --git a/tests/testHelpers.ts b/tests/testHelpers.ts index e411c651cf..8ece8f92e8 100644 --- a/tests/testHelpers.ts +++ b/tests/testHelpers.ts @@ -13,46 +13,6 @@ export const test = baseTest.extend({ // Re-export expect export { expect }; -export async function login(page: Page, baseURL: string) { - console.log( - "No auth context yet for this worker, attempting to reach the home page..." - ); - await page.goto(baseURL); - - if (page.url().includes("/access")) { - console.log("Redirected to /access, attempting login..."); - - const password = process.env.STAGING_PASSWORD || ""; - console.log( - `Using password: ${ - password ? "*".repeat(password.length) : "ERROR: NOT SET IN ENV" - }` - ); - - const inputField = page.locator('input[type="text"]'); - - console.log("Filling in and submitting password..."); - await inputField.fill(password); - await inputField.press("Enter"); - - console.log("Waiting for redirect after dismissing confirmation dialog"); - await page.waitForSelector("nav"); - - // Check if we're no longer on the /access page - if (!page.url().includes("/access")) { - console.log(`Successfully logged in. Current URL: ${page.url()}`); - } else { - throw new Error( - "Login failed: Still on /access page after submitting password" - ); - } - } else { - console.log( - `Successfully reached ${page.url()}, no additional login required.` - ); - } -} - async function mockApiResponse(page: Page, url: string, response: any) { await page.route(url, async (route) => { await route.fulfill({ diff --git a/types/farcaster.types.ts b/types/farcaster.types.ts index 5fe7044032..004e11890e 100644 --- a/types/farcaster.types.ts +++ b/types/farcaster.types.ts @@ -6,7 +6,7 @@ export type FarcasterPreviewResponse = | FarcasterUnavailablePreview | FarcasterUnsupportedPreview; -export interface FarcasterBasePreview { +interface FarcasterBasePreview { readonly canonicalUrl?: string; } @@ -84,6 +84,7 @@ export interface FarcasterUnavailablePreview extends FarcasterBasePreview { readonly reason?: string; } -export interface FarcasterUnsupportedPreview { +export interface FarcasterUnsupportedPreview extends FarcasterBasePreview { readonly type: "unsupported"; + readonly reason?: string; } diff --git a/utils/error-sanitizer.ts b/utils/error-sanitizer.ts index 8e42ef2f2b..f5cba3a5f6 100644 --- a/utils/error-sanitizer.ts +++ b/utils/error-sanitizer.ts @@ -234,51 +234,3 @@ export const logErrorSecurely = (context: string, error: unknown): void => { // }); // } }; - -/** - * Extracts a safe error code from an error object - * Useful for displaying error codes without exposing sensitive data - */ -export const getErrorCode = (error: unknown): string | null => { - if (!error || typeof error !== "object") { - return null; - } - - const errorObj = error as any; - - // Check for common error code properties - const code = - errorObj.code || - errorObj.errorCode || - errorObj.status || - errorObj.statusCode; - - if (code && (typeof code === "string" || typeof code === "number")) { - // Ensure the code doesn't contain sensitive data - const codeStr = code.toString(); - if (!containsSensitiveData(codeStr) && codeStr.length < 50) { - return codeStr; - } - } - - return null; -}; - -/** - * Creates a user-friendly error message with optional error code - */ -export const formatErrorMessage = ( - error: unknown, - includeCode: boolean = false -): string => { - const message = sanitizeErrorForUser(error); - - if (includeCode) { - const code = getErrorCode(error); - if (code) { - return `${message} (Error code: ${code})`; - } - } - - return message; -}; diff --git a/utils/wallet-validation.utils.ts b/utils/wallet-validation.utils.ts index 9d5e4eb065..9d97e03bbe 100644 --- a/utils/wallet-validation.utils.ts +++ b/utils/wallet-validation.utils.ts @@ -1,7 +1,6 @@ import { AppWallet } from '@/components/app-wallets/AppWalletsContext' import { WalletValidationError, WalletSecurityError } from '@/src/errors/wallet-validation' -// Constants for validation patterns const ETHEREUM_ADDRESS_PATTERN = /^0x[a-fA-F0-9]{40}$/ const MIN_HASH_LENGTH = 64 const MIN_NAME_LENGTH = 1 @@ -10,19 +9,13 @@ const MIN_PRIVATE_KEY_LENGTH = 32 const MIN_MNEMONIC_WORDS = 12 const MAX_MNEMONIC_WORDS = 24 -/** - * Validates wallet object exists and is not null/undefined - */ -function validateWalletExists(wallet: AppWallet): void { +const validateWalletExists = (wallet: AppWallet): void => { if (!wallet) { throw new WalletValidationError('Wallet object is null or undefined - cannot process') } } -/** - * Validates wallet address field and format - */ -function validateWalletAddress(wallet: AppWallet): void { +const validateWalletAddress = (wallet: AppWallet): void => { if (!wallet.address) { throw new WalletValidationError('Wallet missing required address field') } @@ -36,10 +29,7 @@ function validateWalletAddress(wallet: AppWallet): void { } } -/** - * Validates wallet address_hashed field - */ -function validateWalletAddressHash(wallet: AppWallet): void { +const validateWalletAddressHash = (wallet: AppWallet): void => { if (!wallet.address_hashed) { throw new WalletValidationError('Wallet missing required address_hashed field') } @@ -53,10 +43,7 @@ function validateWalletAddressHash(wallet: AppWallet): void { } } -/** - * Validates wallet name field - */ -function validateWalletName(wallet: AppWallet): void { +const validateWalletName = (wallet: AppWallet): void => { if (!wallet.name) { throw new WalletValidationError('Wallet missing required name field') } @@ -70,12 +57,9 @@ function validateWalletName(wallet: AppWallet): void { } } -/** - * Validates private key if present - */ -function validatePrivateKey(wallet: AppWallet): void { +const validatePrivateKey = (wallet: AppWallet): void => { if (!wallet.private_key) { - return + throw new WalletSecurityError('Private key is required') } if (typeof wallet.private_key !== 'string') { @@ -87,10 +71,7 @@ function validatePrivateKey(wallet: AppWallet): void { } } -/** - * Validates mnemonic if present - */ -function validateMnemonic(wallet: AppWallet): void { +const validateMnemonic = (wallet: AppWallet): void => { if (!wallet.mnemonic) { return } @@ -100,15 +81,16 @@ function validateMnemonic(wallet: AppWallet): void { } const words = wallet.mnemonic.trim().split(/\s+/) - + if (words.some(word => !word || word.length === 0)) { throw new WalletSecurityError('Mnemonic contains empty words - security violation detected') } + + if (words.length < MIN_MNEMONIC_WORDS || words.length > MAX_MNEMONIC_WORDS) { + throw new WalletSecurityError(`Mnemonic must contain between ${MIN_MNEMONIC_WORDS} and ${MAX_MNEMONIC_WORDS} words`) + } } -/** - * Security validation: Fail-fast wallet validation without exposing sensitive data - */ export function validateWalletSafely(wallet: AppWallet): void { validateWalletExists(wallet) validateWalletAddress(wallet) @@ -117,13 +99,3 @@ export function validateWalletSafely(wallet: AppWallet): void { validatePrivateKey(wallet) validateMnemonic(wallet) } - -// Export individual validators for reuse in other parts of the application -export { - validateWalletExists, - validateWalletAddress, - validateWalletAddressHash, - validateWalletName, - validatePrivateKey, - validateMnemonic -} \ No newline at end of file