From c74179c796aa18d0282921aea57e5503feb178f9 Mon Sep 17 00:00:00 2001 From: LucaDiba Date: Sun, 21 Sep 2025 16:59:31 -0700 Subject: [PATCH 01/12] Scaffold importer --- .gitignore | 4 +- apps/client/dashboard/.prettierrc | 1 + apps/client/dashboard/package.json | 5 + .../src/components/auth/profile-selection.tsx | 2 + .../components/charts/charts-page.test.tsx | 12 +- .../src/components/dashboard-page.tsx | 30 +- .../dashboard/src/components/data-table.tsx | 205 +++++++++ .../components/settings/backup/page.test.tsx | 2 +- .../import/import-dashboard-page.test.tsx | 29 ++ .../import/import-dashboard-page.tsx | 31 ++ .../import-transactions-page.test.tsx | 105 +++++ .../import-transactions-page.tsx | 79 ++++ .../imported-transactions-card.test.tsx | 378 +++++++++++++++++ .../imported-transactions-card.tsx | 342 +++++++++++++++ .../imported-transactions-table.test.tsx | 258 ++++++++++++ .../imported-transactions-table.tsx | 394 ++++++++++++++++++ .../import/import-transactions/utils.test.ts | 53 +++ .../import/import-transactions/utils.ts | 40 ++ .../importers/create-importer-card.test.tsx | 26 ++ .../import/importers/create-importer-card.tsx | 60 +++ .../create-new-importer-page.test.tsx | 79 ++++ .../importers/create-new-importer-page.tsx | 30 ++ .../import/importers/importer-card.tsx | 64 +++ .../import/importers/providers/chase.test.tsx | 68 +++ .../import/importers/providers/chase.tsx | 375 +++++++++++++++++ .../importers/user-importers-card.test.tsx | 75 ++++ .../import/importers/user-importers-card.tsx | 49 +++ .../transaction/transaction-form.test.tsx | 9 +- .../transaction/transaction-form.tsx | 25 +- .../transaction/transactions-page.tsx | 25 ++ .../transaction/transactions-table.tsx | 242 ++--------- .../dashboard/src/components/ui/alert.tsx | 5 +- .../src/contexts/database-provider.tsx | 41 +- .../src/contexts/profile-context.test.tsx | 17 +- .../dashboard/src/contexts/profile-context.ts | 18 + .../src/contexts/profile-provider.tsx | 113 ++++- .../src/database/database-idb.test.ts | 2 + apps/client/dashboard/src/routeTree.gen.ts | 89 +++- .../import/importers/$importerId.tsx | 14 + .../import/importers/new/$importerType.tsx | 30 ++ .../_profile/transactions/import/index.tsx | 8 + .../_profile/transactions/index.tsx | 4 +- apps/client/dashboard/src/utils/data.test.ts | 10 + apps/client/dashboard/src/utils/data.ts | 2 + .../src/utils/imported-transaction.ts | 41 ++ .../dashboard/src/utils/tests/contexts.tsx | 273 ++++++------ .../dashboard/src/utils/transaction.test.ts | 68 +-- .../client/dashboard/src/utils/transaction.ts | 10 +- apps/client/dashboard/src/utils/type.ts | 5 + package.json | 5 +- .../client/transactions-importer/.gitignore | 1 + .../client/transactions-importer/package.json | 22 + .../src/importers/chase/chase-card.test.ts | 120 ++++++ .../src/importers/chase/chase-card.ts | 124 ++++++ .../src/importers/index.ts | 19 + .../client/transactions-importer/src/index.ts | 3 + .../src/utils/csv-parser.test.ts | 69 +++ .../src/utils/csv-parser.ts | 54 +++ .../transactions-importer/tsconfig.json | 8 + .../transactions-importer/vitest.config.ts | 7 + packages/common/data/src/index.ts | 7 + packages/common/data/src/schemas/data.ts | 6 + .../data/src/schemas/transactions-importer.ts | 30 ++ yarn.lock | 77 +++- 64 files changed, 3951 insertions(+), 448 deletions(-) create mode 100644 apps/client/dashboard/.prettierrc create mode 100644 apps/client/dashboard/src/components/data-table.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/import-dashboard-page.test.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/import-dashboard-page.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.test.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-card.test.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-card.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.test.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/import-transactions/utils.test.ts create mode 100644 apps/client/dashboard/src/components/transaction/import/import-transactions/utils.ts create mode 100644 apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.test.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.test.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/importers/importer-card.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/importers/providers/chase.test.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/importers/providers/chase.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/importers/user-importers-card.test.tsx create mode 100644 apps/client/dashboard/src/components/transaction/import/importers/user-importers-card.tsx create mode 100644 apps/client/dashboard/src/components/transaction/transactions-page.tsx create mode 100644 apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/importers/$importerId.tsx create mode 100644 apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/importers/new/$importerType.tsx create mode 100644 apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/index.tsx create mode 100644 apps/client/dashboard/src/utils/imported-transaction.ts create mode 100644 apps/client/dashboard/src/utils/type.ts create mode 100644 packages/client/transactions-importer/.gitignore create mode 100644 packages/client/transactions-importer/package.json create mode 100644 packages/client/transactions-importer/src/importers/chase/chase-card.test.ts create mode 100644 packages/client/transactions-importer/src/importers/chase/chase-card.ts create mode 100644 packages/client/transactions-importer/src/importers/index.ts create mode 100644 packages/client/transactions-importer/src/index.ts create mode 100644 packages/client/transactions-importer/src/utils/csv-parser.test.ts create mode 100644 packages/client/transactions-importer/src/utils/csv-parser.ts create mode 100644 packages/client/transactions-importer/tsconfig.json create mode 100644 packages/client/transactions-importer/vitest.config.ts create mode 100644 packages/common/data/src/schemas/transactions-importer.ts diff --git a/.gitignore b/.gitignore index da652ba..9943cd8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ node_modules +.idea + # Swap the comments on the following lines if you wish to use zero-installs # In that case, don't forget to run `yarn config set enableGlobalCache false`! # Documentation here: https://yarnpkg.com/features/caching#zero-installs @@ -14,4 +16,4 @@ node_modules #!.yarn/cache .pnp.* -coverage \ No newline at end of file +coverage diff --git a/apps/client/dashboard/.prettierrc b/apps/client/dashboard/.prettierrc new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/apps/client/dashboard/.prettierrc @@ -0,0 +1 @@ +{} diff --git a/apps/client/dashboard/package.json b/apps/client/dashboard/package.json index ab024cc..88174ad 100644 --- a/apps/client/dashboard/package.json +++ b/apps/client/dashboard/package.json @@ -15,6 +15,7 @@ "@formkit/auto-animate": "^0.8.4", "@hookform/resolvers": "^5.2.1", "@js-joda/core": "^5.6.5", + "@monyfox/client-transactions-importer": "workspace:*", "@monyfox/common-data": "workspace:*", "@monyfox/common-symbol": "workspace:*", "@monyfox/common-symbol-exchange": "workspace:*", @@ -37,8 +38,10 @@ "@tanstack/react-table": "^8.21.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "date-fns": "^4.1.0", "framer-motion": "^12.23.12", "graph-data-structure": "^4.5.0", + "immer": "^10.1.3", "lucide-react": "^0.542.0", "react": "^19.1.1", "react-dom": "^19.1.1", @@ -48,6 +51,7 @@ "tailwind-merge": "^3.3.1", "tw-animate-css": "^1.3.7", "ulid": "^3.0.1", + "use-immer": "^0.11.0", "zod": "^4.1.5" }, "devDependencies": { @@ -78,6 +82,7 @@ "jsdom": "^26.1.0", "msw": "^2.7.4", "postcss": "^8.5.6", + "prettier": "^3.6.2", "tailwindcss": "^4.1.12", "typescript": "^5.9.2", "vite": "^7.1.5", diff --git a/apps/client/dashboard/src/components/auth/profile-selection.tsx b/apps/client/dashboard/src/components/auth/profile-selection.tsx index 15e0011..c68ae4f 100644 --- a/apps/client/dashboard/src/components/auth/profile-selection.tsx +++ b/apps/client/dashboard/src/components/auth/profile-selection.tsx @@ -156,6 +156,8 @@ function CreateProfileModal({ assetSymbolExchangersMetadata: { alphavantage: null }, transactions: [], transactionCategories: [], + transactionsImporters: [], + importedTransactions: [], lastUpdated: new Date().toISOString(), }, }, diff --git a/apps/client/dashboard/src/components/charts/charts-page.test.tsx b/apps/client/dashboard/src/components/charts/charts-page.test.tsx index 417bae3..8be8f62 100644 --- a/apps/client/dashboard/src/components/charts/charts-page.test.tsx +++ b/apps/client/dashboard/src/components/charts/charts-page.test.tsx @@ -1,10 +1,7 @@ import { TestContextProvider } from "@/utils/tests/contexts"; import { afterEach, beforeEach, describe, expect, test } from "vitest"; import { ChartsPage } from "./charts-page"; -import { - fireEvent, - render, -} from "@testing-library/react"; +import { fireEvent, render } from "@testing-library/react"; const originalLanguageDescriptor = Object.getOwnPropertyDescriptor( navigator, @@ -49,10 +46,9 @@ describe("ChartsPage", () => { expect(r.getByTestId("flow-chart")).toBeInTheDocument(); expect(r.queryByTestId("net-worth-chart")).not.toBeInTheDocument(); - fireEvent.click(r.getByText("Net worth")); + fireEvent.mouseDown(r.getByText("Net worth")); - // TODO: fix this test - // expect(r.queryByTestId("flow-chart")).not.toBeInTheDocument(); - // expect(r.getByTestId("net-worth-chart")).toBeInTheDocument(); + expect(r.queryByTestId("flow-chart")).not.toBeInTheDocument(); + expect(r.getByTestId("net-worth-chart")).toBeInTheDocument(); }); }); diff --git a/apps/client/dashboard/src/components/dashboard-page.tsx b/apps/client/dashboard/src/components/dashboard-page.tsx index 1e84371..8a3117f 100644 --- a/apps/client/dashboard/src/components/dashboard-page.tsx +++ b/apps/client/dashboard/src/components/dashboard-page.tsx @@ -1,13 +1,20 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { AccountsBalance } from "@/components/accounts-balance"; import { TransactionsTable } from "@/components/transaction/transactions-table"; -import { AddTransactionFloatingButton } from "@/components/transaction/transaction-form"; +import { AddTransactionButton } from "@/components/transaction/transaction-form"; import { useAssetSymbolExchangeRate } from "@/hooks/use-asset-symbol-exchange-rate"; import { Spinner } from "@/components/ui/spinner"; import { DestructiveAlert } from "@/components/ui/alert"; import { ChartExpenseByCategory } from "@/components/charts/chart-expense-by-category"; +import { Button } from "./ui/button"; +import { ImportIcon } from "lucide-react"; +import { Link } from "@tanstack/react-router"; +import { useProfile } from "@/hooks/use-profile"; export function DashboardPage() { + const { + user: { id: profileId }, + } = useProfile(); const { isLoading, error } = useAssetSymbolExchangeRate(); return ( @@ -41,14 +48,31 @@ export function DashboardPage() {
- Transactions + +
Transactions
+
+ + + + +
+
- + ); } diff --git a/apps/client/dashboard/src/components/data-table.tsx b/apps/client/dashboard/src/components/data-table.tsx new file mode 100644 index 0000000..9f1c7de --- /dev/null +++ b/apps/client/dashboard/src/components/data-table.tsx @@ -0,0 +1,205 @@ +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { useState } from "react"; +import { + ColumnDef, + ColumnFiltersState, + flexRender, + getCoreRowModel, + getFacetedRowModel, + getFacetedUniqueValues, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + SortingState, + Table as ReactTable, + useReactTable, + VisibilityState, +} from "@tanstack/react-table"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { + ChevronLeftIcon, + ChevronRightIcon, + ChevronsLeftIcon, + ChevronsRightIcon, +} from "lucide-react"; +import { Label } from "./ui/label"; +import { Button } from "./ui/button"; + +export function DataTable({ + data, + columns, + getRowId, +}: { + data: Array; + columns: ColumnDef[]; + getRowId: (row: DataT) => string; +}) { + const [rowSelection, setRowSelection] = useState({}); + const [columnVisibility, setColumnVisibility] = useState({}); + const [columnFilters, setColumnFilters] = useState([]); + const [sorting, setSorting] = useState([]); + const [pagination, setPagination] = useState({ + pageIndex: 0, + pageSize: 10, + }); + + const table = useReactTable({ + data, + columns, + state: { + sorting, + columnVisibility, + rowSelection, + columnFilters, + pagination, + }, + getRowId, + enableRowSelection: true, + onRowSelectionChange: setRowSelection, + onSortingChange: setSorting, + onColumnFiltersChange: setColumnFilters, + onColumnVisibilityChange: setColumnVisibility, + onPaginationChange: setPagination, + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + getFacetedRowModel: getFacetedRowModel(), + getFacetedUniqueValues: getFacetedUniqueValues(), + }); + + return ( +
+
+ + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + return ( + + {flexRender( + header.column.columnDef.header, + header.getContext(), + )} + + ); + })} + + ))} + + + {table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + ))} + +
+
+ +
+ ); +} + +function PaginationContainer({ table }: { table: ReactTable }) { + return ( +
+
+ {table.getFilteredRowModel().rows.length} rows total. +
+
+
+ + +
+
+ Page {table.getState().pagination.pageIndex + 1} of{" "} + {table.getPageCount()} +
+
+ + + + +
+
+
+ ); +} diff --git a/apps/client/dashboard/src/components/settings/backup/page.test.tsx b/apps/client/dashboard/src/components/settings/backup/page.test.tsx index 5f5b999..9c237e0 100644 --- a/apps/client/dashboard/src/components/settings/backup/page.test.tsx +++ b/apps/client/dashboard/src/components/settings/backup/page.test.tsx @@ -60,7 +60,7 @@ describe("SettingsBackupPage", () => { // @ts-expect-error - [0].text() exists - source: trust me bro (await createObjectURLMock.mock.lastCall[0].text()) as string; expect(generatedBlobText).toMatchInlineSnapshot( - `"{"id":"TEST_PROFILE_ID","user":"TEST_USER","data":{"encrypted":false,"data":{"accounts":[{"id":"ACCOUNT_1","name":"Account 1","isPersonalAsset":true},{"id":"ACCOUNT_2","name":"Account 2","isPersonalAsset":true}],"assetSymbols":[{"id":"EUR","code":"EUR","displayName":"EUR","type":"fiat"},{"id":"USD","code":"USD","displayName":"USD","type":"fiat"},{"id":"CHF","code":"CHF","displayName":"CHF","type":"fiat"},{"id":"MWRD","code":"MWRD","displayName":"MWRD ETF name","type":"stock"}],"assetSymbolExchanges":[],"assetSymbolExchangersMetadata":{"alphavantage":{"apiKey":"TEST_API_KEY"}},"transactions":[{"id":"TRANSACTION_1","description":"Income","transactionDate":"2024-01-01","accountingDate":"2024-01-01","transactionCategoryId":"CATEGORY_1","from":{"account":{"name":"Income"},"amount":950,"symbolId":"EUR"},"to":{"account":{"id":"ACCOUNT_1"},"amount":950,"symbolId":"EUR"}},{"id":"TRANSACTION_2","description":"Expense","transactionDate":"2024-01-01","accountingDate":"2024-01-01","transactionCategoryId":null,"from":{"account":{"id":"ACCOUNT_1"},"amount":23,"symbolId":"EUR"},"to":{"account":{"name":"Expense"},"amount":23,"symbolId":"EUR"}},{"id":"TRANSACTION_3","description":"Income USD","transactionDate":"2024-01-01","accountingDate":"2024-01-01","transactionCategoryId":"CATEGORY_1","from":{"account":{"name":"Income"},"amount":950,"symbolId":"USD"},"to":{"account":{"id":"ACCOUNT_1"},"amount":950,"symbolId":"USD"}}],"transactionCategories":[{"id":"CATEGORY_1","name":"Category 1","parentTransactionCategoryId":null},{"id":"CATEGORY_1_1","name":"Subcategory 1-1","parentTransactionCategoryId":"CATEGORY_1"}],"lastUpdated":"2024-01-01T00:00:00.000Z"}},"schemaVersion":"1"}"`, + `"{"id":"TEST_PROFILE_ID","user":"TEST_USER","data":{"encrypted":false,"data":{"accounts":[{"id":"ACCOUNT_1","name":"Account 1","isPersonalAsset":true},{"id":"ACCOUNT_2","name":"Account 2","isPersonalAsset":true}],"assetSymbols":[{"id":"EUR","code":"EUR","displayName":"EUR","type":"fiat"},{"id":"USD","code":"USD","displayName":"USD","type":"fiat"},{"id":"CHF","code":"CHF","displayName":"CHF","type":"fiat"},{"id":"MWRD","code":"MWRD","displayName":"MWRD ETF name","type":"stock"}],"assetSymbolExchanges":[],"assetSymbolExchangersMetadata":{"alphavantage":{"apiKey":"TEST_API_KEY"}},"transactions":[{"id":"TRANSACTION_1","description":"Income","transactionDate":"2024-01-01","accountingDate":"2024-01-01","transactionCategoryId":"CATEGORY_1","from":{"account":{"name":"Income"},"amount":950,"symbolId":"EUR"},"to":{"account":{"id":"ACCOUNT_1"},"amount":950,"symbolId":"EUR"}},{"id":"TRANSACTION_2","description":"Expense","transactionDate":"2024-01-01","accountingDate":"2024-01-01","transactionCategoryId":null,"from":{"account":{"id":"ACCOUNT_1"},"amount":23,"symbolId":"EUR"},"to":{"account":{"name":"Expense"},"amount":23,"symbolId":"EUR"}},{"id":"TRANSACTION_3","description":"Income USD","transactionDate":"2024-01-01","accountingDate":"2024-01-01","transactionCategoryId":"CATEGORY_1","from":{"account":{"name":"Income"},"amount":950,"symbolId":"USD"},"to":{"account":{"id":"ACCOUNT_1"},"amount":950,"symbolId":"USD"}}],"transactionCategories":[{"id":"CATEGORY_1","name":"Category 1","parentTransactionCategoryId":null},{"id":"CATEGORY_1_1","name":"Subcategory 1-1","parentTransactionCategoryId":"CATEGORY_1"}],"transactionsImporters":[{"id":"IMPORTER_1","name":"Importer 1","data":{"provider":"chase-card","defaultAccountId":"ACCOUNT_1","defaultSymbolId":"USD"}}],"importedTransactions":[],"lastUpdated":"2024-01-01T00:00:00.000Z"}},"schemaVersion":"1"}"`, ); }); }); diff --git a/apps/client/dashboard/src/components/transaction/import/import-dashboard-page.test.tsx b/apps/client/dashboard/src/components/transaction/import/import-dashboard-page.test.tsx new file mode 100644 index 0000000..51d2840 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/import-dashboard-page.test.tsx @@ -0,0 +1,29 @@ +import { describe, test, expect } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { TestContextProvider } from "@/utils/tests/contexts"; +import { ImportDashboardPage } from "./import-dashboard-page"; + +describe("ImportDashboardPage", () => { + test("renders help alert and sections", () => { + render( + + + , + ); + + // Help alert + expect( + screen.getByText( + /What are importers and why should I use them\?/i, + ), + ).toBeInTheDocument(); + + // User importers section + expect(screen.getByText("Your importers")).toBeInTheDocument(); + // Create new importer section + expect(screen.getByText("Create new importer")).toBeInTheDocument(); + + // The default TestContextProvider provides one importer + expect(screen.getByText("Importer 1")).toBeInTheDocument(); + }); +}); diff --git a/apps/client/dashboard/src/components/transaction/import/import-dashboard-page.tsx b/apps/client/dashboard/src/components/transaction/import/import-dashboard-page.tsx new file mode 100644 index 0000000..02cdb06 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/import-dashboard-page.tsx @@ -0,0 +1,31 @@ +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { UserImportersCard } from "./importers/user-importers-card"; +import { CreateImporterCard } from "./importers/create-importer-card"; + +export function ImportDashboardPage() { + return ( +
+ + + +
+ ); +} + +function HelpAlert() { + return ( + + What are importers and why should I use them? + + Importers allow you to import transactions automatically instead of + adding each one manually. For example, you can import your debit/credit + card transactions from your bank, or your stock trades from your + brokerage. +
+ For each account, you have to create an importer. After that, you can + import transactions with just a few clicks. For example, you can create + an importer for your credit card and one for your debit card. +
+
+ ); +} diff --git a/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.test.tsx b/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.test.tsx new file mode 100644 index 0000000..4123b27 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.test.tsx @@ -0,0 +1,105 @@ +import { describe, test, expect } from "vitest"; +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import { TestContextProvider } from "@/utils/tests/contexts"; +import { ImportTransactionsPage } from "./import-transactions-page"; + +function createChaseCsvFile() { + const headers = [ + "Transaction Date", + "Post Date", + "Description", + "Category", + "Type", + "Amount", + "Memo", + ].join(","); + + const rows = [ + // Expense (negative amount -> Sale) + ["09/12/2025", "09/14/2025", "MERCHANT 1", "Shopping", "Sale", "-21.45", ""], + // Income (positive amount -> Return) + ["09/12/2025", "09/14/2025", "MERCHANT 2", "Food & Drink", "Return", "25.00", ""], + // Transfer (Payment) + ["08/01/2025", "08/03/2025", "Payment Thank You-Mobile", "", "Payment", "50.00", ""], + ] + .map((r) => r.join(",")) + .join("\n"); + + const content = `${headers}\n${rows}\n`; + return new File([content], "chase.csv", { type: "text/csv" }); +} + +describe("ImportTransactionsPage", () => { + test("shows alert when importer is not found", () => { + render( + + + , + ); + + expect(screen.getByText("Importer not found")).toBeInTheDocument(); + }); + + test("renders real Chase importer form when importer exists", () => { + render( + + + , + ); + + expect( + screen.getByText("Upload your Chase CSV file"), + ).toBeInTheDocument(); + expect(screen.getByRole("button", { name: /next/i })).toBeInTheDocument(); + }); + + test("uploads a CSV, shows imported transactions card with tabs, then can reset", async () => { + render( + + + , + ); + + // Real form is visible + expect( + screen.getByText("Upload your Chase CSV file"), + ).toBeInTheDocument(); + + // Select a CSV file and submit + const fileInput = document.querySelector('input[type="file"]') as HTMLInputElement | null; + expect(fileInput).not.toBeNull(); + const file = createChaseCsvFile(); + await waitFor(() => { + fireEvent.change(fileInput as HTMLInputElement, { target: { files: [file] } }); + }); + + fireEvent.click(screen.getByRole("button", { name: /next/i })); + + // After parsing, the ImportedTransactionsCard should appear + await waitFor(() => { + expect( + screen.getByText("Imported Transactions"), + ).toBeInTheDocument(); + }); + + // Tabs exist (labels include counts, so match by text part) + expect(screen.getByText(/Review needed/i)).toBeInTheDocument(); + expect(screen.getByText(/Importing/i)).toBeInTheDocument(); + expect(screen.getByText(/Skipping/i)).toBeInTheDocument(); + expect(screen.getByText(/Previously imported/i)).toBeInTheDocument(); + + // Click the back icon button (first button in the card header that is not the Import button) + screen.getByText("Imported Transactions").closest("div"); + const buttons = screen.getAllByRole("button"); + const importButton = screen.getByRole("button", { name: /import/i }); + const backButton = buttons.find((b) => b !== importButton) ?? buttons[0]; + fireEvent.click(backButton); + + // We should be back to the form + await waitFor(() => { + expect( + screen.getByText("Upload your Chase CSV file"), + ).toBeInTheDocument(); + }); + }); +}); diff --git a/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.tsx b/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.tsx new file mode 100644 index 0000000..3a8fc52 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.tsx @@ -0,0 +1,79 @@ +import { ReactNode } from 'react'; +import { useImmer } from 'use-immer'; +import { ImportedTransactionsCard } from './imported-transactions-card'; +import { useProfile } from '@/hooks/use-profile'; +import { ChaseCardImporter } from '../importers/providers/chase'; +import { Alert, AlertDescription } from '@/components/ui/alert'; +import { DraftTransaction, DraftTransactionStatus } from './utils'; +import { ParsedTransaction } from '@monyfox/client-transactions-importer'; +import { needsReview } from '@/utils/imported-transaction'; + +export function ImportTransactionsPage({ importerId }: { importerId: string }) { + const { + data: { transactionsImporters }, + getImportedTransaction, + getAccount, + } = useProfile(); + const [draftTransactions, setDraftTransactions] = useImmer< + DraftTransaction[] + >([]); + + function onImport(parsedTransactions: ParsedTransaction[]) { + const draftTransactions = parsedTransactions.map((pt) => { + let status = DraftTransactionStatus.ReadyToImport; + + if (getImportedTransaction(pt.providerTransactionId) !== null) { + status = DraftTransactionStatus.SkippedAlreadyImported; + } else if (needsReview(pt, getAccount)) { + status = DraftTransactionStatus.NeedsReview; + } + + return { + ...pt, + status, + }; + }); + + setDraftTransactions(draftTransactions); + } + + const transactionsImporter = transactionsImporters.find( + (ti) => ti.id === importerId, + ); + + if (!transactionsImporter) { + return ( + + Importer not found + + ); + } + + let Form: ReactNode; + switch (transactionsImporter.data.provider) { + case 'chase-card': { + Form = ( + + ); + break; + } + } + + return ( + <> + {draftTransactions.length === 0 ? ( + Form + ) : ( + setDraftTransactions([])} + /> + )} + + ); +} diff --git a/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-card.test.tsx b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-card.test.tsx new file mode 100644 index 0000000..1f21ed9 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-card.test.tsx @@ -0,0 +1,378 @@ +import { describe, test, expect, beforeEach, vi } from "vitest"; +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import { TestContextProvider } from "@/utils/tests/contexts"; +import { useImmer } from "use-immer"; +import { renderHook } from "@testing-library/react"; +import { ImportedTransactionsCard } from "./imported-transactions-card"; +import { DraftTransaction, DraftTransactionStatus } from "./utils"; +import { TransactionType } from "@/utils/transaction"; +import { ulid } from "ulid"; +import { toast } from "sonner"; + +vi.mock("sonner", () => { + return { + toast: { + error: vi.fn(), + success: vi.fn(), + message: vi.fn(), + }, + }; +}); + +function makeTx( + type: "income" | "expense" | "transfer", + status: DraftTransactionStatus, +): DraftTransaction { + const id = ulid(); + + let from: DraftTransaction["from"]; + let to: DraftTransaction["to"]; + + switch (type) { + case "income": + from = { + amount: 10, + symbolId: "USD", + account: { name: "From account" }, + }; + to = { amount: 10, symbolId: "USD", account: { id: "ACCOUNT_1" } }; + break; + case "expense": + from = { amount: 10, symbolId: "USD", account: { id: "ACCOUNT_1" } }; + to = { amount: 10, symbolId: "USD", account: { name: "" } }; + break; + case "transfer": + from = { amount: 10, symbolId: "USD", account: { id: "ACCOUNT_1" } }; + to = { amount: 10, symbolId: "USD", account: { id: "ACCOUNT_2" } }; + break; + } + + return { + providerTransactionId: id, + date: "2024-01-01", + description: `Tx ${id}`, + from, + to, + transactionType: type, + transactionCategoryId: null, + status, + }; +} + +describe("ImportedTransactionsCard", () => { + let testTransactions: DraftTransaction[]; + + beforeEach(() => { + testTransactions = [ + makeTx(TransactionType.Transfer, DraftTransactionStatus.NeedsReview), + makeTx(TransactionType.Income, DraftTransactionStatus.ReadyToImport), + makeTx(TransactionType.Expense, DraftTransactionStatus.ReadyToImport), + makeTx( + TransactionType.Expense, + DraftTransactionStatus.SkippedTemporarily, + ), + makeTx(TransactionType.Income, DraftTransactionStatus.SkippedPermanently), + makeTx( + TransactionType.Transfer, + DraftTransactionStatus.SkippedPermanently, + ), + makeTx( + TransactionType.Expense, + DraftTransactionStatus.SkippedAlreadyImported, + ), + makeTx( + TransactionType.Income, + DraftTransactionStatus.SkippedAlreadyImported, + ), + makeTx( + TransactionType.Transfer, + DraftTransactionStatus.SkippedAlreadyImported, + ), + makeTx( + TransactionType.Expense, + DraftTransactionStatus.SkippedAlreadyImported, + ), + ]; + }); + + function expectTransactionsToBeInDocument( + expected: DraftTransaction[], + isInput: boolean, + ) { + const expectedDescriptions = expected.map((tx) => tx.description!); + const notExpectedDescriptions = testTransactions.filter( + (tx) => !expectedDescriptions.includes(tx.description!), + ); + + const fn = isInput ? screen.queryByDisplayValue : screen.queryByText; + + for (const tx of expected) { + expect(fn(tx.description!)).toBeInTheDocument(); + } + for (const tx of notExpectedDescriptions) { + expect(fn(tx.description!)).not.toBeInTheDocument(); + } + } + + test("renders transactions in tabs", async () => { + const { result } = renderHook(() => useImmer(testTransactions)); + const [transactions, setTransactions] = result.current; + + render( + + {}} + /> + , + ); + + screen.getByText("Review needed (1)"); + const importingTab = screen.getByRole("tab", { name: "Importing (2)" }); + const skippingTab = screen.getByRole("tab", { name: "Skipping (3)" }); + const importedTab = screen.getByRole("tab", { + name: "Previously imported (4)", + }); + + // Review needed + expectTransactionsToBeInDocument( + transactions.filter( + (tx) => tx.status === DraftTransactionStatus.NeedsReview, + ), + true, + ); + + // Importing + fireEvent.mouseDown(importingTab); + await waitFor(() => { + expectTransactionsToBeInDocument( + transactions.filter( + (tx) => tx.status === DraftTransactionStatus.ReadyToImport, + ), + true, + ); + }); + + // Skipping + fireEvent.mouseDown(skippingTab); + await waitFor(() => { + expectTransactionsToBeInDocument( + transactions.filter( + (tx) => + tx.status === DraftTransactionStatus.SkippedTemporarily || + tx.status === DraftTransactionStatus.SkippedPermanently, + ), + true, + ); + }); + + // Previously imported + fireEvent.mouseDown(importedTab); + await waitFor(() => { + expectTransactionsToBeInDocument( + transactions.filter( + (tx) => tx.status === DraftTransactionStatus.SkippedAlreadyImported, + ), + false, + ); + }); + }); + + test("shows error toast when trying to import with transactions needing review", async () => { + const { result } = renderHook(() => useImmer(testTransactions)); + const [transactions, setTransactions] = result.current; + + render( + + {}} + /> + , + ); + + const importBtn = screen.getByRole("button", { name: /import/i }); + fireEvent.click(importBtn); + + await waitFor(() => { + expect(toast.error).toHaveBeenCalledWith( + `Please review all the transactions in the "Review needed" section.`, + ); + }); + }); + + test("Import button imports ready transactions and updates statuses", async () => { + const { result } = renderHook(() => + useImmer( + testTransactions.filter( + (t) => t.status === DraftTransactionStatus.ReadyToImport, + ), + ), + ); + let [transactions, setTransactions] = result.current; + + render( + + {}} + /> + , + ); + + expect(screen.getByText("Importing (2)")).toBeInTheDocument(); + expect(screen.getByText("Previously imported (0)")).toBeInTheDocument(); + + const importBtn = screen.getByRole("button", { name: /import/i }); + fireEvent.click(importBtn); + + await waitFor(() => { + // Pull the latest state + [transactions] = result.current; + + // All ready ones should become previously imported + expect( + transactions.every( + (t) => t.status === DraftTransactionStatus.SkippedAlreadyImported, + ), + ).toBe(true); + }); + }); + + test("imported transactions are moved between tabs", async () => { + render( + t.status === DraftTransactionStatus.ReadyToImport, + )} + />, + ); + + expect(screen.getByText("Importing (2)")).toBeInTheDocument(); + expect(screen.getByText("Previously imported (0)")).toBeInTheDocument(); + + const importBtn = screen.getByRole("button", { name: /import/i }); + fireEvent.click(importBtn); + + await waitFor(() => { + expect(screen.getByText("Importing (0)")).toBeInTheDocument(); + expect(screen.getByText("Previously imported (2)")).toBeInTheDocument(); + }); + }); + + test("Skip all button marks all transactions in review as temporarily skipped", async () => { + const { result } = renderHook(() => useImmer(testTransactions)); + let [transactions, setTransactions] = result.current; + + render( + + {}} + /> + , + ); + + expectTransactionsStatus( + { + [testTransactions[0].providerTransactionId]: + DraftTransactionStatus.NeedsReview, + [testTransactions[1].providerTransactionId]: + DraftTransactionStatus.ReadyToImport, + [testTransactions[2].providerTransactionId]: + DraftTransactionStatus.ReadyToImport, + [testTransactions[3].providerTransactionId]: + DraftTransactionStatus.SkippedTemporarily, + [testTransactions[4].providerTransactionId]: + DraftTransactionStatus.SkippedPermanently, + [testTransactions[5].providerTransactionId]: + DraftTransactionStatus.SkippedPermanently, + [testTransactions[6].providerTransactionId]: + DraftTransactionStatus.SkippedAlreadyImported, + [testTransactions[7].providerTransactionId]: + DraftTransactionStatus.SkippedAlreadyImported, + [testTransactions[8].providerTransactionId]: + DraftTransactionStatus.SkippedAlreadyImported, + [testTransactions[9].providerTransactionId]: + DraftTransactionStatus.SkippedAlreadyImported, + }, + transactions, + ); + + const skipAllBtn = screen.getByRole("button", { name: /skip all/i }); + fireEvent.click(skipAllBtn); + + await waitFor(() => { + // Pull the latest state + [transactions] = result.current; + + expectTransactionsStatus( + { + [testTransactions[0].providerTransactionId]: + DraftTransactionStatus.SkippedTemporarily, + [testTransactions[1].providerTransactionId]: + DraftTransactionStatus.ReadyToImport, + [testTransactions[2].providerTransactionId]: + DraftTransactionStatus.ReadyToImport, + [testTransactions[3].providerTransactionId]: + DraftTransactionStatus.SkippedTemporarily, + [testTransactions[4].providerTransactionId]: + DraftTransactionStatus.SkippedPermanently, + [testTransactions[5].providerTransactionId]: + DraftTransactionStatus.SkippedPermanently, + [testTransactions[6].providerTransactionId]: + DraftTransactionStatus.SkippedAlreadyImported, + [testTransactions[7].providerTransactionId]: + DraftTransactionStatus.SkippedAlreadyImported, + [testTransactions[8].providerTransactionId]: + DraftTransactionStatus.SkippedAlreadyImported, + [testTransactions[9].providerTransactionId]: + DraftTransactionStatus.SkippedAlreadyImported, + }, + transactions, + ); + }); + }); + + test("shows no transactions message when empty", () => { + render(); + + expect(screen.getByText(/No transactions found/i)).toBeInTheDocument(); + expect(screen.queryByText(/Review needed/i)).not.toBeInTheDocument(); + }); +}); + +function TestImportedTransactionsCard({ + initial, +}: { + initial: DraftTransaction[]; +}) { + const [transactions, setTransactions] = useImmer(initial); + return ( + + {}} + /> + + ); +} + +function expectTransactionsStatus( + idToExpectedStatus: { [key: string]: DraftTransactionStatus }, + transactions: DraftTransaction[], +) { + for (const tx of transactions) { + expect(tx.status).toBe(idToExpectedStatus[tx.providerTransactionId]); + } +} diff --git a/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-card.tsx b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-card.tsx new file mode 100644 index 0000000..02528f5 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-card.tsx @@ -0,0 +1,342 @@ +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { type ParsedTransaction } from "@monyfox/client-transactions-importer"; +import { useProfile } from "@/hooks/use-profile"; +import { ArrowLeftIcon } from "lucide-react"; +import { + Alert, + AlertDescription, + DestructiveAlert, +} from "@/components/ui/alert"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Updater } from "use-immer"; +import { ulid } from "ulid"; +import { ImportedTransactionsTable } from "./imported-transactions-table"; +import { + Transaction, + ImportedTransaction as ImporterTransactionMetadata, +} from "@monyfox/common-data"; +import { TransactionsTable } from "../../transactions-table"; +import { toast } from "sonner"; +import { + DraftTransaction, + DraftTransactionStatus, + getDraftTransactionsByStatus, +} from "./utils"; +import { useMemo } from "react"; + +export function ImportedTransactionsCard({ + importerId, + draftTransactions, + setDraftTransactions, + onReset, +}: { + importerId: string; + draftTransactions: DraftTransaction[]; + setDraftTransactions: Updater; + onReset: () => void; +}) { + const { importTransactions } = useProfile(); + + const transactionsByStatus = useMemo( + () => getDraftTransactionsByStatus(draftTransactions), + [draftTransactions], + ); + + function onImport() { + if (transactionsByStatus[DraftTransactionStatus.NeedsReview].length > 0) { + toast.error( + `Please review all the transactions in the "Review needed" section.`, + ); + return; + } + + const now = new Date().toISOString(); + + let transactions: Transaction[] = []; + let importedTransactionsMetadata: ImporterTransactionMetadata[] = []; + + transactionsByStatus[DraftTransactionStatus.ReadyToImport].forEach((t) => { + const transactionId = ulid(); + + transactions.push({ + id: transactionId, + description: t.description ?? "", + transactionCategoryId: t.transactionCategoryId ?? null, + transactionDate: t.date ?? new Date().toISOString(), + accountingDate: t.date ?? new Date().toISOString(), + from: { + amount: t.from.amount ?? 0, + symbolId: t.from.symbolId ?? "", + account: + t.from.account !== undefined && "id" in t.from.account + ? { + id: t.from.account.id, + } + : { + name: t.from.account?.name ?? "N/A", + }, + }, + to: { + amount: t.to.amount ?? 0, + symbolId: t.to.symbolId ?? "", + account: + t.to.account !== undefined && "id" in t.to.account + ? { + id: t.to.account.id, + } + : { + name: t.to.account?.name ?? "N/A", + }, + }, + }); + + importedTransactionsMetadata.push({ + id: t.providerTransactionId, + importerId, + importedAt: now, + data: { + transactionId: transactionId, + status: "imported", + }, + }); + }); + + importTransactions.mutate( + { + transactions: transactions, + importedTransactions: importedTransactionsMetadata, + }, + { + onSuccess: () => + setDraftTransactions((dt) => + dt.map((t) => ({ + ...t, + status: + t.status === DraftTransactionStatus.ReadyToImport + ? DraftTransactionStatus.SkippedAlreadyImported + : t.status, + })), + ), + }, + ); + } + + if (draftTransactions.length === 0) { + return ; + } + + const reviewNeededTransactions = + transactionsByStatus[DraftTransactionStatus.NeedsReview]; + const readyToImportNeededTransactions = + transactionsByStatus[DraftTransactionStatus.ReadyToImport]; + const skippingTransactions = [ + ...transactionsByStatus[DraftTransactionStatus.SkippedTemporarily], + ...transactionsByStatus[DraftTransactionStatus.SkippedPermanently], + ]; + const previouslyImportedTransactions = + transactionsByStatus[DraftTransactionStatus.SkippedAlreadyImported]; + + return ( + + + +
Imported Transactions
+
+ + +
+
+
+ + + + + Review needed ({reviewNeededTransactions.length}) + + + Importing ({readyToImportNeededTransactions.length}) + + + Skipping ({skippingTransactions.length}) + + + Previously imported ({previouslyImportedTransactions.length}) + + + + + + These transactions need to be reviewed before they can be + imported. + + + {reviewNeededTransactions.length > 0 && ( +
+ +
+ )} + +
+ + + + These transactions are ready to be imported. You can still make + changes to them. + + + + + + + + These transactions are being skipped. + + + + + + + + These transactions are being skipped because they have been + imported in the past. + + + + +
+
+
+ ); +} + +function SkipAllReviewNeededButton({ + setTransactions, +}: { + setTransactions: Updater; +}) { + function onClick() { + setTransactions((dt) => + dt.map((t) => ({ + ...t, + status: + t.status === DraftTransactionStatus.NeedsReview + ? DraftTransactionStatus.SkippedTemporarily + : t.status, + })), + ); + } + + return ( + + ); +} + +function PreviouslyImportedTransactionsTable({ + transactions, +}: { + transactions: ParsedTransaction[]; +}) { + const { getImportedTransaction, getTransaction } = useProfile(); + + function toTransaction( + t: ParsedTransaction, + ): Transaction & { nonExistentText?: string } { + const existingImportedTransaction = getImportedTransaction( + t.providerTransactionId, + ); + + const existingTransaction = + existingImportedTransaction && + existingImportedTransaction.data.status === "imported" + ? getTransaction(existingImportedTransaction.data.transactionId) + : null; + + if (existingTransaction !== null) { + return existingTransaction; + } else { + return { + id: t.providerTransactionId, + description: t.description ?? "", + transactionCategoryId: t.transactionCategoryId ?? null, + transactionDate: t.date ?? new Date().toISOString(), + accountingDate: t.date ?? new Date().toISOString(), + from: { + amount: t.from.amount ?? 0, + symbolId: t.from.symbolId ?? "", + account: + t.from.account !== undefined && "id" in t.from.account + ? { + id: t.from.account.id, + } + : { + name: t.from.account?.name ?? "N/A", + }, + }, + to: { + amount: t.to.amount ?? 0, + symbolId: t.to.symbolId ?? "", + account: + t.to.account !== undefined && "id" in t.to.account + ? { + id: t.to.account.id, + } + : { + name: t.to.account?.name ?? "N/A", + }, + }, + nonExistentText: + existingImportedTransaction?.data.status === "imported" + ? "Deleted" + : existingImportedTransaction?.data.status === "skipped" + ? "Skipped" + : "Unknown", + }; + } + } + + return ; +} + +function NoTransactionsAlert({ onReset }: { onReset: () => void }) { + return ( + + + Imported Transactions + + + + No transactions were found in the file. Please check the file and try + again. +
+
+ +
+
+
+ ); +} diff --git a/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.test.tsx b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.test.tsx new file mode 100644 index 0000000..ef36ba4 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.test.tsx @@ -0,0 +1,258 @@ +import { TestContextProvider } from "@/utils/tests/contexts"; +import { afterEach, beforeEach, describe, expect, test } from "vitest"; +import { ImportedTransactionsTable } from "./imported-transactions-table"; +import { + render, + fireEvent, + screen, + waitFor, + renderHook, +} from "@testing-library/react"; +import { TransactionType } from "@/utils/transaction"; +import { useImmer } from "use-immer"; +import { DraftTransaction, DraftTransactionStatus } from "./utils"; + +const originalLanguageDescriptor = Object.getOwnPropertyDescriptor( + navigator, + "language", +); + +beforeEach(() => { + Object.defineProperty(navigator, "language", { + value: "it-IT", + configurable: true, + }); +}); + +afterEach(() => { + if (originalLanguageDescriptor) { + Object.defineProperty(navigator, "language", originalLanguageDescriptor); + } +}); + +describe("ImportedTransactionsTable", () => { + const mockTransactions: DraftTransaction[] = [ + { + providerTransactionId: "1", + date: "2023-01-01", + description: "Test Transaction 1", + from: { + amount: 100, + account: { id: "1" }, + }, + to: { + amount: 100, + account: { id: "2" }, + }, + transactionType: TransactionType.Transfer, + transactionCategoryId: null, + status: DraftTransactionStatus.ReadyToImport, + }, + { + providerTransactionId: "2", + date: "2023-01-02", + description: "Test Transaction 2", + from: { + amount: 200, + account: { id: "1" }, + }, + to: { + amount: 200, + account: { id: "2" }, + }, + transactionType: TransactionType.Expense, + transactionCategoryId: null, + status: DraftTransactionStatus.ReadyToImport, + }, + { + providerTransactionId: "3", + date: undefined, + description: undefined, + from: { + amount: undefined, + account: undefined, + }, + to: { + amount: undefined, + account: undefined, + }, + transactionType: TransactionType.Income, + transactionCategoryId: null, + status: DraftTransactionStatus.ReadyToImport, + }, + ]; + + test("updates transaction date", async () => { + const { result } = renderHook(() => + useImmer(mockTransactions), + ); + let [transactions, setTransactions] = result.current; + + render( + + + , + ); + + await waitFor(() => { + expect( + screen.getByDisplayValue("Test Transaction 1"), + ).toBeInTheDocument(); + expect( + screen.getByDisplayValue("Test Transaction 2"), + ).toBeInTheDocument(); + }); + + const dateInput = screen.getByDisplayValue("2023-01-01"); + fireEvent.change(dateInput, { target: { value: "2023-01-03" } }); + + [transactions] = result.current; + await waitFor(() => { + expect(transactions[0].date).toBe("2023-01-03"); + }); + }); + + test("updates transaction description", async () => { + const { result } = renderHook(() => + useImmer(mockTransactions), + ); + let [transactions, setTransactions] = result.current; + + render( + + + , + ); + + await waitFor(() => { + expect( + screen.getByDisplayValue("Test Transaction 1"), + ).toBeInTheDocument(); + expect( + screen.getByDisplayValue("Test Transaction 2"), + ).toBeInTheDocument(); + }); + + const descriptionInput = screen.getByDisplayValue("Test Transaction 1"); + fireEvent.change(descriptionInput, { + target: { value: "Updated Transaction 1" }, + }); + + [transactions] = result.current; + await waitFor(() => { + expect(transactions[0].description).toBe("Updated Transaction 1"); + }); + }); + + test("updates transaction amount", async () => { + const { result } = renderHook(() => + useImmer(mockTransactions), + ); + let [transactions, setTransactions] = result.current; + + render( + + + , + ); + + await waitFor(() => { + expect( + screen.getByDisplayValue("Test Transaction 1"), + ).toBeInTheDocument(); + expect( + screen.getByDisplayValue("Test Transaction 2"), + ).toBeInTheDocument(); + }); + + const amountInput = screen.getByDisplayValue("100.00"); + fireEvent.change(amountInput, { target: { value: "150.00" } }); + + [transactions] = result.current; + await waitFor(() => { + expect(transactions[0].from.amount).toBe(150); + expect(transactions[0].to.amount).toBe(150); + }); + }); + + test("updates transaction category", async () => { + const { result } = renderHook(() => + useImmer(mockTransactions), + ); + let [transactions, setTransactions] = result.current; + + render( + + + , + ); + + await waitFor(() => { + expect( + screen.getByDisplayValue("Test Transaction 1"), + ).toBeInTheDocument(); + expect( + screen.getByDisplayValue("Test Transaction 2"), + ).toBeInTheDocument(); + }); + + const categorySelect = screen.getAllByText("(None)")[0]; + fireEvent.click(categorySelect); + fireEvent.click( + screen.getByText("- Subcategory 1-1", { selector: "span" }), + ); + + [transactions] = result.current; + await waitFor(() => { + expect(transactions[0].transactionCategoryId).toBe("CATEGORY_1_1"); + }); + }); + + test("updates transaction type", async () => { + const { result } = renderHook(() => + useImmer(mockTransactions), + ); + let [transactions, setTransactions] = result.current; + + render( + + + , + ); + + await waitFor(() => { + expect( + screen.getByDisplayValue("Test Transaction 1"), + ).toBeInTheDocument(); + expect( + screen.getByDisplayValue("Test Transaction 2"), + ).toBeInTheDocument(); + }); + + expect(transactions[0].transactionType).toBe(TransactionType.Transfer); + + const typeSelect = screen.getByText("Transfer"); + fireEvent.click(typeSelect); + fireEvent.click(screen.getAllByText("Expense")[1]); + + [transactions] = result.current; + await waitFor(() => { + expect(transactions[0].transactionType).toBe(TransactionType.Expense); + }); + }); +}); diff --git a/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.tsx b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.tsx new file mode 100644 index 0000000..6fd46e2 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.tsx @@ -0,0 +1,394 @@ +import { Input } from "@/components/ui/input"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { TransactionType } from "@/utils/transaction"; +import { useProfile } from "@/hooks/use-profile"; +import { ArrowRightIcon, CheckIcon, CircleOffIcon } from "lucide-react"; +import { DataTable } from "@/components/data-table"; +import { ColumnDef } from "@tanstack/react-table"; +import { createContext, useContext } from "react"; +import { Updater } from "use-immer"; +import { WritableDraft } from "immer"; +import { + SelectItemTransactionCategoryWithChildren, +} from "@/components/settings/transaction-categories/category-select-item"; +import { getTransactionCategoriesWithChildren } from "@/utils/transaction-category"; +import { DraftTransaction, DraftTransactionStatus } from "./utils"; +import { Button } from "@/components/ui/button"; +import { needsReview } from "@/utils/imported-transaction"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { toast } from "sonner"; + +export function ImportedTransactionsTable({ + transactions, + setTransactions, +}: { + transactions: DraftTransaction[]; + setTransactions: Updater; +}) { + function updateTransaction( + id: string, + updater: (draft: DraftTransaction) => void, + ) { + setTransactions((draft) => { + const t = draft?.find((t) => t.providerTransactionId === id); + if (t) { + updater(t); + } + }); + } + + return ( + + r.providerTransactionId} + /> + + ); +} + +type ImportedTransactionsContext = { + transactions: DraftTransaction[]; + updateTransaction: ( + id: string, + updater: (draft: WritableDraft) => void, + ) => void; +}; + +const ImportedTransactionsContext = + createContext(null); + +const useImportedTransactions = () => { + const context = useContext(ImportedTransactionsContext); + if (!context) { + throw new Error( + "useImportedTransactions must be used within a ImportedTransactionsProvider", + ); + } + return context; +}; + +function DateCell({ transaction }: { transaction: DraftTransaction }) { + const { updateTransaction } = useImportedTransactions(); + + function onChangeDate(e: React.ChangeEvent) { + updateTransaction(transaction.providerTransactionId, (draft) => { + draft.date = e.target.value; + }); + } + + return ( + + ); +} + +function DescriptionCell({ transaction }: { transaction: DraftTransaction }) { + const { + data: { accounts }, + } = useProfile(); + const { updateTransaction } = useImportedTransactions(); + + function onChangeDescription(e: React.ChangeEvent) { + updateTransaction(transaction.providerTransactionId, (draft) => { + draft.description = e.target.value; + }); + } + + function onChangeFromAccount(accountId: string) { + updateTransaction(transaction.providerTransactionId, (draft) => { + draft.from.account = accountId === "-" ? { name: "" } : { id: accountId }; + }); + } + + function onChangeToAccount(accountId: string) { + updateTransaction(transaction.providerTransactionId, (draft) => { + draft.to.account = accountId === "-" ? { name: "" } : { id: accountId }; + }); + } + + const fromAccountId = transaction.from.account !== undefined && "id" in transaction.from.account ? transaction.from.account.id : "-"; + const toAccountId = transaction.to.account !== undefined && "id" in transaction.to.account ? transaction.to.account.id : "-"; + + return ( + <> + + {transaction.status === "needs-review" && ( + <> +
+
+
+ +
+ +
+ +
+
+ + )} + + ); +} + +function AmountCell({ transaction }: { transaction: DraftTransaction }) { + const { updateTransaction } = useImportedTransactions(); + + function onChangeAmount(e: React.ChangeEvent) { + const amount = parseFloat(e.target.value); + if (isNaN(amount)) { + return; + } + + updateTransaction(transaction.providerTransactionId, (draft) => { + draft.from.amount = amount; + draft.to.amount = amount; + }); + } + + return ( + + ); +} + +function CategoryCell({ transaction }: { transaction: DraftTransaction }) { + const { + data: { transactionCategories }, + } = useProfile(); + const { updateTransaction } = useImportedTransactions(); + + function onChangeCategory(categoryId: string) { + updateTransaction(transaction.providerTransactionId, (draft) => { + draft.transactionCategoryId = categoryId === "-" ? null : categoryId; + }); + } + + const rootCategories = getTransactionCategoriesWithChildren( + transactionCategories, + ); + + return ( + + ); +} + +function TypeCell({ transaction }: { transaction: DraftTransaction }) { + const { updateTransaction } = useImportedTransactions(); + + function onChangeType(value: TransactionType) { + updateTransaction(transaction.providerTransactionId, (draft) => { + if ((draft.transactionType === "expense" && value === "income") || (draft.transactionType === "income" && value === "expense")) { + const previousFrom = draft.from; + draft.from = draft.to; + draft.to = previousFrom; + } else if (draft.status !== DraftTransactionStatus.NeedsReview) { + toast.warning(`Transaction moved to "Review needed" section.`); + draft.status = DraftTransactionStatus.NeedsReview; + } + + draft.transactionType = value as DraftTransaction["transactionType"]; + }); + } + + let typeBgColor = ""; + switch (transaction.transactionType) { + case TransactionType.Income: + typeBgColor = "bg-green-50"; + break; + case TransactionType.Expense: + typeBgColor = "bg-red-50"; + break; + case TransactionType.Transfer: + typeBgColor = "bg-blue-50"; + break; + } + + return ( + + ); +} + +function ActionsCell({ transaction }: { transaction: DraftTransaction }) { + const { getAccount } = useProfile(); + const { updateTransaction } = useImportedTransactions(); + + function onChangeStatus(value: DraftTransactionStatus) { + updateTransaction(transaction.providerTransactionId, (draft) => { + draft.status = value; + }); + } + + function onDoNotSkip() { + if (needsReview(transaction, getAccount)) { + onChangeStatus(DraftTransactionStatus.NeedsReview); + } else { + onChangeStatus(DraftTransactionStatus.ReadyToImport); + } + } + + function onSkip() { + onChangeStatus(DraftTransactionStatus.SkippedTemporarily); + } + + function onReviewed() { + if (needsReview(transaction, getAccount)) { + toast.error("Please fix the errors before marking as reviewed"); + return; + } + + onChangeStatus(DraftTransactionStatus.ReadyToImport); + } + + if (transaction.status === DraftTransactionStatus.SkippedAlreadyImported) { + return null; + } + + if ( + transaction.status === DraftTransactionStatus.SkippedTemporarily || + transaction.status === DraftTransactionStatus.SkippedPermanently + ) { + return ( + + + + + Do not skip + + ); + } + + if (transaction.status === DraftTransactionStatus.NeedsReview) { + return ( +
+ + + + + Mark as reviewed + + + + + + Skip + +
+ ); + } + + return ( + + + + + Skip + + ); +} + +const columns: ColumnDef[] = [ + { + accessorKey: "date", + header: "Date", + cell: ({ row }) => , + }, + { + accessorKey: "description", + header: "Description", + cell: ({ row }) => , + }, + { + accessorKey: "amount", + header: "Amount", + cell: ({ row }) => , + }, + { + accessorKey: "transactionCategoryId", + header: "Category", + cell: ({ row }) => , + }, + { + accessorKey: "type", + header: "Type", + cell: ({ row }) => , + }, + { + accessorKey: "actions", + header: "", + cell: ({ row }) => , + }, +]; diff --git a/apps/client/dashboard/src/components/transaction/import/import-transactions/utils.test.ts b/apps/client/dashboard/src/components/transaction/import/import-transactions/utils.test.ts new file mode 100644 index 0000000..1b24aec --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/utils.test.ts @@ -0,0 +1,53 @@ +import { describe, expect, it } from "vitest"; +import { + DraftTransactionStatus, + DraftTransaction, + getDraftTransactionsByStatus, +} from "./utils"; +import { ParsedTransaction } from "@monyfox/client-transactions-importer"; + +const parsedTransaction: ParsedTransaction = { + providerTransactionId: "id", + transactionType: "income", + from: {}, + to: {}, +}; + +describe("getDraftTransactionsByStatus", () => { + it("should group transactions by their status", () => { + const transactions: DraftTransaction[] = [ + { ...parsedTransaction, status: DraftTransactionStatus.NeedsReview }, + { ...parsedTransaction, status: DraftTransactionStatus.ReadyToImport }, + { + ...parsedTransaction, + status: DraftTransactionStatus.SkippedAlreadyImported, + }, + { + ...parsedTransaction, + status: DraftTransactionStatus.SkippedTemporarily, + }, + { + ...parsedTransaction, + status: DraftTransactionStatus.SkippedPermanently, + }, + { + ...parsedTransaction, + status: DraftTransactionStatus.SkippedAlreadyImported, + }, + { + ...parsedTransaction, + status: DraftTransactionStatus.SkippedPermanently, + }, + ]; + + const result = getDraftTransactionsByStatus(transactions); + + expect(result[DraftTransactionStatus.NeedsReview]).toHaveLength(1); + expect(result[DraftTransactionStatus.ReadyToImport]).toHaveLength(1); + expect(result[DraftTransactionStatus.SkippedAlreadyImported]).toHaveLength( + 2, + ); + expect(result[DraftTransactionStatus.SkippedTemporarily]).toHaveLength(1); + expect(result[DraftTransactionStatus.SkippedPermanently]).toHaveLength(2); + }); +}); diff --git a/apps/client/dashboard/src/components/transaction/import/import-transactions/utils.ts b/apps/client/dashboard/src/components/transaction/import/import-transactions/utils.ts new file mode 100644 index 0000000..fb522ed --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/utils.ts @@ -0,0 +1,40 @@ +import { ParsedTransaction } from "@monyfox/client-transactions-importer"; + +export enum DraftTransactionStatus { + /** The transaction can't be imported and needs to be manually reviewed. */ + NeedsReview = "needs-review", + + /** The transactio is ready to be imported. */ + ReadyToImport = "ready-to-import", + + /** The transaction has already been imported (or skipped permanently) in the + * past. */ + SkippedAlreadyImported = "skipped-already-imported", + + /** The user wants to skip the import this time, but the transaction will be + * processed again next time. */ + SkippedTemporarily = "skipped-temporarily", + + /** The transaction will always be skipped in the future. */ + SkippedPermanently = "skipped-permanently", +} + +export type DraftTransaction = ParsedTransaction & { + status: DraftTransactionStatus; +}; + +export function getDraftTransactionsByStatus(transactions: DraftTransaction[]) { + const result = { + [DraftTransactionStatus.NeedsReview]: [] as DraftTransaction[], + [DraftTransactionStatus.ReadyToImport]: [] as DraftTransaction[], + [DraftTransactionStatus.SkippedAlreadyImported]: [] as DraftTransaction[], + [DraftTransactionStatus.SkippedTemporarily]: [] as DraftTransaction[], + [DraftTransactionStatus.SkippedPermanently]: [] as DraftTransaction[], + } as const; + + transactions.forEach((t) => { + result[t.status].push(t); + }); + + return result; +} diff --git a/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.test.tsx b/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.test.tsx new file mode 100644 index 0000000..2080799 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.test.tsx @@ -0,0 +1,26 @@ +import { describe, test, expect } from "vitest"; +import { render, screen } from "@testing-library/react"; +import { TestContextProvider } from "@/utils/tests/contexts"; +import { CreateImporterCard } from "./create-importer-card"; + +describe("CreateImporterCard", () => { + test("shows Chase importer link and navigates to create page", async () => { + render( + + + , + ); + + // The card title and description + expect(screen.getByText("Create new importer")).toBeInTheDocument(); + expect( + screen.getByText( + /Select one of the available importers to create a new importer/i, + ), + ).toBeInTheDocument(); + + // The Chase tile and plus button + expect(screen.getByText("Chase")).toBeInTheDocument(); + screen.getByTitle("Create Chase importer"); + }); +}); diff --git a/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.tsx b/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.tsx new file mode 100644 index 0000000..b244cdb --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.tsx @@ -0,0 +1,60 @@ +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { useProfile } from "@/hooks/use-profile"; +import { TransactionsImporter } from "@monyfox/common-data"; +import { Link } from "@tanstack/react-router"; +import { PlusIcon } from "lucide-react"; + +export function CreateImporterCard() { + return ( + + + Create new importer + + Select one of the available importers to create a new importer. + + + +
+ +
+
+
+ ); +} + +function CreateImporterLink({ + name, + importerType, +}: { + name: string; + importerType: TransactionsImporter["data"]["provider"]; +}) { + const { + user: { id: profileId }, + } = useProfile(); + + return ( + + + + {name} + + + + + + + ); +} diff --git a/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.test.tsx b/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.test.tsx new file mode 100644 index 0000000..e6bcad2 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.test.tsx @@ -0,0 +1,79 @@ +import { describe, test, expect, vi } from "vitest"; +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import { TestContextProvider } from "@/utils/tests/contexts"; +import { CreateNewImporterPage } from "./create-new-importer-page"; +import { useProfile } from "@/hooks/use-profile.ts"; + +function fillAndSubmitChaseForm() { + const nameInput = screen.getByLabelText(/Name of the credit card/i); + fireEvent.change(nameInput, { target: { value: "My Chase" } }); + + // Select account + const accountSelectTrigger = screen.getByText(/Select an account/i); + fireEvent.click(accountSelectTrigger); + fireEvent.click(screen.getAllByText("Account 1")[1]); + + // Select currency + const currencyTrigger = screen.getByText(/Select a currency/i); + fireEvent.click(currencyTrigger); + fireEvent.click(screen.getAllByText("USD")[1]); + + const submit = screen.getByText("Create"); + fireEvent.click(submit); +} + +describe("CreateNewImporterPage", () => { + test("unsupported importer type shows alert", () => { + render( + + {}} + /> + , + ); + + expect( + screen.getByText(/Importer type "unknown-provider" not supported/i), + ).toBeInTheDocument(); + }); + + test("chase-card: creates importer and navigates back to dashboard", async () => { + const onSuccess = vi.fn(); + render( + + + + , + ); + expect(screen.getByText("Importers:Importer 1.")).toBeInTheDocument(); + + // Form visible + expect( + screen.getByText("Create a Chase Credit Card importer"), + ).toBeInTheDocument(); + + // Fill and submit + fillAndSubmitChaseForm(); + + // After creation, navigation goes to the dashboard page + await waitFor(() => { + expect(onSuccess).toHaveBeenCalledOnce(); + expect( + screen.getByText("Importers:Importer 1,My Chase."), + ).toBeInTheDocument(); + }); + }); +}); + +function PrintImportersForTest() { + const { + data: { transactionsImporters }, + } = useProfile(); + return ( +
Importers:{transactionsImporters.map((i) => i.name).join(",")}.
+ ); +} diff --git a/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.tsx b/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.tsx new file mode 100644 index 0000000..052fec7 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.tsx @@ -0,0 +1,30 @@ +import { toast } from "sonner"; +import { ChaseCardImporter } from "./providers/chase"; +import { Alert, AlertDescription } from "@/components/ui/alert"; + +export function CreateNewImporterPage({ + importerType, + onSuccess, +}: { + importerType: string; + onSuccess: () => void; +}) { + function onError(e: Error) { + console.error(e); + toast.error(e.message); + } + + if (importerType === "chase-card") { + return ( + + ); + } + + return ( + + + Importer type "{importerType}" not supported + + + ); +} diff --git a/apps/client/dashboard/src/components/transaction/import/importers/importer-card.tsx b/apps/client/dashboard/src/components/transaction/import/importers/importer-card.tsx new file mode 100644 index 0000000..f0bb8b4 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/importers/importer-card.tsx @@ -0,0 +1,64 @@ +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardTitle } from "@/components/ui/card"; +import { Modal, useModal } from "@/components/ui/modal"; +import { useProfile } from "@/hooks/use-profile"; +import { TransactionsImporter } from "@monyfox/common-data"; +import { Link } from "@tanstack/react-router"; +import { ArrowRightIcon, PencilIcon } from "lucide-react"; +import { toast } from "sonner"; +import { ChaseCardImporter } from "./providers/chase"; + +export function Importer({ importer }: { importer: TransactionsImporter }) { + const { + user: { id: profileId }, + } = useProfile(); + const { closeModal, openModal, isOpen } = useModal(); + + function onSuccess() { + closeModal(); + } + + function onError(e: Error) { + console.error(e); + toast.error(e.message); + } + + return ( + <> + + + + {importer.name} +
+ + + + +
+
+
+
+ + {importer.data.provider === "chase-card" && ( + + )} + + + ); +} diff --git a/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.test.tsx b/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.test.tsx new file mode 100644 index 0000000..8c6dec5 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.test.tsx @@ -0,0 +1,68 @@ +import { describe, test, expect } from "vitest"; +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import { TestContextProvider } from "@/utils/tests/contexts"; +import { useProfile } from "@/hooks/use-profile"; +import { useState } from "react"; +import { ChaseCardImporter } from "./chase"; + +function createChaseCsvFile() { + const headers = [ + "Transaction Date", + "Post Date", + "Description", + "Category", + "Type", + "Amount", + "Memo", + ].join(","); + + const rows = [ + ["09/12/2025", "09/14/2025", "MERCHANT 1", "Shopping", "Sale", "-21.45", ""], + ["09/12/2025", "09/14/2025", "MERCHANT 2", "Food & Drink", "Return", "25.00", ""], + ["08/01/2025", "08/03/2025", "Payment Thank You-Mobile", "", "Payment", "50.00", ""], + ] + .map((r) => r.join(",")) + .join("\n"); + + const content = `${headers}\n${rows}\n`; + return new File([content], "chase.csv", { type: "text/csv" }); +} + +function ImportFormHarness() { + const { data } = useProfile(); + const importer = data.transactionsImporters[0]; + const [count, setCount] = useState(null); + + return ( + <> + setCount(txs.length)} + /> +
{count ?? "no"}
+ + ); +} + +describe("ChaseCardImporter.ImportForm", () => { + test("parses CSV and returns transactions via onSuccess", async () => { + render( + + + , + ); + + // Upload CSV + const fileInput = document.querySelector('input[type="file"]') as HTMLInputElement | null; + expect(fileInput).not.toBeNull(); + const file = createChaseCsvFile(); + fireEvent.change(fileInput as HTMLInputElement, { target: { files: [file] } }); + + // Submit + fireEvent.click(screen.getByRole("button", { name: /next/i })); + + await waitFor(() => { + expect(screen.getByTestId("parsed-count").textContent).toBe("3"); + }); + }); +}); diff --git a/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.tsx b/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.tsx new file mode 100644 index 0000000..82b22f8 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.tsx @@ -0,0 +1,375 @@ +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { useMutation } from "@tanstack/react-query"; +import React, { useRef } from "react"; +import { toast } from "sonner"; +import { + ChaseCardTransactionsImporter, + type ParsedTransaction, +} from "@monyfox/client-transactions-importer"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { useProfile } from "@/hooks/use-profile"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { useForm } from "react-hook-form"; +import z from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { ulid } from "ulid"; +import { TransactionsImporter } from "@monyfox/common-data"; +import { TrashIcon } from "lucide-react"; + +const ImporterFormSchema = z.object({ + name: z.string(), + accountId: z.string(), + symbolId: z.string(), +}); +type ImporterForm = z.infer; + +function CreateForm({ + onSuccess, + onError, +}: { + onSuccess: () => void; + onError: (e: Error) => void; +}) { + const { + data: { accounts, assetSymbols }, + createTransactionsImporters, + } = useProfile(); + + const form = useForm({ + resolver: zodResolver(ImporterFormSchema), + }); + + const submit = useMutation({ + mutationFn: async ({ accountId, symbolId, name }: ImporterForm) => { + await createTransactionsImporters.mutateAsync([ + { + id: ulid(), + name: name, + data: { + provider: "chase-card", + defaultAccountId: accountId, + defaultSymbolId: symbolId, + }, + }, + ]); + }, + onSuccess, + onError, + }); + + function onSubmit(values: ImporterForm) { + submit.mutate(values); + } + + return ( +
+ + + + Create a Chase Credit Card importer + + + + ( + + Name of the credit card + + + + + + )} + /> + ( + + Link to account + + + + + + )} + /> + ( + + Currency + + + + + + )} + /> + + + + + +
+ + ); +} + +function EditForm({ + importer, + onSuccess, + onError, +}: { + importer: TransactionsImporter & { data: { provider: "chase-card" } }; + onSuccess: () => void; + onError: (e: Error) => void; +}) { + const { + data: { accounts, assetSymbols }, + updateTransactionsImporter, + deleteTransactionsImporter, + } = useProfile(); + + const form = useForm({ + resolver: zodResolver(ImporterFormSchema), + defaultValues: { + name: importer.name, + accountId: importer.data.defaultAccountId, + symbolId: importer.data.defaultSymbolId, + }, + }); + + const submit = useMutation({ + mutationFn: async (input: ImporterForm) => { + await updateTransactionsImporter.mutateAsync({ + id: importer.id, + name: input.name, + data: { + provider: "chase-card", + defaultAccountId: input.accountId, + defaultSymbolId: input.symbolId, + }, + }); + }, + onSuccess, + onError, + }); + + function onSubmit(values: ImporterForm) { + submit.mutate(values); + } + + function onDelete() { + deleteTransactionsImporter.mutate(importer.id, { + onSuccess, + onError: (e) => { + console.error(e); + toast.error(e.message); + }, + }); + } + + return ( +
+ +
+ ( + + Name + + + + + + )} + /> + ( + + Link to account + + + + + + )} + /> + ( + + Currency + + + + + + )} + /> +
+ + +
+
+
+ + ); +} + +function ImportForm({ + transactionsImporter, + onSuccess, +}: { + transactionsImporter: TransactionsImporter & { + data: { provider: "chase-card" }; + }; + onSuccess: (transactions: ParsedTransaction[]) => void; +}) { + const fileRef = useRef(null); + + const submit = useMutation({ + mutationFn: async () => { + const file = fileRef.current?.files?.[0]; + if (file === undefined) { + throw new Error("No file selected"); + } + + const importer = new ChaseCardTransactionsImporter({ + accountId: transactionsImporter.data.defaultAccountId, + symbolId: transactionsImporter.data.defaultSymbolId, + }); + + const transactions = await importer.getTransactions(file); + onSuccess(transactions); + }, + onError: (e) => { + console.error(e); + toast.error(e.message); + }, + }); + + function onSubmit(e: React.FormEvent) { + e.preventDefault(); + submit.mutate(); + } + + return ( +
+ + + Upload your Chase CSV file + + + + + + + + + +
+ ); +} + +export const ChaseCardImporter = { + CreateForm, + EditForm, + ImportForm, +}; diff --git a/apps/client/dashboard/src/components/transaction/import/importers/user-importers-card.test.tsx b/apps/client/dashboard/src/components/transaction/import/importers/user-importers-card.test.tsx new file mode 100644 index 0000000..8e86e33 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/importers/user-importers-card.test.tsx @@ -0,0 +1,75 @@ +import { describe, test, expect } from "vitest"; +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import { TestContextProvider } from "@/utils/tests/contexts"; +import { UserImportersCard } from "./user-importers-card"; + +describe("UserImportersCard", () => { + test("lists existing importers and allows opening edit modal and navigating to import page", async () => { + render( + + + , + ); + + // Title and description + expect(screen.getByText("Your importers")).toBeInTheDocument(); + expect( + screen.getByText(/Select one of the available importers/i), + ).toBeInTheDocument(); + + // One importer present + expect(screen.getByText("Importer 1")).toBeInTheDocument(); + + // Open edit modal via pencil icon button + const buttons = screen.getAllByRole("button"); + const pencil = buttons.find((b) => b.querySelector("svg")); + if (pencil) fireEvent.click(pencil); + + await waitFor(() => { + expect(screen.getByText("Edit importer")).toBeInTheDocument(); + }); + + // Close modal by updating the name (submit will close on success) + const nameInput = screen.getByLabelText(/Name/i); + fireEvent.change(nameInput, { target: { value: "Updated name" } }); + const updateBtn = screen.getByRole("button", { name: /update/i }); + fireEvent.click(updateBtn); + + await waitFor(() => { + // Modal closes and card title updates + expect(screen.queryByText("Edit importer")).not.toBeInTheDocument(); + expect(screen.getByText("Updated name")).toBeInTheDocument(); + }); + }); + + test("deletes an importer from edit modal and shows empty state", async () => { + render( + + + , + ); + + // Ensure initial importer is present + expect(screen.getByText("Importer 1")).toBeInTheDocument(); + + // Open edit modal via pencil icon button + const buttons = screen.getAllByRole("button"); + const pencil = buttons.find((b) => b.querySelector("svg")); + if (pencil) fireEvent.click(pencil); + + await waitFor(() => { + expect(screen.getByText("Edit importer")).toBeInTheDocument(); + }); + + // Click delete button inside modal + const deleteBtn = screen.getByTitle("Delete"); + fireEvent.click(deleteBtn); + + // After deletion, modal should close and empty state should appear + await waitFor(() => { + expect(screen.queryByText("Edit importer")).not.toBeInTheDocument(); + expect(screen.queryByText("Importer 1")).not.toBeInTheDocument(); + expect(screen.getByText("No importers found")).toBeInTheDocument(); + }); + }); +}); diff --git a/apps/client/dashboard/src/components/transaction/import/importers/user-importers-card.tsx b/apps/client/dashboard/src/components/transaction/import/importers/user-importers-card.tsx new file mode 100644 index 0000000..3b6b254 --- /dev/null +++ b/apps/client/dashboard/src/components/transaction/import/importers/user-importers-card.tsx @@ -0,0 +1,49 @@ +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { useProfile } from "@/hooks/use-profile"; +import { Importer } from "./importer-card"; + +export function UserImportersCard() { + const { data } = useProfile(); + + return ( + + + Your importers + + Select one of the available importers to start importing your + transactions. + + + + {data.transactionsImporters.length === 0 ? ( + + ) : ( +
+ {data.transactionsImporters.map((importer) => ( + + ))} +
+ )} +
+
+ ); +} + +function NoImporters() { + return ( + + No importers found + + You have no importers yet. Please create one below to start importing + your transactions. + + + ); +} diff --git a/apps/client/dashboard/src/components/transaction/transaction-form.test.tsx b/apps/client/dashboard/src/components/transaction/transaction-form.test.tsx index 30e3c9d..18ca95c 100644 --- a/apps/client/dashboard/src/components/transaction/transaction-form.test.tsx +++ b/apps/client/dashboard/src/components/transaction/transaction-form.test.tsx @@ -1,17 +1,14 @@ import { TestContextProvider } from "@/utils/tests/contexts"; import { describe, expect, test } from "vitest"; import { fireEvent, render, waitFor } from "@testing-library/react"; -import { - AddTransactionFloatingButton, - TransactionFormModal, -} from "./transaction-form"; +import { AddTransactionButton, TransactionFormModal } from "./transaction-form"; import { Transaction } from "@monyfox/common-data"; import { TransactionsTable } from "./transactions-table"; -test("AddTransactionFloatingButton", async () => { +test("AddTransactionButton", async () => { const { getByRole } = render( - + , ); diff --git a/apps/client/dashboard/src/components/transaction/transaction-form.tsx b/apps/client/dashboard/src/components/transaction/transaction-form.tsx index c08ecc5..9097c3e 100644 --- a/apps/client/dashboard/src/components/transaction/transaction-form.tsx +++ b/apps/client/dashboard/src/components/transaction/transaction-form.tsx @@ -33,16 +33,27 @@ import { getTransactionType, TransactionType } from "@/utils/transaction"; import { getTransactionCategoriesWithChildren } from "@/utils/transaction-category"; import { SelectItemTransactionCategoryWithChildren } from "../settings/transaction-categories/category-select-item"; -export function AddTransactionFloatingButton() { +export function AddTransactionButton({ + isFloating = false, + type, +}: { + isFloating?: boolean; + type: "text" | "icon"; +}) { const { isOpen, openModal, closeModal } = useModal(); + + const buttonClassName = isFloating + ? "fixed bottom-4 right-4 z-10" + : undefined; + + const buttonSize = isFloating ? "lg" : type === "icon" ? "icon" : "default"; + const iconClassName = isFloating ? "size-7" : undefined; + return ( <> - +
+ + + + +
+ + + ); +} diff --git a/apps/client/dashboard/src/components/transaction/transactions-table.tsx b/apps/client/dashboard/src/components/transaction/transactions-table.tsx index ea3f38e..4a72491 100644 --- a/apps/client/dashboard/src/components/transaction/transactions-table.tsx +++ b/apps/client/dashboard/src/components/transaction/transactions-table.tsx @@ -1,224 +1,43 @@ -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; import { useProfile } from "@/hooks/use-profile"; import { formatCurrency } from "@/utils/currency"; import { getTransactionType, TransactionType } from "@/utils/transaction"; import { type Transaction, type Account } from "@monyfox/common-data"; -import { useMemo, useState } from "react"; -import { - ColumnDef, - ColumnFiltersState, - flexRender, - getCoreRowModel, - getFacetedRowModel, - getFacetedUniqueValues, - getFilteredRowModel, - getPaginationRowModel, - getSortedRowModel, - SortingState, - useReactTable, - VisibilityState, -} from "@tanstack/react-table"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import { Label } from "../ui/label"; +import { useMemo } from "react"; +import { ColumnDef } from "@tanstack/react-table"; import { Button } from "../ui/button"; -import { - ArrowRightIcon, - ChevronLeftIcon, - ChevronRightIcon, - ChevronsLeftIcon, - ChevronsRightIcon, - PencilIcon, - TriangleAlert, -} from "lucide-react"; +import { ArrowRightIcon, PencilIcon, TriangleAlert } from "lucide-react"; import { useModal } from "../ui/modal"; import { TransactionFormModal } from "./transaction-form"; +import { DataTable } from "../data-table"; -export function TransactionsTable() { +type MaybeNonExistentTransaction = Transaction & { nonExistentText?: string }; + +export function TransactionsTable({ + transactions: transactionsOverride, +}: { + transactions?: MaybeNonExistentTransaction[]; +}) { const { data: { transactions: reversedTransactions }, getAccount, getTransactionCategory, } = useProfile(); - const [rowSelection, setRowSelection] = useState({}); - const [columnVisibility, setColumnVisibility] = useState({}); - const [columnFilters, setColumnFilters] = useState([]); - const [sorting, setSorting] = useState([]); - const [pagination, setPagination] = useState({ - pageIndex: 0, - pageSize: 10, - }); + const transactions = transactionsOverride ?? reversedTransactions.reverse(); - const transactions = useMemo(() => { - return [...reversedTransactions] - .map((t) => ({ - ...t, - fromAccountName: getAccountName(t.from, getAccount), - toAccountName: getAccountName(t.to, getAccount), - transactionCategoryName: - t.transactionCategoryId === null - ? "" - : getTransactionCategory(t.transactionCategoryId).name, - })) - .reverse(); + const data = useMemo(() => { + return [...transactions].map((t) => ({ + ...t, + fromAccountName: getAccountName(t.from, getAccount), + toAccountName: getAccountName(t.to, getAccount), + transactionCategoryName: + t.transactionCategoryId === null + ? "" + : getTransactionCategory(t.transactionCategoryId).name, + })); }, [getAccount, getTransactionCategory, reversedTransactions]); - const table = useReactTable({ - data: transactions, - columns, - state: { - sorting, - columnVisibility, - rowSelection, - columnFilters, - pagination, - }, - getRowId: (row) => row.id.toString(), - enableRowSelection: true, - onRowSelectionChange: setRowSelection, - onSortingChange: setSorting, - onColumnFiltersChange: setColumnFilters, - onColumnVisibilityChange: setColumnVisibility, - onPaginationChange: setPagination, - getCoreRowModel: getCoreRowModel(), - getFilteredRowModel: getFilteredRowModel(), - getPaginationRowModel: getPaginationRowModel(), - getSortedRowModel: getSortedRowModel(), - getFacetedRowModel: getFacetedRowModel(), - getFacetedUniqueValues: getFacetedUniqueValues(), - }); - - return ( -
-
- - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => { - return ( - - {flexRender( - header.column.columnDef.header, - header.getContext(), - )} - - ); - })} - - ))} - - - {table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - - {flexRender(cell.column.columnDef.cell, cell.getContext())} - - ))} - - ))} - -
-
-
-
- {table.getFilteredSelectedRowModel().rows.length} of{" "} - {table.getFilteredRowModel().rows.length} transactions selected. -
-
-
- - -
-
- Page {table.getState().pagination.pageIndex + 1} of{" "} - {table.getPageCount()} -
-
- - - - -
-
-
-
- ); + return r.id} />; } function AmountText({ transaction }: { transaction: Transaction }) { @@ -247,9 +66,22 @@ function AmountText({ transaction }: { transaction: Transaction }) { ); } -function TransactionActions({ transaction }: { transaction: Transaction }) { +function TransactionActions({ + transaction, +}: { + transaction: MaybeNonExistentTransaction; +}) { const { getAccount } = useProfile(); const { isOpen, openModal, closeModal } = useModal(); + + if (transaction.nonExistentText !== undefined) { + return ( + + {transaction.nonExistentText} + + ); + } + const isUnknown = getTransactionType(transaction, getAccount) === TransactionType.Unknown; return ( diff --git a/apps/client/dashboard/src/components/ui/alert.tsx b/apps/client/dashboard/src/components/ui/alert.tsx index a34fd23..3ade6a9 100644 --- a/apps/client/dashboard/src/components/ui/alert.tsx +++ b/apps/client/dashboard/src/components/ui/alert.tsx @@ -67,12 +67,13 @@ function AlertDescription({ export function DestructiveAlert({ title, children, + ...props }: { title: string; children: React.ReactNode; -}) { +} & React.ComponentProps<"div">) { return ( - + {title} {children} diff --git a/apps/client/dashboard/src/contexts/database-provider.tsx b/apps/client/dashboard/src/contexts/database-provider.tsx index 3e8d2f1..93fae13 100644 --- a/apps/client/dashboard/src/contexts/database-provider.tsx +++ b/apps/client/dashboard/src/contexts/database-provider.tsx @@ -1,28 +1,29 @@ -import { ReactNode } from "react"; -import { useMutation, useQuery } from "@tanstack/react-query"; -import { Spinner } from "@/components/ui/spinner"; -import { type Profile } from "@monyfox/common-data"; -import { toast } from "sonner"; -import { DatabaseIDBImpl } from "@/database/database-idb"; -import { type ExchangeRateDb, type Database } from "@/database/database"; -import { ErrorPage } from "@/components/error-page"; -import { DatabaseContext } from "./database-context"; -import { notEmpty } from "@/utils/array"; -import { Duration } from "@js-joda/core"; +import {ReactNode} from "react"; +import {useMutation, useQuery} from "@tanstack/react-query"; +import {Spinner} from "@/components/ui/spinner"; +import {type Profile} from "@monyfox/common-data"; +import {toast} from "sonner"; +import {DatabaseIDBImpl} from "@/database/database-idb"; +import {type ExchangeRateDb, type Database} from "@/database/database"; +import {ErrorPage} from "@/components/error-page"; +import {DatabaseContext} from "./database-context"; +import {notEmpty} from "@/utils/array"; +import {Duration} from "@js-joda/core"; const EXCHANGE_RATE_TTL_MS = Duration.ofDays(28).toMillis(); const isExchangeRateExpired = (v: ExchangeRateDb) => Date.now() - Date.parse(v.updatedAt) > EXCHANGE_RATE_TTL_MS; -export const DatabaseProvider = ({ children }: { children: ReactNode }) => { - const dbQuery = useQuery({ queryKey: ["database"], queryFn: getDatabase }); +export const DatabaseProvider = ({children}: { children: ReactNode }) => { + const dbQuery = useQuery({queryKey: ["database"], queryFn: getDatabase}); if (dbQuery.isPending) { - return ; + return ; } if (dbQuery.isError) { - return ; + console.error(dbQuery.error); + return ; } return ( @@ -66,9 +67,9 @@ function DatabaseDataProvider({ queryKey: ["exchange-rates"], queryFn: async () => { const all = await db.exchangeRates.getAll(); - const expiredIds = all.filter(isExchangeRateExpired).map(({ id }) => id); + const expiredIds = all.filter(isExchangeRateExpired).map(({id}) => id); await Promise.all(expiredIds.map((id) => db.exchangeRates.delete(id))); - return all.filter(({ id }) => !expiredIds.includes(id)); + return all.filter(({id}) => !expiredIds.includes(id)); }, }); @@ -77,7 +78,7 @@ function DatabaseDataProvider({ }; if (profilesQuery.isPending || exchangeRatesQuery.isPending) { - return ; + return ; } if (profilesQuery.isError || exchangeRatesQuery.isError) { @@ -86,7 +87,7 @@ function DatabaseDataProvider({ exchangeRatesQuery.error?.message, ].filter(notEmpty); return ( - + ); } @@ -109,7 +110,7 @@ function LoadingPage() { return (
- +
); diff --git a/apps/client/dashboard/src/contexts/profile-context.test.tsx b/apps/client/dashboard/src/contexts/profile-context.test.tsx index 62224ed..c9058e8 100644 --- a/apps/client/dashboard/src/contexts/profile-context.test.tsx +++ b/apps/client/dashboard/src/contexts/profile-context.test.tsx @@ -18,6 +18,17 @@ describe("ProfileProvider", () => { ).toBeDefined(); }); + test("optioanl field has default data", async () => { + const result = render( + + + , + ); + + expect(result.getByText("Accounts:Account 1,Account 2.")).toBeDefined(); + expect(result.getByText("Transactions importers:.")).toBeDefined(); + }); + test("undefined profile", async () => { const result = render( @@ -75,13 +86,17 @@ describe("ProfileProvider", () => { function ProfileDataForTest() { const { - data: { accounts, transactions }, + data: { accounts, transactions, transactionsImporters }, createAccount, } = useProfile(); return (

Accounts:{accounts.map((a) => a.name).join(",")}.

Transactions:{transactions.map((t) => t.description).join(",")}.

+

+ Transactions importers: + {transactionsImporters.map((t) => t.id).join(",")}. +

Do not skip @@ -330,16 +348,25 @@ function ActionsCell({ transaction }: { transaction: DraftTransaction }) {
- Mark as reviewed - Skip @@ -351,8 +378,13 @@ function ActionsCell({ transaction }: { transaction: DraftTransaction }) { return ( - Skip @@ -364,31 +396,31 @@ const columns: ColumnDef[] = [ { accessorKey: "date", header: "Date", - cell: ({ row }) => , + cell: ({ row }) => , }, { accessorKey: "description", header: "Description", - cell: ({ row }) => , + cell: ({ row }) => , }, { accessorKey: "amount", header: "Amount", - cell: ({ row }) => , + cell: ({ row }) => , }, { accessorKey: "transactionCategoryId", header: "Category", - cell: ({ row }) => , + cell: ({ row }) => , }, { accessorKey: "type", header: "Type", - cell: ({ row }) => , + cell: ({ row }) => , }, { accessorKey: "actions", header: "", - cell: ({ row }) => , + cell: ({ row }) => , }, ]; From 8c214d8a0eac680d5e49530bea35a4451855150c Mon Sep 17 00:00:00 2001 From: LucaDiba Date: Sun, 21 Sep 2025 20:11:14 -0700 Subject: [PATCH 03/12] Move data import to implemented features --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1456b2e..d402504 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ [![codecov](https://codecov.io/gh/LucaDiba/monyfox/graph/badge.svg?token=1PDRWAPU6X)](https://codecov.io/gh/LucaDiba/monyfox) -Welcome to MonyFox, your comprehensive open-source solution for managing your finances efficiently. MonyFox is a web app that works 100% locally. It is designed to help you keep track of your money, visualize your financial data with insightful charts, and plan for a better financial future. +Welcome to MonyFox, your comprehensive open-source solution for managing your finances efficiently. MonyFox is a web app +that works 100% locally. It is designed to help you keep track of your money, visualize your financial data with +insightful charts, and plan for a better financial future. ![MonyFox dashboard screenshot](./images/dashboard.png) @@ -13,6 +15,7 @@ Welcome to MonyFox, your comprehensive open-source solution for managing your fi - 💻 **User-Friendly Interface:** Intuitive design for seamless navigation and usage. - 💶 **Multi-Currency Support:** Manage your finances in multiple currencies with ease. - 📈 **Stock Tracking:** Monitor your investments and track stock performance. +- 📂 **Data Import:** Import financial data from various sources for a unified view. - 💾 **Backup and Restore:** Easily backup and restore your financial data. - 🌐 **100% Open Source:** Fully open-source, ensuring transparency and customization options. - 🏠 **100% Local:** All data is stored locally on your device, ensuring privacy and security. @@ -21,9 +24,9 @@ Welcome to MonyFox, your comprehensive open-source solution for managing your fi - 💳 **Budgeting Tools:** Set budgets and track your spending to stay on target. - 📜 **Debt Management:** Track your debts and payoff plans. -- 📂 **Data Import:** Import financial data from various sources for a unified view. - 📱 **Mobile App:** Access MonyFox on the go with a dedicated PWA. -- 🌐 **Sync Across Devices:** Sync your financial data across multiple devices for seamless access. The data will be encrypted and stored in a secure cloud service. +- 🌐 **Sync Across Devices:** Sync your financial data across multiple devices for seamless access. The data will be + encrypted and stored in a secure cloud service. ## Getting Started From 134b304afc62bc8c364b25f7dc7c9a33d3292a0c Mon Sep 17 00:00:00 2001 From: LucaDiba Date: Sun, 21 Sep 2025 20:53:17 -0700 Subject: [PATCH 04/12] Add Chase account importer --- .../src/importers/chase/chase-account.test.ts | 105 +++++++++++++++ .../src/importers/chase/chase-account.ts | 121 ++++++++++++++++++ 2 files changed, 226 insertions(+) create mode 100644 packages/client/transactions-importer/src/importers/chase/chase-account.test.ts create mode 100644 packages/client/transactions-importer/src/importers/chase/chase-account.ts diff --git a/packages/client/transactions-importer/src/importers/chase/chase-account.test.ts b/packages/client/transactions-importer/src/importers/chase/chase-account.test.ts new file mode 100644 index 0000000..f5c258c --- /dev/null +++ b/packages/client/transactions-importer/src/importers/chase/chase-account.test.ts @@ -0,0 +1,105 @@ +import { describe, expect, test } from "vitest"; +import { ChaseAccountTransactionsImporter } from "./chase-account"; + +describe("ChaseAccountTransactionsImporter", () => { + const accountId = "test-account-id"; + const symbolId = "test-symbol-id"; + const importer = new ChaseAccountTransactionsImporter({ accountId, symbolId }); + + describe("getTransactions", () => { + test("parses account CSV rows into parsed transactions", async () => { + const file = new File( + [ + `Details,Posting Date,Description,Amount,Type,Balance,Check or Slip #\n` + + `CREDIT,09/15/2025,Employer Payroll,1000.00,ACH_CREDIT,1500.00,\n` + + `DEBIT,09/14/2025,GROCERY STORE,-45.67,ACH_DEBIT,1454.33,\n` + + `DEBIT,09/10/2025,Loan Payment,200.00,LOAN_PMT,1200.00,\n` + + `DEBIT,09/09/2025,ATM Withdrawal,100.00,ATM,1100.00,\n`, + ], + "chase_account.csv", + { type: "text/csv" }, + ); + + const transactions = await importer.getTransactions(file); + + expect(transactions).toHaveLength(4); + + // ACH_CREDIT -> income, from unknown -> to this account + expect(transactions[0]).toEqual({ + providerTransactionId: + "chase-account-09/15/2025-1000.00-Employer Payroll", + transactionType: "income", + description: "Employer Payroll", + date: "2025-09-15", + transactionCategoryId: null, + from: { + amount: 1000, + symbolId, + account: { name: "" }, + }, + to: { + amount: 1000, + symbolId, + account: { id: accountId }, + }, + }); + + // ACH_DEBIT -> expense, from this account -> to unknown (amount is absolute) + expect(transactions[1]).toEqual({ + providerTransactionId: "chase-account-09/14/2025--45.67-GROCERY STORE", + transactionType: "expense", + description: "GROCERY STORE", + date: "2025-09-14", + transactionCategoryId: null, + from: { + amount: 45.67, + symbolId, + account: { id: accountId }, + }, + to: { + amount: 45.67, + symbolId, + account: { name: "" }, + }, + }); + + // LOAN_PMT -> transfer, from this account -> to unknown + expect(transactions[2]).toEqual({ + providerTransactionId: "chase-account-09/10/2025-200.00-Loan Payment", + transactionType: "transfer", + description: "Loan Payment", + date: "2025-09-10", + transactionCategoryId: null, + from: { + amount: 200, + symbolId, + account: { id: accountId }, + }, + to: { + amount: 200, + symbolId, + account: { name: "" }, + }, + }); + + // ATM -> default -> transfer with undefined accounts + expect(transactions[3]).toEqual({ + providerTransactionId: "chase-account-09/09/2025-100.00-ATM Withdrawal", + transactionType: "transfer", + description: "ATM Withdrawal", + date: "2025-09-09", + transactionCategoryId: null, + from: { + amount: 100, + symbolId, + account: undefined, + }, + to: { + amount: 100, + symbolId, + account: undefined, + }, + }); + }); + }); +}); diff --git a/packages/client/transactions-importer/src/importers/chase/chase-account.ts b/packages/client/transactions-importer/src/importers/chase/chase-account.ts new file mode 100644 index 0000000..a095262 --- /dev/null +++ b/packages/client/transactions-importer/src/importers/chase/chase-account.ts @@ -0,0 +1,121 @@ +import { format, parse } from "date-fns"; +import { ParsedTransaction, TransactionsImporter } from ".."; +import { CsvParser } from "../../utils/csv-parser"; +import z from "zod"; + +const RowSchema = z.object({ + Details: z.union([ + z.literal("CREDIT"), + z.literal("DEBIT"), + ]), + "Posting Date": z.string(), + Description: z.string(), + Amount: z.string(), + Type: z.union([ + z.literal("ACH_CREDIT"), + z.literal("ACH_DEBIT"), + z.literal("DEBIT_CARD"), + z.literal("LOAN_PMT"), + z.literal("MISC_CREDIT"), + z.literal("ATM"), + z.literal("MISC_DEBIT"), + z.literal("BILLPAY"), + z.literal("CHASE_TO_PARTNERFI"), + z.literal("FEE_TRANSACTION"), + z.literal("CHECK_DEPOSIT"), + z.literal("PARTNERFI_TO_CHASE"), + ]), + Balance: z.string(), + "Check or Slip #": z.string(), +}); +type Row = z.infer; + +export class ChaseAccountTransactionsImporter + implements TransactionsImporter { + private static importerName = "chase-account"; + + private readonly accountId: string; + private readonly symbolId: string; + + constructor({ + accountId, + symbolId, + }: { + accountId: string; + symbolId: string; + }) { + this.accountId = accountId; + this.symbolId = symbolId; + } + + async getTransactions(file: File): Promise { + const csvParser = new CsvParser(RowSchema, { header: true }); + const rows = await csvParser.fromFile(file); + return rows.map(this.toImportedTransaction, this); + } + + private toImportedTransaction(row: Row): ParsedTransaction { + const unknownAccount = { name: "" }; + const date = ChaseAccountTransactionsImporter.freedomDateToIso( + row["Posting Date"], + ); + const signedAmount = parseFloat(row.Amount); + const amount = Math.abs(signedAmount); + + let transactionType: ParsedTransaction["transactionType"]; + let fromAccount: ParsedTransaction["from"]["account"] = undefined; + let toAccount: ParsedTransaction["from"]["account"] = undefined; + + switch (row["Type"]) { + case "ACH_CREDIT": + case "MISC_CREDIT": + transactionType = "income"; + fromAccount = unknownAccount; + toAccount = { id: this.accountId }; + break; + case "ACH_DEBIT": + case "DEBIT_CARD": + case "FEE_TRANSACTION": + case "MISC_DEBIT": + transactionType = "expense"; + fromAccount = { id: this.accountId }; + toAccount = unknownAccount; + break; + case "LOAN_PMT": + transactionType = "transfer"; + fromAccount = { id: this.accountId }; + toAccount = unknownAccount; + break; + default: + // Don't set from and to, so it will be reviewed manually. + transactionType = "transfer"; + } + + return { + providerTransactionId: + ChaseAccountTransactionsImporter.getProviderTransactionId(row), + transactionType, + description: row.Description, + date: date, + transactionCategoryId: null, + from: { + amount, + symbolId: this.symbolId, + account: fromAccount, + }, + to: { + amount, + symbolId: this.symbolId, + account: toAccount, + }, + }; + } + + private static getProviderTransactionId(row: Row) { + return `${this.importerName}-${row["Posting Date"]}-${row.Amount}-${row.Description}`; + } + + private static freedomDateToIso(date: string): string { + return format(parse(date, "MM/dd/yyyy", new Date()), "yyyy-MM-dd"); + } +} From a6d60b19225d808fead875995d9fdcc6ac52f58a Mon Sep 17 00:00:00 2001 From: LucaDiba Date: Sun, 21 Sep 2025 21:11:31 -0700 Subject: [PATCH 05/12] Add Chase account importer to client --- .../import-transactions-page.tsx | 32 +- .../import/importers/create-importer-card.tsx | 17 +- .../importers/create-new-importer-page.tsx | 9 +- .../import/importers/importer-card.tsx | 12 +- .../import/importers/providers/chase.tsx | 519 ++++++++++-------- 5 files changed, 332 insertions(+), 257 deletions(-) diff --git a/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.tsx b/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.tsx index 3a8fc52..7b0ddfa 100644 --- a/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.tsx +++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.tsx @@ -1,12 +1,15 @@ -import { ReactNode } from 'react'; -import { useImmer } from 'use-immer'; -import { ImportedTransactionsCard } from './imported-transactions-card'; -import { useProfile } from '@/hooks/use-profile'; -import { ChaseCardImporter } from '../importers/providers/chase'; -import { Alert, AlertDescription } from '@/components/ui/alert'; -import { DraftTransaction, DraftTransactionStatus } from './utils'; -import { ParsedTransaction } from '@monyfox/client-transactions-importer'; -import { needsReview } from '@/utils/imported-transaction'; +import { ReactNode } from "react"; +import { useImmer } from "use-immer"; +import { ImportedTransactionsCard } from "./imported-transactions-card"; +import { useProfile } from "@/hooks/use-profile"; +import { + ChaseCardImporter, + ChaseAccountImporter, +} from "../importers/providers/chase"; +import { Alert, AlertDescription } from "@/components/ui/alert"; +import { DraftTransaction, DraftTransactionStatus } from "./utils"; +import { ParsedTransaction } from "@monyfox/client-transactions-importer"; +import { needsReview } from "@/utils/imported-transaction"; export function ImportTransactionsPage({ importerId }: { importerId: string }) { const { @@ -51,7 +54,7 @@ export function ImportTransactionsPage({ importerId }: { importerId: string }) { let Form: ReactNode; switch (transactionsImporter.data.provider) { - case 'chase-card': { + case "chase-card": { Form = ( + ); + break; + } } return ( diff --git a/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.tsx b/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.tsx index b244cdb..aa63763 100644 --- a/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.tsx +++ b/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.tsx @@ -22,7 +22,14 @@ export function CreateImporterCard() {
- + +
@@ -49,8 +56,12 @@ function CreateImporterLink({ to={"/p/$profileId/transactions/import/importers/new/$importerType"} params={{ profileId, importerType }} > - diff --git a/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.tsx b/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.tsx index 052fec7..4a64e4b 100644 --- a/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.tsx +++ b/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.tsx @@ -1,5 +1,5 @@ import { toast } from "sonner"; -import { ChaseCardImporter } from "./providers/chase"; +import { ChaseCardImporter, ChaseAccountImporter } from "./providers/chase"; import { Alert, AlertDescription } from "@/components/ui/alert"; export function CreateNewImporterPage({ @@ -18,6 +18,13 @@ export function CreateNewImporterPage({ return ( ); + } else if (importerType === "chase-account") { + return ( + + ); } return ( diff --git a/apps/client/dashboard/src/components/transaction/import/importers/importer-card.tsx b/apps/client/dashboard/src/components/transaction/import/importers/importer-card.tsx index f0bb8b4..d1fd7d2 100644 --- a/apps/client/dashboard/src/components/transaction/import/importers/importer-card.tsx +++ b/apps/client/dashboard/src/components/transaction/import/importers/importer-card.tsx @@ -6,7 +6,7 @@ import { TransactionsImporter } from "@monyfox/common-data"; import { Link } from "@tanstack/react-router"; import { ArrowRightIcon, PencilIcon } from "lucide-react"; import { toast } from "sonner"; -import { ChaseCardImporter } from "./providers/chase"; +import { ChaseCardImporter, ChaseAccountImporter } from "./providers/chase"; export function Importer({ importer }: { importer: TransactionsImporter }) { const { @@ -51,13 +51,19 @@ export function Importer({ importer }: { importer: TransactionsImporter }) { onClose={closeModal} description={"Edit the configuration of the importer."} > - {importer.data.provider === "chase-card" && ( + {importer.data.provider === "chase-card" ? ( - )} + ) : importer.data.provider === "chase-account" ? ( + + ) : null} ); diff --git a/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.tsx b/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.tsx index 82b22f8..ff45a13 100644 --- a/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.tsx +++ b/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.tsx @@ -12,7 +12,9 @@ import React, { useRef } from "react"; import { toast } from "sonner"; import { ChaseCardTransactionsImporter, + ChaseAccountTransactionsImporter, type ParsedTransaction, + TransactionsImporter as GenericTransactionsImporter, } from "@monyfox/client-transactions-importer"; import { Select, @@ -44,59 +46,210 @@ const ImporterFormSchema = z.object({ }); type ImporterForm = z.infer; -function CreateForm({ - onSuccess, - onError, -}: { - onSuccess: () => void; - onError: (e: Error) => void; -}) { - const { - data: { accounts, assetSymbols }, - createTransactionsImporters, - } = useProfile(); +const CreateForm = + (provider: "chase-card" | "chase-account") => + ({ + onSuccess, + onError, + }: { + onSuccess: () => void; + onError: (e: Error) => void; + }) => { + const { + data: { accounts, assetSymbols }, + createTransactionsImporters, + } = useProfile(); - const form = useForm({ - resolver: zodResolver(ImporterFormSchema), - }); + const form = useForm({ + resolver: zodResolver(ImporterFormSchema), + }); - const submit = useMutation({ - mutationFn: async ({ accountId, symbolId, name }: ImporterForm) => { - await createTransactionsImporters.mutateAsync([ - { - id: ulid(), - name: name, - data: { - provider: "chase-card", - defaultAccountId: accountId, - defaultSymbolId: symbolId, + const submit = useMutation({ + mutationFn: async ({ accountId, symbolId, name }: ImporterForm) => { + await createTransactionsImporters.mutateAsync([ + { + id: ulid(), + name: name, + data: { + provider: provider, + defaultAccountId: accountId, + defaultSymbolId: symbolId, + }, }, - }, - ]); - }, + ]); + }, + onSuccess, + onError, + }); + + function onSubmit(values: ImporterForm) { + submit.mutate(values); + } + + const title = + provider === "chase-card" + ? "Create a Chase Credit Card importer" + : "Create a Chase Account importer"; + + const nameLabel = + provider === "chase-card" + ? "Name of the credit card" + : "Name of the account"; + + return ( +
+ + + + {title} + + + + ( + + {nameLabel} + + + + + + )} + /> + ( + + Link to account + + + + + + )} + /> + ( + + Currency + + + + + + )} + /> + + + + + +
+ + ); + }; + +const EditForm = + (provider: "chase-card" | "chase-account") => + ({ + importer, onSuccess, onError, - }); + }: { + importer: TransactionsImporter & { data: { provider: typeof provider } }; + onSuccess: () => void; + onError: (e: Error) => void; + }) => { + const { + data: { accounts, assetSymbols }, + updateTransactionsImporter, + deleteTransactionsImporter, + } = useProfile(); + + const form = useForm({ + resolver: zodResolver(ImporterFormSchema), + defaultValues: { + name: importer.name, + accountId: importer.data.defaultAccountId, + symbolId: importer.data.defaultSymbolId, + }, + }); - function onSubmit(values: ImporterForm) { - submit.mutate(values); - } + const submit = useMutation({ + mutationFn: async (input: ImporterForm) => { + await updateTransactionsImporter.mutateAsync({ + id: importer.id, + name: input.name, + data: { + provider: provider, + defaultAccountId: input.accountId, + defaultSymbolId: input.symbolId, + }, + }); + }, + onSuccess, + onError, + }); - return ( -
- - - - Create a Chase Credit Card importer - + function onSubmit(values: ImporterForm) { + submit.mutate(values); + } - + function onDelete() { + deleteTransactionsImporter.mutate(importer.id, { + onSuccess, + onError: (e) => { + console.error(e); + toast.error(e.message); + }, + }); + } + + return ( + + +
( - Name of the credit card + Name @@ -155,221 +308,107 @@ function CreateForm({ )} /> - - - - - - - - ); -} +
+ + +
+
+ + + ); + }; -function EditForm({ - importer, - onSuccess, - onError, -}: { - importer: TransactionsImporter & { data: { provider: "chase-card" } }; - onSuccess: () => void; - onError: (e: Error) => void; -}) { - const { - data: { accounts, assetSymbols }, - updateTransactionsImporter, - deleteTransactionsImporter, - } = useProfile(); +const ImportForm = + (provider: "chase-card" | "chase-account") => + ({ + transactionsImporter, + onSuccess, + }: { + transactionsImporter: TransactionsImporter & { + data: { provider: typeof provider }; + }; + onSuccess: (transactions: ParsedTransaction[]) => void; + }) => { + const fileRef = useRef(null); - const form = useForm({ - resolver: zodResolver(ImporterFormSchema), - defaultValues: { - name: importer.name, - accountId: importer.data.defaultAccountId, - symbolId: importer.data.defaultSymbolId, - }, - }); + const submit = useMutation({ + mutationFn: async () => { + const file = fileRef.current?.files?.[0]; + if (file === undefined) { + throw new Error("No file selected"); + } - const submit = useMutation({ - mutationFn: async (input: ImporterForm) => { - await updateTransactionsImporter.mutateAsync({ - id: importer.id, - name: input.name, - data: { - provider: "chase-card", - defaultAccountId: input.accountId, - defaultSymbolId: input.symbolId, - }, - }); - }, - onSuccess, - onError, - }); + let importer: GenericTransactionsImporter; - function onSubmit(values: ImporterForm) { - submit.mutate(values); - } + switch (provider) { + case "chase-card": + importer = new ChaseCardTransactionsImporter({ + accountId: transactionsImporter.data.defaultAccountId, + symbolId: transactionsImporter.data.defaultSymbolId, + }); + break; + case "chase-account": + importer = new ChaseAccountTransactionsImporter({ + accountId: transactionsImporter.data.defaultAccountId, + symbolId: transactionsImporter.data.defaultSymbolId, + }); + break; + } - function onDelete() { - deleteTransactionsImporter.mutate(importer.id, { - onSuccess, + const transactions = await importer.getTransactions(file); + onSuccess(transactions); + }, onError: (e) => { console.error(e); toast.error(e.message); }, }); - } - return ( -
- -
- ( - - Name - - - - - - )} - /> - ( - - Link to account - - - - - - )} - /> - ( - - Currency - - - - - - )} - /> -
- + function onSubmit(e: React.FormEvent) { + e.preventDefault(); + submit.mutate(); + } + + return ( + + + + Upload your Chase CSV file + + + + + + -
-
+ +
- - ); -} - -function ImportForm({ - transactionsImporter, - onSuccess, -}: { - transactionsImporter: TransactionsImporter & { - data: { provider: "chase-card" }; + ); }; - onSuccess: (transactions: ParsedTransaction[]) => void; -}) { - const fileRef = useRef(null); - - const submit = useMutation({ - mutationFn: async () => { - const file = fileRef.current?.files?.[0]; - if (file === undefined) { - throw new Error("No file selected"); - } - - const importer = new ChaseCardTransactionsImporter({ - accountId: transactionsImporter.data.defaultAccountId, - symbolId: transactionsImporter.data.defaultSymbolId, - }); - - const transactions = await importer.getTransactions(file); - onSuccess(transactions); - }, - onError: (e) => { - console.error(e); - toast.error(e.message); - }, - }); - - function onSubmit(e: React.FormEvent) { - e.preventDefault(); - submit.mutate(); - } - - return ( -
- - - Upload your Chase CSV file - - - - - - - - - -
- ); -} export const ChaseCardImporter = { - CreateForm, - EditForm, - ImportForm, + CreateForm: CreateForm("chase-card"), + EditForm: EditForm("chase-card"), + ImportForm: ImportForm("chase-card"), +}; + +export const ChaseAccountImporter = { + CreateForm: CreateForm("chase-account"), + EditForm: EditForm("chase-account"), + ImportForm: ImportForm("chase-account"), }; From 4cfb906e45eb68439ff7f8a9600ff91c43e2b806 Mon Sep 17 00:00:00 2001 From: LucaDiba Date: Sun, 21 Sep 2025 21:29:08 -0700 Subject: [PATCH 06/12] Fix account importer --- .../src/importers/chase/chase-account.test.ts | 12 ++++++------ .../src/importers/chase/chase-account.ts | 11 ++++++++++- packages/client/transactions-importer/src/index.ts | 1 + .../transactions-importer/src/utils/csv-parser.ts | 6 +++++- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/client/transactions-importer/src/importers/chase/chase-account.test.ts b/packages/client/transactions-importer/src/importers/chase/chase-account.test.ts index f5c258c..9c5be6b 100644 --- a/packages/client/transactions-importer/src/importers/chase/chase-account.test.ts +++ b/packages/client/transactions-importer/src/importers/chase/chase-account.test.ts @@ -11,10 +11,10 @@ describe("ChaseAccountTransactionsImporter", () => { const file = new File( [ `Details,Posting Date,Description,Amount,Type,Balance,Check or Slip #\n` + - `CREDIT,09/15/2025,Employer Payroll,1000.00,ACH_CREDIT,1500.00,\n` + - `DEBIT,09/14/2025,GROCERY STORE,-45.67,ACH_DEBIT,1454.33,\n` + - `DEBIT,09/10/2025,Loan Payment,200.00,LOAN_PMT,1200.00,\n` + - `DEBIT,09/09/2025,ATM Withdrawal,100.00,ATM,1100.00,\n`, + `CREDIT,09/15/2025,Employer Payroll,1000.00,ACH_CREDIT,1500.00,,\n` + + `DEBIT,09/14/2025,"CHASE CREDIT CRD AUTOPAY PPD ID: 123456789",-45.67,ACH_DEBIT,1454.33,,\n` + + `DEBIT,09/10/2025,Loan Payment,200.00,LOAN_PMT,1200.00,,\n` + + `DEBIT,09/09/2025,ATM Withdrawal,100.00,ATM,1100.00,,\n`, ], "chase_account.csv", { type: "text/csv" }, @@ -46,9 +46,9 @@ describe("ChaseAccountTransactionsImporter", () => { // ACH_DEBIT -> expense, from this account -> to unknown (amount is absolute) expect(transactions[1]).toEqual({ - providerTransactionId: "chase-account-09/14/2025--45.67-GROCERY STORE", + providerTransactionId: "chase-account-09/14/2025--45.67-CHASE CREDIT CRD AUTOPAY PPD ID: 123456789", transactionType: "expense", - description: "GROCERY STORE", + description: "CHASE CREDIT CRD AUTOPAY PPD ID: 123456789", date: "2025-09-14", transactionCategoryId: null, from: { diff --git a/packages/client/transactions-importer/src/importers/chase/chase-account.ts b/packages/client/transactions-importer/src/importers/chase/chase-account.ts index a095262..ed19483 100644 --- a/packages/client/transactions-importer/src/importers/chase/chase-account.ts +++ b/packages/client/transactions-importer/src/importers/chase/chase-account.ts @@ -5,6 +5,7 @@ import z from "zod"; const RowSchema = z.object({ Details: z.union([ + z.literal("DSLIP"), z.literal("CREDIT"), z.literal("DEBIT"), ]), @@ -27,6 +28,7 @@ const RowSchema = z.object({ ]), Balance: z.string(), "Check or Slip #": z.string(), + "__ignore__": z.string(), }); type Row = z.infer; @@ -49,7 +51,13 @@ export class ChaseAccountTransactionsImporter } async getTransactions(file: File): Promise { - const csvParser = new CsvParser(RowSchema, { header: true }); + function beforeFirstChunk(chunk: string) { + // The header has 7 columns, but the other rows have 8 columns ¯\_(ツ)_/¯. + // So let's just replace the header with a new one that has 8 columns. + return chunk.replace("Details,Posting Date,Description,Amount,Type,Balance,Check or Slip #", "Details,Posting Date,Description,Amount,Type,Balance,Check or Slip #,__ignore__"); + } + + const csvParser = new CsvParser(RowSchema, { header: true, beforeFirstChunk }); const rows = await csvParser.fromFile(file); return rows.map(this.toImportedTransaction, this); } @@ -69,6 +77,7 @@ export class ChaseAccountTransactionsImporter switch (row["Type"]) { case "ACH_CREDIT": case "MISC_CREDIT": + case "CHECK_DEPOSIT": transactionType = "income"; fromAccount = unknownAccount; toAccount = { id: this.accountId }; diff --git a/packages/client/transactions-importer/src/index.ts b/packages/client/transactions-importer/src/index.ts index 6197941..ffd985e 100644 --- a/packages/client/transactions-importer/src/index.ts +++ b/packages/client/transactions-importer/src/index.ts @@ -1,3 +1,4 @@ export type { TransactionsImporter, ParsedTransaction } from "./importers"; export { ChaseCardTransactionsImporter } from "./importers/chase/chase-card"; +export { ChaseAccountTransactionsImporter } from "./importers/chase/chase-account"; diff --git a/packages/client/transactions-importer/src/utils/csv-parser.ts b/packages/client/transactions-importer/src/utils/csv-parser.ts index e69aa54..50feeea 100644 --- a/packages/client/transactions-importer/src/utils/csv-parser.ts +++ b/packages/client/transactions-importer/src/utils/csv-parser.ts @@ -1,7 +1,10 @@ import Papa, { type ParseLocalConfig } from "papaparse"; import z from "zod"; -type AcceptedParseLocalConfig = { header: ParseLocalConfig["header"] }; +type AcceptedParseLocalConfig = { + header?: ParseLocalConfig["header"], + beforeFirstChunk?: ParseLocalConfig["beforeFirstChunk"] +}; export class CsvParser { private rowSchema: z.ZodType; @@ -17,6 +20,7 @@ export class CsvParser { try { Papa.parse(file, { header: this.config?.header, + beforeFirstChunk: this.config?.beforeFirstChunk, skipEmptyLines: true, complete: (result) => { if (result.errors.length > 0) { From d4c8720c02c3be9c6b404d5b701199680f11fede Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 21:59:48 +0000 Subject: [PATCH 07/12] Bump vite in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). Updates `vite` from 7.1.5 to 7.1.11 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 7.1.11 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- apps/client/dashboard/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/client/dashboard/package.json b/apps/client/dashboard/package.json index 88174ad..db2ee81 100644 --- a/apps/client/dashboard/package.json +++ b/apps/client/dashboard/package.json @@ -85,7 +85,7 @@ "prettier": "^3.6.2", "tailwindcss": "^4.1.12", "typescript": "^5.9.2", - "vite": "^7.1.5", + "vite": "^7.1.11", "vitest": "^3.2.4" }, "packageManager": "yarn@4.3.1" diff --git a/yarn.lock b/yarn.lock index 0549915..5cea7c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1222,7 +1222,7 @@ __metadata: typescript: "npm:^5.9.2" ulid: "npm:^3.0.1" use-immer: "npm:^0.11.0" - vite: "npm:^7.1.5" + vite: "npm:^7.1.11" vitest: "npm:^3.2.4" zod: "npm:^4.1.5" languageName: unknown @@ -6886,9 +6886,9 @@ __metadata: languageName: node linkType: hard -"vite@npm:^7.1.5": - version: 7.1.5 - resolution: "vite@npm:7.1.5" +"vite@npm:^7.1.11": + version: 7.1.11 + resolution: "vite@npm:7.1.11" dependencies: esbuild: "npm:^0.25.0" fdir: "npm:^6.5.0" @@ -6937,7 +6937,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/782d2f20c25541b26d1fb39bef5f194149caff39dc25b7836e25f049ca919f2e2ce186bddb21f3f20f6195354b3579ec637a8ca08d65b117f8b6f81e3e730a9c + checksum: 10c0/c4aa7f47b1fb07f734ed6f4f605d73e5acf7ff9754d75b4adbfbdddf0e520413019834620c1f7b4a207bce7e1d20a2636c584db2b1b17f5a3ba2cd23d47e50ab languageName: node linkType: hard From 5d976e9cf96352d40d75a79ddc956d08c3ecb29b Mon Sep 17 00:00:00 2001 From: LucaDiba Date: Tue, 23 Sep 2025 01:06:23 -0700 Subject: [PATCH 08/12] Fix table page reset --- apps/client/dashboard/src/components/data-table.tsx | 4 ++++ .../import-transactions/imported-transactions-table.tsx | 2 ++ 2 files changed, 6 insertions(+) diff --git a/apps/client/dashboard/src/components/data-table.tsx b/apps/client/dashboard/src/components/data-table.tsx index 9f1c7de..5c49a84 100644 --- a/apps/client/dashboard/src/components/data-table.tsx +++ b/apps/client/dashboard/src/components/data-table.tsx @@ -37,15 +37,18 @@ import { } from "lucide-react"; import { Label } from "./ui/label"; import { Button } from "./ui/button"; +import { TableOptions } from "@tanstack/table-core"; export function DataTable({ data, columns, getRowId, + options = {}, }: { data: Array; columns: ColumnDef[]; getRowId: (row: DataT) => string; + options?: Omit, "data" | "columns" | "getCoreRowModel">; }) { const [rowSelection, setRowSelection] = useState({}); const [columnVisibility, setColumnVisibility] = useState({}); @@ -79,6 +82,7 @@ export function DataTable({ getSortedRowModel: getSortedRowModel(), getFacetedRowModel: getFacetedRowModel(), getFacetedUniqueValues: getFacetedUniqueValues(), + ...options, }); return ( diff --git a/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.tsx b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.tsx index 7b629e7..0a4f93a 100644 --- a/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.tsx +++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.tsx @@ -53,6 +53,8 @@ export function ImportedTransactionsTable({ data={transactions} columns={columns} getRowId={(r) => r.providerTransactionId} + // Prevent the table from resetting the page index when the data changes on input updates. + options={{ autoResetPageIndex: false }} /> ); From 3c48ef84b6fbccaf24989d56afbefca36aa2e693 Mon Sep 17 00:00:00 2001 From: LucaDiba Date: Fri, 14 Nov 2025 03:57:18 -0800 Subject: [PATCH 09/12] Fix yarn --- yarn.lock | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/yarn.lock b/yarn.lock index 5cea7c8..9959190 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2949,11 +2949,19 @@ __metadata: linkType: hard "@types/node@npm:*": +<<<<<<< HEAD version: 24.5.1 resolution: "@types/node@npm:24.5.1" dependencies: undici-types: "npm:~7.12.0" checksum: 10c0/5f0cb038be789b58170e616452ba1f8ebb85bf2fbce58a7e32b1eb08391f64f5e31a9cdbccefbfcd9e6d73b66b564b5e037a1d678ab20213559a32e1d7b6ce17 +======= + version: 24.10.1 + resolution: "@types/node@npm:24.10.1" + dependencies: + undici-types: "npm:~7.16.0" + checksum: 10c0/d6bca7a78f550fbb376f236f92b405d676003a8a09a1b411f55920ef34286ee3ee51f566203920e835478784df52662b5b2af89159d9d319352e9ea21801c002 +>>>>>>> 557b2ee (Fix yarn) languageName: node linkType: hard @@ -2967,11 +2975,19 @@ __metadata: linkType: hard "@types/papaparse@npm:^5.3.16": +<<<<<<< HEAD version: 5.3.16 resolution: "@types/papaparse@npm:5.3.16" dependencies: "@types/node": "npm:*" checksum: 10c0/0009d3dcdc20cd37f171db77307844a575b89435a3398d1437173a1e5feb13a88e61fed7756f264555743a9510693ae1c9e20c4558c066085fd0bd881abf5497 +======= + version: 5.5.0 + resolution: "@types/papaparse@npm:5.5.0" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/df2db19b602c6d9a049085737fcd3be49e4db528704a25bf4e9a08378053951f7069738b8a3fcb8b1c760ccbc41125f1e358b21db905d6f7e8bcf4062b29df49 +>>>>>>> 557b2ee (Fix yarn) languageName: node linkType: hard @@ -4696,9 +4712,15 @@ __metadata: linkType: hard "immer@npm:^10.1.3": +<<<<<<< HEAD version: 10.1.3 resolution: "immer@npm:10.1.3" checksum: 10c0/b3929022c1999935c9c5e9491fce20d883c15a04072628056f3b8c51a63ac0876d1c1f25cec146e325c30c906bc7f15a636c29ed53156f0a3049150f152df4c8 +======= + version: 10.2.0 + resolution: "immer@npm:10.2.0" + checksum: 10c0/35e66b0585b2aec4e85ae7a993f049405f170799ba89d79205bc3fdae2c5bdaa2b1d35f62803d8beee42b7e85c7f7315a6e93b6a5a510c5a46f03dbe63619e87 +>>>>>>> 557b2ee (Fix yarn) languageName: node linkType: hard @@ -6668,10 +6690,17 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "undici-types@npm:~7.12.0": version: 7.12.0 resolution: "undici-types@npm:7.12.0" checksum: 10c0/326e455bbc0026db1d6b81c76a1cf10c63f7e2f9821db2e24fdc258f482814e5bfa8481f8910d07c68e305937c5c049610fdc441c5e8b7bb0daca7154fb8a306 +======= +"undici-types@npm:~7.16.0": + version: 7.16.0 + resolution: "undici-types@npm:7.16.0" + checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a +>>>>>>> 557b2ee (Fix yarn) languageName: node linkType: hard From cfec8087d95c68c6332733d4079336151ade9dd4 Mon Sep 17 00:00:00 2001 From: LucaDiba Date: Fri, 14 Nov 2025 04:13:32 -0800 Subject: [PATCH 10/12] Fix yarn --- yarn.lock | 3146 +++++++++++++++++++++++++---------------------------- 1 file changed, 1474 insertions(+), 1672 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9959190..1da1197 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,9 +6,9 @@ __metadata: cacheKey: 10c0 "@adobe/css-tools@npm:^4.4.0": - version: 4.4.2 - resolution: "@adobe/css-tools@npm:4.4.2" - checksum: 10c0/19433666ad18536b0ed05d4b53fbb3dd6ede266996796462023ec77a90b484890ad28a3e528cdf3ab8a65cb2fcdff5d8feb04db6bc6eed6ca307c40974239c94 + version: 4.4.4 + resolution: "@adobe/css-tools@npm:4.4.4" + checksum: 10c0/8f3e6cfaa5e6286e6f05de01d91d060425be2ebaef490881f5fe6da8bbdb336835c5d373ea337b0c3b0a1af4be048ba18780f0f6021d30809b4545922a7e13d9 languageName: node linkType: hard @@ -19,7 +19,7 @@ __metadata: languageName: node linkType: hard -"@ampproject/remapping@npm:^2.2.0, @ampproject/remapping@npm:^2.3.0": +"@ampproject/remapping@npm:^2.3.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" dependencies: @@ -29,31 +29,20 @@ __metadata: languageName: node linkType: hard -"@asamuzakjp/css-color@npm:^3.1.1": - version: 3.1.2 - resolution: "@asamuzakjp/css-color@npm:3.1.2" +"@asamuzakjp/css-color@npm:^3.2.0": + version: 3.2.0 + resolution: "@asamuzakjp/css-color@npm:3.2.0" dependencies: - "@csstools/css-calc": "npm:^2.1.2" - "@csstools/css-color-parser": "npm:^3.0.8" + "@csstools/css-calc": "npm:^2.1.3" + "@csstools/css-color-parser": "npm:^3.0.9" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" lru-cache: "npm:^10.4.3" - checksum: 10c0/aa3c0dc03ba630e0e1c9cbb54b650301773faa8613794d236e2132fe38f1329f68eec92d8b2c4f0f8aa19ce554a3c4be9ea874224d1472d9d9cb410cbd43683d - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.26.2": - version: 7.26.2 - resolution: "@babel/code-frame@npm:7.26.2" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 + checksum: 10c0/a4bf1c831751b1fae46b437e37e8a38c0b5bd58d23230157ae210bd1e905fe509b89b7c243e63d1522d852668a6292ed730a160e21342772b4e5b7b8ea14c092 languageName: node linkType: hard -"@babel/code-frame@npm:^7.27.1": +"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.27.1": version: 7.27.1 resolution: "@babel/code-frame@npm:7.27.1" dependencies: @@ -64,102 +53,55 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/compat-data@npm:7.26.8" - checksum: 10c0/66408a0388c3457fff1c2f6c3a061278dd7b3d2f0455ea29bb7b187fa52c60ae8b4054b3c0a184e21e45f0eaac63cf390737bc7504d1f4a088a6e7f652c068ca - languageName: node - linkType: hard - "@babel/compat-data@npm:^7.27.2": - version: 7.28.0 - resolution: "@babel/compat-data@npm:7.28.0" - checksum: 10c0/c4e527302bcd61052423f757355a71c3bc62362bac13f7f130de16e439716f66091ff5bdecda418e8fa0271d4c725f860f0ee23ab7bf6e769f7a8bb16dfcb531 - languageName: node - linkType: hard - -"@babel/core@npm:^7.23.7, @babel/core@npm:^7.26.8": - version: 7.26.10 - resolution: "@babel/core@npm:7.26.10" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.10" - "@babel/helper-compilation-targets": "npm:^7.26.5" - "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.10" - "@babel/parser": "npm:^7.26.10" - "@babel/template": "npm:^7.26.9" - "@babel/traverse": "npm:^7.26.10" - "@babel/types": "npm:^7.26.10" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/e046e0e988ab53841b512ee9d263ca409f6c46e2a999fe53024688b92db394346fa3aeae5ea0866331f62133982eee05a675d22922a4603c3f603aa09a581d62 + version: 7.28.5 + resolution: "@babel/compat-data@npm:7.28.5" + checksum: 10c0/702a25de73087b0eba325c1d10979eed7c9b6662677386ba7b5aa6eace0fc0676f78343bae080a0176ae26f58bd5535d73b9d0fbb547fef377692e8b249353a7 languageName: node linkType: hard -"@babel/core@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/core@npm:7.28.3" +"@babel/core@npm:^7.23.7, @babel/core@npm:^7.27.4, @babel/core@npm:^7.27.7, @babel/core@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/core@npm:7.28.5" dependencies: - "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.28.3" + "@babel/generator": "npm:^7.28.5" "@babel/helper-compilation-targets": "npm:^7.27.2" "@babel/helper-module-transforms": "npm:^7.28.3" - "@babel/helpers": "npm:^7.28.3" - "@babel/parser": "npm:^7.28.3" + "@babel/helpers": "npm:^7.28.4" + "@babel/parser": "npm:^7.28.5" "@babel/template": "npm:^7.27.2" - "@babel/traverse": "npm:^7.28.3" - "@babel/types": "npm:^7.28.2" + "@babel/traverse": "npm:^7.28.5" + "@babel/types": "npm:^7.28.5" + "@jridgewell/remapping": "npm:^2.3.5" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/e6b3eb830c4b93f5a442b305776df1cd2bb4fafa4612355366f67c764f3e54a69d45b84def77fb2d4fd83439102667b0a92c3ea2838f678733245b748c602a7b + checksum: 10c0/535f82238027621da6bdffbdbe896ebad3558b311d6f8abc680637a9859b96edbf929ab010757055381570b29cf66c4a295b5618318d27a4273c0e2033925e72 languageName: node linkType: hard -"@babel/generator@npm:^7.26.10, @babel/generator@npm:^7.26.8, @babel/generator@npm:^7.27.0": - version: 7.27.0 - resolution: "@babel/generator@npm:7.27.0" +"@babel/generator@npm:^7.27.5, @babel/generator@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/generator@npm:7.28.5" dependencies: - "@babel/parser": "npm:^7.27.0" - "@babel/types": "npm:^7.27.0" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^3.0.2" - checksum: 10c0/7cb10693d2b365c278f109a745dc08856cae139d262748b77b70ce1d97da84627f79648cab6940d847392c0e5d180441669ed958b3aee98d9c7d274b37c553bd - languageName: node - linkType: hard - -"@babel/generator@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/generator@npm:7.28.3" - dependencies: - "@babel/parser": "npm:^7.28.3" - "@babel/types": "npm:^7.28.2" + "@babel/parser": "npm:^7.28.5" + "@babel/types": "npm:^7.28.5" "@jridgewell/gen-mapping": "npm:^0.3.12" "@jridgewell/trace-mapping": "npm:^0.3.28" jsesc: "npm:^3.0.2" - checksum: 10c0/0ff58bcf04f8803dcc29479b547b43b9b0b828ec1ee0668e92d79f9e90f388c28589056637c5ff2fd7bcf8d153c990d29c448d449d852bf9d1bc64753ca462bc + checksum: 10c0/9f219fe1d5431b6919f1a5c60db8d5d34fe546c0d8f5a8511b32f847569234ffc8032beb9e7404649a143f54e15224ecb53a3d11b6bb85c3203e573d91fca752 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.26.5": - version: 7.27.0 - resolution: "@babel/helper-compilation-targets@npm:7.27.0" +"@babel/helper-annotate-as-pure@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" dependencies: - "@babel/compat-data": "npm:^7.26.8" - "@babel/helper-validator-option": "npm:^7.25.9" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/375c9f80e6540118f41bd53dd54d670b8bf91235d631bdead44c8b313b26e9cd89aed5c6df770ad13a87a464497b5346bb72b9462ba690473da422f5402618b6 + "@babel/types": "npm:^7.27.3" + checksum: 10c0/94996ce0a05b7229f956033e6dcd69393db2b0886d0db6aff41e704390402b8cdcca11f61449cb4f86cfd9e61b5ad3a73e4fa661eeed7846b125bd1c33dbc633 languageName: node linkType: hard @@ -176,6 +118,23 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-create-class-features-plugin@npm:7.28.5" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-member-expression-to-functions": "npm:^7.28.5" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.5" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/786a6514efcf4514aaad85beed419b9184d059f4c9a9a95108f320142764999827252a851f7071de19f29424d369616573ecbaa347f1ce23fb12fc6827d9ff56 + languageName: node + linkType: hard + "@babel/helper-globals@npm:^7.28.0": version: 7.28.0 resolution: "@babel/helper-globals@npm:7.28.0" @@ -183,13 +142,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-module-imports@npm:7.25.9" +"@babel/helper-member-expression-to-functions@npm:^7.27.1, @babel/helper-member-expression-to-functions@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-member-expression-to-functions@npm:7.28.5" dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 + "@babel/traverse": "npm:^7.28.5" + "@babel/types": "npm:^7.28.5" + checksum: 10c0/4e6e05fbf4dffd0bc3e55e28fcaab008850be6de5a7013994ce874ec2beb90619cda4744b11607a60f8aae0227694502908add6188ceb1b5223596e765b44814 languageName: node linkType: hard @@ -203,20 +162,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helper-module-transforms@npm:7.26.0" - dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.28.3": +"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.3": version: 7.28.3 resolution: "@babel/helper-module-transforms@npm:7.28.3" dependencies: @@ -229,10 +175,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.25.9": - version: 7.26.5 - resolution: "@babel/helper-plugin-utils@npm:7.26.5" - checksum: 10c0/cdaba71d4b891aa6a8dfbe5bac2f94effb13e5fa4c2c487667fdbaa04eae059b78b28d85a885071f45f7205aeb56d16759e1bed9c118b94b16e4720ef1ab0f65 +"@babel/helper-optimise-call-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" + dependencies: + "@babel/types": "npm:^7.27.1" + checksum: 10c0/6b861e7fcf6031b9c9fc2de3cd6c005e94a459d6caf3621d93346b52774925800ca29d4f64595a5ceacf4d161eb0d27649ae385110ed69491d9776686fa488e6 languageName: node linkType: hard @@ -243,38 +191,40 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-string-parser@npm:7.25.9" - checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.27.1": +"@babel/helper-replace-supers@npm:^7.27.1": version: 7.27.1 - resolution: "@babel/helper-string-parser@npm:7.27.1" - checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 + resolution: "@babel/helper-replace-supers@npm:7.27.1" + dependencies: + "@babel/helper-member-expression-to-functions": "npm:^7.27.1" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/4f2eaaf5fcc196580221a7ccd0f8873447b5d52745ad4096418f6101a1d2e712e9f93722c9a32bc9769a1dc197e001f60d6f5438d4dfde4b9c6a9e4df719354c languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-identifier@npm:7.25.9" - checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" + dependencies: + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10c0/f625013bcdea422c470223a2614e90d2c1cc9d832e97f32ca1b4f82b34bb4aa67c3904cb4b116375d3b5b753acfb3951ed50835a1e832e7225295c7b0c24dff7 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.27.1": +"@babel/helper-string-parser@npm:^7.27.1": version: 7.27.1 - resolution: "@babel/helper-validator-identifier@npm:7.27.1" - checksum: 10c0/c558f11c4871d526498e49d07a84752d1800bf72ac0d3dad100309a2eaba24efbf56ea59af5137ff15e3a00280ebe588560534b0e894a4750f8b1411d8f78b84 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-option@npm:7.25.9" - checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e +"@babel/helper-validator-identifier@npm:^7.27.1, @babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 languageName: node linkType: hard @@ -285,67 +235,58 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.26.10": - version: 7.27.0 - resolution: "@babel/helpers@npm:7.27.0" - dependencies: - "@babel/template": "npm:^7.27.0" - "@babel/types": "npm:^7.27.0" - checksum: 10c0/a3c64fd2d8b164c041808826cc00769d814074ea447daaacaf2e3714b66d3f4237ef6e420f61d08f463d6608f3468c2ac5124ab7c68f704e20384def5ade95f4 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/helpers@npm:7.28.3" +"@babel/helpers@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/helpers@npm:7.28.4" dependencies: "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.28.2" - checksum: 10c0/03a8f94135415eec62d37be9c62c63908f2d5386c7b00e04545de4961996465775330e3eb57717ea7451e19b0e24615777ebfec408c2adb1df3b10b4df6bf1ce + "@babel/types": "npm:^7.28.4" + checksum: 10c0/aaa5fb8098926dfed5f223adf2c5e4c7fbba4b911b73dfec2d7d3083f8ba694d201a206db673da2d9b3ae8c01793e795767654558c450c8c14b4c2175b4fcb44 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.26.8, @babel/parser@npm:^7.27.0": - version: 7.27.0 - resolution: "@babel/parser@npm:7.27.0" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.5, @babel/parser@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/parser@npm:7.28.5" dependencies: - "@babel/types": "npm:^7.27.0" + "@babel/types": "npm:^7.28.5" bin: parser: ./bin/babel-parser.js - checksum: 10c0/ba2ed3f41735826546a3ef2a7634a8d10351df221891906e59b29b0a0cd748f9b0e7a6f07576858a9de8e77785aad925c8389ddef146de04ea2842047c9d2859 + checksum: 10c0/5bbe48bf2c79594ac02b490a41ffde7ef5aa22a9a88ad6bcc78432a6ba8a9d638d531d868bd1f104633f1f6bba9905746e15185b8276a3756c42b765d131b1ef languageName: node linkType: hard -"@babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/parser@npm:7.28.3" +"@babel/plugin-syntax-jsx@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" dependencies: - "@babel/types": "npm:^7.28.2" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/1f41eb82623b0ca0f94521b57f4790c6c457cd922b8e2597985b36bdec24114a9ccf54640286a760ceb60f11fe9102d192bf60477aee77f5d45f1029b9b72729 + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/bc5afe6a458d5f0492c02a54ad98c5756a0c13bd6d20609aae65acd560a9e141b0876da5f358dce34ea136f271c1016df58b461184d7ae9c4321e0f98588bc84 languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" +"@babel/plugin-syntax-typescript@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-typescript@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c + checksum: 10c0/11589b4c89c66ef02d57bf56c6246267851ec0c361f58929327dc3e070b0dab644be625bbe7fb4c4df30c3634bfdfe31244e1f517be397d2def1487dbbe3c37d languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" +"@babel/plugin-transform-modules-commonjs@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5192ebe11bd46aea68b7a60fd9555465c59af7e279e71126788e59121b86e00b505816685ab4782abe159232b0f73854e804b54449820b0d950b397ee158caa2 + checksum: 10c0/4def972dcd23375a266ea1189115a4ff61744b2c9366fc1de648b3fab2c650faf1a94092de93a33ff18858d2e6c4dddeeee5384cb42ba0129baeab01a5cdf1e2 languageName: node linkType: hard @@ -371,23 +312,40 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": - version: 7.27.0 - resolution: "@babel/runtime@npm:7.27.0" +"@babel/plugin-transform-typescript@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-typescript@npm:7.28.5" dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/35091ea9de48bd7fd26fb177693d64f4d195eb58ab2b142b893b7f3fa0f1d7c677604d36499ae0621a3703f35ba0c6a8f6c572cc8f7dc0317213841e493cf663 + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-create-class-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-syntax-typescript": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/09e574ba5462e56452b4ceecae65e53c8e697a2d3559ce5d210bed10ac28a18aa69377e7550c30520eb29b40c417ee61997d5d58112657f22983244b78915a7c languageName: node linkType: hard -"@babel/template@npm:^7.26.8, @babel/template@npm:^7.26.9, @babel/template@npm:^7.27.0": - version: 7.27.0 - resolution: "@babel/template@npm:7.27.0" +"@babel/preset-typescript@npm:^7.27.1": + version: 7.28.5 + resolution: "@babel/preset-typescript@npm:7.28.5" dependencies: - "@babel/code-frame": "npm:^7.26.2" - "@babel/parser": "npm:^7.27.0" - "@babel/types": "npm:^7.27.0" - checksum: 10c0/13af543756127edb5f62bf121f9b093c09a2b6fe108373887ccffc701465cfbcb17e07cf48aa7f440415b263f6ec006e9415c79dfc2e8e6010b069435f81f340 + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-syntax-jsx": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" + "@babel/plugin-transform-typescript": "npm:^7.28.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b3d55548854c105085dd80f638147aa8295bc186d70492289242d6c857cb03a6c61ec15186440ea10ed4a71cdde7d495f5eb3feda46273f36b0ac926e8409629 + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": + version: 7.28.4 + resolution: "@babel/runtime@npm:7.28.4" + checksum: 10c0/792ce7af9750fb9b93879cc9d1db175701c4689da890e6ced242ea0207c9da411ccf16dc04e689cc01158b28d7898c40d75598f4559109f761c12ce01e959bf7 languageName: node linkType: hard @@ -402,53 +360,28 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.7, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.26.8": - version: 7.27.0 - resolution: "@babel/traverse@npm:7.27.0" - dependencies: - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.27.0" - "@babel/parser": "npm:^7.27.0" - "@babel/template": "npm:^7.27.0" - "@babel/types": "npm:^7.27.0" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/c7af29781960dacaae51762e8bc6c4b13d6ab4b17312990fbca9fc38e19c4ad7fecaae24b1cf52fb844e8e6cdc76c70ad597f90e496bcb3cc0a1d66b41a0aa5b - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/traverse@npm:7.28.3" +"@babel/traverse@npm:^7.23.7, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.7, @babel/traverse@npm:^7.28.3, @babel/traverse@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/traverse@npm:7.28.5" dependencies: "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.28.3" + "@babel/generator": "npm:^7.28.5" "@babel/helper-globals": "npm:^7.28.0" - "@babel/parser": "npm:^7.28.3" + "@babel/parser": "npm:^7.28.5" "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.28.2" + "@babel/types": "npm:^7.28.5" debug: "npm:^4.3.1" - checksum: 10c0/26e95b29a46925b7b41255e03185b7e65b2c4987e14bbee7bbf95867fb19c69181f301bbe1c7b201d4fe0cce6aa0cbea0282dad74b3a0fef3d9058f6c76fdcb3 - languageName: node - linkType: hard - -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.6, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.8, @babel/types@npm:^7.27.0": - version: 7.27.0 - resolution: "@babel/types@npm:7.27.0" - dependencies: - "@babel/helper-string-parser": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10c0/6f1592eabe243c89a608717b07b72969be9d9d2fce1dee21426238757ea1fa60fdfc09b29de9e48d8104311afc6e6fb1702565a9cc1e09bc1e76f2b2ddb0f6e1 + checksum: 10c0/f6c4a595993ae2b73f2d4cd9c062f2e232174d293edd4abe1d715bd6281da8d99e47c65857e8d0917d9384c65972f4acdebc6749a7c40a8fcc38b3c7fb3e706f languageName: node linkType: hard -"@babel/types@npm:^7.27.1, @babel/types@npm:^7.28.2": - version: 7.28.2 - resolution: "@babel/types@npm:7.28.2" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.6, @babel/types@npm:^7.25.4, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.7, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.4, @babel/types@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/types@npm:7.28.5" dependencies: "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.27.1" - checksum: 10c0/24b11c9368e7e2c291fe3c1bcd1ed66f6593a3975f479cbb9dd7b8c8d8eab8a962b0d2fca616c043396ce82500ac7d23d594fbbbd013828182c01596370a0b10 + "@babel/helper-validator-identifier": "npm:^7.28.5" + checksum: 10c0/a5a483d2100befbf125793640dec26b90b95fd233a94c19573325898a5ce1e52cdfa96e495c7dcc31b5eca5b66ce3e6d4a0f5a4a62daec271455959f208ab08a languageName: node linkType: hard @@ -459,100 +392,72 @@ __metadata: languageName: node linkType: hard -"@bundled-es-modules/cookie@npm:^2.0.1": - version: 2.0.1 - resolution: "@bundled-es-modules/cookie@npm:2.0.1" - dependencies: - cookie: "npm:^0.7.2" - checksum: 10c0/dfac5e36127e827c5557b8577f17a8aa94c057baff6d38555917927b99da0ecf0b1357e7fedadc8853ecdbd4a8a7fa1f5e64111b2a656612f4a36376f5bdbe8d - languageName: node - linkType: hard - -"@bundled-es-modules/statuses@npm:^1.0.1": - version: 1.0.1 - resolution: "@bundled-es-modules/statuses@npm:1.0.1" - dependencies: - statuses: "npm:^2.0.1" - checksum: 10c0/c1a8ede3efa8da61ccda4b98e773582a9733edfbeeee569d4630785f8e018766202edb190a754a3ec7a7f6bd738e857829affc2fdb676b6dab4db1bb44e62785 - languageName: node - linkType: hard - -"@bundled-es-modules/tough-cookie@npm:^0.1.6": - version: 0.1.6 - resolution: "@bundled-es-modules/tough-cookie@npm:0.1.6" - dependencies: - "@types/tough-cookie": "npm:^4.0.5" - tough-cookie: "npm:^4.1.4" - checksum: 10c0/28bcac878bff6b34719ba3aa8341e9924772ee55de5487680ebe784981ec9fccb70ed5d46f563e2404855a04de606f9e56aa4202842d4f5835bc04a4fe820571 - languageName: node - linkType: hard - -"@csstools/color-helpers@npm:^5.0.2": - version: 5.0.2 - resolution: "@csstools/color-helpers@npm:5.0.2" - checksum: 10c0/bebaddb28b9eb58b0449edd5d0c0318fa88f3cb079602ee27e88c9118070d666dcc4e09a5aa936aba2fde6ba419922ade07b7b506af97dd7051abd08dfb2959b +"@csstools/color-helpers@npm:^5.1.0": + version: 5.1.0 + resolution: "@csstools/color-helpers@npm:5.1.0" + checksum: 10c0/b7f99d2e455cf1c9b41a67a5327d5d02888cd5c8802a68b1887dffef537d9d4bc66b3c10c1e62b40bbed638b6c1d60b85a232f904ed7b39809c4029cb36567db languageName: node linkType: hard -"@csstools/css-calc@npm:^2.1.2": - version: 2.1.2 - resolution: "@csstools/css-calc@npm:2.1.2" +"@csstools/css-calc@npm:^2.1.3, @csstools/css-calc@npm:^2.1.4": + version: 2.1.4 + resolution: "@csstools/css-calc@npm:2.1.4" peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.4 - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/34ced30553968ef5d5f9e00e3b90b48c47480cf130e282e99d57ec9b09f803aab8bc06325683e72a1518b5e7180a3da8b533f1b462062757c21989a53b482e1a + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/42ce5793e55ec4d772083808a11e9fb2dfe36db3ec168713069a276b4c3882205b3507c4680224c28a5d35fe0bc2d308c77f8f2c39c7c09aad8747708eb8ddd8 languageName: node linkType: hard -"@csstools/css-color-parser@npm:^3.0.8": - version: 3.0.8 - resolution: "@csstools/css-color-parser@npm:3.0.8" +"@csstools/css-color-parser@npm:^3.0.9": + version: 3.1.0 + resolution: "@csstools/css-color-parser@npm:3.1.0" dependencies: - "@csstools/color-helpers": "npm:^5.0.2" - "@csstools/css-calc": "npm:^2.1.2" + "@csstools/color-helpers": "npm:^5.1.0" + "@csstools/css-calc": "npm:^2.1.4" peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.4 - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/90722c5a62ca94e9d578ddf59be604a76400b932bd3d4bd23cb1ae9b7ace8fcf83c06995d2b31f96f4afef24a7cefba79beb11ed7ee4999d7ecfec3869368359 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/0e0c670ad54ec8ec4d9b07568b80defd83b9482191f5e8ca84ab546b7be6db5d7cc2ba7ac9fae54488b129a4be235d6183d3aab4416fec5e89351f73af4222c5 languageName: node linkType: hard "@csstools/css-parser-algorithms@npm:^3.0.4": - version: 3.0.4 - resolution: "@csstools/css-parser-algorithms@npm:3.0.4" + version: 3.0.5 + resolution: "@csstools/css-parser-algorithms@npm:3.0.5" peerDependencies: - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/d411f07765e14eede17bccc6bd4f90ff303694df09aabfede3fd104b2dfacfd4fe3697cd25ddad14684c850328f3f9420ebfa9f78380892492974db24ae47dbd + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/d9a1c888bd43849ae3437ca39251d5c95d2c8fd6b5ccdb7c45491dfd2c1cbdc3075645e80901d120e4d2c1993db9a5b2d83793b779dbbabcfb132adb142eb7f7 languageName: node linkType: hard "@csstools/css-tokenizer@npm:^3.0.3": - version: 3.0.3 - resolution: "@csstools/css-tokenizer@npm:3.0.3" - checksum: 10c0/c31bf410e1244b942e71798e37c54639d040cb59e0121b21712b40015fced2b0fb1ffe588434c5f8923c9cd0017cfc1c1c8f3921abc94c96edf471aac2eba5e5 + version: 3.0.4 + resolution: "@csstools/css-tokenizer@npm:3.0.4" + checksum: 10c0/3b589f8e9942075a642213b389bab75a2d50d05d203727fcdac6827648a5572674caff07907eff3f9a2389d86a4ee47308fafe4f8588f4a77b7167c588d2559f languageName: node linkType: hard -"@emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.4.5": - version: 1.5.0 - resolution: "@emnapi/core@npm:1.5.0" +"@emnapi/core@npm:^1.5.0, @emnapi/core@npm:^1.6.0": + version: 1.7.1 + resolution: "@emnapi/core@npm:1.7.1" dependencies: "@emnapi/wasi-threads": "npm:1.1.0" tslib: "npm:^2.4.0" - checksum: 10c0/52ba3485277706d92fa27d92b37e5b4f6ef0742c03ed68f8096f294c6bfa30f0752c82d4c2bfa14bff4dc30d63c9f71a8f9fb64a92743d00807d9e468fafd5ff + checksum: 10c0/f3740be23440b439333e3ae3832163f60c96c4e35337f3220ceba88f36ee89a57a871d27c94eb7a9ff98a09911ed9a2089e477ab549f4d30029f8b907f84a351 languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.4.5": - version: 1.5.0 - resolution: "@emnapi/runtime@npm:1.5.0" +"@emnapi/runtime@npm:^1.5.0, @emnapi/runtime@npm:^1.6.0": + version: 1.7.1 + resolution: "@emnapi/runtime@npm:1.7.1" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/a85c9fc4e3af49cbe41e5437e5be2551392a931910cd0a5b5d3572532786927810c9cc1db11b232ec8f9657b33d4e6f7c4f985f1a052917d7cd703b5b2a20faa + checksum: 10c0/26b851cd3e93877d8732a985a2ebf5152325bbacc6204ef5336a47359dedcc23faeb08cdfcb8bb389b5401b3e894b882bc1a1e55b4b7c1ed1e67c991a760ddd5 languageName: node linkType: hard -"@emnapi/wasi-threads@npm:1.1.0, @emnapi/wasi-threads@npm:^1.0.4": +"@emnapi/wasi-threads@npm:1.1.0, @emnapi/wasi-threads@npm:^1.1.0": version: 1.1.0 resolution: "@emnapi/wasi-threads@npm:1.1.0" dependencies: @@ -561,246 +466,246 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/aix-ppc64@npm:0.25.2" +"@esbuild/aix-ppc64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/aix-ppc64@npm:0.25.12" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/android-arm64@npm:0.25.2" +"@esbuild/android-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/android-arm64@npm:0.25.12" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/android-arm@npm:0.25.2" +"@esbuild/android-arm@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/android-arm@npm:0.25.12" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/android-x64@npm:0.25.2" +"@esbuild/android-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/android-x64@npm:0.25.12" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/darwin-arm64@npm:0.25.2" +"@esbuild/darwin-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/darwin-arm64@npm:0.25.12" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/darwin-x64@npm:0.25.2" +"@esbuild/darwin-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/darwin-x64@npm:0.25.12" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/freebsd-arm64@npm:0.25.2" +"@esbuild/freebsd-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/freebsd-arm64@npm:0.25.12" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/freebsd-x64@npm:0.25.2" +"@esbuild/freebsd-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/freebsd-x64@npm:0.25.12" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/linux-arm64@npm:0.25.2" +"@esbuild/linux-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-arm64@npm:0.25.12" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/linux-arm@npm:0.25.2" +"@esbuild/linux-arm@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-arm@npm:0.25.12" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/linux-ia32@npm:0.25.2" +"@esbuild/linux-ia32@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-ia32@npm:0.25.12" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/linux-loong64@npm:0.25.2" +"@esbuild/linux-loong64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-loong64@npm:0.25.12" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/linux-mips64el@npm:0.25.2" +"@esbuild/linux-mips64el@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-mips64el@npm:0.25.12" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/linux-ppc64@npm:0.25.2" +"@esbuild/linux-ppc64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-ppc64@npm:0.25.12" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/linux-riscv64@npm:0.25.2" +"@esbuild/linux-riscv64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-riscv64@npm:0.25.12" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/linux-s390x@npm:0.25.2" +"@esbuild/linux-s390x@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-s390x@npm:0.25.12" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/linux-x64@npm:0.25.2" +"@esbuild/linux-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-x64@npm:0.25.12" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/netbsd-arm64@npm:0.25.2" +"@esbuild/netbsd-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/netbsd-arm64@npm:0.25.12" conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/netbsd-x64@npm:0.25.2" +"@esbuild/netbsd-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/netbsd-x64@npm:0.25.12" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/openbsd-arm64@npm:0.25.2" +"@esbuild/openbsd-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/openbsd-arm64@npm:0.25.12" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/openbsd-x64@npm:0.25.2" +"@esbuild/openbsd-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/openbsd-x64@npm:0.25.12" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/sunos-x64@npm:0.25.2" +"@esbuild/openharmony-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/openharmony-arm64@npm:0.25.12" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/sunos-x64@npm:0.25.12" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/win32-arm64@npm:0.25.2" +"@esbuild/win32-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/win32-arm64@npm:0.25.12" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/win32-ia32@npm:0.25.2" +"@esbuild/win32-ia32@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/win32-ia32@npm:0.25.12" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.25.2": - version: 0.25.2 - resolution: "@esbuild/win32-x64@npm:0.25.2" +"@esbuild/win32-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/win32-x64@npm:0.25.12" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.6.0 - resolution: "@eslint-community/eslint-utils@npm:4.6.0" - dependencies: - eslint-visitor-keys: "npm:^3.4.3" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/a64131c1b43021e3a84267f6011fd678a936718097c9be169c37a40ada2c7016bec7d6685ecc88112737d57733f36837bb90d9425ad48d2e2aa351d999d32443 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.7.0": - version: 4.7.0 - resolution: "@eslint-community/eslint-utils@npm:4.7.0" +"@eslint-community/eslint-utils@npm:^4.7.0, @eslint-community/eslint-utils@npm:^4.8.0": + version: 4.9.0 + resolution: "@eslint-community/eslint-utils@npm:4.9.0" dependencies: eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/c0f4f2bd73b7b7a9de74b716a664873d08ab71ab439e51befe77d61915af41a81ecec93b408778b3a7856185244c34c2c8ee28912072ec14def84ba2dec70adf + checksum: 10c0/8881e22d519326e7dba85ea915ac7a143367c805e6ba1374c987aa2fbdd09195cc51183d2da72c0e2ff388f84363e1b220fd0d19bef10c272c63455162176817 languageName: node linkType: hard "@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": - version: 4.12.1 - resolution: "@eslint-community/regexpp@npm:4.12.1" - checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + version: 4.12.2 + resolution: "@eslint-community/regexpp@npm:4.12.2" + checksum: 10c0/fddcbc66851b308478d04e302a4d771d6917a0b3740dc351513c0da9ca2eab8a1adf99f5e0aa7ab8b13fa0df005c81adeee7e63a92f3effd7d367a163b721c2d languageName: node linkType: hard "@eslint/compat@npm:^1.3.2": - version: 1.3.2 - resolution: "@eslint/compat@npm:1.3.2" + version: 1.4.1 + resolution: "@eslint/compat@npm:1.4.1" + dependencies: + "@eslint/core": "npm:^0.17.0" peerDependencies: eslint: ^8.40 || 9 peerDependenciesMeta: eslint: optional: true - checksum: 10c0/9b95b49ee74c50adf8f0e45066b471bc76842c43d4721727ff93d186745bdd1679d18420c992a05eab3bb41762672cd3faa5c56c99325dbb97200f7533cbd2bf + checksum: 10c0/46f5ff884873c2e2366df55dd7b2d6b12f7f852bfba8e2a48dae4819cc5e58756deefa9b7f87f1b107af725ee883a05fcc02caf969b58fb142e790c6036a0450 languageName: node linkType: hard -"@eslint/config-array@npm:^0.21.0": - version: 0.21.0 - resolution: "@eslint/config-array@npm:0.21.0" +"@eslint/config-array@npm:^0.21.1": + version: 0.21.1 + resolution: "@eslint/config-array@npm:0.21.1" dependencies: - "@eslint/object-schema": "npm:^2.1.6" + "@eslint/object-schema": "npm:^2.1.7" debug: "npm:^4.3.1" minimatch: "npm:^3.1.2" - checksum: 10c0/0ea801139166c4aa56465b309af512ef9b2d3c68f9198751bbc3e21894fe70f25fbf26e1b0e9fffff41857bc21bfddeee58649ae6d79aadcd747db0c5dca771f + checksum: 10c0/2f657d4edd6ddcb920579b72e7a5b127865d4c3fb4dda24f11d5c4f445a93ca481aebdbd6bf3291c536f5d034458dbcbb298ee3b698bc6c9dd02900fe87eec3c languageName: node linkType: hard -"@eslint/config-helpers@npm:^0.3.1": - version: 0.3.1 - resolution: "@eslint/config-helpers@npm:0.3.1" - checksum: 10c0/f6c5b3a0b76a0d7d84cc93e310c259e6c3e0792ddd0a62c5fc0027796ffae44183432cb74b2c2b1162801ee1b1b34a6beb5d90a151632b4df7349f994146a856 +"@eslint/config-helpers@npm:^0.4.2": + version: 0.4.2 + resolution: "@eslint/config-helpers@npm:0.4.2" + dependencies: + "@eslint/core": "npm:^0.17.0" + checksum: 10c0/92efd7a527b2d17eb1a148409d71d80f9ac160b565ac73ee092252e8bf08ecd08670699f46b306b94f13d22e88ac88a612120e7847570dd7cdc72f234d50dcb4 languageName: node linkType: hard -"@eslint/core@npm:^0.15.2": - version: 0.15.2 - resolution: "@eslint/core@npm:0.15.2" +"@eslint/core@npm:^0.17.0": + version: 0.17.0 + resolution: "@eslint/core@npm:0.17.0" dependencies: "@types/json-schema": "npm:^7.0.15" - checksum: 10c0/c17a6dc4f5a6006ecb60165cc38bcd21fefb4a10c7a2578a0cfe5813bbd442531a87ed741da5adab5eb678e8e693fda2e2b14555b035355537e32bcec367ea17 + checksum: 10c0/9a580f2246633bc752298e7440dd942ec421860d1946d0801f0423830e67887e4aeba10ab9a23d281727a978eb93d053d1922a587d502942a713607f40ed704e languageName: node linkType: hard @@ -821,65 +726,65 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.34.0, @eslint/js@npm:^9.34.0": - version: 9.34.0 - resolution: "@eslint/js@npm:9.34.0" - checksum: 10c0/53f1bfd2a374683d9382a6850354555f6e89a88416c34a5d34e9fbbaf717e97c2b06300e8f93e5eddba8bda8951ccab7f93a680e56ded1a3d21d526019e69bab +"@eslint/js@npm:9.39.1, @eslint/js@npm:^9.34.0": + version: 9.39.1 + resolution: "@eslint/js@npm:9.39.1" + checksum: 10c0/6f7f26f8cdb7ad6327bbf9741973b6278eb946f18f70e35406e88194b0d5c522d0547a34a02f2a208eec95c5d1388cdf7ccb20039efd2e4cb6655615247a50f1 languageName: node linkType: hard -"@eslint/object-schema@npm:^2.1.6": - version: 2.1.6 - resolution: "@eslint/object-schema@npm:2.1.6" - checksum: 10c0/b8cdb7edea5bc5f6a96173f8d768d3554a628327af536da2fc6967a93b040f2557114d98dbcdbf389d5a7b290985ad6a9ce5babc547f36fc1fde42e674d11a56 +"@eslint/object-schema@npm:^2.1.7": + version: 2.1.7 + resolution: "@eslint/object-schema@npm:2.1.7" + checksum: 10c0/936b6e499853d1335803f556d526c86f5fe2259ed241bc665000e1d6353828edd913feed43120d150adb75570cae162cf000b5b0dfc9596726761c36b82f4e87 languageName: node linkType: hard -"@eslint/plugin-kit@npm:^0.3.5": - version: 0.3.5 - resolution: "@eslint/plugin-kit@npm:0.3.5" +"@eslint/plugin-kit@npm:^0.4.1": + version: 0.4.1 + resolution: "@eslint/plugin-kit@npm:0.4.1" dependencies: - "@eslint/core": "npm:^0.15.2" + "@eslint/core": "npm:^0.17.0" levn: "npm:^0.4.1" - checksum: 10c0/c178c1b58c574200c0fd125af3e4bc775daba7ce434ba6d1eeaf9bcb64b2e9fea75efabffb3ed3ab28858e55a016a5efa95f509994ee4341b341199ca630b89e + checksum: 10c0/51600f78b798f172a9915dffb295e2ffb44840d583427bc732baf12ecb963eb841b253300e657da91d890f4b323d10a1bd12934bf293e3018d8bb66fdce5217b languageName: node linkType: hard -"@floating-ui/core@npm:^1.6.0": - version: 1.6.9 - resolution: "@floating-ui/core@npm:1.6.9" +"@floating-ui/core@npm:^1.7.3": + version: 1.7.3 + resolution: "@floating-ui/core@npm:1.7.3" dependencies: - "@floating-ui/utils": "npm:^0.2.9" - checksum: 10c0/77debdfc26bc36c6f5ae1f26ab3c15468215738b3f5682af4e1915602fa21ba33ad210273f31c9d2da1c531409929e1afb1138b1608c6b54a0f5853ee84c340d + "@floating-ui/utils": "npm:^0.2.10" + checksum: 10c0/edfc23800122d81df0df0fb780b7328ae6c5f00efbb55bd48ea340f4af8c5b3b121ceb4bb81220966ab0f87b443204d37105abdd93d94846468be3243984144c languageName: node linkType: hard -"@floating-ui/dom@npm:^1.0.0": - version: 1.6.13 - resolution: "@floating-ui/dom@npm:1.6.13" +"@floating-ui/dom@npm:^1.7.4": + version: 1.7.4 + resolution: "@floating-ui/dom@npm:1.7.4" dependencies: - "@floating-ui/core": "npm:^1.6.0" - "@floating-ui/utils": "npm:^0.2.9" - checksum: 10c0/272242d2eb6238ffcee0cb1f3c66e0eafae804d5d7b449db5ecf904bc37d31ad96cf575a9e650b93c1190f64f49a684b1559d10e05ed3ec210628b19116991a9 + "@floating-ui/core": "npm:^1.7.3" + "@floating-ui/utils": "npm:^0.2.10" + checksum: 10c0/da6166c25f9b0729caa9f498685a73a0e28251613b35d27db8de8014bc9d045158a23c092b405321a3d67c2064909b6e2a7e6c1c9cc0f62967dca5779f5aef30 languageName: node linkType: hard "@floating-ui/react-dom@npm:^2.0.0": - version: 2.1.2 - resolution: "@floating-ui/react-dom@npm:2.1.2" + version: 2.1.6 + resolution: "@floating-ui/react-dom@npm:2.1.6" dependencies: - "@floating-ui/dom": "npm:^1.0.0" + "@floating-ui/dom": "npm:^1.7.4" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10c0/e855131c74e68cab505f7f44f92cd4e2efab1c125796db3116c54c0859323adae4bf697bf292ee83ac77b9335a41ad67852193d7aeace90aa2e1c4a640cafa60 + checksum: 10c0/6654834a8e73ecbdbc6cad2ad8f7abc698ac7c1800ded4d61113525c591c03d2e3b59d3cf9205859221465ea38c87af4f9e6e204703c5b7a7e85332d1eef2e18 languageName: node linkType: hard -"@floating-ui/utils@npm:^0.2.9": - version: 0.2.9 - resolution: "@floating-ui/utils@npm:0.2.9" - checksum: 10c0/48bbed10f91cb7863a796cc0d0e917c78d11aeb89f98d03fc38d79e7eb792224a79f538ed8a2d5d5584511d4ca6354ef35f1712659fd569868e342df4398ad6f +"@floating-ui/utils@npm:^0.2.10": + version: 0.2.10 + resolution: "@floating-ui/utils@npm:0.2.10" + checksum: 10c0/e9bc2a1730ede1ee25843937e911ab6e846a733a4488623cd353f94721b05ec2c9ec6437613a2ac9379a94c2fd40c797a2ba6fa1df2716f5ce4aa6ddb1cf9ea4 languageName: node linkType: hard @@ -891,13 +796,13 @@ __metadata: linkType: hard "@hookform/resolvers@npm:^5.2.1": - version: 5.2.1 - resolution: "@hookform/resolvers@npm:5.2.1" + version: 5.2.2 + resolution: "@hookform/resolvers@npm:5.2.2" dependencies: "@standard-schema/utils": "npm:^0.3.0" peerDependencies: react-hook-form: ^7.55.0 - checksum: 10c0/e8e48abc188b5139bc444e4495e2fb1680c6aafa31d79c5d7fa4d7d690b0fc2bac1dfbd99213cbc0c6c53c5c3c4e8c4dc28278dd87a3fa0176540795a6f2edde + checksum: 10c0/0692cd61dcc2a70cbb27b88a37f733c39e97f555c036ba04a81bd42b0467461cfb6bafacb46c16f173672f9c8a216bd7928a2330d4e49c700d130622bf1defaf languageName: node linkType: hard @@ -909,12 +814,12 @@ __metadata: linkType: hard "@humanfs/node@npm:^0.16.6": - version: 0.16.6 - resolution: "@humanfs/node@npm:0.16.6" + version: 0.16.7 + resolution: "@humanfs/node@npm:0.16.7" dependencies: "@humanfs/core": "npm:^0.19.1" - "@humanwhocodes/retry": "npm:^0.3.0" - checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 + "@humanwhocodes/retry": "npm:^0.4.0" + checksum: 10c0/9f83d3cf2cfa37383e01e3cdaead11cd426208e04c44adcdd291aa983aaf72d7d3598844d2fe9ce54896bb1bf8bd4b56883376611c8905a19c44684642823f30 languageName: node linkType: hard @@ -925,72 +830,88 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/retry@npm:^0.3.0": - version: 0.3.1 - resolution: "@humanwhocodes/retry@npm:0.3.1" - checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b - languageName: node - linkType: hard - -"@humanwhocodes/retry@npm:^0.4.2": +"@humanwhocodes/retry@npm:^0.4.0, @humanwhocodes/retry@npm:^0.4.2": version: 0.4.3 resolution: "@humanwhocodes/retry@npm:0.4.3" checksum: 10c0/3775bb30087d4440b3f7406d5a057777d90e4b9f435af488a4923ef249e93615fb78565a85f173a186a076c7706a81d0d57d563a2624e4de2c5c9c66c486ce42 languageName: node linkType: hard +"@inquirer/ansi@npm:^1.0.2": + version: 1.0.2 + resolution: "@inquirer/ansi@npm:1.0.2" + checksum: 10c0/8e408cc628923aa93402e66657482ccaa2ad5174f9db526d9a8b443f9011e9cd8f70f0f534f5fe3857b8a9df3bce1e25f66c96f666d6750490bd46e2b4f3b829 + languageName: node + linkType: hard + "@inquirer/confirm@npm:^5.0.0": - version: 5.1.9 - resolution: "@inquirer/confirm@npm:5.1.9" + version: 5.1.21 + resolution: "@inquirer/confirm@npm:5.1.21" dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/type": "npm:^3.0.6" + "@inquirer/core": "npm:^10.3.2" + "@inquirer/type": "npm:^3.0.10" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/e35c134303f8151074479d6704c048676b2684debfde18a46ff0fb7585a3ee31dea551899ddcb48169fbef5dfe64c1948d2d8ac17a6939bedd31bb54c39bbea4 + checksum: 10c0/a95bbdbb17626c484735a4193ed6b6a6fbb078cf62116ec8e1667f647e534dd6618e688ecc7962585efcc56881b544b8c53db3914599bbf2ab842e7f224b0fca languageName: node linkType: hard -"@inquirer/core@npm:^10.1.10": - version: 10.1.10 - resolution: "@inquirer/core@npm:10.1.10" +"@inquirer/core@npm:^10.3.2": + version: 10.3.2 + resolution: "@inquirer/core@npm:10.3.2" dependencies: - "@inquirer/figures": "npm:^1.0.11" - "@inquirer/type": "npm:^3.0.6" - ansi-escapes: "npm:^4.3.2" + "@inquirer/ansi": "npm:^1.0.2" + "@inquirer/figures": "npm:^1.0.15" + "@inquirer/type": "npm:^3.0.10" cli-width: "npm:^4.1.0" mute-stream: "npm:^2.0.0" signal-exit: "npm:^4.1.0" wrap-ansi: "npm:^6.2.0" - yoctocolors-cjs: "npm:^2.1.2" + yoctocolors-cjs: "npm:^2.1.3" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/8d0a3b725e42e40efbdc6ed087283795f1e36e642b119dd7dd3cbf31fce74bdbdb1b987da16159cd2475f45b2ede7e33293ae92bad3ac481832889c230df3fc0 + checksum: 10c0/f0f27e07fe288e01e3949b4ad216c19751f025ce77c610366e08d8b0f7a135d064dc074732031d251584b454c576f1e5c849e4abe259186dd5d4974c8f85c13e languageName: node linkType: hard -"@inquirer/figures@npm:^1.0.11": - version: 1.0.11 - resolution: "@inquirer/figures@npm:1.0.11" - checksum: 10c0/6270e24eebbe42bbc4e7f8e761e906be66b4896787f31ab3e7484ad271c8edc90bce4ec20e232a5da447aee4fc73803397b2dda8cf645f4f7eea83e773b44e1e +"@inquirer/figures@npm:^1.0.15": + version: 1.0.15 + resolution: "@inquirer/figures@npm:1.0.15" + checksum: 10c0/6e39a040d260ae234ae220180b7994ff852673e20be925f8aa95e78c7934d732b018cbb4d0ec39e600a410461bcb93dca771e7de23caa10630d255692e440f69 languageName: node linkType: hard -"@inquirer/type@npm:^3.0.6": - version: 3.0.6 - resolution: "@inquirer/type@npm:3.0.6" +"@inquirer/type@npm:^3.0.10": + version: 3.0.10 + resolution: "@inquirer/type@npm:3.0.10" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/92382c1b046559ddb16c53e1353a900a43266566a0d73902e5325433c640b6aaeaf3e34cc5b2a68fd089ff5d8add914d0b9875cdec64f7a09313f9c4420b021d + checksum: 10c0/a846c7a570e3bf2657d489bcc5dcdc3179d24c7323719de1951dcdb722400ac76e5b2bfe9765d0a789bc1921fac810983d7999f021f30a78a6a174c23fc78dc9 + languageName: node + linkType: hard + +"@isaacs/balanced-match@npm:^4.0.1": + version: 4.0.1 + resolution: "@isaacs/balanced-match@npm:4.0.1" + checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420 + languageName: node + linkType: hard + +"@isaacs/brace-expansion@npm:^5.0.0": + version: 5.0.0 + resolution: "@isaacs/brace-expansion@npm:5.0.0" + dependencies: + "@isaacs/balanced-match": "npm:^4.0.1" + checksum: 10c0/b4d4812f4be53afc2c5b6c545001ff7a4659af68d4484804e9d514e183d20269bb81def8682c01a22b17c4d6aed14292c8494f7d2ac664e547101c1a905aa977 languageName: node linkType: hard @@ -1024,7 +945,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.12": +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.13 resolution: "@jridgewell/gen-mapping@npm:0.3.13" dependencies: @@ -1034,18 +955,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.8 - resolution: "@jridgewell/gen-mapping@npm:0.3.8" - dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a - languageName: node - linkType: hard - -"@jridgewell/remapping@npm:^2.3.4": +"@jridgewell/remapping@npm:^2.3.4, @jridgewell/remapping@npm:^2.3.5": version: 2.3.5 resolution: "@jridgewell/remapping@npm:2.3.5" dependencies: @@ -1062,37 +972,20 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.31": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.29": - version: 0.3.30 - resolution: "@jridgewell/trace-mapping@npm:0.3.30" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3a1516c10f44613b9ba27c37a02ff8f410893776b2b3dad20a391b51b884dd60f97bbb56936d65d2ff8fe978510a0000266654ab8426bdb9ceb5fb4585b19e23 + checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 languageName: node linkType: hard @@ -1228,9 +1121,9 @@ __metadata: languageName: unknown linkType: soft -"@mswjs/interceptors@npm:^0.37.0": - version: 0.37.6 - resolution: "@mswjs/interceptors@npm:0.37.6" +"@mswjs/interceptors@npm:^0.40.0": + version: 0.40.0 + resolution: "@mswjs/interceptors@npm:0.40.0" dependencies: "@open-draft/deferred-promise": "npm:^2.2.0" "@open-draft/logger": "npm:^0.3.0" @@ -1238,18 +1131,18 @@ __metadata: is-node-process: "npm:^1.2.0" outvariant: "npm:^1.4.3" strict-event-emitter: "npm:^0.5.1" - checksum: 10c0/74f52c09c84fcbba9f1a06e462aa25b1567cf078ed27d396c76a8059c002fa9c361e711dcada0ac2aad4298f247d8e236a4fcc861c08ddf6e2ce0889368596fd + checksum: 10c0/4500f17b65910b2633182fdb15a81ccb6ccd4488a8c45bc2f7acdaaff4621c3cce5362e6b59ddc4fa28d315d0efb0608fd1f0d536bc5345141f8ac03fd7fab22 languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^0.2.12": - version: 0.2.12 - resolution: "@napi-rs/wasm-runtime@npm:0.2.12" +"@napi-rs/wasm-runtime@npm:^1.0.7": + version: 1.0.7 + resolution: "@napi-rs/wasm-runtime@npm:1.0.7" dependencies: - "@emnapi/core": "npm:^1.4.3" - "@emnapi/runtime": "npm:^1.4.3" - "@tybys/wasm-util": "npm:^0.10.0" - checksum: 10c0/6d07922c0613aab30c6a497f4df297ca7c54e5b480e00035e0209b872d5c6aab7162fc49477267556109c2c7ed1eb9c65a174e27e9b87568106a87b0a6e3ca7d + "@emnapi/core": "npm:^1.5.0" + "@emnapi/runtime": "npm:^1.5.0" + "@tybys/wasm-util": "npm:^0.10.1" + checksum: 10c0/2d8635498136abb49d6dbf7395b78c63422292240963bf055f307b77aeafbde57ae2c0ceaaef215601531b36d6eb92a2cdd6f5ba90ed2aa8127c27aff9c4ae55 languageName: node linkType: hard @@ -1280,16 +1173,16 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/agent@npm:3.0.0" +"@npmcli/agent@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/agent@npm:4.0.0" dependencies: agent-base: "npm:^7.1.0" http-proxy-agent: "npm:^7.0.0" https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" + lru-cache: "npm:^11.2.1" socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 + checksum: 10c0/f7b5ce0f3dd42c3f8c6546e8433573d8049f67ef11ec22aa4704bc41483122f68bf97752e06302c455ead667af5cb753e6a09bff06632bc465c1cfd4c4b75a53 languageName: node linkType: hard @@ -1319,7 +1212,7 @@ __metadata: languageName: node linkType: hard -"@open-draft/until@npm:^2.0.0, @open-draft/until@npm:^2.1.0": +"@open-draft/until@npm:^2.0.0": version: 2.1.0 resolution: "@open-draft/until@npm:2.1.0" checksum: 10c0/61d3f99718dd86bb393fee2d7a785f961dcaf12f2055f0c693b27f4d0cd5f7a03d498a6d9289773b117590d794a43cd129366fd8e99222e4832f67b1653d54cf @@ -1374,11 +1267,11 @@ __metadata: linkType: hard "@radix-ui/react-avatar@npm:^1.1.10": - version: 1.1.10 - resolution: "@radix-ui/react-avatar@npm:1.1.10" + version: 1.1.11 + resolution: "@radix-ui/react-avatar@npm:1.1.11" dependencies: - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-context": "npm:1.1.3" + "@radix-ui/react-primitive": "npm:2.1.4" "@radix-ui/react-use-callback-ref": "npm:1.1.1" "@radix-ui/react-use-is-hydrated": "npm:0.1.0" "@radix-ui/react-use-layout-effect": "npm:1.1.1" @@ -1392,7 +1285,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/9fb0cf9a9d0fdbeaa2efda476402fc09db2e6ff9cd9aa3ea1d315d9c9579840722a4833725cb196c455e0bd775dfe04221a4f6855685ce89d2133c42e2b07e5f + checksum: 10c0/b1b3d4b11a8e05a8479d2410fb4e7b1bf825135c4cd42f7e5152568a54a55a3073bd87d50325150417a29306e7b1b371289dc3c4f11739af8a2a7bb8dd7c38c9 languageName: node linkType: hard @@ -1470,6 +1363,19 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-context@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/react-context@npm:1.1.3" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/0f271b4100dbb007ad2675f2529453f07454f214b7ce796d72680bf2dff050d0719083ee6e8962919a74048ff853eff2e50de07d8f8c674d6be91bfa76204cc2 + languageName: node + linkType: hard + "@radix-ui/react-dialog@npm:^1.1.15": version: 1.1.15 resolution: "@radix-ui/react-dialog@npm:1.1.15" @@ -1613,10 +1519,10 @@ __metadata: linkType: hard "@radix-ui/react-label@npm:^2.1.7": - version: 2.1.7 - resolution: "@radix-ui/react-label@npm:2.1.7" + version: 2.1.8 + resolution: "@radix-ui/react-label@npm:2.1.8" dependencies: - "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-primitive": "npm:2.1.4" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -1627,7 +1533,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/d8c81411d5327b6db5cbf4b900bfcc52030315539911701cf8d82b4970aed80cbd66df5b62d2242859572c666cf4b0e147a8b39dc3c04bd024a4b4405e1183fe + checksum: 10c0/8b130380bd54bafb0dc652270c8cf035ceeb78faab82f78c0a76fc33cc0718e8455ff880e0db1b6c10f203ff342bf1f941544eb258c1fd85ae5b49b53cdf1a3d languageName: node linkType: hard @@ -1754,12 +1660,31 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-primitive@npm:2.1.4": + version: 2.1.4 + resolution: "@radix-ui/react-primitive@npm:2.1.4" + dependencies: + "@radix-ui/react-slot": "npm:1.2.4" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/90d687b222a25975371ed1f9f08648d75237214b8dec4cbaf09ec9ac951339b17421278f1aff2fb7c5672ba8bd03774a94904efdba73805dd5cc947ce5be8c4a + languageName: node + linkType: hard + "@radix-ui/react-progress@npm:^1.1.7": - version: 1.1.7 - resolution: "@radix-ui/react-progress@npm:1.1.7" + version: 1.1.8 + resolution: "@radix-ui/react-progress@npm:1.1.8" dependencies: - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-context": "npm:1.1.3" + "@radix-ui/react-primitive": "npm:2.1.4" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -1770,7 +1695,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/bed5349682a75db02d362c07ac99fefddbbdc0152c4d5035719498223b9d490ebd834e2d9f64d498424048eb3da7eb7e55ba696e202cd0a048d6e319390e69d3 + checksum: 10c0/6be47bd35f168e7ed8f7b3e76d944e79d995c60596c7b8e6eb824a0a27f9e6322bb92c8eab4ae1e49c205ee75aa09e6e70570128b0af987f83c05a4d53c6c3cf languageName: node linkType: hard @@ -1868,10 +1793,10 @@ __metadata: linkType: hard "@radix-ui/react-separator@npm:^1.1.7": - version: 1.1.7 - resolution: "@radix-ui/react-separator@npm:1.1.7" + version: 1.1.8 + resolution: "@radix-ui/react-separator@npm:1.1.8" dependencies: - "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-primitive": "npm:2.1.4" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -1882,11 +1807,11 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/32c0eb4fe018397efbe580542e6e33fdc09b76b96395b2bb4c55da7b6d49224b18f46143bdaf9eb6cb01e166c459fb77508a81d20a591a9034949acee5d171d9 + checksum: 10c0/92e1353f696a22167c90f2c610b440be1fae3c05128287560914f124eef83d74c06ad25431923f3595032e6d89c23d479c95434390f4c0d9d4a68ec8d563ae0c languageName: node linkType: hard -"@radix-ui/react-slot@npm:1.2.3, @radix-ui/react-slot@npm:^1.2.3": +"@radix-ui/react-slot@npm:1.2.3": version: 1.2.3 resolution: "@radix-ui/react-slot@npm:1.2.3" dependencies: @@ -1901,6 +1826,21 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-slot@npm:1.2.4, @radix-ui/react-slot@npm:^1.2.3": + version: 1.2.4 + resolution: "@radix-ui/react-slot@npm:1.2.4" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/8b719bb934f1ae5ac0e37214783085c17c2f1080217caf514c1c6cc3d9ca56c7e19d25470b26da79aa6e605ab36589edaade149b76f5fc0666f1063e2fc0a0dc + languageName: node + linkType: hard + "@radix-ui/react-switch@npm:^1.2.6": version: 1.2.6 resolution: "@radix-ui/react-switch@npm:1.2.6" @@ -2138,149 +2078,163 @@ __metadata: languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-beta.34": - version: 1.0.0-beta.34 - resolution: "@rolldown/pluginutils@npm:1.0.0-beta.34" - checksum: 10c0/96565287991825ecd90b60607dae908ebfdde233661fc589c98547a75c1fd0282b2e2a7849c3eb0c9941e2fba34667a8d5cdb8d597370815c19c2f29b4c157b4 +"@rolldown/pluginutils@npm:1.0.0-beta.47": + version: 1.0.0-beta.47 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.47" + checksum: 10c0/eb0cfa7334d66f090c47eaac612174936b05f26e789352428cb6e03575b590f355de30d26b42576ea4e613d8887b587119d19b2e4b3a8909ceb232ca1cf746c8 languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.48.1" +"@rollup/rollup-android-arm-eabi@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.53.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-android-arm64@npm:4.48.1" +"@rollup/rollup-android-arm64@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-android-arm64@npm:4.53.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-darwin-arm64@npm:4.48.1" +"@rollup/rollup-darwin-arm64@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.53.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-darwin-x64@npm:4.48.1" +"@rollup/rollup-darwin-x64@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.53.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.48.1" +"@rollup/rollup-freebsd-arm64@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.53.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-freebsd-x64@npm:4.48.1" +"@rollup/rollup-freebsd-x64@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-freebsd-x64@npm:4.53.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.48.1" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.53.2" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.48.1" +"@rollup/rollup-linux-arm-musleabihf@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.53.2" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.48.1" +"@rollup/rollup-linux-arm64-gnu@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.53.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.48.1" +"@rollup/rollup-linux-arm64-musl@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.53.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.48.1" +"@rollup/rollup-linux-loong64-gnu@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.53.2" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-ppc64-gnu@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.48.1" +"@rollup/rollup-linux-ppc64-gnu@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.53.2" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.48.1" +"@rollup/rollup-linux-riscv64-gnu@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.53.2" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.48.1" +"@rollup/rollup-linux-riscv64-musl@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.53.2" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.48.1" +"@rollup/rollup-linux-s390x-gnu@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.53.2" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.48.1" +"@rollup/rollup-linux-x64-gnu@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.53.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.48.1" +"@rollup/rollup-linux-x64-musl@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.53.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.48.1" +"@rollup/rollup-openharmony-arm64@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.53.2" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.53.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.48.1" +"@rollup/rollup-win32-ia32-msvc@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.53.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.48.1": - version: 4.48.1 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.48.1" +"@rollup/rollup-win32-x64-gnu@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.53.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.53.2": + version: 4.53.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.53.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2292,130 +2246,128 @@ __metadata: languageName: node linkType: hard -"@tailwindcss/node@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/node@npm:4.1.12" +"@tailwindcss/node@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/node@npm:4.1.17" dependencies: "@jridgewell/remapping": "npm:^2.3.4" enhanced-resolve: "npm:^5.18.3" - jiti: "npm:^2.5.1" - lightningcss: "npm:1.30.1" - magic-string: "npm:^0.30.17" + jiti: "npm:^2.6.1" + lightningcss: "npm:1.30.2" + magic-string: "npm:^0.30.21" source-map-js: "npm:^1.2.1" - tailwindcss: "npm:4.1.12" - checksum: 10c0/8dcf3658126fd9bbd95391226022c1f480beacd7a1304a6afb416361bfab4e09b2c89733061e28d3b7429d3c3f77934c56da9d824aa34433d973adccd2080253 + tailwindcss: "npm:4.1.17" + checksum: 10c0/80b542e9b7eb09499dd14d65fd7d9544321d6bcdc00d29914396001d00e009906392cf493d20cc655dfd42769c823060cb9bf2eacacb43838a47e897634a446b languageName: node linkType: hard -"@tailwindcss/oxide-android-arm64@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.12" +"@tailwindcss/oxide-android-arm64@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.17" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-darwin-arm64@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.12" +"@tailwindcss/oxide-darwin-arm64@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.17" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-darwin-x64@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.12" +"@tailwindcss/oxide-darwin-x64@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.17" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide-freebsd-x64@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.12" +"@tailwindcss/oxide-freebsd-x64@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.17" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.12" +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.17" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.12" +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.17" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.12" +"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.17" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.12" +"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.17" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@tailwindcss/oxide-linux-x64-musl@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.12" +"@tailwindcss/oxide-linux-x64-musl@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.17" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@tailwindcss/oxide-wasm32-wasi@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.12" - dependencies: - "@emnapi/core": "npm:^1.4.5" - "@emnapi/runtime": "npm:^1.4.5" - "@emnapi/wasi-threads": "npm:^1.0.4" - "@napi-rs/wasm-runtime": "npm:^0.2.12" - "@tybys/wasm-util": "npm:^0.10.0" - tslib: "npm:^2.8.0" +"@tailwindcss/oxide-wasm32-wasi@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.17" + dependencies: + "@emnapi/core": "npm:^1.6.0" + "@emnapi/runtime": "npm:^1.6.0" + "@emnapi/wasi-threads": "npm:^1.1.0" + "@napi-rs/wasm-runtime": "npm:^1.0.7" + "@tybys/wasm-util": "npm:^0.10.1" + tslib: "npm:^2.4.0" conditions: cpu=wasm32 languageName: node linkType: hard -"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.12" +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.17" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.12" +"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.17" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@tailwindcss/oxide@npm:4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/oxide@npm:4.1.12" - dependencies: - "@tailwindcss/oxide-android-arm64": "npm:4.1.12" - "@tailwindcss/oxide-darwin-arm64": "npm:4.1.12" - "@tailwindcss/oxide-darwin-x64": "npm:4.1.12" - "@tailwindcss/oxide-freebsd-x64": "npm:4.1.12" - "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.12" - "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.12" - "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.12" - "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.12" - "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.12" - "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.12" - "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.12" - "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.12" - detect-libc: "npm:^2.0.4" - tar: "npm:^7.4.3" +"@tailwindcss/oxide@npm:4.1.17": + version: 4.1.17 + resolution: "@tailwindcss/oxide@npm:4.1.17" + dependencies: + "@tailwindcss/oxide-android-arm64": "npm:4.1.17" + "@tailwindcss/oxide-darwin-arm64": "npm:4.1.17" + "@tailwindcss/oxide-darwin-x64": "npm:4.1.17" + "@tailwindcss/oxide-freebsd-x64": "npm:4.1.17" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.17" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.17" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.17" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.17" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.17" + "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.17" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.17" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.17" dependenciesMeta: "@tailwindcss/oxide-android-arm64": optional: true @@ -2441,113 +2393,117 @@ __metadata: optional: true "@tailwindcss/oxide-win32-x64-msvc": optional: true - checksum: 10c0/30ea0c63e2e024636c607c37fadd9a093168d39ffa816f8113183a085595443d533bfb1a62d8f315800b07f5f8e88fd303b4242505cc65d0cfd622ffd50abbe3 + checksum: 10c0/cdd292760dde90976ac5cd486600687f9ac4043d9796001b356d43bfc4d0e1972d23844fe045970afdc4b4cda8451f262db15a9da4152c26e2b696a985e3686c languageName: node linkType: hard "@tailwindcss/postcss@npm:^4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/postcss@npm:4.1.12" + version: 4.1.17 + resolution: "@tailwindcss/postcss@npm:4.1.17" dependencies: "@alloc/quick-lru": "npm:^5.2.0" - "@tailwindcss/node": "npm:4.1.12" - "@tailwindcss/oxide": "npm:4.1.12" + "@tailwindcss/node": "npm:4.1.17" + "@tailwindcss/oxide": "npm:4.1.17" postcss: "npm:^8.4.41" - tailwindcss: "npm:4.1.12" - checksum: 10c0/25f6229bca22bb20513bb75896ff7d195052380a72cb534691860daeca5d5e3a9b80dc66ceb74998f7614293bf0a62c10d85d4ba5d39b6d820faafec9ab1d134 + tailwindcss: "npm:4.1.17" + checksum: 10c0/76094f601aadd556aad59ad13613b22b9edfda5d8fdc0724a79b8331b27dbac121c0d33b5b65f94468c01290c58f261dd1d8553dde0d261cd4d18b6110aa2242 languageName: node linkType: hard "@tailwindcss/vite@npm:^4.1.12": - version: 4.1.12 - resolution: "@tailwindcss/vite@npm:4.1.12" + version: 4.1.17 + resolution: "@tailwindcss/vite@npm:4.1.17" dependencies: - "@tailwindcss/node": "npm:4.1.12" - "@tailwindcss/oxide": "npm:4.1.12" - tailwindcss: "npm:4.1.12" + "@tailwindcss/node": "npm:4.1.17" + "@tailwindcss/oxide": "npm:4.1.17" + tailwindcss: "npm:4.1.17" peerDependencies: vite: ^5.2.0 || ^6 || ^7 - checksum: 10c0/f9a7df532f6ca2a9a1e288c0d87702787419e8ec01f7d5f6c8ff826d79b8adda73871a2e2704c0fab485eaa394d8dc59ff8ad73fcd00c18ab48fcf5f32c382e9 + checksum: 10c0/47d9bdfb7bf7d2df0661b50e91656779863146cca97571e21e2c3f9351f468c27cbc7ed1d1d6c373f1e721dca66d32a3f12f77e9d3e74bed344e27afec199ad3 languageName: node linkType: hard "@tanstack/eslint-plugin-query@npm:^5.83.1": - version: 5.83.1 - resolution: "@tanstack/eslint-plugin-query@npm:5.83.1" + version: 5.91.2 + resolution: "@tanstack/eslint-plugin-query@npm:5.91.2" dependencies: - "@typescript-eslint/utils": "npm:^8.37.0" + "@typescript-eslint/utils": "npm:^8.44.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/b4a041c4341a9a41ff9cdad9201bff464d4102394aa321dbbdcf8524a1a6789517223729c7fc4b7c219a25db8822ba769e70441d9f6816a8d56396acf40b335c + checksum: 10c0/d839f37ae99ea776a2d1c03514d0e57a73890f449046e53b9497e919365bb14a13277f152cdb532f6714d60399b280daeedcaf55559d23b90b6beaa352fe15c8 languageName: node linkType: hard -"@tanstack/history@npm:1.115.0": - version: 1.115.0 - resolution: "@tanstack/history@npm:1.115.0" - checksum: 10c0/d9daa348a81a03478c95727cb68002a9b70a5871089d4d3a111cea9b2647f6c159b8f04b13dcd302fafa7077ec28cc1ec878e1daf23d38e72534d649d5db7fd5 +"@tanstack/history@npm:1.133.28": + version: 1.133.28 + resolution: "@tanstack/history@npm:1.133.28" + checksum: 10c0/1d96e7aa11288bf265a43deb0f7abc11113b30d3c2fd216a38303bd230ed6d931fe62c67f865806865e32186f6d3645f0859547b6b3acc030e552a69125ea8f5 languageName: node linkType: hard -"@tanstack/query-core@npm:5.85.6": - version: 5.85.6 - resolution: "@tanstack/query-core@npm:5.85.6" - checksum: 10c0/a7b2141094185f8ad8e168e57cf20cec07a93dcfad95e6e71f1154e40d3753230bd0851fd19cc8e221f61a6cd6d7e9dba8853ada304da29dc1b3f866dbe2b090 +"@tanstack/query-core@npm:5.90.9": + version: 5.90.9 + resolution: "@tanstack/query-core@npm:5.90.9" + checksum: 10c0/d3759529c714658a492e860365452db165f673f9a777c57339072231f90554628798deaadc9fd8b115b028c1dcd3b0fe3fd8d8a2ab25f799d853e2fd020b5734 languageName: node linkType: hard "@tanstack/react-query@npm:^5.85.6": - version: 5.85.6 - resolution: "@tanstack/react-query@npm:5.85.6" + version: 5.90.9 + resolution: "@tanstack/react-query@npm:5.90.9" dependencies: - "@tanstack/query-core": "npm:5.85.6" + "@tanstack/query-core": "npm:5.90.9" peerDependencies: react: ^18 || ^19 - checksum: 10c0/058564eea1805cf50d80ba2ddc3040df4564563802faf5e4a1282d859ab6d6d1bc50aa8a7924a5c060d57813dbe63dec4076e75e1988af4dbc60da0a743969aa + checksum: 10c0/3cf3e5b49580a58966db6cca9b35674af62b9322c4b9f388ee0074fe5d0f05d0fbcc83b345f2d84040cab284b02cfcf5f45bb8f79bf4ae85853f66313e0a7d6e languageName: node linkType: hard -"@tanstack/react-router-devtools@npm:^1.116.0": - version: 1.116.0 - resolution: "@tanstack/react-router-devtools@npm:1.116.0" +"@tanstack/react-router-devtools@npm:1.136.1": + version: 1.136.1 + resolution: "@tanstack/react-router-devtools@npm:1.136.1" dependencies: - "@tanstack/router-devtools-core": "npm:^1.115.3" - solid-js: "npm:^1.9.5" + "@tanstack/router-devtools-core": "npm:1.136.1" + vite: "npm:^7.1.7" peerDependencies: - "@tanstack/react-router": ^1.116.0 + "@tanstack/react-router": ^1.136.1 + "@tanstack/router-core": ^1.136.1 react: ">=18.0.0 || >=19.0.0" react-dom: ">=18.0.0 || >=19.0.0" - checksum: 10c0/120247eeef472c3f22ced45c61183f869ff108765861506250c085f59598af4fb5b3432fa1b0fd5f95cd4de4c8473ddd842e2211525e82688e269fc53044f10e + peerDependenciesMeta: + "@tanstack/router-core": + optional: true + checksum: 10c0/9e672377d25ade3c2a498007a8afd326fe774a0c768032d1a844bd3e663b14ef98b438cd46cac4feeeeeeddf2ed564cd05de3c6a08d9ab9c3b559e61eb74f1ad languageName: node linkType: hard "@tanstack/react-router@npm:^1.116.0": - version: 1.116.0 - resolution: "@tanstack/react-router@npm:1.116.0" + version: 1.136.1 + resolution: "@tanstack/react-router@npm:1.136.1" dependencies: - "@tanstack/history": "npm:1.115.0" - "@tanstack/react-store": "npm:^0.7.0" - "@tanstack/router-core": "npm:1.115.3" - jsesc: "npm:^3.1.0" + "@tanstack/history": "npm:1.133.28" + "@tanstack/react-store": "npm:^0.8.0" + "@tanstack/router-core": "npm:1.136.1" + isbot: "npm:^5.1.22" tiny-invariant: "npm:^1.3.3" tiny-warning: "npm:^1.0.3" peerDependencies: react: ">=18.0.0 || >=19.0.0" react-dom: ">=18.0.0 || >=19.0.0" - checksum: 10c0/3ee5ddd987de3711be4621f746eaf737d6a89f87fb898d92a27b1fdea65c0f968a8d58dd9aae545d256ff857d417c412bcf0301d3f71dd611a55c495a6f0442d + checksum: 10c0/dd0b18002f5da24148ea416309f456a134a157e328d63e9e493e91bb672536b6dc2c4f9441cfac949f5b2ce22f2b5bb74a38c9a818d2c734162176a8c7ec57dc languageName: node linkType: hard -"@tanstack/react-store@npm:^0.7.0": - version: 0.7.0 - resolution: "@tanstack/react-store@npm:0.7.0" +"@tanstack/react-store@npm:^0.8.0": + version: 0.8.0 + resolution: "@tanstack/react-store@npm:0.8.0" dependencies: - "@tanstack/store": "npm:0.7.0" - use-sync-external-store: "npm:^1.4.0" + "@tanstack/store": "npm:0.8.0" + use-sync-external-store: "npm:^1.6.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/7e971ae3c547d0d803133f07737e7cc7cf381e959b4fab3f55755b28c194688392f5b921d3d43b8c9c81bdc721ea8878c680d4ca28a1ccd59e8a64ab7bcfd0f8 + checksum: 10c0/ecf7ad81d97810336d0a808a41442f235a444e98599c6e7e026efd3c4360548b84af9a23612f1d0da85e32a4d9e207632b2ee2cec6f635109a256209caa3bc59 languageName: node linkType: hard @@ -2563,97 +2519,99 @@ __metadata: languageName: node linkType: hard -"@tanstack/router-core@npm:1.115.3, @tanstack/router-core@npm:^1.115.3": - version: 1.115.3 - resolution: "@tanstack/router-core@npm:1.115.3" +"@tanstack/router-core@npm:1.136.1": + version: 1.136.1 + resolution: "@tanstack/router-core@npm:1.136.1" dependencies: - "@tanstack/history": "npm:1.115.0" - "@tanstack/store": "npm:^0.7.0" + "@tanstack/history": "npm:1.133.28" + "@tanstack/store": "npm:^0.8.0" + cookie-es: "npm:^2.0.0" + seroval: "npm:^1.3.2" + seroval-plugins: "npm:^1.3.2" tiny-invariant: "npm:^1.3.3" - checksum: 10c0/9aca89618c47c38aaee9e69d8f6293e2ddf9b6bd86a5637daa4cb4e62ca29d5f06ed94142a84e0411aeb74844da897569c355715d607af5755850a45c3405712 + tiny-warning: "npm:^1.0.3" + checksum: 10c0/49f8b0a150d8ca5ed4931fbf1b24aca4ea5fa8969fdef73ba281efa147e9d519f211767906d7629b6503cea24672e5572a70be0fdfe9b07008ca0e7917f4edce languageName: node linkType: hard -"@tanstack/router-devtools-core@npm:^1.115.3": - version: 1.115.3 - resolution: "@tanstack/router-devtools-core@npm:1.115.3" +"@tanstack/router-devtools-core@npm:1.136.1": + version: 1.136.1 + resolution: "@tanstack/router-devtools-core@npm:1.136.1" dependencies: clsx: "npm:^2.1.1" goober: "npm:^2.1.16" + tiny-invariant: "npm:^1.3.3" + vite: "npm:^7.1.7" peerDependencies: - "@tanstack/router-core": ^1.115.3 + "@tanstack/router-core": ^1.136.1 csstype: ^3.0.10 solid-js: ">=1.9.5" - tiny-invariant: ^1.3.3 peerDependenciesMeta: csstype: optional: true - checksum: 10c0/ff397883d1a04f755b4eea053f8c88cf29df66e22802d0ac7116999d2bea0510b4b978790e6aa95b9743dd1185cd42f0dfe3f732be4801c08a59316ecb5cd713 + checksum: 10c0/a6855ebefbb484bb1d1778714e2a98e8aa28cb11e4a2a54bc4754acef953a8188ed3831139bfd3c010faf88205fc63d1fd2ae790925596f2fee8aa035a5753fe languageName: node linkType: hard "@tanstack/router-devtools@npm:^1.116.0": - version: 1.116.0 - resolution: "@tanstack/router-devtools@npm:1.116.0" + version: 1.136.1 + resolution: "@tanstack/router-devtools@npm:1.136.1" dependencies: - "@tanstack/react-router-devtools": "npm:^1.116.0" + "@tanstack/react-router-devtools": "npm:1.136.1" clsx: "npm:^2.1.1" goober: "npm:^2.1.16" + vite: "npm:^7.1.7" peerDependencies: - "@tanstack/react-router": ^1.116.0 + "@tanstack/react-router": ^1.136.1 csstype: ^3.0.10 react: ">=18.0.0 || >=19.0.0" react-dom: ">=18.0.0 || >=19.0.0" peerDependenciesMeta: csstype: optional: true - checksum: 10c0/590af5881117f0160fb0a1c4aec755a239522ae6adce196de719521de7bb6387e2d9fce4640ec794e61b78b45e77ffd0aa2f27eb30f5491d105f839ec17721e0 + checksum: 10c0/34429e9c125314ac3796f961f4000a0d635ac0283e27642aa46d180c9c3d1275efc6891e091d554e846e3dd0a181b19f7617af637f05fba9f329d04d19b52c30 languageName: node linkType: hard -"@tanstack/router-generator@npm:^1.116.0": - version: 1.116.0 - resolution: "@tanstack/router-generator@npm:1.116.0" +"@tanstack/router-generator@npm:1.136.1": + version: 1.136.1 + resolution: "@tanstack/router-generator@npm:1.136.1" dependencies: - "@tanstack/virtual-file-routes": "npm:^1.115.0" + "@tanstack/router-core": "npm:1.136.1" + "@tanstack/router-utils": "npm:1.133.19" + "@tanstack/virtual-file-routes": "npm:1.133.19" prettier: "npm:^3.5.0" + recast: "npm:^0.23.11" + source-map: "npm:^0.7.4" tsx: "npm:^4.19.2" zod: "npm:^3.24.2" - peerDependencies: - "@tanstack/react-router": ^1.116.0 - peerDependenciesMeta: - "@tanstack/react-router": - optional: true - checksum: 10c0/96a7658e0e5c521173a4d842df290da7c750c23d63e2d58aba2c92d391ec0ca3051fd76664e39251b604a7c3d14c972b00e79d4485b905d56affa7bae90cb004 + checksum: 10c0/a503cc0cf9dfd3e79be3d2a8e4a8fb4e56a9ac4e35fced5977159a58e9dd0b0178d9e982a2559bc620aec75c65fe9bd7def3c12ced1fa8fb3ade835e957f78c7 languageName: node linkType: hard "@tanstack/router-plugin@npm:^1.116.1": - version: 1.116.1 - resolution: "@tanstack/router-plugin@npm:1.116.1" - dependencies: - "@babel/core": "npm:^7.26.8" - "@babel/plugin-syntax-jsx": "npm:^7.25.9" - "@babel/plugin-syntax-typescript": "npm:^7.25.9" - "@babel/template": "npm:^7.26.8" - "@babel/traverse": "npm:^7.26.8" - "@babel/types": "npm:^7.26.8" - "@tanstack/router-core": "npm:^1.115.3" - "@tanstack/router-generator": "npm:^1.116.0" - "@tanstack/router-utils": "npm:^1.115.0" - "@tanstack/virtual-file-routes": "npm:^1.115.0" - "@types/babel__core": "npm:^7.20.5" - "@types/babel__template": "npm:^7.4.4" - "@types/babel__traverse": "npm:^7.20.6" + version: 1.136.1 + resolution: "@tanstack/router-plugin@npm:1.136.1" + dependencies: + "@babel/core": "npm:^7.27.7" + "@babel/plugin-syntax-jsx": "npm:^7.27.1" + "@babel/plugin-syntax-typescript": "npm:^7.27.1" + "@babel/template": "npm:^7.27.2" + "@babel/traverse": "npm:^7.27.7" + "@babel/types": "npm:^7.27.7" + "@tanstack/router-core": "npm:1.136.1" + "@tanstack/router-generator": "npm:1.136.1" + "@tanstack/router-utils": "npm:1.133.19" + "@tanstack/virtual-file-routes": "npm:1.133.19" babel-dead-code-elimination: "npm:^1.0.10" chokidar: "npm:^3.6.0" unplugin: "npm:^2.1.2" zod: "npm:^3.24.2" peerDependencies: "@rsbuild/core": ">=1.0.2" - "@tanstack/react-router": ^1.116.0 - vite: ">=5.0.0 || >=6.0.0" - vite-plugin-solid: ^2.11.2 + "@tanstack/react-router": ^1.136.1 + vite: ">=5.0.0 || >=6.0.0 || >=7.0.0" + vite-plugin-solid: ^2.11.10 webpack: ">=5.92.0" peerDependenciesMeta: "@rsbuild/core": @@ -2666,26 +2624,30 @@ __metadata: optional: true webpack: optional: true - checksum: 10c0/a4fda7f0cb72c9564fff20d80a2c291416239b3fe78e600fc0d1b1010f3ec4abe37a0975c19c9f8d940d82e6c851bd7efb8ec6e200c28ae9d85c2126e7e8cf99 + checksum: 10c0/8b13c139db5f9e9f72fc07be84cd45c928b7d1be4fc2932fd362cae7c08a59c5d583ea72bf0d559fb5b9c6c6a0c85a0de5386d21d386d2f8b4696a04b93f0808 languageName: node linkType: hard -"@tanstack/router-utils@npm:^1.115.0": - version: 1.115.0 - resolution: "@tanstack/router-utils@npm:1.115.0" +"@tanstack/router-utils@npm:1.133.19": + version: 1.133.19 + resolution: "@tanstack/router-utils@npm:1.133.19" dependencies: - "@babel/generator": "npm:^7.26.8" - "@babel/parser": "npm:^7.26.8" - ansis: "npm:^3.11.0" - diff: "npm:^7.0.0" - checksum: 10c0/e4ed11346e1e61ddd2f0b16222783fa360f270078d3039efe11dc726abf56f137db68a8fc83fd47e62cbd823221a4c07cd233bc12739d35a9a82a2118ab5adfe + "@babel/core": "npm:^7.27.4" + "@babel/generator": "npm:^7.27.5" + "@babel/parser": "npm:^7.27.5" + "@babel/preset-typescript": "npm:^7.27.1" + ansis: "npm:^4.1.0" + diff: "npm:^8.0.2" + pathe: "npm:^2.0.3" + tinyglobby: "npm:^0.2.15" + checksum: 10c0/fdc6078c5b6eac4ce403c35fe71a4e8522b0fe49381fe0e60aa7bd84b3dae91675f0825370316c68f6321c127ad1c0853b4c1f876c7fa46de0ec954e09a2c086 languageName: node linkType: hard -"@tanstack/store@npm:0.7.0, @tanstack/store@npm:^0.7.0": - version: 0.7.0 - resolution: "@tanstack/store@npm:0.7.0" - checksum: 10c0/17003f1eba25bb6e9e2557ffb5d9c63cac09aa46f57d670a917727665ccc0b72d8d421ea1c07451257554aa5d14dbfff46875e7ed6a81f133b0738065f3162df +"@tanstack/store@npm:0.8.0, @tanstack/store@npm:^0.8.0": + version: 0.8.0 + resolution: "@tanstack/store@npm:0.8.0" + checksum: 10c0/71841a7a7653f744bdea457d2c41768b8d5e5aed1d5ff22bd068e28ced9bf658208c730963809c2223b26b753e19da987c0d98acb7c543abd97de14e0d58991f languageName: node linkType: hard @@ -2696,30 +2658,14 @@ __metadata: languageName: node linkType: hard -"@tanstack/virtual-file-routes@npm:^1.115.0": - version: 1.115.0 - resolution: "@tanstack/virtual-file-routes@npm:1.115.0" - checksum: 10c0/4df85dbffb1d15cda655644202e15f55769181e7b64949ec19740e49e9dc2f5af5353f5891619749973f3307df34d7f223a0477cbe206d3889e41b934496c6a9 +"@tanstack/virtual-file-routes@npm:1.133.19": + version: 1.133.19 + resolution: "@tanstack/virtual-file-routes@npm:1.133.19" + checksum: 10c0/91d0985f0abbc77619752b98f1b052dd00531850593d6072a37e10e1f63b97fab335f280d5f0dc9573f19c23886f02c0a100208e1d4ff38b3fae482b2cf2bbc1 languageName: node linkType: hard -"@testing-library/dom@npm:^10.4.0": - version: 10.4.0 - resolution: "@testing-library/dom@npm:10.4.0" - dependencies: - "@babel/code-frame": "npm:^7.10.4" - "@babel/runtime": "npm:^7.12.5" - "@types/aria-query": "npm:^5.0.1" - aria-query: "npm:5.3.0" - chalk: "npm:^4.1.0" - dom-accessibility-api: "npm:^0.5.9" - lz-string: "npm:^1.5.0" - pretty-format: "npm:^27.0.2" - checksum: 10c0/0352487720ecd433400671e773df0b84b8268fb3fe8e527cdfd7c11b1365b398b4e0eddba6e7e0c85e8d615f48257753283fccec41f6b986fd6c85f15eb5f84f - languageName: node - linkType: hard - -"@testing-library/dom@npm:^10.4.1": +"@testing-library/dom@npm:^10.4.0, @testing-library/dom@npm:^10.4.1": version: 10.4.1 resolution: "@testing-library/dom@npm:10.4.1" dependencies: @@ -2736,8 +2682,8 @@ __metadata: linkType: hard "@testing-library/jest-dom@npm:^6.8.0": - version: 6.8.0 - resolution: "@testing-library/jest-dom@npm:6.8.0" + version: 6.9.1 + resolution: "@testing-library/jest-dom@npm:6.9.1" dependencies: "@adobe/css-tools": "npm:^4.4.0" aria-query: "npm:^5.0.0" @@ -2745,7 +2691,7 @@ __metadata: dom-accessibility-api: "npm:^0.6.3" picocolors: "npm:^1.1.1" redent: "npm:^3.0.0" - checksum: 10c0/4c5b8b433e0339e0399b940ae901a99ae00f1d5ffb7cbb295460b2c44aaad0bc7befcca7b06ceed7aa68a524970077468046c9fe52836ee26f45b807c80a7ff1 + checksum: 10c0/4291ebd2f0f38d14cefac142c56c337941775a5807e2a3d6f1a14c2fbd6be76a18e498ed189e95bedc97d9e8cf1738049bc76c85b5bc5e23fae7c9e10f7b3a12 languageName: node linkType: hard @@ -2778,12 +2724,12 @@ __metadata: languageName: node linkType: hard -"@tybys/wasm-util@npm:^0.10.0": - version: 0.10.0 - resolution: "@tybys/wasm-util@npm:0.10.0" +"@tybys/wasm-util@npm:^0.10.1": + version: 0.10.1 + resolution: "@tybys/wasm-util@npm:0.10.1" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/044feba55c1e2af703aa4946139969badb183ce1a659a75ed60bc195a90e73a3f3fc53bcd643497c9954597763ddb051fec62f80962b2ca6fc716ba897dc696e + checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8 languageName: node linkType: hard @@ -2816,7 +2762,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__template@npm:*, @types/babel__template@npm:^7.4.4": +"@types/babel__template@npm:*": version: 7.4.4 resolution: "@types/babel__template@npm:7.4.4" dependencies: @@ -2826,35 +2772,29 @@ __metadata: languageName: node linkType: hard -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.20.6": - version: 7.20.7 - resolution: "@types/babel__traverse@npm:7.20.7" +"@types/babel__traverse@npm:*": + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" dependencies: - "@babel/types": "npm:^7.20.7" - checksum: 10c0/5386f0af44f8746b063b87418f06129a814e16bb2686965a575e9d7376b360b088b89177778d8c426012abc43dd1a2d8ec3218bfc382280c898682746ce2ffbd + "@babel/types": "npm:^7.28.2" + checksum: 10c0/b52d7d4e8fc6a9018fe7361c4062c1c190f5778cf2466817cb9ed19d69fbbb54f9a85ffedeb748ed8062d2cf7d4cc088ee739848f47c57740de1c48cbf0d0994 languageName: node linkType: hard "@types/chai@npm:^5.2.2": - version: 5.2.2 - resolution: "@types/chai@npm:5.2.2" + version: 5.2.3 + resolution: "@types/chai@npm:5.2.3" dependencies: "@types/deep-eql": "npm:*" - checksum: 10c0/49282bf0e8246800ebb36f17256f97bd3a8c4fb31f92ad3c0eaa7623518d7e87f1eaad4ad206960fcaf7175854bdff4cb167e4fe96811e0081b4ada83dd533ec - languageName: node - linkType: hard - -"@types/cookie@npm:^0.6.0": - version: 0.6.0 - resolution: "@types/cookie@npm:0.6.0" - checksum: 10c0/5b326bd0188120fb32c0be086b141b1481fec9941b76ad537f9110e10d61ee2636beac145463319c71e4be67a17e85b81ca9e13ceb6e3bb63b93d16824d6c149 + assertion-error: "npm:^2.0.1" + checksum: 10c0/e0ef1de3b6f8045a5e473e867c8565788c444271409d155588504840ad1a53611011f85072188c2833941189400228c1745d78323dac13fcede9c2b28bacfb2f languageName: node linkType: hard "@types/d3-array@npm:^3.0.3": - version: 3.2.1 - resolution: "@types/d3-array@npm:3.2.1" - checksum: 10c0/38bf2c778451f4b79ec81a2288cb4312fe3d6449ecdf562970cc339b60f280f31c93a024c7ff512607795e79d3beb0cbda123bb07010167bce32927f71364bca + version: 3.2.2 + resolution: "@types/d3-array@npm:3.2.2" + checksum: 10c0/6137cb97302f8a4f18ca22c0560c585cfcb823f276b23d89f2c0c005d72697ec13bca671c08e68b4b0cabd622e3f0e91782ee221580d6774074050be96dd7028 languageName: node linkType: hard @@ -2927,20 +2867,13 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.6": +"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 languageName: node linkType: hard -"@types/estree@npm:^1.0.0": - version: 1.0.7 - resolution: "@types/estree@npm:1.0.7" - checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c - languageName: node - linkType: hard - "@types/json-schema@npm:^7.0.15": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -2949,180 +2882,157 @@ __metadata: linkType: hard "@types/node@npm:*": -<<<<<<< HEAD - version: 24.5.1 - resolution: "@types/node@npm:24.5.1" - dependencies: - undici-types: "npm:~7.12.0" - checksum: 10c0/5f0cb038be789b58170e616452ba1f8ebb85bf2fbce58a7e32b1eb08391f64f5e31a9cdbccefbfcd9e6d73b66b564b5e037a1d678ab20213559a32e1d7b6ce17 -======= version: 24.10.1 resolution: "@types/node@npm:24.10.1" dependencies: undici-types: "npm:~7.16.0" checksum: 10c0/d6bca7a78f550fbb376f236f92b405d676003a8a09a1b411f55920ef34286ee3ee51f566203920e835478784df52662b5b2af89159d9d319352e9ea21801c002 ->>>>>>> 557b2ee (Fix yarn) languageName: node linkType: hard "@types/node@npm:^22.14.1": - version: 22.14.1 - resolution: "@types/node@npm:22.14.1" + version: 22.19.1 + resolution: "@types/node@npm:22.19.1" dependencies: undici-types: "npm:~6.21.0" - checksum: 10c0/d49c4d00403b1c2348cf0701b505fd636d80aabe18102105998dc62fdd36dcaf911e73c7a868c48c21c1022b825c67b475b65b1222d84b704d8244d152bb7f86 + checksum: 10c0/6edd93aea86da740cb7872626839cd6f4a67a049d3a3a6639cb592c620ec591408a30989ab7410008d1a0b2d4985ce50f1e488e79c033e4476d3bec6833b0a2f languageName: node linkType: hard "@types/papaparse@npm:^5.3.16": -<<<<<<< HEAD - version: 5.3.16 - resolution: "@types/papaparse@npm:5.3.16" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/0009d3dcdc20cd37f171db77307844a575b89435a3398d1437173a1e5feb13a88e61fed7756f264555743a9510693ae1c9e20c4558c066085fd0bd881abf5497 -======= version: 5.5.0 resolution: "@types/papaparse@npm:5.5.0" dependencies: "@types/node": "npm:*" checksum: 10c0/df2db19b602c6d9a049085737fcd3be49e4db528704a25bf4e9a08378053951f7069738b8a3fcb8b1c760ccbc41125f1e358b21db905d6f7e8bcf4062b29df49 ->>>>>>> 557b2ee (Fix yarn) languageName: node linkType: hard "@types/react-dom@npm:^19.1.9": - version: 19.1.9 - resolution: "@types/react-dom@npm:19.1.9" + version: 19.2.3 + resolution: "@types/react-dom@npm:19.2.3" peerDependencies: - "@types/react": ^19.0.0 - checksum: 10c0/34c8dda86c1590b3ef0e7ecd38f9663a66ba2dd69113ba74fb0adc36b83bbfb8c94c1487a2505282a5f7e5e000d2ebf36f4c0fd41b3b672f5178fd1d4f1f8f58 + "@types/react": ^19.2.0 + checksum: 10c0/b486ebe0f4e2fb35e2e108df1d8fc0927ca5d6002d5771e8a739de11239fe62d0e207c50886185253c99eb9dedfeeb956ea7429e5ba17f6693c7acb4c02f8cd1 languageName: node linkType: hard "@types/react@npm:^19.1.12": - version: 19.1.12 - resolution: "@types/react@npm:19.1.12" + version: 19.2.4 + resolution: "@types/react@npm:19.2.4" dependencies: csstype: "npm:^3.0.2" - checksum: 10c0/e35912b43da0caaab5252444bab87a31ca22950cde2822b3b3dc32e39c2d42dad1a4cf7b5dde9783aa2d007f0b2cba6ab9563fc6d2dbcaaa833b35178118767c + checksum: 10c0/c878262c4bce047e53a44ef644088fce359ebdfdca7060a4ac1717c8362563b9506a7ebae145977836e95d5948b8f8b426dcd516044c3a3c0563a6f1b60408ce languageName: node linkType: hard "@types/statuses@npm:^2.0.4": - version: 2.0.5 - resolution: "@types/statuses@npm:2.0.5" - checksum: 10c0/4dacec0b29483a44be902a022a11a22b339de7a6e7b2059daa4f7add10cb6dbcc28d02d2a416fe9687e48d335906bf983065391836d4e7c847e55ddef4de8fad - languageName: node - linkType: hard - -"@types/tough-cookie@npm:^4.0.5": - version: 4.0.5 - resolution: "@types/tough-cookie@npm:4.0.5" - checksum: 10c0/68c6921721a3dcb40451543db2174a145ef915bc8bcbe7ad4e59194a0238e776e782b896c7a59f4b93ac6acefca9161fccb31d1ce3b3445cb6faa467297fb473 + version: 2.0.6 + resolution: "@types/statuses@npm:2.0.6" + checksum: 10c0/dd88c220b0e2c6315686289525fd61472d2204d2e4bef4941acfb76bda01d3066f749ac74782aab5b537a45314fcd7d6261eefa40b6ec872691f5803adaa608d languageName: node linkType: hard "@typescript-eslint/eslint-plugin@npm:^8.41.0": - version: 8.41.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.41.0" + version: 8.46.4 + resolution: "@typescript-eslint/eslint-plugin@npm:8.46.4" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.41.0" - "@typescript-eslint/type-utils": "npm:8.41.0" - "@typescript-eslint/utils": "npm:8.41.0" - "@typescript-eslint/visitor-keys": "npm:8.41.0" + "@typescript-eslint/scope-manager": "npm:8.46.4" + "@typescript-eslint/type-utils": "npm:8.46.4" + "@typescript-eslint/utils": "npm:8.46.4" + "@typescript-eslint/visitor-keys": "npm:8.46.4" graphemer: "npm:^1.4.0" ignore: "npm:^7.0.0" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^2.1.0" peerDependencies: - "@typescript-eslint/parser": ^8.41.0 + "@typescript-eslint/parser": ^8.46.4 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/29812ee5deeae65e67db29faa8d96bc70255c45788f342b11838850ea29a96e4331622cad3e703ffacaa895372845d44fd6b04786117c78f1a027595adff2e62 + checksum: 10c0/c487e55c2f35e89126a13a6997f06494c26a3c96b9a7685421e2d92929f3ab302c1c234f0add9113705fbad693b05b3b87cebe5219bc71b2af9ee7aa8e7dc12c languageName: node linkType: hard "@typescript-eslint/parser@npm:^8.41.0": - version: 8.41.0 - resolution: "@typescript-eslint/parser@npm:8.41.0" + version: 8.46.4 + resolution: "@typescript-eslint/parser@npm:8.46.4" dependencies: - "@typescript-eslint/scope-manager": "npm:8.41.0" - "@typescript-eslint/types": "npm:8.41.0" - "@typescript-eslint/typescript-estree": "npm:8.41.0" - "@typescript-eslint/visitor-keys": "npm:8.41.0" + "@typescript-eslint/scope-manager": "npm:8.46.4" + "@typescript-eslint/types": "npm:8.46.4" + "@typescript-eslint/typescript-estree": "npm:8.46.4" + "@typescript-eslint/visitor-keys": "npm:8.46.4" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/ca13ff505e9253aee761741f96714cd65a296bbfcac961efbbf7a909ff3d180b2142a23db0a2a5e50b928fa56586528b7e47ba6301089dd850945018dbf2ef50 + checksum: 10c0/bef98fa9250d5720479c10f803ca66a2a0b382158a8b462fd1c710351f7b423570c273556fb828e64d8a87041d54d51fa5a5e1e88ebdc1c88da0ee1098f9405e languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.41.0": - version: 8.41.0 - resolution: "@typescript-eslint/project-service@npm:8.41.0" +"@typescript-eslint/project-service@npm:8.46.4": + version: 8.46.4 + resolution: "@typescript-eslint/project-service@npm:8.46.4" dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.41.0" - "@typescript-eslint/types": "npm:^8.41.0" + "@typescript-eslint/tsconfig-utils": "npm:^8.46.4" + "@typescript-eslint/types": "npm:^8.46.4" debug: "npm:^4.3.4" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/907ba880fcaf0805fc97012b431536b5b06db6ae4a0095708f9d9a4406feddabd964f09ea4ca99d8fa7bd141dbcc9496f1a9eb6683361a6bb01fb714a361126c + checksum: 10c0/81c5de7b85a2b1bff51ef27d25f11be992b7e550bfe34d4cbc4eb71f0fd03bcc1619644ac8efd594c515c894317f98db9176ef333004718d997c666791ca8b95 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.41.0": - version: 8.41.0 - resolution: "@typescript-eslint/scope-manager@npm:8.41.0" +"@typescript-eslint/scope-manager@npm:8.46.4": + version: 8.46.4 + resolution: "@typescript-eslint/scope-manager@npm:8.46.4" dependencies: - "@typescript-eslint/types": "npm:8.41.0" - "@typescript-eslint/visitor-keys": "npm:8.41.0" - checksum: 10c0/6b339ac1fc37a1e05dc6de421db9f9b138c357497ec87af2471ad30e48c78b4979d3da40943a1c81fc85d1537326a4f938843434db63d29eff414b9364daf8e8 + "@typescript-eslint/types": "npm:8.46.4" + "@typescript-eslint/visitor-keys": "npm:8.46.4" + checksum: 10c0/f614b5a95f1803a4298a5192c48f39327fa6085c0753cd67b03728767b8dee79020ebc8896974cba530fe039a5723e157eed74675683f1a4ed87959cd695c997 languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.41.0, @typescript-eslint/tsconfig-utils@npm:^8.41.0": - version: 8.41.0 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.41.0" +"@typescript-eslint/tsconfig-utils@npm:8.46.4, @typescript-eslint/tsconfig-utils@npm:^8.46.4": + version: 8.46.4 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.46.4" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/98618a536b9cb071eacba2970ce2ca1b9243de78f4604c2e350823a5275b9d7d15238dbe6acd197c30c0b6cbbf37782c247d14984e1015a109431e4180d76af6 + checksum: 10c0/d8ed135c56a15be10822053490b22a4f32ca912deca2c6d3c93a8fec32572842af84d762f0d2ed142b99f1e8251d97402aed9ce9950ef3dc0a8c90e4e1e459fc languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.41.0": - version: 8.41.0 - resolution: "@typescript-eslint/type-utils@npm:8.41.0" +"@typescript-eslint/type-utils@npm:8.46.4": + version: 8.46.4 + resolution: "@typescript-eslint/type-utils@npm:8.46.4" dependencies: - "@typescript-eslint/types": "npm:8.41.0" - "@typescript-eslint/typescript-estree": "npm:8.41.0" - "@typescript-eslint/utils": "npm:8.41.0" + "@typescript-eslint/types": "npm:8.46.4" + "@typescript-eslint/typescript-estree": "npm:8.46.4" + "@typescript-eslint/utils": "npm:8.46.4" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.1.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/d4f9ae07a30f1cf331c3e3a67f8749b38f199ba5000f7a600492c27f6bec774f15c3553f293c520fb999fb88108665f2785d5261daec1445b17af14a7bb0bfac + checksum: 10c0/d4e08a2d2d66b92a93a45c6efd1df272612982ac27204df9a989371f3a7d6eb5a069fc9898ca5b3a5ad70e2df1bc97e77b1f548e229608605b1a1cb33abc2c95 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.41.0, @typescript-eslint/types@npm:^8.41.0": - version: 8.41.0 - resolution: "@typescript-eslint/types@npm:8.41.0" - checksum: 10c0/4945a7ed7789e0527833ee378b962416d6d0d61eb6c891fe49cb6c8dc8a9adbfc58676080ca767a1f034f74f9a981caf5f4d4706cba5025c0520a801fb45d7e1 +"@typescript-eslint/types@npm:8.46.4, @typescript-eslint/types@npm:^8.46.4": + version: 8.46.4 + resolution: "@typescript-eslint/types@npm:8.46.4" + checksum: 10c0/b92166dd9b6d8e4cf0a6a90354b6e94af8542d8ab341aed3955990e6599db7a583af638e22909a1417e41fd8a0ef5861c5ba12ad84b307c27d26f3e0c5e2020f languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.41.0": - version: 8.41.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.41.0" +"@typescript-eslint/typescript-estree@npm:8.46.4": + version: 8.46.4 + resolution: "@typescript-eslint/typescript-estree@npm:8.46.4" dependencies: - "@typescript-eslint/project-service": "npm:8.41.0" - "@typescript-eslint/tsconfig-utils": "npm:8.41.0" - "@typescript-eslint/types": "npm:8.41.0" - "@typescript-eslint/visitor-keys": "npm:8.41.0" + "@typescript-eslint/project-service": "npm:8.46.4" + "@typescript-eslint/tsconfig-utils": "npm:8.46.4" + "@typescript-eslint/types": "npm:8.46.4" + "@typescript-eslint/visitor-keys": "npm:8.46.4" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -3131,48 +3041,48 @@ __metadata: ts-api-utils: "npm:^2.1.0" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/e86233d895403ec4986ced25f56898b2704a84545bb7dfe933f5c64f2ab969dcb7ada7e21ea7e015c875cc94a0767e70573442724960c631b7b3fc556a984c9c + checksum: 10c0/e115dbd8580801e9b8892a19056ccb91e7c912b587b22ee5a9b7ec03547eff89ad18ea18a31210ea779cf9f4ccec9428f98b62151c26709e19e7adbdd5ca990b languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.41.0, @typescript-eslint/utils@npm:^8.37.0": - version: 8.41.0 - resolution: "@typescript-eslint/utils@npm:8.41.0" +"@typescript-eslint/utils@npm:8.46.4, @typescript-eslint/utils@npm:^8.44.1": + version: 8.46.4 + resolution: "@typescript-eslint/utils@npm:8.46.4" dependencies: "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.41.0" - "@typescript-eslint/types": "npm:8.41.0" - "@typescript-eslint/typescript-estree": "npm:8.41.0" + "@typescript-eslint/scope-manager": "npm:8.46.4" + "@typescript-eslint/types": "npm:8.46.4" + "@typescript-eslint/typescript-estree": "npm:8.46.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/3a2ed9b5f801afeccde44dbacdeae0b9c82cc3e1af5e92926929ad86384dc0fb0027152e68c5edfabe904647c2160c0c45ec9c848a8d67c3efb86b78a1343acb + checksum: 10c0/6e4f4d51113f74edcfc83b135c73edf7c46919895659c2e7d5945ab084bc051ed5f980918d23a941d1a9f96a38c8ddc22c12b5aafa8e35ef3bb9d9c6b00b6c79 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.41.0": - version: 8.41.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.41.0" +"@typescript-eslint/visitor-keys@npm:8.46.4": + version: 8.46.4 + resolution: "@typescript-eslint/visitor-keys@npm:8.46.4" dependencies: - "@typescript-eslint/types": "npm:8.41.0" + "@typescript-eslint/types": "npm:8.46.4" eslint-visitor-keys: "npm:^4.2.1" - checksum: 10c0/cfe52e77b9e07c23a4d9f4adf9e6bf27822e58694c9a34fefa4b9fc96d553e9df561971c4da5fc78392522e34696fc1149a76f6a02c328136771c5efe0fd1029 + checksum: 10c0/35dd6aa2b53fc3f4f214e9edf730cc69d0eb9f77ffd978354d092feda7358e60052e15d891fa8577e9ebee5fdea8083e02fe286dd3a96bbafcb1305dce15b80c languageName: node linkType: hard "@vitejs/plugin-react@npm:^5.0.2": - version: 5.0.2 - resolution: "@vitejs/plugin-react@npm:5.0.2" + version: 5.1.1 + resolution: "@vitejs/plugin-react@npm:5.1.1" dependencies: - "@babel/core": "npm:^7.28.3" + "@babel/core": "npm:^7.28.5" "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" - "@rolldown/pluginutils": "npm:1.0.0-beta.34" + "@rolldown/pluginutils": "npm:1.0.0-beta.47" "@types/babel__core": "npm:^7.20.5" - react-refresh: "npm:^0.17.0" + react-refresh: "npm:^0.18.0" peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/6b02478498d8095b4c5b688b457f8ff35c3274489399f79cf412c2d68213c5e7796d245de27093ccf91b4fb4b644a31e9a759d91caa1ba62da105be3875fc6dd + checksum: 10c0/e590efaea1eabfbb1beb6e8c9fac0742fd299808e3368e63b2825ce24740adb8a28fcb2668b14b7ca1bdb42890cfefe94d02dd358dcbbf8a27ddf377b9a82abf languageName: node linkType: hard @@ -3325,10 +3235,10 @@ __metadata: languageName: unknown linkType: soft -"abbrev@npm:^3.0.0": - version: 3.0.1 - resolution: "abbrev@npm:3.0.1" - checksum: 10c0/21ba8f574ea57a3106d6d35623f2c4a9111d9ee3e9a5be47baed46ec2457d2eac46e07a5c4a60186f88cb98abbe3e24f2d4cca70bc2b12f1692523e2209a9ccf +"abbrev@npm:^4.0.0": + version: 4.0.0 + resolution: "abbrev@npm:4.0.0" + checksum: 10c0/b4cc16935235e80702fc90192e349e32f8ef0ed151ef506aa78c81a7c455ec18375c4125414b99f84b2e055199d66383e787675f0bcd87da7a4dbd59f9eac1d5 languageName: node linkType: hard @@ -3341,15 +3251,6 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.14.1": - version: 8.14.1 - resolution: "acorn@npm:8.14.1" - bin: - acorn: bin/acorn - checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 - languageName: node - linkType: hard - "acorn@npm:^8.15.0": version: 8.15.0 resolution: "acorn@npm:8.15.0" @@ -3360,9 +3261,9 @@ __metadata: linkType: hard "agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe languageName: node linkType: hard @@ -3378,15 +3279,6 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.3.2": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: "npm:^0.21.3" - checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 - languageName: node - linkType: hard - "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -3395,9 +3287,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f languageName: node linkType: hard @@ -3418,16 +3310,16 @@ __metadata: linkType: hard "ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 languageName: node linkType: hard -"ansis@npm:^3.11.0": - version: 3.17.0 - resolution: "ansis@npm:3.17.0" - checksum: 10c0/d8fa94ca7bb91e7e5f8a7d323756aa075facce07c5d02ca883673e128b2873d16f93e0dec782f98f1eeb1f2b3b4b7b60dcf0ad98fb442e75054fe857988cc5cb +"ansis@npm:^4.1.0": + version: 4.2.0 + resolution: "ansis@npm:4.2.0" + checksum: 10c0/cd6a7a681ecd36e72e0d79c1e34f1f3bcb1b15bcbb6f0f8969b4228062d3bfebbef468e09771b00d93b2294370b34f707599d4a113542a876de26823b795b5d2 languageName: node linkType: hard @@ -3449,11 +3341,11 @@ __metadata: linkType: hard "aria-hidden@npm:^1.2.4": - version: 1.2.4 - resolution: "aria-hidden@npm:1.2.4" + version: 1.2.6 + resolution: "aria-hidden@npm:1.2.6" dependencies: tslib: "npm:^2.0.0" - checksum: 10c0/8abcab2e1432efc4db415e97cb3959649ddf52c8fc815d7384f43f3d3abf56f1c12852575d00df9a8927f421d7e0712652dd5f8db244ea57634344e29ecfc74a + checksum: 10c0/7720cb539497a9f760f68f98a4b30f22c6767aa0e72fa7d58279f7c164e258fc38b2699828f8de881aab0fc8e9c56d1313a3f1a965046fc0381a554dbc72b54a languageName: node linkType: hard @@ -3480,14 +3372,23 @@ __metadata: languageName: node linkType: hard +"ast-types@npm:^0.16.1": + version: 0.16.1 + resolution: "ast-types@npm:0.16.1" + dependencies: + tslib: "npm:^2.0.1" + checksum: 10c0/abcc49e42eb921a7ebc013d5bec1154651fb6dbc3f497541d488859e681256901b2990b954d530ba0da4d0851271d484f7057d5eff5e07cb73e8b10909f711bf + languageName: node + linkType: hard + "ast-v8-to-istanbul@npm:^0.3.3": - version: 0.3.4 - resolution: "ast-v8-to-istanbul@npm:0.3.4" + version: 0.3.8 + resolution: "ast-v8-to-istanbul@npm:0.3.8" dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.29" + "@jridgewell/trace-mapping": "npm:^0.3.31" estree-walker: "npm:^3.0.3" js-tokens: "npm:^9.0.1" - checksum: 10c0/01b67bf9b4972a3cb8be35dffd466f1a9da91901b6df47e1157d3c6cf0f104a583443a54bbce7ca033608ac8b556886bc8b94f0f559242bac3244fadf86af9a8 + checksum: 10c0/6f7d74fc36011699af6d4ad88ecd8efc7d74bd90b8e8dbb1c69d43c8f4bec0ed361fb62a5b5bd98bbee02ee87c62cd8bcc25a39634964e45476bf5489dfa327f languageName: node linkType: hard @@ -3510,6 +3411,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.8.25": + version: 2.8.28 + resolution: "baseline-browser-mapping@npm:2.8.28" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 10c0/d157d73de33bff69cf3413983dc1b2421063cd1c895e9edabc22dcb6667f7e17762b46ebeee5eee7496271351754c12750867c6ea5cb432f1bbe33dc5c62d1e6 + languageName: node + linkType: hard + "binary-extensions@npm:^2.0.0": version: 2.3.0 resolution: "binary-extensions@npm:2.3.0" @@ -3528,11 +3438,11 @@ __metadata: linkType: hard "brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" + version: 2.0.2 + resolution: "brace-expansion@npm:2.0.2" dependencies: balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + checksum: 10c0/6d117a4c793488af86b83172deb6af143e94c17bc53b0b3cec259733923b4ca84679d506ac261f4ba3c7ed37c46018e2ff442f9ce453af8643ecd64f4a54e6cf languageName: node linkType: hard @@ -3546,16 +3456,17 @@ __metadata: linkType: hard "browserslist@npm:^4.24.0": - version: 4.24.4 - resolution: "browserslist@npm:4.24.4" - dependencies: - caniuse-lite: "npm:^1.0.30001688" - electron-to-chromium: "npm:^1.5.73" - node-releases: "npm:^2.0.19" - update-browserslist-db: "npm:^1.1.1" + version: 4.28.0 + resolution: "browserslist@npm:4.28.0" + dependencies: + baseline-browser-mapping: "npm:^2.8.25" + caniuse-lite: "npm:^1.0.30001754" + electron-to-chromium: "npm:^1.5.249" + node-releases: "npm:^2.0.27" + update-browserslist-db: "npm:^1.1.4" bin: browserslist: cli.js - checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 + checksum: 10c0/4284fd568f7d40a496963083860d488cb2a89fb055b6affd316bebc59441fec938e090b3e62c0ee065eb0bc88cd1bc145f4300a16c75f3f565621c5823715ae1 languageName: node linkType: hard @@ -3566,23 +3477,22 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^19.0.1": - version: 19.0.1 - resolution: "cacache@npm:19.0.1" +"cacache@npm:^20.0.1": + version: 20.0.1 + resolution: "cacache@npm:20.0.1" dependencies: "@npmcli/fs": "npm:^4.0.0" fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" + glob: "npm:^11.0.3" + lru-cache: "npm:^11.1.0" minipass: "npm:^7.0.3" minipass-collect: "npm:^2.0.1" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" p-map: "npm:^7.0.2" ssri: "npm:^12.0.0" - tar: "npm:^7.4.3" unique-filename: "npm:^4.0.0" - checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c + checksum: 10c0/e3efcf3af1c984e6e59e03372d9289861736a572e6e05b620606b87a67e71d04cff6dbc99607801cb21bcaae1fb4fb84d4cc8e3fda725e95881329ef03dac602 languageName: node linkType: hard @@ -3593,27 +3503,27 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001713 - resolution: "caniuse-lite@npm:1.0.30001713" - checksum: 10c0/f5468abfe73ce30e29cc8bde2ea67df2aab69032bdd93345e0640efefb76b7901c84fe1d28d591a797e65fe52fc24cae97060bb5552f9f9740322aff95ce2f9d +"caniuse-lite@npm:^1.0.30001754": + version: 1.0.30001754 + resolution: "caniuse-lite@npm:1.0.30001754" + checksum: 10c0/d38709ab11abc36eea28068d241434eba925c4d3462916ccaa17a34a6227dfdeb58ab0e1eb614bab12fb393c7d527db392a0f477b48c33d70d8e466954f381ba languageName: node linkType: hard "chai@npm:^5.2.0": - version: 5.2.0 - resolution: "chai@npm:5.2.0" + version: 5.3.3 + resolution: "chai@npm:5.3.3" dependencies: assertion-error: "npm:^2.0.1" check-error: "npm:^2.1.1" deep-eql: "npm:^5.0.1" loupe: "npm:^3.1.0" pathval: "npm:^2.0.0" - checksum: 10c0/dfd1cb719c7cebb051b727672d382a35338af1470065cb12adb01f4ee451bbf528e0e0f9ab2016af5fc1eea4df6e7f4504dc8443f8f00bd8fb87ad32dc516f7d + checksum: 10c0/b360fd4d38861622e5010c2f709736988b05c7f31042305fa3f4e9911f6adb80ccfb4e302068bf8ed10e835c2e2520cba0f5edc13d878b886987e5aa62483f53 languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0": +"chalk@npm:^4.0.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -3720,10 +3630,17 @@ __metadata: languageName: node linkType: hard -"cookie@npm:^0.7.2": - version: 0.7.2 - resolution: "cookie@npm:0.7.2" - checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 +"cookie-es@npm:^2.0.0": + version: 2.0.0 + resolution: "cookie-es@npm:2.0.0" + checksum: 10c0/3b2459030a5ad2bc715aeb27a32f274340670bfc5031ac29e1fba804212517411bb617880d3fe66ace2b64dfb28f3049e2d1ff40d4bec342154ccdd124deaeaa + languageName: node + linkType: hard + +"cookie@npm:^1.0.2": + version: 1.0.2 + resolution: "cookie@npm:1.0.2" + checksum: 10c0/fd25fe79e8fbcfcaf6aa61cd081c55d144eeeba755206c058682257cb38c4bd6795c6620de3f064c740695bb65b7949ebb1db7a95e4636efb8357a335ad3f54b languageName: node linkType: hard @@ -3746,19 +3663,19 @@ __metadata: linkType: hard "cssstyle@npm:^4.2.1": - version: 4.3.0 - resolution: "cssstyle@npm:4.3.0" + version: 4.6.0 + resolution: "cssstyle@npm:4.6.0" dependencies: - "@asamuzakjp/css-color": "npm:^3.1.1" + "@asamuzakjp/css-color": "npm:^3.2.0" rrweb-cssom: "npm:^0.8.0" - checksum: 10c0/770ccb288a99257fd0d5b129e03878f848e922d3b017358acb02e8dd530e8f0c7c6f74e6ae5367d715e2da36a490a734b4177fc1b78f3f08eca25f204a56a692 + checksum: 10c0/71add1b0ffafa1bedbef6855db6189b9523d3320e015a0bf3fbd504760efb9a81e1f1a225228d5fa892ee58e56d06994ca372e7f4e461cda7c4c9985fe075f65 languageName: node linkType: hard -"csstype@npm:^3.0.2, csstype@npm:^3.1.0, csstype@npm:^3.1.3": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 +"csstype@npm:^3.0.2, csstype@npm:^3.1.3": + version: 3.2.0 + resolution: "csstype@npm:3.2.0" + checksum: 10c0/119715d732d05db0da3b71f602448135b007127073cdda47b69e9d5599475e4aa0f6a15c5f0cdd3f3b1f17251c54adc3c8a516e7358f7fb4cfc51cc6eaf89ded languageName: node linkType: hard @@ -3872,27 +3789,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": - version: 4.4.0 - resolution: "debug@npm:4.4.0" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.1": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de - languageName: node - linkType: hard - -"debug@npm:^4.4.1": - version: 4.4.1 - resolution: "debug@npm:4.4.1" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 languageName: node linkType: hard @@ -3904,9 +3809,9 @@ __metadata: linkType: hard "decimal.js@npm:^10.5.0": - version: 10.5.0 - resolution: "decimal.js@npm:10.5.0" - checksum: 10c0/785c35279df32762143914668df35948920b6c1c259b933e0519a69b7003fc0a5ed2a766b1e1dda02574450c566b21738a45f15e274b47c2ac02072c0d1f3ac3 + version: 10.6.0 + resolution: "decimal.js@npm:10.6.0" + checksum: 10c0/07d69fbcc54167a340d2d97de95f546f9ff1f69d2b45a02fd7a5292412df3cd9eb7e23065e532a318f5474a2e1bccf8392fdf0443ef467f97f3bf8cb0477e5aa languageName: node linkType: hard @@ -3932,16 +3837,9 @@ __metadata: linkType: hard "detect-libc@npm:^2.0.3": - version: 2.0.3 - resolution: "detect-libc@npm:2.0.3" - checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.4": - version: 2.0.4 - resolution: "detect-libc@npm:2.0.4" - checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 languageName: node linkType: hard @@ -3952,10 +3850,10 @@ __metadata: languageName: node linkType: hard -"diff@npm:^7.0.0": - version: 7.0.0 - resolution: "diff@npm:7.0.0" - checksum: 10c0/251fd15f85ffdf814cfc35a728d526b8d2ad3de338dcbd011ac6e57c461417090766b28995f8ff733135b5fbc3699c392db1d5e27711ac4e00244768cd1d577b +"diff@npm:^8.0.2": + version: 8.0.2 + resolution: "diff@npm:8.0.2" + checksum: 10c0/abfb387f033e089df3ec3be960205d17b54df8abf0924d982a7ced3a94c557a4e6cbff2e78b121f216b85f466b3d8d041673a386177c311aaea41459286cc9bc languageName: node linkType: hard @@ -3990,10 +3888,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.73": - version: 1.5.137 - resolution: "electron-to-chromium@npm:1.5.137" - checksum: 10c0/678613e0a3d023563a1acca4d8103a69d389168efeb3b78c1fcc683ed0778d81bfb00c6f621d6535f3fa9530664fc948fc8f2ed27e7548d46cd3987d4b0add6a +"electron-to-chromium@npm:^1.5.249": + version: 1.5.252 + resolution: "electron-to-chromium@npm:1.5.252" + checksum: 10c0/a42b164689d4230f1ab8a5e87183b58f5a96e123d2b7b680ca3a94734a04cf6cc4198e813473674ed626623a0cb7cb3ece42373c712a1afc340117ff85845b0f languageName: node linkType: hard @@ -4030,10 +3928,10 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.5.0": - version: 4.5.0 - resolution: "entities@npm:4.5.0" - checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414 languageName: node linkType: hard @@ -4059,34 +3957,35 @@ __metadata: linkType: hard "esbuild@npm:^0.25.0, esbuild@npm:~0.25.0": - version: 0.25.2 - resolution: "esbuild@npm:0.25.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.25.2" - "@esbuild/android-arm": "npm:0.25.2" - "@esbuild/android-arm64": "npm:0.25.2" - "@esbuild/android-x64": "npm:0.25.2" - "@esbuild/darwin-arm64": "npm:0.25.2" - "@esbuild/darwin-x64": "npm:0.25.2" - "@esbuild/freebsd-arm64": "npm:0.25.2" - "@esbuild/freebsd-x64": "npm:0.25.2" - "@esbuild/linux-arm": "npm:0.25.2" - "@esbuild/linux-arm64": "npm:0.25.2" - "@esbuild/linux-ia32": "npm:0.25.2" - "@esbuild/linux-loong64": "npm:0.25.2" - "@esbuild/linux-mips64el": "npm:0.25.2" - "@esbuild/linux-ppc64": "npm:0.25.2" - "@esbuild/linux-riscv64": "npm:0.25.2" - "@esbuild/linux-s390x": "npm:0.25.2" - "@esbuild/linux-x64": "npm:0.25.2" - "@esbuild/netbsd-arm64": "npm:0.25.2" - "@esbuild/netbsd-x64": "npm:0.25.2" - "@esbuild/openbsd-arm64": "npm:0.25.2" - "@esbuild/openbsd-x64": "npm:0.25.2" - "@esbuild/sunos-x64": "npm:0.25.2" - "@esbuild/win32-arm64": "npm:0.25.2" - "@esbuild/win32-ia32": "npm:0.25.2" - "@esbuild/win32-x64": "npm:0.25.2" + version: 0.25.12 + resolution: "esbuild@npm:0.25.12" + dependencies: + "@esbuild/aix-ppc64": "npm:0.25.12" + "@esbuild/android-arm": "npm:0.25.12" + "@esbuild/android-arm64": "npm:0.25.12" + "@esbuild/android-x64": "npm:0.25.12" + "@esbuild/darwin-arm64": "npm:0.25.12" + "@esbuild/darwin-x64": "npm:0.25.12" + "@esbuild/freebsd-arm64": "npm:0.25.12" + "@esbuild/freebsd-x64": "npm:0.25.12" + "@esbuild/linux-arm": "npm:0.25.12" + "@esbuild/linux-arm64": "npm:0.25.12" + "@esbuild/linux-ia32": "npm:0.25.12" + "@esbuild/linux-loong64": "npm:0.25.12" + "@esbuild/linux-mips64el": "npm:0.25.12" + "@esbuild/linux-ppc64": "npm:0.25.12" + "@esbuild/linux-riscv64": "npm:0.25.12" + "@esbuild/linux-s390x": "npm:0.25.12" + "@esbuild/linux-x64": "npm:0.25.12" + "@esbuild/netbsd-arm64": "npm:0.25.12" + "@esbuild/netbsd-x64": "npm:0.25.12" + "@esbuild/openbsd-arm64": "npm:0.25.12" + "@esbuild/openbsd-x64": "npm:0.25.12" + "@esbuild/openharmony-arm64": "npm:0.25.12" + "@esbuild/sunos-x64": "npm:0.25.12" + "@esbuild/win32-arm64": "npm:0.25.12" + "@esbuild/win32-ia32": "npm:0.25.12" + "@esbuild/win32-x64": "npm:0.25.12" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -4130,6 +4029,8 @@ __metadata: optional: true "@esbuild/openbsd-x64": optional: true + "@esbuild/openharmony-arm64": + optional: true "@esbuild/sunos-x64": optional: true "@esbuild/win32-arm64": @@ -4140,7 +4041,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/87ce0b78699c4d192b8cf7e9b688e9a0da10e6f58ff85a368bf3044ca1fa95626c98b769b5459352282e0065585b6f994a5e6699af5cccf9d31178960e2b58fd + checksum: 10c0/c205357531423220a9de8e1e6c6514242bc9b1666e762cd67ccdf8fdfdc3f1d0bd76f8d9383958b97ad4c953efdb7b6e8c1f9ca5951cd2b7c5235e8755b34a6b languageName: node linkType: hard @@ -4168,11 +4069,11 @@ __metadata: linkType: hard "eslint-plugin-react-refresh@npm:^0.4.20": - version: 0.4.20 - resolution: "eslint-plugin-react-refresh@npm:0.4.20" + version: 0.4.24 + resolution: "eslint-plugin-react-refresh@npm:0.4.24" peerDependencies: eslint: ">=8.40" - checksum: 10c0/2ccf4ba28f1dcbcb9e773e46eae1e61e568bba69281a700eb26fd762152e4e90a78c991f9c8173342a7cd2a82f3f52fedb40a1e81360cef9c40ea5b814fa3613 + checksum: 10c0/7471a25663cdec2886b5aec53cff6319475a6704616f96db4eef7ada3cba1236abeb71b4c2db6396e48a3a8a3a416a0266b2eac06bb6ef77d8b5674604ece7fb languageName: node linkType: hard @@ -4201,22 +4102,21 @@ __metadata: linkType: hard "eslint@npm:^9.34.0": - version: 9.34.0 - resolution: "eslint@npm:9.34.0" + version: 9.39.1 + resolution: "eslint@npm:9.39.1" dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/eslint-utils": "npm:^4.8.0" "@eslint-community/regexpp": "npm:^4.12.1" - "@eslint/config-array": "npm:^0.21.0" - "@eslint/config-helpers": "npm:^0.3.1" - "@eslint/core": "npm:^0.15.2" + "@eslint/config-array": "npm:^0.21.1" + "@eslint/config-helpers": "npm:^0.4.2" + "@eslint/core": "npm:^0.17.0" "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.34.0" - "@eslint/plugin-kit": "npm:^0.3.5" + "@eslint/js": "npm:9.39.1" + "@eslint/plugin-kit": "npm:^0.4.1" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.4.2" "@types/estree": "npm:^1.0.6" - "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.6" @@ -4246,7 +4146,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/ba3e54fa0c8ed23d062f91519afaae77fed922a6c4d76130b6cd32154bcb406aaea4b3c5ed88e0be40828c1d5b6921592f3947dbdc5e2043de6bd7aa341fe5ea + checksum: 10c0/59b2480639404ba24578ca480f973683b87b7aac8aa7e349240474a39067804fd13cd8b9cb22fee074170b8c7c563b57bab703ec0f0d3f81ea017e5d2cad299d languageName: node linkType: hard @@ -4261,6 +4161,16 @@ __metadata: languageName: node linkType: hard +"esprima@npm:~4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + "esquery@npm:^1.5.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" @@ -4317,16 +4227,16 @@ __metadata: linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.2 - resolution: "exponential-backoff@npm:3.1.2" - checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 languageName: node linkType: hard "fake-indexeddb@npm:^6.2.2": - version: 6.2.2 - resolution: "fake-indexeddb@npm:6.2.2" - checksum: 10c0/5ad98f05beb22d8591af1bcf8500d1a92d9a17b3e2c380dfa669770b4fecdbadc1ccd9c8ba5429a92a30fd2562f6ab24238992522a8574ffd365d7b809677f0a + version: 6.2.5 + resolution: "fake-indexeddb@npm:6.2.5" + checksum: 10c0/6c5e2fe84a61daa06d7ad63699d1041fe61847f15f92db12415634b3db94f363a64be9e08a3c3c4434af9c3c0132086b85c4d5dc5e8e06edae1e7daf70ce1f3c languageName: node linkType: hard @@ -4338,9 +4248,9 @@ __metadata: linkType: hard "fast-equals@npm:^5.0.1": - version: 5.2.2 - resolution: "fast-equals@npm:5.2.2" - checksum: 10c0/2bfeac6317a8959a00e2134749323557e5df6dea3af24e4457297733eace8ce4313fcbca2cf4532f3a6792607461e80442cd8d3af148d5c2e4e98ad996d6e5b5 + version: 5.3.3 + resolution: "fast-equals@npm:5.3.3" + checksum: 10c0/a186cbfe4d9171911af9c6bb02d059e28bc177f66527790bf95d35a08f6f070033caea5755d2bbf2ce7af56374c1d4d854ee8184f9e906e3e01b54dbd09c414c languageName: node linkType: hard @@ -4380,19 +4290,7 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.4.3": - version: 6.4.3 - resolution: "fdir@npm:6.4.3" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 10c0/d13c10120e9625adf21d8d80481586200759928c19405a816b77dd28eaeb80e7c59c5def3e2941508045eb06d34eb47fad865ccc8bf98e6ab988bb0ed160fb6f - languageName: node - linkType: hard - -"fdir@npm:^6.4.4, fdir@npm:^6.5.0": +"fdir@npm:^6.5.0": version: 6.5.0 resolution: "fdir@npm:6.5.0" peerDependencies: @@ -4449,7 +4347,7 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^3.1.0": +"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.1": version: 3.3.1 resolution: "foreground-child@npm:3.3.1" dependencies: @@ -4460,10 +4358,10 @@ __metadata: linkType: hard "framer-motion@npm:^12.23.12": - version: 12.23.12 - resolution: "framer-motion@npm:12.23.12" + version: 12.23.24 + resolution: "framer-motion@npm:12.23.24" dependencies: - motion-dom: "npm:^12.23.12" + motion-dom: "npm:^12.23.23" motion-utils: "npm:^12.23.6" tslib: "npm:^2.4.0" peerDependencies: @@ -4477,7 +4375,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10c0/40dfb57bf714075c4f6dd0bbe5b84dd11310114474ebf603846ef9b888ed475fa653271c1fd98ec57a6a1d0b781cdf8b3ebcd5e2c6a3620e934b46304ae0fd39 + checksum: 10c0/716addd9fa85dd2c1475ab848e14c4e6d3246ced041de84afc19b1d6534c897256c8f2878864cf057039116e56f5ca1b87a4cbb943f0b1cf37199ef7174c3cf8 languageName: node linkType: hard @@ -4531,11 +4429,11 @@ __metadata: linkType: hard "get-tsconfig@npm:^4.7.5": - version: 4.10.0 - resolution: "get-tsconfig@npm:4.10.0" + version: 4.13.0 + resolution: "get-tsconfig@npm:4.13.0" dependencies: resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/c9b5572c5118923c491c04285c73bd55b19e214992af957c502a3be0fc0043bb421386ffd45ca3433c0a7fba81221ca300479e8393960acf15d0ed4563f38a86 + checksum: 10c0/2c49ef8d3907047a107f229fd610386fe3b7fe9e42dfd6b42e7406499493cdda8c62e83e57e8d7a98125610774b9f604d3a0ff308d7f9de5c7ac6d1b07cb6036 languageName: node linkType: hard @@ -4557,7 +4455,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.4.1": +"glob@npm:^10.4.1": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -4573,10 +4471,19 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 +"glob@npm:^11.0.3": + version: 11.0.3 + resolution: "glob@npm:11.0.3" + dependencies: + foreground-child: "npm:^3.3.1" + jackspeak: "npm:^4.1.1" + minimatch: "npm:^10.0.3" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/7d24457549ec2903920dfa3d8e76850e7c02aa709122f0164b240c712f5455c0b457e6f2a1eee39344c6148e39895be8094ae8cfef7ccc3296ed30bce250c661 languageName: node linkType: hard @@ -4588,18 +4495,18 @@ __metadata: linkType: hard "globals@npm:^16.3.0": - version: 16.3.0 - resolution: "globals@npm:16.3.0" - checksum: 10c0/c62dc20357d1c0bf2be4545d6c4141265d1a229bf1c3294955efb5b5ef611145391895e3f2729f8603809e81b30b516c33e6c2597573844449978606aad6eb38 + version: 16.5.0 + resolution: "globals@npm:16.5.0" + checksum: 10c0/615241dae7851c8012f5aa0223005b1ed6607713d6813de0741768bd4ddc39353117648f1a7086b4b0fa45eae733f1c0a0fe369aa4e543bb63f8de8990178ea9 languageName: node linkType: hard "goober@npm:^2.1.16": - version: 2.1.16 - resolution: "goober@npm:2.1.16" + version: 2.1.18 + resolution: "goober@npm:2.1.18" peerDependencies: csstype: ^3.0.10 - checksum: 10c0/f4c8256bf9c27873d47c1443f348779ac7f322516cb80a5dc647a6ebe790ce6bb9d3f487a0fb8be0b583fb96b9b2f6b7463f7fea3cd680306f95fa6fc9db1f6a + checksum: 10c0/de9bf7b6f57417900afac81a479b85d8c0bcb0322ba8b174f9287d10e7891ba7e33db5fe2b0cdd75281c69130e76eb0c694345acf45ea57e4e4a2db8e4c4f021 languageName: node linkType: hard @@ -4625,9 +4532,9 @@ __metadata: linkType: hard "graphql@npm:^16.8.1": - version: 16.10.0 - resolution: "graphql@npm:16.10.0" - checksum: 10c0/303730675538c8bd6c76b447dc6f03e61242e2d2596b408c34759666ec4877409e5593a7a0467d590ac5407b8c663b093b599556a77f24f281abea69ddc53de6 + version: 16.12.0 + resolution: "graphql@npm:16.12.0" + checksum: 10c0/b6fffa4e8a4e4a9933ebe85e7470b346dbf49050c1a482fac5e03e4a1a7bed2ecd3a4c97e29f04457af929464bc5e4f2aac991090c2f320111eef26e902a5c75 languageName: node linkType: hard @@ -4662,9 +4569,9 @@ __metadata: linkType: hard "http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 languageName: node linkType: hard @@ -4712,15 +4619,9 @@ __metadata: linkType: hard "immer@npm:^10.1.3": -<<<<<<< HEAD - version: 10.1.3 - resolution: "immer@npm:10.1.3" - checksum: 10c0/b3929022c1999935c9c5e9491fce20d883c15a04072628056f3b8c51a63ac0876d1c1f25cec146e325c30c906bc7f15a636c29ed53156f0a3049150f152df4c8 -======= version: 10.2.0 resolution: "immer@npm:10.2.0" checksum: 10c0/35e66b0585b2aec4e85ae7a993f049405f170799ba89d79205bc3fdae2c5bdaa2b1d35f62803d8beee42b7e85c7f7315a6e93b6a5a510c5a46f03dbe63619e87 ->>>>>>> 557b2ee (Fix yarn) languageName: node linkType: hard @@ -4755,13 +4656,10 @@ __metadata: languageName: node linkType: hard -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc +"ip-address@npm:^10.0.1": + version: 10.1.0 + resolution: "ip-address@npm:10.1.0" + checksum: 10c0/0103516cfa93f6433b3bd7333fa876eb21263912329bfa47010af5e16934eeeff86f3d2ae700a3744a137839ddfad62b900c7a445607884a49b5d1e32a3d7566 languageName: node linkType: hard @@ -4818,6 +4716,13 @@ __metadata: languageName: node linkType: hard +"isbot@npm:^5.1.22": + version: 5.1.32 + resolution: "isbot@npm:5.1.32" + checksum: 10c0/e5aa9c5c92dae4879cf49956797c46ef77fa919230183cd6254628667ca5e22f15b24bc4d63b0e88cb96da3d7a51e33f847ef7114fa542e3e066f78178c8d97e + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -4862,12 +4767,12 @@ __metadata: linkType: hard "istanbul-reports@npm:^3.1.7": - version: 3.1.7 - resolution: "istanbul-reports@npm:3.1.7" + version: 3.2.0 + resolution: "istanbul-reports@npm:3.2.0" dependencies: html-escaper: "npm:^2.0.0" istanbul-lib-report: "npm:^3.0.0" - checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 + checksum: 10c0/d596317cfd9c22e1394f22a8d8ba0303d2074fe2e971887b32d870e4b33f8464b10f8ccbe6847808f7db485f084eba09e6c2ed706b3a978e4b52f07085b8f9bc languageName: node linkType: hard @@ -4884,12 +4789,21 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^2.5.1": - version: 2.5.1 - resolution: "jiti@npm:2.5.1" +"jackspeak@npm:^4.1.1": + version: 4.1.1 + resolution: "jackspeak@npm:4.1.1" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + checksum: 10c0/84ec4f8e21d6514db24737d9caf65361511f75e5e424980eebca4199f400874f45e562ac20fa8aeb1dd20ca2f3f81f0788b6e9c3e64d216a5794fd6f30e0e042 + languageName: node + linkType: hard + +"jiti@npm:^2.6.1": + version: 2.6.1 + resolution: "jiti@npm:2.6.1" bin: jiti: lib/jiti-cli.mjs - checksum: 10c0/f0a38d7d8842cb35ffe883038166aa2d52ffd21f1a4fc839ae4076ea7301c22a1f11373f8fc52e2667de7acde8f3e092835620dd6f72a0fbe9296b268b0874bb + checksum: 10c0/79b2e96a8e623f66c1b703b98ec1b8be4500e1d217e09b09e343471bbb9c105381b83edbb979d01cef18318cc45ce6e153571b6c83122170eefa531c64b6789b languageName: node linkType: hard @@ -4908,20 +4822,13 @@ __metadata: linkType: hard "js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" dependencies: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7 languageName: node linkType: hard @@ -4958,7 +4865,7 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^3.0.2, jsesc@npm:^3.1.0": +"jsesc@npm:^3.0.2": version: 3.1.0 resolution: "jsesc@npm:3.1.0" bin: @@ -5016,92 +4923,102 @@ __metadata: languageName: node linkType: hard -"lightningcss-darwin-arm64@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss-darwin-arm64@npm:1.30.1" +"lightningcss-android-arm64@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-android-arm64@npm:1.30.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-arm64@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-darwin-arm64@npm:1.30.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"lightningcss-darwin-x64@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss-darwin-x64@npm:1.30.1" +"lightningcss-darwin-x64@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-darwin-x64@npm:1.30.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"lightningcss-freebsd-x64@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss-freebsd-x64@npm:1.30.1" +"lightningcss-freebsd-x64@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-freebsd-x64@npm:1.30.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"lightningcss-linux-arm-gnueabihf@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss-linux-arm-gnueabihf@npm:1.30.1" +"lightningcss-linux-arm-gnueabihf@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.30.2" conditions: os=linux & cpu=arm languageName: node linkType: hard -"lightningcss-linux-arm64-gnu@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss-linux-arm64-gnu@npm:1.30.1" +"lightningcss-linux-arm64-gnu@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-linux-arm64-gnu@npm:1.30.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"lightningcss-linux-arm64-musl@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss-linux-arm64-musl@npm:1.30.1" +"lightningcss-linux-arm64-musl@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-linux-arm64-musl@npm:1.30.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"lightningcss-linux-x64-gnu@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss-linux-x64-gnu@npm:1.30.1" +"lightningcss-linux-x64-gnu@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-linux-x64-gnu@npm:1.30.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"lightningcss-linux-x64-musl@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss-linux-x64-musl@npm:1.30.1" +"lightningcss-linux-x64-musl@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-linux-x64-musl@npm:1.30.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"lightningcss-win32-arm64-msvc@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss-win32-arm64-msvc@npm:1.30.1" +"lightningcss-win32-arm64-msvc@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-win32-arm64-msvc@npm:1.30.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"lightningcss-win32-x64-msvc@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss-win32-x64-msvc@npm:1.30.1" +"lightningcss-win32-x64-msvc@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss-win32-x64-msvc@npm:1.30.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"lightningcss@npm:1.30.1": - version: 1.30.1 - resolution: "lightningcss@npm:1.30.1" +"lightningcss@npm:1.30.2": + version: 1.30.2 + resolution: "lightningcss@npm:1.30.2" dependencies: detect-libc: "npm:^2.0.3" - lightningcss-darwin-arm64: "npm:1.30.1" - lightningcss-darwin-x64: "npm:1.30.1" - lightningcss-freebsd-x64: "npm:1.30.1" - lightningcss-linux-arm-gnueabihf: "npm:1.30.1" - lightningcss-linux-arm64-gnu: "npm:1.30.1" - lightningcss-linux-arm64-musl: "npm:1.30.1" - lightningcss-linux-x64-gnu: "npm:1.30.1" - lightningcss-linux-x64-musl: "npm:1.30.1" - lightningcss-win32-arm64-msvc: "npm:1.30.1" - lightningcss-win32-x64-msvc: "npm:1.30.1" + lightningcss-android-arm64: "npm:1.30.2" + lightningcss-darwin-arm64: "npm:1.30.2" + lightningcss-darwin-x64: "npm:1.30.2" + lightningcss-freebsd-x64: "npm:1.30.2" + lightningcss-linux-arm-gnueabihf: "npm:1.30.2" + lightningcss-linux-arm64-gnu: "npm:1.30.2" + lightningcss-linux-arm64-musl: "npm:1.30.2" + lightningcss-linux-x64-gnu: "npm:1.30.2" + lightningcss-linux-x64-musl: "npm:1.30.2" + lightningcss-win32-arm64-msvc: "npm:1.30.2" + lightningcss-win32-x64-msvc: "npm:1.30.2" dependenciesMeta: + lightningcss-android-arm64: + optional: true lightningcss-darwin-arm64: optional: true lightningcss-darwin-x64: @@ -5122,7 +5039,7 @@ __metadata: optional: true lightningcss-win32-x64-msvc: optional: true - checksum: 10c0/1e1ad908f3c68bf39d964a6735435a8dd5474fb2765076732d64a7b6aa2af1f084da65a9462443a9adfebf7dcfb02fb532fce1d78697f2a9de29c8f40f09aee3 + checksum: 10c0/5c0c73a33946dab65908d5cd1325df4efa290efb77f940b60f40448b5ab9a87d3ea665ef9bcf00df4209705050ecf2f7ecc649f44d6dfa5905bb50f15717e78d languageName: node linkType: hard @@ -5160,27 +5077,27 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^3.1.0": - version: 3.1.3 - resolution: "loupe@npm:3.1.3" - checksum: 10c0/f5dab4144254677de83a35285be1b8aba58b3861439ce4ba65875d0d5f3445a4a496daef63100ccf02b2dbc25bf58c6db84c9cb0b96d6435331e9d0a33b48541 - languageName: node - linkType: hard - -"loupe@npm:^3.1.4": +"loupe@npm:^3.1.0, loupe@npm:^3.1.4": version: 3.2.1 resolution: "loupe@npm:3.2.1" checksum: 10c0/910c872cba291309664c2d094368d31a68907b6f5913e989d301b5c25f30e97d76d77f23ab3bf3b46d0f601ff0b6af8810c10c31b91d2c6b2f132809ca2cc705 languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": +"lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb languageName: node linkType: hard +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": + version: 11.2.2 + resolution: "lru-cache@npm:11.2.2" + checksum: 10c0/72d7831bbebc85e2bdefe01047ee5584db69d641c48d7a509e86f66f6ee111b30af7ec3bd68a967d47b69a4b1fa8bbf3872630bd06a63b6735e6f0a5f1c8e83d + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -5208,12 +5125,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.17": - version: 0.30.17 - resolution: "magic-string@npm:0.30.17" +"magic-string@npm:^0.30.17, magic-string@npm:^0.30.21": + version: 0.30.21 + resolution: "magic-string@npm:0.30.21" dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a languageName: node linkType: hard @@ -5237,22 +5154,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^14.0.3": - version: 14.0.3 - resolution: "make-fetch-happen@npm:14.0.3" +"make-fetch-happen@npm:^15.0.0": + version: 15.0.3 + resolution: "make-fetch-happen@npm:15.0.3" dependencies: - "@npmcli/agent": "npm:^3.0.0" - cacache: "npm:^19.0.1" + "@npmcli/agent": "npm:^4.0.0" + cacache: "npm:^20.0.1" http-cache-semantics: "npm:^4.1.1" minipass: "npm:^7.0.2" - minipass-fetch: "npm:^4.0.0" + minipass-fetch: "npm:^5.0.0" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" negotiator: "npm:^1.0.0" - proc-log: "npm:^5.0.0" + proc-log: "npm:^6.0.0" promise-retry: "npm:^2.0.1" - ssri: "npm:^12.0.0" - checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 + ssri: "npm:^13.0.0" + checksum: 10c0/525f74915660be60b616bcbd267c4a5b59481b073ba125e45c9c3a041bb1a47a2bd0ae79d028eb6f5f95bf9851a4158423f5068539c3093621abb64027e8e461 languageName: node linkType: hard @@ -5280,6 +5197,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.0.3": + version: 10.1.1 + resolution: "minimatch@npm:10.1.1" + dependencies: + "@isaacs/brace-expansion": "npm:^5.0.0" + checksum: 10c0/c85d44821c71973d636091fddbfbffe62370f5ee3caf0241c5b60c18cd289e916200acb2361b7e987558cd06896d153e25d505db9fc1e43e6b4b6752e2702902 + languageName: node + linkType: hard + "minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -5307,9 +5233,9 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^4.0.0": - version: 4.0.1 - resolution: "minipass-fetch@npm:4.0.1" +"minipass-fetch@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass-fetch@npm:5.0.0" dependencies: encoding: "npm:^0.1.13" minipass: "npm:^7.0.3" @@ -5318,7 +5244,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c + checksum: 10c0/9443aab5feab190972f84b64116e54e58dd87a58e62399cae0a4a7461b80568281039b7c3a38ba96453431ebc799d1e26999e548540156216729a4967cd5ef06 languageName: node linkType: hard @@ -5365,30 +5291,21 @@ __metadata: languageName: node linkType: hard -"minizlib@npm:^3.0.1": - version: 3.0.2 - resolution: "minizlib@npm:3.0.2" +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" dependencies: minipass: "npm:^7.1.2" - checksum: 10c0/9f3bd35e41d40d02469cb30470c55ccc21cae0db40e08d1d0b1dff01cc8cc89a6f78e9c5d2b7c844e485ec0a8abc2238111213fdc5b2038e6d1012eacf316f78 - languageName: node - linkType: hard - -"mkdirp@npm:^3.0.1": - version: 3.0.1 - resolution: "mkdirp@npm:3.0.1" - bin: - mkdirp: dist/cjs/src/bin.js - checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec languageName: node linkType: hard -"motion-dom@npm:^12.23.12": - version: 12.23.12 - resolution: "motion-dom@npm:12.23.12" +"motion-dom@npm:^12.23.23": + version: 12.23.23 + resolution: "motion-dom@npm:12.23.23" dependencies: motion-utils: "npm:^12.23.6" - checksum: 10c0/1b6a4b86c1aed5b5da7b8a5d1f8310ad169125235bdc1953b8c41cf9f4e2c460ee90bb48ffdae54daecb8db1d7006566ceb5f5c9ccdc82606d548c527cb2631e + checksum: 10c0/139705731085063519b88f23fcc5b1c13e15707a4ff3365da02ef9a4bf2a2d8ebed9a151c57e7f215ccd9e822365d93c16e28e619fbf25611f61dcff5ee81d75 languageName: node linkType: hard @@ -5414,26 +5331,26 @@ __metadata: linkType: hard "msw@npm:^2.7.4": - version: 2.7.4 - resolution: "msw@npm:2.7.4" + version: 2.12.1 + resolution: "msw@npm:2.12.1" dependencies: - "@bundled-es-modules/cookie": "npm:^2.0.1" - "@bundled-es-modules/statuses": "npm:^1.0.1" - "@bundled-es-modules/tough-cookie": "npm:^0.1.6" "@inquirer/confirm": "npm:^5.0.0" - "@mswjs/interceptors": "npm:^0.37.0" + "@mswjs/interceptors": "npm:^0.40.0" "@open-draft/deferred-promise": "npm:^2.2.0" - "@open-draft/until": "npm:^2.1.0" - "@types/cookie": "npm:^0.6.0" "@types/statuses": "npm:^2.0.4" + cookie: "npm:^1.0.2" graphql: "npm:^16.8.1" headers-polyfill: "npm:^4.0.2" is-node-process: "npm:^1.2.0" outvariant: "npm:^1.4.3" path-to-regexp: "npm:^6.3.0" picocolors: "npm:^1.1.1" + rettime: "npm:^0.7.0" + statuses: "npm:^2.0.2" strict-event-emitter: "npm:^0.5.1" + tough-cookie: "npm:^6.0.0" type-fest: "npm:^4.26.1" + until-async: "npm:^3.0.2" yargs: "npm:^17.7.2" peerDependencies: typescript: ">= 4.8.x" @@ -5442,7 +5359,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: 10c0/cbae966ebd7eb460b179dc2792ae710bd88647a17cb983af9c00cf1705146e885a86c7ff5ba12bb5320d1f335f09367b0097c53166c0e43c8554035649b96c41 + checksum: 10c0/822f4fc0cb2bdade39a67045d56b32fc7b15f30814a64c637a3c55d99358a4c1d61ed00d21fafafbbee320ad600e5a048d938b195e0cef5c59e016a040595176 languageName: node linkType: hard @@ -5453,7 +5370,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.11, nanoid@npm:^3.3.8": +"nanoid@npm:^3.3.11": version: 3.3.11 resolution: "nanoid@npm:3.3.11" bin: @@ -5477,40 +5394,40 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 11.2.0 - resolution: "node-gyp@npm:11.2.0" + version: 12.1.0 + resolution: "node-gyp@npm:12.1.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^14.0.3" - nopt: "npm:^8.0.0" - proc-log: "npm:^5.0.0" + make-fetch-happen: "npm:^15.0.0" + nopt: "npm:^9.0.0" + proc-log: "npm:^6.0.0" semver: "npm:^7.3.5" - tar: "npm:^7.4.3" + tar: "npm:^7.5.2" tinyglobby: "npm:^0.2.12" - which: "npm:^5.0.0" + which: "npm:^6.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/bd8d8c76b06be761239b0c8680f655f6a6e90b48e44d43415b11c16f7e8c15be346fba0cbf71588c7cdfb52c419d928a7d3db353afc1d952d19756237d8f10b9 + checksum: 10c0/f43efea8aaf0beb6b2f6184e533edad779b2ae38062953e21951f46221dd104006cc574154f2ad4a135467a5aae92c49e84ef289311a82e08481c5df0e8dc495 languageName: node linkType: hard -"node-releases@npm:^2.0.19": - version: 2.0.19 - resolution: "node-releases@npm:2.0.19" - checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa +"node-releases@npm:^2.0.27": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: 10c0/f1e6583b7833ea81880627748d28a3a7ff5703d5409328c216ae57befbced10ce2c991bea86434e8ec39003bd017f70481e2e5f8c1f7e0a7663241f81d6e00e2 languageName: node linkType: hard -"nopt@npm:^8.0.0": - version: 8.1.0 - resolution: "nopt@npm:8.1.0" +"nopt@npm:^9.0.0": + version: 9.0.0 + resolution: "nopt@npm:9.0.0" dependencies: - abbrev: "npm:^3.0.0" + abbrev: "npm:^4.0.0" bin: nopt: bin/nopt.js - checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef + checksum: 10c0/1822eb6f9b020ef6f7a7516d7b64a8036e09666ea55ac40416c36e4b2b343122c3cff0e2f085675f53de1d2db99a2a89a60ccea1d120bcd6a5347bf6ceb4a7fd languageName: node linkType: hard @@ -5522,9 +5439,9 @@ __metadata: linkType: hard "nwsapi@npm:^2.2.16": - version: 2.2.20 - resolution: "nwsapi@npm:2.2.20" - checksum: 10c0/07f4dafa3186aef7c007863e90acd4342a34ba9d44b22f14f644fdb311f6086887e21c2fc15efaa826c2bc39ab2bc841364a1a630e7c87e0cb723ba59d729297 + version: 2.2.22 + resolution: "nwsapi@npm:2.2.22" + checksum: 10c0/b6a0e5ea6754aacfdfe551c8c0f1b374eaf94d48b0a4e7eac666f879ecbc1892ef1d7c457e9b02eefad3fa1323ea1faebcba533eeab6582e24c9c503411bf879 languageName: node linkType: hard @@ -5575,9 +5492,9 @@ __metadata: linkType: hard "p-map@npm:^7.0.2": - version: 7.0.3 - resolution: "p-map@npm:7.0.3" - checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c + version: 7.0.4 + resolution: "p-map@npm:7.0.4" + checksum: 10c0/a5030935d3cb2919d7e89454d1ce82141e6f9955413658b8c9403cfe379283770ed3048146b44cde168aa9e8c716505f196d5689db0ae3ce9a71521a2fef3abd languageName: node linkType: hard @@ -5605,11 +5522,11 @@ __metadata: linkType: hard "parse5@npm:^7.2.1": - version: 7.2.1 - resolution: "parse5@npm:7.2.1" + version: 7.3.0 + resolution: "parse5@npm:7.3.0" dependencies: - entities: "npm:^4.5.0" - checksum: 10c0/829d37a0c709215a887e410a7118d754f8e1afd7edb529db95bc7bbf8045fb0266a7b67801331d8e8d9d073ea75793624ec27ce9ff3b96862c3b9008f4d68e80 + entities: "npm:^6.0.0" + checksum: 10c0/7fd2e4e247e85241d6f2a464d0085eed599a26d7b0a5233790c49f53473232eb85350e8133344d9b3fd58b89339e7ad7270fe1f89d28abe50674ec97b87f80b5 languageName: node linkType: hard @@ -5637,6 +5554,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.1 + resolution: "path-scurry@npm:2.0.1" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10c0/2a16ed0e81fbc43513e245aa5763354e25e787dab0d539581a6c3f0f967461a159ed6236b2559de23aa5b88e7dc32b469b6c47568833dd142a4b24b4f5cd2620 + languageName: node + linkType: hard + "path-to-regexp@npm:^6.3.0": version: 6.3.0 resolution: "path-to-regexp@npm:6.3.0" @@ -5652,13 +5579,13 @@ __metadata: linkType: hard "pathval@npm:^2.0.0": - version: 2.0.0 - resolution: "pathval@npm:2.0.0" - checksum: 10c0/602e4ee347fba8a599115af2ccd8179836a63c925c23e04bd056d0674a64b39e3a081b643cc7bc0b84390517df2d800a46fcc5598d42c155fe4977095c2f77c5 + version: 2.0.1 + resolution: "pathval@npm:2.0.1" + checksum: 10c0/460f4709479fbf2c45903a65655fc8f0a5f6d808f989173aeef5fdea4ff4f303dc13f7870303999add60ec49d4c14733895c0a869392e9866f1091fa64fd7581 languageName: node linkType: hard -"picocolors@npm:1.1.1, picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": +"picocolors@npm:1.1.1, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 @@ -5672,32 +5599,14 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc - languageName: node - linkType: hard - -"picomatch@npm:^4.0.3": +"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": version: 4.0.3 resolution: "picomatch@npm:4.0.3" checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 languageName: node linkType: hard -"postcss@npm:^8.4.41": - version: 8.5.3 - resolution: "postcss@npm:8.5.3" - dependencies: - nanoid: "npm:^3.3.8" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 - languageName: node - linkType: hard - -"postcss@npm:^8.5.6": +"postcss@npm:^8.4.41, postcss@npm:^8.5.6": version: 8.5.6 resolution: "postcss@npm:8.5.6" dependencies: @@ -5715,16 +5624,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.5.0": - version: 3.5.3 - resolution: "prettier@npm:3.5.3" - bin: - prettier: bin/prettier.cjs - checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 - languageName: node - linkType: hard - -"prettier@npm:^3.6.2": +"prettier@npm:^3.5.0, prettier@npm:^3.6.2": version: 3.6.2 resolution: "prettier@npm:3.6.2" bin: @@ -5744,10 +5644,10 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^5.0.0": - version: 5.0.0 - resolution: "proc-log@npm:5.0.0" - checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 +"proc-log@npm:^6.0.0": + version: 6.0.0 + resolution: "proc-log@npm:6.0.0" + checksum: 10c0/40c5e2b4c55e395a3bd72e38cba9c26e58598a1f4844fa6a115716d5231a0919f46aa8e351147035d91583ad39a794593615078c948bc001fe3beb99276be776 languageName: node linkType: hard @@ -5772,29 +5672,13 @@ __metadata: languageName: node linkType: hard -"psl@npm:^1.1.33": - version: 1.15.0 - resolution: "psl@npm:1.15.0" - dependencies: - punycode: "npm:^2.3.1" - checksum: 10c0/d8d45a99e4ca62ca12ac3c373e63d80d2368d38892daa40cfddaa1eb908be98cd549ac059783ef3a56cfd96d57ae8e2fd9ae53d1378d90d42bc661ff924e102a - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": +"punycode@npm:^2.1.0, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 languageName: node linkType: hard -"querystringify@npm:^2.1.1": - version: 2.2.0 - resolution: "querystringify@npm:2.2.0" - checksum: 10c0/3258bc3dbdf322ff2663619afe5947c7926a6ef5fb78ad7d384602974c467fadfc8272af44f5eb8cddd0d011aae8fabf3a929a8eee4b86edcc0a21e6bd10f9aa - languageName: node - linkType: hard - "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -5803,22 +5687,22 @@ __metadata: linkType: hard "react-dom@npm:^19.1.1": - version: 19.1.1 - resolution: "react-dom@npm:19.1.1" + version: 19.2.0 + resolution: "react-dom@npm:19.2.0" dependencies: - scheduler: "npm:^0.26.0" + scheduler: "npm:^0.27.0" peerDependencies: - react: ^19.1.1 - checksum: 10c0/8c91198510521299c56e4e8d5e3a4508b2734fb5e52f29eeac33811de64e76fe586ad32c32182e2e84e070d98df67125da346c3360013357228172dbcd20bcdd + react: ^19.2.0 + checksum: 10c0/fa2cae05248d01288e91523b590ce4e7635b1e13f1344e225f850d722a8da037bf0782f63b1c1d46353334e0c696909b82e582f8cad607948fde6f7646cc18d9 languageName: node linkType: hard "react-hook-form@npm:^7.62.0": - version: 7.62.0 - resolution: "react-hook-form@npm:7.62.0" + version: 7.66.0 + resolution: "react-hook-form@npm:7.66.0" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10c0/451a25a2ddf07be14f690d2ad3f2f970e0b933fd059ef141c6da9e19d0566d739e9d5cc9c482e3533f3fd01d97e658b896a01ce45a1259ad7b0d4638ba0112c6 + checksum: 10c0/9faeafdaedfabfcbf5f8bb1aeefb81863b8e158eef4b089e2a32180fe474aec47d05fe3ed7d4faea085ca9f689118fb1135b94cdeed2022bd7d3fa3a56530c63 languageName: node linkType: hard @@ -5843,10 +5727,10 @@ __metadata: languageName: node linkType: hard -"react-refresh@npm:^0.17.0": - version: 0.17.0 - resolution: "react-refresh@npm:0.17.0" - checksum: 10c0/002cba940384c9930008c0bce26cac97a9d5682bc623112c2268ba0c155127d9c178a9a5cc2212d560088d60dfd503edd808669a25f9b377f316a32361d0b23c +"react-refresh@npm:^0.18.0": + version: 0.18.0 + resolution: "react-refresh@npm:0.18.0" + checksum: 10c0/34a262f7fd803433a534f50deb27a148112a81adcae440c7d1cbae7ef14d21ea8f2b3d783e858cb7698968183b77755a38b4d4b5b1d79b4f4689c2f6d358fff2 languageName: node linkType: hard @@ -5867,8 +5751,8 @@ __metadata: linkType: hard "react-remove-scroll@npm:^2.6.3": - version: 2.6.3 - resolution: "react-remove-scroll@npm:2.6.3" + version: 2.7.1 + resolution: "react-remove-scroll@npm:2.7.1" dependencies: react-remove-scroll-bar: "npm:^2.3.7" react-style-singleton: "npm:^2.2.3" @@ -5881,7 +5765,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/068e9704ff26816fffc4c8903e2c6c8df7291ee08615d7c1ab0cf8751f7080e2c5a5d78ef5d908b11b9cfc189f176d312e44cb02ea291ca0466d8283b479b438 + checksum: 10c0/7ad8f6ffd3e2aedf9b3d79f0c9088a9a3d7c5332d80c923427a6d97fe0626fb4cb33a6d9174d19fad57d860be69c96f68497a0619c3a8af0e8a5332e49bdde31 languageName: node linkType: hard @@ -5931,9 +5815,9 @@ __metadata: linkType: hard "react@npm:^19.1.1": - version: 19.1.1 - resolution: "react@npm:19.1.1" - checksum: 10c0/8c9769a2dfd02e603af6445058325e6c8a24b47b185d0e461f66a6454765ddcaecb3f0a90184836c68bb509f3c38248359edbc42f0d07c23eb500a5c30c87b4e + version: 19.2.0 + resolution: "react@npm:19.2.0" + checksum: 10c0/1b6d64eacb9324725bfe1e7860cb7a6b8a34bc89a482920765ebff5c10578eb487e6b46b2f0df263bd27a25edbdae2c45e5ea5d81ae61404301c1a7192c38330 languageName: node linkType: hard @@ -5946,6 +5830,19 @@ __metadata: languageName: node linkType: hard +"recast@npm:^0.23.11": + version: 0.23.11 + resolution: "recast@npm:0.23.11" + dependencies: + ast-types: "npm:^0.16.1" + esprima: "npm:~4.0.0" + source-map: "npm:~0.6.1" + tiny-invariant: "npm:^1.3.3" + tslib: "npm:^2.0.1" + checksum: 10c0/45b520a8f0868a5a24ecde495be9de3c48e69a54295d82a7331106554b75cfba75d16c909959d056e9ceed47a1be5e061e2db8b9ecbcd6ba44c2f3ef9a47bd18 + languageName: node + linkType: hard + "recharts-scale@npm:^0.4.4": version: 0.4.5 resolution: "recharts-scale@npm:0.4.5" @@ -5956,8 +5853,8 @@ __metadata: linkType: hard "recharts@npm:^2.15.2": - version: 2.15.2 - resolution: "recharts@npm:2.15.2" + version: 2.15.4 + resolution: "recharts@npm:2.15.4" dependencies: clsx: "npm:^2.0.0" eventemitter3: "npm:^4.0.1" @@ -5970,7 +5867,7 @@ __metadata: peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/14273be911d208ebdc29737b19129c6be6731d51f1e441f6a6ea98425543e29d28f140518905b42f965c12ce6f81055d50389621f5429d55cbeab47fe9d5692c + checksum: 10c0/45bf1e1f56d881696aa55c1a019f16dee559b46d0024254584424d518e7f2887eb76e8ac22a203d02939fbbeabd2c297fc55c0c5a6534879d60f5caad8a97f37 languageName: node linkType: hard @@ -5984,13 +5881,6 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.14.0": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -5998,13 +5888,6 @@ __metadata: languageName: node linkType: hard -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: 10c0/b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 - languageName: node - linkType: hard - "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -6026,6 +5909,13 @@ __metadata: languageName: node linkType: hard +"rettime@npm:^0.7.0": + version: 0.7.0 + resolution: "rettime@npm:0.7.0" + checksum: 10c0/1460539d49415c37e46884bf1db7a5da974b239c1bd6976e1cf076fad169067dc8f55cd2572aec504433162f3627b6d8123eea977d110476258045d620bd051b + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.1.0 resolution: "reusify@npm:1.1.0" @@ -6034,29 +5924,31 @@ __metadata: linkType: hard "rollup@npm:^4.43.0": - version: 4.48.1 - resolution: "rollup@npm:4.48.1" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.48.1" - "@rollup/rollup-android-arm64": "npm:4.48.1" - "@rollup/rollup-darwin-arm64": "npm:4.48.1" - "@rollup/rollup-darwin-x64": "npm:4.48.1" - "@rollup/rollup-freebsd-arm64": "npm:4.48.1" - "@rollup/rollup-freebsd-x64": "npm:4.48.1" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.48.1" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.48.1" - "@rollup/rollup-linux-arm64-gnu": "npm:4.48.1" - "@rollup/rollup-linux-arm64-musl": "npm:4.48.1" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.48.1" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.48.1" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.48.1" - "@rollup/rollup-linux-riscv64-musl": "npm:4.48.1" - "@rollup/rollup-linux-s390x-gnu": "npm:4.48.1" - "@rollup/rollup-linux-x64-gnu": "npm:4.48.1" - "@rollup/rollup-linux-x64-musl": "npm:4.48.1" - "@rollup/rollup-win32-arm64-msvc": "npm:4.48.1" - "@rollup/rollup-win32-ia32-msvc": "npm:4.48.1" - "@rollup/rollup-win32-x64-msvc": "npm:4.48.1" + version: 4.53.2 + resolution: "rollup@npm:4.53.2" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.53.2" + "@rollup/rollup-android-arm64": "npm:4.53.2" + "@rollup/rollup-darwin-arm64": "npm:4.53.2" + "@rollup/rollup-darwin-x64": "npm:4.53.2" + "@rollup/rollup-freebsd-arm64": "npm:4.53.2" + "@rollup/rollup-freebsd-x64": "npm:4.53.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.53.2" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.53.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.53.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.53.2" + "@rollup/rollup-linux-loong64-gnu": "npm:4.53.2" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.53.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.53.2" + "@rollup/rollup-linux-riscv64-musl": "npm:4.53.2" + "@rollup/rollup-linux-s390x-gnu": "npm:4.53.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.53.2" + "@rollup/rollup-linux-x64-musl": "npm:4.53.2" + "@rollup/rollup-openharmony-arm64": "npm:4.53.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.53.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.53.2" + "@rollup/rollup-win32-x64-gnu": "npm:4.53.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.53.2" "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -6080,7 +5972,7 @@ __metadata: optional: true "@rollup/rollup-linux-arm64-musl": optional: true - "@rollup/rollup-linux-loongarch64-gnu": + "@rollup/rollup-linux-loong64-gnu": optional: true "@rollup/rollup-linux-ppc64-gnu": optional: true @@ -6094,17 +5986,21 @@ __metadata: optional: true "@rollup/rollup-linux-x64-musl": optional: true + "@rollup/rollup-openharmony-arm64": + optional: true "@rollup/rollup-win32-arm64-msvc": optional: true "@rollup/rollup-win32-ia32-msvc": optional: true + "@rollup/rollup-win32-x64-gnu": + optional: true "@rollup/rollup-win32-x64-msvc": optional: true fsevents: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/1b7167f17d7cfb9e7d7cd9e3c60a6150fc1d4b1a55e37c925c1832d9992176a7fa98e8cd1cf1ea3f0adf0b251394ca0ea004873ab3088c1ab272a76da40b3a71 + checksum: 10c0/427216da71c1ce7fefb0bef75f94c301afd858ac27e35898e098c2da5977325fa54c2edda867caf9675c8abfa8d8d94efa99c482fa04f5cd91f3a740112d4f4f languageName: node linkType: hard @@ -6140,10 +6036,10 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.26.0": - version: 0.26.0 - resolution: "scheduler@npm:0.26.0" - checksum: 10c0/5b8d5bfddaae3513410eda54f2268e98a376a429931921a81b5c3a2873aab7ca4d775a8caac5498f8cbc7d0daeab947cf923dbd8e215d61671f9f4e392d34356 +"scheduler@npm:^0.27.0": + version: 0.27.0 + resolution: "scheduler@npm:0.27.0" + checksum: 10c0/4f03048cb05a3c8fddc45813052251eca00688f413a3cee236d984a161da28db28ba71bd11e7a3dd02f7af84ab28d39fb311431d3b3772fed557945beb00c452 languageName: node linkType: hard @@ -6157,27 +6053,27 @@ __metadata: linkType: hard "semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.6.0": - version: 7.7.1 - resolution: "semver@npm:7.7.1" + version: 7.7.3 + resolution: "semver@npm:7.7.3" bin: semver: bin/semver.js - checksum: 10c0/fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 + checksum: 10c0/4afe5c986567db82f44c8c6faef8fe9df2a9b1d98098fc1721f57c696c4c21cebd572f297fc21002f81889492345b8470473bc6f4aff5fb032a6ea59ea2bc45e languageName: node linkType: hard -"seroval-plugins@npm:^1.1.0": - version: 1.2.1 - resolution: "seroval-plugins@npm:1.2.1" +"seroval-plugins@npm:^1.3.2": + version: 1.3.3 + resolution: "seroval-plugins@npm:1.3.3" peerDependencies: seroval: ^1.0 - checksum: 10c0/668f9ce1271076da63cbd55e63fdd51f6ad1575fb8e31878e1bf75e58ec6fda6eb74b21c57a986603242b7702082914f08413c2c555abbd67e95f70b7e589514 + checksum: 10c0/cb6d0119ddf26241d62b78cf924a701bfde2d1a4f8fed924f0076b1edde5f8c6f3e38d8c71975010ba58e94804619c9aed59cb3985774ce7a725aa882dc021f1 languageName: node linkType: hard -"seroval@npm:^1.1.0": - version: 1.2.1 - resolution: "seroval@npm:1.2.1" - checksum: 10c0/9dba0c983d29f8a463392f40d4654dc36499a42e418daeb09927b89fad6c3b5e33d8adf552d8d54a9bd7b8a14cf62062dc645f5b351a4034578cd11564990344 +"seroval@npm:^1.3.2": + version: 1.3.2 + resolution: "seroval@npm:1.3.2" + checksum: 10c0/19e74825643786d22e5c58054bd28065238de0156545afba82f9a7d3ee70ea4f0249b427f317bc6bf983849dde8e4190264728d90c84620aa163bfbc5971f1bc languageName: node linkType: hard @@ -6212,13 +6108,13 @@ __metadata: linkType: hard "sirv@npm:^3.0.1": - version: 3.0.1 - resolution: "sirv@npm:3.0.1" + version: 3.0.2 + resolution: "sirv@npm:3.0.2" dependencies: "@polka/url": "npm:^1.0.0-next.24" mrmime: "npm:^2.0.0" totalist: "npm:^3.0.0" - checksum: 10c0/7cf64b28daa69b15f77b38b0efdd02c007b72bb3ec5f107b208ebf59f01b174ef63a1db3aca16d2df925501831f4c209be6ece3302b98765919ef5088b45bf80 + checksum: 10c0/5930e4397afdb14fbae13751c3be983af4bda5c9aadec832607dc2af15a7162f7d518c71b30e83ae3644b9a24cea041543cc969e5fe2b80af6ce8ea3174b2d04 languageName: node linkType: hard @@ -6241,23 +6137,12 @@ __metadata: linkType: hard "socks@npm:^2.8.3": - version: 2.8.4 - resolution: "socks@npm:2.8.4" + version: 2.8.7 + resolution: "socks@npm:2.8.7" dependencies: - ip-address: "npm:^9.0.5" + ip-address: "npm:^10.0.1" smart-buffer: "npm:^4.2.0" - checksum: 10c0/00c3271e233ccf1fb83a3dd2060b94cc37817e0f797a93c560b9a7a86c4a0ec2961fb31263bdd24a3c28945e24868b5f063cd98744171d9e942c513454b50ae5 - languageName: node - linkType: hard - -"solid-js@npm:^1.9.5": - version: 1.9.5 - resolution: "solid-js@npm:1.9.5" - dependencies: - csstype: "npm:^3.1.0" - seroval: "npm:^1.1.0" - seroval-plugins: "npm:^1.1.0" - checksum: 10c0/9008282891709178a42296418a4118e5bdf04efb31a4d783c68b490ff450d5dc02515ccb7d6252cca8f64e8376adf74a18b62480329f4cd00db4ebcf0f1551af + checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 languageName: node linkType: hard @@ -6278,10 +6163,17 @@ __metadata: languageName: node linkType: hard -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec +"source-map@npm:^0.7.4": + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c + languageName: node + linkType: hard + +"source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 languageName: node linkType: hard @@ -6294,6 +6186,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^13.0.0": + version: 13.0.0 + resolution: "ssri@npm:13.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/405f3a531cd98b013cecb355d63555dca42fd12c7bc6671738aaa9a82882ff41cdf0ef9a2b734ca4f9a760338f114c29d01d9238a65db3ccac27929bd6e6d4b2 + languageName: node + linkType: hard + "stackback@npm:0.0.2": version: 0.0.2 resolution: "stackback@npm:0.0.2" @@ -6301,17 +6202,17 @@ __metadata: languageName: node linkType: hard -"statuses@npm:^2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 +"statuses@npm:^2.0.2": + version: 2.0.2 + resolution: "statuses@npm:2.0.2" + checksum: 10c0/a9947d98ad60d01f6b26727570f3bcceb6c8fa789da64fe6889908fe2e294d57503b14bf2b5af7605c2d36647259e856635cd4c49eab41667658ec9d0080ec3f languageName: node linkType: hard "std-env@npm:^3.9.0": - version: 3.9.0 - resolution: "std-env@npm:3.9.0" - checksum: 10c0/4a6f9218aef3f41046c3c7ecf1f98df00b30a07f4f35c6d47b28329bc2531eef820828951c7d7b39a1c5eb19ad8a46e3ddfc7deb28f0a2f3ceebee11bab7ba50 + version: 3.10.0 + resolution: "std-env@npm:3.10.0" + checksum: 10c0/1814927a45004d36dde6707eaf17552a546769bc79a6421be2c16ce77d238158dfe5de30910b78ec30d95135cc1c59ea73ee22d2ca170f8b9753f84da34c427f languageName: node linkType: hard @@ -6354,11 +6255,11 @@ __metadata: linkType: hard "strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" + version: 7.1.2 + resolution: "strip-ansi@npm:7.1.2" dependencies: ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + checksum: 10c0/0d6d7a023de33368fd042aab0bf48f4f4077abdfd60e5393e73c7c411e85e1b3a83507c11af2e656188511475776215df9ca589b4da2295c9455cc399ce1858b languageName: node linkType: hard @@ -6379,11 +6280,11 @@ __metadata: linkType: hard "strip-literal@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-literal@npm:3.0.0" + version: 3.1.0 + resolution: "strip-literal@npm:3.1.0" dependencies: js-tokens: "npm:^9.0.1" - checksum: 10c0/d81657f84aba42d4bbaf2a677f7e7f34c1f3de5a6726db8bc1797f9c0b303ba54d4660383a74bde43df401cf37cce1dff2c842c55b077a4ceee11f9e31fba828 + checksum: 10c0/50918f669915d9ad0fe4b7599902b735f853f2201c97791ead00104a654259c0c61bc2bc8fa3db05109339b61f4cf09e47b94ecc874ffbd0e013965223893af8 languageName: node linkType: hard @@ -6404,37 +6305,36 @@ __metadata: linkType: hard "tailwind-merge@npm:^3.3.1": - version: 3.3.1 - resolution: "tailwind-merge@npm:3.3.1" - checksum: 10c0/b84c6a78d4669fa12bf5ab8f0cdc4400a3ce0a7c006511af4af4be70bb664a27466dbe13ee9e3b31f50ddf6c51d380e8192ce0ec9effce23ca729d71a9f63818 + version: 3.4.0 + resolution: "tailwind-merge@npm:3.4.0" + checksum: 10c0/eaf17bb695c51c7bb7a90366a9c62be295473ee97fcfd1da54287714d4a5788a88ff4ad1ab9e0128638257fda777d6c9ea88682e36195e31a7fa2cf43f45e310 languageName: node linkType: hard -"tailwindcss@npm:4.1.12, tailwindcss@npm:^4.1.12": - version: 4.1.12 - resolution: "tailwindcss@npm:4.1.12" - checksum: 10c0/0e43375d8de91e1c97a60ed7855f1bf02d5cac61a909439afd54462604862ee71706d812c0447a639f2ef98051a8817840b3df6847c7a1ed015f7a910240ffef +"tailwindcss@npm:4.1.17, tailwindcss@npm:^4.1.12": + version: 4.1.17 + resolution: "tailwindcss@npm:4.1.17" + checksum: 10c0/1fecf618ba9895e068e5a6d842b978f56a815bc849a28338cebbcb07b13df763715c2f8848def938403c73d59f08ffff33a4b83a977a9e38fa56adc60d1d56c8 languageName: node linkType: hard "tapable@npm:^2.2.0": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + version: 2.3.0 + resolution: "tapable@npm:2.3.0" + checksum: 10c0/cb9d67cc2c6a74dedc812ef3085d9d681edd2c1fa18e4aef57a3c0605fdbe44e6b8ea00bd9ef21bc74dd45314e39d31227aa031ebf2f5e38164df514136f2681 languageName: node linkType: hard -"tar@npm:^7.4.3": - version: 7.4.3 - resolution: "tar@npm:7.4.3" +"tar@npm:^7.5.2": + version: 7.5.2 + resolution: "tar@npm:7.5.2" dependencies: "@isaacs/fs-minipass": "npm:^4.0.0" chownr: "npm:^3.0.0" minipass: "npm:^7.1.2" - minizlib: "npm:^3.0.1" - mkdirp: "npm:^3.0.1" + minizlib: "npm:^3.1.0" yallist: "npm:^5.0.0" - checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + checksum: 10c0/a7d8b801139b52f93a7e34830db0de54c5aa45487c7cb551f6f3d44a112c67f1cb8ffdae856b05fd4f17b1749911f1c26f1e3a23bbe0279e17fd96077f13f467 languageName: node linkType: hard @@ -6477,27 +6377,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.12": - version: 0.2.12 - resolution: "tinyglobby@npm:0.2.12" - dependencies: - fdir: "npm:^6.4.3" - picomatch: "npm:^4.0.2" - checksum: 10c0/7c9be4fd3625630e262dcb19015302aad3b4ba7fc620f269313e688f2161ea8724d6cb4444baab5ef2826eb6bed72647b169a33ec8eea37501832a2526ff540f - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.14": - version: 0.2.14 - resolution: "tinyglobby@npm:0.2.14" - dependencies: - fdir: "npm:^6.4.4" - picomatch: "npm:^4.0.2" - checksum: 10c0/f789ed6c924287a9b7d3612056ed0cda67306cd2c80c249fd280cf1504742b12583a2089b61f4abbd24605f390809017240e250241f09938054c9b363e51c0a6 - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.15": +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" dependencies: @@ -6522,9 +6402,9 @@ __metadata: linkType: hard "tinyspy@npm:^4.0.3": - version: 4.0.3 - resolution: "tinyspy@npm:4.0.3" - checksum: 10c0/0a92a18b5350945cc8a1da3a22c9ad9f4e2945df80aaa0c43e1b3a3cfb64d8501e607ebf0305e048e3c3d3e0e7f8eb10cea27dc17c21effb73e66c4a3be36373 + version: 4.0.4 + resolution: "tinyspy@npm:4.0.4" + checksum: 10c0/a8020fc17799251e06a8398dcc352601d2770aa91c556b9531ecd7a12581161fd1c14e81cbdaff0c1306c93bfdde8ff6d1c1a3f9bbe6d91604f0fd4e01e2f1eb languageName: node linkType: hard @@ -6535,6 +6415,13 @@ __metadata: languageName: node linkType: hard +"tldts-core@npm:^7.0.17": + version: 7.0.17 + resolution: "tldts-core@npm:7.0.17" + checksum: 10c0/39dd6f5852f241c88391dc462dd236fa8241309a76dbf2486afdba0f172358260b16b98c126d1d06e1d9ee9015d83448ed7c4e2885e5e5c06c368f6503bb6a97 + languageName: node + linkType: hard + "tldts@npm:^6.1.32": version: 6.1.86 resolution: "tldts@npm:6.1.86" @@ -6546,6 +6433,17 @@ __metadata: languageName: node linkType: hard +"tldts@npm:^7.0.5": + version: 7.0.17 + resolution: "tldts@npm:7.0.17" + dependencies: + tldts-core: "npm:^7.0.17" + bin: + tldts: bin/cli.js + checksum: 10c0/0ef2a40058a11c27a5b310489009002e57cd0789c2cf383c04ecf808e1523d442d9d9688ac0337c64b261609478b7fd85ddcd692976c8f763747a5e1c7c1c451 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -6562,18 +6460,6 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^4.1.4": - version: 4.1.4 - resolution: "tough-cookie@npm:4.1.4" - dependencies: - psl: "npm:^1.1.33" - punycode: "npm:^2.1.1" - universalify: "npm:^0.2.0" - url-parse: "npm:^1.5.3" - checksum: 10c0/aca7ff96054f367d53d1e813e62ceb7dd2eda25d7752058a74d64b7266fd07be75908f3753a32ccf866a2f997604b414cfb1916d6e7f69bc64d9d9939b0d6c45 - languageName: node - linkType: hard - "tough-cookie@npm:^5.1.1": version: 5.1.2 resolution: "tough-cookie@npm:5.1.2" @@ -6583,12 +6469,21 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^6.0.0": + version: 6.0.0 + resolution: "tough-cookie@npm:6.0.0" + dependencies: + tldts: "npm:^7.0.5" + checksum: 10c0/7b17a461e9c2ac0d0bea13ab57b93b4346d0b8c00db174c963af1e46e4ea8d04148d2a55f2358fc857db0c0c65208a98e319d0c60693e32e0c559a9d9cf20cb5 + languageName: node + linkType: hard + "tr46@npm:^5.1.0": - version: 5.1.0 - resolution: "tr46@npm:5.1.0" + version: 5.1.1 + resolution: "tr46@npm:5.1.1" dependencies: punycode: "npm:^2.3.1" - checksum: 10c0/d761f7144e0cb296187674ef245c74f761e334d7cf25ca73ef60e4c72c097c75051031c093fa1a2fee04b904977b316716a7915854bcae8fb1a371746513cbe8 + checksum: 10c0/ae270e194d52ec67ebd695c1a42876e0f19b96e4aca2ab464ab1d9d17dc3acd3e18764f5034c93897db73421563be27c70c98359c4501136a497e46deda5d5ec languageName: node linkType: hard @@ -6601,7 +6496,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.8.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -6609,8 +6504,8 @@ __metadata: linkType: hard "tsx@npm:^4.19.2": - version: 4.19.3 - resolution: "tsx@npm:4.19.3" + version: 4.20.6 + resolution: "tsx@npm:4.20.6" dependencies: esbuild: "npm:~0.25.0" fsevents: "npm:~2.3.3" @@ -6620,14 +6515,14 @@ __metadata: optional: true bin: tsx: dist/cli.mjs - checksum: 10c0/cacfb4cf1392ae10e8e4fe032ad26ccb07cd8a3b32e5a0da270d9c48d06ee74f743e4a84686cbc9d89b48032d59bbc56cd911e076f53cebe61dc24fa525ff790 + checksum: 10c0/07757a9bf62c271e0a00869b2008c5f2d6e648766536e4faf27d9d8027b7cde1ac8e4871f4bb570c99388bcee0018e6869dad98c07df809b8052f9c549cd216f languageName: node linkType: hard "tw-animate-css@npm:^1.3.7": - version: 1.3.7 - resolution: "tw-animate-css@npm:1.3.7" - checksum: 10c0/e506637ab3c23bb647d3b386def440c08127ee24f10994760bad79947cc8ed997611159df48ddd5d745499b3738ba2d65fb50d2740a8c986a09df95b132586db + version: 1.4.0 + resolution: "tw-animate-css@npm:1.4.0" + checksum: 10c0/6cfbc19ccc73883ec80ef1f9147f43e736cb01ee99c8172968b37eb81b720523d30e38b1a96aef92db3c586d864204db5510b51744ddacbbf0ad8e3c7fb56ec7 languageName: node linkType: hard @@ -6640,37 +6535,30 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 - languageName: node - linkType: hard - "type-fest@npm:^4.26.1": - version: 4.39.1 - resolution: "type-fest@npm:4.39.1" - checksum: 10c0/f5bf302eb2e2f70658be1757aa578f4a09da3f65699b0b12b7ae5502ccea76e5124521a6e6b69540f442c3dc924c394202a2ab58718d0582725c7ac23c072594 + version: 4.41.0 + resolution: "type-fest@npm:4.41.0" + checksum: 10c0/f5ca697797ed5e88d33ac8f1fec21921839871f808dc59345c9cf67345bfb958ce41bd821165dbf3ae591cedec2bf6fe8882098dfdd8dc54320b859711a2c1e4 languageName: node linkType: hard "typescript@npm:^5.9.2": - version: 5.9.2 - resolution: "typescript@npm:5.9.2" + version: 5.9.3 + resolution: "typescript@npm:5.9.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/cd635d50f02d6cf98ed42de2f76289701c1ec587a363369255f01ed15aaf22be0813226bff3c53e99d971f9b540e0b3cc7583dbe05faded49b1b0bed2f638a18 + checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 languageName: node linkType: hard "typescript@patch:typescript@npm%3A^5.9.2#optional!builtin": - version: 5.9.2 - resolution: "typescript@patch:typescript@npm%3A5.9.2#optional!builtin::version=5.9.2&hash=5786d5" + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/34d2a8e23eb8e0d1875072064d5e1d9c102e0bdce56a10a25c0b917b8aa9001a9cf5c225df12497e99da107dc379360bc138163c66b55b95f5b105b50578067e + checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430 languageName: node linkType: hard @@ -6690,17 +6578,10 @@ __metadata: languageName: node linkType: hard -<<<<<<< HEAD -"undici-types@npm:~7.12.0": - version: 7.12.0 - resolution: "undici-types@npm:7.12.0" - checksum: 10c0/326e455bbc0026db1d6b81c76a1cf10c63f7e2f9821db2e24fdc258f482814e5bfa8481f8910d07c68e305937c5c049610fdc441c5e8b7bb0daca7154fb8a306 -======= "undici-types@npm:~7.16.0": version: 7.16.0 resolution: "undici-types@npm:7.16.0" checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a ->>>>>>> 557b2ee (Fix yarn) languageName: node linkType: hard @@ -6722,27 +6603,28 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.2.0": - version: 0.2.0 - resolution: "universalify@npm:0.2.0" - checksum: 10c0/cedbe4d4ca3967edf24c0800cfc161c5a15e240dac28e3ce575c689abc11f2c81ccc6532c8752af3b40f9120fb5e454abecd359e164f4f6aa44c29cd37e194fe - languageName: node - linkType: hard - "unplugin@npm:^2.1.2": - version: 2.3.2 - resolution: "unplugin@npm:2.3.2" + version: 2.3.10 + resolution: "unplugin@npm:2.3.10" dependencies: - acorn: "npm:^8.14.1" - picomatch: "npm:^4.0.2" + "@jridgewell/remapping": "npm:^2.3.5" + acorn: "npm:^8.15.0" + picomatch: "npm:^4.0.3" webpack-virtual-modules: "npm:^0.6.2" - checksum: 10c0/157a50072601b9bfbf3ab27a76a04685fb0af0c1a579d958787ffcb28a4d64e09acf42f0176e8767ccd940f27ee52d97a7f6aa6ce2e1e0dbe666ec26519750ef + checksum: 10c0/29dcd738772aeff91c6f0154f156c95c58a37a4674fcb7cc34d6868af763834f0f447a1c3af074818c0c5602baead49bd3b9399a13f0425d69a00a527e58ddda languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.1": - version: 1.1.3 - resolution: "update-browserslist-db@npm:1.1.3" +"until-async@npm:^3.0.2": + version: 3.0.2 + resolution: "until-async@npm:3.0.2" + checksum: 10c0/61c8b03895dbe18fe3d90316d0a1894e0c131ea4b1673f6ce78eed993d0bb81bbf4b7adf8477e9ff7725782a76767eed9d077561cfc9f89b4a1ebe61f7c9828e + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.4": + version: 1.1.4 + resolution: "update-browserslist-db@npm:1.1.4" dependencies: escalade: "npm:^3.2.0" picocolors: "npm:^1.1.1" @@ -6750,7 +6632,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10c0/682e8ecbf9de474a626f6462aa85927936cdd256fe584c6df2508b0df9f7362c44c957e9970df55dfe44d3623807d26316ea2c7d26b80bb76a16c56c37233c32 + checksum: 10c0/db0c9aaecf1258a6acda5e937fc27a7996ccca7a7580a1b4aa8bba6a9b0e283e5e65c49ebbd74ec29288ef083f1b88d4da13e3d4d326c1e5fc55bf72d7390702 languageName: node linkType: hard @@ -6763,16 +6645,6 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.5.3": - version: 1.5.10 - resolution: "url-parse@npm:1.5.10" - dependencies: - querystringify: "npm:^2.1.1" - requires-port: "npm:^1.0.0" - checksum: 10c0/bd5aa9389f896974beb851c112f63b466505a04b4807cea2e5a3b7092f6fbb75316f0491ea84e44f66fed55f1b440df5195d7e3a8203f64fcefa19d182f5be87 - languageName: node - linkType: hard - "use-callback-ref@npm:^1.3.3": version: 1.3.3 resolution: "use-callback-ref@npm:1.3.3" @@ -6814,12 +6686,12 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.4.0, use-sync-external-store@npm:^1.5.0": - version: 1.5.0 - resolution: "use-sync-external-store@npm:1.5.0" +"use-sync-external-store@npm:^1.5.0, use-sync-external-store@npm:^1.6.0": + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/1b8663515c0be34fa653feb724fdcce3984037c78dd4a18f68b2c8be55cc1a1084c578d5b75f158d41b5ddffc2bf5600766d1af3c19c8e329bb20af2ec6f52f4 + checksum: 10c0/35e1179f872a53227bdf8a827f7911da4c37c0f4091c29b76b1e32473d1670ebe7bcd880b808b7549ba9a5605c233350f800ffab963ee4a4ee346ee983b6019b languageName: node linkType: hard @@ -6860,64 +6732,9 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0": - version: 7.1.3 - resolution: "vite@npm:7.1.3" - dependencies: - esbuild: "npm:^0.25.0" - fdir: "npm:^6.5.0" - fsevents: "npm:~2.3.3" - picomatch: "npm:^4.0.3" - postcss: "npm:^8.5.6" - rollup: "npm:^4.43.0" - tinyglobby: "npm:^0.2.14" - peerDependencies: - "@types/node": ^20.19.0 || >=22.12.0 - jiti: ">=1.21.0" - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: ">=0.54.8" - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - bin: - vite: bin/vite.js - checksum: 10c0/a0aa418beab80673dc9a3e9d1fa49472955d6ef9d41a4c9c6bd402953f411346f612864dae267adfb2bb8ceeb894482369316ffae5816c84fd45990e352b727d - languageName: node - linkType: hard - -"vite@npm:^7.1.11": - version: 7.1.11 - resolution: "vite@npm:7.1.11" +"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.11, vite@npm:^7.1.7": + version: 7.2.2 + resolution: "vite@npm:7.2.2" dependencies: esbuild: "npm:^0.25.0" fdir: "npm:^6.5.0" @@ -6966,7 +6783,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/c4aa7f47b1fb07f734ed6f4f605d73e5acf7ff9754d75b4adbfbdddf0e520413019834620c1f7b4a207bce7e1d20a2636c584db2b1b17f5a3ba2cd23d47e50ab + checksum: 10c0/9c76ee441f8dbec645ddaecc28d1f9cf35670ffa91cff69af7b1d5081545331603f0b1289d437b2fa8dc43cdc77b4d96b5bd9c9aed66310f490cb1a06f9c814c languageName: node linkType: hard @@ -7096,14 +6913,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^5.0.0": - version: 5.0.0 - resolution: "which@npm:5.0.0" +"which@npm:^6.0.0": + version: 6.0.0 + resolution: "which@npm:6.0.0" dependencies: isexe: "npm:^3.1.1" bin: node-which: bin/which.js - checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b + checksum: 10c0/fe9d6463fe44a76232bb6e3b3181922c87510a5b250a98f1e43a69c99c079b3f42ddeca7e03d3e5f2241bf2d334f5a7657cfa868b97c109f3870625842f4cc15 languageName: node linkType: hard @@ -7159,22 +6976,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.18.0": - version: 8.18.1 - resolution: "ws@npm:8.18.1" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/e498965d6938c63058c4310ffb6967f07d4fa06789d3364829028af380d299fe05762961742971c764973dce3d1f6a2633fe8b2d9410c9b52e534b4b882a99fa - languageName: node - linkType: hard - -"ws@npm:^8.18.2": +"ws@npm:^8.18.0, ws@npm:^8.18.2": version: 8.18.3 resolution: "ws@npm:8.18.3" peerDependencies: @@ -7260,23 +7062,23 @@ __metadata: languageName: node linkType: hard -"yoctocolors-cjs@npm:^2.1.2": - version: 2.1.2 - resolution: "yoctocolors-cjs@npm:2.1.2" - checksum: 10c0/a0e36eb88fea2c7981eab22d1ba45e15d8d268626e6c4143305e2c1628fa17ebfaa40cd306161a8ce04c0a60ee0262058eab12567493d5eb1409780853454c6f +"yoctocolors-cjs@npm:^2.1.3": + version: 2.1.3 + resolution: "yoctocolors-cjs@npm:2.1.3" + checksum: 10c0/584168ef98eb5d913473a4858dce128803c4a6cd87c0f09e954fa01126a59a33ab9e513b633ad9ab953786ed16efdd8c8700097a51635aafaeed3fef7712fa79 languageName: node linkType: hard "zod@npm:^3.24.2": - version: 3.24.2 - resolution: "zod@npm:3.24.2" - checksum: 10c0/c638c7220150847f13ad90635b3e7d0321b36cce36f3fc6050ed960689594c949c326dfe2c6fa87c14b126ee5d370ccdebd6efb304f41ef5557a4aaca2824565 + version: 3.25.76 + resolution: "zod@npm:3.25.76" + checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c languageName: node linkType: hard "zod@npm:^4.1.5": - version: 4.1.5 - resolution: "zod@npm:4.1.5" - checksum: 10c0/7826fb931bc71d4d0fff2fbb72f1a1cf30a6672cf9dbe6933a216bbb60242ef1c3bdfbcd3c5b27e806235a35efaad7a4a9897ff4d3621452f9ea278bce6fd42a + version: 4.1.12 + resolution: "zod@npm:4.1.12" + checksum: 10c0/b64c1feb19e99d77075261eaf613e0b2be4dfcd3551eff65ad8b4f2a079b61e379854d066f7d447491fcf193f45babd8095551a9d47973d30b46b6d8e2c46774 languageName: node linkType: hard From 40a62ee57bc062b9e8f92fc08de1bed09e52b5de Mon Sep 17 00:00:00 2001 From: LucaDiba Date: Sun, 21 Sep 2025 16:59:31 -0700 Subject: [PATCH 11/12] Scaffold importer --- yarn.lock | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/yarn.lock b/yarn.lock index 1da1197..c62ff01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2908,6 +2908,15 @@ __metadata: languageName: node linkType: hard +"@types/papaparse@npm:^5.3.16": + version: 5.5.0 + resolution: "@types/papaparse@npm:5.5.0" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/df2db19b602c6d9a049085737fcd3be49e4db528704a25bf4e9a08378053951f7069738b8a3fcb8b1c760ccbc41125f1e358b21db905d6f7e8bcf4062b29df49 + languageName: node + linkType: hard + "@types/react-dom@npm:^19.1.9": version: 19.2.3 resolution: "@types/react-dom@npm:19.2.3" @@ -5633,6 +5642,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:^3.6.2": + version: 3.6.2 + resolution: "prettier@npm:3.6.2" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/488cb2f2b99ec13da1e50074912870217c11edaddedeadc649b1244c749d15ba94e846423d062e2c4c9ae683e2d65f754de28889ba06e697ac4f988d44f45812 + languageName: node + linkType: hard + "pretty-format@npm:^27.0.2": version: 27.5.1 resolution: "pretty-format@npm:27.5.1" From 5664abce0b0feb6154e4b7b79cd478002630d096 Mon Sep 17 00:00:00 2001 From: LucaDiba Date: Fri, 14 Nov 2025 04:13:32 -0800 Subject: [PATCH 12/12] Fix yarn --- yarn.lock | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index c62ff01..1da1197 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2908,15 +2908,6 @@ __metadata: languageName: node linkType: hard -"@types/papaparse@npm:^5.3.16": - version: 5.5.0 - resolution: "@types/papaparse@npm:5.5.0" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/df2db19b602c6d9a049085737fcd3be49e4db528704a25bf4e9a08378053951f7069738b8a3fcb8b1c760ccbc41125f1e358b21db905d6f7e8bcf4062b29df49 - languageName: node - linkType: hard - "@types/react-dom@npm:^19.1.9": version: 19.2.3 resolution: "@types/react-dom@npm:19.2.3" @@ -5642,15 +5633,6 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.6.2": - version: 3.6.2 - resolution: "prettier@npm:3.6.2" - bin: - prettier: bin/prettier.cjs - checksum: 10c0/488cb2f2b99ec13da1e50074912870217c11edaddedeadc649b1244c749d15ba94e846423d062e2c4c9ae683e2d65f754de28889ba06e697ac4f988d44f45812 - languageName: node - linkType: hard - "pretty-format@npm:^27.0.2": version: 27.5.1 resolution: "pretty-format@npm:27.5.1"