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/README.md b/README.md
index 1456b2e..d402504 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,9 @@
[](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.

@@ -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
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 5099498..db2ee81 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.11",
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..5c49a84
--- /dev/null
+++ b/apps/client/dashboard/src/components/data-table.tsx
@@ -0,0 +1,209 @@
+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";
+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({});
+ 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(),
+ ...options,
+ });
+
+ 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.
+
+
+
+
+ Rows per page
+
+ {
+ table.setPageSize(Number(value));
+ }}
+ >
+
+
+
+
+ {[10, 20, 30, 40, 50].map((pageSize) => (
+
+ {pageSize}
+
+ ))}
+
+
+
+
+ Page {table.getState().pagination.pageIndex + 1} of{" "}
+ {table.getPageCount()}
+
+
+ table.setPageIndex(0)}
+ disabled={!table.getCanPreviousPage()}
+ >
+ Go to first page
+
+
+ table.previousPage()}
+ disabled={!table.getCanPreviousPage()}
+ >
+ Go to previous page
+
+
+ table.nextPage()}
+ disabled={!table.getCanNextPage()}
+ >
+ Go to next page
+
+
+ table.setPageIndex(table.getPageCount() - 1)}
+ disabled={!table.getCanNextPage()}
+ >
+ Go to last page
+
+
+
+
+
+ );
+}
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..7b0ddfa
--- /dev/null
+++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/import-transactions-page.tsx
@@ -0,0 +1,91 @@
+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 {
+ 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;
+ }
+ case "chase-account": {
+ 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 (
+
+ Skip all
+
+ );
+}
+
+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.
+
+
+ Go back
+
+
+
+ );
+}
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..e9e52e8
--- /dev/null
+++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.test.tsx
@@ -0,0 +1,384 @@
+import { TestContextProvider } from "@/utils/tests/contexts";
+import { beforeEach, describe, expect, test, vi } 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";
+import { toast } from "sonner";
+
+vi.mock("sonner");
+
+beforeEach(() => {
+ vi.clearAllMocks();
+});
+
+describe("ImportedTransactionsTable", () => {
+ const mockTransactions: DraftTransaction[] = [
+ {
+ providerTransactionId: "1",
+ date: "2023-01-01",
+ description: "Test Transaction 1",
+ from: {
+ amount: 100,
+ symbolId: "EUR",
+ account: { id: "ACCOUNT_1" },
+ },
+ to: {
+ amount: 100,
+ symbolId: "EUR",
+ account: { id: "ACCOUNT_2" },
+ },
+ transactionType: TransactionType.Transfer,
+ transactionCategoryId: null,
+ status: DraftTransactionStatus.ReadyToImport,
+ },
+ {
+ providerTransactionId: "2",
+ date: "2023-01-02",
+ description: "Test Transaction 2",
+ from: {
+ amount: 200,
+ symbolId: "EUR",
+ account: { id: "ACCOUNT_1" },
+ },
+ to: {
+ amount: 200,
+ symbolId: "EUR",
+ account: { name: "" },
+ },
+ transactionType: TransactionType.Expense,
+ transactionCategoryId: null,
+ status: DraftTransactionStatus.ReadyToImport,
+ },
+ {
+ providerTransactionId: "3",
+ date: "2023-01-03",
+ description: "Test Transaction 3",
+ from: {
+ amount: 200,
+ symbolId: "EUR",
+ account: { name: "" },
+ },
+ to: {
+ amount: 200,
+ symbolId: "EUR",
+ account: { id: "ACCOUNT_1" },
+ },
+ transactionType: TransactionType.Income,
+ transactionCategoryId: null,
+ status: DraftTransactionStatus.ReadyToImport,
+ },
+ {
+ providerTransactionId: "4",
+ date: "2023-01-03",
+ description: "Test Transaction 4",
+ from: {
+ amount: 200,
+ symbolId: "EUR",
+ account: undefined,
+ },
+ to: {
+ amount: 200,
+ symbolId: "EUR",
+ account: undefined,
+ },
+ transactionType: TransactionType.Income,
+ transactionCategoryId: null,
+ status: DraftTransactionStatus.NeedsReview,
+ },
+ ];
+
+ async function renderComponent(initialTransactions = mockTransactions) {
+ const { result } = renderHook(() =>
+ useImmer(initialTransactions),
+ );
+ let [transactions, setTransactions] = result.current;
+
+ render(
+
+
+ ,
+ );
+
+ await waitFor(() => {
+ for (const transaction of initialTransactions) {
+ screen.getByDisplayValue(transaction.description!);
+ }
+ });
+
+ return result;
+ }
+
+ test("updates transaction date", async () => {
+ const result = await renderComponent();
+
+ const dateInput = screen.getByDisplayValue("2023-01-01");
+ fireEvent.change(dateInput, { target: { value: "2023-01-03" } });
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(transactions[0].date).toBe("2023-01-03");
+ });
+ });
+
+ test("updates transaction from account", async () => {
+ const result = await renderComponent();
+
+ const [transactions] = result.current;
+ expect(transactions[0].from.account).toEqual({ id: "ACCOUNT_1" });
+
+ const fromAccountSelect = screen.getByText("Account 1");
+ fireEvent.click(fromAccountSelect);
+ fireEvent.click(screen.getAllByText("Account 2")[1]);
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(transactions[0].from.account).toEqual({ id: "ACCOUNT_2" });
+ });
+ });
+
+ test("updates transaction to account", async () => {
+ const result = await renderComponent();
+
+ const [transactions] = result.current;
+ expect(transactions[0].to.account).toEqual({ id: "ACCOUNT_2" });
+
+ const toAccountSelect = screen.getByText("Account 2");
+ fireEvent.click(toAccountSelect);
+ fireEvent.click(screen.getAllByText("Account 1")[1]);
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(transactions[0].to.account).toEqual({ id: "ACCOUNT_1" });
+ });
+ });
+
+ test("updates transaction description", async () => {
+ const result = await renderComponent();
+
+ const descriptionInput = screen.getByDisplayValue("Test Transaction 1");
+ fireEvent.change(descriptionInput, {
+ target: { value: "Updated Transaction 1" },
+ });
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(transactions[0].description).toBe("Updated Transaction 1");
+ });
+ });
+
+ test("updates transaction amount", async () => {
+ const result = await renderComponent();
+
+ const amountInput = screen.getByDisplayValue("100.00");
+ fireEvent.change(amountInput, { target: { value: "150.00" } });
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(transactions[0].from.amount).toBe(150);
+ expect(transactions[0].to.amount).toBe(150);
+ });
+ });
+
+ test("updates transaction category", async () => {
+ const result = await renderComponent();
+
+ const categorySelect = screen.getAllByText("(None)")[0];
+ fireEvent.click(categorySelect);
+ fireEvent.click(
+ screen.getByText("- Subcategory 1-1", { selector: "span" }),
+ );
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(transactions[0].transactionCategoryId).toBe("CATEGORY_1_1");
+ });
+ });
+
+ test("updates transaction type and updates status when needed", async () => {
+ const result = await renderComponent();
+
+ let [transactions] = result.current;
+ expect(transactions[0].transactionType).toBe(TransactionType.Transfer);
+ expect(transactions[0].status).toBe(DraftTransactionStatus.ReadyToImport);
+
+ const typeSelect = screen.getByText("Transfer");
+ fireEvent.click(typeSelect);
+ fireEvent.click(screen.getAllByText("Expense")[1]);
+
+ await waitFor(() => {
+ [transactions] = result.current;
+ expect(transactions[0].transactionType).toBe(TransactionType.Expense);
+ // Changing from Transfer -> Expense should move to Review needed
+ expect(transactions[0].status).toBe(DraftTransactionStatus.NeedsReview);
+ expect(toast.warning).toHaveBeenCalled();
+ });
+ });
+
+ test("changing Expense ↔ Income swaps from/to but keeps status", async () => {
+ const { result } = renderHook(() =>
+ useImmer([
+ {
+ providerTransactionId: "X1",
+ date: "2023-01-10",
+ description: "Expense 1",
+ from: { amount: 10, symbolId: "USD", account: { id: "ACCOUNT_1" } },
+ to: { amount: 10, symbolId: "USD", account: { name: "Vendor" } },
+ transactionType: TransactionType.Expense,
+ transactionCategoryId: null,
+ status: DraftTransactionStatus.ReadyToImport,
+ },
+ ]),
+ );
+
+ let [transactions, setTransactions] = result.current;
+
+ render(
+
+
+ ,
+ );
+
+ // Open type selects and chooses Income
+ fireEvent.click(screen.getByText("Expense"));
+ fireEvent.click(screen.getAllByText("Income")[0]);
+
+ await waitFor(() => {
+ [transactions] = result.current;
+ expect(transactions[0].transactionType).toBe(TransactionType.Income);
+ // Status should remain ReadyToImport for expense<->income
+ expect(transactions[0].status).toBe(DraftTransactionStatus.ReadyToImport);
+ // from/to swapped
+ const fromHasName = "name" in (transactions[0].from.account as any);
+ const toHasId = "id" in (transactions[0].to.account as any);
+ expect(fromHasName).toBe(true);
+ expect(toHasId).toBe(true);
+ });
+ });
+
+ describe("Actions cell", () => {
+ test("ReadyToImport → Skip sets SkippedTemporarily", async () => {
+ const result = await renderComponent([mockTransactions[0]]);
+
+ const skipBtn = screen.getByTestId("skip-button");
+ fireEvent.click(skipBtn);
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(transactions[0].status).toBe(
+ DraftTransactionStatus.SkippedTemporarily,
+ );
+ });
+ });
+
+ test("NeedsReview + invalid → Mark as reviewed shows error and stays NeedsReview", async () => {
+ const result = await renderComponent([
+ {
+ providerTransactionId: "A1",
+ date: "2024-01-01",
+ description: "Tx",
+ from: { amount: 1, account: { id: "ACCOUNT_1" } }, // missing symbolId -> invalid
+ to: { amount: 1, symbolId: "USD", account: { name: "Store" } },
+ transactionType: TransactionType.Expense,
+ transactionCategoryId: null,
+ status: DraftTransactionStatus.NeedsReview,
+ },
+ ]);
+
+ const markReviewedBtn = screen.getByTestId("mark-reviewed-button");
+ fireEvent.click(markReviewedBtn);
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(transactions[0].status).toBe(DraftTransactionStatus.NeedsReview);
+ expect(toast.error).toHaveBeenCalledWith(
+ "Please fix the errors before marking as reviewed",
+ );
+ });
+ });
+
+ test("NeedsReview + valid → Mark as reviewed sets ReadyToImport", async () => {
+ const result = await renderComponent([
+ { ...mockTransactions[0], status: DraftTransactionStatus.NeedsReview },
+ ]);
+
+ const markReviewedBtn = screen.getByTestId("mark-reviewed-button");
+ fireEvent.click(markReviewedBtn);
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(toast.error).not.toHaveBeenCalled();
+ expect(transactions[0].status).toBe(
+ DraftTransactionStatus.ReadyToImport,
+ );
+ });
+ });
+
+ test("SkippedTemporarily + valid → Do not skip sets ReadyToImport", async () => {
+ const result = await renderComponent([
+ {
+ ...mockTransactions[0],
+ status: DraftTransactionStatus.SkippedTemporarily,
+ },
+ ]);
+
+ const doNotSkipBtn = screen.getByTestId("do-not-skip-button");
+ fireEvent.click(doNotSkipBtn);
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(transactions[0].status).toBe(
+ DraftTransactionStatus.ReadyToImport,
+ );
+ });
+ });
+
+ test("SkippedTemporarily + invalid → Do not skip sets NeedsReview", async () => {
+ const result = await renderComponent([
+ {
+ ...mockTransactions[0],
+ date: undefined, // missing date -> invalid
+ status: DraftTransactionStatus.SkippedTemporarily,
+ },
+ ]);
+
+ const doNotSkipBtn = screen.getByTestId("do-not-skip-button");
+ fireEvent.click(doNotSkipBtn);
+
+ await waitFor(() => {
+ const [transactions] = result.current;
+ expect(transactions[0].status).toBe(DraftTransactionStatus.NeedsReview);
+ });
+ });
+
+ test("SkippedAlreadyImported → no action buttons rendered", async () => {
+ await renderComponent([
+ {
+ ...mockTransactions[0],
+ status: DraftTransactionStatus.SkippedAlreadyImported,
+ },
+ ]);
+
+ expect(
+ screen.queryByTestId("do-not-skip-button"),
+ ).not.toBeInTheDocument();
+ expect(screen.queryByTestId("skip-button")).not.toBeInTheDocument();
+ expect(
+ screen.queryByTestId("mark-reviewed-button"),
+ ).not.toBeInTheDocument();
+ });
+ });
+});
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..0a4f93a
--- /dev/null
+++ b/apps/client/dashboard/src/components/transaction/import/import-transactions/imported-transactions-table.tsx
@@ -0,0 +1,428 @@
+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}
+ // Prevent the table from resetting the page index when the data changes on input updates.
+ options={{ autoResetPageIndex: false }}
+ />
+
+ );
+}
+
+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.transactionType === "transfer" && (
+ <>
+
+
+
+
+
+
+
+
+ N/A
+ {accounts.map((account) => (
+
+ {account.name}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ N/A
+ {accounts.map((account) => (
+
+ {account.name}
+
+ ))}
+
+
+
+
+ >
+ )}
+ >
+ );
+}
+
+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 (
+
+
+
+
+
+ (None)
+ {rootCategories.map((cat) => (
+
+ ))}
+
+
+ );
+}
+
+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 (
+
+
+
+
+
+ Expense
+ Income
+ Transfer
+
+
+ );
+}
+
+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..aa63763
--- /dev/null
+++ b/apps/client/dashboard/src/components/transaction/import/importers/create-importer-card.tsx
@@ -0,0 +1,71 @@
+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..4a64e4b
--- /dev/null
+++ b/apps/client/dashboard/src/components/transaction/import/importers/create-new-importer-page.tsx
@@ -0,0 +1,37 @@
+import { toast } from "sonner";
+import { ChaseCardImporter, ChaseAccountImporter } 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 (
+
+ );
+ } else if (importerType === "chase-account") {
+ 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..d1fd7d2
--- /dev/null
+++ b/apps/client/dashboard/src/components/transaction/import/importers/importer-card.tsx
@@ -0,0 +1,70 @@
+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, ChaseAccountImporter } 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" ? (
+
+ ) : importer.data.provider === "chase-account" ? (
+
+ ) : null}
+
+ >
+ );
+}
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..ff45a13
--- /dev/null
+++ b/apps/client/dashboard/src/components/transaction/import/importers/providers/chase.tsx
@@ -0,0 +1,414 @@
+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,
+ ChaseAccountTransactionsImporter,
+ type ParsedTransaction,
+ TransactionsImporter as GenericTransactionsImporter,
+} 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;
+
+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 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 (
+
+
+ );
+ };
+
+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,
+ },
+ });
+
+ 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,
+ });
+
+ function onSubmit(values: ImporterForm) {
+ submit.mutate(values);
+ }
+
+ function onDelete() {
+ deleteTransactionsImporter.mutate(importer.id, {
+ onSuccess,
+ onError: (e) => {
+ console.error(e);
+ toast.error(e.message);
+ },
+ });
+ }
+
+ return (
+
+
+ );
+ };
+
+const ImportForm =
+ (provider: "chase-card" | "chase-account") =>
+ ({
+ transactionsImporter,
+ onSuccess,
+ }: {
+ transactionsImporter: TransactionsImporter & {
+ data: { provider: typeof provider };
+ };
+ 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");
+ }
+
+ let importer: GenericTransactionsImporter;
+
+ 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;
+ }
+
+ 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 (
+
+ );
+ };
+
+export const ChaseCardImporter = {
+ 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"),
+};
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 (
<>
-
-
+
+ {type === "text" && "New transaction"}
+ {type === "icon" && }
+
+
+ >
+ );
+}
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.
-
-
-
-
- Rows per page
-
- {
- table.setPageSize(Number(value));
- }}
- >
-
-
-
-
- {[10, 20, 30, 40, 50].map((pageSize) => (
-
- {pageSize}
-
- ))}
-
-
-
-
- Page {table.getState().pagination.pageIndex + 1} of{" "}
- {table.getPageCount()}
-
-
- table.setPageIndex(0)}
- disabled={!table.getCanPreviousPage()}
- >
- Go to first page
-
-
- table.previousPage()}
- disabled={!table.getCanPreviousPage()}
- >
- Go to previous page
-
-
- table.nextPage()}
- disabled={!table.getCanNextPage()}
- >
- Go to next page
-
-
- table.setPageIndex(table.getPageCount() - 1)}
- disabled={!table.getCanNextPage()}
- >
- Go to last page
-
-
-
-
-
-
- );
+ 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(",")}.
+
createAccount.mutateAsync({
diff --git a/apps/client/dashboard/src/contexts/profile-context.ts b/apps/client/dashboard/src/contexts/profile-context.ts
index aecbe02..7e6ff89 100644
--- a/apps/client/dashboard/src/contexts/profile-context.ts
+++ b/apps/client/dashboard/src/contexts/profile-context.ts
@@ -8,6 +8,8 @@ import type {
AssetSymbol,
AssetSymbolExchange,
Profile,
+ ImportedTransaction,
+ TransactionsImporter,
} from "@monyfox/common-data";
import { MutationResult } from "./profile-provider";
@@ -27,7 +29,9 @@ interface ProfileContextProps {
) => Array<{ symbolId: string; balance: number }>;
// Transactions
+ getTransaction: (id: string) => Transaction | null;
createTransaction: MutationResult;
+ createTransactions: MutationResult;
updateTransaction: MutationResult;
deleteTransaction: MutationResult;
getTransactionsBetweenDates: (
@@ -42,6 +46,20 @@ interface ProfileContextProps {
deleteTransactionCategory: MutationResult;
getTransactionCountByCategory: (categoryId: string) => number;
+ // Transaction importers
+ createTransactionsImporters: MutationResult;
+ updateTransactionsImporter: MutationResult;
+ deleteTransactionsImporter: MutationResult;
+
+ // Imported transactions
+ importTransactions: MutationResult<{
+ transactions: Transaction[];
+ importedTransactions: ImportedTransaction[];
+ }>;
+ getImportedTransaction: (
+ providerTransactionId: string,
+ ) => ImportedTransaction | null;
+
// Symbols
getAssetSymbol: (assetSymbolId: string) => AssetSymbol;
getTransactionCountBySymbol: (symbolId: string) => number;
diff --git a/apps/client/dashboard/src/contexts/profile-provider.tsx b/apps/client/dashboard/src/contexts/profile-provider.tsx
index 06c37a5..4ab3bba 100644
--- a/apps/client/dashboard/src/contexts/profile-provider.tsx
+++ b/apps/client/dashboard/src/contexts/profile-provider.tsx
@@ -12,6 +12,8 @@ import {
type TransactionCategory,
TransactionCategorySchema,
type Profile,
+ TransactionsImporter,
+ ImportedTransaction,
} from "@monyfox/common-data";
import { ReactNode, useCallback, useMemo } from "react";
import { LocalDate } from "@js-joda/core";
@@ -20,6 +22,7 @@ import { ErrorPage } from "@/components/error-page";
import { ProfileContext } from "./profile-context";
import { useDatabase } from "@/hooks/use-database";
import { getDataValidationErrors } from "@/utils/data";
+import z from "zod";
export type MutationResult = UseMutationResult;
@@ -95,7 +98,11 @@ export const ProfileProvider = ({
}
return (
-
+
{children}
);
@@ -147,11 +154,25 @@ function DataProvider({
keyof Data,
"lastUpdated" | "assetSymbolExchangersMetadata"
>,
- >(...creations: Array<{ key: K; entity: Data[K][number] }>) {
+ >(
+ ...creations: Array<
+ | {
+ key: K;
+ entity: Data[K][number];
+ }
+ | {
+ key: K;
+ entities: Data[K][number][];
+ }
+ >
+ ) {
await updateDataFields(
- ...creations.map(({ key, entity }) => ({
- key,
- value: [...data[key], entity] as Data[K],
+ ...creations.map((creation) => ({
+ key: creation.key,
+ value:
+ "entity" in creation
+ ? ([...data[creation.key], creation.entity] as Data[K])
+ : ([...data[creation.key], ...creation.entities] as Data[K]),
})),
);
}
@@ -212,6 +233,21 @@ function DataProvider({
);
}, [data.transactions]);
+ const transactionsById = useMemo(() => {
+ const map = new Map();
+ for (const transaction of transactions) {
+ map.set(transaction.id, transaction);
+ }
+ return map;
+ }, [transactions]);
+
+ const getTransaction = useCallback(
+ (id: string): Transaction | null => {
+ return transactionsById.get(id) ?? null;
+ },
+ [transactionsById],
+ );
+
const createTransaction = useMutation({
mutationFn: (t: Transaction) =>
createEntitiesAsync({
@@ -220,6 +256,14 @@ function DataProvider({
}),
});
+ const createTransactions = useMutation({
+ mutationFn: (t: Transaction[]) =>
+ createEntitiesAsync({
+ key: "transactions",
+ entities: z.array(TransactionSchema).parse(t),
+ }),
+ });
+
const updateTransaction = useMutation({
mutationFn: (t: Transaction) =>
updateEntityAsync("transactions", TransactionSchema.parse(t)),
@@ -317,6 +361,54 @@ function DataProvider({
[transactionCountByCategory],
);
+ // Transaction importers
+ const createTransactionsImporters = useMutation({
+ mutationFn: (ti: TransactionsImporter[]) =>
+ createEntitiesAsync({
+ key: "transactionsImporters",
+ entities: ti,
+ }),
+ });
+
+ const updateTransactionsImporter = useMutation({
+ mutationFn: (ti: TransactionsImporter) =>
+ updateEntityAsync("transactionsImporters", ti),
+ });
+
+ const deleteTransactionsImporter = useMutation({
+ mutationFn: (id: string) => deleteEntityAsync("transactionsImporters", id),
+ });
+
+ // Imported transactions
+ const importTransactions = useMutation({
+ mutationFn: ({
+ transactions,
+ importedTransactions,
+ }: {
+ transactions: Transaction[];
+ importedTransactions: ImportedTransaction[];
+ }) =>
+ createEntitiesAsync(
+ { key: "transactions", entities: transactions },
+ { key: "importedTransactions", entities: importedTransactions },
+ ),
+ });
+
+ const importedTransactionsByProviderId = useMemo(() => {
+ const map = new Map();
+ for (const it of data.importedTransactions) {
+ map.set(it.id, it);
+ }
+ return map;
+ }, [data.importedTransactions]);
+
+ const getImportedTransaction = useCallback(
+ (id: string): ImportedTransaction | null => {
+ return importedTransactionsByProviderId.get(id) ?? null;
+ },
+ [importedTransactionsByProviderId],
+ );
+
// Asset symbols
const getAssetSymbol = useCallback(
(symbolId: string): AssetSymbol => {
@@ -477,7 +569,9 @@ function DataProvider({
getBalanceByAccount,
// Transactions
+ getTransaction,
createTransaction,
+ createTransactions,
updateTransaction,
deleteTransaction,
getTransactionsBetweenDates,
@@ -489,6 +583,15 @@ function DataProvider({
deleteTransactionCategory,
getTransactionCountByCategory,
+ // Transactions importers
+ createTransactionsImporters,
+ updateTransactionsImporter,
+ deleteTransactionsImporter,
+
+ // Imported transactions
+ importTransactions,
+ getImportedTransaction,
+
// Symbols
getAssetSymbol,
getTransactionCountBySymbol,
diff --git a/apps/client/dashboard/src/database/database-idb.test.ts b/apps/client/dashboard/src/database/database-idb.test.ts
index 0718233..7a3cc23 100644
--- a/apps/client/dashboard/src/database/database-idb.test.ts
+++ b/apps/client/dashboard/src/database/database-idb.test.ts
@@ -11,6 +11,8 @@ const testProfile: Profile = {
accounts: [],
transactions: [],
transactionCategories: [],
+ transactionsImporters: [],
+ importedTransactions: [],
assetSymbols: [],
assetSymbolExchanges: [],
assetSymbolExchangersMetadata: { alphavantage: null },
diff --git a/apps/client/dashboard/src/routeTree.gen.ts b/apps/client/dashboard/src/routeTree.gen.ts
index e4360ea..89aa08f 100644
--- a/apps/client/dashboard/src/routeTree.gen.ts
+++ b/apps/client/dashboard/src/routeTree.gen.ts
@@ -23,6 +23,9 @@ import { Route as PProfileIdProfileAccountsIndexImport } from './routes/p/$profi
import { Route as PProfileIdProfileSettingsTransactionCategoriesImport } from './routes/p/$profileId/_profile/settings/transaction-categories'
import { Route as PProfileIdProfileSettingsSymbolsImport } from './routes/p/$profileId/_profile/settings/symbols'
import { Route as PProfileIdProfileSettingsBackupImport } from './routes/p/$profileId/_profile/settings/backup'
+import { Route as PProfileIdProfileTransactionsImportIndexImport } from './routes/p/$profileId/_profile/transactions/import/index'
+import { Route as PProfileIdProfileTransactionsImportImportersImporterIdImport } from './routes/p/$profileId/_profile/transactions/import/importers/$importerId'
+import { Route as PProfileIdProfileTransactionsImportImportersNewImporterTypeImport } from './routes/p/$profileId/_profile/transactions/import/importers/new/$importerType'
// Create Virtual Routes
@@ -102,6 +105,27 @@ const PProfileIdProfileSettingsBackupRoute =
getParentRoute: () => PProfileIdProfileRoute,
} as any)
+const PProfileIdProfileTransactionsImportIndexRoute =
+ PProfileIdProfileTransactionsImportIndexImport.update({
+ id: '/transactions/import/',
+ path: '/transactions/import/',
+ getParentRoute: () => PProfileIdProfileRoute,
+ } as any)
+
+const PProfileIdProfileTransactionsImportImportersImporterIdRoute =
+ PProfileIdProfileTransactionsImportImportersImporterIdImport.update({
+ id: '/transactions/import/importers/$importerId',
+ path: '/transactions/import/importers/$importerId',
+ getParentRoute: () => PProfileIdProfileRoute,
+ } as any)
+
+const PProfileIdProfileTransactionsImportImportersNewImporterTypeRoute =
+ PProfileIdProfileTransactionsImportImportersNewImporterTypeImport.update({
+ id: '/transactions/import/importers/new/$importerType',
+ path: '/transactions/import/importers/new/$importerType',
+ getParentRoute: () => PProfileIdProfileRoute,
+ } as any)
+
// Populate the FileRoutesByPath interface
declare module '@tanstack/react-router' {
@@ -183,6 +207,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PProfileIdProfileTransactionsIndexImport
parentRoute: typeof PProfileIdProfileImport
}
+ '/p/$profileId/_profile/transactions/import/': {
+ id: '/p/$profileId/_profile/transactions/import/'
+ path: '/transactions/import'
+ fullPath: '/p/$profileId/transactions/import'
+ preLoaderRoute: typeof PProfileIdProfileTransactionsImportIndexImport
+ parentRoute: typeof PProfileIdProfileImport
+ }
+ '/p/$profileId/_profile/transactions/import/importers/$importerId': {
+ id: '/p/$profileId/_profile/transactions/import/importers/$importerId'
+ path: '/transactions/import/importers/$importerId'
+ fullPath: '/p/$profileId/transactions/import/importers/$importerId'
+ preLoaderRoute: typeof PProfileIdProfileTransactionsImportImportersImporterIdImport
+ parentRoute: typeof PProfileIdProfileImport
+ }
+ '/p/$profileId/_profile/transactions/import/importers/new/$importerType': {
+ id: '/p/$profileId/_profile/transactions/import/importers/new/$importerType'
+ path: '/transactions/import/importers/new/$importerType'
+ fullPath: '/p/$profileId/transactions/import/importers/new/$importerType'
+ preLoaderRoute: typeof PProfileIdProfileTransactionsImportImportersNewImporterTypeImport
+ parentRoute: typeof PProfileIdProfileImport
+ }
}
}
@@ -197,6 +242,9 @@ interface PProfileIdProfileRouteChildren {
PProfileIdProfileChartsIndexRoute: typeof PProfileIdProfileChartsIndexRoute
PProfileIdProfileSettingsIndexRoute: typeof PProfileIdProfileSettingsIndexRoute
PProfileIdProfileTransactionsIndexRoute: typeof PProfileIdProfileTransactionsIndexRoute
+ PProfileIdProfileTransactionsImportIndexRoute: typeof PProfileIdProfileTransactionsImportIndexRoute
+ PProfileIdProfileTransactionsImportImportersImporterIdRoute: typeof PProfileIdProfileTransactionsImportImportersImporterIdRoute
+ PProfileIdProfileTransactionsImportImportersNewImporterTypeRoute: typeof PProfileIdProfileTransactionsImportImportersNewImporterTypeRoute
}
const PProfileIdProfileRouteChildren: PProfileIdProfileRouteChildren = {
@@ -210,6 +258,12 @@ const PProfileIdProfileRouteChildren: PProfileIdProfileRouteChildren = {
PProfileIdProfileSettingsIndexRoute: PProfileIdProfileSettingsIndexRoute,
PProfileIdProfileTransactionsIndexRoute:
PProfileIdProfileTransactionsIndexRoute,
+ PProfileIdProfileTransactionsImportIndexRoute:
+ PProfileIdProfileTransactionsImportIndexRoute,
+ PProfileIdProfileTransactionsImportImportersImporterIdRoute:
+ PProfileIdProfileTransactionsImportImportersImporterIdRoute,
+ PProfileIdProfileTransactionsImportImportersNewImporterTypeRoute:
+ PProfileIdProfileTransactionsImportImportersNewImporterTypeRoute,
}
const PProfileIdProfileRouteWithChildren =
@@ -238,6 +292,9 @@ export interface FileRoutesByFullPath {
'/p/$profileId/charts': typeof PProfileIdProfileChartsIndexRoute
'/p/$profileId/settings': typeof PProfileIdProfileSettingsIndexRoute
'/p/$profileId/transactions': typeof PProfileIdProfileTransactionsIndexRoute
+ '/p/$profileId/transactions/import': typeof PProfileIdProfileTransactionsImportIndexRoute
+ '/p/$profileId/transactions/import/importers/$importerId': typeof PProfileIdProfileTransactionsImportImportersImporterIdRoute
+ '/p/$profileId/transactions/import/importers/new/$importerType': typeof PProfileIdProfileTransactionsImportImportersNewImporterTypeRoute
}
export interface FileRoutesByTo {
@@ -250,6 +307,9 @@ export interface FileRoutesByTo {
'/p/$profileId/charts': typeof PProfileIdProfileChartsIndexRoute
'/p/$profileId/settings': typeof PProfileIdProfileSettingsIndexRoute
'/p/$profileId/transactions': typeof PProfileIdProfileTransactionsIndexRoute
+ '/p/$profileId/transactions/import': typeof PProfileIdProfileTransactionsImportIndexRoute
+ '/p/$profileId/transactions/import/importers/$importerId': typeof PProfileIdProfileTransactionsImportImportersImporterIdRoute
+ '/p/$profileId/transactions/import/importers/new/$importerType': typeof PProfileIdProfileTransactionsImportImportersNewImporterTypeRoute
}
export interface FileRoutesById {
@@ -265,6 +325,9 @@ export interface FileRoutesById {
'/p/$profileId/_profile/charts/': typeof PProfileIdProfileChartsIndexRoute
'/p/$profileId/_profile/settings/': typeof PProfileIdProfileSettingsIndexRoute
'/p/$profileId/_profile/transactions/': typeof PProfileIdProfileTransactionsIndexRoute
+ '/p/$profileId/_profile/transactions/import/': typeof PProfileIdProfileTransactionsImportIndexRoute
+ '/p/$profileId/_profile/transactions/import/importers/$importerId': typeof PProfileIdProfileTransactionsImportImportersImporterIdRoute
+ '/p/$profileId/_profile/transactions/import/importers/new/$importerType': typeof PProfileIdProfileTransactionsImportImportersNewImporterTypeRoute
}
export interface FileRouteTypes {
@@ -280,6 +343,9 @@ export interface FileRouteTypes {
| '/p/$profileId/charts'
| '/p/$profileId/settings'
| '/p/$profileId/transactions'
+ | '/p/$profileId/transactions/import'
+ | '/p/$profileId/transactions/import/importers/$importerId'
+ | '/p/$profileId/transactions/import/importers/new/$importerType'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
@@ -291,6 +357,9 @@ export interface FileRouteTypes {
| '/p/$profileId/charts'
| '/p/$profileId/settings'
| '/p/$profileId/transactions'
+ | '/p/$profileId/transactions/import'
+ | '/p/$profileId/transactions/import/importers/$importerId'
+ | '/p/$profileId/transactions/import/importers/new/$importerType'
id:
| '__root__'
| '/'
@@ -304,6 +373,9 @@ export interface FileRouteTypes {
| '/p/$profileId/_profile/charts/'
| '/p/$profileId/_profile/settings/'
| '/p/$profileId/_profile/transactions/'
+ | '/p/$profileId/_profile/transactions/import/'
+ | '/p/$profileId/_profile/transactions/import/importers/$importerId'
+ | '/p/$profileId/_profile/transactions/import/importers/new/$importerType'
fileRoutesById: FileRoutesById
}
@@ -351,7 +423,10 @@ export const routeTree = rootRoute
"/p/$profileId/_profile/accounts/",
"/p/$profileId/_profile/charts/",
"/p/$profileId/_profile/settings/",
- "/p/$profileId/_profile/transactions/"
+ "/p/$profileId/_profile/transactions/",
+ "/p/$profileId/_profile/transactions/import/",
+ "/p/$profileId/_profile/transactions/import/importers/$importerId",
+ "/p/$profileId/_profile/transactions/import/importers/new/$importerType"
]
},
"/p/$profileId/_profile/": {
@@ -385,6 +460,18 @@ export const routeTree = rootRoute
"/p/$profileId/_profile/transactions/": {
"filePath": "p/$profileId/_profile/transactions/index.tsx",
"parent": "/p/$profileId/_profile"
+ },
+ "/p/$profileId/_profile/transactions/import/": {
+ "filePath": "p/$profileId/_profile/transactions/import/index.tsx",
+ "parent": "/p/$profileId/_profile"
+ },
+ "/p/$profileId/_profile/transactions/import/importers/$importerId": {
+ "filePath": "p/$profileId/_profile/transactions/import/importers/$importerId.tsx",
+ "parent": "/p/$profileId/_profile"
+ },
+ "/p/$profileId/_profile/transactions/import/importers/new/$importerType": {
+ "filePath": "p/$profileId/_profile/transactions/import/importers/new/$importerType.tsx",
+ "parent": "/p/$profileId/_profile"
}
}
}
diff --git a/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/importers/$importerId.tsx b/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/importers/$importerId.tsx
new file mode 100644
index 0000000..733cb20
--- /dev/null
+++ b/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/importers/$importerId.tsx
@@ -0,0 +1,14 @@
+import { ImportTransactionsPage } from "@/components/transaction/import/import-transactions/import-transactions-page";
+import { createFileRoute } from "@tanstack/react-router";
+
+export const Route = createFileRoute(
+ "/p/$profileId/_profile/transactions/import/importers/$importerId",
+)({
+ component: RouteComponent,
+});
+
+function RouteComponent() {
+ const { importerId } = Route.useParams();
+
+ return ;
+}
diff --git a/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/importers/new/$importerType.tsx b/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/importers/new/$importerType.tsx
new file mode 100644
index 0000000..8264427
--- /dev/null
+++ b/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/importers/new/$importerType.tsx
@@ -0,0 +1,30 @@
+import { CreateNewImporterPage } from "@/components/transaction/import/importers/create-new-importer-page";
+import { createFileRoute, useNavigate } from "@tanstack/react-router";
+import { useProfile } from "@/hooks/use-profile.ts";
+import { toast } from "sonner";
+
+export const Route = createFileRoute(
+ "/p/$profileId/_profile/transactions/import/importers/new/$importerType",
+)({
+ component: RouteComponent,
+});
+
+function RouteComponent() {
+ const { importerType } = Route.useParams();
+ const {
+ user: { id: profileId },
+ } = useProfile();
+ const navigate = useNavigate();
+
+ function onSuccess() {
+ toast.success("Importer created");
+ navigate({
+ to: "/p/$profileId/transactions/import",
+ params: { profileId },
+ });
+ }
+
+ return (
+
+ );
+}
diff --git a/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/index.tsx b/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/index.tsx
new file mode 100644
index 0000000..a25d256
--- /dev/null
+++ b/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/import/index.tsx
@@ -0,0 +1,8 @@
+import { ImportDashboardPage } from "@/components/transaction/import/import-dashboard-page";
+import { createFileRoute } from "@tanstack/react-router";
+
+export const Route = createFileRoute(
+ "/p/$profileId/_profile/transactions/import/",
+)({
+ component: ImportDashboardPage,
+});
diff --git a/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/index.tsx b/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/index.tsx
index 16a1504..d2e473e 100644
--- a/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/index.tsx
+++ b/apps/client/dashboard/src/routes/p/$profileId/_profile/transactions/index.tsx
@@ -1,6 +1,6 @@
-import { TransactionsTable } from "@/components/transaction/transactions-table";
+import { TransactionsPage } from "@/components/transaction/transactions-page";
import { createFileRoute } from "@tanstack/react-router";
export const Route = createFileRoute("/p/$profileId/_profile/transactions/")({
- component: TransactionsTable,
+ component: TransactionsPage,
});
diff --git a/apps/client/dashboard/src/utils/data.test.ts b/apps/client/dashboard/src/utils/data.test.ts
index 01b6e38..b09659f 100644
--- a/apps/client/dashboard/src/utils/data.test.ts
+++ b/apps/client/dashboard/src/utils/data.test.ts
@@ -26,6 +26,8 @@ describe("getDataValidationErrors", () => {
{ id: "1", name: "Category 1", parentTransactionCategoryId: "2" },
{ id: "2", name: "Category 2", parentTransactionCategoryId: "1" },
],
+ transactionsImporters: [],
+ importedTransactions: [],
assetSymbols: [],
assetSymbolExchanges: [],
assetSymbolExchangersMetadata: { alphavantage: null },
@@ -43,6 +45,8 @@ describe("getDataValidationErrors", () => {
transactionCategories: [
{ id: "1", name: "Category 1", parentTransactionCategoryId: "2" },
],
+ transactionsImporters: [],
+ importedTransactions: [],
assetSymbols: [],
assetSymbolExchanges: [],
assetSymbolExchangersMetadata: { alphavantage: null },
@@ -73,6 +77,8 @@ describe("getDataValidationErrors", () => {
{ id: "1", name: "Category 1", parentTransactionCategoryId: null },
{ id: "2", name: "Category 2", parentTransactionCategoryId: "1" },
],
+ transactionsImporters: [],
+ importedTransactions: [],
assetSymbols: [],
assetSymbolExchanges: [],
assetSymbolExchangersMetadata: { alphavantage: null },
@@ -103,6 +109,8 @@ describe("getDataValidationErrors", () => {
transactionCategories: [
{ id: "2", name: "Category 2", parentTransactionCategoryId: null },
],
+ transactionsImporters: [],
+ importedTransactions: [],
assetSymbols: [],
assetSymbolExchanges: [],
assetSymbolExchangersMetadata: { alphavantage: null },
@@ -134,6 +142,8 @@ describe("getDataValidationErrors", () => {
{ id: "1", name: "Category 1", parentTransactionCategoryId: null },
{ id: "2", name: "Category 2", parentTransactionCategoryId: "1" },
],
+ transactionsImporters: [],
+ importedTransactions: [],
assetSymbols: [],
assetSymbolExchanges: [],
assetSymbolExchangersMetadata: { alphavantage: null },
diff --git a/apps/client/dashboard/src/utils/data.ts b/apps/client/dashboard/src/utils/data.ts
index a40e419..c593ed8 100644
--- a/apps/client/dashboard/src/utils/data.ts
+++ b/apps/client/dashboard/src/utils/data.ts
@@ -345,6 +345,8 @@ export function generateTestProfile(): Profile {
],
transactions,
transactionCategories,
+ transactionsImporters: [],
+ importedTransactions: [],
assetSymbols: [assetEur, assetUsd, assetIbm],
assetSymbolExchanges: [exchangeEurUsd, exchangeEurIbm],
assetSymbolExchangersMetadata: { alphavantage: { apiKey: "demo" } },
diff --git a/apps/client/dashboard/src/utils/imported-transaction.ts b/apps/client/dashboard/src/utils/imported-transaction.ts
new file mode 100644
index 0000000..7872b81
--- /dev/null
+++ b/apps/client/dashboard/src/utils/imported-transaction.ts
@@ -0,0 +1,41 @@
+import type { ParsedTransaction } from "@monyfox/client-transactions-importer";
+import { getTransactionType } from "@/utils/transaction.ts";
+import type { Account } from "@monyfox/common-data";
+
+export function needsReview(parsedTransaction: ParsedTransaction, getAccount: (accountId: string) => Account) {
+
+ const transactionType = getTransactionType({
+ from: {
+ account: parsedTransaction.from.account !== undefined && "id" in parsedTransaction.from.account ? {
+ id: parsedTransaction.from.account.id,
+ } : {
+ name: parsedTransaction.from.account?.name ?? "",
+ },
+ },
+ to: {
+ account: parsedTransaction.to.account !== undefined && "id" in parsedTransaction.to.account ? {
+ id: parsedTransaction.to.account.id,
+ } : {
+ name: parsedTransaction.to.account?.name ?? "",
+ },
+ },
+ }, getAccount);
+
+ const isTransactionTypeCorrect =
+ (parsedTransaction.transactionType === "income" && transactionType === "income") ||
+ (parsedTransaction.transactionType === "expense" && transactionType === "expense") ||
+ (parsedTransaction.transactionType === "transfer" && transactionType === "transfer");
+
+ return (
+ parsedTransaction.date === undefined ||
+ parsedTransaction.description === undefined ||
+ parsedTransaction.transactionCategoryId === undefined ||
+ parsedTransaction.from.amount === undefined ||
+ parsedTransaction.from.symbolId === undefined ||
+ parsedTransaction.from.account === undefined ||
+ parsedTransaction.to.amount === undefined ||
+ parsedTransaction.to.symbolId === undefined ||
+ parsedTransaction.to.account === undefined ||
+ !isTransactionTypeCorrect
+ );
+}
diff --git a/apps/client/dashboard/src/utils/tests/contexts.tsx b/apps/client/dashboard/src/utils/tests/contexts.tsx
index b651351..3890bf1 100644
--- a/apps/client/dashboard/src/utils/tests/contexts.tsx
+++ b/apps/client/dashboard/src/utils/tests/contexts.tsx
@@ -2,7 +2,11 @@ import { SidebarProvider } from "@/components/ui/sidebar";
import { AssetSymbolExchangeRateProvider } from "@/contexts/asset-symbol-exchange-rate-provider";
import { ProfileProvider } from "@/contexts/profile-provider";
import { SettingsProvider } from "@/contexts/settings-provider";
-import { type TransactionCategory, type Profile } from "@monyfox/common-data";
+import {
+ type TransactionCategory,
+ type Profile,
+ TransactionsImporter,
+} from "@monyfox/common-data";
import {
QueryClient,
QueryClientProvider,
@@ -20,6 +24,7 @@ export function TestDatabaseProvider({
withInvalidSchema = false,
withInvalidData = false,
withTransactions = true,
+ withOptionalField = false,
withFiat = true,
withStocks = true,
}: {
@@ -28,6 +33,7 @@ export function TestDatabaseProvider({
withInvalidSchema?: boolean;
withInvalidData?: boolean;
withTransactions?: boolean;
+ withOptionalField?: boolean;
withFiat?: boolean;
withStocks?: boolean;
}) {
@@ -37,137 +43,152 @@ export function TestDatabaseProvider({
user: "TEST_USER",
data: withEncryptedData
? {
- encrypted: true,
- data: "ENCRYPTED_DATA",
- }
+ encrypted: true,
+ data: "ENCRYPTED_DATA",
+ }
: {
- encrypted: false,
- data: {
- accounts: [
+ encrypted: false,
+ data: {
+ accounts: [
+ {
+ id: "ACCOUNT_1",
+ name: "Account 1",
+ isPersonalAsset: true,
+ },
+ {
+ id: "ACCOUNT_2",
+ name: "Account 2",
+ isPersonalAsset: true,
+ },
+ ],
+ assetSymbols: [
+ ...(withFiat
+ ? [
+ {
+ id: "EUR",
+ code: "EUR",
+ displayName: "EUR",
+ type: "fiat" as const,
+ },
+ {
+ id: "USD",
+ code: "USD",
+ displayName: "USD",
+ type: "fiat" as const,
+ },
+ {
+ id: "CHF",
+ code: "CHF",
+ displayName: "CHF",
+ type: "fiat" as const,
+ },
+ ]
+ : []),
+ ...(withStocks
+ ? [
+ {
+ id: "MWRD",
+ code: "MWRD",
+ displayName: "MWRD ETF name",
+ type: "stock" as const,
+ },
+ ]
+ : []),
+ ],
+ assetSymbolExchanges: [],
+ assetSymbolExchangersMetadata: {
+ alphavantage: withStocks ? { apiKey: "TEST_API_KEY" } : null,
+ },
+ transactions: withTransactions
+ ? [
{
- id: "ACCOUNT_1",
- name: "Account 1",
- isPersonalAsset: true,
+ 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: "ACCOUNT_2",
- name: "Account 2",
- isPersonalAsset: true,
+ 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: withInvalidSchema
+ ? // @ts-expect-error - Invalid schema
+ (null as TransactionCategory[])
+ : [
+ {
+ id: "CATEGORY_1",
+ name: "Category 1",
+ parentTransactionCategoryId: withInvalidData
+ ? "CATEGORY_1_1" // Cyclic dependency for invalid data
+ : null,
+ },
+ {
+ id: "CATEGORY_1_1",
+ name: "Subcategory 1-1",
+ parentTransactionCategoryId: "CATEGORY_1",
},
],
- assetSymbols: [
- ...(withFiat
- ? [
- {
- id: "EUR",
- code: "EUR",
- displayName: "EUR",
- type: "fiat" as const,
- },
- {
- id: "USD",
- code: "USD",
- displayName: "USD",
- type: "fiat" as const,
- },
- {
- id: "CHF",
- code: "CHF",
- displayName: "CHF",
- type: "fiat" as const,
- },
- ]
- : []),
- ...(withStocks
- ? [
- {
- id: "MWRD",
- code: "MWRD",
- displayName: "MWRD ETF name",
- type: "stock" as const,
- },
- ]
- : []),
+ transactionsImporters: withOptionalField
+ ? // @ts-expect-error - Invalid schema
+ (undefined as TransactionsImporter[])
+ : [
+ {
+ id: "IMPORTER_1",
+ name: "Importer 1",
+ data: {
+ provider: "chase-card",
+ defaultAccountId: "ACCOUNT_1",
+ defaultSymbolId: "USD",
+ },
+ },
],
- assetSymbolExchanges: [],
- assetSymbolExchangersMetadata: {
- alphavantage: withStocks ? { apiKey: "TEST_API_KEY" } : null,
- },
- transactions: withTransactions
- ? [
- {
- 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: withInvalidSchema
- ? // @ts-expect-error - Invalid schema
- (null as TransactionCategory[])
- : [
- {
- id: "CATEGORY_1",
- name: "Category 1",
- parentTransactionCategoryId: withInvalidData
- ? "CATEGORY_1_1" // Cyclic dependency for invalid data
- : null,
- },
- {
- id: "CATEGORY_1_1",
- name: "Subcategory 1-1",
- parentTransactionCategoryId: "CATEGORY_1",
- },
- ],
- lastUpdated: "2024-01-01T00:00:00.000Z",
- },
+ importedTransactions: [],
+ lastUpdated: "2024-01-01T00:00:00.000Z",
},
+ },
schemaVersion: "1",
},
]);
@@ -219,6 +240,7 @@ const queryClient = new QueryClient({
},
},
});
+
export function TestQueryClientProvider({ children }: { children: ReactNode }) {
return (
{children}
@@ -232,6 +254,7 @@ export function TestContextProvider({
withInvalidSchema = false,
withInvalidData = false,
withTransactions = true,
+ withOptionalField = false,
withFiat = true,
withStocks = true,
}: {
@@ -241,6 +264,7 @@ export function TestContextProvider({
withInvalidSchema?: boolean;
withInvalidData?: boolean;
withTransactions?: boolean;
+ withOptionalField?: boolean;
withFiat?: boolean;
withStocks?: boolean;
}) {
@@ -251,6 +275,7 @@ export function TestContextProvider({
withInvalidSchema={withInvalidSchema}
withInvalidData={withInvalidData}
withTransactions={withTransactions}
+ withOptionalField={withOptionalField}
withFiat={withFiat}
withStocks={withStocks}
>
diff --git a/apps/client/dashboard/src/utils/transaction.test.ts b/apps/client/dashboard/src/utils/transaction.test.ts
index 441e001..19b22b3 100644
--- a/apps/client/dashboard/src/utils/transaction.test.ts
+++ b/apps/client/dashboard/src/utils/transaction.test.ts
@@ -1,33 +1,24 @@
-import { describe, expect, test } from "vitest";
+import {describe, expect, test} from "vitest";
import {
getIncomeExpenseByMonthData,
getTransactionType,
getBalancesByMonth,
getStartAndEndDate,
} from "./transaction";
-import { LocalDate } from "@js-joda/core";
-import { type Transaction } from "@monyfox/common-data";
+import {LocalDate} from "@js-joda/core";
+import {type Transaction} from "@monyfox/common-data";
describe("getTransactionType", () => {
test("income", () => {
expect(
getTransactionType(
{
- id: "1",
- description: "test",
- accountingDate: "2025-01-01",
- transactionDate: "2025-01-01",
- transactionCategoryId: null,
from: {
- amount: 100,
- symbolId: "EUR",
account: {
id: "1",
},
},
to: {
- amount: 100,
- symbolId: "EUR",
account: {
id: "2",
},
@@ -46,21 +37,12 @@ describe("getTransactionType", () => {
expect(
getTransactionType(
{
- id: "1",
- description: "test",
- accountingDate: "2025-01-01",
- transactionDate: "2025-01-01",
- transactionCategoryId: null,
from: {
- amount: 100,
- symbolId: "EUR",
account: {
id: "2",
},
},
to: {
- amount: 100,
- symbolId: "EUR",
account: {
id: "1",
},
@@ -79,21 +61,12 @@ describe("getTransactionType", () => {
expect(
getTransactionType(
{
- id: "1",
- description: "test",
- accountingDate: "2025-01-01",
- transactionDate: "2025-01-01",
- transactionCategoryId: null,
from: {
- amount: 100,
- symbolId: "EUR",
account: {
id: "1",
},
},
to: {
- amount: 100,
- symbolId: "EUR",
account: {
id: "2",
},
@@ -112,21 +85,12 @@ describe("getTransactionType", () => {
expect(
getTransactionType(
{
- id: "1",
- description: "test",
- accountingDate: "2025-01-01",
- transactionDate: "2025-01-01",
- transactionCategoryId: null,
from: {
- amount: 100,
- symbolId: "EUR",
account: {
name: "test 1",
},
},
to: {
- amount: 100,
- symbolId: "EUR",
account: {
name: "test 2",
},
@@ -216,7 +180,7 @@ describe("getIncomeExpenseByMonthData", () => {
isPersonalAsset: true,
});
- const convertAmount = ({ amount }: { amount: number }) => amount;
+ const convertAmount = ({amount}: { amount: number }) => amount;
const defaultSymbolId = "EUR";
const startDate = LocalDate.parse("2025-01-01");
@@ -232,10 +196,10 @@ describe("getIncomeExpenseByMonthData", () => {
});
expect(result).toEqual([
- { date: "2025-01", income: 100, expense: 0 },
- { date: "2025-02", income: 0, expense: 0 },
- { date: "2025-03", income: 0, expense: 0 },
- { date: "2025-04", income: 0, expense: 300 },
+ {date: "2025-01", income: 100, expense: 0},
+ {date: "2025-02", income: 0, expense: 0},
+ {date: "2025-03", income: 0, expense: 0},
+ {date: "2025-04", income: 0, expense: 300},
// TODO: Fix this test
// { date: "2025-03", income: 0, expense: 0 },
]);
@@ -336,7 +300,7 @@ describe("getBalancesByMonth", () => {
name: "test",
isPersonalAsset: true,
});
- const convertAmount = ({ amount }: { amount: number }) => amount;
+ const convertAmount = ({amount}: { amount: number }) => amount;
const startDate = LocalDate.parse("2025-01-01");
const endDate = LocalDate.parse("2025-04-30");
@@ -351,10 +315,10 @@ describe("getBalancesByMonth", () => {
});
expect(result).toEqual([
- { date: "2025-01", balance: 100 },
- { date: "2025-02", balance: 100 },
- { date: "2025-03", balance: 100 },
- { date: "2025-04", balance: -200 },
+ {date: "2025-01", balance: 100},
+ {date: "2025-02", balance: 100},
+ {date: "2025-03", balance: 100},
+ {date: "2025-04", balance: -200},
]);
});
@@ -366,7 +330,7 @@ describe("getBalancesByMonth", () => {
name: "test",
isPersonalAsset: true,
});
- const convertAmount = ({ amount }: { amount: number }) => amount;
+ const convertAmount = ({amount}: { amount: number }) => amount;
const startDate = LocalDate.parse("2025-01-01");
const endDate = LocalDate.parse("2025-03-01");
@@ -381,8 +345,8 @@ describe("getBalancesByMonth", () => {
});
expect(result).toEqual([
- { date: "2025-01", balance: 0 },
- { date: "2025-02", balance: 0 },
+ {date: "2025-01", balance: 0},
+ {date: "2025-02", balance: 0},
// TODO: Fix this test
// { date: "2025-03", balance: 0 },
]);
diff --git a/apps/client/dashboard/src/utils/transaction.ts b/apps/client/dashboard/src/utils/transaction.ts
index 72b01df..bb218e0 100644
--- a/apps/client/dashboard/src/utils/transaction.ts
+++ b/apps/client/dashboard/src/utils/transaction.ts
@@ -1,5 +1,5 @@
-import { LocalDate, YearMonth } from "@js-joda/core";
-import { type Account, type Transaction } from "@monyfox/common-data";
+import {LocalDate, YearMonth} from "@js-joda/core";
+import {type Account, type Transaction} from "@monyfox/common-data";
export enum TransactionType {
Unknown = "unknown",
@@ -9,7 +9,7 @@ export enum TransactionType {
}
export function getTransactionType(
- transaction: Transaction,
+ transaction: { from: { account: Transaction['from']['account'] }, to: { account: Transaction['to']['account'] } },
getAccount: (accountId: string) => Account,
) {
const isFromPersonalAsset =
@@ -73,7 +73,7 @@ export function getIncomeExpenseByMonthData({
).toString();
if (!stateByDate.has(transactionDate)) {
- stateByDate.set(transactionDate, { income: 0, expense: 0 });
+ stateByDate.set(transactionDate, {income: 0, expense: 0});
}
const state = stateByDate.get(transactionDate)!;
@@ -155,7 +155,7 @@ export function getIncomeExpenseByCategoryData({
const transactionCategoryId = transaction.transactionCategoryId;
if (!stateByCategoryId.has(transactionCategoryId)) {
- stateByCategoryId.set(transactionCategoryId, { income: 0, expense: 0 });
+ stateByCategoryId.set(transactionCategoryId, {income: 0, expense: 0});
}
const state = stateByCategoryId.get(transactionCategoryId)!;
diff --git a/apps/client/dashboard/src/utils/type.ts b/apps/client/dashboard/src/utils/type.ts
new file mode 100644
index 0000000..85452bf
--- /dev/null
+++ b/apps/client/dashboard/src/utils/type.ts
@@ -0,0 +1,5 @@
+export function assertNever(value: never): never {
+ throw new Error(
+ `Unexpected value: ${value}. This should never happen. Please report this issue.`,
+ );
+}
diff --git a/package.json b/package.json
index d63753c..eead097 100644
--- a/package.json
+++ b/package.json
@@ -25,8 +25,5 @@
"engines": {
"node": ">=22.14.0"
},
- "packageManager": "yarn@4.9.1",
- "dependencies": {
- "date-fns": "^4.1.0"
- }
+ "packageManager": "yarn@4.9.1"
}
diff --git a/packages/client/transactions-importer/.gitignore b/packages/client/transactions-importer/.gitignore
new file mode 100644
index 0000000..53c37a1
--- /dev/null
+++ b/packages/client/transactions-importer/.gitignore
@@ -0,0 +1 @@
+dist
\ No newline at end of file
diff --git a/packages/client/transactions-importer/package.json b/packages/client/transactions-importer/package.json
new file mode 100644
index 0000000..451a91a
--- /dev/null
+++ b/packages/client/transactions-importer/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "@monyfox/client-transactions-importer",
+ "type": "module",
+ "private": true,
+ "version": "1.0.0",
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "scripts": {
+ "build": "tsc"
+ },
+ "dependencies": {
+ "@monyfox/common-data": "workspace:*",
+ "papaparse": "^5.5.3",
+ "zod": "^4.1.5"
+ },
+ "devDependencies": {
+ "@types/papaparse": "^5.3.16",
+ "typescript": "^5.9.2",
+ "vitest": "^3.2.4"
+ },
+ "packageManager": "yarn@4.3.1"
+}
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..9c5be6b
--- /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,"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" },
+ );
+
+ 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-CHASE CREDIT CRD AUTOPAY PPD ID: 123456789",
+ transactionType: "expense",
+ description: "CHASE CREDIT CRD AUTOPAY PPD ID: 123456789",
+ 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..ed19483
--- /dev/null
+++ b/packages/client/transactions-importer/src/importers/chase/chase-account.ts
@@ -0,0 +1,130 @@
+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("DSLIP"),
+ 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(),
+ "__ignore__": 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 {
+ 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);
+ }
+
+ 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":
+ case "CHECK_DEPOSIT":
+ 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");
+ }
+}
diff --git a/packages/client/transactions-importer/src/importers/chase/chase-card.test.ts b/packages/client/transactions-importer/src/importers/chase/chase-card.test.ts
new file mode 100644
index 0000000..07c96bd
--- /dev/null
+++ b/packages/client/transactions-importer/src/importers/chase/chase-card.test.ts
@@ -0,0 +1,120 @@
+import { ChaseCardTransactionsImporter } from "./chase-card";
+import { describe, expect, test } from "vitest";
+
+describe("ChaseCardTransactionsImporter", () => {
+ const accountId = "test-account-id";
+ const symbolId = "test-symbol-id";
+ const importer = new ChaseCardTransactionsImporter({ accountId, symbolId });
+
+ describe("getTransactions", () => {
+ test("parse transactions correctly", async () => {
+ const file = new File(
+ [
+ `Transaction Date,Post Date,Description,Category,Type,Amount,Memo\n` +
+ `09/12/2025,09/14/2025,MERCHANT 1,Shopping,Return,25.00,\n` +
+ `09/12/2025,09/14/2025,MERCHANT 2,Food & Drink,Sale,-21.45,\n` +
+ `09/06/2025,09/07/2025,MERCHANT 1,Shopping,Sale,-25.00,\n` +
+ `08/01/2025,08/03/2025,Payment Thank You-Mobile,,Payment,50.00,\n`,
+ ],
+ "test.csv",
+ { type: "text/csv" },
+ );
+
+ const transactions = await importer.getTransactions(file);
+
+ expect(transactions).toHaveLength(4);
+ expect(transactions[0]).toEqual({
+ providerTransactionId: "chase-card-09/12/2025-25.00-MERCHANT 1",
+ transactionType: "income",
+ description: "MERCHANT 1",
+ date: "2025-09-12",
+ transactionCategoryId: null,
+ from: {
+ amount: 25,
+ symbolId,
+ account: { name: "MERCHANT 1" },
+ },
+ to: {
+ amount: 25,
+ symbolId,
+ account: { id: accountId },
+ },
+ });
+
+ expect(transactions[1]).toEqual({
+ providerTransactionId: "chase-card-09/12/2025--21.45-MERCHANT 2",
+ transactionType: "expense",
+ description: "MERCHANT 2",
+ date: "2025-09-12",
+ transactionCategoryId: null,
+ from: {
+ amount: 21.45,
+ symbolId,
+ account: { id: accountId },
+ },
+ to: {
+ amount: 21.45,
+ symbolId,
+ account: { name: "MERCHANT 2" },
+ },
+ });
+
+ expect(transactions[2]).toEqual({
+ providerTransactionId: "chase-card-09/06/2025--25.00-MERCHANT 1",
+ transactionType: "expense",
+ description: "MERCHANT 1",
+ date: "2025-09-06",
+ transactionCategoryId: null,
+ from: {
+ amount: 25,
+ symbolId,
+ account: { id: accountId },
+ },
+ to: {
+ amount: 25,
+ symbolId,
+ account: { name: "MERCHANT 1" },
+ },
+ });
+
+ expect(transactions[3]).toEqual({
+ providerTransactionId:
+ "chase-card-08/01/2025-50.00-Payment Thank You-Mobile",
+ transactionType: "transfer",
+ description: "Payment Thank You-Mobile",
+ date: "2025-08-01",
+ transactionCategoryId: null,
+ from: {
+ amount: 50,
+ symbolId,
+ account: undefined,
+ },
+ to: {
+ amount: 50,
+ symbolId,
+ account: undefined,
+ },
+ });
+ });
+ });
+
+ describe("getCategories", () => {
+ test("should extract categories correctly", async () => {
+ const file = new File(
+ [
+ `Transaction Date,Post Date,Description,Category,Type,Amount,Memo\n` +
+ `09/12/2025,09/14/2025,MERCHANT 1,Shopping,Return,25.00,\n` +
+ `09/12/2025,09/14/2025,MERCHANT 2,Food & Drink,Sale,-21.45,\n` +
+ `09/06/2025,09/07/2025,MERCHANT 1,Shopping,Sale,-25.00,\n` +
+ `08/01/2025,08/03/2025,Payment Thank You-Mobile,,Payment,50.00,\n`,
+ ],
+ "test.csv",
+ { type: "text/csv" },
+ );
+
+ const categories = await importer.getCategories(file);
+
+ expect(categories).toEqual(["Shopping", "Food & Drink"]);
+ });
+ });
+});
diff --git a/packages/client/transactions-importer/src/importers/chase/chase-card.ts b/packages/client/transactions-importer/src/importers/chase/chase-card.ts
new file mode 100644
index 0000000..5ae4238
--- /dev/null
+++ b/packages/client/transactions-importer/src/importers/chase/chase-card.ts
@@ -0,0 +1,124 @@
+import { format, parse } from "date-fns";
+import { ParsedTransaction, TransactionsImporter } from "..";
+import { CsvParser } from "../../utils/csv-parser";
+import z from "zod";
+
+// (Added spaces between columns to make it easier to read.)
+// Transaction Date, Post Date , Description , Category , Type , Amount, Memo
+// 09/12/2025 , 09/14/2025, MERCHANT 1 , Shopping , Return , 25.00,
+// 09/12/2025 , 09/14/2025, MERCHANT 2 , Food & Drink, Sale , -21.45,
+// 09/06/2025 , 09/07/2025, MERCHANT 1 , Shopping , Sale , -25.00,
+// 08/01/2025 , 08/03/2025, Payment Thank You-Mobile, , Payment, 50.00,
+
+const RowSchema = z.object({
+ "Transaction Date": z.string(),
+ "Post Date": z.string(),
+ Description: z.string(),
+ Category: z.string(),
+ Type: z.union([
+ z.literal("Sale"),
+ z.literal("Return"),
+ z.literal("Payment"),
+ z.literal("Fee"),
+ z.literal("Adjustment"),
+ ]),
+ Amount: z.string(),
+ Memo: z.string(),
+});
+type Row = z.infer;
+
+export class ChaseCardTransactionsImporter
+ implements TransactionsImporter
+{
+ private static importerName = "chase-card";
+
+ private accountId: string;
+ private 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);
+ }
+
+ async getCategories(file: File): Promise {
+ const csvParser = new CsvParser(RowSchema, { header: true });
+ const rows = await csvParser.fromFile(file);
+
+ const categories = new Set();
+
+ rows.forEach((row) => {
+ const category = row["Category"];
+ if (category !== "") {
+ categories.add(category);
+ }
+ });
+
+ return Array.from(categories);
+ }
+
+ private toImportedTransaction(row: Row): ParsedTransaction {
+ const merchantAccount = { name: row.Description };
+ const date = ChaseCardTransactionsImporter.freedomDateToIso(
+ row["Transaction 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;
+
+ if (row["Type"] === "Payment") {
+ transactionType = "transfer";
+ } else {
+ if (signedAmount < 0) {
+ transactionType = "expense";
+ fromAccount = { id: this.accountId };
+ toAccount = merchantAccount;
+ } else {
+ transactionType = "income";
+ fromAccount = merchantAccount;
+ toAccount = { id: this.accountId };
+ }
+ }
+
+ return {
+ providerTransactionId:
+ ChaseCardTransactionsImporter.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["Transaction Date"]}-${row.Amount}-${row.Description}`;
+ }
+
+ private static freedomDateToIso(date: string): string {
+ return format(parse(date, "MM/dd/yyyy", new Date()), "yyyy-MM-dd");
+ }
+}
diff --git a/packages/client/transactions-importer/src/importers/index.ts b/packages/client/transactions-importer/src/importers/index.ts
new file mode 100644
index 0000000..e14fe39
--- /dev/null
+++ b/packages/client/transactions-importer/src/importers/index.ts
@@ -0,0 +1,19 @@
+type ImportedTransactionAccountData = {
+ amount?: number;
+ symbolId?: string;
+ account?: { id: string } | { name: string };
+};
+
+export type ParsedTransaction = {
+ providerTransactionId: string;
+ transactionType: "income" | "expense" | "transfer";
+ description?: string;
+ transactionCategoryId?: string | null;
+ date?: string; // ISO date
+ from: ImportedTransactionAccountData;
+ to: ImportedTransactionAccountData;
+};
+
+export interface TransactionsImporter {
+ getTransactions(data: Input): Promise;
+}
diff --git a/packages/client/transactions-importer/src/index.ts b/packages/client/transactions-importer/src/index.ts
new file mode 100644
index 0000000..ffd985e
--- /dev/null
+++ b/packages/client/transactions-importer/src/index.ts
@@ -0,0 +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.test.ts b/packages/client/transactions-importer/src/utils/csv-parser.test.ts
new file mode 100644
index 0000000..6c16356
--- /dev/null
+++ b/packages/client/transactions-importer/src/utils/csv-parser.test.ts
@@ -0,0 +1,69 @@
+import { CsvParser } from "./csv-parser";
+import { describe, expect, test, vi } from "vitest";
+import z from "zod";
+import Papa from "papaparse";
+
+describe("CsvParser", () => {
+ test("parse a CSV file with headers", async () => {
+ const rowSchema = z.object({
+ name: z.string(),
+ age: z.string(),
+ });
+
+ const csvParser = new CsvParser(rowSchema, { header: true });
+ const file = new File(["name,age\nJohn,30\nJane,25"], "test.csv", {
+ type: "text/csv",
+ });
+
+ const result = await csvParser.fromFile(file);
+ expect(result).toEqual([
+ { name: "John", age: "30" },
+ { name: "Jane", age: "25" },
+ ]);
+ });
+
+ test("reject an invalid CSV file", async () => {
+ const rowSchema = z.object({
+ name: z.string(),
+ age: z.number(),
+ });
+
+ const csvParser = new CsvParser(rowSchema, { header: true });
+ const file = new File(["name,age\nJohn,thirty\nJane"], "test.csv", {
+ type: "text/csv",
+ });
+
+ await expect(csvParser.fromFile(file)).rejects.toThrowError(
+ "Row undefined: Unable to auto-detect delimiting character; defaulted to ','; Row 1: Too few fields: expected 2 fields but parsed 1",
+ );
+ });
+
+ test("reject a CSV file with invalid schema", async () => {
+ const rowSchema = z.object({
+ name: z.string(),
+ age: z.number(),
+ });
+
+ const csvParser = new CsvParser(rowSchema, { header: true });
+ const file = new File(["name,age\nJohn,thirty\nJane,25"], "test.csv", {
+ type: "text/csv",
+ });
+
+ await expect(csvParser.fromFile(file)).rejects.toThrowError(
+ "Row 0, field age: Invalid input: expected number, received string; Row 1, field age: Invalid input: expected number, received string",
+ );
+ });
+
+ test("reject when Papa.parse errors", async () => {
+ vi.spyOn(Papa, "parse").mockImplementationOnce(() => {
+ throw new Error("Papa.parse error");
+ });
+
+ const csvParser = new CsvParser(z.object(), { header: true });
+ const file = new File([], "test.csv");
+
+ await expect(csvParser.fromFile(file)).rejects.toThrowError(
+ "Papa.parse error",
+ );
+ });
+});
diff --git a/packages/client/transactions-importer/src/utils/csv-parser.ts b/packages/client/transactions-importer/src/utils/csv-parser.ts
new file mode 100644
index 0000000..50feeea
--- /dev/null
+++ b/packages/client/transactions-importer/src/utils/csv-parser.ts
@@ -0,0 +1,58 @@
+import Papa, { type ParseLocalConfig } from "papaparse";
+import z from "zod";
+
+type AcceptedParseLocalConfig = {
+ header?: ParseLocalConfig["header"],
+ beforeFirstChunk?: ParseLocalConfig["beforeFirstChunk"]
+};
+
+export class CsvParser {
+ private rowSchema: z.ZodType;
+ private config?: AcceptedParseLocalConfig;
+
+ constructor(rowSchema: z.ZodType, config?: AcceptedParseLocalConfig) {
+ this.rowSchema = rowSchema;
+ this.config = config;
+ }
+
+ async fromFile(file: File) {
+ return new Promise(async (resolve, reject) => {
+ try {
+ Papa.parse(file, {
+ header: this.config?.header,
+ beforeFirstChunk: this.config?.beforeFirstChunk,
+ skipEmptyLines: true,
+ complete: (result) => {
+ if (result.errors.length > 0) {
+ reject(
+ new Error(
+ result.errors
+ .map((e) => `Row ${e.row}: ${e.message}`)
+ .join("; "),
+ ),
+ );
+ return;
+ }
+
+ const { success, data, error } = z
+ .array(this.rowSchema)
+ .safeParse(result.data);
+ if (success) {
+ resolve(data);
+ } else {
+ const message = error.issues
+ .map((issue) => {
+ const [row, field] = issue.path;
+ return `Row ${row.toString()}, field ${field.toString()}: ${issue.message}`;
+ })
+ .join("; ");
+ reject(new Error(message));
+ }
+ },
+ });
+ } catch (e) {
+ reject(e);
+ }
+ });
+ }
+}
diff --git a/packages/client/transactions-importer/tsconfig.json b/packages/client/transactions-importer/tsconfig.json
new file mode 100644
index 0000000..b4cd7d6
--- /dev/null
+++ b/packages/client/transactions-importer/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vitexpress/tsconfig-node/tsconfig.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "outDir": "dist",
+ },
+ "include": ["src"]
+}
diff --git a/packages/client/transactions-importer/vitest.config.ts b/packages/client/transactions-importer/vitest.config.ts
new file mode 100644
index 0000000..07c5f08
--- /dev/null
+++ b/packages/client/transactions-importer/vitest.config.ts
@@ -0,0 +1,7 @@
+import { defineProject } from "vitest/config";
+
+export default defineProject({
+ test: {
+ environment: "jsdom",
+ },
+});
diff --git a/packages/common/data/src/index.ts b/packages/common/data/src/index.ts
index c60a6cb..eccd238 100644
--- a/packages/common/data/src/index.ts
+++ b/packages/common/data/src/index.ts
@@ -8,6 +8,10 @@ import { DataSchema, RawDataSchema } from "./schemas/data";
import { ProfileSchema } from "./schemas/profile";
import { TransactionSchema } from "./schemas/transaction";
import { TransactionCategorySchema } from "./schemas/transaction-category";
+import {
+ ImportedTransactionSchema,
+ TransactionsImporterSchema,
+} from "./schemas/transactions-importer";
export { AccountSchema } from "./schemas/account";
export type Account = z.infer;
@@ -32,3 +36,6 @@ export { TransactionSchema } from "./schemas/transaction";
export type TransactionCategory = z.infer;
export { TransactionCategorySchema } from "./schemas/transaction-category";
+
+export type TransactionsImporter = z.infer;
+export type ImportedTransaction = z.infer;
diff --git a/packages/common/data/src/schemas/data.ts b/packages/common/data/src/schemas/data.ts
index 3938614..2a90111 100644
--- a/packages/common/data/src/schemas/data.ts
+++ b/packages/common/data/src/schemas/data.ts
@@ -7,11 +7,17 @@ import {
AssetSymbolSchema,
} from "./asset-symbol";
import { TransactionCategorySchema } from "./transaction-category";
+import {
+ ImportedTransactionSchema,
+ TransactionsImporterSchema,
+} from "./transactions-importer";
export const DataSchema = z.object({
accounts: z.array(AccountSchema),
transactions: z.array(TransactionSchema),
transactionCategories: z.array(TransactionCategorySchema),
+ transactionsImporters: z.array(TransactionsImporterSchema).default([]),
+ importedTransactions: z.array(ImportedTransactionSchema).default([]),
assetSymbols: z.array(AssetSymbolSchema),
assetSymbolExchanges: z.array(AssetSymbolExchangeSchema),
assetSymbolExchangersMetadata: AssetSymbolExchangersMetadataSchema,
diff --git a/packages/common/data/src/schemas/transactions-importer.ts b/packages/common/data/src/schemas/transactions-importer.ts
new file mode 100644
index 0000000..937c81d
--- /dev/null
+++ b/packages/common/data/src/schemas/transactions-importer.ts
@@ -0,0 +1,30 @@
+import { z } from "zod";
+
+const TransactionsImporterDataSchema = z.discriminatedUnion("provider", [
+ z.object({
+ provider: z.literal("chase-card"),
+ defaultAccountId: z.string(),
+ defaultSymbolId: z.string(),
+ }),
+]);
+
+export const TransactionsImporterSchema = z.object({
+ id: z.string(),
+ name: z.string(),
+ data: TransactionsImporterDataSchema,
+});
+
+export const ImportedTransactionSchema = z.object({
+ id: z.string(), // Provider transaction ID
+ importerId: z.string(),
+ importedAt: z.iso.datetime(),
+ data: z.discriminatedUnion("status", [
+ z.object({
+ status: z.literal("imported"),
+ transactionId: z.string(),
+ }),
+ z.object({
+ status: z.literal("skipped"),
+ }),
+ ]),
+});
diff --git a/yarn.lock b/yarn.lock
index e95f19e..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
+ version: 7.28.5
+ resolution: "@babel/compat-data@npm:7.28.5"
+ checksum: 10c0/702a25de73087b0eba325c1d10979eed7c9b6662677386ba7b5aa6eace0fc0676f78343bae080a0176ae26f58bd5535d73b9d0fbb547fef377692e8b249353a7
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"
+"@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.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
- languageName: node
- linkType: hard
-
-"@babel/core@npm:^7.28.3":
- version: 7.28.3
- resolution: "@babel/core@npm:7.28.3"
- 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
- 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"
- 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
+ checksum: 10c0/535f82238027621da6bdffbdbe896ebad3558b311d6f8abc680637a9859b96edbf929ab010757055381570b29cf66c4a295b5618318d27a4273c0e2033925e72
languageName: node
linkType: hard
-"@babel/generator@npm:^7.28.3":
- version: 7.28.3
- resolution: "@babel/generator@npm:7.28.3"
+"@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.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"
+"@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/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"
- 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
+"@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/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
- 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
@@ -1103,6 +996,19 @@ __metadata:
languageName: node
linkType: hard
+"@monyfox/client-transactions-importer@workspace:*, @monyfox/client-transactions-importer@workspace:packages/client/transactions-importer":
+ version: 0.0.0-use.local
+ resolution: "@monyfox/client-transactions-importer@workspace:packages/client/transactions-importer"
+ dependencies:
+ "@monyfox/common-data": "workspace:*"
+ "@types/papaparse": "npm:^5.3.16"
+ papaparse: "npm:^5.5.3"
+ typescript: "npm:^5.9.2"
+ vitest: "npm:^3.2.4"
+ zod: "npm:^4.1.5"
+ languageName: unknown
+ linkType: soft
+
"@monyfox/common-data@workspace:*, @monyfox/common-data@workspace:packages/common/data":
version: 0.0.0-use.local
resolution: "@monyfox/common-data@workspace:packages/common/data"
@@ -1145,6 +1051,7 @@ __metadata:
"@formkit/auto-animate": "npm:^0.8.4"
"@hookform/resolvers": "npm:^5.2.1"
"@js-joda/core": "npm:^5.6.5"
+ "@monyfox/client-transactions-importer": "workspace:*"
"@monyfox/common-data": "workspace:*"
"@monyfox/common-symbol": "workspace:*"
"@monyfox/common-symbol-exchange": "workspace:*"
@@ -1183,6 +1090,7 @@ __metadata:
class-variance-authority: "npm:^0.7.1"
clsx: "npm:^2.1.1"
csstype: "npm:^3.1.3"
+ date-fns: "npm:^4.1.0"
eslint: "npm:^9.34.0"
eslint-plugin-react-hooks: "npm:^5.2.0"
eslint-plugin-react-refresh: "npm:^0.4.20"
@@ -1190,10 +1098,12 @@ __metadata:
framer-motion: "npm:^12.23.12"
globals: "npm:^16.3.0"
graph-data-structure: "npm:^4.5.0"
+ immer: "npm:^10.1.3"
jsdom: "npm:^26.1.0"
lucide-react: "npm:^0.542.0"
msw: "npm:^2.7.4"
postcss: "npm:^8.5.6"
+ prettier: "npm:^3.6.2"
react: "npm:^19.1.1"
react-dom: "npm:^19.1.1"
react-hook-form: "npm:^7.62.0"
@@ -1204,15 +1114,16 @@ __metadata:
tw-animate-css: "npm:^1.3.7"
typescript: "npm:^5.9.2"
ulid: "npm:^3.0.1"
+ use-immer: "npm:^0.11.0"
vite: "npm:^7.1.11"
vitest: "npm:^3.2.4"
zod: "npm:^4.1.5"
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"
@@ -1220,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
@@ -1262,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
@@ -1301,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
@@ -1356,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"
@@ -1374,7 +1285,7 @@ __metadata:
optional: true
"@types/react-dom":
optional: true
- checksum: 10c0/9fb0cf9a9d0fdbeaa2efda476402fc09db2e6ff9cd9aa3ea1d315d9c9579840722a4833725cb196c455e0bd775dfe04221a4f6855685ce89d2133c42e2b07e5f
+ checksum: 10c0/b1b3d4b11a8e05a8479d2410fb4e7b1bf825135c4cd42f7e5152568a54a55a3073bd87d50325150417a29306e7b1b371289dc3c4f11739af8a2a7bb8dd7c38c9
languageName: node
linkType: hard
@@ -1452,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"
@@ -1595,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": "*"
@@ -1609,7 +1533,7 @@ __metadata:
optional: true
"@types/react-dom":
optional: true
- checksum: 10c0/d8c81411d5327b6db5cbf4b900bfcc52030315539911701cf8d82b4970aed80cbd66df5b62d2242859572c666cf4b0e147a8b39dc3c04bd024a4b4405e1183fe
+ checksum: 10c0/8b130380bd54bafb0dc652270c8cf035ceeb78faab82f78c0a76fc33cc0718e8455ff880e0db1b6c10f203ff342bf1f941544eb258c1fd85ae5b49b53cdf1a3d
languageName: node
linkType: hard
@@ -1736,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": "*"
@@ -1752,7 +1695,7 @@ __metadata:
optional: true
"@types/react-dom":
optional: true
- checksum: 10c0/bed5349682a75db02d362c07ac99fefddbbdc0152c4d5035719498223b9d490ebd834e2d9f64d498424048eb3da7eb7e55ba696e202cd0a048d6e319390e69d3
+ checksum: 10c0/6be47bd35f168e7ed8f7b3e76d944e79d995c60596c7b8e6eb824a0a27f9e6322bb92c8eab4ae1e49c205ee75aa09e6e70570128b0af987f83c05a4d53c6c3cf
languageName: node
linkType: hard
@@ -1850,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": "*"
@@ -1864,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:
@@ -1883,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"
@@ -2120,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
@@ -2274,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
@@ -2423,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
@@ -2545,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":
@@ -2648,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
@@ -2678,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:
@@ -2718,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"
@@ -2727,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
@@ -2760,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
@@ -2798,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:
@@ -2808,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
@@ -2909,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"
@@ -2930,147 +2881,158 @@ __metadata:
languageName: node
linkType: hard
+"@types/node@npm:*":
+ version: 24.10.1
+ resolution: "@types/node@npm:24.10.1"
+ dependencies:
+ undici-types: "npm:~7.16.0"
+ checksum: 10c0/d6bca7a78f550fbb376f236f92b405d676003a8a09a1b411f55920ef34286ee3ee51f566203920e835478784df52662b5b2af89159d9d319352e9ea21801c002
+ 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":
+ 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.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"
@@ -3079,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
@@ -3273,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
@@ -3289,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"
@@ -3308,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
@@ -3326,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"
@@ -3343,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
@@ -3366,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
@@ -3397,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
@@ -3428,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
@@ -3458,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"
@@ -3476,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
@@ -3494,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
@@ -3514,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
@@ -3541,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:
@@ -3668,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
@@ -3694,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
@@ -3820,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"
- 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"
+"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/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55
+ checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6
languageName: node
linkType: hard
@@ -3852,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
@@ -3880,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
@@ -3900,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
@@ -3938,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
@@ -3978,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
@@ -4007,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
@@ -4078,6 +4029,8 @@ __metadata:
optional: true
"@esbuild/openbsd-x64":
optional: true
+ "@esbuild/openharmony-arm64":
+ optional: true
"@esbuild/sunos-x64":
optional: true
"@esbuild/win32-arm64":
@@ -4088,7 +4041,7 @@ __metadata:
optional: true
bin:
esbuild: bin/esbuild
- checksum: 10c0/87ce0b78699c4d192b8cf7e9b688e9a0da10e6f58ff85a368bf3044ca1fa95626c98b769b5459352282e0065585b6f994a5e6699af5cccf9d31178960e2b58fd
+ checksum: 10c0/c205357531423220a9de8e1e6c6514242bc9b1666e762cd67ccdf8fdfdc3f1d0bd76f8d9383958b97ad4c953efdb7b6e8c1f9ca5951cd2b7c5235e8755b34a6b
languageName: node
linkType: hard
@@ -4116,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
@@ -4149,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"
@@ -4194,7 +4146,7 @@ __metadata:
optional: true
bin:
eslint: bin/eslint.js
- checksum: 10c0/ba3e54fa0c8ed23d062f91519afaae77fed922a6c4d76130b6cd32154bcb406aaea4b3c5ed88e0be40828c1d5b6921592f3947dbdc5e2043de6bd7aa341fe5ea
+ checksum: 10c0/59b2480639404ba24578ca480f973683b87b7aac8aa7e349240474a39067804fd13cd8b9cb22fee074170b8c7c563b57bab703ec0f0d3f81ea017e5d2cad299d
languageName: node
linkType: hard
@@ -4209,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"
@@ -4265,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
@@ -4286,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
@@ -4328,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:
@@ -4397,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:
@@ -4408,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:
@@ -4425,7 +4375,7 @@ __metadata:
optional: true
react-dom:
optional: true
- checksum: 10c0/40dfb57bf714075c4f6dd0bbe5b84dd11310114474ebf603846ef9b888ed475fa653271c1fd98ec57a6a1d0b781cdf8b3ebcd5e2c6a3620e934b46304ae0fd39
+ checksum: 10c0/716addd9fa85dd2c1475ab848e14c4e6d3246ced041de84afc19b1d6534c897256c8f2878864cf057039116e56f5ca1b87a4cbb943f0b1cf37199ef7174c3cf8
languageName: node
linkType: hard
@@ -4479,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
@@ -4505,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:
@@ -4521,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
@@ -4536,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
@@ -4573,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
@@ -4610,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
@@ -4659,6 +4618,13 @@ __metadata:
languageName: node
linkType: hard
+"immer@npm:^10.1.3":
+ version: 10.2.0
+ resolution: "immer@npm:10.2.0"
+ checksum: 10c0/35e66b0585b2aec4e85ae7a993f049405f170799ba89d79205bc3fdae2c5bdaa2b1d35f62803d8beee42b7e85c7f7315a6e93b6a5a510c5a46f03dbe63619e87
+ languageName: node
+ linkType: hard
+
"import-fresh@npm:^3.2.1":
version: 3.3.1
resolution: "import-fresh@npm:3.3.1"
@@ -4690,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
@@ -4753,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"
@@ -4797,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
@@ -4819,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
@@ -4843,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
@@ -4893,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:
@@ -4951,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:
@@ -5057,7 +5039,7 @@ __metadata:
optional: true
lightningcss-win32-x64-msvc:
optional: true
- checksum: 10c0/1e1ad908f3c68bf39d964a6735435a8dd5474fb2765076732d64a7b6aa2af1f084da65a9462443a9adfebf7dcfb02fb532fce1d78697f2a9de29c8f40f09aee3
+ checksum: 10c0/5c0c73a33946dab65908d5cd1325df4efa290efb77f940b60f40448b5ab9a87d3ea665ef9bcf00df4209705050ecf2f7ecc649f44d6dfa5905bb50f15717e78d
languageName: node
linkType: hard
@@ -5095,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"
@@ -5143,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
@@ -5172,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
@@ -5215,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"
@@ -5242,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"
@@ -5253,7 +5244,7 @@ __metadata:
dependenciesMeta:
encoding:
optional: true
- checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c
+ checksum: 10c0/9443aab5feab190972f84b64116e54e58dd87a58e62399cae0a4a7461b80568281039b7c3a38ba96453431ebc799d1e26999e548540156216729a4967cd5ef06
languageName: node
linkType: hard
@@ -5300,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
@@ -5349,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"
@@ -5377,7 +5359,7 @@ __metadata:
optional: true
bin:
msw: cli/index.js
- checksum: 10c0/cbae966ebd7eb460b179dc2792ae710bd88647a17cb983af9c00cf1705146e885a86c7ff5ba12bb5320d1f335f09367b0097c53166c0e43c8554035649b96c41
+ checksum: 10c0/822f4fc0cb2bdade39a67045d56b32fc7b15f30814a64c637a3c55d99358a4c1d61ed00d21fafafbbee320ad600e5a048d938b195e0cef5c59e016a040595176
languageName: node
linkType: hard
@@ -5388,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:
@@ -5412,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
@@ -5457,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
@@ -5510,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
@@ -5523,6 +5505,13 @@ __metadata:
languageName: node
linkType: hard
+"papaparse@npm:^5.5.3":
+ version: 5.5.3
+ resolution: "papaparse@npm:5.5.3"
+ checksum: 10c0/623aae6a35703308fd5a39d616fb3837231ebc70697346355ea508154d3f24df75b6554b736afc1924192205518a5db14e75f5e1cf35d154326050a37cdd9447
+ languageName: node
+ linkType: hard
+
"parent-module@npm:^1.0.0":
version: 1.0.1
resolution: "parent-module@npm:1.0.1"
@@ -5533,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
@@ -5565,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"
@@ -5580,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
@@ -5600,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:
@@ -5643,12 +5624,12 @@ __metadata:
languageName: node
linkType: hard
-"prettier@npm:^3.5.0":
- version: 3.5.3
- resolution: "prettier@npm:3.5.3"
+"prettier@npm:^3.5.0, prettier@npm:^3.6.2":
+ version: 3.6.2
+ resolution: "prettier@npm:3.6.2"
bin:
prettier: bin/prettier.cjs
- checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877
+ checksum: 10c0/488cb2f2b99ec13da1e50074912870217c11edaddedeadc649b1244c749d15ba94e846423d062e2c4c9ae683e2d65f754de28889ba06e697ac4f988d44f45812
languageName: node
linkType: hard
@@ -5663,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
@@ -5691,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"
@@ -5722,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
@@ -5762,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
@@ -5786,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"
@@ -5800,7 +5765,7 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 10c0/068e9704ff26816fffc4c8903e2c6c8df7291ee08615d7c1ab0cf8751f7080e2c5a5d78ef5d908b11b9cfc189f176d312e44cb02ea291ca0466d8283b479b438
+ checksum: 10c0/7ad8f6ffd3e2aedf9b3d79f0c9088a9a3d7c5332d80c923427a6d97fe0626fb4cb33a6d9174d19fad57d860be69c96f68497a0619c3a8af0e8a5332e49bdde31
languageName: node
linkType: hard
@@ -5850,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
@@ -5865,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"
@@ -5875,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"
@@ -5889,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
@@ -5903,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"
@@ -5917,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"
@@ -5945,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"
@@ -5953,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:
@@ -5999,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
@@ -6013,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
@@ -6059,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
@@ -6076,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
@@ -6131,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
@@ -6160,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
@@ -6197,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
@@ -6213,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"
@@ -6220,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
@@ -6273,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
@@ -6298,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
@@ -6323,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
@@ -6396,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:
@@ -6441,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
@@ -6454,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"
@@ -6465,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"
@@ -6481,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"
@@ -6502,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
@@ -6520,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
@@ -6528,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"
@@ -6539,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
@@ -6559,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
@@ -6609,6 +6578,13 @@ __metadata:
languageName: node
linkType: hard
+"undici-types@npm:~7.16.0":
+ version: 7.16.0
+ resolution: "undici-types@npm:7.16.0"
+ checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a
+ languageName: node
+ linkType: hard
+
"unique-filename@npm:^4.0.0":
version: 4.0.0
resolution: "unique-filename@npm:4.0.0"
@@ -6627,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"
@@ -6655,7 +6632,7 @@ __metadata:
browserslist: ">= 4.21.0"
bin:
update-browserslist-db: cli.js
- checksum: 10c0/682e8ecbf9de474a626f6462aa85927936cdd256fe584c6df2508b0df9f7362c44c957e9970df55dfe44d3623807d26316ea2c7d26b80bb76a16c56c37233c32
+ checksum: 10c0/db0c9aaecf1258a6acda5e937fc27a7996ccca7a7580a1b4aa8bba6a9b0e283e5e65c49ebbd74ec29288ef083f1b88d4da13e3d4d326c1e5fc55bf72d7390702
languageName: node
linkType: hard
@@ -6668,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"
@@ -6693,6 +6660,16 @@ __metadata:
languageName: node
linkType: hard
+"use-immer@npm:^0.11.0":
+ version: 0.11.0
+ resolution: "use-immer@npm:0.11.0"
+ peerDependencies:
+ immer: ">=8.0.0"
+ react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0
+ checksum: 10c0/fc4391c8aab0868194241d16f2826efb3563b69de37e9cfd325044f3115fa155b6b76c4a8731f274bd4ea31a0fe709bf2b6cfc1d8aa12a00f672ed0dccd3a4fa
+ languageName: node
+ linkType: hard
+
"use-sidecar@npm:^1.1.3":
version: 1.1.3
resolution: "use-sidecar@npm:1.1.3"
@@ -6709,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
@@ -6755,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"
@@ -6861,7 +6783,7 @@ __metadata:
optional: true
bin:
vite: bin/vite.js
- checksum: 10c0/c4aa7f47b1fb07f734ed6f4f605d73e5acf7ff9754d75b4adbfbdddf0e520413019834620c1f7b4a207bce7e1d20a2636c584db2b1b17f5a3ba2cd23d47e50ab
+ checksum: 10c0/9c76ee441f8dbec645ddaecc28d1f9cf35670ffa91cff69af7b1d5081545331603f0b1289d437b2fa8dc43cdc77b4d96b5bd9c9aed66310f490cb1a06f9c814c
languageName: node
linkType: hard
@@ -6926,7 +6848,6 @@ __metadata:
resolution: "vitexpress@workspace:."
dependencies:
"@vitest/coverage-v8": "npm:^3.2.4"
- date-fns: "npm:^4.1.0"
typescript: "npm:^5.9.2"
vitest: "npm:^3.2.4"
languageName: unknown
@@ -6992,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
@@ -7055,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:
@@ -7156,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