diff --git a/sdk/sandboxes/sandbox_simple_host/public/pkg/.gitkeep b/.github/workflows/check.yml similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/public/pkg/.gitkeep rename to .github/workflows/check.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 98edaf4a2..ab875c959 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -13,11 +13,11 @@ name: "CodeQL Advanced" on: push: - branches: [ "main" ] + branches: ["main"] pull_request: - branches: [ "main" ] + branches: ["main"] schedule: - - cron: '23 2 * * 6' + - cron: "23 2 * * 6" jobs: analyze: @@ -43,10 +43,10 @@ jobs: fail-fast: false matrix: include: - - language: javascript-typescript - build-mode: none - - language: rust - build-mode: none + - language: javascript-typescript + build-mode: none + - language: rust + build-mode: none # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' # Use `c-cpp` to analyze code written in C, C++ or both # Use 'java-kotlin' to analyze code written in Java, Kotlin or both @@ -56,46 +56,46 @@ jobs: # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - - name: Checkout repository - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@v4 - # Add any setup steps before running the `github/codeql-action/init` action. - # This includes steps like installing compilers or runtimes (`actions/setup-node` - # or others). This is typically only required for manual builds. - # - name: Setup runtime (example) - # uses: actions/setup-example@v1 + # Add any setup steps before running the `github/codeql-action/init` action. + # This includes steps like installing compilers or runtimes (`actions/setup-node` + # or others). This is typically only required for manual builds. + # - name: Setup runtime (example) + # uses: actions/setup-example@v1 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v4 - with: - languages: ${{ matrix.language }} - build-mode: ${{ matrix.build-mode }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. - # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality - # If the analyze step fails for one of the languages you are analyzing with - # "We were unable to automatically build your code", modify the matrix above - # to set the build mode to "manual" for that language. Then modify this step - # to build your code. - # â„šī¸ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - name: Run manual build steps - if: matrix.build-mode == 'manual' - shell: bash - run: | - echo 'If you are using a "manual" build mode for one or more of the' \ - 'languages you are analyzing, replace this with the commands to build' \ - 'your code, for example:' - echo ' make bootstrap' - echo ' make release' - exit 1 + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - name: Run manual build steps + if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4 - with: - category: "/language:${{matrix.language}}" + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 + with: + category: "/language:${{matrix.language}}" diff --git a/.gitignore b/.gitignore index 0756e39d1..c5da7b1c6 100644 --- a/.gitignore +++ b/.gitignore @@ -410,3 +410,6 @@ $RECYCLE.BIN/ # AI Agent plan .plan AGENTS.md + +# Postgres +pg_data/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..31d7130dc --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +**/.ts +**/.tsx +**/.js +**/.jsx +**/.json diff --git a/README.md b/README.md index 56ffacd8a..ccad31048 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ +# Oko + Logo + style="width: 180px; height: auto;"> @@ -52,8 +54,9 @@ TBD ## License -Distributed under the GPL v3 License. See -[GPL V3 License](https://opensource.org/license/gpl-3-0) for more information. +Distributed under the Apache License 2.0. See +[Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0) for more +information. ## Development diff --git a/apps/customer_dashboard/public/signin_form_frame.png b/apps/customer_dashboard/public/signin_form_frame.png new file mode 100644 index 000000000..6ee2e3500 Binary files /dev/null and b/apps/customer_dashboard/public/signin_form_frame.png differ diff --git a/apps/customer_dashboard/src/app/users/sign_in/page.module.scss b/apps/customer_dashboard/src/app/users/sign_in/page.module.scss index 3abc41944..1816c818d 100644 --- a/apps/customer_dashboard/src/app/users/sign_in/page.module.scss +++ b/apps/customer_dashboard/src/app/users/sign_in/page.module.scss @@ -15,10 +15,11 @@ justify-content: center; } -.rectangleSection { - background: var(--bg-secondary); - height: 562px; - border-radius: 24px; - width: 683px; - flex-shrink: 0; +.formFrame { + position: relative; + padding: 40px; + background-image: url("/signin_form_frame.png"); + background-size: 100% 100%; + background-repeat: no-repeat; + background-position: center; } diff --git a/apps/customer_dashboard/src/app/users/sign_in/page.tsx b/apps/customer_dashboard/src/app/users/sign_in/page.tsx index 0a0f88eed..c269396c9 100644 --- a/apps/customer_dashboard/src/app/users/sign_in/page.tsx +++ b/apps/customer_dashboard/src/app/users/sign_in/page.tsx @@ -8,8 +8,9 @@ export default function Page() {
-
- +
+ +
); diff --git a/apps/customer_dashboard/src/app/users/sign_up/digits/page.module.scss b/apps/customer_dashboard/src/app/users/sign_up/digits/page.module.scss index a96c1081f..38497c6c2 100644 --- a/apps/customer_dashboard/src/app/users/sign_up/digits/page.module.scss +++ b/apps/customer_dashboard/src/app/users/sign_up/digits/page.module.scss @@ -15,9 +15,9 @@ .headerContainer { position: relative; width: 100%; - height: 64px; + height: 54px; display: flex; flex-direction: row; align-items: center; justify-content: space-between; -} \ No newline at end of file +} diff --git a/apps/customer_dashboard/src/components/dashboard_header/dashboard_header.module.scss b/apps/customer_dashboard/src/components/dashboard_header/dashboard_header.module.scss index 2b75e09b2..58f99e84b 100644 --- a/apps/customer_dashboard/src/components/dashboard_header/dashboard_header.module.scss +++ b/apps/customer_dashboard/src/components/dashboard_header/dashboard_header.module.scss @@ -1,5 +1,5 @@ .wrapper { - height: 64px; + height: 54px; display: flex; flex-shrink: 0; flex-grow: 0; diff --git a/apps/customer_dashboard/src/components/sign_in_form/sign_in_form.module.scss b/apps/customer_dashboard/src/components/sign_in_form/sign_in_form.module.scss index 486cf358c..acac504b1 100644 --- a/apps/customer_dashboard/src/components/sign_in_form/sign_in_form.module.scss +++ b/apps/customer_dashboard/src/components/sign_in_form/sign_in_form.module.scss @@ -10,11 +10,10 @@ .cardHeader { display: flex; - height: 140px; justify-content: center; align-items: flex-start; - gap: 10px; - margin-top: 20px; + margin-top: 24px; + margin-bottom: 32px; } .cardLogoContainer { diff --git a/apps/customer_dashboard/src/components/sign_in_form/sign_in_form.tsx b/apps/customer_dashboard/src/components/sign_in_form/sign_in_form.tsx index 1e015e679..685f46b60 100644 --- a/apps/customer_dashboard/src/components/sign_in_form/sign_in_form.tsx +++ b/apps/customer_dashboard/src/components/sign_in_form/sign_in_form.tsx @@ -1,6 +1,6 @@ "use client"; -import React, { useState } from "react"; +import React from "react"; import { Input } from "@oko-wallet/oko-common-ui/input"; import { Card } from "@oko-wallet/oko-common-ui/card"; import { Logo } from "@oko-wallet/oko-common-ui/logo"; diff --git a/apps/demo_web/public/favicon.png b/apps/demo_web/public/favicon.png deleted file mode 100644 index e52eddf95..000000000 Binary files a/apps/demo_web/public/favicon.png and /dev/null differ diff --git a/apps/demo_web/public/oko_favicon.png b/apps/demo_web/public/oko_favicon.png new file mode 100644 index 000000000..fef5d9d5b Binary files /dev/null and b/apps/demo_web/public/oko_favicon.png differ diff --git a/apps/demo_web/src/app/layout.tsx b/apps/demo_web/src/app/layout.tsx index c75cbd185..f02b9f839 100644 --- a/apps/demo_web/src/app/layout.tsx +++ b/apps/demo_web/src/app/layout.tsx @@ -25,7 +25,7 @@ export const metadata: Metadata = { title: "Oko Demo", description: "Oko Demo", icons: { - icon: "/favicon.png", + icon: "/oko_favicon.png", }, openGraph: { type: "website", diff --git a/apps/demo_web/src/components/global_header/global_header.module.scss b/apps/demo_web/src/components/global_header/global_header.module.scss index 924c937ff..3da76022b 100644 --- a/apps/demo_web/src/components/global_header/global_header.module.scss +++ b/apps/demo_web/src/components/global_header/global_header.module.scss @@ -1,7 +1,7 @@ @use "../../styles/viewport.module.scss" as *; .wrapper { - height: 64px; + height: 54px; display: flex; flex-shrink: 0; flex-grow: 0; @@ -30,10 +30,10 @@ } .logoResponsive { - width: 74px; - height: 32px; + width: auto; + height: 22px; flex-shrink: 0; - aspect-ratio: 37/16; + // aspect-ratio: 37/16; // TODO: new logo responsive size is required // @media (min-width: $desktop_min_width) { diff --git a/apps/demo_web/src/components/left_bar/left_bar.module.scss b/apps/demo_web/src/components/left_bar/left_bar.module.scss index f9e85df42..67a1ae269 100644 --- a/apps/demo_web/src/components/left_bar/left_bar.module.scss +++ b/apps/demo_web/src/components/left_bar/left_bar.module.scss @@ -1,6 +1,6 @@ @use "../../styles/viewport.module.scss" as *; -$header_height: 64px; +$header_height: 54px; .wrapper { display: none; diff --git a/apps/demo_web/src/components/widgets/login_widget/login_default_view.tsx b/apps/demo_web/src/components/widgets/login_widget/login_default_view.tsx index b97fa1025..1d9d5b22b 100644 --- a/apps/demo_web/src/components/widgets/login_widget/login_default_view.tsx +++ b/apps/demo_web/src/components/widgets/login_widget/login_default_view.tsx @@ -9,8 +9,8 @@ import { Spacing } from "@oko-wallet/oko-common-ui/spacing"; import { TelegramIcon } from "@oko-wallet/oko-common-ui/icons/telegram_icon"; import { XIcon } from "@oko-wallet/oko-common-ui/icons/x_icon"; import { AppleIcon } from "@oko-wallet/oko-common-ui/icons/apple_icon"; -import { OkoProductLogoIcon } from "@oko-wallet/oko-common-ui/icons/oko_product_logo_icon"; import { MailboxIcon } from "@oko-wallet/oko-common-ui/icons/mailbox"; +import { OkoLogoIcon } from "@oko-wallet-common-ui/icons/oko_logo_icon"; import styles from "./login_widget.module.scss"; @@ -31,10 +31,7 @@ export const LoginDefaultView: FC = ({ return (
- - Login or sign up - - +
+ + + + ); +}; diff --git a/apps/oko_admin_web/src/components/audit_logs/audit_logs_table.module.scss b/apps/oko_admin_web/src/components/audit_logs/audit_logs_table.module.scss new file mode 100644 index 000000000..bc3981d54 --- /dev/null +++ b/apps/oko_admin_web/src/components/audit_logs/audit_logs_table.module.scss @@ -0,0 +1,52 @@ +.container { + width: 100%; + overflow-x: auto; +} + +.targetId { + font-family: monospace; + font-size: 0.875rem; + color: var(--gray-600); + word-break: break-all; +} + +.userAgent { + font-size: 0.75rem; + color: var(--gray-600); + word-break: break-all; + max-width: 200px; +} + +.changes { + display: flex; + flex-direction: column; + gap: 0.25rem; + max-width: 200px; +} + +.change { + display: flex; + flex-direction: column; + gap: 0.125rem; + padding: 0.25rem; + background-color: var(--gray-50); + border-radius: 0.25rem; + font-size: 0.75rem; +} + +.params { + display: flex; + flex-direction: column; + gap: 0.25rem; + max-width: 200px; +} + +.param { + display: flex; + flex-direction: column; + gap: 0.125rem; + padding: 0.25rem; + background-color: var(--gray-50); + border-radius: 0.25rem; + font-size: 0.75rem; +} diff --git a/apps/oko_admin_web/src/components/audit_logs/audit_logs_table.tsx b/apps/oko_admin_web/src/components/audit_logs/audit_logs_table.tsx new file mode 100644 index 000000000..367e388b4 --- /dev/null +++ b/apps/oko_admin_web/src/components/audit_logs/audit_logs_table.tsx @@ -0,0 +1,136 @@ +"use client"; + +import { type FC } from "react"; +import type { AuditEvent } from "@oko-wallet/oko-types/admin"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeaderCell, + TableRow, +} from "@oko-wallet/oko-common-ui/table"; +import { Typography } from "@oko-wallet/oko-common-ui/typography"; +import { Badge } from "@oko-wallet/oko-common-ui/badge"; + +import styles from "./audit_logs_table.module.scss"; + +interface AuditLogsTableProps { + auditLogs: AuditEvent[]; +} + +export const AuditLogsTable: FC = ({ auditLogs }) => { + const formatChanges = (changes: any[]) => { + if (!changes || changes.length === 0) { + return -; + } + + return ( +
+ {changes.map((change, index) => ( +
+ {change.field}: + + {change.from !== undefined ? `${change.from} → ` : ""} + {change.to} + +
+ ))} +
+ ); + }; + + const formatParams = (params: Record) => { + if (!params || Object.keys(params).length === 0) { + return -; + } + + return ( +
+ {Object.entries(params).map(([key, value], index) => ( +
+ {key}: + {JSON.stringify(value)} +
+ ))} +
+ ); + }; + + const getOutcomeBadge = (outcome: string) => { + const color = + outcome === "success" + ? "success" + : outcome === "denied" + ? "warning" + : "error"; + return ; + }; + + return ( +
+ + + + Time + Request ID + Actor + Actor IP + User Agent + Source + Action + Target Type + Target ID + Outcome + Changes + Params + + + + {auditLogs.map((row) => ( + + + + {new Date(row.occurred_at).toLocaleString()} + + + + + {row.request_id || "-"} + + + + {row.actor} + + + {row.actor_ip || "-"} + + + + {row.user_agent || "-"} + + + + {row.source} + + + {row.action} + + + {row.target_type} + + + + {row.target_id || "-"} + + + {getOutcomeBadge(row.outcome)} + {formatChanges(row.changes || [])} + {formatParams(row.params || {})} + + ))} + +
+
+ ); +}; diff --git a/apps/oko_admin_web/src/components/audit_logs/audit_logs_view.module.scss b/apps/oko_admin_web/src/components/audit_logs/audit_logs_view.module.scss new file mode 100644 index 000000000..eed49da6a --- /dev/null +++ b/apps/oko_admin_web/src/components/audit_logs/audit_logs_view.module.scss @@ -0,0 +1,45 @@ +.wrapper { + flex-grow: 1; + display: flex; + padding: 0px 40px; + padding-bottom: 40px; + flex-direction: column; + align-items: flex-start; + gap: 32px; + overflow: auto; +} + +.loading { + display: flex; + justify-content: center; + align-items: center; + padding: 2rem; + background-color: var(--white); + border-radius: 0.5rem; + border: 1px solid var(--gray-200); + width: 100%; +} + +.content { + display: flex; + flex-direction: column; + gap: 1.5rem; + width: 100%; +} + +.tableContainer { + background-color: var(--white); + border-radius: 0.5rem; + border: 1px solid var(--gray-200); + overflow: hidden; + width: 100%; +} + +.emptyContainer { + width: 100%; +} + +.paginationContainer { + display: flex; + justify-content: center; +} diff --git a/apps/oko_admin_web/src/components/audit_logs/audit_logs_view.tsx b/apps/oko_admin_web/src/components/audit_logs/audit_logs_view.tsx new file mode 100644 index 000000000..57f86bbcf --- /dev/null +++ b/apps/oko_admin_web/src/components/audit_logs/audit_logs_view.tsx @@ -0,0 +1,85 @@ +"use client"; + +import { type FC, useState } from "react"; +import { AuditLogsTable } from "./audit_logs_table"; +import { AuditLogsFilter } from "./audit_logs_filter"; +import { TitleHeader } from "@oko-wallet-admin/components/title_header/title_header"; +import { Pagination } from "@oko-wallet-admin/components/pagination/pagination"; +import { EmptyState } from "@oko-wallet-admin/components/empty_state/empty_state"; +import { Typography } from "@oko-wallet/oko-common-ui/typography"; +import { useGetAuditLogs } from "./use_get_audit_logs"; +import type { AuditEventFilter } from "@oko-wallet/oko-types/admin"; +import { useAppState } from "@oko-wallet-admin/state"; + +import styles from "./audit_logs_view.module.scss"; + +const DEFAULT_LIMIT = 20; + +export const AuditLogsView: FC = () => { + const { token } = useAppState(); + const [filter, setFilter] = useState({ + limit: DEFAULT_LIMIT, + offset: 0, + }); + + const { auditLogs, isLoading, refetch, pagination, totalCount } = + useGetAuditLogs(filter, token || undefined); + + const handleFilterChange = (newFilter: AuditEventFilter) => { + setFilter({ + ...newFilter, + limit: DEFAULT_LIMIT, + offset: 0, + }); + }; + + const handlePageChange = (page: number) => { + setFilter((prev) => ({ + ...prev, + offset: (page - 1) * DEFAULT_LIMIT, + })); + }; + + if (isLoading && auditLogs.length === 0) { + return ( +
+ +
+ Loading audit logs... +
+
+ ); + } + + return ( +
+ + + + +
+ {auditLogs.length === 0 ? ( +
+ +
+ ) : ( + <> +
+ +
+ +
+ +
+ + )} +
+
+ ); +}; diff --git a/apps/oko_admin_web/src/components/audit_logs/use_get_audit_logs.ts b/apps/oko_admin_web/src/components/audit_logs/use_get_audit_logs.ts new file mode 100644 index 000000000..2270f3eb2 --- /dev/null +++ b/apps/oko_admin_web/src/components/audit_logs/use_get_audit_logs.ts @@ -0,0 +1,56 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { useMemo } from "react"; +import type { AuditEventFilter } from "@oko-wallet/oko-types/admin"; +import { getAuditLogs, getAuditLogsCount } from "@oko-wallet-admin/fetch/audit"; +import { + useTable, + useTablePagination, +} from "@oko-wallet-admin/components/table/use_table"; + +const DEFAULT_LIMIT = 20; + +export const useGetAuditLogs = ( + filter: AuditEventFilter = {}, + token?: string, +) => { + const { data, isLoading, refetch } = useQuery({ + queryKey: ["auditLogs", filter, token], + queryFn: () => getAuditLogs(filter, token), + staleTime: 1000 * 60, // 1 minute + }); + + const { data: countData, isLoading: isCountLoading } = useQuery({ + queryKey: ["auditLogsCount", filter, token], + queryFn: () => getAuditLogsCount(filter, token), + staleTime: 1000 * 60, // 1 minute + }); + + const auditLogs = useMemo( + () => (data && data.success ? data.data.audit_logs : []), + [data], + ); + const totalCount = useMemo( + () => (countData && countData.success ? countData.data.count : 0), + [countData], + ); + + const table = useTable({ + data: auditLogs, + columns: [], + }); + + const pagination = useTablePagination({ + initialPageSize: DEFAULT_LIMIT, + }); + + return { + auditLogs, + isLoading: isLoading || isCountLoading, + refetch, + table, + pagination, + totalCount, + }; +}; diff --git a/apps/oko_admin_web/src/components/global_header/global_header.module.scss b/apps/oko_admin_web/src/components/global_header/global_header.module.scss index a3f8cd977..ec8bfee6e 100644 --- a/apps/oko_admin_web/src/components/global_header/global_header.module.scss +++ b/apps/oko_admin_web/src/components/global_header/global_header.module.scss @@ -1,5 +1,5 @@ .wrapper { - height: 64px; + height: 54px; display: flex; flex-shrink: 0; flex-grow: 0; diff --git a/apps/oko_admin_web/src/components/navigation/nav_items.tsx b/apps/oko_admin_web/src/components/navigation/nav_items.tsx index fa7ff44a4..c3eb424fe 100644 --- a/apps/oko_admin_web/src/components/navigation/nav_items.tsx +++ b/apps/oko_admin_web/src/components/navigation/nav_items.tsx @@ -19,8 +19,9 @@ export const navigationItems: NavigationItem[] = [ }, { label: "Manage Users", - route: paths.user_list, + route: "manage-users-menu", icon: , + subItems: [{ label: "User List", route: paths.user_list }], }, { label: "Sig Shares", @@ -43,4 +44,10 @@ export const navigationItems: NavigationItem[] = [ }, ], }, + { + label: "Audit Logs", + route: "audit-logs", + icon: , + subItems: [{ label: "Audit History", route: paths.audit_logs }], + }, ]; diff --git a/apps/oko_admin_web/src/components/navigation/navigation.tsx b/apps/oko_admin_web/src/components/navigation/navigation.tsx index 28e721157..cb4cf309e 100644 --- a/apps/oko_admin_web/src/components/navigation/navigation.tsx +++ b/apps/oko_admin_web/src/components/navigation/navigation.tsx @@ -1,6 +1,5 @@ "use client"; -import { useEffect, useState } from "react"; import { usePathname, useRouter } from "next/navigation"; import styles from "./navigation.module.scss"; @@ -20,32 +19,9 @@ export interface NavigationProps { } export const Navigation: React.FC = () => { - const [openMenus, setOpenMenus] = useState>({}); const router = useRouter(); const pathname = usePathname(); - useEffect(() => { - const newOpenMenus: Record = {}; - navigationItems.forEach((item) => { - if (item.subItems) { - const isCurrentPath = item.subItems.some( - (subItem) => pathname === subItem.route, - ); - if (isCurrentPath) { - newOpenMenus[item.route] = true; - } - } - }); - setOpenMenus(newOpenMenus); - }, [pathname]); - - const toggleMenu = (route: string) => { - setOpenMenus((prev) => ({ - ...prev, - [route]: !prev[route], - })); - }; - return (
{navigationItems.map((item) => { @@ -53,27 +29,20 @@ export const Navigation: React.FC = () => { return ( // has sub items
- toggleMenu(item.route)} - icon={item.icon} - > + {item.label} - {openMenus[item.route] && ( - - {item.subItems.map((subItem) => ( - router.push(subItem.route)} - active={pathname === subItem.route} - > - {subItem.label} - - ))} - - )} + + {item.subItems.map((subItem) => ( + router.push(subItem.route)} + active={pathname === subItem.route} + > + {subItem.label} + + ))} +
); } else { diff --git a/apps/oko_admin_web/src/fetch/audit.ts b/apps/oko_admin_web/src/fetch/audit.ts new file mode 100644 index 000000000..38aaa57bb --- /dev/null +++ b/apps/oko_admin_web/src/fetch/audit.ts @@ -0,0 +1,70 @@ +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { + AuditEventFilter, + GetAuditLogsResponse, + GetAuditLogsCountResponse, +} from "@oko-wallet/oko-types/admin"; + +import { OKO_ADMIN_API_ENDPOINT_V1 } from "@oko-wallet-admin/fetch"; +import { errorHandle } from "@oko-wallet-admin/fetch/utils"; + +export const getAuditLogs = async ( + filter: AuditEventFilter, + token?: string, +): Promise> => { + const params = new URLSearchParams(); + + if (filter.target_type) params.append("target_type", filter.target_type); + if (filter.target_id) params.append("target_id", filter.target_id); + if (filter.action) params.append("action", filter.action); + if (filter.actor) params.append("actor", filter.actor); + if (filter.source) params.append("source", filter.source); + if (filter.outcome) params.append("outcome", filter.outcome); + if (filter.occurred_after) + params.append("occurred_after", filter.occurred_after.toISOString()); + if (filter.occurred_before) + params.append("occurred_before", filter.occurred_before.toISOString()); + if (filter.limit) params.append("limit", filter.limit.toString()); + if (filter.offset) params.append("offset", filter.offset.toString()); + + return errorHandle(() => + fetch(`${OKO_ADMIN_API_ENDPOINT_V1}/audit/logs?${params.toString()}`, { + method: "GET", + headers: { + "content-type": "application/json", + Authorization: `Bearer ${token}`, + }, + }), + ); +}; + +export const getAuditLogsCount = async ( + filter: AuditEventFilter, + token?: string, +): Promise> => { + const params = new URLSearchParams(); + + if (filter.target_type) params.append("target_type", filter.target_type); + if (filter.target_id) params.append("target_id", filter.target_id); + if (filter.action) params.append("action", filter.action); + if (filter.actor) params.append("actor", filter.actor); + if (filter.source) params.append("source", filter.source); + if (filter.outcome) params.append("outcome", filter.outcome); + if (filter.occurred_after) + params.append("occurred_after", filter.occurred_after.toISOString()); + if (filter.occurred_before) + params.append("occurred_before", filter.occurred_before.toISOString()); + + return errorHandle(() => + fetch( + `${OKO_ADMIN_API_ENDPOINT_V1}/audit/logs/count?${params.toString()}`, + { + method: "GET", + headers: { + "content-type": "application/json", + Authorization: `Bearer ${token}`, + }, + }, + ), + ); +}; diff --git a/apps/oko_admin_web/src/paths.ts b/apps/oko_admin_web/src/paths.ts index 723992669..db93ebcfd 100644 --- a/apps/oko_admin_web/src/paths.ts +++ b/apps/oko_admin_web/src/paths.ts @@ -7,4 +7,5 @@ export const paths = { ks_nodes_edit: "/keyshare_nodes/edit", sign_in: "/users/sign_in", user_list: "/users/list", + audit_logs: "/audit_logs", }; diff --git a/backend/admin_api/src/api/audit/index.ts b/backend/admin_api/src/api/audit/index.ts new file mode 100644 index 000000000..1bc9117de --- /dev/null +++ b/backend/admin_api/src/api/audit/index.ts @@ -0,0 +1,69 @@ +import { Pool } from "pg"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { AuditEventFilter } from "@oko-wallet/oko-types/admin"; +import type { + GetAuditLogsResponse, + GetAuditLogsCountResponse, +} from "@oko-wallet/oko-types/admin"; +import { + getAuditEvents, + getAuditEventsCount, +} from "@oko-wallet/oko-pg-interface/audit_events"; + +export async function getAuditLogs( + db: Pool, + filter: AuditEventFilter, +): Promise> { + try { + const getAuditEventsRes = await getAuditEvents(db, filter); + if (getAuditEventsRes.success === false) { + return { + success: false, + code: "UNKNOWN_ERROR", + msg: `Failed to get audit events: ${getAuditEventsRes.err}`, + }; + } + + return { + success: true, + data: { + audit_logs: getAuditEventsRes.data, + }, + }; + } catch (error) { + return { + success: false, + code: "UNKNOWN_ERROR", + msg: `Failed to get audit logs: ${error instanceof Error ? error.message : String(error)}`, + }; + } +} + +export async function getAuditLogsCount( + db: Pool, + filter: AuditEventFilter, +): Promise> { + try { + const getAuditEventsCountRes = await getAuditEventsCount(db, filter); + if (getAuditEventsCountRes.success === false) { + return { + success: false, + code: "UNKNOWN_ERROR", + msg: `Failed to get audit events count: ${getAuditEventsCountRes.err}`, + }; + } + + return { + success: true, + data: { + count: getAuditEventsCountRes.data, + }, + }; + } catch (error) { + return { + success: false, + code: "UNKNOWN_ERROR", + msg: `Failed to get audit logs count: ${error instanceof Error ? error.message : String(error)}`, + }; + } +} diff --git a/backend/admin_api/src/api/customer/index.ts b/backend/admin_api/src/api/customer/index.ts index a7b115d07..be0c8942a 100644 --- a/backend/admin_api/src/api/customer/index.ts +++ b/backend/admin_api/src/api/customer/index.ts @@ -32,6 +32,7 @@ import type { APIKey, InsertCustomerDashboardUserRequest, } from "@oko-wallet/oko-types/ct_dashboard"; +import { createAuditLog } from "@oko-wallet-admin-api/utils/audit"; export async function createCustomer( db: Pool, @@ -45,7 +46,10 @@ export async function createCustomer( }; logo?: { buffer: Buffer; originalname: string } | null; }, + auditContext?: { adminUserId?: string; request?: any; requestId?: string }, ): Promise> { + const context = { db, ...auditContext }; + try { let logo_url: string | null = null; if (opts.logo) { @@ -57,13 +61,15 @@ export async function createCustomer( key: `logos/${Date.now().toString()}-${opts.logo.originalname}`, body: opts.logo.buffer, }); - if (uploadRes.success === false) { + + if (!uploadRes.success) { return { success: false, code: "UNKNOWN_ERROR", msg: `Failed to upload logo to S3: ${uploadRes.err}`, }; } + logo_url = decodeURIComponent(uploadRes.data); } @@ -113,8 +119,8 @@ export async function createCustomer( await client.query("COMMIT"); - return { - success: true, + const result = { + success: true as const, data: { customer_id, label: insertCustomerRes.data.label, @@ -125,8 +131,11 @@ export async function createCustomer( message: "Customer created successfully", }, }; + + return result; } catch (error) { await client.query("ROLLBACK"); + return { success: false, code: "UNKNOWN_ERROR", @@ -253,12 +262,15 @@ export async function getCustomerById( export async function deleteCustomerAndUsers( db: Pool, customer_id: string, + auditContext?: { adminUserId?: string; request?: any; requestId?: string }, ): Promise< OkoApiResponse<{ customer_id: string; customer_dashboard_user_ids: string[]; }> > { + const context = { db, ...auditContext }; + try { const client = await db.connect(); try { @@ -290,16 +302,19 @@ export async function deleteCustomerAndUsers( await client.query("COMMIT"); - return { - success: true, + const result = { + success: true as const, data: { customer_id: deleteCustomerRes.data.customer_id, customer_dashboard_user_ids: deleteCustomerDashboardUserRes.data.customer_dashboard_user_ids, }, }; + + return result; } catch (error) { await client.query("ROLLBACK"); + return { success: false, code: "UNKNOWN_ERROR", diff --git a/backend/admin_api/src/api/ks_node/index.ts b/backend/admin_api/src/api/ks_node/index.ts index 129e7615e..5381a0729 100644 --- a/backend/admin_api/src/api/ks_node/index.ts +++ b/backend/admin_api/src/api/ks_node/index.ts @@ -25,6 +25,8 @@ import { } from "@oko-wallet/oko-pg-interface/ks_nodes"; import type { KSNodeStatus } from "@oko-wallet-types/tss"; import { processKSNodeHealthChecks } from "@oko-wallet/ks-node-health"; +import { createAuditLog } from "@oko-wallet-admin-api/utils/audit"; +import type { AuditContext } from "@oko-wallet-admin-api/utils/audit"; export async function getAllKSNodes( db: Pool, @@ -49,7 +51,7 @@ export async function getAllKSNodes( return { success: false, code: "UNKNOWN_ERROR", - msg: `Failed to get ksNodes: ${error instanceof Error ? error.message : String(error)}`, + msg: `Failed to get ksNodes, err: ${error}`, }; } } @@ -80,11 +82,11 @@ export async function getKSNodeById( success: true, data: { ksNode: getKSNodeRes.data }, }; - } catch (error) { + } catch (err: any) { return { success: false, code: "UNKNOWN_ERROR", - msg: `Failed to get ksNode: ${error instanceof Error ? error.message : String(error)}`, + msg: `Failed to get ksNode: err: ${err}`, }; } } @@ -92,6 +94,7 @@ export async function getKSNodeById( export async function createKSNode( db: Pool, body: CreateKSNodeRequest, + auditContext?: AuditContext, ): Promise> { try { const { node_name, server_url } = body; @@ -122,11 +125,11 @@ export async function createKSNode( success: true, data: { node_id }, }; - } catch (error) { + } catch (err: any) { return { success: false, code: "UNKNOWN_ERROR", - msg: `Failed to create ksNode: ${error instanceof Error ? error.message : String(error)}`, + msg: `Failed to create ksNode, err: ${err}`, }; } } @@ -134,6 +137,7 @@ export async function createKSNode( export async function deactivateKSNode( db: Pool, body: DeactivateKSNodeRequest, + auditContext?: AuditContext, ): Promise> { try { const getKSNodeRes = await getKSNodeByIdFromPG(db, body.node_id); @@ -146,6 +150,18 @@ export async function deactivateKSNode( } if (getKSNodeRes.data === null) { + if (auditContext) { + await createAuditLog( + auditContext, + "deactivate", + "ks_node", + body.node_id, + undefined, + undefined, + "failure", + `KSNode not found: ${body.node_id}`, + ); + } return { success: false, code: "KS_NODE_NOT_FOUND", @@ -154,6 +170,18 @@ export async function deactivateKSNode( } if (getKSNodeRes.data.status === "INACTIVE") { + if (auditContext) { + await createAuditLog( + auditContext, + "deactivate", + "ks_node", + body.node_id, + undefined, + undefined, + "denied", + `KSNode already inactive: ${body.node_id}`, + ); + } return { success: false, code: "KS_NODE_ALREADY_INACTIVE", @@ -174,15 +202,27 @@ export async function deactivateKSNode( }; } + if (auditContext) { + await createAuditLog( + auditContext, + "disable", + "node", + body.node_id, + [{ field: "status", from: getKSNodeRes.data.status, to: "INACTIVE" }], + { node_id: body.node_id }, + "success", + ); + } + return { success: true, data: { node_id: body.node_id }, }; - } catch (error) { + } catch (err: any) { return { success: false, code: "UNKNOWN_ERROR", - msg: `Failed to deactivate ksNode: ${error instanceof Error ? error.message : String(error)}`, + msg: `Failed to deactivate ksNode, err: ${err}`, }; } } @@ -190,6 +230,7 @@ export async function deactivateKSNode( export async function activateKSNode( db: Pool, body: ActivateKSNodeRequest, + auditContext?: AuditContext, ): Promise> { try { const getKSNodeRes = await getKSNodeByIdFromPG(db, body.node_id); @@ -230,15 +271,27 @@ export async function activateKSNode( }; } + if (auditContext) { + await createAuditLog( + auditContext, + "enable", + "node", + body.node_id, + [{ field: "status", from: getKSNodeRes.data.status, to: "ACTIVE" }], + { node_id: body.node_id }, + "success", + ); + } + return { success: true, data: { node_id: body.node_id }, }; - } catch (error) { + } catch (err: any) { return { success: false, code: "UNKNOWN_ERROR", - msg: `Failed to activate ksNode: ${error instanceof Error ? error.message : String(error)}`, + msg: `Failed to activate ksNode, err: ${err}`, }; } } @@ -246,6 +299,7 @@ export async function activateKSNode( export async function updateKSNode( db: Pool, body: UpdateKSNodeRequest, + auditContext?: AuditContext, ): Promise> { try { const { node_id, server_url } = body; @@ -258,6 +312,13 @@ export async function updateKSNode( }; } + // Get current node info for audit trail + const getCurrentNodeRes = await getKSNodeByIdFromPG(db, node_id); + const oldServerUrl = + getCurrentNodeRes.success && getCurrentNodeRes.data + ? getCurrentNodeRes.data.server_url + : undefined; + const updateKSNodeRes = await updateKSNodeInfo(db, node_id, server_url); if (updateKSNodeRes.success === false) { return { @@ -267,15 +328,27 @@ export async function updateKSNode( }; } + if (auditContext) { + await createAuditLog( + auditContext, + "update", + "node", + node_id, + [{ field: "server_url", from: oldServerUrl, to: server_url }], + { node_id, server_url }, + "success", + ); + } + return { success: true, data: { node_id }, }; - } catch (error) { + } catch (err) { return { success: false, code: "UNKNOWN_ERROR", - msg: `Failed to update ksNode: ${error instanceof Error ? error.message : String(error)}`, + msg: `Failed to update ksNode: ${err}`, }; } } @@ -283,6 +356,7 @@ export async function updateKSNode( export async function deleteKSNode( db: Pool, body: DeleteKSNodeRequest, + auditContext?: AuditContext, ): Promise> { try { const getKSNodeRes = await getKSNodeByIdFromPG(db, body.node_id); @@ -311,15 +385,27 @@ export async function deleteKSNode( }; } + if (auditContext) { + await createAuditLog( + auditContext, + "delete", + "node", + body.node_id, + [{ field: "deleted_at", from: null, to: new Date().toISOString() }], + { node_id: body.node_id }, + "success", + ); + } + return { success: true, data: { node_id: body.node_id }, }; - } catch (error) { + } catch (err) { return { success: false, code: "UNKNOWN_ERROR", - msg: `Failed to delete ksNode: ${error instanceof Error ? error.message : String(error)}`, + msg: `Failed to delete ksNode: ${err}`, }; } } diff --git a/backend/admin_api/src/api/tss/index.ts b/backend/admin_api/src/api/tss/index.ts index 2b67e658c..5a5d27271 100644 --- a/backend/admin_api/src/api/tss/index.ts +++ b/backend/admin_api/src/api/tss/index.ts @@ -12,6 +12,8 @@ import { getTssActivationSetting as getTssAllActivationSettingPG, setTssActivationSetting as setTssAllActivationSettingPG, } from "@oko-wallet/oko-pg-interface/tss_activate"; +import { createAuditLog } from "@oko-wallet-admin-api/utils/audit"; +import type { AuditContext } from "@oko-wallet-admin-api/utils/audit"; export async function getTssSessionList( db: Pool, @@ -110,16 +112,10 @@ export async function getTssAllActivationSetting( export async function setTssAllActivationSetting( db: Pool, body: SetTssAllActivationSettingRequest, + auditContext?: AuditContext, ): Promise> { try { const { is_enabled } = body; - if (typeof is_enabled !== "boolean") { - return { - success: false, - code: "INVALID_REQUEST", - msg: "is_enabled must be a boolean value", - }; - } const getTssActivationRes = await getTssAllActivationSettingPG( db, @@ -142,6 +138,8 @@ export async function setTssAllActivationSetting( }; } + const oldValue = tssActivationSetting.is_enabled; + const setTssActivationRes = await setTssAllActivationSettingPG( db, is_enabled, diff --git a/backend/admin_api/src/api/user/index.ts b/backend/admin_api/src/api/user/index.ts index 8286ff892..b7b9c1555 100644 --- a/backend/admin_api/src/api/user/index.ts +++ b/backend/admin_api/src/api/user/index.ts @@ -9,6 +9,8 @@ import { getAdminByEmail } from "@oko-wallet/oko-pg-interface/admin_users"; import { comparePassword } from "@oko-wallet/crypto-js"; import { generateAdminToken } from "@oko-wallet-admin-api/auth"; +import { createAuditLog } from "@oko-wallet-admin-api/utils/audit"; +import type { AuditContext } from "@oko-wallet-admin-api/utils/audit"; export async function login( db: Pool, @@ -17,6 +19,7 @@ export async function login( secret: string; expires_in: string; }, + auditContext?: AuditContext, ): Promise> { try { const getAdminRes = await getAdminByEmail(db, body.email); @@ -96,6 +99,7 @@ export async function login( export async function logout( db: Pool, token?: string, + auditContext?: AuditContext, ): Promise> { try { if (token) { diff --git a/backend/admin_api/src/api/ewallet_wallet/index.ts b/backend/admin_api/src/api/wallet/index.ts similarity index 100% rename from backend/admin_api/src/api/ewallet_wallet/index.ts rename to backend/admin_api/src/api/wallet/index.ts diff --git a/backend/admin_api/src/middleware/index.ts b/backend/admin_api/src/middleware/index.ts index 473e212ef..42369fe32 100644 --- a/backend/admin_api/src/middleware/index.ts +++ b/backend/admin_api/src/middleware/index.ts @@ -1,11 +1,15 @@ import type { Request, Response, NextFunction } from "express"; +import { v4 as uuidv4 } from "uuid"; import { verifyAdminToken } from "@oko-wallet-admin-api/auth"; +import type { AuditContext } from "@oko-wallet-admin-api/utils/audit"; -export type AuthenticatedAdminRequest = Request; +export type AuthenticatedAdminRequest = Request & { + auditContext?: AuditContext; +}; export function adminAuthMiddleware( - req: Request, + req: Request & { auditContext?: AuditContext }, res: Response, next: NextFunction, ) { @@ -43,6 +47,15 @@ export function adminAuthMiddleware( role: verifyResult.data.role, type: verifyResult.data.type, }; + + const auditContext: AuditContext = { + db: req.app.locals.db, + adminUserId: verifyResult.data.sub, + request: req, + requestId: uuidv4(), + }; + + req.auditContext = auditContext; next(); return; } diff --git a/backend/admin_api/src/routes/activate_ks_node.ts b/backend/admin_api/src/routes/activate_ks_node.ts new file mode 100644 index 000000000..94142f02f --- /dev/null +++ b/backend/admin_api/src/routes/activate_ks_node.ts @@ -0,0 +1,25 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { + ActivateKSNodeRequest, + ActivateKSNodeResponse, +} from "@oko-wallet/oko-types/admin"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { activateKSNode } from "@oko-wallet-admin-api/api/ks_node"; + +export async function activate_ks_node( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + + const result = await activateKSNode(state.db, req.body, req.auditContext); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/create_customer.ts b/backend/admin_api/src/routes/create_customer.ts new file mode 100644 index 000000000..9fdb02cb1 --- /dev/null +++ b/backend/admin_api/src/routes/create_customer.ts @@ -0,0 +1,68 @@ +import type { Response } from "express"; +import type { + CreateCustomerResponse, + CreateCustomerWithDashboardUserRequest, +} from "@oko-wallet/oko-types/admin"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { createCustomer } from "@oko-wallet-admin-api/api/customer"; + +export async function create_customer( + req: AuthenticatedAdminRequest & { + file?: Express.Multer.File; + }, + res: Response>, +) { + const body = req.body; + const state = req.app.locals; + + if (!body || !body.email || !body.password || !body.label) { + res.status(400).json({ + success: false, + code: "INVALID_EMAIL_OR_PASSWORD", + msg: "Email, password, and label are required", + }); + return; + } + + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(body.email)) { + res.status(400).json({ + success: false, + code: "INVALID_EMAIL_OR_PASSWORD", + msg: "Invalid email format", + }); + return; + } + + const createCustomerRes = await createCustomer( + state.db, + body, + { + s3: { + region: state.s3_region, + accessKeyId: state.s3_access_key_id, + secretAccessKey: state.s3_secret_access_key, + bucket: state.s3_bucket, + }, + logo: req.file + ? { buffer: req.file.buffer, originalname: req.file.originalname } + : null, + }, + req.auditContext, + ); + if (createCustomerRes.success === false) { + res + .status(ErrorCodeMap[createCustomerRes.code] ?? 500) + .json(createCustomerRes); + return; + } + + res.status(201).json({ + success: true, + data: createCustomerRes.data, + }); + return; +} diff --git a/backend/admin_api/src/routes/create_ks_node.ts b/backend/admin_api/src/routes/create_ks_node.ts new file mode 100644 index 000000000..ab415fac7 --- /dev/null +++ b/backend/admin_api/src/routes/create_ks_node.ts @@ -0,0 +1,23 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { CreateKSNodeResponse } from "@oko-wallet/oko-types/admin"; +import type { CreateKSNodeRequest } from "@oko-wallet/oko-types/admin"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { createKSNode } from "@oko-wallet-admin-api/api/ks_node"; + +export async function create_ks_node( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + + const result = await createKSNode(state.db, req.body, req.auditContext); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/customer.ts b/backend/admin_api/src/routes/customer.ts deleted file mode 100644 index 4064901e2..000000000 --- a/backend/admin_api/src/routes/customer.ts +++ /dev/null @@ -1,406 +0,0 @@ -import type { Response, Router } from "express"; -import type { - CreateCustomerResponse, - CreateCustomerWithDashboardUserRequest, -} from "@oko-wallet/oko-types/admin"; -import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; -import type { - Customer, - CustomerWithAPIKeys, - DeleteCustomerAndCustomerDashboardUsersRequest, - DeleteCustomerAndCustomerDashboardUsersResponse, -} from "@oko-wallet/oko-types/customers"; -import multer from "multer"; -import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; -import { registry } from "@oko-wallet/oko-api-openapi"; -import { - ErrorResponseSchema, - AdminAuthHeaderSchema, -} from "@oko-wallet/oko-api-openapi/common"; -import { - CreateCustomerWithDashboardUserRequestSchema, - CreateCustomerSuccessResponseSchema, - GetCustomerListQuerySchema, - GetCustomerListSuccessResponseSchema, - CustomerIdParamSchema, - GetCustomerSuccessResponseSchema, - DeleteCustomerSuccessResponseSchema, -} from "@oko-wallet/oko-api-openapi/oko_admin"; - -import { - adminAuthMiddleware, - type AuthenticatedAdminRequest, -} from "@oko-wallet-admin-api/middleware"; -import { - createCustomer, - getCustomerList, - getCustomerById, - deleteCustomerAndUsers, -} from "@oko-wallet-admin-api/api/customer"; - -const upload = multer(); - -export function setCustomerRoutes(router: Router) { - registry.registerPath({ - method: "post", - path: "/oko_admin/v1/customer/create_customer", - tags: ["Admin"], - summary: "Create new customer", - description: "Creates a new customer with dashboard user account", - security: [{ adminAuth: [] }], - request: { - headers: AdminAuthHeaderSchema, - body: { - content: { - "multipart/form-data": { - schema: CreateCustomerWithDashboardUserRequestSchema, - }, - }, - }, - }, - responses: { - 201: { - description: "Customer created successfully", - content: { - "application/json": { - schema: CreateCustomerSuccessResponseSchema, - }, - }, - }, - 400: { - description: "Invalid request", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 401: { - description: "Unauthorized", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 500: { - description: "Server error", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - }, - }); - router.post( - "/customer/create_customer", - adminAuthMiddleware, - upload.single("logo"), - async ( - req: AuthenticatedAdminRequest & { - file?: Express.Multer.File; - }, - res: Response>, - ) => { - const body = req.body; - const state = req.app.locals; - - if (!body || !body.email || !body.password || !body.label) { - res.status(400).json({ - success: false, - code: "INVALID_EMAIL_OR_PASSWORD", - msg: "Email, password, and label are required", - }); - return; - } - - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(body.email)) { - res.status(400).json({ - success: false, - code: "INVALID_EMAIL_OR_PASSWORD", - msg: "Invalid email format", - }); - return; - } - - const createCustomerRes = await createCustomer(state.db, body, { - s3: { - region: state.s3_region, - accessKeyId: state.s3_access_key_id, - secretAccessKey: state.s3_secret_access_key, - bucket: state.s3_bucket, - }, - logo: req.file - ? { buffer: req.file.buffer, originalname: req.file.originalname } - : null, - }); - if (createCustomerRes.success === false) { - res - .status(ErrorCodeMap[createCustomerRes.code] ?? 500) - .json(createCustomerRes); - return; - } - - res.status(201).json({ - success: true, - data: createCustomerRes.data, - }); - return; - }, - ); - - registry.registerPath({ - method: "get", - path: "/oko_admin/v1/customer/get_customer_list", - tags: ["Admin"], - summary: "Get customers with pagination", - description: "Retrieves a list of customers with pagination", - security: [{ adminAuth: [] }], - request: { - headers: AdminAuthHeaderSchema, - query: GetCustomerListQuerySchema, - }, - responses: { - 200: { - description: "Customer list retrieved successfully", - content: { - "application/json": { - schema: GetCustomerListSuccessResponseSchema, - }, - }, - }, - 401: { - description: "Unauthorized", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 500: { - description: "Server error", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - }, - }); - router.get( - "/customer/get_customer_list", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response< - OkoApiResponse<{ - customerWithAPIKeysList: CustomerWithAPIKeys[]; - pagination: { - total: number; - current_page: number; - total_pages: number; - }; - }> - >, - ) => { - const state = req.app.locals; - - let { limit, offset } = req.query; - if (!limit || !offset) { - limit = 10; - offset = 0; - } else { - limit = parseInt(limit); - offset = parseInt(offset); - } - - const getCustomerListRes = await getCustomerList(state.db, limit, offset); - if (getCustomerListRes.success === false) { - res - .status(ErrorCodeMap[getCustomerListRes.code] ?? 500) - .json(getCustomerListRes); - return; - } - - res.status(200).json({ - success: true, - data: getCustomerListRes.data, - }); - return; - }, - ); - - registry.registerPath({ - method: "get", - path: "/oko_admin/v1/customer/get_customer/{customer_id}", - tags: ["Admin"], - summary: "Get customer by ID", - description: "Retrieves customer information by customer ID", - security: [{ adminAuth: [] }], - request: { - headers: AdminAuthHeaderSchema, - params: CustomerIdParamSchema, - }, - responses: { - 200: { - description: "Customer information retrieved successfully", - content: { - "application/json": { - schema: GetCustomerSuccessResponseSchema, - }, - }, - }, - 400: { - description: "Invalid request", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 401: { - description: "Unauthorized", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 404: { - description: "Customer not found", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 500: { - description: "Server error", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - }, - }); - router.get( - "/customer/get_customer/:customer_id", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals; - const { customer_id: customerId } = req.params; - - if (!customerId) { - res.status(400).json({ - success: false, - code: "MISSING_CUSTOMER_ID", - msg: "Customer ID is required", - }); - return; - } - - const getCustomerByIdRes = await getCustomerById(state.db, customerId); - if (getCustomerByIdRes.success === false) { - res - .status(ErrorCodeMap[getCustomerByIdRes.code] ?? 500) - .json(getCustomerByIdRes); - return; - } - - res.status(200).json({ success: true, data: getCustomerByIdRes.data }); - return; - }, - ); - - registry.registerPath({ - method: "post", - path: "/oko_admin/v1/customer/delete_customer/{customer_id}", - tags: ["Admin"], - summary: "Delete customer by ID", - description: "Deletes a customer by customer ID", - security: [{ adminAuth: [] }], - request: { - headers: AdminAuthHeaderSchema, - params: CustomerIdParamSchema, - }, - responses: { - 200: { - description: "Customer deleted successfully", - content: { - "application/json": { - schema: DeleteCustomerSuccessResponseSchema, - }, - }, - }, - 400: { - description: "Invalid request", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 401: { - description: "Unauthorized", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 500: { - description: "Server error", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - }, - }); - router.post( - "/customer/delete_customer/:customer_id", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response< - OkoApiResponse - >, - ) => { - const state = req.app.locals; - const { customer_id: customerId } = req.params; - - if (!customerId) { - res.status(400).json({ - success: false, - code: "MISSING_CUSTOMER_ID", - msg: "Customer ID is required", - }); - return; - } - - const deleteCustomerAndUsersRes = await deleteCustomerAndUsers( - state.db, - customerId, - ); - if (deleteCustomerAndUsersRes.success === false) { - res - .status(ErrorCodeMap[deleteCustomerAndUsersRes.code] ?? 500) - .json(deleteCustomerAndUsersRes); - return; - } - - res.status(200).json({ - success: true, - data: deleteCustomerAndUsersRes.data, - }); - return; - }, - ); -} diff --git a/backend/admin_api/src/routes/deactivate_ks_node.ts b/backend/admin_api/src/routes/deactivate_ks_node.ts new file mode 100644 index 000000000..997c00dac --- /dev/null +++ b/backend/admin_api/src/routes/deactivate_ks_node.ts @@ -0,0 +1,25 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { + DeactivateKSNodeRequest, + DeactivateKSNodeResponse, +} from "@oko-wallet/oko-types/admin"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { deactivateKSNode } from "@oko-wallet-admin-api/api/ks_node"; + +export async function deactivate_ks_node( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + + const result = await deactivateKSNode(state.db, req.body, req.auditContext); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/delete_customer.ts b/backend/admin_api/src/routes/delete_customer.ts new file mode 100644 index 000000000..15706c339 --- /dev/null +++ b/backend/admin_api/src/routes/delete_customer.ts @@ -0,0 +1,47 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { + DeleteCustomerAndCustomerDashboardUsersRequest, + DeleteCustomerAndCustomerDashboardUsersResponse, +} from "@oko-wallet/oko-types/customers"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { deleteCustomerAndUsers } from "@oko-wallet-admin-api/api/customer"; + +export async function delete_customer( + req: AuthenticatedAdminRequest, + res: Response< + OkoApiResponse + >, +) { + const state = req.app.locals; + const { customer_id: customerId } = req.params; + + if (!customerId) { + res.status(400).json({ + success: false, + code: "MISSING_CUSTOMER_ID", + msg: "Customer ID is required", + }); + return; + } + + const deleteCustomerAndUsersRes = await deleteCustomerAndUsers( + state.db, + customerId, + req.auditContext, + ); + if (deleteCustomerAndUsersRes.success === false) { + res + .status(ErrorCodeMap[deleteCustomerAndUsersRes.code] ?? 500) + .json(deleteCustomerAndUsersRes); + return; + } + + res.status(200).json({ + success: true, + data: deleteCustomerAndUsersRes.data, + }); + return; +} diff --git a/backend/admin_api/src/routes/delete_ks_node.ts b/backend/admin_api/src/routes/delete_ks_node.ts new file mode 100644 index 000000000..3c13d0925 --- /dev/null +++ b/backend/admin_api/src/routes/delete_ks_node.ts @@ -0,0 +1,25 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { + DeactivateKSNodeRequest, + DeactivateKSNodeResponse, +} from "@oko-wallet/oko-types/admin"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { deleteKSNode } from "@oko-wallet-admin-api/api/ks_node"; + +export async function delete_ks_node( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + + const result = await deleteKSNode(state.db, req.body, req.auditContext); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/ewallet_wallet.ts b/backend/admin_api/src/routes/ewallet_wallet.ts deleted file mode 100644 index 96bcee887..000000000 --- a/backend/admin_api/src/routes/ewallet_wallet.ts +++ /dev/null @@ -1,88 +0,0 @@ -import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; -import type { - GetWalletListRequest, - GetWalletListResponse, -} from "@oko-wallet-types/admin"; -import type { Response, Router } from "express"; -import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; -import { registry } from "@oko-wallet/oko-api-openapi"; -import { - AdminAuthHeaderSchema, - ErrorResponseSchema, -} from "@oko-wallet/oko-api-openapi/common"; -import { - GetWalletListRequestSchema, - GetWalletListSuccessResponseSchema, -} from "@oko-wallet/oko-api-openapi/oko_admin"; - -import { - adminAuthMiddleware, - type AuthenticatedAdminRequest, -} from "@oko-wallet-admin-api/middleware"; -import { getWalletList } from "@oko-wallet-admin-api/api/ewallet_wallet"; - -export function setWalletRoutes(router: Router) { - registry.registerPath({ - method: "post", - path: "/oko_admin/v1/wallet/get_wallet_list", - tags: ["Admin"], - summary: "Get wallet list with pagination", - description: "Retrieves a list of wallets with pagination", - security: [{ adminAuth: [] }], - request: { - headers: AdminAuthHeaderSchema, - body: { - required: false, - content: { - "application/json": { - schema: GetWalletListRequestSchema, - }, - }, - }, - }, - responses: { - 200: { - description: "Wallet list retrieved successfully", - content: { - "application/json": { - schema: GetWalletListSuccessResponseSchema, - }, - }, - }, - 401: { - description: "Unauthorized", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 500: { - description: "Server error", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - }, - }); - router.post( - "/wallet/get_wallet_list", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals; - - const result = await getWalletList(state.db, req.body); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); -} diff --git a/backend/admin_api/src/routes/get_all_ks_nodes.ts b/backend/admin_api/src/routes/get_all_ks_nodes.ts new file mode 100644 index 000000000..f0e7190bc --- /dev/null +++ b/backend/admin_api/src/routes/get_all_ks_nodes.ts @@ -0,0 +1,22 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { GetAllKSNodeResponse } from "@oko-wallet/oko-types/admin"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { getAllKSNodes } from "@oko-wallet-admin-api/api/ks_node"; + +export async function get_all_ks_nodes( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + + const result = await getAllKSNodes(state.db); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/get_audit_logs.ts b/backend/admin_api/src/routes/get_audit_logs.ts new file mode 100644 index 000000000..b2fac3cbe --- /dev/null +++ b/backend/admin_api/src/routes/get_audit_logs.ts @@ -0,0 +1,65 @@ +import { Pool } from "pg"; +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { AuditEventFilter } from "@oko-wallet/oko-types/admin"; +import type { GetAuditLogsResponse } from "@oko-wallet/oko-types/admin"; +import { getAuditLogs } from "@oko-wallet-admin-api/api/audit"; +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; + +export async function get_audit_logs( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + const db = state.db as Pool; + try { + const params: AuditEventFilter = {}; + + if (req.query.target_type) { + params.target_type = req.query.target_type as string; + } + if (req.query.target_id) { + params.target_id = req.query.target_id as string; + } + if (req.query.action) { + params.action = req.query.action as string; + } + if (req.query.actor) { + params.actor = req.query.actor as string; + } + if (req.query.source) { + params.source = req.query.source as string; + } + if (req.query.outcome) { + params.outcome = req.query.outcome as "success" | "failure" | "denied"; + } + if (req.query.occurred_after) { + params.occurred_after = new Date(req.query.occurred_after as string); + } + if (req.query.occurred_before) { + params.occurred_before = new Date(req.query.occurred_before as string); + } + if (req.query.limit) { + params.limit = parseInt(req.query.limit as string); + } + if (req.query.offset) { + params.offset = parseInt(req.query.offset as string); + } + + const result = await getAuditLogs(db, params); + + if (result.success) { + res.status(200).json(result); + } else { + res.status(500).json(result); + } + } catch (error) { + const errorResponse: OkoApiResponse = { + success: false, + code: "UNKNOWN_ERROR", + msg: `Failed to get audit logs: ${error instanceof Error ? error.message : String(error)}`, + }; + + res.status(500).json(errorResponse); + } +} diff --git a/backend/admin_api/src/routes/get_audit_logs_count.ts b/backend/admin_api/src/routes/get_audit_logs_count.ts new file mode 100644 index 000000000..1e73615c2 --- /dev/null +++ b/backend/admin_api/src/routes/get_audit_logs_count.ts @@ -0,0 +1,59 @@ +import { Pool } from "pg"; +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { AuditEventFilter } from "@oko-wallet/oko-types/admin"; +import type { GetAuditLogsCountResponse } from "@oko-wallet/oko-types/admin"; +import { getAuditLogsCount } from "@oko-wallet-admin-api/api/audit"; +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; + +export async function get_audit_logs_count( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + const db = state.db as Pool; + try { + const params: AuditEventFilter = {}; + + if (req.query.target_type) { + params.target_type = req.query.target_type as string; + } + if (req.query.target_id) { + params.target_id = req.query.target_id as string; + } + if (req.query.action) { + params.action = req.query.action as string; + } + if (req.query.actor) { + params.actor = req.query.actor as string; + } + if (req.query.source) { + params.source = req.query.source as string; + } + if (req.query.outcome) { + params.outcome = req.query.outcome as "success" | "failure" | "denied"; + } + if (req.query.occurred_after) { + params.occurred_after = new Date(req.query.occurred_after as string); + } + if (req.query.occurred_before) { + params.occurred_before = new Date(req.query.occurred_before as string); + } + + const result = await getAuditLogsCount(db, params); + + if (result.success) { + res.status(200).json(result); + } else { + res.status(500).json(result); + } + } catch (error) { + const errorResponse: OkoApiResponse = { + success: false, + code: "UNKNOWN_ERROR", + msg: `Failed to get audit logs count: ${error instanceof Error ? error.message : String(error)}`, + }; + + res.status(500).json(errorResponse); + } +} diff --git a/backend/admin_api/src/routes/get_customer.ts b/backend/admin_api/src/routes/get_customer.ts new file mode 100644 index 000000000..8587af0f3 --- /dev/null +++ b/backend/admin_api/src/routes/get_customer.ts @@ -0,0 +1,35 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { Customer } from "@oko-wallet/oko-types/customers"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { getCustomerById } from "@oko-wallet-admin-api/api/customer"; + +export async function get_customer( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + const { customer_id: customerId } = req.params; + + if (!customerId) { + res.status(400).json({ + success: false, + code: "MISSING_CUSTOMER_ID", + msg: "Customer ID is required", + }); + return; + } + + const getCustomerByIdRes = await getCustomerById(state.db, customerId); + if (getCustomerByIdRes.success === false) { + res + .status(ErrorCodeMap[getCustomerByIdRes.code] ?? 500) + .json(getCustomerByIdRes); + return; + } + + res.status(200).json({ success: true, data: getCustomerByIdRes.data }); + return; +} diff --git a/backend/admin_api/src/routes/get_customer_list.ts b/backend/admin_api/src/routes/get_customer_list.ts new file mode 100644 index 000000000..ca3d9a340 --- /dev/null +++ b/backend/admin_api/src/routes/get_customer_list.ts @@ -0,0 +1,46 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { CustomerWithAPIKeys } from "@oko-wallet/oko-types/customers"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { getCustomerList } from "@oko-wallet-admin-api/api/customer"; + +export async function get_customer_list( + req: AuthenticatedAdminRequest, + res: Response< + OkoApiResponse<{ + customerWithAPIKeysList: CustomerWithAPIKeys[]; + pagination: { + total: number; + current_page: number; + total_pages: number; + }; + }> + >, +) { + const state = req.app.locals; + + let { limit, offset } = req.query; + if (!limit || !offset) { + limit = 10; + offset = 0; + } else { + limit = parseInt(limit); + offset = parseInt(offset); + } + + const getCustomerListRes = await getCustomerList(state.db, limit, offset); + if (getCustomerListRes.success === false) { + res + .status(ErrorCodeMap[getCustomerListRes.code] ?? 500) + .json(getCustomerListRes); + return; + } + + res.status(200).json({ + success: true, + data: getCustomerListRes.data, + }); + return; +} diff --git a/backend/admin_api/src/routes/get_ks_node_by_id.ts b/backend/admin_api/src/routes/get_ks_node_by_id.ts new file mode 100644 index 000000000..257942677 --- /dev/null +++ b/backend/admin_api/src/routes/get_ks_node_by_id.ts @@ -0,0 +1,24 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { + GetKSNodeByIdRequest, + GetKSNodeByIdResponse, +} from "@oko-wallet/oko-types/admin"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { getKSNodeById } from "@oko-wallet-admin-api/api/ks_node"; + +export async function get_ks_node_by_id( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + const result = await getKSNodeById(state.db, req.body); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/get_tss_all_activation_setting.ts b/backend/admin_api/src/routes/get_tss_all_activation_setting.ts new file mode 100644 index 000000000..52e11dc62 --- /dev/null +++ b/backend/admin_api/src/routes/get_tss_all_activation_setting.ts @@ -0,0 +1,22 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { GetTssAllActivationSettingResponse } from "@oko-wallet-types/admin"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { getTssAllActivationSetting } from "@oko-wallet-admin-api/api/tss"; + +export async function get_tss_all_activation_setting( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals as any; + + const result = await getTssAllActivationSetting(state.db); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/get_tss_session_list.ts b/backend/admin_api/src/routes/get_tss_session_list.ts new file mode 100644 index 000000000..c89675dc2 --- /dev/null +++ b/backend/admin_api/src/routes/get_tss_session_list.ts @@ -0,0 +1,25 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { + GetTssSessionListRequest, + GetTssSessionListResponse, +} from "@oko-wallet-types/admin"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { getTssSessionList } from "@oko-wallet-admin-api/api/tss"; + +export async function get_tss_session_list( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals as any; + + const result = await getTssSessionList(state.db, req.body); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/get_wallet_list.ts b/backend/admin_api/src/routes/get_wallet_list.ts new file mode 100644 index 000000000..fa0f2d39a --- /dev/null +++ b/backend/admin_api/src/routes/get_wallet_list.ts @@ -0,0 +1,25 @@ +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { + GetWalletListRequest, + GetWalletListResponse, +} from "@oko-wallet-types/admin"; +import type { Response } from "express"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { getWalletList } from "@oko-wallet-admin-api/api/wallet"; + +export async function get_wallet_list( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + + const result = await getWalletList(state.db, req.body); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/index.ts b/backend/admin_api/src/routes/index.ts index 8ac93eee1..68e3b5471 100644 --- a/backend/admin_api/src/routes/index.ts +++ b/backend/admin_api/src/routes/index.ts @@ -1,19 +1,727 @@ import express from "express"; +import multer from "multer"; +import { + GetWalletListRequestSchema, + GetWalletListSuccessResponseSchema, +} from "@oko-wallet/oko-api-openapi/oko_admin"; +import { registry } from "@oko-wallet/oko-api-openapi"; +import { + ErrorResponseSchema, + AdminAuthHeaderSchema, +} from "@oko-wallet/oko-api-openapi/common"; +import { + GetTssSessionListSuccessResponseSchema, + GetTssAllActivationSettingSuccessResponseSchema, + SetTssAllActivationSettingRequestSchema, + SetTssAllActivationSettingSuccessResponseSchema, +} from "@oko-wallet/oko-api-openapi/oko_admin"; +import { + CreateCustomerWithDashboardUserRequestSchema, + CreateCustomerSuccessResponseSchema, + GetCustomerListQuerySchema, + GetCustomerListSuccessResponseSchema, + CustomerIdParamSchema, + GetCustomerSuccessResponseSchema, + DeleteCustomerSuccessResponseSchema, + GetTssSessionListRequestSchema, + GetAuditLogsQuerySchema, + GetAuditLogsCountQuerySchema, +} from "@oko-wallet/oko-api-openapi/oko_admin"; +import { + LoginRequestSchema, + AdminLoginSuccessResponseSchema, + AdminLogoutSuccessResponseSchema, +} from "@oko-wallet/oko-api-openapi/oko_admin"; -import { setCustomerRoutes } from "@oko-wallet-admin-api/routes/customer"; -import { setWalletRoutes } from "@oko-wallet-admin-api/routes/ewallet_wallet"; -import { setUserRoutes } from "@oko-wallet-admin-api/routes/user"; -import { setTssRoutes } from "@oko-wallet-admin-api/routes/tss"; -import { setKSNodeRoutes } from "@oko-wallet-admin-api/routes/ks_node"; +import { adminAuthMiddleware } from "@oko-wallet-admin-api/middleware"; +import { create_customer } from "./create_customer"; +import { get_customer_list } from "./get_customer_list"; +import { get_customer } from "./get_customer"; +import { delete_customer } from "./delete_customer"; +import { user_login } from "./user_login"; +import { user_logout } from "./user_logout"; +import { get_tss_session_list } from "./get_tss_session_list"; +import { get_tss_all_activation_setting } from "./get_tss_all_activation_setting"; +import { set_tss_all_activation_setting } from "./set_tss_all_activation_setting"; +import { get_wallet_list } from "./get_wallet_list"; +import { get_all_ks_nodes } from "./get_all_ks_nodes"; +import { get_ks_node_by_id } from "./get_ks_node_by_id"; +import { create_ks_node } from "./create_ks_node"; +import { deactivate_ks_node } from "./deactivate_ks_node"; +import { delete_ks_node } from "./delete_ks_node"; +import { update_ks_node } from "./update_ks_node"; +import { activate_ks_node } from "./activate_ks_node"; +import { get_audit_logs } from "./get_audit_logs"; +import { get_audit_logs_count } from "./get_audit_logs_count"; export function makeEWalletAdminRouter() { const router = express.Router(); + const upload = multer(); - setCustomerRoutes(router); - setUserRoutes(router); - setTssRoutes(router); - setWalletRoutes(router); - setKSNodeRoutes(router); + registry.registerPath({ + method: "post", + path: "/oko_admin/v1/customer/create_customer", + tags: ["Admin"], + summary: "Create new customer", + description: "Creates a new customer with dashboard user account", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + body: { + content: { + "multipart/form-data": { + schema: CreateCustomerWithDashboardUserRequestSchema, + }, + }, + }, + }, + responses: { + 201: { + description: "Customer created successfully", + content: { + "application/json": { + schema: CreateCustomerSuccessResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.post( + "/customer/create_customer", + adminAuthMiddleware, + upload.single("logo"), + create_customer, + ); + + registry.registerPath({ + method: "get", + path: "/oko_admin/v1/customer/get_customer_list", + tags: ["Admin"], + summary: "Get customers with pagination", + description: "Retrieves a list of customers with pagination", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + query: GetCustomerListQuerySchema, + }, + responses: { + 200: { + description: "Customer list retrieved successfully", + content: { + "application/json": { + schema: GetCustomerListSuccessResponseSchema, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.get( + "/customer/get_customer_list", + adminAuthMiddleware, + get_customer_list, + ); + + registry.registerPath({ + method: "get", + path: "/oko_admin/v1/customer/get_customer/{customer_id}", + tags: ["Admin"], + summary: "Get customer by ID", + description: "Retrieves customer information by customer ID", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + params: CustomerIdParamSchema, + }, + responses: { + 200: { + description: "Customer information retrieved successfully", + content: { + "application/json": { + schema: GetCustomerSuccessResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 404: { + description: "Customer not found", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.get( + "/customer/get_customer/:customer_id", + adminAuthMiddleware, + get_customer, + ); + + registry.registerPath({ + method: "post", + path: "/oko_admin/v1/customer/delete_customer/{customer_id}", + tags: ["Admin"], + summary: "Delete customer by ID", + description: "Deletes a customer by customer ID", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + params: CustomerIdParamSchema, + }, + responses: { + 200: { + description: "Customer deleted successfully", + content: { + "application/json": { + schema: DeleteCustomerSuccessResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.post( + "/customer/delete_customer/:customer_id", + adminAuthMiddleware, + delete_customer, + ); + + registry.registerPath({ + method: "post", + path: "/oko_admin/v1/user/login", + tags: ["Admin"], + summary: "Admin login", + description: "Authenticates an admin user", + security: [], + request: { + body: { + required: true, + content: { + "application/json": { + schema: LoginRequestSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Successfully logged in", + content: { + "application/json": { + schema: AdminLoginSuccessResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 401: { + description: "Invalid credentials", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.post("/user/login", user_login); + + registry.registerPath({ + method: "post", + path: "/oko_admin/v1/user/logout", + tags: ["Admin"], + summary: "Admin logout", + description: "Logs out an admin user", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + }, + responses: { + 200: { + description: "Successfully logged out", + content: { + "application/json": { + schema: AdminLogoutSuccessResponseSchema, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.post("/user/logout", adminAuthMiddleware, user_logout); + + registry.registerPath({ + method: "post", + path: "/oko_admin/v1/tss/get_tss_session_list", + tags: ["Admin"], + summary: "Get tss sessions with pagination", + description: "Retrieves a list of TSS sessions with next/prev pagination", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + body: { + required: false, + content: { + "application/json": { + schema: GetTssSessionListRequestSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "TSS sessions retrieved successfully", + content: { + "application/json": { + schema: GetTssSessionListSuccessResponseSchema, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.post( + "/tss/get_tss_session_list", + adminAuthMiddleware, + get_tss_session_list, + ); + + registry.registerPath({ + method: "post", + path: "/oko_admin/v1/tss/get_tss_all_activation_setting", + tags: ["Admin"], + summary: "Get TSS activation setting", + description: "Retrieves the current TSS activation setting", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + }, + responses: { + 200: { + description: "TSS activation setting retrieved successfully", + content: { + "application/json": { + schema: GetTssAllActivationSettingSuccessResponseSchema, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + + router.post( + "/tss/get_tss_all_activation_setting", + adminAuthMiddleware, + get_tss_all_activation_setting, + ); + + registry.registerPath({ + method: "post", + path: "/oko_admin/v1/tss/set_tss_all_activation_setting", + tags: ["Admin"], + summary: "Set TSS activation setting", + description: "Enable or disable TSS functionality for all users", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + body: { + required: true, + content: { + "application/json": { + schema: SetTssAllActivationSettingRequestSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "TSS activation setting updated successfully", + content: { + "application/json": { + schema: SetTssAllActivationSettingSuccessResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.post( + "/tss/set_tss_all_activation_setting", + adminAuthMiddleware, + set_tss_all_activation_setting, + ); + + registry.registerPath({ + method: "post", + path: "/oko_admin/v1/wallet/get_wallet_list", + tags: ["Admin"], + summary: "Get wallet list with pagination", + description: "Retrieves a list of wallets with pagination", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + body: { + required: false, + content: { + "application/json": { + schema: GetWalletListRequestSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Wallet list retrieved successfully", + content: { + "application/json": { + schema: GetWalletListSuccessResponseSchema, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.post("/wallet/get_wallet_list", adminAuthMiddleware, get_wallet_list); + + router.post( + "/ks_node/get_all_ks_nodes", + adminAuthMiddleware, + get_all_ks_nodes, + ); + + router.post( + "/ks_node/get_ks_node_by_id", + adminAuthMiddleware, + get_ks_node_by_id, + ); + + router.post("/ks_node/create_ks_node", adminAuthMiddleware, create_ks_node); + + router.post( + "/ks_node/deactivate_ks_node", + adminAuthMiddleware, + deactivate_ks_node, + ); + + router.post("/ks_node/delete_ks_node", adminAuthMiddleware, delete_ks_node); + + router.post("/ks_node/update_ks_node", adminAuthMiddleware, update_ks_node); + + router.post( + "/ks_node/activate_ks_node", + adminAuthMiddleware, + activate_ks_node, + ); + + registry.registerPath({ + method: "get", + path: "/oko_admin/v1/audit/logs", + tags: ["Admin"], + summary: "Get audit logs", + description: "Retrieves audit logs with filtering and pagination", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + query: GetAuditLogsQuerySchema, + }, + responses: { + 200: { + description: "Audit logs retrieved successfully", + content: { + "application/json": { + schema: { + type: "object", + properties: { + success: { type: "boolean" }, + data: { + type: "array", + items: { + type: "object", + properties: { + id: { type: "string" }, + occurred_at: { type: "string", format: "date-time" }, + request_id: { type: "string" }, + actor: { type: "string" }, + actor_ip: { type: "string" }, + user_agent: { type: "string" }, + source: { type: "string" }, + action: { type: "string" }, + target_type: { type: "string" }, + target_id: { type: "string" }, + changes: { + type: "array", + items: { + type: "object", + properties: { + field: { type: "string" }, + from: {}, + to: {}, + }, + }, + }, + params: { type: "object" }, + outcome: { + type: "string", + enum: ["success", "failure", "denied"], + }, + error: { type: "string" }, + }, + }, + }, + }, + }, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.get("/audit/logs", adminAuthMiddleware, get_audit_logs); + + registry.registerPath({ + method: "get", + path: "/oko_admin/v1/audit/logs/count", + tags: ["Admin"], + summary: "Get audit logs count", + description: "Retrieves count of audit logs matching filters", + security: [{ adminAuth: [] }], + request: { + headers: AdminAuthHeaderSchema, + query: GetAuditLogsCountQuerySchema, + }, + responses: { + 200: { + description: "Audit logs count retrieved successfully", + content: { + "application/json": { + schema: { + type: "object", + properties: { + success: { type: "boolean" }, + data: { type: "integer" }, + }, + }, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + 500: { + description: "Server error", + content: { + "application/json": { + schema: ErrorResponseSchema, + }, + }, + }, + }, + }); + router.get("/audit/logs/count", adminAuthMiddleware, get_audit_logs_count); return router; } diff --git a/backend/admin_api/src/routes/ks_node.ts b/backend/admin_api/src/routes/ks_node.ts deleted file mode 100644 index c4fa6ead8..000000000 --- a/backend/admin_api/src/routes/ks_node.ts +++ /dev/null @@ -1,164 +0,0 @@ -import type { Response, Router } from "express"; -import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; -import type { - GetAllKSNodeResponse, - CreateKSNodeResponse, - DeactivateKSNodeRequest, - DeactivateKSNodeResponse, - GetKSNodeByIdRequest, - GetKSNodeByIdResponse, - UpdateKSNodeRequest, - UpdateKSNodeResponse, - ActivateKSNodeRequest, - ActivateKSNodeResponse, -} from "@oko-wallet/oko-types/admin"; -import type { CreateKSNodeRequest } from "@oko-wallet/oko-types/admin"; -import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; - -import { - adminAuthMiddleware, - type AuthenticatedAdminRequest, -} from "@oko-wallet-admin-api/middleware"; -import { - getAllKSNodes, - createKSNode, - deactivateKSNode, - getKSNodeById, - updateKSNode, - activateKSNode, - deleteKSNode, -} from "@oko-wallet-admin-api/api/ks_node"; - -export function setKSNodeRoutes(router: Router) { - router.post( - "/ks_node/get_all_ks_nodes", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals; - - const result = await getAllKSNodes(state.db); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); - - router.post( - "/ks_node/get_ks_node_by_id", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals; - const result = await getKSNodeById(state.db, req.body); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); - - router.post( - "/ks_node/create_ks_node", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals; - - const result = await createKSNode(state.db, req.body); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); - - router.post( - "/ks_node/deactivate_ks_node", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals; - - const result = await deactivateKSNode(state.db, req.body); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); - - router.post( - "/ks_node/delete_ks_node", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals; - - const result = await deleteKSNode(state.db, req.body); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); - - router.post( - "/ks_node/update_ks_node", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals; - - const result = await updateKSNode(state.db, req.body); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); - - router.post( - "/ks_node/activate_ks_node", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals; - - const result = await activateKSNode(state.db, req.body); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); -} diff --git a/backend/admin_api/src/routes/set_tss_all_activation_setting.ts b/backend/admin_api/src/routes/set_tss_all_activation_setting.ts new file mode 100644 index 000000000..b6efe038c --- /dev/null +++ b/backend/admin_api/src/routes/set_tss_all_activation_setting.ts @@ -0,0 +1,29 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { + SetTssAllActivationSettingRequest, + SetTssAllActivationSettingResponse, +} from "@oko-wallet-types/admin"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { setTssAllActivationSetting } from "@oko-wallet-admin-api/api/tss"; + +export async function set_tss_all_activation_setting( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals as any; + + const result = await setTssAllActivationSetting( + state.db, + req.body, + req.auditContext, + ); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/tss.ts b/backend/admin_api/src/routes/tss.ts deleted file mode 100644 index 6d00e06f8..000000000 --- a/backend/admin_api/src/routes/tss.ts +++ /dev/null @@ -1,228 +0,0 @@ -import type { Router, Response } from "express"; -import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; -import type { - GetTssSessionListRequest, - GetTssSessionListResponse, - GetTssAllActivationSettingResponse, - SetTssAllActivationSettingRequest, - SetTssAllActivationSettingResponse, -} from "@oko-wallet-types/admin"; -import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; -import { registry } from "@oko-wallet/oko-api-openapi"; -import { - AdminAuthHeaderSchema, - ErrorResponseSchema, -} from "@oko-wallet/oko-api-openapi/common"; -import { - GetTssSessionListRequestSchema, - GetTssSessionListSuccessResponseSchema, - GetTssAllActivationSettingSuccessResponseSchema, - SetTssAllActivationSettingRequestSchema, - SetTssAllActivationSettingSuccessResponseSchema, -} from "@oko-wallet/oko-api-openapi/oko_admin"; - -import { - adminAuthMiddleware, - type AuthenticatedAdminRequest, -} from "@oko-wallet-admin-api/middleware"; -import { - getTssSessionList, - getTssAllActivationSetting, - setTssAllActivationSetting, -} from "@oko-wallet-admin-api/api/tss"; - -export function setTssRoutes(router: Router) { - registry.registerPath({ - method: "post", - path: "/oko_admin/v1/tss/get_tss_session_list", - tags: ["Admin"], - summary: "Get tss sessions with pagination", - description: "Retrieves a list of TSS sessions with next/prev pagination", - security: [{ adminAuth: [] }], - request: { - headers: AdminAuthHeaderSchema, - body: { - required: false, - content: { - "application/json": { - schema: GetTssSessionListRequestSchema, - }, - }, - }, - }, - responses: { - 200: { - description: "TSS sessions retrieved successfully", - content: { - "application/json": { - schema: GetTssSessionListSuccessResponseSchema, - }, - }, - }, - 401: { - description: "Unauthorized", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 500: { - description: "Server error", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - }, - }); - - router.post( - "/tss/get_tss_session_list", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals as any; - - const result = await getTssSessionList(state.db, req.body); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); - - registry.registerPath({ - method: "post", - path: "/oko_admin/v1/tss/get_tss_all_activation_setting", - tags: ["Admin"], - summary: "Get TSS activation setting", - description: "Retrieves the current TSS activation setting", - security: [{ adminAuth: [] }], - request: { - headers: AdminAuthHeaderSchema, - }, - responses: { - 200: { - description: "TSS activation setting retrieved successfully", - content: { - "application/json": { - schema: GetTssAllActivationSettingSuccessResponseSchema, - }, - }, - }, - 401: { - description: "Unauthorized", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 500: { - description: "Server error", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - }, - }); - - router.post( - "/tss/get_tss_all_activation_setting", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals as any; - - const result = await getTssAllActivationSetting(state.db); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); - - registry.registerPath({ - method: "post", - path: "/oko_admin/v1/tss/set_tss_all_activation_setting", - tags: ["Admin"], - summary: "Set TSS activation setting", - description: "Enable or disable TSS functionality for all users", - security: [{ adminAuth: [] }], - request: { - headers: AdminAuthHeaderSchema, - body: { - required: true, - content: { - "application/json": { - schema: SetTssAllActivationSettingRequestSchema, - }, - }, - }, - }, - responses: { - 200: { - description: "TSS activation setting updated successfully", - content: { - "application/json": { - schema: SetTssAllActivationSettingSuccessResponseSchema, - }, - }, - }, - 400: { - description: "Invalid request", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 401: { - description: "Unauthorized", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 500: { - description: "Server error", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - }, - }); - router.post( - "/tss/set_tss_all_activation_setting", - adminAuthMiddleware, - async ( - req: AuthenticatedAdminRequest, - res: Response>, - ) => { - const state = req.app.locals as any; - - const result = await setTssAllActivationSetting(state.db, req.body); - if (!result.success) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); -} diff --git a/backend/admin_api/src/routes/update_ks_node.ts b/backend/admin_api/src/routes/update_ks_node.ts new file mode 100644 index 000000000..304d29635 --- /dev/null +++ b/backend/admin_api/src/routes/update_ks_node.ts @@ -0,0 +1,25 @@ +import type { Response } from "express"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import type { + UpdateKSNodeRequest, + UpdateKSNodeResponse, +} from "@oko-wallet/oko-types/admin"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { updateKSNode } from "@oko-wallet-admin-api/api/ks_node"; + +export async function update_ks_node( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + + const result = await updateKSNode(state.db, req.body, req.auditContext); + if (!result.success) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/user.ts b/backend/admin_api/src/routes/user.ts deleted file mode 100644 index aa2a2aa6a..000000000 --- a/backend/admin_api/src/routes/user.ts +++ /dev/null @@ -1,158 +0,0 @@ -import type { Router, Response, Request } from "express"; -import type { - AdminLoginRequest, - AdminLoginResponse, - AdminLogoutResponse, -} from "@oko-wallet/oko-types/admin"; -import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; -import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; -import { registry } from "@oko-wallet/oko-api-openapi"; -import { - ErrorResponseSchema, - AdminAuthHeaderSchema, -} from "@oko-wallet/oko-api-openapi/common"; -import { - LoginRequestSchema, - AdminLoginSuccessResponseSchema, - AdminLogoutSuccessResponseSchema, -} from "@oko-wallet/oko-api-openapi/oko_admin"; - -import { adminAuthMiddleware } from "@oko-wallet-admin-api/middleware"; -import { login, logout } from "@oko-wallet-admin-api/api/user"; - -export function setUserRoutes(router: Router) { - registry.registerPath({ - method: "post", - path: "/oko_admin/v1/user/login", - tags: ["Admin"], - summary: "Admin login", - description: "Authenticates an admin user", - security: [], - request: { - body: { - required: true, - content: { - "application/json": { - schema: LoginRequestSchema, - }, - }, - }, - }, - responses: { - 200: { - description: "Successfully logged in", - content: { - "application/json": { - schema: AdminLoginSuccessResponseSchema, - }, - }, - }, - 400: { - description: "Invalid request", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 401: { - description: "Invalid credentials", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 500: { - description: "Server error", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - }, - }); - router.post( - "/user/login", - async ( - req: Request, - res: Response>, - ) => { - const state = req.app.locals; - - const result = await login(state.db, req.body, { - secret: state.jwt_secret, - expires_in: state.jwt_expires_in, - }); - if (result.success === false) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); - - registry.registerPath({ - method: "post", - path: "/oko_admin/v1/user/logout", - tags: ["Admin"], - summary: "Admin logout", - description: "Logs out an admin user", - security: [{ adminAuth: [] }], - request: { - headers: AdminAuthHeaderSchema, - }, - responses: { - 200: { - description: "Successfully logged out", - content: { - "application/json": { - schema: AdminLogoutSuccessResponseSchema, - }, - }, - }, - 401: { - description: "Unauthorized", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - 500: { - description: "Server error", - content: { - "application/json": { - schema: ErrorResponseSchema, - }, - }, - }, - }, - }); - router.post( - "/user/logout", - adminAuthMiddleware, - async ( - req: Request, - res: Response>, - ) => { - const state = req.app.locals; - - const authHeader = req.headers.authorization; - const token = - authHeader && authHeader.startsWith("Bearer ") - ? authHeader.substring(7) - : undefined; - - const result = await logout(state.db, token); - if (result.success === false) { - res.status(ErrorCodeMap[result.code] ?? 500).json(result); - return; - } - - res.status(200).json(result); - }, - ); -} diff --git a/backend/admin_api/src/routes/user_login.ts b/backend/admin_api/src/routes/user_login.ts new file mode 100644 index 000000000..996a7e762 --- /dev/null +++ b/backend/admin_api/src/routes/user_login.ts @@ -0,0 +1,42 @@ +import type { Response, Request } from "express"; +import { v4 as uuidv4 } from "uuid"; +import type { + AdminLoginRequest, + AdminLoginResponse, +} from "@oko-wallet/oko-types/admin"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuditContext } from "@oko-wallet-admin-api/utils/audit"; +import { login } from "@oko-wallet-admin-api/api/user"; + +export async function user_login( + req: Request, + res: Response>, +) { + const state = req.app.locals; + + // Create audit context for login route + const auditContext: AuditContext = { + db: state.db, + adminUserId: undefined, // Not authenticated yet + request: req, + requestId: uuidv4(), + }; + + const result = await login( + state.db, + req.body, + { + secret: state.jwt_secret, + expires_in: state.jwt_expires_in, + }, + auditContext, + ); + if (result.success === false) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/routes/user_logout.ts b/backend/admin_api/src/routes/user_logout.ts new file mode 100644 index 000000000..971618951 --- /dev/null +++ b/backend/admin_api/src/routes/user_logout.ts @@ -0,0 +1,28 @@ +import type { Response } from "express"; +import type { AdminLogoutResponse } from "@oko-wallet/oko-types/admin"; +import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; +import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; + +import { type AuthenticatedAdminRequest } from "@oko-wallet-admin-api/middleware"; +import { logout } from "@oko-wallet-admin-api/api/user"; + +export async function user_logout( + req: AuthenticatedAdminRequest, + res: Response>, +) { + const state = req.app.locals; + + const authHeader = req.headers.authorization; + const token = + authHeader && authHeader.startsWith("Bearer ") + ? authHeader.substring(7) + : undefined; + + const result = await logout(state.db, token, req.auditContext); + if (result.success === false) { + res.status(ErrorCodeMap[result.code] ?? 500).json(result); + return; + } + + res.status(200).json(result); +} diff --git a/backend/admin_api/src/utils/audit.ts b/backend/admin_api/src/utils/audit.ts new file mode 100644 index 000000000..cc5a5a3c6 --- /dev/null +++ b/backend/admin_api/src/utils/audit.ts @@ -0,0 +1,46 @@ +import { v4 as uuidv4 } from "uuid"; +import type { CreateAuditEventRequest } from "@oko-wallet/oko-types/admin"; +import { createAuditEvent } from "@oko-wallet/oko-pg-interface/audit_events"; + +export interface AuditContext { + db: any; + adminUserId?: string; + request?: any; + requestId?: string; +} + +export function resolveAuditActorId(context: AuditContext): string { + if (context.adminUserId) { + return `admin:${context.adminUserId}`; + } else { + return "system"; + } +} + +export async function createAuditLog( + context: AuditContext, + action: string, + targetType: string, + targetId?: string, + changes?: { field: string; from?: any; to?: any }[], + params?: Record, + outcome: "success" | "failure" | "denied" = "success", + error?: string, +) { + const auditData: CreateAuditEventRequest = { + request_id: context.requestId || uuidv4(), + actor: resolveAuditActorId(context), + actor_ip: context.request?.ip || undefined, + user_agent: context.request?.get?.("User-Agent") || undefined, + source: context.request ? "admin_ui" : "job", + action, + target_type: targetType, + target_id: targetId, + changes, + params: params, + outcome, + error, + }; + + return await createAuditEvent(context.db, auditData); +} diff --git a/backend/ct_dashboard_api/src/middleware/index.ts b/backend/ct_dashboard_api/src/middleware/index.ts index 74d71d9db..bac4263c1 100644 --- a/backend/ct_dashboard_api/src/middleware/index.ts +++ b/backend/ct_dashboard_api/src/middleware/index.ts @@ -59,11 +59,9 @@ export async function customerJwtMiddleware( next(); return; } catch (error) { - res - .status(500) - .json({ - error: `Token validation failed: ${error instanceof Error ? error.message : String(error)}`, - }); + res.status(500).json({ + error: `Token validation failed: ${error instanceof Error ? error.message : String(error)}`, + }); return; } } diff --git a/backend/ct_dashboard_api/src/routes/customer_auth.ts b/backend/ct_dashboard_api/src/routes/customer_auth.ts index fc8ffbf87..ff883196d 100644 --- a/backend/ct_dashboard_api/src/routes/customer_auth.ts +++ b/backend/ct_dashboard_api/src/routes/customer_auth.ts @@ -98,10 +98,7 @@ export function setCustomerAuthRoutes(router: Router) { }); router.post( "/customer/auth/send-code", - async ( - req, - res: Response>, - ) => { + async (req, res: Response>) => { try { const state = req.app.locals; const request: SendVerificationRequest = { diff --git a/backend/ks_node_health/src/index.ts b/backend/ks_node_health/src/index.ts index 70acfbc25..4cfabf463 100644 --- a/backend/ks_node_health/src/index.ts +++ b/backend/ks_node_health/src/index.ts @@ -48,9 +48,7 @@ export async function processKSNodeHealthChecks( }; } -export async function requestKSNodeHealthCheck( - cvEndpoint: string, -): Promise { +async function requestKSNodeHealthCheck(cvEndpoint: string): Promise { try { const response = await fetch(`${cvEndpoint}/`); if (response.status !== 200) { diff --git a/backend/log_api/src/api/log/index.ts b/backend/log_api/src/api/log/index.ts index 16ded4ee3..0057dbcf7 100644 --- a/backend/log_api/src/api/log/index.ts +++ b/backend/log_api/src/api/log/index.ts @@ -1,9 +1,6 @@ import type { Logger } from "winston"; import { z } from "zod"; -import type { - PostLogBody, - PostLogResponse, -} from "@oko-wallet/oko-types/log"; +import type { PostLogBody, PostLogResponse } from "@oko-wallet/oko-types/log"; import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; export function ingestLog( diff --git a/backend/log_api/src/routes/log.ts b/backend/log_api/src/routes/log.ts index 609ee1e97..6558c9ec2 100644 --- a/backend/log_api/src/routes/log.ts +++ b/backend/log_api/src/routes/log.ts @@ -1,10 +1,7 @@ import type { Response, Router, Request } from "express"; import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; import type { Logger } from "winston"; -import type { - PostLogBody, - PostLogResponse, -} from "@oko-wallet/oko-types/log"; +import type { PostLogBody, PostLogResponse } from "@oko-wallet/oko-types/log"; import { ErrorCodeMap } from "@oko-wallet/oko-api-error-codes"; import { ingestLog } from "@oko-wallet-log-api/api/log"; diff --git a/backend/oko_pg_interface/package.json b/backend/oko_pg_interface/package.json index c49866275..8979dca9f 100644 --- a/backend/oko_pg_interface/package.json +++ b/backend/oko_pg_interface/package.json @@ -8,6 +8,7 @@ "exports": { "./admin_users": "./src/admin_users/index.ts", "./api_keys": "./src/api_keys/index.ts", + "./audit_events": "./src/audit_events/index.ts", "./ks_nodes": "./src/ks_nodes/index.ts", "./customer_dashboard_users": "./src/customer_dashboard_users/index.ts", "./customers": "./src/customers/index.ts", diff --git a/backend/oko_pg_interface/scripts/migrate/migrate.sql b/backend/oko_pg_interface/scripts/migrate/migrate.sql index f525533fe..cb630e076 100644 --- a/backend/oko_pg_interface/scripts/migrate/migrate.sql +++ b/backend/oko_pg_interface/scripts/migrate/migrate.sql @@ -264,3 +264,32 @@ CREATE TABLE public.tss_activation_settings ( updated_at timestamptz DEFAULT now() NOT NULL, CONSTRAINT tss_activation_settings_pkey PRIMARY KEY (activation_key) ); + +-- public.audit_event definition + +-- Drop table + +-- DROP TABLE public.audit_event; + +CREATE TABLE audit_event ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + occurred_at TIMESTAMPTZ NOT NULL DEFAULT now(), + request_id TEXT NOT NULL, + actor TEXT NOT NULL, + actor_ip INET, + user_agent TEXT, + source TEXT NOT NULL, + action TEXT NOT NULL, + target_type TEXT NOT NULL, + target_id TEXT, + changes JSONB, + params JSONB, + outcome TEXT NOT NULL, + error TEXT +); + +-- Indexes for audit_event +CREATE INDEX ON audit_event (occurred_at DESC); +CREATE INDEX ON audit_event (target_type, target_id, occurred_at DESC); +CREATE INDEX ON audit_event (action, occurred_at DESC); +CREATE UNIQUE INDEX audit_event_unique_req ON audit_event (request_id, action, target_type, target_id); diff --git a/backend/oko_pg_interface/src/audit_events/index.ts b/backend/oko_pg_interface/src/audit_events/index.ts new file mode 100644 index 000000000..1b71794de --- /dev/null +++ b/backend/oko_pg_interface/src/audit_events/index.ts @@ -0,0 +1,222 @@ +import { Pool, type PoolClient } from "pg"; +import { v4 as uuidv4 } from "uuid"; +import type { Result } from "@oko-wallet/stdlib-js"; +import type { + AuditEvent, + CreateAuditEventRequest, + AuditEventFilter, +} from "@oko-wallet/oko-types/admin"; + +export async function createAuditEvent( + db: Pool | PoolClient, + request: CreateAuditEventRequest, +): Promise> { + const query = ` +INSERT INTO audit_event ( + id, occurred_at, request_id, actor, + actor_ip, user_agent, source, action, + target_type, target_id, changes, params, + outcome, error +) +VALUES ( + $1, $2, $3, $4, + $5, $6, $7, $8, + $9, $10, $11, $12, + $13, $14 +) +RETURNING * +`; + + const values = [ + uuidv4(), + new Date(), + request.request_id, + request.actor, + request.actor_ip || null, + request.user_agent || null, + request.source, + request.action, + request.target_type, + request.target_id || null, + request.changes ? JSON.stringify(request.changes) : null, + request.params ? JSON.stringify(request.params) : null, + request.outcome, + request.error || null, + ]; + + try { + const result = await db.query(query, values); + + const row = result.rows[0]; + if (!row) { + return { + success: false, + err: "Failed to create audit event", + }; + } + + return { + success: true, + data: { + ...row, + changes: row.changes || undefined, + params: row.params || undefined, + }, + }; + } catch (error) { + return { + success: false, + err: String(error), + }; + } +} + +export async function getAuditEvents( + db: Pool, + filter: AuditEventFilter, +): Promise> { + let query = ` +SELECT * +FROM audit_event +WHERE 1=1 +`; + + const values: any[] = []; + let paramIndex = 1; + + if (filter.target_type) { + query += ` AND target_type = $${paramIndex++}`; + values.push(filter.target_type); + } + + if (filter.target_id) { + query += ` AND target_id = $${paramIndex++}`; + values.push(filter.target_id); + } + + if (filter.action) { + query += ` AND action = $${paramIndex++}`; + values.push(filter.action); + } + + if (filter.actor) { + query += ` AND actor = $${paramIndex++}`; + values.push(filter.actor); + } + + if (filter.source) { + query += ` AND source = $${paramIndex++}`; + values.push(filter.source); + } + + if (filter.outcome) { + query += ` AND outcome = $${paramIndex++}`; + values.push(filter.outcome); + } + + if (filter.occurred_after) { + query += ` AND occurred_at >= $${paramIndex++}`; + values.push(filter.occurred_after); + } + + if (filter.occurred_before) { + query += ` AND occurred_at <= $${paramIndex++}`; + values.push(filter.occurred_before); + } + + query += ` ORDER BY occurred_at DESC`; + + if (filter.limit) { + query += ` LIMIT $${paramIndex++}`; + values.push(filter.limit); + } + + if (filter.offset) { + query += ` OFFSET $${paramIndex++}`; + values.push(filter.offset); + } + + try { + const result = await db.query(query, values); + + const events = result.rows.map((row) => ({ + ...row, + changes: (row.changes as AuditEvent["changes"]) || undefined, + params: (row.params as AuditEvent["params"]) || undefined, + })); + + return { + success: true, + data: events, + }; + } catch (error) { + return { + success: false, + err: String(error), + }; + } +} + +export async function getAuditEventsCount( + db: Pool, + filter: AuditEventFilter, +): Promise> { + let query = ` +SELECT COUNT(*) +FROM audit_event +WHERE 1=1 +`; + + const values: any[] = []; + let paramIndex = 1; + + if (filter.target_type) { + query += ` AND target_type = $${paramIndex++}`; + values.push(filter.target_type); + } + + if (filter.target_id) { + query += ` AND target_id = $${paramIndex++}`; + values.push(filter.target_id); + } + + if (filter.action) { + query += ` AND action = $${paramIndex++}`; + values.push(filter.action); + } + + if (filter.actor) { + query += ` AND actor = $${paramIndex++}`; + values.push(filter.actor); + } + + if (filter.source) { + query += ` AND source = $${paramIndex++}`; + values.push(filter.source); + } + + if (filter.outcome) { + query += ` AND outcome = $${paramIndex++}`; + values.push(filter.outcome); + } + + if (filter.occurred_after) { + query += ` AND occurred_at >= $${paramIndex++}`; + values.push(filter.occurred_after); + } + + if (filter.occurred_before) { + query += ` AND occurred_at <= $${paramIndex++}`; + values.push(filter.occurred_before); + } + + try { + const result = await db.query(query, values); + return { success: true, data: parseInt(result.rows[0].count) }; + } catch (error) { + return { + success: false, + err: String(error), + }; + } +} diff --git a/backend/openapi/src/oko_admin/audit.ts b/backend/openapi/src/oko_admin/audit.ts new file mode 100644 index 000000000..27b514322 --- /dev/null +++ b/backend/openapi/src/oko_admin/audit.ts @@ -0,0 +1,226 @@ +import { z } from "zod"; + +export const GetAuditLogsQuerySchema = z.object({ + target_type: z + .string() + .optional() + .openapi({ + description: "Filter by target type", + example: "customer", + param: { + name: "target_type", + in: "query", + required: false, + }, + }), + target_id: z + .string() + .optional() + .openapi({ + description: "Filter by target ID", + example: "123e4567-e89b-12d3-a456-426614174000", + param: { + name: "target_id", + in: "query", + required: false, + }, + }), + action: z + .string() + .optional() + .openapi({ + description: "Filter by action type", + example: "create", + param: { + name: "action", + in: "query", + required: false, + }, + }), + actor: z + .string() + .optional() + .openapi({ + description: "Filter by actor", + example: "admin:123e4567-e89b-12d3-a456-426614174000", + param: { + name: "actor", + in: "query", + required: false, + }, + }), + source: z + .string() + .optional() + .openapi({ + description: "Filter by source", + example: "admin_ui", + param: { + name: "source", + in: "query", + required: false, + }, + }), + outcome: z + .enum(["success", "failure", "denied"]) + .optional() + .openapi({ + description: "Filter by outcome", + example: "success", + param: { + name: "outcome", + in: "query", + required: false, + }, + }), + occurred_after: z.iso + .datetime() + .optional() + .openapi({ + description: "Filter for events after this timestamp", + example: "2023-01-01T00:00:00Z", + param: { + name: "occurred_after", + in: "query", + required: false, + }, + }), + occurred_before: z.iso + .datetime() + .optional() + .openapi({ + description: "Filter for events before this timestamp", + example: "2023-12-31T23:59:59Z", + param: { + name: "occurred_before", + in: "query", + required: false, + }, + }), + limit: z.coerce + .number() + .int() + .optional() + .openapi({ + description: "Number of results to return (default: 20)", + example: 20, + param: { + name: "limit", + in: "query", + required: false, + }, + }), + offset: z.coerce + .number() + .int() + .optional() + .openapi({ + description: "Number of results to skip (for pagination)", + example: 0, + param: { + name: "offset", + in: "query", + required: false, + }, + }), +}); + +export const GetAuditLogsCountQuerySchema = z.object({ + target_type: z + .string() + .optional() + .openapi({ + description: "Filter by target type", + example: "customer", + param: { + name: "target_type", + in: "query", + required: false, + }, + }), + target_id: z + .string() + .optional() + .openapi({ + description: "Filter by target ID", + example: "123e4567-e89b-12d3-a456-426614174000", + param: { + name: "target_id", + in: "query", + required: false, + }, + }), + action: z + .string() + .optional() + .openapi({ + description: "Filter by action type", + example: "create", + param: { + name: "action", + in: "query", + required: false, + }, + }), + actor: z + .string() + .optional() + .openapi({ + description: "Filter by actor", + example: "admin:123e4567-e89b-12d3-a456-426614174000", + param: { + name: "actor", + in: "query", + required: false, + }, + }), + source: z + .string() + .optional() + .openapi({ + description: "Filter by source", + example: "admin_ui", + param: { + name: "source", + in: "query", + required: false, + }, + }), + outcome: z + .enum(["success", "failure", "denied"]) + .optional() + .openapi({ + description: "Filter by outcome", + example: "success", + param: { + name: "outcome", + in: "query", + required: false, + }, + }), + occurred_after: z + .string() + .datetime() + .optional() + .openapi({ + description: "Filter for events after this timestamp", + example: "2023-01-01T00:00:00Z", + param: { + name: "occurred_after", + in: "query", + required: false, + }, + }), + occurred_before: z.iso + .datetime() + .optional() + .openapi({ + description: "Filter for events before this timestamp", + example: "2023-12-31T23:59:59Z", + param: { + name: "occurred_before", + in: "query", + required: false, + }, + }), +}); diff --git a/backend/openapi/src/oko_admin/index.ts b/backend/openapi/src/oko_admin/index.ts index fcfe49936..4703bc754 100644 --- a/backend/openapi/src/oko_admin/index.ts +++ b/backend/openapi/src/oko_admin/index.ts @@ -1,3 +1,4 @@ +export * from "./audit"; export * from "./customer"; export * from "./tss"; export * from "./user"; diff --git a/backend/tss_api/src/api/keygen/index.ts b/backend/tss_api/src/api/keygen/index.ts index a0a142e45..65ce07d0d 100644 --- a/backend/tss_api/src/api/keygen/index.ts +++ b/backend/tss_api/src/api/keygen/index.ts @@ -6,10 +6,7 @@ import { import type { Result } from "@oko-wallet/stdlib-js"; import { encryptData } from "@oko-wallet/crypto-js"; import { Bytes, type Bytes33 } from "@oko-wallet/bytes"; -import { - type WalletStatus, - type Wallet, -} from "@oko-wallet/oko-types/wallets"; +import { type WalletStatus, type Wallet } from "@oko-wallet/oko-types/wallets"; import type { KeygenRequest } from "@oko-wallet/oko-types/tss"; import type { SignInResponse, User } from "@oko-wallet/oko-types/user"; import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; diff --git a/backend/tss_api/src/api/triples/index.ts b/backend/tss_api/src/api/triples/index.ts index 251993d64..48ecf88ec 100644 --- a/backend/tss_api/src/api/triples/index.ts +++ b/backend/tss_api/src/api/triples/index.ts @@ -24,10 +24,7 @@ import type { TriplesStep9Response, TriplesStageData, } from "@oko-wallet/oko-types/tss"; -import { - TriplesStageStatus, - TssStageType, -} from "@oko-wallet/oko-types/tss"; +import { TriplesStageStatus, TssStageType } from "@oko-wallet/oko-types/tss"; import { createTssSession, createTssStage, diff --git a/backend/tss_api/src/api/tss_session/index.test.ts b/backend/tss_api/src/api/tss_session/index.test.ts index 06d2db8be..1514c8c68 100644 --- a/backend/tss_api/src/api/tss_session/index.test.ts +++ b/backend/tss_api/src/api/tss_session/index.test.ts @@ -7,10 +7,7 @@ import { createTssSession } from "@oko-wallet/oko-pg-interface/tss"; import { insertCustomer } from "@oko-wallet/oko-pg-interface/customers"; import { createWallet } from "@oko-wallet/oko-pg-interface/ewallet_wallets"; import { createUser } from "@oko-wallet/oko-pg-interface/ewallet_users"; -import { - TssStageType, - TriplesStageStatus, -} from "@oko-wallet/oko-types/tss"; +import { TssStageType, TriplesStageStatus } from "@oko-wallet/oko-types/tss"; import { napiRunTriples2ClientStep1, napiRunTriples2ClientStep2, diff --git a/biome.json b/biome.json index d01f5d69f..c3c319d94 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.2.6/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.4/schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -28,7 +28,14 @@ "linter": { "enabled": false, "rules": { - "recommended": true + "recommended": true, + "style": { + "noNonNullAssertion": "off", + "useTemplate": "off" + }, + "suspicious": { + "noExplicitAny": "off" + } } }, "javascript": { @@ -49,6 +56,11 @@ "trailingCommas": "none" } }, + "css": { + "parser": { + "tailwindDirectives": true + } + }, "assist": { "enabled": true, "actions": { @@ -79,10 +91,11 @@ "recommended": true, "style": { "useConst": "error", - "useImportType": "off" + "useImportType": "off", + "noNonNullAssertion": "off" }, "suspicious": { - "noExplicitAny": "warn" + "noExplicitAny": "off" }, "correctness": { "noUnusedVariables": "error" diff --git a/common/oko_types/package.json b/common/oko_types/package.json index dab25163d..5eca76a43 100644 --- a/common/oko_types/package.json +++ b/common/oko_types/package.json @@ -5,6 +5,7 @@ "./admin": "./src/admin/index.ts", "./api_response": "./src/api_response/index.ts", "./auth": "./src/auth/index.ts", + "./audit": "./src/audit/index.ts", "./crypto": "./src/crypto/index.ts", "./ct_dashboard": "./src/ct_dashboard/index.ts", "./customers": "./src/customers/index.ts", diff --git a/common/oko_types/src/admin/audit.ts b/common/oko_types/src/admin/audit.ts new file mode 100644 index 000000000..3dc350e54 --- /dev/null +++ b/common/oko_types/src/admin/audit.ts @@ -0,0 +1,58 @@ +export interface AuditEvent { + id: string; + occurred_at: Date; + request_id: string; + actor: string; + actor_ip?: string; + user_agent?: string; + source: string; + action: string; + target_type: string; + target_id?: string; + changes?: AuditChange[]; + params?: Record; + outcome: "success" | "failure" | "denied"; + error?: string; +} + +export interface AuditChange { + field: string; + from?: any; + to?: any; +} + +export interface CreateAuditEventRequest { + request_id: string; + actor: string; + actor_ip?: string; + user_agent?: string; + source: string; + action: string; + target_type: string; + target_id?: string; + changes?: AuditChange[]; + params?: Record; + outcome: "success" | "failure" | "denied"; + error?: string; +} + +export interface AuditEventFilter { + target_type?: string; + target_id?: string; + action?: string; + actor?: string; + source?: string; + outcome?: "success" | "failure" | "denied"; + occurred_after?: Date; + occurred_before?: Date; + limit?: number; + offset?: number; +} + +export interface GetAuditLogsResponse { + audit_logs: AuditEvent[]; +} + +export interface GetAuditLogsCountResponse { + count: number; +} diff --git a/common/oko_types/src/admin/index.ts b/common/oko_types/src/admin/index.ts index b033ae48a..adb7426f9 100644 --- a/common/oko_types/src/admin/index.ts +++ b/common/oko_types/src/admin/index.ts @@ -1,4 +1,5 @@ export * from "./auth"; +export * from "./audit"; export * from "./customer"; export * from "./user"; export * from "./ks_node"; diff --git a/common/oko_types/src/api_response/index.ts b/common/oko_types/src/api_response/index.ts index 32abfcbba..325b99cf1 100644 --- a/common/oko_types/src/api_response/index.ts +++ b/common/oko_types/src/api_response/index.ts @@ -1,6 +1,4 @@ -export type OkoApiResponse = - | OkoApiSuccessResponse - | OkoApiErrorResponse; +export type OkoApiResponse = OkoApiSuccessResponse | OkoApiErrorResponse; export interface OkoApiSuccessResponse { success: true; diff --git a/common/oko_types/src/ct_dashboard/customer_dashboard_user.ts b/common/oko_types/src/ct_dashboard/customer_dashboard_user.ts index 6df367d20..6b896ddf1 100644 --- a/common/oko_types/src/ct_dashboard/customer_dashboard_user.ts +++ b/common/oko_types/src/ct_dashboard/customer_dashboard_user.ts @@ -1,7 +1,4 @@ -import type { - Customer, - CustomerStatus, -} from "@oko-wallet/oko-types/customers"; +import type { Customer, CustomerStatus } from "@oko-wallet/oko-types/customers"; export type CustomerDashboardUserStatus = "ACTIVE" | "DELETED"; diff --git a/crypto/tecdsa/api_lib/src/index.ts b/crypto/tecdsa/api_lib/src/index.ts index af04cefd6..30143b638 100644 --- a/crypto/tecdsa/api_lib/src/index.ts +++ b/crypto/tecdsa/api_lib/src/index.ts @@ -499,13 +499,12 @@ export async function reqAbortTssSession( payload: AbortTssSessionBody, authToken: string, ) { - const resp: OkoApiResponse = - await makePostRequest( - endpoint, - "session/abort", - payload, - undefined, - authToken, - ); + const resp: OkoApiResponse = await makePostRequest( + endpoint, + "session/abort", + payload, + undefined, + authToken, + ); return resp; } diff --git a/crypto/tecdsa/cait_sith_keplr_addon/src/tests/sign_test.ts b/crypto/tecdsa/cait_sith_keplr_addon/src/tests/sign_test.ts index 39b50542f..e9d3324fb 100644 --- a/crypto/tecdsa/cait_sith_keplr_addon/src/tests/sign_test.ts +++ b/crypto/tecdsa/cait_sith_keplr_addon/src/tests/sign_test.ts @@ -56,5 +56,6 @@ export function signTest( throw new Error("sign failed. big_r or s do not match"); } - runVerify(fullSignature0, clientState.keygenOutput?.public_key!, msg); + const output = clientState.keygenOutput!; + runVerify(fullSignature0, output.public_key, msg); } diff --git a/crypto/tecdsa/cait_sith_keplr_hooks/src/sign.ts b/crypto/tecdsa/cait_sith_keplr_hooks/src/sign.ts index dbc0e8f22..69e75f64c 100644 --- a/crypto/tecdsa/cait_sith_keplr_hooks/src/sign.ts +++ b/crypto/tecdsa/cait_sith_keplr_hooks/src/sign.ts @@ -6,10 +6,7 @@ import type { } from "@oko-wallet/tecdsa-interface"; import { reqSignStep1, reqSignStep2 } from "@oko-wallet/api-lib"; import { wasmModule } from "@oko-wallet/cait-sith-keplr-wasm"; -import type { - SignStep1Body, - SignStep2Body, -} from "@oko-wallet/oko-types/tss"; +import type { SignStep1Body, SignStep2Body } from "@oko-wallet/oko-types/tss"; import type { Result } from "@oko-wallet/stdlib-js"; export type RunSignError = { type: "aborted" } | { type: "error"; msg: string }; diff --git a/embed/oko_attached/oko_attached.env.example b/embed/oko_attached/oko_attached.env.example index 4586b3bc5..5ec94bbad 100644 --- a/embed/oko_attached/oko_attached.env.example +++ b/embed/oko_attached/oko_attached.env.example @@ -5,3 +5,4 @@ VITE_DEMO_WEB_ORIGIN=http://localhost:3200 VITE_KEPLR_API_ENDPOINT=https://keplr-api.keplr.app VITE_TX_INTERPRETER_API_ENDPOINT=https://tx-interpreter.keplr.app VITE_AMPLITUDE_API_KEY= +VITE_IPFS_GATEWAY_URL= \ No newline at end of file diff --git a/embed/oko_attached/src/analytics/amplitude.ts b/embed/oko_attached/src/analytics/amplitude.ts index e4bd03bd3..a18d3a765 100644 --- a/embed/oko_attached/src/analytics/amplitude.ts +++ b/embed/oko_attached/src/analytics/amplitude.ts @@ -5,7 +5,7 @@ let isInitialized = false; export function initAmplitude(): void { const apiKey = import.meta.env.VITE_AMPLITUDE_API_KEY; - if (!apiKey) { + if (!apiKey || apiKey.trim() === "") { console.warn("[attached] Amplitude. API key not found"); return; diff --git a/embed/oko_attached/src/components/google_callback/google_callback.tsx b/embed/oko_attached/src/components/google_callback/google_callback.tsx index 1108437c9..1cc0bb697 100644 --- a/embed/oko_attached/src/components/google_callback/google_callback.tsx +++ b/embed/oko_attached/src/components/google_callback/google_callback.tsx @@ -4,7 +4,7 @@ import React, { useEffect, useState } from "react"; import { LoadingIcon } from "@oko-wallet/oko-common-ui/icons/loading"; import { Spacing } from "@oko-wallet/oko-common-ui/spacing"; import { Typography } from "@oko-wallet/oko-common-ui/typography"; -import { OkoProductLogoIcon } from "@oko-wallet-common-ui/icons/oko_product_logo_icon"; +import { OkoLogoIcon } from "@oko-wallet-common-ui/icons/oko_logo_icon"; import { ErrorIcon } from "@oko-wallet/oko-common-ui/icons/error_icon"; import { ExternalLinkOutlinedIcon } from "@oko-wallet/oko-common-ui/icons/external_link_outlined"; import type { Theme } from "@oko-wallet/oko-common-ui/theme"; @@ -27,7 +27,7 @@ export const GoogleCallback: React.FC = () => { return (
- + {error ? ( diff --git a/embed/oko_attached/src/components/modal/modal.tsx b/embed/oko_attached/src/components/modal/modal.tsx index d73f6479a..e6d6f7ee6 100644 --- a/embed/oko_attached/src/components/modal/modal.tsx +++ b/embed/oko_attached/src/components/modal/modal.tsx @@ -26,6 +26,7 @@ export const Modal: FC = () => { console.log("onOpenChange(): %s", open); if (modalRequest) { + // TODO: @hyunjae const { modal_type, modal_id } = modalRequest.msg.payload; const { error } = useMemoryState.getState(); diff --git a/embed/oko_attached/src/components/modal_variants/cosmos/arbitrary_sig/make_arbitrary_sig_modal.tsx b/embed/oko_attached/src/components/modal_variants/cosmos/arbitrary_sig/make_arbitrary_sig_modal.tsx index ba071552b..b900b5199 100644 --- a/embed/oko_attached/src/components/modal_variants/cosmos/arbitrary_sig/make_arbitrary_sig_modal.tsx +++ b/embed/oko_attached/src/components/modal_variants/cosmos/arbitrary_sig/make_arbitrary_sig_modal.tsx @@ -3,8 +3,6 @@ import type { CosmosArbitrarySigData } from "@oko-wallet/oko-sdk-core"; import { XCloseIcon } from "@oko-wallet/oko-common-ui/icons/x_close"; import { Spacing } from "@oko-wallet/oko-common-ui/spacing"; import { Button } from "@oko-wallet/oko-common-ui/button"; -import { Typography } from "@oko-wallet/oko-common-ui/typography"; -import { OkoProductLogoIcon } from "@oko-wallet/oko-common-ui/icons/oko_product_logo_icon"; import styles from "@oko-wallet-attached/components/modal_variants/common/make_signature/make_signature_modal.module.scss"; import { CommonModal } from "@oko-wallet-attached/components/modal_variants/common/common_modal"; @@ -12,6 +10,7 @@ import { DemoView } from "@oko-wallet-attached/components/modal_variants/common/ import { useArbitrarySigModal } from "./use_arbitrary_sig_modal"; import { ArbitrarySignatureDesc } from "@oko-wallet-attached/components/modal_variants/common/arbitrary_sig_desc/arbitrary_signature_desc"; import { CosmosArbitrarySignatureContent } from "./cosmos_arbitrary_signature_content"; +import { SignWithOkoBox } from "@oko-wallet-attached/components/sign_with_oko_box/sign_with_oko_box"; export const MakeArbitrarySigModal: React.FC = ({ getIsAborted, @@ -63,12 +62,7 @@ export const MakeArbitrarySigModal: React.FC = ({
-
- - Sign with - - -
+ {isDemo && } diff --git a/embed/oko_attached/src/components/modal_variants/cosmos/tx_sig/make_tx_sig_modal.tsx b/embed/oko_attached/src/components/modal_variants/cosmos/tx_sig/make_tx_sig_modal.tsx index a2f7aff53..b3ec74cb6 100644 --- a/embed/oko_attached/src/components/modal_variants/cosmos/tx_sig/make_tx_sig_modal.tsx +++ b/embed/oko_attached/src/components/modal_variants/cosmos/tx_sig/make_tx_sig_modal.tsx @@ -3,8 +3,6 @@ import type { CosmosTxSigData } from "@oko-wallet/oko-sdk-core"; import { XCloseIcon } from "@oko-wallet/oko-common-ui/icons/x_close"; import { Spacing } from "@oko-wallet/oko-common-ui/spacing"; import { Button } from "@oko-wallet/oko-common-ui/button"; -import { Typography } from "@oko-wallet/oko-common-ui/typography"; -import { OkoProductLogoIcon } from "@oko-wallet/oko-common-ui/icons/oko_product_logo_icon"; import styles from "@oko-wallet-attached/components/modal_variants/common/make_signature/make_signature_modal.module.scss"; import { CommonModal } from "@oko-wallet-attached/components/modal_variants/common/common_modal"; @@ -14,6 +12,7 @@ import { CosmosTxSignatureContent } from "./cosmos_tx_signature_content"; import { CosmosTxFee } from "./cosmos_tx_fee"; import { extractMsgsFromSignDoc } from "@oko-wallet-attached/web3/cosmos/sign_doc"; import { trackTxButtonEvent } from "@oko-wallet-attached/analytics/events"; +import { SignWithOkoBox } from "@oko-wallet-attached/components/sign_with_oko_box/sign_with_oko_box"; export const MakeTxSigModal: FC = ({ getIsAborted, @@ -125,12 +124,7 @@ export const MakeTxSigModal: FC = ({
-
- - Sign with - - -
+ ); } else { diff --git a/embed/oko_attached/src/components/modal_variants/error/error_modal.module.scss b/embed/oko_attached/src/components/modal_variants/error/error_modal.module.scss index 4d04d3948..7e98e162b 100644 --- a/embed/oko_attached/src/components/modal_variants/error/error_modal.module.scss +++ b/embed/oko_attached/src/components/modal_variants/error/error_modal.module.scss @@ -69,7 +69,7 @@ border: 1px solid var(--border-primary) !important; } -.productLogoIconContainer { +.okoLogoIconContainer { display: flex; justify-content: center; align-items: center; diff --git a/embed/oko_attached/src/components/modal_variants/error/error_modal.tsx b/embed/oko_attached/src/components/modal_variants/error/error_modal.tsx index 6c7d3dae6..54eea1b3a 100644 --- a/embed/oko_attached/src/components/modal_variants/error/error_modal.tsx +++ b/embed/oko_attached/src/components/modal_variants/error/error_modal.tsx @@ -4,13 +4,13 @@ import { Spacing } from "@oko-wallet/oko-common-ui/spacing"; import { Typography } from "@oko-wallet/oko-common-ui/typography"; import { XCloseIcon } from "@oko-wallet/oko-common-ui/icons/x_close"; import { Button } from "@oko-wallet/oko-common-ui/button"; -import { OkoProductLogoIcon } from "@oko-wallet/oko-common-ui/icons/oko_product_logo_icon"; import styles from "./error_modal.module.scss"; import { CommonModal } from "@oko-wallet-attached/components/modal_variants/common/common_modal"; import { useAppState } from "@oko-wallet-attached/store/app"; import { useMemoryState } from "@oko-wallet-attached/store/memory"; import type { AppError } from "@oko-wallet-attached/errors"; +import { SignWithOkoBox } from "@oko-wallet-attached/components/sign_with_oko_box/sign_with_oko_box"; function isAppErrorFn(error: unknown): error is AppError { return typeof error === "object" && error !== null && "type" in error; @@ -118,9 +118,7 @@ export const ErrorModal: FC = ({ error }) => { -
- -
+ ); diff --git a/embed/oko_attached/src/components/modal_variants/eth/arbitrary_sig/make_arbitrary_sig_modal.tsx b/embed/oko_attached/src/components/modal_variants/eth/arbitrary_sig/make_arbitrary_sig_modal.tsx index 1fee2d8fd..ff400253a 100644 --- a/embed/oko_attached/src/components/modal_variants/eth/arbitrary_sig/make_arbitrary_sig_modal.tsx +++ b/embed/oko_attached/src/components/modal_variants/eth/arbitrary_sig/make_arbitrary_sig_modal.tsx @@ -3,8 +3,6 @@ import type { MakeArbitrarySigData } from "@oko-wallet/oko-sdk-core"; import { XCloseIcon } from "@oko-wallet/oko-common-ui/icons/x_close"; import { Spacing } from "@oko-wallet/oko-common-ui/spacing"; import { Button } from "@oko-wallet/oko-common-ui/button"; -import { Typography } from "@oko-wallet/oko-common-ui/typography"; -import { OkoProductLogoIcon } from "@oko-wallet/oko-common-ui/icons/oko_product_logo_icon"; import styles from "@oko-wallet-attached/components/modal_variants/common/make_signature/make_signature_modal.module.scss"; import { CommonModal } from "@oko-wallet-attached/components/modal_variants/common/common_modal"; @@ -12,6 +10,7 @@ import { DemoView } from "@oko-wallet-attached/components/modal_variants/common/ import { useArbitrarySigModal } from "./hooks/use_arbitrary_sig_modal"; import { ArbitrarySignatureDesc } from "@oko-wallet-attached/components/modal_variants/common/arbitrary_sig_desc/arbitrary_signature_desc"; import { EthereumArbitrarySignatureContent } from "./ethereum_arbitrary_signature_content"; +import { SignWithOkoBox } from "@oko-wallet-attached/components/sign_with_oko_box/sign_with_oko_box"; export const MakeArbitrarySigModal: React.FC = ({ getIsAborted, @@ -64,13 +63,7 @@ export const MakeArbitrarySigModal: React.FC = ({ - {/* TODO: separate a standalone component for this */} -
- - Sign with - - -
+ {isDemo && } diff --git a/embed/oko_attached/src/components/modal_variants/eth/eip712_sig/make_eip712_sig_modal.tsx b/embed/oko_attached/src/components/modal_variants/eth/eip712_sig/make_eip712_sig_modal.tsx index 4c7267b8a..1119897b6 100644 --- a/embed/oko_attached/src/components/modal_variants/eth/eip712_sig/make_eip712_sig_modal.tsx +++ b/embed/oko_attached/src/components/modal_variants/eth/eip712_sig/make_eip712_sig_modal.tsx @@ -3,8 +3,6 @@ import type { MakeEIP712SigData } from "@oko-wallet/oko-sdk-core"; import { XCloseIcon } from "@oko-wallet/oko-common-ui/icons/x_close"; import { Spacing } from "@oko-wallet/oko-common-ui/spacing"; import { Button } from "@oko-wallet/oko-common-ui/button"; -import { Typography } from "@oko-wallet/oko-common-ui/typography"; -import { OkoProductLogoIcon } from "@oko-wallet/oko-common-ui/icons/oko_product_logo_icon"; import styles from "@oko-wallet-attached/components/modal_variants/common/make_signature/make_signature_modal.module.scss"; import { CommonModal } from "@oko-wallet-attached/components/modal_variants/common/common_modal"; @@ -12,6 +10,7 @@ import { DemoView } from "@oko-wallet-attached/components/modal_variants/common/ import { ArbitrarySignatureDesc } from "@oko-wallet-attached/components/modal_variants/common/arbitrary_sig_desc/arbitrary_signature_desc"; import { useEIP712SigModal } from "./hooks/use_eip712_sig_modal"; import { EthereumEip712SignatureContent } from "./ethereum_eip712_signature_content"; +import { SignWithOkoBox } from "@oko-wallet-attached/components/sign_with_oko_box/sign_with_oko_box"; export const MakeEIP712SigModal: FC = ({ getIsAborted, @@ -64,12 +63,7 @@ export const MakeEIP712SigModal: FC = ({ -
- - Sign with - - -
+ {isDemo && } diff --git a/embed/oko_attached/src/components/modal_variants/eth/tx_sig/actions/common/address_info.tsx b/embed/oko_attached/src/components/modal_variants/eth/tx_sig/actions/common/address_info.tsx index 3add39ba9..47a3a4604 100644 --- a/embed/oko_attached/src/components/modal_variants/eth/tx_sig/actions/common/address_info.tsx +++ b/embed/oko_attached/src/components/modal_variants/eth/tx_sig/actions/common/address_info.tsx @@ -9,6 +9,7 @@ import { useGetENSName, useGetENSAvatar, } from "@oko-wallet-attached/web3/ethereum/queries"; +import { convertIpfsUrl } from "@oko-wallet-attached/utils/url"; export interface AddressInfoProps { address: Address; @@ -33,7 +34,7 @@ export const AddressInfo: React.FC = ({ address }) => {
{ensName ? ( = ({ getIsAborted, @@ -112,12 +111,7 @@ export const MakeTxSigModal: FC = ({
-
- - Sign with - - -
+ {isDemo && } diff --git a/embed/oko_attached/src/components/modal_variants/unsupported_chain/unsupported_chain_modal.module.scss b/embed/oko_attached/src/components/modal_variants/unsupported_chain/unsupported_chain_modal.module.scss index 2fc131770..d1e978ce1 100644 --- a/embed/oko_attached/src/components/modal_variants/unsupported_chain/unsupported_chain_modal.module.scss +++ b/embed/oko_attached/src/components/modal_variants/unsupported_chain/unsupported_chain_modal.module.scss @@ -62,7 +62,7 @@ border: 1px solid var(--border-primary) !important; } -.productLogoIconContainer { +.okoLogoIconContainer { display: flex; justify-content: center; align-items: center; diff --git a/embed/oko_attached/src/components/modal_variants/unsupported_chain/unsupported_chain_modal.tsx b/embed/oko_attached/src/components/modal_variants/unsupported_chain/unsupported_chain_modal.tsx index d52a64dd7..bb2a244f8 100644 --- a/embed/oko_attached/src/components/modal_variants/unsupported_chain/unsupported_chain_modal.tsx +++ b/embed/oko_attached/src/components/modal_variants/unsupported_chain/unsupported_chain_modal.tsx @@ -4,7 +4,6 @@ import { Spacing } from "@oko-wallet/oko-common-ui/spacing"; import { Typography } from "@oko-wallet/oko-common-ui/typography"; import { XCloseIcon } from "@oko-wallet/oko-common-ui/icons/x_close"; import { Button } from "@oko-wallet/oko-common-ui/button"; -import { OkoProductLogoIcon } from "@oko-wallet/oko-common-ui/icons/oko_product_logo_icon"; import styles from "./unsupported_chain_modal.module.scss"; import { CommonModal } from "@oko-wallet-attached/components/modal_variants/common/common_modal"; @@ -12,6 +11,7 @@ import { Avatar } from "@oko-wallet-attached/components/avatar/avatar"; import { useAppState } from "@oko-wallet-attached/store/app"; import { useMemoryState } from "@oko-wallet-attached/store/memory"; import type { AppError } from "@oko-wallet-attached/errors"; +import { SignWithOkoBox } from "@oko-wallet-attached/components/sign_with_oko_box/sign_with_oko_box"; export const UnsupportedChainModal: FC = ({ chainName, @@ -80,9 +80,7 @@ export const UnsupportedChainModal: FC = ({ -
- -
+ ); diff --git a/embed/oko_attached/src/components/sign_with_oko_box/sign_with_oko_box.module.scss b/embed/oko_attached/src/components/sign_with_oko_box/sign_with_oko_box.module.scss new file mode 100644 index 000000000..bb1a66b03 --- /dev/null +++ b/embed/oko_attached/src/components/sign_with_oko_box/sign_with_oko_box.module.scss @@ -0,0 +1,6 @@ +.container { + display: flex; + align-items: center; + justify-content: center; + gap: 4px; +} diff --git a/embed/oko_attached/src/components/sign_with_oko_box/sign_with_oko_box.tsx b/embed/oko_attached/src/components/sign_with_oko_box/sign_with_oko_box.tsx new file mode 100644 index 000000000..d6e22f254 --- /dev/null +++ b/embed/oko_attached/src/components/sign_with_oko_box/sign_with_oko_box.tsx @@ -0,0 +1,27 @@ +import React from "react"; +import { Typography } from "@oko-wallet/oko-common-ui/typography"; +import { OkoLogoIcon } from "@oko-wallet-common-ui/icons/oko_logo_icon"; +import type { Theme } from "@oko-wallet/oko-common-ui/theme"; + +import styles from "./sign_with_oko_box.module.scss"; + +export const SignWithOkoBox: React.FC = ({ + theme, + hideText, +}) => { + return ( +
+ {!hideText && ( + + Sign with + + )} + +
+ ); +}; + +export interface SignWithOkoBoxProps { + theme: Theme | null; + hideText?: boolean; +} diff --git a/embed/oko_attached/src/envs.ts b/embed/oko_attached/src/envs.ts index e94beb25e..0993ae3b3 100644 --- a/embed/oko_attached/src/envs.ts +++ b/embed/oko_attached/src/envs.ts @@ -10,5 +10,6 @@ export const envSchema = z.object({ VITE_DEMO_WEB_ORIGIN: z.string(), VITE_KEPLR_API_ENDPOINT: z.string(), VITE_TX_INTERPRETER_API_ENDPOINT: z.string(), - VITE_AMPLITUDE_API_KEY: z.string(), + VITE_AMPLITUDE_API_KEY: z.string().optional().default(""), + VITE_IPFS_GATEWAY_URL: z.string().optional().default(""), }); diff --git a/embed/oko_attached/src/global.d.ts b/embed/oko_attached/src/global.d.ts index cd9c3f8fa..4b0f160d3 100644 --- a/embed/oko_attached/src/global.d.ts +++ b/embed/oko_attached/src/global.d.ts @@ -26,6 +26,7 @@ declare global { VITE_KEPLR_API_ENDPOINT: string; VITE_TX_INTERPRETER_API_ENDPOINT: string; VITE_AMPLITUDE_API_KEY: string; + VITE_IPFS_GATEWAY_URL: string; } } diff --git a/embed/oko_attached/src/requests/logging.ts b/embed/oko_attached/src/requests/logging.ts index 06ce4ac36..126d9ce5b 100644 --- a/embed/oko_attached/src/requests/logging.ts +++ b/embed/oko_attached/src/requests/logging.ts @@ -1,9 +1,6 @@ import type { OkoApiResponse } from "@oko-wallet/oko-types/api_response"; import type { Result } from "@oko-wallet/stdlib-js"; -import type { - PostLogBody, - PostLogResponse, -} from "@oko-wallet/oko-types/log"; +import type { PostLogBody, PostLogResponse } from "@oko-wallet/oko-types/log"; import type { FetchError } from "@oko-wallet-attached/requests/types"; import type { PostLogParams } from "@oko-wallet-attached/logging/types"; diff --git a/embed/oko_attached/src/utils/url.ts b/embed/oko_attached/src/utils/url.ts index a1ee1c7bf..c63fa6add 100644 --- a/embed/oko_attached/src/utils/url.ts +++ b/embed/oko_attached/src/utils/url.ts @@ -5,3 +5,47 @@ export function removeLastSlashIfIs(str: string): string { return str; } + +/** + * Converts IPFS URLs to use a custom gateway URL if configured. + * + * Handles the following URL formats: + * - `ipfs://` protocol → gateway URL + * - `ipfs.io` domain → custom gateway + * - Other IPFS gateway URLs → custom gateway + * + * If `VITE_IPFS_GATEWAY_URL` is not set, returns the original URL unchanged. + * + * @param url - The URL to convert + * @returns The converted URL or the original URL if no gateway is configured + */ +export function convertIpfsUrl(url: string): string { + const gatewayUrl = import.meta.env.VITE_IPFS_GATEWAY_URL; + + if (!gatewayUrl || gatewayUrl.trim() === "") { + return url; + } + + const cleanGatewayUrl = removeLastSlashIfIs(gatewayUrl.trim()); + + if (url.startsWith("ipfs://")) { + const hash = url.substring(7); + return `${cleanGatewayUrl}/ipfs/${hash}`; + } + + if (url.includes("ipfs.io/ipfs/")) { + const match = url.match(/ipfs\.io\/ipfs\/(.+)/); + if (match && match[1]) { + return `${cleanGatewayUrl}/ipfs/${match[1]}`; + } + } + + if (url.includes("/ipfs/")) { + const match = url.match(/\/ipfs\/(.+)/); + if (match && match[1]) { + return `${cleanGatewayUrl}/ipfs/${match[1]}`; + } + } + + return url; +} diff --git a/embed/oko_attached/src/window_msgs/oauth_info_pass/index.ts b/embed/oko_attached/src/window_msgs/oauth_info_pass/index.ts index d82f4f4c3..e04f85ef2 100644 --- a/embed/oko_attached/src/window_msgs/oauth_info_pass/index.ts +++ b/embed/oko_attached/src/window_msgs/oauth_info_pass/index.ts @@ -74,6 +74,8 @@ export async function handleOAuthInfoPass( const userExistsRes = await checkUserExists(tokenInfo.email); if (!userExistsRes.success) { + console.log(22, userExistsRes); + await bail(message, { type: "check_user_request_fail", error: userExistsRes.err.toString(), @@ -215,8 +217,6 @@ async function verifyGoogleIdToken(idToken: string): Promise { } async function bail(message: OkoWalletMsgOAuthInfoPass, err: OAuthSignInError) { - // TODO: Error handling @elden - // postLog( { level: "error", diff --git a/internals/ci/src/cmds/format.ts b/internals/ci/src/cmds/format.ts new file mode 100644 index 000000000..6c00e7e68 --- /dev/null +++ b/internals/ci/src/cmds/format.ts @@ -0,0 +1 @@ +// TODO: @retto diff --git a/internals/ci/src/cmds/typecheck/index.ts b/internals/ci/src/cmds/typecheck/index.ts index 4b45562c0..8147e29a6 100644 --- a/internals/ci/src/cmds/typecheck/index.ts +++ b/internals/ci/src/cmds/typecheck/index.ts @@ -56,7 +56,11 @@ export async function typeCheck(..._args: any[]) { `All ${pkgPaths.length} ok!`, ); } catch (err: any) { - console.log("%s type checking, err: %s", chalk.red.bold("Error"), err); + console.log( + "%s type checking, terminating all workers, original error: %s", + chalk.red.bold("Error"), + err, + ); for (let idx = 0; idx < workers.length; idx += 1) { workers[idx].terminate(); diff --git a/internals/ci/src/paths.ts b/internals/ci/src/paths.ts index bdd67e969..bf948cda4 100644 --- a/internals/ci/src/paths.ts +++ b/internals/ci/src/paths.ts @@ -5,7 +5,7 @@ import { fileURLToPath } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); -export const paths = (function () { +export const paths = (function() { const root = path.join(__dirname, "../../../"); const ksn_interface = path.join( @@ -34,7 +34,7 @@ export const paths = (function () { const sandbox_simple_host = path.join( __dirname, - "../../../sdk/sandboxes/sandbox_simple_host/", + "../../../sandbox/sandbox_simple_host/", ); const crypto_bytes = path.join(__dirname, "../../../crypto/bytes/"); @@ -85,7 +85,9 @@ export const paths = (function () { "../../../backend/ct_dashboard_api", ); - const dockerfiles = path.join(__dirname, "../../docker/dockerfiles"); + const dockerfiles = path.join(__dirname, "../../docker"); + + const dockerfiles_oko = path.join(__dirname, "../../docker/oko"); return { root, @@ -113,5 +115,6 @@ export const paths = (function () { admin_api, ct_dashboard_api, dockerfiles, + dockerfiles_oko, }; })(); diff --git a/internals/docker/docker-compose.yml b/internals/docker/docker-compose.yml index 81a72c004..6f94a7a90 100644 --- a/internals/docker/docker-compose.yml +++ b/internals/docker/docker-compose.yml @@ -5,49 +5,48 @@ services: ports: - "5432:5432" environment: - POSTGRES_DB: ${DB_NAME} - POSTGRES_USER: ${DB_USER} - POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_DB: ewallet_dev + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres TZ: "UTC" PGTZ: "UTC" volumes: - - ${PG_DATA_DIR}:/var/lib/postgresql/data - - ../../backend/oko_pg_interface/scripts/migrate/migrate.sql:/docker-entrypoint-initdb.d/migrate.sql + - /var/lib/postgresql/data - oko_api_server: - build: - context: ../../ - dockerfile: internals/docker/oko_api_server.Dockerfile - network: host - ports: - - "${SERVER_PORT}:${SERVER_PORT}" - restart: unless-stopped - environment: - SERVER_PORT: ${SERVER_PORT} - NODE_ENV: ${NODE_ENV} - JWT_SECRET: ${JWT_SECRET} - JWT_EXPIRES_IN: ${JWT_EXPIRES_IN} - SMTP_HOST: ${SMTP_HOST} - SMTP_PORT: ${SMTP_PORT} - SMTP_USER: ${SMTP_USER} - SMTP_PASS: ${SMTP_PASS} - FROM_EMAIL: ${FROM_EMAIL} - EMAIL_VERIFICATION_EXPIRATION_MINUTES: ${EMAIL_VERIFICATION_EXPIRATION_MINUTES} - S3_REGION: ${S3_REGION} - S3_BUCKET: ${S3_BUCKET} - S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID} - S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY} - DB_HOST: "pg_local" - DB_PORT: "5432" - DB_USER: ${DB_USER} - DB_PASSWORD: ${DB_PASSWORD} - DB_NAME: ${DB_NAME} - DB_SSL: ${DB_SSL} - ENCRYPTION_SECRET: ${ENCRYPTION_SECRET} - ES_URL: ${ES_URL:-} - ES_INDEX: ${ES_INDEX:-} - ES_CLIENT_INDEX: ${ES_CLIENT_INDEX:-} - ES_USERNAME: ${ES_USERNAME:-} - ES_PASSWORD: ${ES_PASSWORD:-} - depends_on: - - pg_local + # oko_api_server: + # build: + # context: ../../ + # dockerfile: internals/docker/oko_api_server.Dockerfile + # network: host + # ports: + # - "${SERVER_PORT}:${SERVER_PORT}" + # restart: unless-stopped + # environment: + # SERVER_PORT: ${SERVER_PORT} + # NODE_ENV: ${NODE_ENV} + # JWT_SECRET: ${JWT_SECRET} + # JWT_EXPIRES_IN: ${JWT_EXPIRES_IN} + # SMTP_HOST: ${SMTP_HOST} + # SMTP_PORT: ${SMTP_PORT} + # SMTP_USER: ${SMTP_USER} + # SMTP_PASS: ${SMTP_PASS} + # FROM_EMAIL: ${FROM_EMAIL} + # EMAIL_VERIFICATION_EXPIRATION_MINUTES: ${EMAIL_VERIFICATION_EXPIRATION_MINUTES} + # S3_REGION: ${S3_REGION} + # S3_BUCKET: ${S3_BUCKET} + # S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID} + # S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY} + # DB_HOST: "pg_local" + # DB_PORT: "5432" + # DB_USER: ${DB_USER} + # DB_PASSWORD: ${DB_PASSWORD} + # DB_NAME: ${DB_NAME} + # DB_SSL: ${DB_SSL} + # ENCRYPTION_SECRET: ${ENCRYPTION_SECRET} + # ES_URL: ${ES_URL:-} + # ES_INDEX: ${ES_INDEX:-} + # ES_CLIENT_INDEX: ${ES_CLIENT_INDEX:-} + # ES_USERNAME: ${ES_USERNAME:-} + # ES_PASSWORD: ${ES_PASSWORD:-} + # depends_on: + # - pg_local diff --git a/internals/docker/oko_api_server.Dockerfile b/internals/docker/oko_api_server.Dockerfile index e444445c3..a67e48683 100644 --- a/internals/docker/oko_api_server.Dockerfile +++ b/internals/docker/oko_api_server.Dockerfile @@ -35,6 +35,24 @@ RUN yarn workspaces focus addon WORKDIR /home/node/oko/crypto/tecdsa/cait_sith_keplr_addon/addon RUN yarn run build +# Build stdlib-js +WORKDIR /home/node/oko +RUN yarn workspaces focus @oko-wallet/stdlib-js +WORKDIR /home/node/oko/lib/stdlib_js +RUN yarn run build + +# Build dotenv (depends on stdlib-js) +WORKDIR /home/node/oko +RUN yarn workspaces focus @oko-wallet/dotenv +WORKDIR /home/node/oko/lib/dotenv +RUN yarn run build + +# Build crypto/bytes +WORKDIR /home/node/oko +RUN yarn workspaces focus @oko-wallet/bytes +WORKDIR /home/node/oko/crypto/bytes +RUN yarn run build + WORKDIR /home/node/oko # Install dependencies for oko_api_server diff --git a/lib/dotenv/package.json b/lib/dotenv/package.json index 4aa9902a2..d17f07469 100644 --- a/lib/dotenv/package.json +++ b/lib/dotenv/package.json @@ -16,7 +16,9 @@ "directory": "stdlib_js" }, "dependencies": { - "@oko-wallet/stdlib-js": "^0.0.2-rc.31" + "@oko-wallet/stdlib-js": "^0.0.2-rc.31", + "dotenv": "^16.4.5", + "zod": "4.1.12" }, "devDependencies": { "@types/jest": "*", diff --git a/lib/tecdsa/cait_sith_keplr_addon/addon/addon.darwin-arm64.node b/lib/tecdsa/cait_sith_keplr_addon/addon/addon.darwin-arm64.node new file mode 100755 index 000000000..b05ffae39 Binary files /dev/null and b/lib/tecdsa/cait_sith_keplr_addon/addon/addon.darwin-arm64.node differ diff --git a/package.json b/package.json index 9e9a4cc7a..4a5347ace 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,9 @@ "sdk/oko_sdk_core", "sdk/oko_sdk_cosmos", "sdk/oko_sdk_eth", - "sdk/sandboxes/sandbox_evm", - "sdk/sandboxes/sandbox_osmosis", - "sdk/sandboxes/sandbox_simple_host", + "sandbox/sandbox_evm", + "sandbox/sandbox_osmosis", + "sandbox/sandbox_simple_host", "crypto/bytes", "crypto/sss", "crypto/tecdsa/tecdsa_interface", diff --git a/sdk/sandboxes/sandbox_evm/.env.local.example b/sandbox/sandbox_evm/.env.local.example similarity index 100% rename from sdk/sandboxes/sandbox_evm/.env.local.example rename to sandbox/sandbox_evm/.env.local.example diff --git a/sdk/sandboxes/sandbox_evm/.gitignore b/sandbox/sandbox_evm/.gitignore similarity index 100% rename from sdk/sandboxes/sandbox_evm/.gitignore rename to sandbox/sandbox_evm/.gitignore diff --git a/sdk/sandboxes/sandbox_evm/README.md b/sandbox/sandbox_evm/README.md similarity index 100% rename from sdk/sandboxes/sandbox_evm/README.md rename to sandbox/sandbox_evm/README.md diff --git a/sdk/sandboxes/sandbox_evm/contracts/src/counter.sol b/sandbox/sandbox_evm/contracts/src/counter.sol similarity index 100% rename from sdk/sandboxes/sandbox_evm/contracts/src/counter.sol rename to sandbox/sandbox_evm/contracts/src/counter.sol diff --git a/sdk/sandboxes/sandbox_evm/generateAbis.ts b/sandbox/sandbox_evm/generateAbis.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/generateAbis.ts rename to sandbox/sandbox_evm/generateAbis.ts diff --git a/sdk/sandboxes/sandbox_evm/global.d.ts b/sandbox/sandbox_evm/global.d.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/global.d.ts rename to sandbox/sandbox_evm/global.d.ts diff --git a/sdk/sandboxes/sandbox_evm/hardhat.config.js b/sandbox/sandbox_evm/hardhat.config.js similarity index 100% rename from sdk/sandboxes/sandbox_evm/hardhat.config.js rename to sandbox/sandbox_evm/hardhat.config.js diff --git a/sdk/sandboxes/sandbox_evm/ignition/modules/Counter.ts b/sandbox/sandbox_evm/ignition/modules/Counter.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/ignition/modules/Counter.ts rename to sandbox/sandbox_evm/ignition/modules/Counter.ts diff --git a/sdk/sandboxes/sandbox_evm/launch.ts b/sandbox/sandbox_evm/launch.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/launch.ts rename to sandbox/sandbox_evm/launch.ts diff --git a/sdk/sandboxes/sandbox_evm/next-env.d.ts b/sandbox/sandbox_evm/next-env.d.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/next-env.d.ts rename to sandbox/sandbox_evm/next-env.d.ts diff --git a/sdk/sandboxes/sandbox_evm/next.config.ts b/sandbox/sandbox_evm/next.config.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/next.config.ts rename to sandbox/sandbox_evm/next.config.ts diff --git a/sdk/sandboxes/sandbox_evm/package.json b/sandbox/sandbox_evm/package.json similarity index 100% rename from sdk/sandboxes/sandbox_evm/package.json rename to sandbox/sandbox_evm/package.json diff --git a/sdk/sandboxes/sandbox_evm/postcss.config.js b/sandbox/sandbox_evm/postcss.config.js similarity index 100% rename from sdk/sandboxes/sandbox_evm/postcss.config.js rename to sandbox/sandbox_evm/postcss.config.js diff --git a/sdk/sandboxes/sandbox_evm/public/favicon.ico b/sandbox/sandbox_evm/public/favicon.ico similarity index 100% rename from sdk/sandboxes/sandbox_evm/public/favicon.ico rename to sandbox/sandbox_evm/public/favicon.ico diff --git a/sdk/sandboxes/sandbox_evm/public/logo.svg b/sandbox/sandbox_evm/public/logo.svg similarity index 100% rename from sdk/sandboxes/sandbox_evm/public/logo.svg rename to sandbox/sandbox_evm/public/logo.svg diff --git a/sdk/sandboxes/sandbox_evm/public/manifest.json b/sandbox/sandbox_evm/public/manifest.json similarity index 100% rename from sdk/sandboxes/sandbox_evm/public/manifest.json rename to sandbox/sandbox_evm/public/manifest.json diff --git a/sdk/sandboxes/sandbox_evm/scaffold.config.ts b/sandbox/sandbox_evm/scaffold.config.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/scaffold.config.ts rename to sandbox/sandbox_evm/scaffold.config.ts diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/DebugContracts.tsx b/sandbox/sandbox_evm/src/app/debug/_components/DebugContracts.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/DebugContracts.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/DebugContracts.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ContractInput.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/ContractInput.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ContractInput.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/ContractInput.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ContractReadMethods.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/ContractReadMethods.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ContractReadMethods.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/ContractReadMethods.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ContractUI.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/ContractUI.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ContractUI.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/ContractUI.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ContractVariables.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/ContractVariables.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ContractVariables.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/ContractVariables.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ContractWriteMethods.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/ContractWriteMethods.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ContractWriteMethods.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/ContractWriteMethods.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/DisplayVariable.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/DisplayVariable.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/DisplayVariable.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/DisplayVariable.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/InheritanceTooltip.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/InheritanceTooltip.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/InheritanceTooltip.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/InheritanceTooltip.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ReadOnlyFunctionForm.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/ReadOnlyFunctionForm.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/ReadOnlyFunctionForm.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/ReadOnlyFunctionForm.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/Tuple.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/Tuple.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/Tuple.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/Tuple.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/TupleArray.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/TupleArray.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/TupleArray.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/TupleArray.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/TxReceipt.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/TxReceipt.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/TxReceipt.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/TxReceipt.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/WriteOnlyFunctionForm.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/WriteOnlyFunctionForm.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/WriteOnlyFunctionForm.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/WriteOnlyFunctionForm.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/index.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/index.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/index.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/index.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/utilsContract.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/utilsContract.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/utilsContract.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/utilsContract.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/utilsDisplay.tsx b/sandbox/sandbox_evm/src/app/debug/_components/contract/utilsDisplay.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/_components/contract/utilsDisplay.tsx rename to sandbox/sandbox_evm/src/app/debug/_components/contract/utilsDisplay.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/debug/page.tsx b/sandbox/sandbox_evm/src/app/debug/page.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/debug/page.tsx rename to sandbox/sandbox_evm/src/app/debug/page.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/layout.tsx b/sandbox/sandbox_evm/src/app/layout.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/layout.tsx rename to sandbox/sandbox_evm/src/app/layout.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/not-found.tsx b/sandbox/sandbox_evm/src/app/not-found.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/not-found.tsx rename to sandbox/sandbox_evm/src/app/not-found.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/page.tsx b/sandbox/sandbox_evm/src/app/page.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/page.tsx rename to sandbox/sandbox_evm/src/app/page.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/playground/_components/EIP712SignWidget.tsx b/sandbox/sandbox_evm/src/app/playground/_components/EIP712SignWidget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/playground/_components/EIP712SignWidget.tsx rename to sandbox/sandbox_evm/src/app/playground/_components/EIP712SignWidget.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/playground/_components/NativeTransferWidget.tsx b/sandbox/sandbox_evm/src/app/playground/_components/NativeTransferWidget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/playground/_components/NativeTransferWidget.tsx rename to sandbox/sandbox_evm/src/app/playground/_components/NativeTransferWidget.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/playground/_components/PermitSignWidget.tsx b/sandbox/sandbox_evm/src/app/playground/_components/PermitSignWidget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/playground/_components/PermitSignWidget.tsx rename to sandbox/sandbox_evm/src/app/playground/_components/PermitSignWidget.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/playground/_components/PersonalSignWidget.tsx b/sandbox/sandbox_evm/src/app/playground/_components/PersonalSignWidget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/playground/_components/PersonalSignWidget.tsx rename to sandbox/sandbox_evm/src/app/playground/_components/PersonalSignWidget.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/playground/_components/SignatureVerificationWidget.tsx b/sandbox/sandbox_evm/src/app/playground/_components/SignatureVerificationWidget.tsx similarity index 99% rename from sdk/sandboxes/sandbox_evm/src/app/playground/_components/SignatureVerificationWidget.tsx rename to sandbox/sandbox_evm/src/app/playground/_components/SignatureVerificationWidget.tsx index 9ff25272e..a668afd3c 100644 --- a/sdk/sandboxes/sandbox_evm/src/app/playground/_components/SignatureVerificationWidget.tsx +++ b/sandbox/sandbox_evm/src/app/playground/_components/SignatureVerificationWidget.tsx @@ -270,7 +270,7 @@ function TypedDataVerifier() { try { const t = JSON.parse(typedDataTypes); if (t && typeof t === "object") return t as Record; - } catch { } + } catch {} return {} as Record; })(); diff --git a/sdk/sandboxes/sandbox_evm/src/app/playground/_components/SigningPlayground.tsx b/sandbox/sandbox_evm/src/app/playground/_components/SigningPlayground.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/playground/_components/SigningPlayground.tsx rename to sandbox/sandbox_evm/src/app/playground/_components/SigningPlayground.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/app/playground/_components/SiweSignWidget.tsx b/sandbox/sandbox_evm/src/app/playground/_components/SiweSignWidget.tsx similarity index 99% rename from sdk/sandboxes/sandbox_evm/src/app/playground/_components/SiweSignWidget.tsx rename to sandbox/sandbox_evm/src/app/playground/_components/SiweSignWidget.tsx index 345b6e7ce..077a0609a 100644 --- a/sdk/sandboxes/sandbox_evm/src/app/playground/_components/SiweSignWidget.tsx +++ b/sandbox/sandbox_evm/src/app/playground/_components/SiweSignWidget.tsx @@ -38,14 +38,14 @@ export function SiweSignWidget() { if (!signature) return; try { await navigator.clipboard.writeText(signature); - } catch { } + } catch {} }; const copyMessage = async () => { if (!signedMessage) return; try { await navigator.clipboard.writeText(signedMessage); - } catch { } + } catch {} }; const resetSiweSign = () => { diff --git a/sdk/sandboxes/sandbox_evm/src/app/playground/page.tsx b/sandbox/sandbox_evm/src/app/playground/page.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/app/playground/page.tsx rename to sandbox/sandbox_evm/src/app/playground/page.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/assets/icon.ts b/sandbox/sandbox_evm/src/assets/icon.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/assets/icon.ts rename to sandbox/sandbox_evm/src/assets/icon.ts diff --git a/sdk/sandboxes/sandbox_evm/src/components/Footer.tsx b/sandbox/sandbox_evm/src/components/Footer.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/Footer.tsx rename to sandbox/sandbox_evm/src/components/Footer.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/Header.tsx b/sandbox/sandbox_evm/src/components/Header.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/Header.tsx rename to sandbox/sandbox_evm/src/components/Header.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/ScaffoldEthAppWithProviders.tsx b/sandbox/sandbox_evm/src/components/ScaffoldEthAppWithProviders.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/ScaffoldEthAppWithProviders.tsx rename to sandbox/sandbox_evm/src/components/ScaffoldEthAppWithProviders.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Address/Address.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Address/Address.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Address/Address.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Address/Address.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Address/AddressCopyIcon.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Address/AddressCopyIcon.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Address/AddressCopyIcon.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Address/AddressCopyIcon.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Address/AddressLinkWrapper.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Address/AddressLinkWrapper.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Address/AddressLinkWrapper.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Address/AddressLinkWrapper.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Balance.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Balance.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Balance.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Balance.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/BlockieAvatar.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/BlockieAvatar.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/BlockieAvatar.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/BlockieAvatar.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/AddressInput.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Input/AddressInput.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/AddressInput.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Input/AddressInput.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/Bytes32Input.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Input/Bytes32Input.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/Bytes32Input.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Input/Bytes32Input.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/BytesInput.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Input/BytesInput.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/BytesInput.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Input/BytesInput.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/EtherInput.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Input/EtherInput.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/EtherInput.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Input/EtherInput.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/InputBase.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Input/InputBase.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/InputBase.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Input/InputBase.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/IntegerInput.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Input/IntegerInput.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/IntegerInput.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Input/IntegerInput.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/TextAreaInput.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/Input/TextAreaInput.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/TextAreaInput.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/Input/TextAreaInput.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/index.ts b/sandbox/sandbox_evm/src/components/scaffold-eth/Input/index.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/index.ts rename to sandbox/sandbox_evm/src/components/scaffold-eth/Input/index.ts diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/utils.ts b/sandbox/sandbox_evm/src/components/scaffold-eth/Input/utils.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/Input/utils.ts rename to sandbox/sandbox_evm/src/components/scaffold-eth/Input/utils.ts diff --git a/sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/index.tsx b/sandbox/sandbox_evm/src/components/scaffold-eth/index.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/components/scaffold-eth/index.tsx rename to sandbox/sandbox_evm/src/components/scaffold-eth/index.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/contracts/abis/Permit.ts b/sandbox/sandbox_evm/src/contracts/abis/Permit.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/contracts/abis/Permit.ts rename to sandbox/sandbox_evm/src/contracts/abis/Permit.ts diff --git a/sdk/sandboxes/sandbox_evm/src/contracts/abis/USDC.ts b/sandbox/sandbox_evm/src/contracts/abis/USDC.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/contracts/abis/USDC.ts rename to sandbox/sandbox_evm/src/contracts/abis/USDC.ts diff --git a/sdk/sandboxes/sandbox_evm/src/contracts/deployedContracts.ts b/sandbox/sandbox_evm/src/contracts/deployedContracts.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/contracts/deployedContracts.ts rename to sandbox/sandbox_evm/src/contracts/deployedContracts.ts diff --git a/sdk/sandboxes/sandbox_evm/src/contracts/externalContracts.ts b/sandbox/sandbox_evm/src/contracts/externalContracts.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/contracts/externalContracts.ts rename to sandbox/sandbox_evm/src/contracts/externalContracts.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/index.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/index.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/index.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/index.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useAnimationConfig.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useAnimationConfig.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useAnimationConfig.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useAnimationConfig.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useCopyToClipboard.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useCopyToClipboard.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useCopyToClipboard.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useCopyToClipboard.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useDeployedContractInfo.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useDeployedContractInfo.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useDeployedContractInfo.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useDeployedContractInfo.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useDisplayUsdMode.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useDisplayUsdMode.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useDisplayUsdMode.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useDisplayUsdMode.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useInitializeNativeCurrencyPrice.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useInitializeNativeCurrencyPrice.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useInitializeNativeCurrencyPrice.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useInitializeNativeCurrencyPrice.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useNetworkColor.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useNetworkColor.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useNetworkColor.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useNetworkColor.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useOutsideClick.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useOutsideClick.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useOutsideClick.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useOutsideClick.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/usePermit.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/usePermit.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/usePermit.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/usePermit.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useSelectedNetwork.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useSelectedNetwork.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useSelectedNetwork.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useSelectedNetwork.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useSignMessage.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useSignMessage.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useSignMessage.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useSignMessage.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useTargetNetwork.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useTargetNetwork.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useTargetNetwork.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useTargetNetwork.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useTransactor.tsx b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useTransactor.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useTransactor.tsx rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useTransactor.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useWatchBalance.ts b/sandbox/sandbox_evm/src/hooks/scaffold-eth/useWatchBalance.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/scaffold-eth/useWatchBalance.ts rename to sandbox/sandbox_evm/src/hooks/scaffold-eth/useWatchBalance.ts diff --git a/sdk/sandboxes/sandbox_evm/src/hooks/useKeplrEWallet.ts b/sandbox/sandbox_evm/src/hooks/useKeplrEWallet.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/hooks/useKeplrEWallet.ts rename to sandbox/sandbox_evm/src/hooks/useKeplrEWallet.ts diff --git a/sdk/sandboxes/sandbox_evm/src/services/store/store.ts b/sandbox/sandbox_evm/src/services/store/store.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/services/store/store.ts rename to sandbox/sandbox_evm/src/services/store/store.ts diff --git a/sdk/sandboxes/sandbox_evm/src/services/web3/wagmiConfig.tsx b/sandbox/sandbox_evm/src/services/web3/wagmiConfig.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/services/web3/wagmiConfig.tsx rename to sandbox/sandbox_evm/src/services/web3/wagmiConfig.tsx diff --git a/sdk/sandboxes/sandbox_evm/src/styles/globals.css b/sandbox/sandbox_evm/src/styles/globals.css similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/styles/globals.css rename to sandbox/sandbox_evm/src/styles/globals.css diff --git a/sdk/sandboxes/sandbox_evm/src/types/abitype/abi.d.ts b/sandbox/sandbox_evm/src/types/abitype/abi.d.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/types/abitype/abi.d.ts rename to sandbox/sandbox_evm/src/types/abitype/abi.d.ts diff --git a/sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/block.ts b/sandbox/sandbox_evm/src/utils/scaffold-eth/block.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/block.ts rename to sandbox/sandbox_evm/src/utils/scaffold-eth/block.ts diff --git a/sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/common.ts b/sandbox/sandbox_evm/src/utils/scaffold-eth/common.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/common.ts rename to sandbox/sandbox_evm/src/utils/scaffold-eth/common.ts diff --git a/sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/contract.ts b/sandbox/sandbox_evm/src/utils/scaffold-eth/contract.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/contract.ts rename to sandbox/sandbox_evm/src/utils/scaffold-eth/contract.ts diff --git a/sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/contractsData.ts b/sandbox/sandbox_evm/src/utils/scaffold-eth/contractsData.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/contractsData.ts rename to sandbox/sandbox_evm/src/utils/scaffold-eth/contractsData.ts diff --git a/sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/fetchPriceFromUniswap.ts b/sandbox/sandbox_evm/src/utils/scaffold-eth/fetchPriceFromUniswap.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/fetchPriceFromUniswap.ts rename to sandbox/sandbox_evm/src/utils/scaffold-eth/fetchPriceFromUniswap.ts diff --git a/sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/getMetadata.ts b/sandbox/sandbox_evm/src/utils/scaffold-eth/getMetadata.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/getMetadata.ts rename to sandbox/sandbox_evm/src/utils/scaffold-eth/getMetadata.ts diff --git a/sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/getParsedError.ts b/sandbox/sandbox_evm/src/utils/scaffold-eth/getParsedError.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/getParsedError.ts rename to sandbox/sandbox_evm/src/utils/scaffold-eth/getParsedError.ts diff --git a/sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/index.ts b/sandbox/sandbox_evm/src/utils/scaffold-eth/index.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/index.ts rename to sandbox/sandbox_evm/src/utils/scaffold-eth/index.ts diff --git a/sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/networks.ts b/sandbox/sandbox_evm/src/utils/scaffold-eth/networks.ts similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/networks.ts rename to sandbox/sandbox_evm/src/utils/scaffold-eth/networks.ts diff --git a/sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/notification.tsx b/sandbox/sandbox_evm/src/utils/scaffold-eth/notification.tsx similarity index 100% rename from sdk/sandboxes/sandbox_evm/src/utils/scaffold-eth/notification.tsx rename to sandbox/sandbox_evm/src/utils/scaffold-eth/notification.tsx diff --git a/sdk/sandboxes/sandbox_evm/tsconfig.json b/sandbox/sandbox_evm/tsconfig.json similarity index 82% rename from sdk/sandboxes/sandbox_evm/tsconfig.json rename to sandbox/sandbox_evm/tsconfig.json index 607909c79..ad6c485b2 100644 --- a/sdk/sandboxes/sandbox_evm/tsconfig.json +++ b/sandbox/sandbox_evm/tsconfig.json @@ -20,8 +20,8 @@ ], "paths": { "@oko-wallet-sandbox-evm/*": ["./src/*"], - "@oko-wallet-sdk-core/*": ["../../oko_sdk_core/src/*"], - "@oko-wallet-sdk-eth/*": ["../../oko_sdk_variants/eth/src/*"] + "@oko-wallet-sdk-core/*": ["../oko_sdk_core/src/*"], + "@oko-wallet-sdk-eth/*": ["../oko_sdk_variants/eth/src/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], diff --git a/sdk/sandboxes/sandbox_simple_host/.dockerignore b/sandbox/sandbox_simple_host/.dockerignore similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/.dockerignore rename to sandbox/sandbox_simple_host/.dockerignore diff --git a/sdk/sandboxes/sandbox_simple_host/.env b/sandbox/sandbox_simple_host/.env similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/.env rename to sandbox/sandbox_simple_host/.env diff --git a/sdk/sandboxes/sandbox_simple_host/.gitignore b/sandbox/sandbox_simple_host/.gitignore similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/.gitignore rename to sandbox/sandbox_simple_host/.gitignore diff --git a/sdk/sandboxes/sandbox_simple_host/Dockerfile b/sandbox/sandbox_simple_host/Dockerfile similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/Dockerfile rename to sandbox/sandbox_simple_host/Dockerfile diff --git a/sdk/sandboxes/sandbox_simple_host/README.md b/sandbox/sandbox_simple_host/README.md similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/README.md rename to sandbox/sandbox_simple_host/README.md diff --git a/sdk/sandboxes/sandbox_simple_host/index.html b/sandbox/sandbox_simple_host/index.html similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/index.html rename to sandbox/sandbox_simple_host/index.html diff --git a/sdk/sandboxes/sandbox_simple_host/package.json b/sandbox/sandbox_simple_host/package.json similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/package.json rename to sandbox/sandbox_simple_host/package.json diff --git a/sdk/sandboxes/sandbox_simple_host/public/favicon.ico b/sandbox/sandbox_simple_host/public/favicon.ico similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/public/favicon.ico rename to sandbox/sandbox_simple_host/public/favicon.ico diff --git a/sdk/sandboxes/sandbox_simple_host/public/keplr_icon.svg b/sandbox/sandbox_simple_host/public/keplr_icon.svg similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/public/keplr_icon.svg rename to sandbox/sandbox_simple_host/public/keplr_icon.svg diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_offchain_sign_widget/cosmos_offchain_sign_widget.module.scss b/sandbox/sandbox_simple_host/public/pkg/.gitkeep similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_offchain_sign_widget/cosmos_offchain_sign_widget.module.scss rename to sandbox/sandbox_simple_host/public/pkg/.gitkeep diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/cosmos_accounts_modal/cosmos_accounts_modal.module.scss b/sandbox/sandbox_simple_host/src/components/cosmos_accounts_modal/cosmos_accounts_modal.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/cosmos_accounts_modal/cosmos_accounts_modal.module.scss rename to sandbox/sandbox_simple_host/src/components/cosmos_accounts_modal/cosmos_accounts_modal.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/cosmos_accounts_modal/cosmos_accounts_modal.tsx b/sandbox/sandbox_simple_host/src/components/cosmos_accounts_modal/cosmos_accounts_modal.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/cosmos_accounts_modal/cosmos_accounts_modal.tsx rename to sandbox/sandbox_simple_host/src/components/cosmos_accounts_modal/cosmos_accounts_modal.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/cosmos_accounts_modal/use_cosmos_accounts.ts b/sandbox/sandbox_simple_host/src/components/cosmos_accounts_modal/use_cosmos_accounts.ts similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/cosmos_accounts_modal/use_cosmos_accounts.ts rename to sandbox/sandbox_simple_host/src/components/cosmos_accounts_modal/use_cosmos_accounts.ts diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/home/home.tsx b/sandbox/sandbox_simple_host/src/components/home/home.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/home/home.tsx rename to sandbox/sandbox_simple_host/src/components/home/home.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/oko_provider/oko_provider.tsx b/sandbox/sandbox_simple_host/src/components/oko_provider/oko_provider.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/oko_provider/oko_provider.tsx rename to sandbox/sandbox_simple_host/src/components/oko_provider/oko_provider.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/oko_provider/use_init_oko.ts b/sandbox/sandbox_simple_host/src/components/oko_provider/use_init_oko.ts similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/oko_provider/use_init_oko.ts rename to sandbox/sandbox_simple_host/src/components/oko_provider/use_init_oko.ts diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/preview_panel/preview_panel.module.scss b/sandbox/sandbox_simple_host/src/components/preview_panel/preview_panel.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/preview_panel/preview_panel.module.scss rename to sandbox/sandbox_simple_host/src/components/preview_panel/preview_panel.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/preview_panel/preview_panel.tsx b/sandbox/sandbox_simple_host/src/components/preview_panel/preview_panel.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/preview_panel/preview_panel.tsx rename to sandbox/sandbox_simple_host/src/components/preview_panel/preview_panel.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/skeleton/skeleton.scss b/sandbox/sandbox_simple_host/src/components/skeleton/skeleton.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/skeleton/skeleton.scss rename to sandbox/sandbox_simple_host/src/components/skeleton/skeleton.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/skeleton/skeleton.tsx b/sandbox/sandbox_simple_host/src/components/skeleton/skeleton.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/skeleton/skeleton.tsx rename to sandbox/sandbox_simple_host/src/components/skeleton/skeleton.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/spinner/spinner.module.scss b/sandbox/sandbox_simple_host/src/components/spinner/spinner.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/spinner/spinner.module.scss rename to sandbox/sandbox_simple_host/src/components/spinner/spinner.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/spinner/spinner.tsx b/sandbox/sandbox_simple_host/src/components/spinner/spinner.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/spinner/spinner.tsx rename to sandbox/sandbox_simple_host/src/components/spinner/spinner.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/address_row.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/address_widget/address_row.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/address_row.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/address_widget/address_row.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/address_row.tsx b/sandbox/sandbox_simple_host/src/components/widgets/address_widget/address_row.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/address_row.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/address_widget/address_row.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/address_widget.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/address_widget/address_widget.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/address_widget.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/address_widget/address_widget.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/address_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/address_widget/address_widget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/address_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/address_widget/address_widget.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/chains_row.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/address_widget/chains_row.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/chains_row.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/address_widget/chains_row.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/chains_row.tsx b/sandbox/sandbox_simple_host/src/components/widgets/address_widget/chains_row.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/chains_row.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/address_widget/chains_row.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/view_chains_button.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/address_widget/view_chains_button.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/view_chains_button.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/address_widget/view_chains_button.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/view_chains_button.tsx b/sandbox/sandbox_simple_host/src/components/widgets/address_widget/view_chains_button.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/view_chains_button.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/address_widget/view_chains_button.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/view_chains_modal.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/address_widget/view_chains_modal.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/view_chains_modal.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/address_widget/view_chains_modal.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/view_chains_modal.tsx b/sandbox/sandbox_simple_host/src/components/widgets/address_widget/view_chains_modal.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/address_widget/view_chains_modal.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/address_widget/view_chains_modal.tsx diff --git a/sandbox/sandbox_simple_host/src/components/widgets/cosmos_offchain_sign_widget/cosmos_offchain_sign_widget.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/cosmos_offchain_sign_widget/cosmos_offchain_sign_widget.module.scss new file mode 100644 index 000000000..e69de29bb diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_offchain_sign_widget/cosmos_offchain_sign_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/cosmos_offchain_sign_widget/cosmos_offchain_sign_widget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_offchain_sign_widget/cosmos_offchain_sign_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/cosmos_offchain_sign_widget/cosmos_offchain_sign_widget.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_onchain_cosmjs_sign_widget/cosmos_onchain_cosmjs_sign_widget.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/cosmos_onchain_cosmjs_sign_widget/cosmos_onchain_cosmjs_sign_widget.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_onchain_cosmjs_sign_widget/cosmos_onchain_cosmjs_sign_widget.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/cosmos_onchain_cosmjs_sign_widget/cosmos_onchain_cosmjs_sign_widget.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_onchain_cosmjs_sign_widget/cosmos_onchain_cosmjs_sign_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/cosmos_onchain_cosmjs_sign_widget/cosmos_onchain_cosmjs_sign_widget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_onchain_cosmjs_sign_widget/cosmos_onchain_cosmjs_sign_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/cosmos_onchain_cosmjs_sign_widget/cosmos_onchain_cosmjs_sign_widget.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_onchain_sign_widget/cosmos_onchain_sign_widget.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/cosmos_onchain_sign_widget/cosmos_onchain_sign_widget.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_onchain_sign_widget/cosmos_onchain_sign_widget.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/cosmos_onchain_sign_widget/cosmos_onchain_sign_widget.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_onchain_sign_widget/cosmos_onchain_sign_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/cosmos_onchain_sign_widget/cosmos_onchain_sign_widget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/cosmos_onchain_sign_widget/cosmos_onchain_sign_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/cosmos_onchain_sign_widget/cosmos_onchain_sign_widget.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/docs_widget/docs_widget.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/docs_widget/docs_widget.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/docs_widget/docs_widget.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/docs_widget/docs_widget.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/docs_widget/docs_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/docs_widget/docs_widget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/docs_widget/docs_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/docs_widget/docs_widget.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/error_widget/error_widget.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/error_widget/error_widget.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/error_widget/error_widget.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/error_widget/error_widget.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/error_widget/error_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/error_widget/error_widget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/error_widget/error_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/error_widget/error_widget.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/ethereum_offchain_sign_widget/ethereum_offchain_sign_widget.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/ethereum_offchain_sign_widget/ethereum_offchain_sign_widget.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/ethereum_offchain_sign_widget/ethereum_offchain_sign_widget.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/ethereum_offchain_sign_widget/ethereum_offchain_sign_widget.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/ethereum_offchain_sign_widget/ethereum_offchain_sign_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/ethereum_offchain_sign_widget/ethereum_offchain_sign_widget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/ethereum_offchain_sign_widget/ethereum_offchain_sign_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/ethereum_offchain_sign_widget/ethereum_offchain_sign_widget.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/ethereum_onchain_sign_widget/ethereum_onchain_sign_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/ethereum_onchain_sign_widget/ethereum_onchain_sign_widget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/ethereum_onchain_sign_widget/ethereum_onchain_sign_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/ethereum_onchain_sign_widget/ethereum_onchain_sign_widget.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/login_widget/login_widget.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/login_widget/login_widget.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/login_widget/login_widget.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/login_widget/login_widget.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/login_widget/login_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/login_widget/login_widget.tsx similarity index 97% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/login_widget/login_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/login_widget/login_widget.tsx index 4be43c67f..c8e205862 100644 --- a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/login_widget/login_widget.tsx +++ b/sandbox/sandbox_simple_host/src/components/widgets/login_widget/login_widget.tsx @@ -20,7 +20,8 @@ export const LoginWidget: FC = () => { setIsSigningIn(true); const okoWallet = okoCosmos.okoWallet; - // await eWallet.signIn("google"); + + // TODO: @hyunjae okoWallet.signIn("google"); } } catch (error) { @@ -103,4 +104,4 @@ export const LoginWidget: FC = () => { ); }; -export interface LoginWidgetProps {} +export interface LoginWidgetProps { } diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/login_widget/wallet_box.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/login_widget/wallet_box.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/login_widget/wallet_box.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/login_widget/wallet_box.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/login_widget/wallet_box.tsx b/sandbox/sandbox_simple_host/src/components/widgets/login_widget/wallet_box.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/login_widget/wallet_box.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/login_widget/wallet_box.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/sign_widget/sign_widget.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/sign_widget/sign_widget.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/sign_widget/sign_widget.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/sign_widget/sign_widget.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/sign_widget/sign_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/sign_widget/sign_widget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/sign_widget/sign_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/sign_widget/sign_widget.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/user_data_widget/user_data_widget.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/user_data_widget/user_data_widget.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/user_data_widget/user_data_widget.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/user_data_widget/user_data_widget.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/user_data_widget/user_data_widget.tsx b/sandbox/sandbox_simple_host/src/components/widgets/user_data_widget/user_data_widget.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/user_data_widget/user_data_widget.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/user_data_widget/user_data_widget.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/widget_components.module.scss b/sandbox/sandbox_simple_host/src/components/widgets/widget_components.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/widget_components.module.scss rename to sandbox/sandbox_simple_host/src/components/widgets/widget_components.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/components/widgets/widget_components.tsx b/sandbox/sandbox_simple_host/src/components/widgets/widget_components.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/components/widgets/widget_components.tsx rename to sandbox/sandbox_simple_host/src/components/widgets/widget_components.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/constants.ts b/sandbox/sandbox_simple_host/src/constants.ts similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/constants.ts rename to sandbox/sandbox_simple_host/src/constants.ts diff --git a/sdk/sandboxes/sandbox_simple_host/src/global.d.ts b/sandbox/sandbox_simple_host/src/global.d.ts similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/global.d.ts rename to sandbox/sandbox_simple_host/src/global.d.ts diff --git a/sdk/sandboxes/sandbox_simple_host/src/hooks/use_addresses.ts b/sandbox/sandbox_simple_host/src/hooks/use_addresses.ts similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/hooks/use_addresses.ts rename to sandbox/sandbox_simple_host/src/hooks/use_addresses.ts diff --git a/sdk/sandboxes/sandbox_simple_host/src/hooks/use_oko.tsx b/sandbox/sandbox_simple_host/src/hooks/use_oko.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/hooks/use_oko.tsx rename to sandbox/sandbox_simple_host/src/hooks/use_oko.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/main.tsx b/sandbox/sandbox_simple_host/src/main.tsx similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/main.tsx rename to sandbox/sandbox_simple_host/src/main.tsx diff --git a/sdk/sandboxes/sandbox_simple_host/src/state/sdk.ts b/sandbox/sandbox_simple_host/src/state/sdk.ts similarity index 98% rename from sdk/sandboxes/sandbox_simple_host/src/state/sdk.ts rename to sandbox/sandbox_simple_host/src/state/sdk.ts index c0781b614..1ffc2d9c3 100644 --- a/sdk/sandboxes/sandbox_simple_host/src/state/sdk.ts +++ b/sandbox/sandbox_simple_host/src/state/sdk.ts @@ -43,6 +43,7 @@ export const useSDKState = create( console.log("Initializing ETH SDK..."); set({ isEthInitializing: true }); + // TODO: @hyunjae const initRes = OkoEthWallet.init({ api_key: "72bd2afd04374f86d563a40b814b7098e5ad6c7f52d3b8f84ab0c3d05f73ac6c", @@ -78,6 +79,7 @@ export const useSDKState = create( console.log("Initializing Cosmos SDK..."); set({ isCosmosInitializing: true }); + // TODO: @hyunjae const initRes = OkoCosmosWallet.init({ api_key: "72bd2afd04374f86d563a40b814b7098e5ad6c7f52d3b8f84ab0c3d05f73ac6c", diff --git a/sdk/sandboxes/sandbox_simple_host/src/state/user_info.ts b/sandbox/sandbox_simple_host/src/state/user_info.ts similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/state/user_info.ts rename to sandbox/sandbox_simple_host/src/state/user_info.ts diff --git a/sdk/sandboxes/sandbox_simple_host/src/styles/globals.scss b/sandbox/sandbox_simple_host/src/styles/globals.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/styles/globals.scss rename to sandbox/sandbox_simple_host/src/styles/globals.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/styles/viewport.module.scss b/sandbox/sandbox_simple_host/src/styles/viewport.module.scss similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/styles/viewport.module.scss rename to sandbox/sandbox_simple_host/src/styles/viewport.module.scss diff --git a/sdk/sandboxes/sandbox_simple_host/src/utils/cosmos.ts b/sandbox/sandbox_simple_host/src/utils/cosmos.ts similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/utils/cosmos.ts rename to sandbox/sandbox_simple_host/src/utils/cosmos.ts diff --git a/sdk/sandboxes/sandbox_simple_host/src/utils/sign_doc_wrapper.ts b/sandbox/sandbox_simple_host/src/utils/sign_doc_wrapper.ts similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/utils/sign_doc_wrapper.ts rename to sandbox/sandbox_simple_host/src/utils/sign_doc_wrapper.ts diff --git a/sdk/sandboxes/sandbox_simple_host/src/vite-env.d.ts b/sandbox/sandbox_simple_host/src/vite-env.d.ts similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/src/vite-env.d.ts rename to sandbox/sandbox_simple_host/src/vite-env.d.ts diff --git a/sdk/sandboxes/sandbox_simple_host/tsconfig.json b/sandbox/sandbox_simple_host/tsconfig.json similarity index 67% rename from sdk/sandboxes/sandbox_simple_host/tsconfig.json rename to sandbox/sandbox_simple_host/tsconfig.json index fdd9c3006..00506bdaf 100644 --- a/sdk/sandboxes/sandbox_simple_host/tsconfig.json +++ b/sandbox/sandbox_simple_host/tsconfig.json @@ -1,5 +1,4 @@ { - "extends": "../../../tsconfig.json", "compilerOptions": { "target": "ESNext", "lib": ["DOM", "DOM.Iterable", "ESNext"], @@ -9,6 +8,7 @@ "allowSyntheticDefaultImports": true, "strict": true, "noEmit": true, + "verbatimModuleSyntax": true, "module": "esnext", "moduleResolution": "bundler", "resolveJsonModule": true, @@ -16,9 +16,9 @@ "baseUrl": ".", "paths": { "@/*": ["./src/*"], - "@oko-wallet-sdk-core/*": ["../oko_sdk_core/src/*"], - "@oko-wallet-sdk-eth/*": ["../oko_sdk_variants/eth/src/*"], - "@oko-wallet-sdk-cosmos/*": ["../oko_sdk_variants/cosmos/src/*"] + "@oko-wallet-sdk-core/*": ["../../oko_sdk_core/src/*"], + "@oko-wallet-sdk-eth/*": ["../../oko_sdk_variants/eth/src/*"], + "@oko-wallet-sdk-cosmos/*": ["../../oko_sdk_variants/cosmos/src/*"] } }, "include": ["**/*.ts", "**/*.tsx"], diff --git a/sdk/sandboxes/sandbox_simple_host/vite.config.ts b/sandbox/sandbox_simple_host/vite.config.ts similarity index 100% rename from sdk/sandboxes/sandbox_simple_host/vite.config.ts rename to sandbox/sandbox_simple_host/vite.config.ts diff --git a/sdk/oko_sdk_core/src/methods/sign_in.ts b/sdk/oko_sdk_core/src/methods/sign_in.ts index 9841fd866..51becca75 100644 --- a/sdk/oko_sdk_core/src/methods/sign_in.ts +++ b/sdk/oko_sdk_core/src/methods/sign_in.ts @@ -14,6 +14,8 @@ const FIVE_MINS_MS = 5 * 60 * 1000; export async function signIn(this: OkoWalletInterface, type: "google") { await this.waitUntilInitialized; + // TODO: @hyunjae + // SDK takes oauth_sign_in_result msg from the popup window let signInRes: OkoWalletMsgOAuthSignInUpdate; try { diff --git a/sdk/oko_sdk_cosmos/src/types/modal.ts b/sdk/oko_sdk_cosmos/src/types/modal.ts index 8073de1b8..58edafd69 100644 --- a/sdk/oko_sdk_cosmos/src/types/modal.ts +++ b/sdk/oko_sdk_cosmos/src/types/modal.ts @@ -2,12 +2,12 @@ import type { MakeCosmosSigResult } from "@oko-wallet/oko-sdk-core"; export type OpenModalResult = | { - approved: true; - modal_id: string; - data: MakeCosmosSigResult; - } + approved: true; + modal_id: string; + data: MakeCosmosSigResult; + } | { - approved: false; - modal_id: string; - reason?: string; - }; + approved: false; + modal_id: string; + reason?: string; + }; diff --git a/ui/oko_common_ui/src/button/button.module.scss b/ui/oko_common_ui/src/button/button.module.scss index 4107c9f08..6951c0e63 100644 --- a/ui/oko_common_ui/src/button/button.module.scss +++ b/ui/oko_common_ui/src/button/button.module.scss @@ -6,7 +6,6 @@ border-radius: var(--radius-md, 8px); transition: background 0.2s ease; - border: none !important; outline: none; cursor: pointer; @@ -34,69 +33,77 @@ line-height: var(--font-line-height-md); } - &.disabled { - background: var(--bg-disabled); - color: var(--text-disabled); - border: 1px solid var(--border-disabled_subtle); - box-shadow: 0px 1px 2px 0px rgba(10, 13, 18, 0.05); - pointer-events: none; - cursor: not-allowed; - } - &.ghost { background: transparent; color: var(--text-primary); border: none; box-shadow: none; - &.loading { + &.loading:not(.disabled) { pointer-events: none; } + + &.disabled { + color: var(--fg-disabled); + border: none; + box-shadow: none; + cursor: not-allowed; + } } &.primary { + color: white; background: var(--bg-brand-solid); - border: 2px solid rgba(255, 255, 255, 0.12); - + border: 1px solid rgba(255, 255, 255, 0.12); box-shadow: var(--shadow-xs-skeuomorphic); - color: white; - - // TODO: Need to review brand color tokens [data-theme="dark"] &:not(.disabled) { color: var(--gray-800); } - [data-theme="dark"] &.disabled { - background: var(--white); - color: var(--brand-300); - } - - &:hover { + &:hover:not(.disabled) { background: var(--bg-brand-solid-hover); } - &.loading { + &.loading:not(.disabled) { pointer-events: none; background: var(--bg-brand-solid-hover); } + + &.disabled { + background: var(--bg-disabled); + color: var(--text-disabled); + border: 1px solid var(--border-disabled_subtle); + box-shadow: var(--shadow-xs); + cursor: not-allowed; + } + + [data-theme="dark"] &.disabled { + background: var(--brand-200); + color: var(--brand-300); + } } &.secondary { - background: var(--bg-primary); color: var(--text-primary); + background: var(--bg-primary); border: 1px solid var(--border-primary); + box-shadow: var(--shadow-xs); - box-shadow: var(--shadow-xs-skeuomorphic); - - &:hover { + &:hover:not(.disabled) { background: var(--bg-primary-hover); } - &.loading { + &.loading:not(.disabled) { pointer-events: none; background: var(--bg-primary-hover); } + + &.disabled { + color: var(--fg-disabled); + border: 1px solid var(--border-disabled_subtle); + cursor: not-allowed; + } } &:focus { diff --git a/ui/oko_common_ui/src/icons/edit.tsx b/ui/oko_common_ui/src/icons/edit.tsx index 2ef1bba74..757387d71 100644 --- a/ui/oko_common_ui/src/icons/edit.tsx +++ b/ui/oko_common_ui/src/icons/edit.tsx @@ -14,7 +14,7 @@ export const EditIcon: React.FC = ({ fill="none" className={className} > - + = ({ - width = 102, - height = 44, + width = 84, + height = 32, className, theme, }) => { diff --git a/ui/oko_common_ui/src/icons/oko_product_logo_icon.tsx b/ui/oko_common_ui/src/icons/oko_product_logo_icon.tsx index 7d4b9340c..af9760af8 100644 --- a/ui/oko_common_ui/src/icons/oko_product_logo_icon.tsx +++ b/ui/oko_common_ui/src/icons/oko_product_logo_icon.tsx @@ -3,6 +3,9 @@ import React from "react"; import { s3BucketURL } from "./paths"; import type { Theme } from "@oko-wallet-common-ui/theme/theme_provider"; +/** + * @deprecated Use OkoLogoIcon instead + */ export const OkoProductLogoIcon: React.FC = ({ width = 323.702, height = 128, diff --git a/ui/oko_common_ui/src/logo/logo.tsx b/ui/oko_common_ui/src/logo/logo.tsx index 8f99b2031..ecbda5e6f 100644 --- a/ui/oko_common_ui/src/logo/logo.tsx +++ b/ui/oko_common_ui/src/logo/logo.tsx @@ -10,8 +10,8 @@ export interface LogoProps { } export const Logo: React.FC = ({ - width = 102, - height = 44, + width = 58, + height = 22, className, theme, }) => { diff --git a/ui/oko_common_ui/src/styles/color_tokens.scss b/ui/oko_common_ui/src/styles/color_tokens.scss index e1fd589b0..b3405d924 100644 --- a/ui/oko_common_ui/src/styles/color_tokens.scss +++ b/ui/oko_common_ui/src/styles/color_tokens.scss @@ -212,7 +212,7 @@ $bg-brand-primary-dark: $brand-500; $bg-brand-primary-alt-dark: $gray-800-dark; $bg-brand-secondary-dark: $brand-600; $bg-brand-solid-dark: $brand-50; -$bg-brand-solid-hover-dark: $brand-100; +$bg-brand-solid-hover-dark: $brand-200; $bg-brand-section-dark: $gray-800-dark; $bg-brand-section-subtle-dark: $gray-950-dark; $bg-error-primary-dark: $error-950; diff --git a/yarn.lock b/yarn.lock index 69c8fb38c..6d056095c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,137 +19,178 @@ __metadata: languageName: node linkType: hard -"@algolia/abtesting@npm:1.8.0": - version: 1.8.0 - resolution: "@algolia/abtesting@npm:1.8.0" +"@ai-sdk/gateway@npm:2.0.7": + version: 2.0.7 + resolution: "@ai-sdk/gateway@npm:2.0.7" + dependencies: + "@ai-sdk/provider": "npm:2.0.0" + "@ai-sdk/provider-utils": "npm:3.0.16" + "@vercel/oidc": "npm:3.0.3" + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + checksum: 10c0/b57db87ccfbda6d28c8ac6e24df5e57a45f18826bff3ca5d1b65b00d863dd779d2b0d80496eee8eea8cbf6db232c31bd00494cd0d25e745cb402aa98b0b4d50d + languageName: node + linkType: hard + +"@ai-sdk/provider-utils@npm:3.0.16": + version: 3.0.16 + resolution: "@ai-sdk/provider-utils@npm:3.0.16" dependencies: - "@algolia/client-common": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/bd130b4208532a7acc9876f86def357c5bd9fbc4913436cd678711c784f5bedd09a51ab4141042771532fb0bbf9306f69b49acbe899516390c1354f6c99b6360 + "@ai-sdk/provider": "npm:2.0.0" + "@standard-schema/spec": "npm:^1.0.0" + eventsource-parser: "npm:^3.0.6" + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + checksum: 10c0/0922af1864b31aed4704174683d356c482199bf691c3d1a3e27cdedd574eec2249ea386b1081023d301a87e38dea09ec259ee45c5889316f7eed0de0a6064a49 languageName: node linkType: hard -"@algolia/autocomplete-core@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-core@npm:1.17.9" +"@ai-sdk/provider@npm:2.0.0": + version: 2.0.0 + resolution: "@ai-sdk/provider@npm:2.0.0" dependencies: - "@algolia/autocomplete-plugin-algolia-insights": "npm:1.17.9" - "@algolia/autocomplete-shared": "npm:1.17.9" - checksum: 10c0/e1111769a8723b9dd45fc38cd7edc535c86c1f908b84b5fdc5de06ba6b8c7aca14e5f52ebce84fa5f7adf857332e396b93b7e7933b157b2c9aefc0a19d9574ab + json-schema: "npm:^0.4.0" + checksum: 10c0/e50e520016c9fc0a8b5009cadd47dae2f1c81ec05c1792b9e312d7d15479f024ca8039525813a33425c884e3449019fed21043b1bfabd6a2626152ca9a388199 languageName: node linkType: hard -"@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9" +"@ai-sdk/react@npm:^2.0.30": + version: 2.0.90 + resolution: "@ai-sdk/react@npm:2.0.90" dependencies: - "@algolia/autocomplete-shared": "npm:1.17.9" + "@ai-sdk/provider-utils": "npm:3.0.16" + ai: "npm:5.0.90" + swr: "npm:^2.2.5" + throttleit: "npm:2.1.0" peerDependencies: - search-insights: ">= 1 < 3" - checksum: 10c0/05c21502631643abdcd6e9f70b5814a60d34bad59bca501e26e030fd72e689be5cecfb6e8939a0a1bdcb2394591e55e26a42a82c7247528eafeff714db0819a4 + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.25.76 || ^4.1.8 + peerDependenciesMeta: + zod: + optional: true + checksum: 10c0/924a188cfe1f23c5473de76ae979a3ba011b6c7c128a5d623f0828509e99e9c2e09ff4b4c50b277e9340c633437c916a970f19dfcac3583d5f72152c1f0f7e4d languageName: node linkType: hard -"@algolia/autocomplete-preset-algolia@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.17.9" +"@algolia/abtesting@npm:1.9.0": + version: 1.9.0 + resolution: "@algolia/abtesting@npm:1.9.0" dependencies: - "@algolia/autocomplete-shared": "npm:1.17.9" + "@algolia/client-common": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/efa332f470747213ef2196556549fa6f06f0f3d12b83070a75cda3879c83f29b18c7b7f9644a90ff3d80918dee75bf3fe758171d434dd2b488c9d10bf512e48b + languageName: node + linkType: hard + +"@algolia/autocomplete-core@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-core@npm:1.19.2" + dependencies: + "@algolia/autocomplete-plugin-algolia-insights": "npm:1.19.2" + "@algolia/autocomplete-shared": "npm:1.19.2" + checksum: 10c0/383952bc43a31f0771987416c350471824e480fcd15e1db8ae13386cd387879f1c81eadafceffa69f87e6b8e59fb1aa713da375fc07a30c5d8edb16a157b5f45 + languageName: node + linkType: hard + +"@algolia/autocomplete-plugin-algolia-insights@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.19.2" + dependencies: + "@algolia/autocomplete-shared": "npm:1.19.2" peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/99159c7e02a927d0d96717cb4cfd2f8dbc4da73267a8eae4f83af5bf74087089f6e7dbffd316512e713a4cc534e936b6a7ccb5c4a5ff84b4bf73f2d3cc050e79 + search-insights: ">= 1 < 3" + checksum: 10c0/8548b6514004dbf6fb34d6da176ac911371f3e84724ef6b94600cd84d29339d2f44cead03d7c0d507b130da0d9acc61f6e4c9a0fba6f967a5ae2a42eea93f0c1 languageName: node linkType: hard -"@algolia/autocomplete-shared@npm:1.17.9": - version: 1.17.9 - resolution: "@algolia/autocomplete-shared@npm:1.17.9" +"@algolia/autocomplete-shared@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-shared@npm:1.19.2" peerDependencies: "@algolia/client-search": ">= 4.9.1 < 6" algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/b318281aecdaae09171b47ee4f7bc66b613852cad4506e9d6278fff35ba68a12dd9cce2d90b5f4c3ba0e3d7d780583cbe46b22275260e41bbf09fb01e4a18f49 + checksum: 10c0/eee6615e6d9e6db7727727e442b876a554a6eda6f14c1d55d667ed2d14702c4c888a34b9bfb18f66ccc6d402995b2c7c37ace9f19ce9fc9c83bbb623713efbc4 languageName: node linkType: hard -"@algolia/client-abtesting@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/client-abtesting@npm:5.42.0" +"@algolia/client-abtesting@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/client-abtesting@npm:5.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/7710994ab96d0de6e8233ac5fac501cc41828a537824be8f892e86d205782c98d5caa804eb806a5e0f09040b9164a66455f7099835df97f20d5d30deee86a29d + "@algolia/client-common": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/c0901a51294008c4ea1c2cd3e3eff94bdc0602c277cd83a628312e1a35704cfd20dff9e1828ce40452e20a698ed704942c628dee9439752ad14041c83a9d4ae9 languageName: node linkType: hard -"@algolia/client-analytics@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/client-analytics@npm:5.42.0" +"@algolia/client-analytics@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/client-analytics@npm:5.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/dfa66e9472ff93cdbd873dd4ebe860dcc22d85e6740a07755d370d36815c4ffc0bb5206008e92ea6bba8e505042995268722dc8f86009cb451fe83082356f23e + "@algolia/client-common": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/027d8ebbaffdb1bf4b5f71c87956a5add4b6c95abe22b2d199aef4249bbe7ac223b0ffb298d2710f02a1037abef14ab360a9fcc2703131543c0101831a74a056 languageName: node linkType: hard -"@algolia/client-common@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/client-common@npm:5.42.0" - checksum: 10c0/138c0df97cb05d221b443835c06ac8bc389b016089492822db574f87fe05ed993c5c332974503adefecde7ed9b0a250e3e9ad485fc5c901503f2c41e5d3376aa +"@algolia/client-common@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/client-common@npm:5.43.0" + checksum: 10c0/1dc664a45fb32b7332bea58ad338d81a9961e681e7f6f5ddbec04446a61419098b6a273ff6c44c2d387c3d634461e7f9e91a9a91f52437e319e4483c8b0c3d28 languageName: node linkType: hard -"@algolia/client-insights@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/client-insights@npm:5.42.0" +"@algolia/client-insights@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/client-insights@npm:5.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/c0722b964b656c304817bebfe7c16e1f96483778e31570b20634f5dc901a737ae3f2d90ba37cc39a114e80c1db15265be74b7ec9307b111b83d75293ec9bccf7 + "@algolia/client-common": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/b32a29a6e6151d24b769608edabab56e80516d97fb6f39b0f95018f570b752087d22a28d0cf5be6ef28836c80188b03705661f72c831d9b2c7099c9049a23da8 languageName: node linkType: hard -"@algolia/client-personalization@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/client-personalization@npm:5.42.0" +"@algolia/client-personalization@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/client-personalization@npm:5.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/4da3748190a21008463ec13ddbad68602761f258bdf48e1ef9968180b4cfbffaf9dbbf5ce35d46c12f5e068b2f78ea019906a5e580dd975d4af4ec35f4eb09bd + "@algolia/client-common": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/57d3678a19d176ae8554b6642b3b959f1c6f0c938afcd24c2b3fa127b1bc7e89afb6dcf3715ae73e70e70a5c9b0afdbd4edbaf41e032ec18b2f607ec115eeb6e languageName: node linkType: hard -"@algolia/client-query-suggestions@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/client-query-suggestions@npm:5.42.0" +"@algolia/client-query-suggestions@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/client-query-suggestions@npm:5.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/5251824752a9016f238806a080d287df95f30fd7a59f0be51603fc9094d6e904bfc493a4f3473f2812acc692778186b331dd04c5dbbb64d2196e5398b30fdb4a + "@algolia/client-common": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/1c5f9d8c49bf060c1d156b4828daf5538a314d9f7c84f9690ffbbdd24c2bf8a212ec330396f5eb9fb6f791ae65e5a7d37e7680454bd734e644ae75535eadce32 languageName: node linkType: hard -"@algolia/client-search@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/client-search@npm:5.42.0" +"@algolia/client-search@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/client-search@npm:5.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/924004c973b907a854e6405f8c82d5fd9cdb76502f43297c1def159c14271300913541536313059b5694a90ed46563fca918d125c6eef705177785848aec28d7 + "@algolia/client-common": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/ce6c8a4062e45c3d4120d88382164b1b0370b3196e9cc42c650289f8506271237985f2750eb4e1040652ae18e59ae61a695dbea3070e9c1a1f0439f5fdb5d5e7 languageName: node linkType: hard @@ -160,66 +201,66 @@ __metadata: languageName: node linkType: hard -"@algolia/ingestion@npm:1.42.0": - version: 1.42.0 - resolution: "@algolia/ingestion@npm:1.42.0" +"@algolia/ingestion@npm:1.43.0": + version: 1.43.0 + resolution: "@algolia/ingestion@npm:1.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/2e9e34d9e01349a3e733cb680103ae4b0bfe018d147e35bcd68f4e97eddc610cef4c7eb0d134146fc4d7d199e7d99e7fa3c8c350422b2d0520e3c80f6821924d + "@algolia/client-common": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/1506d55f6afcb99690020a7d405438f2bbf8ac797696dd78ff4a534c4165c6a5cbda338321ae2b6d9d7e794f1f9edbbc1acf1c38ea0f6aebcc100efd17eaf6f9 languageName: node linkType: hard -"@algolia/monitoring@npm:1.42.0": - version: 1.42.0 - resolution: "@algolia/monitoring@npm:1.42.0" +"@algolia/monitoring@npm:1.43.0": + version: 1.43.0 + resolution: "@algolia/monitoring@npm:1.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/a39bb7f7c9f0be24d349e179411fbc5801dac43e5589c124640edb44edb76b5cf907106c9667c047484ed90a870285581b9bcb0b22415acf8d5b0595edac2ea0 + "@algolia/client-common": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/5e009d0d2a0db5ab051d4fc162e6917db4e712d9a9d38a1c93386f636b09cf201301a179b5fd61859a89ca95d10e9c3f92f12d1255f6062f804cb816c52db4f5 languageName: node linkType: hard -"@algolia/recommend@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/recommend@npm:5.42.0" +"@algolia/recommend@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/recommend@npm:5.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/7a14e8bf8e834084f1835a6b167c45627d70a561d63e38f40d57e9c27527f34356456fe07b9bf2b57372ce79418628027c9c90d63f28305d0af591d018851384 + "@algolia/client-common": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/1cf71f21bd1e6d2511bbe3e954b2cf0dd7676480dbbff7b5ca561aca44316ad9cc3024bf4f92e6265f57c35d1cc46960369ec25f05222c3f1cdc31c5b5540ee5 languageName: node linkType: hard -"@algolia/requester-browser-xhr@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/requester-browser-xhr@npm:5.42.0" +"@algolia/requester-browser-xhr@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/requester-browser-xhr@npm:5.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - checksum: 10c0/a2a8118952d9c210bb6e5ca873df1a1316ae0ad5d64fbb5541ef7f88a8ab882b1bb7d026ca20a4a90dc674ea7aa9b6d4f6a8da99f6b40d0bb3b70a7e49e8049c + "@algolia/client-common": "npm:5.43.0" + checksum: 10c0/b770225c0c314e922f01b15628944df55cc509130d2512919d23509d8b1b7f4155b37d1069397dab6a87696a11976e9ba4062f0929760211e59085d49caf03fc languageName: node linkType: hard -"@algolia/requester-fetch@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/requester-fetch@npm:5.42.0" +"@algolia/requester-fetch@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/requester-fetch@npm:5.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - checksum: 10c0/d148b58a48f87cdd7b6d1a84fe8532de3430a098c3edcef5d9c44eaa260439f7e66d3f7138c757554efef4fe1f4aee784667f06f50ddcfa70b66804a18ff0f59 + "@algolia/client-common": "npm:5.43.0" + checksum: 10c0/d8991476759699fdc7c7edb537bf689b97b2a49296c68508dd833a124e45bf9b6f7d90ed3facf74f53a3d019aad64ab2864a7678e1827165f6767dfc59b0cf2f languageName: node linkType: hard -"@algolia/requester-node-http@npm:5.42.0": - version: 5.42.0 - resolution: "@algolia/requester-node-http@npm:5.42.0" +"@algolia/requester-node-http@npm:5.43.0": + version: 5.43.0 + resolution: "@algolia/requester-node-http@npm:5.43.0" dependencies: - "@algolia/client-common": "npm:5.42.0" - checksum: 10c0/eef184935e649b14894bda9e82aac2010e8ebe5ce4f5133bfe0d72bbf356181fc82b503d51a4fc00a6debe751abe2138009a2f37825b710075433d85c78b38ee + "@algolia/client-common": "npm:5.43.0" + checksum: 10c0/91273291d6b32f9b1c7bde7c3a3316512349434e77a1c1ccc626db613c0694f2cb2c1c88cafdb592fce8e18e0fdfe300562fd671ac9ba98d9ffe8cbbf02d0ad4 languageName: node linkType: hard @@ -1453,7 +1494,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.27.1": version: 7.27.1 resolution: "@babel/code-frame@npm:7.27.1" dependencies: @@ -4284,21 +4325,43 @@ __metadata: languageName: node linkType: hard -"@docsearch/css@npm:3.9.0": - version: 3.9.0 - resolution: "@docsearch/css@npm:3.9.0" - checksum: 10c0/6300551e1cab7a5487063ec3581ae78ddaee3d93ec799556b451054448559b3ba849751b825fbd8b678367ef944bd82b3f11bc1d9e74e08e3cc48db40487b396 +"@docsearch/core@npm:4.3.1": + version: 4.3.1 + resolution: "@docsearch/core@npm:4.3.1" + peerDependencies: + "@types/react": ">= 16.8.0 < 20.0.0" + react: ">= 16.8.0 < 20.0.0" + react-dom: ">= 16.8.0 < 20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + react-dom: + optional: true + checksum: 10c0/e43d62b4b339fa9d7780703f6c98e63fa57e8e6ceb749fee5eed4f6649e84cddd13c513471c09405c8082540ae0b0045a4196b93edf5fa873410a2b110a6ea12 languageName: node linkType: hard -"@docsearch/react@npm:^3.9.0": - version: 3.9.0 - resolution: "@docsearch/react@npm:3.9.0" +"@docsearch/css@npm:4.3.1": + version: 4.3.1 + resolution: "@docsearch/css@npm:4.3.1" + checksum: 10c0/1fb25eecf7e6c40709a70b1178962b8d07fc88025d2c6cabb7cb0b812c2a113a28c8c4b0174ac9d79ea3513a95c547caacba0101ed762613c2b8ea3e34c7b84f + languageName: node + linkType: hard + +"@docsearch/react@npm:^3.9.0 || ^4.1.0": + version: 4.3.1 + resolution: "@docsearch/react@npm:4.3.1" dependencies: - "@algolia/autocomplete-core": "npm:1.17.9" - "@algolia/autocomplete-preset-algolia": "npm:1.17.9" - "@docsearch/css": "npm:3.9.0" - algoliasearch: "npm:^5.14.2" + "@ai-sdk/react": "npm:^2.0.30" + "@algolia/autocomplete-core": "npm:1.19.2" + "@docsearch/core": "npm:4.3.1" + "@docsearch/css": "npm:4.3.1" + ai: "npm:^5.0.30" + algoliasearch: "npm:^5.28.0" + marked: "npm:^16.3.0" + zod: "npm:^4.1.8" peerDependencies: "@types/react": ">= 16.8.0 < 20.0.0" react: ">= 16.8.0 < 20.0.0" @@ -4313,13 +4376,13 @@ __metadata: optional: true search-insights: optional: true - checksum: 10c0/5e737a5d9ef1daae1cd93e89870214c1ab0c36a3a2193e898db044bcc5d9de59f85228b2360ec0e8f10cdac7fd2fe3c6ec8a05d943ee7e17d6c1cef2e6e9ff2d + checksum: 10c0/867db4ba2dc826d15a54992271600b50c38b79ff002dcd8d3a6fc0a89d716901b108bd9a9a01db6e273084f78d2e383706ae4c173a0a98a114f1e01ecf0c1e0a languageName: node linkType: hard -"@docusaurus/babel@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/babel@npm:3.6.3" +"@docusaurus/babel@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/babel@npm:3.9.2" dependencies: "@babel/core": "npm:^7.25.9" "@babel/generator": "npm:^7.25.9" @@ -4331,86 +4394,25 @@ __metadata: "@babel/runtime": "npm:^7.25.9" "@babel/runtime-corejs3": "npm:^7.25.9" "@babel/traverse": "npm:^7.25.9" - "@docusaurus/logger": "npm:3.6.3" - "@docusaurus/utils": "npm:3.6.3" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" babel-plugin-dynamic-import-node: "npm:^2.3.3" fs-extra: "npm:^11.1.1" tslib: "npm:^2.6.0" - checksum: 10c0/b4436423a95afa60709ec285e56f93c7825274bcacbf6ede1fb9aea1ee02095ab8179456c0a7ba7070fa216f3a6a46db7493b3abb5cd54f4d76cf154bd978b8f - languageName: node - linkType: hard - -"@docusaurus/babel@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/babel@npm:3.8.1" - dependencies: - "@babel/core": "npm:^7.25.9" - "@babel/generator": "npm:^7.25.9" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-transform-runtime": "npm:^7.25.9" - "@babel/preset-env": "npm:^7.25.9" - "@babel/preset-react": "npm:^7.25.9" - "@babel/preset-typescript": "npm:^7.25.9" - "@babel/runtime": "npm:^7.25.9" - "@babel/runtime-corejs3": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - babel-plugin-dynamic-import-node: "npm:^2.3.3" - fs-extra: "npm:^11.1.1" - tslib: "npm:^2.6.0" - checksum: 10c0/dc57cf46e70a66547a576c32d30c7a8f61171b860604fdcd04812dcff45e07470796beaee11cb407a0a32a4fda474d373218907e9e85d5ef220145eca5baf898 - languageName: node - linkType: hard - -"@docusaurus/bundler@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/bundler@npm:3.6.3" - dependencies: - "@babel/core": "npm:^7.25.9" - "@docusaurus/babel": "npm:3.6.3" - "@docusaurus/cssnano-preset": "npm:3.6.3" - "@docusaurus/logger": "npm:3.6.3" - "@docusaurus/types": "npm:3.6.3" - "@docusaurus/utils": "npm:3.6.3" - babel-loader: "npm:^9.2.1" - clean-css: "npm:^5.3.2" - copy-webpack-plugin: "npm:^11.0.0" - css-loader: "npm:^6.8.1" - css-minimizer-webpack-plugin: "npm:^5.0.1" - cssnano: "npm:^6.1.2" - file-loader: "npm:^6.2.0" - html-minifier-terser: "npm:^7.2.0" - mini-css-extract-plugin: "npm:^2.9.1" - null-loader: "npm:^4.0.1" - postcss: "npm:^8.4.26" - postcss-loader: "npm:^7.3.3" - postcss-preset-env: "npm:^10.1.0" - react-dev-utils: "npm:^12.0.1" - terser-webpack-plugin: "npm:^5.3.9" - tslib: "npm:^2.6.0" - url-loader: "npm:^4.1.1" - webpack: "npm:^5.95.0" - webpackbar: "npm:^6.0.1" - peerDependencies: - "@docusaurus/faster": "*" - peerDependenciesMeta: - "@docusaurus/faster": - optional: true - checksum: 10c0/abe5fc932fe2c884f2d554b61e8e56ec21c629a4dc28c6b9d199639b10beb83c37e0e47bab1ed8bee40b171ce4afa1dbdce5494fcac8b3089b44a6e170b6d499 + checksum: 10c0/8147451a8ba79d35405ec8720c1cded7e84643867cb32877827799e5d36932cf56beaefd9fe4b25b9d855b38a9c08bc5397faddf73b63d7c52b05bf24ca99ee8 languageName: node linkType: hard -"@docusaurus/bundler@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/bundler@npm:3.8.1" +"@docusaurus/bundler@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/bundler@npm:3.9.2" dependencies: "@babel/core": "npm:^7.25.9" - "@docusaurus/babel": "npm:3.8.1" - "@docusaurus/cssnano-preset": "npm:3.8.1" - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/babel": "npm:3.9.2" + "@docusaurus/cssnano-preset": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" babel-loader: "npm:^9.2.1" clean-css: "npm:^5.3.3" copy-webpack-plugin: "npm:^11.0.0" @@ -4434,78 +4436,21 @@ __metadata: peerDependenciesMeta: "@docusaurus/faster": optional: true - checksum: 10c0/9ef18bf742f3ff582baaf1ce18e676b2886136c1bd56f479cb9eb30e04ed96a2fd97457d3dd418c8360856a19ed59a86e5253bd3e4382688c1abd841f7729257 - languageName: node - linkType: hard - -"@docusaurus/core@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/core@npm:3.6.3" - dependencies: - "@docusaurus/babel": "npm:3.6.3" - "@docusaurus/bundler": "npm:3.6.3" - "@docusaurus/logger": "npm:3.6.3" - "@docusaurus/mdx-loader": "npm:3.6.3" - "@docusaurus/utils": "npm:3.6.3" - "@docusaurus/utils-common": "npm:3.6.3" - "@docusaurus/utils-validation": "npm:3.6.3" - boxen: "npm:^6.2.1" - chalk: "npm:^4.1.2" - chokidar: "npm:^3.5.3" - cli-table3: "npm:^0.6.3" - combine-promises: "npm:^1.1.0" - commander: "npm:^5.1.0" - core-js: "npm:^3.31.1" - del: "npm:^6.1.1" - detect-port: "npm:^1.5.1" - escape-html: "npm:^1.0.3" - eta: "npm:^2.2.0" - eval: "npm:^0.1.8" - fs-extra: "npm:^11.1.1" - html-tags: "npm:^3.3.1" - html-webpack-plugin: "npm:^5.6.0" - leven: "npm:^3.1.0" - lodash: "npm:^4.17.21" - p-map: "npm:^4.0.0" - prompts: "npm:^2.4.2" - react-dev-utils: "npm:^12.0.1" - react-helmet-async: "npm:^1.3.0" - react-loadable: "npm:@docusaurus/react-loadable@6.0.0" - react-loadable-ssr-addon-v5-slorber: "npm:^1.0.1" - react-router: "npm:^5.3.4" - react-router-config: "npm:^5.1.1" - react-router-dom: "npm:^5.3.4" - rtl-detect: "npm:^1.0.4" - semver: "npm:^7.5.4" - serve-handler: "npm:^6.1.6" - shelljs: "npm:^0.8.5" - tslib: "npm:^2.6.0" - update-notifier: "npm:^6.0.2" - webpack: "npm:^5.95.0" - webpack-bundle-analyzer: "npm:^4.10.2" - webpack-dev-server: "npm:^4.15.2" - webpack-merge: "npm:^6.0.1" - peerDependencies: - "@mdx-js/react": ^3.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 - bin: - docusaurus: bin/docusaurus.mjs - checksum: 10c0/551e7af994bb41ccbe9866bb380def55ed03316b4de5ae2b5ad98721f3cc0a209ed86becb70dac80c360c36767b4d1375115de190ac1c11b28e813ee8c38ebd6 + checksum: 10c0/dcbb7d51eef3fcd57161cb356f63487dbc5a433eea02bc0dfb2a59439884543e76efa3c311ca01c582c2ca33caff19e887303bf72aad04ee374fd013fdcca31f languageName: node linkType: hard -"@docusaurus/core@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/core@npm:3.8.1" +"@docusaurus/core@npm:3.9.2, @docusaurus/core@npm:^3.0.0": + version: 3.9.2 + resolution: "@docusaurus/core@npm:3.9.2" dependencies: - "@docusaurus/babel": "npm:3.8.1" - "@docusaurus/bundler": "npm:3.8.1" - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/mdx-loader": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-common": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/babel": "npm:3.9.2" + "@docusaurus/bundler": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" boxen: "npm:^6.2.1" chalk: "npm:^4.1.2" chokidar: "npm:^3.5.3" @@ -4539,7 +4484,7 @@ __metadata: update-notifier: "npm:^6.0.2" webpack: "npm:^5.95.0" webpack-bundle-analyzer: "npm:^4.10.2" - webpack-dev-server: "npm:^4.15.2" + webpack-dev-server: "npm:^5.2.2" webpack-merge: "npm:^6.0.1" peerDependencies: "@mdx-js/react": ^3.0.0 @@ -4547,96 +4492,39 @@ __metadata: react-dom: ^18.0.0 || ^19.0.0 bin: docusaurus: bin/docusaurus.mjs - checksum: 10c0/bd9fab011b034bef800d752ff58a6a6e33061fb6d891b32f1b296f41435ff31ddd1e97cf3c49c2cb9d4ecddcef4b1b7e23b900b444d8362eb14e8090fdfda7d8 + checksum: 10c0/6058e2ca596ba0225f26f15baaf0c8fa5e91ddf794c3b942161702c44833baaf15be3acb71d42cf6e359a83e80be609485b6c1080802927591fe38bfc915aa11 languageName: node linkType: hard -"@docusaurus/cssnano-preset@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/cssnano-preset@npm:3.6.3" - dependencies: - cssnano-preset-advanced: "npm:^6.1.2" - postcss: "npm:^8.4.38" - postcss-sort-media-queries: "npm:^5.2.0" - tslib: "npm:^2.6.0" - checksum: 10c0/0289e37587d05dd3fd197d1014c083192e391f28e33baf465941e54086f182bf65938e56f8e346cec6c4323fbb359139564b48ee236f3b45ae6f28f44d1e79c1 - languageName: node - linkType: hard - -"@docusaurus/cssnano-preset@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/cssnano-preset@npm:3.8.1" +"@docusaurus/cssnano-preset@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/cssnano-preset@npm:3.9.2" dependencies: cssnano-preset-advanced: "npm:^6.1.2" postcss: "npm:^8.5.4" postcss-sort-media-queries: "npm:^5.2.0" tslib: "npm:^2.6.0" - checksum: 10c0/95261dd22d2c0eafd232e27430035783c421a469026b9dd2bcb878e1682c1e947112cef009e77db0b23f571a04c2037ac1959a251da23c5e3f39104376e5cf07 - languageName: node - linkType: hard - -"@docusaurus/logger@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/logger@npm:3.6.3" - dependencies: - chalk: "npm:^4.1.2" - tslib: "npm:^2.6.0" - checksum: 10c0/3119c8c586d6c5dba5595d8b795903c808ffa5011cb0e945b32cb011457f18f79909aca2f9864a5122ccfe32ecba9fd9c7fa1477d534febbcc5d3855a0daab91 + checksum: 10c0/98ca8939ba9c7c6d45cccdaa4028412cd84ea04c39b641d14e3870ee880d83cef8e04cdb485327b36e40550676ee1d614f1e89c9aa822b78e7d0c7dc0321f8db languageName: node linkType: hard -"@docusaurus/logger@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/logger@npm:3.8.1" +"@docusaurus/logger@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/logger@npm:3.9.2" dependencies: chalk: "npm:^4.1.2" tslib: "npm:^2.6.0" - checksum: 10c0/2943773f1917eb3688437123e137229a1042e4defa8432b255b9d44860c643bfdd8a10fbd544ceb2df33e5100748b113c6ebcb8df0dbcdac9316a7748dafd88e - languageName: node - linkType: hard - -"@docusaurus/mdx-loader@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/mdx-loader@npm:3.6.3" - dependencies: - "@docusaurus/logger": "npm:3.6.3" - "@docusaurus/utils": "npm:3.6.3" - "@docusaurus/utils-validation": "npm:3.6.3" - "@mdx-js/mdx": "npm:^3.0.0" - "@slorber/remark-comment": "npm:^1.0.0" - escape-html: "npm:^1.0.3" - estree-util-value-to-estree: "npm:^3.0.1" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - image-size: "npm:^1.0.2" - mdast-util-mdx: "npm:^3.0.0" - mdast-util-to-string: "npm:^4.0.0" - rehype-raw: "npm:^7.0.0" - remark-directive: "npm:^3.0.0" - remark-emoji: "npm:^4.0.0" - remark-frontmatter: "npm:^5.0.0" - remark-gfm: "npm:^4.0.0" - stringify-object: "npm:^3.3.0" - tslib: "npm:^2.6.0" - unified: "npm:^11.0.3" - unist-util-visit: "npm:^5.0.0" - url-loader: "npm:^4.1.1" - vfile: "npm:^6.0.1" - webpack: "npm:^5.88.1" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/c8d358c665176bb185284c38d7465fcefce4f0da4ac7cc83f25b5258c4489cdaa2916b183d83f47e0af33158a22cd06af1ffd383f8aac04549393f4c544c56bc + checksum: 10c0/a21e0796873386a9be56f25906092a5d67c9bba5e52abf88e4c3c69d7c1e21467c04b3650c2ff2b9a803507aa4946c4173612791a87f04480d63ed87207b124a languageName: node linkType: hard -"@docusaurus/mdx-loader@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/mdx-loader@npm:3.8.1" +"@docusaurus/mdx-loader@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/mdx-loader@npm:3.9.2" dependencies: - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" "@mdx-js/mdx": "npm:^3.0.0" "@slorber/remark-comment": "npm:^1.0.0" escape-html: "npm:^1.0.3" @@ -4661,15 +4549,15 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/dc5a2c01eb0bff5648799bd797ac8f8b81e1a12a5a99cfc11549390d49ff28ac2e9b20e10cc5d8dd117c59de33753faaae5c1a5a762f54ad01ffa01aea112a56 + checksum: 10c0/4f3afa817f16fd04dd338a35c04be59fdc0e799a93c6d56dc99b1f42f9a5156691737df62751e14466acbbd65c932e1f77d06a915c9c4ad8f2ad24b2f5479269 languageName: node linkType: hard -"@docusaurus/module-type-aliases@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/module-type-aliases@npm:3.8.1" +"@docusaurus/module-type-aliases@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/module-type-aliases@npm:3.9.2" dependencies: - "@docusaurus/types": "npm:3.8.1" + "@docusaurus/types": "npm:3.9.2" "@types/history": "npm:^4.7.11" "@types/react": "npm:*" "@types/react-router-config": "npm:*" @@ -4679,42 +4567,42 @@ __metadata: peerDependencies: react: "*" react-dom: "*" - checksum: 10c0/85e2ba80e628dd637607fd18eaa4619b09f7d201afcc3f087ce73cddd141e6e1d894c3936aeae135113faa5845d37144358ae1434557719e7da1f746b288024e + checksum: 10c0/60f163ff9004bb1fcbbad94b18200b6bca967da14576f78f5c533f8535aae0a3a723245cb28e1ca93f9d5881d3f1077e03ebf12bbad59d0e1c6916300d086642 languageName: node linkType: hard -"@docusaurus/plugin-client-redirects@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/plugin-client-redirects@npm:3.6.3" +"@docusaurus/plugin-client-redirects@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-client-redirects@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.6.3" - "@docusaurus/logger": "npm:3.6.3" - "@docusaurus/utils": "npm:3.6.3" - "@docusaurus/utils-common": "npm:3.6.3" - "@docusaurus/utils-validation": "npm:3.6.3" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" eta: "npm:^2.2.0" fs-extra: "npm:^11.1.1" lodash: "npm:^4.17.21" tslib: "npm:^2.6.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/3bc4a215471c9bd4d080fc5f9294ae67fdcfed2c97d181ed6b8d6b39fc44f0b29b9349a026b14feb94a5cd8cb172e23f4109c61e285d10ed2aed4c2f5a44bd3c + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/5fe827fa5f3b3e4634034eb63ff73d8bd2e83852ada6ae989ad5b566aaef4937476c20403e1ef05f2090dad92c2e6b384e0981d393a783b49e8b45fa464d282b languageName: node linkType: hard -"@docusaurus/plugin-content-blog@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/plugin-content-blog@npm:3.8.1" +"@docusaurus/plugin-content-blog@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-content-blog@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/mdx-loader": "npm:3.8.1" - "@docusaurus/theme-common": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-common": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/theme-common": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" cheerio: "npm:1.0.0-rc.12" feed: "npm:^4.2.2" fs-extra: "npm:^11.1.1" @@ -4729,23 +4617,23 @@ __metadata: "@docusaurus/plugin-content-docs": "*" react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/03eaee437a77f73f0de47cfc8aea1de117f9e342e0349ab2767584666098b4a3013041f56d502cbf0531e5ced9f6d8951fc6f1b63600f48b9e039c6a9618d3fe + checksum: 10c0/98f82d76d248407a4c53f922f8953a7519a57d18c45f71e41bfb6380d7f801ba063068c9dec2a48b79f10fd4d4f4a909af4c70e4874223db19d9654d651982dd languageName: node linkType: hard -"@docusaurus/plugin-content-docs@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/plugin-content-docs@npm:3.8.1" +"@docusaurus/plugin-content-docs@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-content-docs@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/mdx-loader": "npm:3.8.1" - "@docusaurus/module-type-aliases": "npm:3.8.1" - "@docusaurus/theme-common": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-common": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/module-type-aliases": "npm:3.9.2" + "@docusaurus/theme-common": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" "@types/react-router-config": "npm:^5.0.7" combine-promises: "npm:^1.1.0" fs-extra: "npm:^11.1.1" @@ -4758,133 +4646,133 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/243d4caa64632400d8f7f5815bb4de95413f06cfdacb6ddf81e20ee58aaf6f1df52b0b82b95ec166997ab3dbe8ff6240e1eb55ee6c0979f521a69a88c2168b64 + checksum: 10c0/f2df62f6e03a383a8e7f81b29bea81de9b69e918dfaa668cef15a6f787943d3c148bfd8ba120d89cd96a3bbb23cd3d29ce0658f8dee07380ad612db66e835fa4 languageName: node linkType: hard -"@docusaurus/plugin-content-pages@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/plugin-content-pages@npm:3.8.1" +"@docusaurus/plugin-content-pages@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-content-pages@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/mdx-loader": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" fs-extra: "npm:^11.1.1" tslib: "npm:^2.6.0" webpack: "npm:^5.88.1" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/d940a966154674f00ffabccd84fc92f14a7a61c1f300da34944e4b79b5eb34951a5d6b0f33c62ea07b787c7131adb6e926b415ca30467439d5afac3cd2b64d34 + checksum: 10c0/294cbd3d127b9a777ab75c13be30e2a559b544bc96798ac6b6d479130f66b95dd6beaf1ca63991f78c279add23ffe16ea14454d3547d558196e747bdb85cb753 languageName: node linkType: hard -"@docusaurus/plugin-css-cascade-layers@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/plugin-css-cascade-layers@npm:3.8.1" +"@docusaurus/plugin-css-cascade-layers@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-css-cascade-layers@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" tslib: "npm:^2.6.0" - checksum: 10c0/a2967dd203c572aa627ecd5cadb90cca1c1515b1f1b8c6db6b7e9ce4490fecc62bedf73a8a7284934aa87ce0a369fefe7521328eefa482edfbf351ff23db91fa + checksum: 10c0/3a56f6f4eaa3c1ea014ba25b8d16e2a7ffb144ebf5726b5ec531b4df0a9f7bb33ced4de7ca31f9663a65358852d0635c584244c05f07e9d4c9172f80ba21a5ca languageName: node linkType: hard -"@docusaurus/plugin-debug@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/plugin-debug@npm:3.8.1" +"@docusaurus/plugin-debug@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-debug@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" fs-extra: "npm:^11.1.1" react-json-view-lite: "npm:^2.3.0" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/50ab5e510a7e4295daa9290b56a6b0dd18bb0fde42e002e5ba33bc4551e55077dc360b625b0e9d63a2f3c09ba53414984210550b362161bd2fb76460cb96768c + checksum: 10c0/46819f1c22b31b3fbf30243dc5c0439b35a35f8cbbae835becf1e6992ff490ddbd91e4a7448b367ad76aaf20064ed739be07f0e664bb582b4dab39513996d7ba languageName: node linkType: hard -"@docusaurus/plugin-google-analytics@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/plugin-google-analytics@npm:3.8.1" +"@docusaurus/plugin-google-analytics@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-google-analytics@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/9c2eb5c2678d04d35d855252077f33b761757575fad4e6e1526e538fc1c62174d88117cc2a4ec62ee98d83ad2ece2edfff089107469dfc5dda30d8dc65251776 + checksum: 10c0/6fb787132170f731c1ab66c854fcab6d0c4f7919d60c336185942c8f80dc93b286e64e0bfb22f5f770e7d77fd02000fb5a54b35a357258a0cc6a59468778199e languageName: node linkType: hard -"@docusaurus/plugin-google-gtag@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/plugin-google-gtag@npm:3.8.1" +"@docusaurus/plugin-google-gtag@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-google-gtag@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" "@types/gtag.js": "npm:^0.0.12" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/77d6532fef8e442fe73fc12560358606e3c3d395f059ff69a677be7dc1de1e220283eabf8f856eb753c075f61f09774147d504c10ec4b0cf5b6aeb5284ace6dd + checksum: 10c0/34d4b9c6787e3656dc1af42ecb31a41b766735c89f7a719db40c34a8695aa36825e070923a84639ae3dc42b64a41ee656bd4b2728621c1493952c4efa04b3927 languageName: node linkType: hard -"@docusaurus/plugin-google-tag-manager@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/plugin-google-tag-manager@npm:3.8.1" +"@docusaurus/plugin-google-tag-manager@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-google-tag-manager@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/e3d3ae5839479646d418040f6864abc70b15e62b5021dd9fcd18529de7199970d33c59f4174ee99561dc8dff74fa1828698d8b53adf30baaaf656c1df3d8abd1 + checksum: 10c0/536cb63dc4a22a456e5b7f1d8b53acf0c45b16ba8fb7474c93d5ab7afec60682feccea65c39685dcbc568fccefd6629264e9b979e0f7069fb4c9dc816048659b languageName: node linkType: hard -"@docusaurus/plugin-sitemap@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/plugin-sitemap@npm:3.8.1" +"@docusaurus/plugin-sitemap@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-sitemap@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-common": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" fs-extra: "npm:^11.1.1" sitemap: "npm:^7.1.1" tslib: "npm:^2.6.0" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/6d32d0177e38364f281f85f4a777918de33d7202a73146f210e12ca818d1b9af31d42e63bce03a668435b39e2108fe75866d55ecd1268e557e89d55d264d61a6 + checksum: 10c0/a1bcbb8ab2531eaa810e74a7c5800942d89a11cfaf544d6d72941c7e37c29eaef609dcaff368ee92cf759e03be7c258c6e5e4cfc6046d77e727a63f84e63a045 languageName: node linkType: hard -"@docusaurus/plugin-svgr@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/plugin-svgr@npm:3.8.1" +"@docusaurus/plugin-svgr@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-svgr@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" "@svgr/core": "npm:8.1.0" "@svgr/webpack": "npm:^8.1.0" tslib: "npm:^2.6.0" @@ -4892,56 +4780,55 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/65177cbe0a85f551332a84b2aaa880e5a198582df712ebbbe031dc2ce3f22c8c4ed362ff23424625ea2c3012a7d422b11b25e712868e296626842e6ab00077a7 - languageName: node - linkType: hard - -"@docusaurus/preset-classic@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/preset-classic@npm:3.8.1" - dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/plugin-content-blog": "npm:3.8.1" - "@docusaurus/plugin-content-docs": "npm:3.8.1" - "@docusaurus/plugin-content-pages": "npm:3.8.1" - "@docusaurus/plugin-css-cascade-layers": "npm:3.8.1" - "@docusaurus/plugin-debug": "npm:3.8.1" - "@docusaurus/plugin-google-analytics": "npm:3.8.1" - "@docusaurus/plugin-google-gtag": "npm:3.8.1" - "@docusaurus/plugin-google-tag-manager": "npm:3.8.1" - "@docusaurus/plugin-sitemap": "npm:3.8.1" - "@docusaurus/plugin-svgr": "npm:3.8.1" - "@docusaurus/theme-classic": "npm:3.8.1" - "@docusaurus/theme-common": "npm:3.8.1" - "@docusaurus/theme-search-algolia": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" + checksum: 10c0/d6a7a1aa0c05b759d6094969d31d05cb7840ee514a60812f8e841e13c2cf319a46d046c0903417e9072b8bc26a9fd0d63e7e5a75255ed7d6b08a9a0466f6cb1a + languageName: node + linkType: hard + +"@docusaurus/preset-classic@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/preset-classic@npm:3.9.2" + dependencies: + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/plugin-content-blog": "npm:3.9.2" + "@docusaurus/plugin-content-docs": "npm:3.9.2" + "@docusaurus/plugin-content-pages": "npm:3.9.2" + "@docusaurus/plugin-css-cascade-layers": "npm:3.9.2" + "@docusaurus/plugin-debug": "npm:3.9.2" + "@docusaurus/plugin-google-analytics": "npm:3.9.2" + "@docusaurus/plugin-google-gtag": "npm:3.9.2" + "@docusaurus/plugin-google-tag-manager": "npm:3.9.2" + "@docusaurus/plugin-sitemap": "npm:3.9.2" + "@docusaurus/plugin-svgr": "npm:3.9.2" + "@docusaurus/theme-classic": "npm:3.9.2" + "@docusaurus/theme-common": "npm:3.9.2" + "@docusaurus/theme-search-algolia": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/2d32afe5867baf0b3baafdb965b490520cbf9c7939ca3ded489170b24eb779141ffbf46bdd9d8412fc05adf39440937a83b3218fe4571f52776f20f797786697 - languageName: node - linkType: hard - -"@docusaurus/theme-classic@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/theme-classic@npm:3.8.1" - dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/mdx-loader": "npm:3.8.1" - "@docusaurus/module-type-aliases": "npm:3.8.1" - "@docusaurus/plugin-content-blog": "npm:3.8.1" - "@docusaurus/plugin-content-docs": "npm:3.8.1" - "@docusaurus/plugin-content-pages": "npm:3.8.1" - "@docusaurus/theme-common": "npm:3.8.1" - "@docusaurus/theme-translations": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-common": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" + checksum: 10c0/94e6f3948592209bd68b797591f21daee8543c6c9a4eac5ae498f5c6b8d1c7579b23173f8554a3430d0dff1cce90b953be0d5f2d53b6b4729116000f61e3dab2 + languageName: node + linkType: hard + +"@docusaurus/theme-classic@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-classic@npm:3.9.2" + dependencies: + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/module-type-aliases": "npm:3.9.2" + "@docusaurus/plugin-content-blog": "npm:3.9.2" + "@docusaurus/plugin-content-docs": "npm:3.9.2" + "@docusaurus/plugin-content-pages": "npm:3.9.2" + "@docusaurus/theme-common": "npm:3.9.2" + "@docusaurus/theme-translations": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" "@mdx-js/react": "npm:^3.0.0" clsx: "npm:^2.0.0" - copy-text-to-clipboard: "npm:^3.2.0" infima: "npm:0.2.0-alpha.45" lodash: "npm:^4.17.21" nprogress: "npm:^0.2.0" @@ -4955,18 +4842,18 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/3a37763875f41e8ac9c6baf6d796eb7804fd831eae3965db28b48e642b712b5fa4ba0c67bcb7056fe59220d0ccfa8e0320a7fb3bfe496f82b49b976ccfa50729 + checksum: 10c0/aa6442ac2e65539f083a0ed1e70030443bf61422d5cca24fc8b91c2c4192bcd4d8abdbf4b71536e2ae6afd413fd3f4be1379f2dc45e224173500577ebfa1c346 languageName: node linkType: hard -"@docusaurus/theme-common@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/theme-common@npm:3.8.1" +"@docusaurus/theme-common@npm:3.9.2, @docusaurus/theme-common@npm:^3.0.0": + version: 3.9.2 + resolution: "@docusaurus/theme-common@npm:3.9.2" dependencies: - "@docusaurus/mdx-loader": "npm:3.8.1" - "@docusaurus/module-type-aliases": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-common": "npm:3.8.1" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/module-type-aliases": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" "@types/history": "npm:^4.7.11" "@types/react": "npm:*" "@types/react-router-config": "npm:*" @@ -4979,24 +4866,24 @@ __metadata: "@docusaurus/plugin-content-docs": "*" react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/23a4b766778acb10321c617408ac7c65db08fe2d5493be3d6faeeec0ec1be90f00031f691e2ae6716054136b543455eeb4c2a8ef6987a8bc4d474bf4cba53acb + checksum: 10c0/4ecb8570e1fee75a6048ddb43065252e7b5b058f075867b541219830fb01bdc4b41b8f5f0251d6e9e7ffbe3704fd23d16ef90f92a3e2511ecc7ff6d9a2d5bfd6 languageName: node linkType: hard -"@docusaurus/theme-search-algolia@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/theme-search-algolia@npm:3.8.1" +"@docusaurus/theme-search-algolia@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-search-algolia@npm:3.9.2" dependencies: - "@docsearch/react": "npm:^3.9.0" - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/plugin-content-docs": "npm:3.8.1" - "@docusaurus/theme-common": "npm:3.8.1" - "@docusaurus/theme-translations": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-validation": "npm:3.8.1" - algoliasearch: "npm:^5.17.1" - algoliasearch-helper: "npm:^3.22.6" + "@docsearch/react": "npm:^3.9.0 || ^4.1.0" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/plugin-content-docs": "npm:3.9.2" + "@docusaurus/theme-common": "npm:3.9.2" + "@docusaurus/theme-translations": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" + algoliasearch: "npm:^5.37.0" + algoliasearch-helper: "npm:^3.26.0" clsx: "npm:^2.0.0" eta: "npm:^2.2.0" fs-extra: "npm:^11.1.1" @@ -5006,53 +4893,34 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/ed29e2f88a0d9075c433303706fe7fbc0aa75f6bedf01e3549534c906669a290b3b2d062642961975f917cd952ab48a0ba838e4288e7caf23a73a856c23327f0 + checksum: 10c0/676206059771d13c2268c4f8a20630288ac043aa1042090c259de434f8f833e1e95c0cf7de304880149ace3d084c901d3d01cfbfea63a48dc71aaa6726166621 languageName: node linkType: hard -"@docusaurus/theme-translations@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/theme-translations@npm:3.8.1" +"@docusaurus/theme-translations@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-translations@npm:3.9.2" dependencies: fs-extra: "npm:^11.1.1" tslib: "npm:^2.6.0" - checksum: 10c0/6c4b3db8beaf90d03f5c048e960df34aa57cae933f3db5be5973efe72556850059461fcf420458857efe951666cb9935853a17f4dd15dc0c8cabe7042f1d8c5e + checksum: 10c0/543ee40933a8805357575c14d4fc8f8d504f6464796f5fa27ec13d8b0cec669617961edb206d5b74ba1d776d9486656fefdb1c777e2908cb1752ee6fbe28686c languageName: node linkType: hard -"@docusaurus/tsconfig@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/tsconfig@npm:3.8.1" - checksum: 10c0/137aad26f2f3cf7b36a80b36f25170cdb00f51d03e8aa10d4c7eaa2550770ec48d269ce016d852f13c9390176b70bbbb87af4946c4ca891d4be1f61a745a95a5 +"@docusaurus/tsconfig@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/tsconfig@npm:3.9.2" + checksum: 10c0/d46241cb488d60f785710ee24980aad394423eaf5f76b64b0d47158fcbe19dd68a886898db83b1b65de18dfeb6c27d78adc8f8c4451d1ac29cc9da009ed15cd4 languageName: node linkType: hard -"@docusaurus/types@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/types@npm:3.6.3" - dependencies: - "@mdx-js/mdx": "npm:^3.0.0" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - commander: "npm:^5.1.0" - joi: "npm:^17.9.2" - react-helmet-async: "npm:^1.3.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.95.0" - webpack-merge: "npm:^5.9.0" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/fb4fca87c7e25482ee08d0e70da28cd795cd29a54bae3e95868e7e670a37154e4751712663674d03ff0a060c8b84787f296f397eb36027caf91c1633ac22789d - languageName: node - linkType: hard - -"@docusaurus/types@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/types@npm:3.8.1" +"@docusaurus/types@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/types@npm:3.9.2" dependencies: "@mdx-js/mdx": "npm:^3.0.0" "@types/history": "npm:^4.7.11" + "@types/mdast": "npm:^4.0.2" "@types/react": "npm:*" commander: "npm:^5.1.0" joi: "npm:^17.9.2" @@ -5063,98 +4931,43 @@ __metadata: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - checksum: 10c0/1a70a104c73b8cd6329e5feda72732be606d65d5fbd7b99453756dac50dd91f7d35ddacd782468d7b92f786ab0094a68bed45e52fa104e5fa3bb4836282a6f41 + checksum: 10c0/e50a9931e97944d39375a97a45ded13bc35baf3c9c14fe66d30944ebe1203df7748a7631291f937bef1a7a98db73c23505620cd8f03d109fbbdfa83725fb2857 languageName: node linkType: hard -"@docusaurus/utils-common@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/utils-common@npm:3.6.3" +"@docusaurus/utils-common@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/utils-common@npm:3.9.2" dependencies: - "@docusaurus/types": "npm:3.6.3" + "@docusaurus/types": "npm:3.9.2" tslib: "npm:^2.6.0" - checksum: 10c0/cf484b62541412a5706cbf8f8e7cc2f9bc1f0b4db33657b74fe2f02d1a3b4ba0349e99022d4aec6e1fecf76651316fce5a210172153b67a9ab16847c6ec00e6e + checksum: 10c0/0e34186ca66cf3c537935d998cfb2ce59beaad31ccb9b41c2288618f386d72dc4359e15e8cb012525211d1f1d753fc439d6c7e9701d6ac801e1121cfa3223d69 languageName: node linkType: hard -"@docusaurus/utils-common@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/utils-common@npm:3.8.1" +"@docusaurus/utils-validation@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/utils-validation@npm:3.9.2" dependencies: - "@docusaurus/types": "npm:3.8.1" - tslib: "npm:^2.6.0" - checksum: 10c0/59c672880c860560b0896b43bdc6f6ce868c2efb9b804b578b3449c9cd45669fe350a16ea35469f9da85d5f3166a404c46284476d1c91c35826cd51f7c8edba7 - languageName: node - linkType: hard - -"@docusaurus/utils-validation@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/utils-validation@npm:3.6.3" - dependencies: - "@docusaurus/logger": "npm:3.6.3" - "@docusaurus/utils": "npm:3.6.3" - "@docusaurus/utils-common": "npm:3.6.3" - fs-extra: "npm:^11.2.0" - joi: "npm:^17.9.2" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - tslib: "npm:^2.6.0" - checksum: 10c0/8cfc1d223e71612180d09ad3027ea10c4447fc70ed4bf680b66f72f1bce7c74556a6029073fa6a6bc64ddbc03a9a1c9d708607e62ef0b86a033f35ab6a63ddf9 - languageName: node - linkType: hard - -"@docusaurus/utils-validation@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/utils-validation@npm:3.8.1" - dependencies: - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/utils": "npm:3.8.1" - "@docusaurus/utils-common": "npm:3.8.1" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" fs-extra: "npm:^11.2.0" joi: "npm:^17.9.2" js-yaml: "npm:^4.1.0" lodash: "npm:^4.17.21" tslib: "npm:^2.6.0" - checksum: 10c0/e64008cd8575b9699a1772665b8bc2508f2410a6c9bc4858a9bc3c8a988a1cad10f63fd336fc7333df6d2dfb111a701f829b64faf053f0a73e7196ec3e122221 + checksum: 10c0/681b8c7fe0e2930affa388340f3db596a894affdb390e058277edd230181edca6f5593d37b48fb19c5077bbd5438549d944591f366b9f21ffff81feac1e1ae66 languageName: node linkType: hard -"@docusaurus/utils@npm:3.6.3": - version: 3.6.3 - resolution: "@docusaurus/utils@npm:3.6.3" +"@docusaurus/utils@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/utils@npm:3.9.2" dependencies: - "@docusaurus/logger": "npm:3.6.3" - "@docusaurus/types": "npm:3.6.3" - "@docusaurus/utils-common": "npm:3.6.3" - "@svgr/webpack": "npm:^8.1.0" - escape-string-regexp: "npm:^4.0.0" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^11.1.1" - github-slugger: "npm:^1.5.0" - globby: "npm:^11.1.0" - gray-matter: "npm:^4.0.3" - jiti: "npm:^1.20.0" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - micromatch: "npm:^4.0.5" - prompts: "npm:^2.4.2" - resolve-pathname: "npm:^3.0.0" - shelljs: "npm:^0.8.5" - tslib: "npm:^2.6.0" - url-loader: "npm:^4.1.1" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" - checksum: 10c0/e665e067be8a440a93bec66e79f94735f8cfb21940df8f57c89f923d2a5c08fb29b35e0309370baec644281b0764034fe75642a976d1ae04392fe21b905df8bf - languageName: node - linkType: hard - -"@docusaurus/utils@npm:3.8.1": - version: 3.8.1 - resolution: "@docusaurus/utils@npm:3.8.1" - dependencies: - "@docusaurus/logger": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" - "@docusaurus/utils-common": "npm:3.8.1" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" escape-string-regexp: "npm:^4.0.0" execa: "npm:5.1.1" file-loader: "npm:^6.2.0" @@ -5173,7 +4986,7 @@ __metadata: url-loader: "npm:^4.1.1" utility-types: "npm:^3.10.0" webpack: "npm:^5.88.1" - checksum: 10c0/a44c9d7b7e268ad5783cbaa9b554bf78e03d6601dfc31be83c4d90977e862b5d342f758e46d63daeb91721c93d5da3c4e6dc94765d56dfb6a419583f2677619b + checksum: 10c0/9796b2e7bc93e47cb27ce81185264c6390b56cd9e68831f6013e4418af512a736f1baf9b97e5df8d646ef4da0650151512abf598f5d58793a3e6c0833c80e06a languageName: node linkType: hard @@ -7495,6 +7308,75 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@jsonjoy.com/base64@npm:1.1.2" + peerDependencies: + tslib: 2 + checksum: 10c0/88717945f66dc89bf58ce75624c99fe6a5c9a0c8614e26d03e406447b28abff80c69fb37dabe5aafef1862cf315071ae66e5c85f6018b437d95f8d13d235e6eb + languageName: node + linkType: hard + +"@jsonjoy.com/buffers@npm:^1.0.0, @jsonjoy.com/buffers@npm:^1.2.0": + version: 1.2.1 + resolution: "@jsonjoy.com/buffers@npm:1.2.1" + peerDependencies: + tslib: 2 + checksum: 10c0/5edaf761b78b730ae0598824adb37473fef5b40a8fc100625159700eb36e00057c5129c7ad15fc0e3178e8de58a044da65728e8d7b05fd3eed58e9b9a0d02b5a + languageName: node + linkType: hard + +"@jsonjoy.com/codegen@npm:^1.0.0": + version: 1.0.0 + resolution: "@jsonjoy.com/codegen@npm:1.0.0" + peerDependencies: + tslib: 2 + checksum: 10c0/54686352248440ad1484ce7db0270a5a72424fb9651b090e5f1c8e2cd8e55e6c7a3f67dfe4ed90c689cf01ed949e794764a8069f5f52510eaf0a2d0c41d324cd + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^1.11.0": + version: 1.21.0 + resolution: "@jsonjoy.com/json-pack@npm:1.21.0" + dependencies: + "@jsonjoy.com/base64": "npm:^1.1.2" + "@jsonjoy.com/buffers": "npm:^1.2.0" + "@jsonjoy.com/codegen": "npm:^1.0.0" + "@jsonjoy.com/json-pointer": "npm:^1.0.2" + "@jsonjoy.com/util": "npm:^1.9.0" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.1.0" + peerDependencies: + tslib: 2 + checksum: 10c0/0183eccccf2ab912389a6784ae81c1a7da48cf178902efe093fb60c457359c7c75da2803f869e0a1489f1342dfa4f8ab9b27b65adc9f44fd9646823773b71e9d + languageName: node + linkType: hard + +"@jsonjoy.com/json-pointer@npm:^1.0.2": + version: 1.0.2 + resolution: "@jsonjoy.com/json-pointer@npm:1.0.2" + dependencies: + "@jsonjoy.com/codegen": "npm:^1.0.0" + "@jsonjoy.com/util": "npm:^1.9.0" + peerDependencies: + tslib: 2 + checksum: 10c0/8d959c0fdd77d937d2a829270de51533bb9e3b887b3f6f02943884dc33dd79225071218c93f4bafdee6a3412fd5153264997953a86de444d85c1fff67915af54 + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:^1.9.0": + version: 1.9.0 + resolution: "@jsonjoy.com/util@npm:1.9.0" + dependencies: + "@jsonjoy.com/buffers": "npm:^1.0.0" + "@jsonjoy.com/codegen": "npm:^1.0.0" + peerDependencies: + tslib: 2 + checksum: 10c0/a720a6accaae71fa9e7fa06e93e382702aa5760ef2bdc3bc45c19dc2228a01cc735d36cb970c654bc5e88f1328d55d1f0d5eceef0b76bcc327a2ce863e7b0021 + languageName: node + linkType: hard + "@keplr-wallet/common@npm:0.12.28": version: 0.12.28 resolution: "@keplr-wallet/common@npm:0.12.28" @@ -10268,13 +10150,15 @@ __metadata: version: 0.0.0-use.local resolution: "@oko-wallet/docs_web@workspace:apps/docs_web" dependencies: - "@docusaurus/core": "npm:3.8.1" - "@docusaurus/module-type-aliases": "npm:3.8.1" - "@docusaurus/plugin-client-redirects": "npm:3.6.3" - "@docusaurus/preset-classic": "npm:3.8.1" - "@docusaurus/tsconfig": "npm:3.8.1" - "@docusaurus/types": "npm:3.8.1" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/module-type-aliases": "npm:3.9.2" + "@docusaurus/plugin-client-redirects": "npm:3.9.2" + "@docusaurus/preset-classic": "npm:3.9.2" + "@docusaurus/tsconfig": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" "@mdx-js/react": "npm:^3.0.0" + "@signalwire/docusaurus-plugin-llms-txt": "npm:2.0.0-alpha.7" + "@signalwire/docusaurus-theme-llms-txt": "npm:1.0.0-alpha.8" clsx: "npm:^2.0.0" prism-react-renderer: "npm:^2.3.0" react: "npm:^19.0.0" @@ -10309,11 +10193,13 @@ __metadata: "@types/jest": "npm:*" "@types/node": "npm:*" del-cli: "npm:*" + dotenv: "npm:^16.4.5" jest: "npm:*" ts-jest: "npm:*" tsc-alias: "npm:*" tsx: "npm:*" typescript: "npm:*" + zod: "npm:4.1.12" languageName: unknown linkType: soft @@ -11003,7 +10889,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api@npm:1.x, @opentelemetry/api@npm:^1.4.1": +"@opentelemetry/api@npm:1.9.0, @opentelemetry/api@npm:1.x, @opentelemetry/api@npm:^1.4.1": version: 1.9.0 resolution: "@opentelemetry/api@npm:1.9.0" checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add @@ -12720,6 +12606,43 @@ __metadata: languageName: node linkType: hard +"@signalwire/docusaurus-plugin-llms-txt@npm:2.0.0-alpha.7": + version: 2.0.0-alpha.7 + resolution: "@signalwire/docusaurus-plugin-llms-txt@npm:2.0.0-alpha.7" + dependencies: + fs-extra: "npm:^11.0.0" + hast-util-select: "npm:^6.0.4" + hast-util-to-html: "npm:^9.0.5" + hast-util-to-string: "npm:^3.0.1" + p-map: "npm:^7.0.2" + rehype-parse: "npm:^9" + rehype-remark: "npm:^10" + remark-gfm: "npm:^4" + remark-stringify: "npm:^11" + string-width: "npm:^5.0.0" + unified: "npm:^11" + unist-util-visit: "npm:^5" + peerDependencies: + "@docusaurus/core": ^3.0.0 + checksum: 10c0/82168d75186c6a3d1ff0ca174b07f977a8e219778df93e8bf7643f3ede8a9e8bb1214a8617328bed3a614c1cbcb7bdf00bcbca5a18a78bb03febf6c8283c7c03 + languageName: node + linkType: hard + +"@signalwire/docusaurus-theme-llms-txt@npm:1.0.0-alpha.8": + version: 1.0.0-alpha.8 + resolution: "@signalwire/docusaurus-theme-llms-txt@npm:1.0.0-alpha.8" + dependencies: + "@docusaurus/core": "npm:^3.0.0" + "@docusaurus/theme-common": "npm:^3.0.0" + clsx: "npm:^2.0.0" + react-icons: "npm:^5.5.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/5255153f3e7adc70197ad5fab3758fc403ac59ff7917eb858257222ef42fbb00258ff9428aa7d5ecda02c0949b1c11203d1a678d85862b61b1ff1ac4382b3291 + languageName: node + linkType: hard + "@sigstore/bundle@npm:^2.3.2": version: 2.3.2 resolution: "@sigstore/bundle@npm:2.3.2" @@ -13911,6 +13834,13 @@ __metadata: languageName: node linkType: hard +"@standard-schema/spec@npm:^1.0.0": + version: 1.0.0 + resolution: "@standard-schema/spec@npm:1.0.0" + checksum: 10c0/a1ab9a8bdc09b5b47aa8365d0e0ec40cc2df6437be02853696a0e377321653b0d3ac6f079a8c67d5ddbe9821025584b1fb71d9cc041a6666a96f1fadf2ece15f + languageName: node + linkType: hard + "@standard-schema/utils@npm:^0.3.0": version: 0.3.0 resolution: "@standard-schema/utils@npm:0.3.0" @@ -14854,7 +14784,7 @@ __metadata: languageName: node linkType: hard -"@types/bonjour@npm:^3.5.9": +"@types/bonjour@npm:^3.5.13": version: 3.5.13 resolution: "@types/bonjour@npm:3.5.13" dependencies: @@ -14877,7 +14807,7 @@ __metadata: languageName: node linkType: hard -"@types/connect-history-api-fallback@npm:^1.3.5": +"@types/connect-history-api-fallback@npm:^1.5.4": version: 1.5.4 resolution: "@types/connect-history-api-fallback@npm:1.5.4" dependencies: @@ -14985,7 +14915,7 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:^4.17.33": +"@types/express-serve-static-core@npm:^4.17.21, @types/express-serve-static-core@npm:^4.17.33": version: 4.19.7 resolution: "@types/express-serve-static-core@npm:4.19.7" dependencies: @@ -15008,27 +14938,27 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:^4.17.13": - version: 4.17.25 - resolution: "@types/express@npm:4.17.25" +"@types/express@npm:^4.17.20": + version: 4.17.24 + resolution: "@types/express@npm:4.17.24" dependencies: "@types/body-parser": "npm:*" "@types/express-serve-static-core": "npm:^4.17.33" "@types/qs": "npm:*" - "@types/serve-static": "npm:^1" - checksum: 10c0/f42b616d2c9dbc50352c820db7de182f64ebbfa8dba6fb6c98e5f8f0e2ef3edde0131719d9dc6874803d25ad9ca2d53471d0fec2fbc60a6003a43d015bab72c4 + "@types/serve-static": "npm:*" + checksum: 10c0/664e1983e47dee6e30c3c3cad84a8e43f9da07e24bd596e8398cf3fb36bc107fc813a9bc90e3da01bc8930dc70c5729a380e4ea54998159ec1b1eba2db6ce933 languageName: node linkType: hard -"@types/express@npm:^4.17.20": - version: 4.17.24 - resolution: "@types/express@npm:4.17.24" +"@types/express@npm:^4.17.21": + version: 4.17.25 + resolution: "@types/express@npm:4.17.25" dependencies: "@types/body-parser": "npm:*" "@types/express-serve-static-core": "npm:^4.17.33" "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: 10c0/664e1983e47dee6e30c3c3cad84a8e43f9da07e24bd596e8398cf3fb36bc107fc813a9bc90e3da01bc8930dc70c5729a380e4ea54998159ec1b1eba2db6ce933 + "@types/serve-static": "npm:^1" + checksum: 10c0/f42b616d2c9dbc50352c820db7de182f64ebbfa8dba6fb6c98e5f8f0e2ef3edde0131719d9dc6874803d25ad9ca2d53471d0fec2fbc60a6003a43d015bab72c4 languageName: node linkType: hard @@ -15150,7 +15080,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db @@ -15484,10 +15414,10 @@ __metadata: languageName: node linkType: hard -"@types/retry@npm:0.12.0": - version: 0.12.0 - resolution: "@types/retry@npm:0.12.0" - checksum: 10c0/7c5c9086369826f569b83a4683661557cab1361bac0897a1cefa1a915ff739acd10ca0d62b01071046fe3f5a3f7f2aec80785fe283b75602dc6726781ea3e328 +"@types/retry@npm:0.12.2": + version: 0.12.2 + resolution: "@types/retry@npm:0.12.2" + checksum: 10c0/07481551a988cc90b423351919928b9ddcd14e3f5591cac3ab950851bb20646e55a10e89141b38bc3093d2056d4df73700b22ff2612976ac86a6367862381884 languageName: node linkType: hard @@ -15519,7 +15449,7 @@ __metadata: languageName: node linkType: hard -"@types/serve-index@npm:^1.9.1": +"@types/serve-index@npm:^1.9.4": version: 1.9.4 resolution: "@types/serve-index@npm:1.9.4" dependencies: @@ -15528,7 +15458,7 @@ __metadata: languageName: node linkType: hard -"@types/serve-static@npm:*, @types/serve-static@npm:^1, @types/serve-static@npm:^1.13.10": +"@types/serve-static@npm:*, @types/serve-static@npm:^1, @types/serve-static@npm:^1.15.5": version: 1.15.10 resolution: "@types/serve-static@npm:1.15.10" dependencies: @@ -15539,7 +15469,7 @@ __metadata: languageName: node linkType: hard -"@types/sockjs@npm:^0.3.33": +"@types/sockjs@npm:^0.3.36": version: 0.3.36 resolution: "@types/sockjs@npm:0.3.36" dependencies: @@ -15622,7 +15552,7 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.5.5": +"@types/ws@npm:^8.5.10": version: 8.18.1 resolution: "@types/ws@npm:8.18.1" dependencies: @@ -16295,6 +16225,13 @@ __metadata: languageName: node linkType: hard +"@vercel/oidc@npm:3.0.3": + version: 3.0.3 + resolution: "@vercel/oidc@npm:3.0.3" + checksum: 10c0/c8eecb1324559435f4ab8a955f5ef44f74f546d11c2ddcf28151cb636d989bd4b34e0673fd8716cb21bb21afb34b3de663bacc30c9506036eeecbcbf2fd86241 + languageName: node + linkType: hard + "@vitejs/plugin-react@npm:^4.3.4": version: 4.7.0 resolution: "@vitejs/plugin-react@npm:4.7.0" @@ -17241,7 +17178,7 @@ __metadata: languageName: unknown linkType: soft -"address@npm:^1.0.1, address@npm:^1.1.2": +"address@npm:^1.0.1": version: 1.2.2 resolution: "address@npm:1.2.2" checksum: 10c0/1c8056b77fb124456997b78ed682ecc19d2fd7ea8bd5850a2aa8c3e3134c913847c57bcae418622efd32ba858fa1e242a40a251ac31da0515664fc0ac03a047d @@ -17311,6 +17248,20 @@ __metadata: languageName: node linkType: hard +"ai@npm:5.0.90, ai@npm:^5.0.30": + version: 5.0.90 + resolution: "ai@npm:5.0.90" + dependencies: + "@ai-sdk/gateway": "npm:2.0.7" + "@ai-sdk/provider": "npm:2.0.0" + "@ai-sdk/provider-utils": "npm:3.0.16" + "@opentelemetry/api": "npm:1.9.0" + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + checksum: 10c0/feee8908803743cee49216a37bcbc6f33e2183423d623863e8a0c5ce065dcb18d17c5c86b8f587bf391818bb47a882287f14650a77a857accb5cb7a0ecb2653c + languageName: node + linkType: hard + "ajv-formats@npm:^2.1.1": version: 2.1.1 resolution: "ajv-formats@npm:2.1.1" @@ -17325,7 +17276,7 @@ __metadata: languageName: node linkType: hard -"ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": +"ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" peerDependencies: @@ -17345,7 +17296,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.2, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -17369,7 +17320,7 @@ __metadata: languageName: node linkType: hard -"algoliasearch-helper@npm:^3.22.6": +"algoliasearch-helper@npm:^3.26.0": version: 3.26.0 resolution: "algoliasearch-helper@npm:3.26.0" dependencies: @@ -17380,25 +17331,25 @@ __metadata: languageName: node linkType: hard -"algoliasearch@npm:^5.14.2, algoliasearch@npm:^5.17.1": - version: 5.42.0 - resolution: "algoliasearch@npm:5.42.0" +"algoliasearch@npm:^5.28.0, algoliasearch@npm:^5.37.0": + version: 5.43.0 + resolution: "algoliasearch@npm:5.43.0" dependencies: - "@algolia/abtesting": "npm:1.8.0" - "@algolia/client-abtesting": "npm:5.42.0" - "@algolia/client-analytics": "npm:5.42.0" - "@algolia/client-common": "npm:5.42.0" - "@algolia/client-insights": "npm:5.42.0" - "@algolia/client-personalization": "npm:5.42.0" - "@algolia/client-query-suggestions": "npm:5.42.0" - "@algolia/client-search": "npm:5.42.0" - "@algolia/ingestion": "npm:1.42.0" - "@algolia/monitoring": "npm:1.42.0" - "@algolia/recommend": "npm:5.42.0" - "@algolia/requester-browser-xhr": "npm:5.42.0" - "@algolia/requester-fetch": "npm:5.42.0" - "@algolia/requester-node-http": "npm:5.42.0" - checksum: 10c0/826718733d34b903711eb9b9ce81427ed28f7b4877dce0429a340fe66cc80ca36b2a8551c87d7fc30285a09bca4a0a6d1751fd73112943b30636de929c13c173 + "@algolia/abtesting": "npm:1.9.0" + "@algolia/client-abtesting": "npm:5.43.0" + "@algolia/client-analytics": "npm:5.43.0" + "@algolia/client-common": "npm:5.43.0" + "@algolia/client-insights": "npm:5.43.0" + "@algolia/client-personalization": "npm:5.43.0" + "@algolia/client-query-suggestions": "npm:5.43.0" + "@algolia/client-search": "npm:5.43.0" + "@algolia/ingestion": "npm:1.43.0" + "@algolia/monitoring": "npm:1.43.0" + "@algolia/recommend": "npm:5.43.0" + "@algolia/requester-browser-xhr": "npm:5.43.0" + "@algolia/requester-fetch": "npm:5.43.0" + "@algolia/requester-node-http": "npm:5.43.0" + checksum: 10c0/2be84d33a50759c30d06ccd8f56e77a7e3792a0d49e5ca71016d26f2d6bb320f0b049863087f85c7c999266cd1b8b08375a8eb5670db5e3d248c8b79f42e6f1d languageName: node linkType: hard @@ -17943,13 +17894,6 @@ __metadata: languageName: node linkType: hard -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef - languageName: node - linkType: hard - "atomic-sleep@npm:^1.0.0": version: 1.0.0 resolution: "atomic-sleep@npm:1.0.0" @@ -18367,6 +18311,13 @@ __metadata: languageName: node linkType: hard +"bcp-47-match@npm:^2.0.0": + version: 2.0.3 + resolution: "bcp-47-match@npm:2.0.3" + checksum: 10c0/ae5c202854df8a9ad4777dc3b49562578495a69164869f365a88c1a089837a9fbbce4c0c44f6f1a5e44c7841f47e91fe6fea00306ca49ce5ec95a7eb71f839c4 + languageName: node + linkType: hard + "bcrypt-pbkdf@npm:^1.0.0": version: 1.0.2 resolution: "bcrypt-pbkdf@npm:1.0.2" @@ -18678,7 +18629,7 @@ __metadata: languageName: node linkType: hard -"bonjour-service@npm:^1.0.11": +"bonjour-service@npm:^1.2.1": version: 1.3.0 resolution: "bonjour-service@npm:1.3.0" dependencies: @@ -18891,7 +18842,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.26.0, browserslist@npm:^4.26.3": +"browserslist@npm:^4.0.0, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.26.0, browserslist@npm:^4.26.3": version: 4.27.0 resolution: "browserslist@npm:4.27.0" dependencies: @@ -19030,6 +18981,15 @@ __metadata: languageName: node linkType: hard +"bundle-name@npm:^4.1.0": + version: 4.1.0 + resolution: "bundle-name@npm:4.1.0" + dependencies: + run-applescript: "npm:^7.0.0" + checksum: 10c0/8e575981e79c2bcf14d8b1c027a3775c095d362d1382312f444a7c861b0e21513c0bd8db5bd2b16e50ba0709fa622d4eab6b53192d222120305e68359daece29 + languageName: node + linkType: hard + "busboy@npm:1.6.0, busboy@npm:^1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" @@ -19459,7 +19419,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.4.2, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": +"chokidar@npm:^3.5.2, chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -19584,7 +19544,7 @@ __metadata: languageName: node linkType: hard -"clean-css@npm:^5.2.2, clean-css@npm:^5.3.2, clean-css@npm:^5.3.3, clean-css@npm:~5.3.2": +"clean-css@npm:^5.2.2, clean-css@npm:^5.3.3, clean-css@npm:~5.3.2": version: 5.3.3 resolution: "clean-css@npm:5.3.3" dependencies: @@ -20452,13 +20412,6 @@ __metadata: languageName: node linkType: hard -"copy-text-to-clipboard@npm:^3.2.0": - version: 3.2.2 - resolution: "copy-text-to-clipboard@npm:3.2.2" - checksum: 10c0/451796734a380f7da7b0af27c4d94e449719d3a2f2170e99c7e46eeee54cf3c4b4fdeabc185f6d6e8cbdf932e350831d05e8387c4bae8dcedb7fb961c600ddd4 - languageName: node - linkType: hard - "copy-webpack-plugin@npm:^11.0.0": version: 11.0.0 resolution: "copy-webpack-plugin@npm:11.0.0" @@ -20546,19 +20499,6 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^6.0.0": - version: 6.0.0 - resolution: "cosmiconfig@npm:6.0.0" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.1.0" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.7.2" - checksum: 10c0/666ed8732d0bf7d7fe6f8516c8ee6041e0622032e8fa26201577b883d2767ad105d03f38b34b93d1f02f26b22a89e7bab4443b9d2e7f931f48d0e944ffa038b5 - languageName: node - linkType: hard - "cosmiconfig@npm:^7.0.0": version: 7.1.0 resolution: "cosmiconfig@npm:7.1.0" @@ -20780,7 +20720,7 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:^6.11.0, css-loader@npm:^6.8.1": +"css-loader@npm:^6.11.0": version: 6.11.0 resolution: "css-loader@npm:6.11.0" dependencies: @@ -20868,6 +20808,13 @@ __metadata: languageName: node linkType: hard +"css-selector-parser@npm:^3.0.0": + version: 3.1.3 + resolution: "css-selector-parser@npm:3.1.3" + checksum: 10c0/0bba96edfd27827d79933b113c42bec627b96a79f6fe4b12dec12da109d0b3a25f2f76d385b7c28ff22dca68840251751d1061d9226657755430e4787bf4594e + languageName: node + linkType: hard + "css-tree@npm:^2.3.1": version: 2.3.1 resolution: "css-tree@npm:2.3.1" @@ -21267,7 +21214,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.6.0": +"debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -21436,12 +21383,20 @@ __metadata: languageName: node linkType: hard -"default-gateway@npm:^6.0.3": - version: 6.0.3 - resolution: "default-gateway@npm:6.0.3" +"default-browser-id@npm:^5.0.0": + version: 5.0.0 + resolution: "default-browser-id@npm:5.0.0" + checksum: 10c0/957fb886502594c8e645e812dfe93dba30ed82e8460d20ce39c53c5b0f3e2afb6ceaec2249083b90bdfbb4cb0f34e1f73fde3d68cac00becdbcfd894156b5ead + languageName: node + linkType: hard + +"default-browser@npm:^5.2.1": + version: 5.2.1 + resolution: "default-browser@npm:5.2.1" dependencies: - execa: "npm:^5.0.0" - checksum: 10c0/5184f9e6e105d24fb44ade9e8741efa54bb75e84625c1ea78c4ef8b81dff09ca52d6dbdd1185cf0dc655bb6b282a64fffaf7ed2dd561b8d9ad6f322b1f039aba + bundle-name: "npm:^4.1.0" + default-browser-id: "npm:^5.0.0" + checksum: 10c0/73f17dc3c58026c55bb5538749597db31f9561c0193cd98604144b704a981c95a466f8ecc3c2db63d8bfd04fb0d426904834cfc91ae510c6aeb97e13c5167c4d languageName: node linkType: hard @@ -21479,6 +21434,13 @@ __metadata: languageName: node linkType: hard +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: 10c0/5ab0b2bf3fa58b3a443140bbd4cd3db1f91b985cc8a246d330b9ac3fc0b6a325a6d82bddc0b055123d745b3f9931afeea74a5ec545439a1630b9c8512b0eeb49 + languageName: node + linkType: hard + "define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" @@ -21524,22 +21486,6 @@ __metadata: languageName: node linkType: hard -"del@npm:^6.1.1": - version: 6.1.1 - resolution: "del@npm:6.1.1" - dependencies: - globby: "npm:^11.0.1" - graceful-fs: "npm:^4.2.4" - is-glob: "npm:^4.0.1" - is-path-cwd: "npm:^2.2.0" - is-path-inside: "npm:^3.0.2" - p-map: "npm:^4.0.0" - rimraf: "npm:^3.0.2" - slash: "npm:^3.0.0" - checksum: 10c0/8a095c5ccade42c867a60252914ae485ec90da243d735d1f63ec1e64c1cfbc2b8810ad69a29ab6326d159d4fddaa2f5bad067808c42072351ec458efff86708f - languageName: node - linkType: hard - "del@npm:^8.0.0, del@npm:^8.0.1": version: 8.0.1 resolution: "del@npm:8.0.1" @@ -21590,7 +21536,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0, dequal@npm:^2.0.2": +"dequal@npm:^2.0.0, dequal@npm:^2.0.2, dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 @@ -21681,19 +21627,6 @@ __metadata: languageName: node linkType: hard -"detect-port-alt@npm:^1.1.6": - version: 1.1.6 - resolution: "detect-port-alt@npm:1.1.6" - dependencies: - address: "npm:^1.0.1" - debug: "npm:^2.6.0" - bin: - detect: ./bin/detect-port - detect-port: ./bin/detect-port - checksum: 10c0/7269e6aef7b782d98c77505c07a7a0f5e2ee98a9607dc791035fc0192fc58aa03cc833fae605e10eaf239a2a5a55cd938e0bb141dea764ac6180ca082fd62b23 - languageName: node - linkType: hard - "detect-port@npm:^1.5.1": version: 1.6.1 resolution: "detect-port@npm:1.6.1" @@ -21781,6 +21714,15 @@ __metadata: languageName: node linkType: hard +"direction@npm:^2.0.0": + version: 2.0.1 + resolution: "direction@npm:2.0.1" + bin: + direction: cli.js + checksum: 10c0/dce809431cad978e0778769a3818ea797ebe0bd542c85032ad9ad98971e2021a146be62feb259d7ffe4b76739e07b23e861b29c3f184ac8d38cc6ba956d5c586 + languageName: node + linkType: hard + "dns-packet@npm:^5.2.2": version: 5.6.1 resolution: "dns-packet@npm:5.6.1" @@ -23401,6 +23343,13 @@ __metadata: languageName: node linkType: hard +"eventsource-parser@npm:^3.0.6": + version: 3.0.6 + resolution: "eventsource-parser@npm:3.0.6" + checksum: 10c0/70b8ccec7dac767ef2eca43f355e0979e70415701691382a042a2df8d6a68da6c2fca35363669821f3da876d29c02abe9b232964637c1b6635c940df05ada78a + languageName: node + linkType: hard + "evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": version: 1.0.3 resolution: "evp_bytestokey@npm:1.0.3" @@ -23554,7 +23503,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.3, express@npm:^4.21.1": +"express@npm:^4.21.1, express@npm:^4.21.2": version: 4.21.2 resolution: "express@npm:4.21.2" dependencies: @@ -23896,13 +23845,6 @@ __metadata: languageName: node linkType: hard -"filesize@npm:^8.0.6": - version: 8.0.7 - resolution: "filesize@npm:8.0.7" - checksum: 10c0/82072d94816484df5365d4d5acbb2327a65dc49704c64e403e8c40d8acb7364de1cf1e65cb512c77a15d353870f73e4fed46dad5c6153d0618d9ce7a64d09cfc - languageName: node - linkType: hard - "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -23993,15 +23935,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: "npm:^3.0.0" - checksum: 10c0/2c2e7d0a26db858e2f624f39038c74739e38306dee42b45f404f770db357947be9d0d587f1cac72d20c114deb38aa57316e879eb0a78b17b46da7dab0a3bd6e3 - languageName: node - linkType: hard - "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -24126,37 +24059,6 @@ __metadata: languageName: node linkType: hard -"fork-ts-checker-webpack-plugin@npm:^6.5.0": - version: 6.5.3 - resolution: "fork-ts-checker-webpack-plugin@npm:6.5.3" - dependencies: - "@babel/code-frame": "npm:^7.8.3" - "@types/json-schema": "npm:^7.0.5" - chalk: "npm:^4.1.0" - chokidar: "npm:^3.4.2" - cosmiconfig: "npm:^6.0.0" - deepmerge: "npm:^4.2.2" - fs-extra: "npm:^9.0.0" - glob: "npm:^7.1.6" - memfs: "npm:^3.1.2" - minimatch: "npm:^3.0.4" - schema-utils: "npm:2.7.0" - semver: "npm:^7.3.2" - tapable: "npm:^1.0.0" - peerDependencies: - eslint: ">= 6" - typescript: ">= 2.7" - vue-template-compiler: "*" - webpack: ">= 4" - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - checksum: 10c0/0885ea75474de011d4068ca3e2d3ca6e4cd318f5cfa018e28ff8fef23ef3a1f1c130160ef192d3e5d31ef7b6fe9f8fb1d920eab5e9e449fb30ce5cc96647245c - languageName: node - linkType: hard - "form-data-encoder@npm:^2.1.2": version: 2.1.4 resolution: "form-data-encoder@npm:2.1.4" @@ -24317,7 +24219,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.1.1, fs-extra@npm:^11.2.0": +"fs-extra@npm:^11.0.0, fs-extra@npm:^11.1.1, fs-extra@npm:^11.2.0": version: 11.3.2 resolution: "fs-extra@npm:11.3.2" dependencies: @@ -24339,18 +24241,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^9.0.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: "npm:^1.0.0" - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 - languageName: node - linkType: hard - "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -24369,13 +24259,6 @@ __metadata: languageName: node linkType: hard -"fs-monkey@npm:^1.0.4": - version: 1.1.0 - resolution: "fs-monkey@npm:1.1.0" - checksum: 10c0/45596fe14753ae8f3fa180724106383de68c8de2836eb24d1647cacf18a6d05335402f3611d32e00234072a60d2f3371024c00cd295593bfbce35b84ff9f6a34 - languageName: node - linkType: hard - "fs-promise@npm:^0.5.0": version: 0.5.0 resolution: "fs-promise@npm:0.5.0" @@ -24674,6 +24557,15 @@ __metadata: languageName: node linkType: hard +"glob-to-regex.js@npm:^1.0.1": + version: 1.2.0 + resolution: "glob-to-regex.js@npm:1.2.0" + peerDependencies: + tslib: 2 + checksum: 10c0/011c81ae2a4d7ac5fd617038209fd9639d54c76211cc88fe8dd85d1a0850bc683a63cf5b1eae370141fca7dd2c834dfb9684dfdd8bf7472f2c1e4ef6ab6e34f9 + languageName: node + linkType: hard + "glob-to-regexp@npm:^0.4.1": version: 0.4.1 resolution: "glob-to-regexp@npm:0.4.1" @@ -24713,7 +24605,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": +"glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -24761,26 +24653,6 @@ __metadata: languageName: node linkType: hard -"global-modules@npm:^2.0.0": - version: 2.0.0 - resolution: "global-modules@npm:2.0.0" - dependencies: - global-prefix: "npm:^3.0.0" - checksum: 10c0/43b770fe24aa6028f4b9770ea583a47f39750be15cf6e2578f851e4ccc9e4fa674b8541928c0b09c21461ca0763f0d36e4068cec86c914b07fd6e388e66ba5b9 - languageName: node - linkType: hard - -"global-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "global-prefix@npm:3.0.0" - dependencies: - ini: "npm:^1.3.5" - kind-of: "npm:^6.0.2" - which: "npm:^1.3.1" - checksum: 10c0/510f489fb68d1cc7060f276541709a0ee6d41356ef852de48f7906c648ac223082a1cc8fce86725ca6c0e032bcdc1189ae77b4744a624b29c34a9d0ece498269 - languageName: node - linkType: hard - "globals@npm:^13.19.0": version: 13.24.0 resolution: "globals@npm:13.24.0" @@ -24814,7 +24686,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.0.1, globby@npm:^11.0.4, globby@npm:^11.1.0": +"globby@npm:^11.0.4, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -25217,6 +25089,30 @@ __metadata: languageName: node linkType: hard +"hast-util-embedded@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-embedded@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-is-element: "npm:^3.0.0" + checksum: 10c0/054c3d3b96fcd5c1d1c6f8d38ce1f7f33022ba6362129a022673d0b539f876acdcababbb9df29812fb927294f98ef7a2f44519a80d637fe3eea1819c9e69eeac + languageName: node + linkType: hard + +"hast-util-from-html@npm:^2.0.0": + version: 2.0.3 + resolution: "hast-util-from-html@npm:2.0.3" + dependencies: + "@types/hast": "npm:^3.0.0" + devlop: "npm:^1.1.0" + hast-util-from-parse5: "npm:^8.0.0" + parse5: "npm:^7.0.0" + vfile: "npm:^6.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/993ef707c1a12474c8d4094fc9706a72826c660a7e308ea54c50ad893353d32e139b7cbc67510c2e82feac572b320e3b05aeb13d0f9c6302d61261f337b46764 + languageName: node + linkType: hard + "hast-util-from-parse5@npm:^8.0.0": version: 8.0.3 resolution: "hast-util-from-parse5@npm:8.0.3" @@ -25233,6 +25129,46 @@ __metadata: languageName: node linkType: hard +"hast-util-has-property@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-has-property@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/6e2c0e22ca893c6ebb60f8390e184c4deb041c36d09796756f02cd121c1789c0f5c862ed06caea8f1a80ea8c0ef6a7854dd57946c2eebb76488727bd4a1c952e + languageName: node + linkType: hard + +"hast-util-is-body-ok-link@npm:^3.0.0": + version: 3.0.1 + resolution: "hast-util-is-body-ok-link@npm:3.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/c320cbd9a9a834b007a6f2f8c271e98b8331c0193adf06e0a7c5ea0acae664e97ce28eb4436e0658bc5cdb8f47390ec1c6cba7c4fe1ded10951fcdd1432f60bf + languageName: node + linkType: hard + +"hast-util-is-element@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-is-element@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/f5361e4c9859c587ca8eb0d8343492f3077ccaa0f58a44cd09f35d5038f94d65152288dcd0c19336ef2c9491ec4d4e45fde2176b05293437021570aa0bc3613b + languageName: node + linkType: hard + +"hast-util-minify-whitespace@npm:^1.0.0": + version: 1.0.1 + resolution: "hast-util-minify-whitespace@npm:1.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-embedded: "npm:^3.0.0" + hast-util-is-element: "npm:^3.0.0" + hast-util-whitespace: "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10c0/20a7d64947e080463084f444ad09c7f28c40e7648ca2d9c6c036e42a67f8e945d352560ff599304c988257c1e477abcf6a1f508c0900211fa58ec1ba21b36533 + languageName: node + linkType: hard + "hast-util-parse-selector@npm:^4.0.0": version: 4.0.0 resolution: "hast-util-parse-selector@npm:4.0.0" @@ -25242,6 +25178,19 @@ __metadata: languageName: node linkType: hard +"hast-util-phrasing@npm:^3.0.0": + version: 3.0.1 + resolution: "hast-util-phrasing@npm:3.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-embedded: "npm:^3.0.0" + hast-util-has-property: "npm:^3.0.0" + hast-util-is-body-ok-link: "npm:^3.0.0" + hast-util-is-element: "npm:^3.0.0" + checksum: 10c0/d77e186ea3d7d62f6db9c4a55c3e6d9f1f6affd5f40250e8de9d73f167ae19fcc02fafe1601dfbe36e90f76ed5013ac004f0b6b398aee3a04a7a81de12788600 + languageName: node + linkType: hard + "hast-util-raw@npm:^9.0.0": version: 9.1.0 resolution: "hast-util-raw@npm:9.1.0" @@ -25263,6 +25212,29 @@ __metadata: languageName: node linkType: hard +"hast-util-select@npm:^6.0.4": + version: 6.0.4 + resolution: "hast-util-select@npm:6.0.4" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + bcp-47-match: "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + css-selector-parser: "npm:^3.0.0" + devlop: "npm:^1.0.0" + direction: "npm:^2.0.0" + hast-util-has-property: "npm:^3.0.0" + hast-util-to-string: "npm:^3.0.0" + hast-util-whitespace: "npm:^3.0.0" + nth-check: "npm:^2.0.0" + property-information: "npm:^7.0.0" + space-separated-tokens: "npm:^2.0.0" + unist-util-visit: "npm:^5.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/d6829953f829c24ffe465c2b156f6a7cd352f7d9b4d601e0e6ca38b85cc4a720bb9f027d34881c3b2a05f4b55c9375e256dbf43ca88604230da784e1c9c7d03f + languageName: node + linkType: hard + "hast-util-to-estree@npm:^3.0.0": version: 3.1.3 resolution: "hast-util-to-estree@npm:3.1.3" @@ -25287,6 +25259,25 @@ __metadata: languageName: node linkType: hard +"hast-util-to-html@npm:^9.0.0, hast-util-to-html@npm:^9.0.5": + version: 9.0.5 + resolution: "hast-util-to-html@npm:9.0.5" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + ccount: "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-whitespace: "npm:^3.0.0" + html-void-elements: "npm:^3.0.0" + mdast-util-to-hast: "npm:^13.0.0" + property-information: "npm:^7.0.0" + space-separated-tokens: "npm:^2.0.0" + stringify-entities: "npm:^4.0.0" + zwitch: "npm:^2.0.4" + checksum: 10c0/b7a08c30bab4371fc9b4a620965c40b270e5ae7a8e94cf885f43b21705179e28c8e43b39c72885d1647965fb3738654e6962eb8b58b0c2a84271655b4d748836 + languageName: node + linkType: hard + "hast-util-to-jsx-runtime@npm:^2.0.0": version: 2.3.6 resolution: "hast-util-to-jsx-runtime@npm:2.3.6" @@ -25310,6 +25301,28 @@ __metadata: languageName: node linkType: hard +"hast-util-to-mdast@npm:^10.0.0": + version: 10.1.2 + resolution: "hast-util-to-mdast@npm:10.1.2" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + "@ungap/structured-clone": "npm:^1.0.0" + hast-util-phrasing: "npm:^3.0.0" + hast-util-to-html: "npm:^9.0.0" + hast-util-to-text: "npm:^4.0.0" + hast-util-whitespace: "npm:^3.0.0" + mdast-util-phrasing: "npm:^4.0.0" + mdast-util-to-hast: "npm:^13.0.0" + mdast-util-to-string: "npm:^4.0.0" + rehype-minify-whitespace: "npm:^6.0.0" + trim-trailing-lines: "npm:^2.0.0" + unist-util-position: "npm:^5.0.0" + unist-util-visit: "npm:^5.0.0" + checksum: 10c0/2edd4521b147734078d66e03cd43c571a0a3aeefd3fcc34659c783b25e9222ddb5c8c759b12a86ebc70a25b3888505dc59b913ff36ae17cca04d52050592a963 + languageName: node + linkType: hard + "hast-util-to-parse5@npm:^8.0.0": version: 8.0.0 resolution: "hast-util-to-parse5@npm:8.0.0" @@ -25325,6 +25338,27 @@ __metadata: languageName: node linkType: hard +"hast-util-to-string@npm:^3.0.0, hast-util-to-string@npm:^3.0.1": + version: 3.0.1 + resolution: "hast-util-to-string@npm:3.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/b5fa1912a6ba6131affae52a0f4394406c4c0d23c2b0307f1d69988f1030c7bb830289303e67c5ad8f674f5f23a454c1dcd492c39e45a22c1f46d3c9bce5bd0c + languageName: node + linkType: hard + +"hast-util-to-text@npm:^4.0.0": + version: 4.0.2 + resolution: "hast-util-to-text@npm:4.0.2" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + hast-util-is-element: "npm:^3.0.0" + unist-util-find-after: "npm:^5.0.0" + checksum: 10c0/93ecc10e68fe5391c6e634140eb330942e71dea2724c8e0c647c73ed74a8ec930a4b77043b5081284808c96f73f2bee64ee416038ece75a63a467e8d14f09946 + languageName: node + linkType: hard + "hast-util-whitespace@npm:^3.0.0": version: 3.0.0 resolution: "hast-util-whitespace@npm:3.0.0" @@ -25473,13 +25507,6 @@ __metadata: languageName: node linkType: hard -"html-entities@npm:^2.3.2": - version: 2.6.0 - resolution: "html-entities@npm:2.6.0" - checksum: 10c0/7c8b15d9ea0cd00dc9279f61bab002ba6ca8a7a0f3c36ed2db3530a67a9621c017830d1d2c1c65beb9b8e3436ea663e9cf8b230472e0e413359399413b27c8b7 - languageName: node - linkType: hard - "html-escaper@npm:^2.0.0, html-escaper@npm:^2.0.2": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -25656,7 +25683,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-middleware@npm:^2.0.3": +"http-proxy-middleware@npm:^2.0.9": version: 2.0.9 resolution: "http-proxy-middleware@npm:2.0.9" dependencies: @@ -25749,6 +25776,13 @@ __metadata: languageName: node linkType: hard +"hyperdyperid@npm:^1.2.0": + version: 1.2.0 + resolution: "hyperdyperid@npm:1.2.0" + checksum: 10c0/885ba3177c7181d315a856ee9c0005ff8eb5dcb1ce9e9d61be70987895d934d84686c37c981cceeb53216d4c9c15c1cc25f1804e84cc6a74a16993c5d7fd0893 + languageName: node + linkType: hard + "i@npm:^0.3.7": version: 0.3.7 resolution: "i@npm:0.3.7" @@ -25859,17 +25893,6 @@ __metadata: languageName: node linkType: hard -"image-size@npm:^1.0.2": - version: 1.2.1 - resolution: "image-size@npm:1.2.1" - dependencies: - queue: "npm:6.0.2" - bin: - image-size: bin/image-size.js - checksum: 10c0/f8b3c19d4476513f1d7e55c3e6db80997b315444743e2040d545cbcaee59be03d2eb40c46be949a8372697b7003fdb0c04925d704390a7f606bc8181e25c0ed4 - languageName: node - linkType: hard - "image-size@npm:^2.0.2": version: 2.0.2 resolution: "image-size@npm:2.0.2" @@ -25886,13 +25909,6 @@ __metadata: languageName: node linkType: hard -"immer@npm:^9.0.7": - version: 9.0.21 - resolution: "immer@npm:9.0.21" - checksum: 10c0/03ea3ed5d4d72e8bd428df4a38ad7e483ea8308e9a113d3b42e0ea2cc0cc38340eb0a6aca69592abbbf047c685dbda04e3d34bf2ff438ab57339ed0a34cc0a05 - languageName: node - linkType: hard - "immutable@npm:^4.0.0-rc.12": version: 4.3.7 resolution: "immutable@npm:4.3.7" @@ -25907,7 +25923,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": +"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.1 resolution: "import-fresh@npm:3.3.1" dependencies: @@ -26019,7 +26035,7 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.2, ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:^1.3.8, ini@npm:~1.3.0": +"ini@npm:^1.3.2, ini@npm:^1.3.4, ini@npm:^1.3.8, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a @@ -26142,13 +26158,6 @@ __metadata: languageName: node linkType: hard -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 10c0/08c5ad30032edeec638485bc3f6db7d0094d9b3e85e0f950866600af3c52e9fd69715416d29564731c479d9f4d43ff3e4d302a178196bdc0e6837ec147640450 - languageName: node - linkType: hard - "intl-messageformat@npm:10.7.18": version: 10.7.18 resolution: "intl-messageformat@npm:10.7.18" @@ -26200,7 +26209,7 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:^2.0.1": +"ipaddr.js@npm:^2.1.0": version: 2.2.0 resolution: "ipaddr.js@npm:2.2.0" checksum: 10c0/e4ee875dc1bd92ac9d27e06cfd87cdb63ca786ff9fd7718f1d4f7a8ef27db6e5d516128f52d2c560408cbb75796ac2f83ead669e73507c86282d45f84c5abbb6 @@ -26396,6 +26405,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: 10c0/d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856 + languageName: node + linkType: hard + "is-extendable@npm:^0.1.0": version: 0.1.1 resolution: "is-extendable@npm:0.1.1" @@ -26485,6 +26503,17 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: 10c0/a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd + languageName: node + linkType: hard + "is-installed-globally@npm:^0.4.0": version: 0.4.0 resolution: "is-installed-globally@npm:0.4.0" @@ -26559,6 +26588,13 @@ __metadata: languageName: node linkType: hard +"is-network-error@npm:^1.0.0": + version: 1.3.0 + resolution: "is-network-error@npm:1.3.0" + checksum: 10c0/3e85a69e957988db66d5af5412efdd531a5a63e150d1bdd5647cfd4dc54fd89b1dbdd472621f8915233c3176ba1e6922afa8a51a9e363ba4693edf96a294f898 + languageName: node + linkType: hard + "is-nil@npm:^1.0.0": version: 1.0.1 resolution: "is-nil@npm:1.0.1" @@ -26604,13 +26640,6 @@ __metadata: languageName: node linkType: hard -"is-path-cwd@npm:^2.2.0": - version: 2.2.0 - resolution: "is-path-cwd@npm:2.2.0" - checksum: 10c0/afce71533a427a759cd0329301c18950333d7589533c2c90205bd3fdcf7b91eb92d1940493190567a433134d2128ec9325de2fd281e05be1920fbee9edd22e0a - languageName: node - linkType: hard - "is-path-cwd@npm:^3.0.0": version: 3.0.0 resolution: "is-path-cwd@npm:3.0.0" @@ -26711,13 +26740,6 @@ __metadata: languageName: node linkType: hard -"is-root@npm:^2.1.0": - version: 2.1.0 - resolution: "is-root@npm:2.1.0" - checksum: 10c0/83d3f5b052c3f28fbdbdf0d564bdd34fa14933f5694c78704f85cd1871255bc017fbe3fe2bc2fff2d227c6be5927ad2149b135c0a7c0060e7ac4e610d81a4f01 - languageName: node - linkType: hard - "is-set@npm:^2.0.3": version: 2.0.3 resolution: "is-set@npm:2.0.3" @@ -26852,6 +26874,15 @@ __metadata: languageName: node linkType: hard +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" + dependencies: + is-inside-container: "npm:^1.0.0" + checksum: 10c0/d3317c11995690a32c362100225e22ba793678fe8732660c6de511ae71a0ff05b06980cf21f98a6bf40d7be0e9e9506f859abe00a1118287d63e53d0a3d06947 + languageName: node + linkType: hard + "is-yarn-global@npm:^0.4.0": version: 0.4.1 resolution: "is-yarn-global@npm:0.4.1" @@ -28175,7 +28206,7 @@ __metadata: languageName: node linkType: hard -"json-schema@npm:0.4.0": +"json-schema@npm:0.4.0, json-schema@npm:^0.4.0": version: 0.4.0 resolution: "json-schema@npm:0.4.0" checksum: 10c0/d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 @@ -28453,7 +28484,7 @@ __metadata: languageName: node linkType: hard -"launch-editor@npm:^2.6.0": +"launch-editor@npm:^2.6.1": version: 2.12.0 resolution: "launch-editor@npm:2.12.0" dependencies: @@ -29077,13 +29108,6 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:^3.2.0": - version: 3.3.1 - resolution: "loader-utils@npm:3.3.1" - checksum: 10c0/f2af4eb185ac5bf7e56e1337b666f90744e9f443861ac521b48f093fb9e8347f191c8960b4388a3365147d218913bc23421234e7788db69f385bacfefa0b4758 - languageName: node - linkType: hard - "locate-path@npm:^2.0.0": version: 2.0.0 resolution: "locate-path@npm:2.0.0" @@ -29094,16 +29118,6 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" - dependencies: - p-locate: "npm:^3.0.0" - path-exists: "npm:^3.0.0" - checksum: 10c0/3db394b7829a7fe2f4fbdd25d3c4689b85f003c318c5da4052c7e56eed697da8f1bce5294f685c69ff76e32cba7a33629d94396976f6d05fb7f4c755c5e2ae8b - languageName: node - linkType: hard - "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -29559,6 +29573,15 @@ __metadata: languageName: node linkType: hard +"marked@npm:^16.3.0": + version: 16.4.2 + resolution: "marked@npm:16.4.2" + bin: + marked: bin/marked.js + checksum: 10c0/fc6051142172454f2023f3d6b31cca92879ec8e1b96457086a54c70354c74b00e1b6543a76a1fad6d399366f52b90a848f6ffb8e1d65a5baff87f3ba9b8f1847 + languageName: node + linkType: hard + "matcher@npm:^5.0.0": version: 5.0.0 resolution: "matcher@npm:5.0.0" @@ -29908,12 +29931,17 @@ __metadata: languageName: node linkType: hard -"memfs@npm:^3.1.2, memfs@npm:^3.4.3": - version: 3.5.3 - resolution: "memfs@npm:3.5.3" +"memfs@npm:^4.43.1": + version: 4.50.0 + resolution: "memfs@npm:4.50.0" dependencies: - fs-monkey: "npm:^1.0.4" - checksum: 10c0/038fc81bce17ea92dde15aaa68fa0fdaf4960c721ce3ffc7c2cb87a259333f5159784ea48b3b72bf9e054254d9d0d0d5209d0fdc3d07d08653a09933b168fbd7 + "@jsonjoy.com/json-pack": "npm:^1.11.0" + "@jsonjoy.com/util": "npm:^1.9.0" + glob-to-regex.js: "npm:^1.0.1" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.0.3" + tslib: "npm:^2.0.0" + checksum: 10c0/304cf75c4ee51f72f6a37f3194c8900468ead3f71d017c777ac4e7543ae34e951cd8d3f4fa04f7ef0181f57ba9417b71e41b548f947ace5e30f65b7357d19935 languageName: node linkType: hard @@ -30585,7 +30613,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.17, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -30656,7 +30684,7 @@ __metadata: languageName: node linkType: hard -"mini-css-extract-plugin@npm:^2.9.1, mini-css-extract-plugin@npm:^2.9.2": +"mini-css-extract-plugin@npm:^2.9.2": version: 2.9.4 resolution: "mini-css-extract-plugin@npm:2.9.4" dependencies: @@ -32121,7 +32149,7 @@ __metadata: languageName: node linkType: hard -"nth-check@npm:^2.0.1": +"nth-check@npm:^2.0.0, nth-check@npm:^2.0.1": version: 2.1.1 resolution: "nth-check@npm:2.1.1" dependencies: @@ -32476,7 +32504,19 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.0.9, open@npm:^8.4.0": +"open@npm:^10.0.3": + version: 10.2.0 + resolution: "open@npm:10.2.0" + dependencies: + default-browser: "npm:^5.2.1" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + wsl-utils: "npm:^0.1.0" + checksum: 10c0/5a36d0c1fd2f74ce553beb427ca8b8494b623fc22c6132d0c1688f246a375e24584ea0b44c67133d9ab774fa69be8e12fbe1ff12504b1142bd960fb09671948f + languageName: node + linkType: hard + +"open@npm:^8.4.0": version: 8.4.2 resolution: "open@npm:8.4.2" dependencies: @@ -32742,7 +32782,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": +"p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" dependencies: @@ -32778,15 +32818,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" - dependencies: - p-limit: "npm:^2.0.0" - checksum: 10c0/7b7f06f718f19e989ce6280ed4396fb3c34dabdee0df948376483032f9d5ec22fdf7077ec942143a75827bb85b11da72016497fc10dac1106c837ed593969ee8 - languageName: node - linkType: hard - "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -32861,13 +32892,14 @@ __metadata: languageName: node linkType: hard -"p-retry@npm:^4.5.0": - version: 4.6.2 - resolution: "p-retry@npm:4.6.2" +"p-retry@npm:^6.2.0": + version: 6.2.1 + resolution: "p-retry@npm:6.2.1" dependencies: - "@types/retry": "npm:0.12.0" + "@types/retry": "npm:0.12.2" + is-network-error: "npm:^1.0.0" retry: "npm:^0.13.1" - checksum: 10c0/d58512f120f1590cfedb4c2e0c42cb3fa66f3cea8a4646632fcb834c56055bb7a6f138aa57b20cc236fb207c9d694e362e0b5c2b14d9b062f67e8925580c73b0 + checksum: 10c0/10d014900107da2c7071ad60fffe4951675f09930b7a91681643ea224ae05649c05001d9e78436d902fe8b116d520dd1f60e72e091de097e2640979d56f3fb60 languageName: node linkType: hard @@ -33601,15 +33633,6 @@ __metadata: languageName: node linkType: hard -"pkg-up@npm:^3.1.0": - version: 3.1.0 - resolution: "pkg-up@npm:3.1.0" - dependencies: - find-up: "npm:^3.0.0" - checksum: 10c0/ecb60e1f8e1f611c0bdf1a0b6a474d6dfb51185567dc6f29cdef37c8d480ecba5362e006606bb290519bbb6f49526c403fabea93c3090c20368d98bb90c999ab - languageName: node - linkType: hard - "plimit-lit@npm:^1.2.6": version: 1.6.1 resolution: "plimit-lit@npm:1.6.1" @@ -33961,7 +33984,7 @@ __metadata: languageName: node linkType: hard -"postcss-loader@npm:^7.3.3, postcss-loader@npm:^7.3.4": +"postcss-loader@npm:^7.3.4": version: 7.3.4 resolution: "postcss-loader@npm:7.3.4" dependencies: @@ -34279,7 +34302,7 @@ __metadata: languageName: node linkType: hard -"postcss-preset-env@npm:^10.1.0, postcss-preset-env@npm:^10.2.1": +"postcss-preset-env@npm:^10.2.1": version: 10.4.0 resolution: "postcss-preset-env@npm:10.4.0" dependencies: @@ -34502,7 +34525,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.26, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.41, postcss@npm:^8.5.4, postcss@npm:^8.5.6": +"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.33, postcss@npm:^8.4.41, postcss@npm:^8.5.4, postcss@npm:^8.5.6": version: 8.5.6 resolution: "postcss@npm:8.5.6" dependencies: @@ -35055,15 +35078,6 @@ __metadata: languageName: node linkType: hard -"queue@npm:6.0.2": - version: 6.0.2 - resolution: "queue@npm:6.0.2" - dependencies: - inherits: "npm:~2.0.3" - checksum: 10c0/cf987476cc72e7d3aaabe23ccefaab1cd757a2b5e0c8d80b67c9575a6b5e1198807ffd4f0948a3f118b149d1111d810ee773473530b77a5c606673cac2c9c996 - languageName: node - linkType: hard - "quick-format-unescaped@npm:^4.0.3": version: 4.0.4 resolution: "quick-format-unescaped@npm:4.0.4" @@ -35183,38 +35197,6 @@ __metadata: languageName: node linkType: hard -"react-dev-utils@npm:^12.0.1": - version: 12.0.1 - resolution: "react-dev-utils@npm:12.0.1" - dependencies: - "@babel/code-frame": "npm:^7.16.0" - address: "npm:^1.1.2" - browserslist: "npm:^4.18.1" - chalk: "npm:^4.1.2" - cross-spawn: "npm:^7.0.3" - detect-port-alt: "npm:^1.1.6" - escape-string-regexp: "npm:^4.0.0" - filesize: "npm:^8.0.6" - find-up: "npm:^5.0.0" - fork-ts-checker-webpack-plugin: "npm:^6.5.0" - global-modules: "npm:^2.0.0" - globby: "npm:^11.0.4" - gzip-size: "npm:^6.0.0" - immer: "npm:^9.0.7" - is-root: "npm:^2.1.0" - loader-utils: "npm:^3.2.0" - open: "npm:^8.4.0" - pkg-up: "npm:^3.1.0" - prompts: "npm:^2.4.2" - react-error-overlay: "npm:^6.0.11" - recursive-readdir: "npm:^2.2.2" - shell-quote: "npm:^1.7.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - checksum: 10c0/94bc4ee5014290ca47a025e53ab2205c5dc0299670724d46a0b1bacbdd48904827b5ae410842d0a3a92481509097ae032e4a9dc7ca70db437c726eaba6411e82 - languageName: node - linkType: hard - "react-diff-viewer-continued@npm:^4.0.5": version: 4.0.6 resolution: "react-diff-viewer-continued@npm:4.0.6" @@ -35264,13 +35246,6 @@ __metadata: languageName: node linkType: hard -"react-error-overlay@npm:^6.0.11": - version: 6.1.0 - resolution: "react-error-overlay@npm:6.1.0" - checksum: 10c0/2b52308b9e489dfaa25df85c7ed5c200371bc214245161a0833b729f9c6b1a2e591e1d1e07c3d3859ffa19b84a386c219d93df9ba13d819be34c20f40e71a555 - languageName: node - linkType: hard - "react-fast-compare@npm:^3.2.0": version: 3.2.2 resolution: "react-fast-compare@npm:3.2.2" @@ -35294,22 +35269,6 @@ __metadata: languageName: node linkType: hard -"react-helmet-async@npm:^1.3.0": - version: 1.3.0 - resolution: "react-helmet-async@npm:1.3.0" - dependencies: - "@babel/runtime": "npm:^7.12.5" - invariant: "npm:^2.2.4" - prop-types: "npm:^15.7.2" - react-fast-compare: "npm:^3.2.0" - shallowequal: "npm:^1.1.0" - peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/8f3e6d26beff61d2ed18f7b41561df3e4d83a7582914c7196aa65158c7f3cce939276547d7a0b8987952d9d44131406df74efba02d1f8fa8a3940b49e6ced70b - languageName: node - linkType: hard - "react-hook-form@npm:*": version: 7.66.0 resolution: "react-hook-form@npm:7.66.0" @@ -35350,6 +35309,15 @@ __metadata: languageName: node linkType: hard +"react-icons@npm:^5.5.0": + version: 5.5.0 + resolution: "react-icons@npm:5.5.0" + peerDependencies: + react: "*" + checksum: 10c0/a24309bfc993c19cbcbfc928157e53a137851822779977b9588f6dd41ffc4d11ebc98b447f4039b0d309a858f0a42980f6bfb4477fb19f9f2d1bc2e190fcf79c + languageName: node + linkType: hard + "react-intl@npm:*": version: 7.1.14 resolution: "react-intl@npm:7.1.14" @@ -35826,15 +35794,6 @@ __metadata: languageName: node linkType: hard -"rechoir@npm:^0.6.2": - version: 0.6.2 - resolution: "rechoir@npm:0.6.2" - dependencies: - resolve: "npm:^1.1.6" - checksum: 10c0/22c4bb32f4934a9468468b608417194f7e3ceba9a508512125b16082c64f161915a28467562368eeb15dc16058eb5b7c13a20b9eb29ff9927d1ebb3b5aa83e84 - languageName: node - linkType: hard - "recma-build-jsx@npm:^1.0.0": version: 1.0.0 resolution: "recma-build-jsx@npm:1.0.0" @@ -35885,15 +35844,6 @@ __metadata: languageName: node linkType: hard -"recursive-readdir@npm:^2.2.2": - version: 2.2.3 - resolution: "recursive-readdir@npm:2.2.3" - dependencies: - minimatch: "npm:^3.0.5" - checksum: 10c0/d0238f137b03af9cd645e1e0b40ae78b6cda13846e3ca57f626fcb58a66c79ae018a10e926b13b3a460f1285acc946a4e512ea8daa2e35df4b76a105709930d1 - languageName: node - linkType: hard - "redent@npm:^3.0.0": version: 3.0.0 resolution: "redent@npm:3.0.0" @@ -36016,6 +35966,27 @@ __metadata: languageName: node linkType: hard +"rehype-minify-whitespace@npm:^6.0.0": + version: 6.0.2 + resolution: "rehype-minify-whitespace@npm:6.0.2" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-minify-whitespace: "npm:^1.0.0" + checksum: 10c0/e808a452068392070dcba4ea0fdc24c783e21ddc9c70008f90827ddd29afa6fb82f77473bba91e06b48cef8575553f906fa8ab44ae59700f945eb0910927acd9 + languageName: node + linkType: hard + +"rehype-parse@npm:^9": + version: 9.0.1 + resolution: "rehype-parse@npm:9.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-from-html: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/efa9ca17673fe70e2d322a1d262796bbed5f6a89382f8f8393352bbd6f6bbf1d4d1d050984b86ff9cb6c0fa2535175ab0829e53c94b1e38fc3c158e6c0ad90bc + languageName: node + linkType: hard + "rehype-raw@npm:^7.0.0": version: 7.0.0 resolution: "rehype-raw@npm:7.0.0" @@ -36038,6 +36009,19 @@ __metadata: languageName: node linkType: hard +"rehype-remark@npm:^10": + version: 10.0.1 + resolution: "rehype-remark@npm:10.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + hast-util-to-mdast: "npm:^10.0.0" + unified: "npm:^11.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/e013fad22dd7b3bf653a79cf3dc4fecd434c5eb5f89f41e1932ae12f592b3a83c980f759d4a6ae764a61a6ea7f08330f9908c235c11510d3be731e80290aa0ba + languageName: node + linkType: hard + "relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" @@ -36089,7 +36073,7 @@ __metadata: languageName: node linkType: hard -"remark-gfm@npm:^4.0.0": +"remark-gfm@npm:^4, remark-gfm@npm:^4.0.0": version: 4.0.1 resolution: "remark-gfm@npm:4.0.1" dependencies: @@ -36138,7 +36122,7 @@ __metadata: languageName: node linkType: hard -"remark-stringify@npm:^11.0.0": +"remark-stringify@npm:^11, remark-stringify@npm:^11.0.0": version: 11.0.0 resolution: "remark-stringify@npm:11.0.0" dependencies: @@ -36314,7 +36298,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.10, resolve@npm:^1.22.4, resolve@npm:^1.22.8": +"resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.10, resolve@npm:^1.22.4, resolve@npm:^1.22.8": version: 1.22.11 resolution: "resolve@npm:1.22.11" dependencies: @@ -36349,7 +36333,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.11 resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" dependencies: @@ -36644,13 +36628,6 @@ __metadata: languageName: node linkType: hard -"rtl-detect@npm:^1.0.4": - version: 1.1.2 - resolution: "rtl-detect@npm:1.1.2" - checksum: 10c0/1b92888aafca1593314f837e83fdf02eb208faae3e713ab87c176804728efd3b1980d53b64f65f1fa593348087e852c5cd729b7b9372950f6e9b7be489afc0ca - languageName: node - linkType: hard - "rtlcss@npm:^4.1.0": version: 4.3.0 resolution: "rtlcss@npm:4.3.0" @@ -36665,6 +36642,13 @@ __metadata: languageName: node linkType: hard +"run-applescript@npm:^7.0.0": + version: 7.1.0 + resolution: "run-applescript@npm:7.1.0" + checksum: 10c0/ab826c57c20f244b2ee807704b1ef4ba7f566aa766481ae5922aac785e2570809e297c69afcccc3593095b538a8a77d26f2b2e9a1d9dffee24e0e039502d1a03 + languageName: node + linkType: hard + "run-async@npm:^0.1.0": version: 0.1.0 resolution: "run-async@npm:0.1.0" @@ -36768,9 +36752,9 @@ __metadata: languageName: node linkType: hard -"sandbox-evm@workspace:sdk/sandboxes/sandbox_evm": +"sandbox-evm@workspace:sandbox/sandbox_evm": version: 0.0.0-use.local - resolution: "sandbox-evm@workspace:sdk/sandboxes/sandbox_evm" + resolution: "sandbox-evm@workspace:sandbox/sandbox_evm" dependencies: "@heroicons/react": "npm:~2.1.5" "@keplr-wallet/proto-types": "npm:^0.12.250" @@ -36810,9 +36794,9 @@ __metadata: languageName: unknown linkType: soft -"sandbox_simple_host@workspace:sdk/sandboxes/sandbox_simple_host": +"sandbox_simple_host@workspace:sandbox/sandbox_simple_host": version: 0.0.0-use.local - resolution: "sandbox_simple_host@workspace:sdk/sandboxes/sandbox_simple_host" + resolution: "sandbox_simple_host@workspace:sandbox/sandbox_simple_host" dependencies: "@cosmjs/stargate": "npm:^0.34.0" "@esbuild-plugins/node-globals-polyfill": "npm:^0.2.3" @@ -36905,17 +36889,6 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:2.7.0": - version: 2.7.0 - resolution: "schema-utils@npm:2.7.0" - dependencies: - "@types/json-schema": "npm:^7.0.4" - ajv: "npm:^6.12.2" - ajv-keywords: "npm:^3.4.1" - checksum: 10c0/723c3c856a0313a89aa81c5fb2c93d4b11225f5cdd442665fddd55d3c285ae72e079f5286a3a9a1a973affe888f6c33554a2cf47b79b24cd8de2f1f756a6fb1b - languageName: node - linkType: hard - "schema-utils@npm:^3.0.0": version: 3.3.0 resolution: "schema-utils@npm:3.3.0" @@ -36927,7 +36900,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": version: 4.3.3 resolution: "schema-utils@npm:4.3.3" dependencies: @@ -36977,7 +36950,7 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^2.1.1": +"selfsigned@npm:^2.4.1": version: 2.4.1 resolution: "selfsigned@npm:2.4.1" dependencies: @@ -37468,26 +37441,13 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.7.3, shell-quote@npm:^1.8.3": +"shell-quote@npm:^1.8.3": version: 1.8.3 resolution: "shell-quote@npm:1.8.3" checksum: 10c0/bee87c34e1e986cfb4c30846b8e6327d18874f10b535699866f368ade11ea4ee45433d97bf5eada22c4320c27df79c3a6a7eb1bf3ecfc47f2c997d9e5e2672fd languageName: node linkType: hard -"shelljs@npm:^0.8.5": - version: 0.8.5 - resolution: "shelljs@npm:0.8.5" - dependencies: - glob: "npm:^7.0.0" - interpret: "npm:^1.0.0" - rechoir: "npm:^0.6.2" - bin: - shjs: bin/shjs - checksum: 10c0/feb25289a12e4bcd04c40ddfab51aff98a3729f5c2602d5b1a1b95f6819ec7804ac8147ebd8d9a85dfab69d501bcf92d7acef03247320f51c1552cec8d8e2382 - languageName: node - linkType: hard - "side-channel-list@npm:^1.0.0": version: 1.0.0 resolution: "side-channel-list@npm:1.0.0" @@ -38224,7 +38184,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": +"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" dependencies: @@ -38648,6 +38608,18 @@ __metadata: languageName: node linkType: hard +"swr@npm:^2.2.5": + version: 2.3.6 + resolution: "swr@npm:2.3.6" + dependencies: + dequal: "npm:^2.0.3" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/9534f350982e36a3ae0a13da8c0f7da7011fc979e77f306e60c4e5db0f9b84f17172c44f973441ba56bb684b69b0d9838ab40011a6b6b3e32d0cd7f3d5405f99 + languageName: node + linkType: hard + "symbol-observable@npm:^2.0.3": version: 2.0.3 resolution: "symbol-observable@npm:2.0.3" @@ -38715,13 +38687,6 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^1.0.0": - version: 1.1.3 - resolution: "tapable@npm:1.1.3" - checksum: 10c0/c9f0265e55e45821ec672b9b9ee8a35d95bf3ea6b352199f8606a2799018e89cfe4433c554d424b31fc67c4be26b05d4f36dc3c607def416fdb2514cd63dba50 - languageName: node - linkType: hard - "tapable@npm:^2.0.0, tapable@npm:^2.2.0, tapable@npm:^2.2.1, tapable@npm:^2.3.0": version: 2.3.0 resolution: "tapable@npm:2.3.0" @@ -38882,6 +38847,15 @@ __metadata: languageName: node linkType: hard +"thingies@npm:^2.5.0": + version: 2.5.0 + resolution: "thingies@npm:2.5.0" + peerDependencies: + tslib: ^2 + checksum: 10c0/52194642c129615b6af15648621be9a2784ad25526e3facca6c28aa1a36ea32245ef146ebc3fbaf64a3605b8301a5335da505d0c314f851ff293b184e0de7fb9 + languageName: node + linkType: hard + "thread-stream@npm:^0.15.1": version: 0.15.2 resolution: "thread-stream@npm:0.15.2" @@ -38891,6 +38865,13 @@ __metadata: languageName: node linkType: hard +"throttleit@npm:2.1.0": + version: 2.1.0 + resolution: "throttleit@npm:2.1.0" + checksum: 10c0/1696ae849522cea6ba4f4f3beac1f6655d335e51b42d99215e196a718adced0069e48deaaf77f7e89f526ab31de5b5c91016027da182438e6f9280be2f3d5265 + languageName: node + linkType: hard + "through2@npm:^2.0.0": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -39110,6 +39091,15 @@ __metadata: languageName: node linkType: hard +"tree-dump@npm:^1.0.3, tree-dump@npm:^1.1.0": + version: 1.1.0 + resolution: "tree-dump@npm:1.1.0" + peerDependencies: + tslib: 2 + checksum: 10c0/079f0f0163b68ee2eedc65cab1de6fb121487eba9ae135c106a8bc5e4ab7906ae0b57d86016e4a7da8c0ee906da1eae8c6a1490cd6e2a5e5ccbca321e1f959ca + languageName: node + linkType: hard + "treeverse@npm:^3.0.0": version: 3.0.0 resolution: "treeverse@npm:3.0.0" @@ -39131,6 +39121,13 @@ __metadata: languageName: node linkType: hard +"trim-trailing-lines@npm:^2.0.0": + version: 2.1.0 + resolution: "trim-trailing-lines@npm:2.1.0" + checksum: 10c0/9b010d16b191422d08678f5a4988213dffd8ae9445e1b0f7f7b3e5b28ffdb062a8465a7988b66999b90589b386ddc93b56d23545ba75a74ebaf5838b30594cb9 + languageName: node + linkType: hard + "triple-beam@npm:^1.3.0, triple-beam@npm:^1.4.1": version: 1.4.1 resolution: "triple-beam@npm:1.4.1" @@ -39874,7 +39871,7 @@ __metadata: languageName: node linkType: hard -"unified@npm:^11.0.0, unified@npm:^11.0.3, unified@npm:^11.0.4": +"unified@npm:^11, unified@npm:^11.0.0, unified@npm:^11.0.3, unified@npm:^11.0.4": version: 11.0.5 resolution: "unified@npm:11.0.5" dependencies: @@ -39934,6 +39931,16 @@ __metadata: languageName: node linkType: hard +"unist-util-find-after@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-find-after@npm:5.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10c0/a7cea473c4384df8de867c456b797ff1221b20f822e1af673ff5812ed505358b36f47f3b084ac14c3622cb879ed833b71b288e8aa71025352a2aab4c2925a6eb + languageName: node + linkType: hard + "unist-util-is@npm:^6.0.0": version: 6.0.1 resolution: "unist-util-is@npm:6.0.1" @@ -39980,7 +39987,7 @@ __metadata: languageName: node linkType: hard -"unist-util-visit@npm:^5.0.0": +"unist-util-visit@npm:^5, unist-util-visit@npm:^5.0.0": version: 5.0.0 resolution: "unist-util-visit@npm:5.0.0" dependencies: @@ -40308,7 +40315,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.6.0": +"use-sync-external-store@npm:^1.4.0, use-sync-external-store@npm:^1.6.0": version: 1.6.0 resolution: "use-sync-external-store@npm:1.6.0" peerDependencies: @@ -40941,57 +40948,59 @@ __metadata: languageName: node linkType: hard -"webpack-dev-middleware@npm:^5.3.4": - version: 5.3.4 - resolution: "webpack-dev-middleware@npm:5.3.4" +"webpack-dev-middleware@npm:^7.4.2": + version: 7.4.5 + resolution: "webpack-dev-middleware@npm:7.4.5" dependencies: colorette: "npm:^2.0.10" - memfs: "npm:^3.4.3" - mime-types: "npm:^2.1.31" + memfs: "npm:^4.43.1" + mime-types: "npm:^3.0.1" + on-finished: "npm:^2.4.1" range-parser: "npm:^1.2.1" schema-utils: "npm:^4.0.0" peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 10c0/257df7d6bc5494d1d3cb66bba70fbdf5a6e0423e39b6420f7631aeb52435afbfbff8410a62146dcdf3d2f945c62e03193aae2ac1194a2f7d5a2523b9d194e9e1 + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 10c0/e72fa7de3b1589c0c518976358f946d9ec97699a3eb90bfd40718f4be3e9d5d13dc80f748c5c16662efbf1400cedbb523c79f56a778e6e8ffbdf1bd93be547eb languageName: node linkType: hard -"webpack-dev-server@npm:^4.15.2": - version: 4.15.2 - resolution: "webpack-dev-server@npm:4.15.2" - dependencies: - "@types/bonjour": "npm:^3.5.9" - "@types/connect-history-api-fallback": "npm:^1.3.5" - "@types/express": "npm:^4.17.13" - "@types/serve-index": "npm:^1.9.1" - "@types/serve-static": "npm:^1.13.10" - "@types/sockjs": "npm:^0.3.33" - "@types/ws": "npm:^8.5.5" +"webpack-dev-server@npm:^5.2.2": + version: 5.2.2 + resolution: "webpack-dev-server@npm:5.2.2" + dependencies: + "@types/bonjour": "npm:^3.5.13" + "@types/connect-history-api-fallback": "npm:^1.5.4" + "@types/express": "npm:^4.17.21" + "@types/express-serve-static-core": "npm:^4.17.21" + "@types/serve-index": "npm:^1.9.4" + "@types/serve-static": "npm:^1.15.5" + "@types/sockjs": "npm:^0.3.36" + "@types/ws": "npm:^8.5.10" ansi-html-community: "npm:^0.0.8" - bonjour-service: "npm:^1.0.11" - chokidar: "npm:^3.5.3" + bonjour-service: "npm:^1.2.1" + chokidar: "npm:^3.6.0" colorette: "npm:^2.0.10" compression: "npm:^1.7.4" connect-history-api-fallback: "npm:^2.0.0" - default-gateway: "npm:^6.0.3" - express: "npm:^4.17.3" + express: "npm:^4.21.2" graceful-fs: "npm:^4.2.6" - html-entities: "npm:^2.3.2" - http-proxy-middleware: "npm:^2.0.3" - ipaddr.js: "npm:^2.0.1" - launch-editor: "npm:^2.6.0" - open: "npm:^8.0.9" - p-retry: "npm:^4.5.0" - rimraf: "npm:^3.0.2" - schema-utils: "npm:^4.0.0" - selfsigned: "npm:^2.1.1" + http-proxy-middleware: "npm:^2.0.9" + ipaddr.js: "npm:^2.1.0" + launch-editor: "npm:^2.6.1" + open: "npm:^10.0.3" + p-retry: "npm:^6.2.0" + schema-utils: "npm:^4.2.0" + selfsigned: "npm:^2.4.1" serve-index: "npm:^1.9.1" sockjs: "npm:^0.3.24" spdy: "npm:^4.0.2" - webpack-dev-middleware: "npm:^5.3.4" - ws: "npm:^8.13.0" + webpack-dev-middleware: "npm:^7.4.2" + ws: "npm:^8.18.0" peerDependencies: - webpack: ^4.37.0 || ^5.0.0 + webpack: ^5.0.0 peerDependenciesMeta: webpack: optional: true @@ -40999,7 +41008,7 @@ __metadata: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: 10c0/625bd5b79360afcf98782c8b1fd710b180bb0e96d96b989defff550c546890010ceea82ffbecb2a0a23f7f018bc72f2dee7b3070f7b448fb0110df6657fb2904 + checksum: 10c0/58d7ddb054cdbba22ddfa3d6644194abf6197c14530e1e64ccd7f0b670787245eea966ee72e95abd551c54313627bde0d227a0d2a1e2557102b1a3504ac0b7f1 languageName: node linkType: hard @@ -41209,17 +41218,6 @@ __metadata: languageName: node linkType: hard -"which@npm:^1.3.1": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -41563,7 +41561,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.18.3, ws@npm:^8.13.0, ws@npm:^8.18.0": +"ws@npm:8.18.3, ws@npm:^8.18.0": version: 8.18.3 resolution: "ws@npm:8.18.3" peerDependencies: @@ -41593,6 +41591,15 @@ __metadata: languageName: node linkType: hard +"wsl-utils@npm:^0.1.0": + version: 0.1.0 + resolution: "wsl-utils@npm:0.1.0" + dependencies: + is-wsl: "npm:^3.1.0" + checksum: 10c0/44318f3585eb97be994fc21a20ddab2649feaf1fbe893f1f866d936eea3d5f8c743bec6dc02e49fbdd3c0e69e9b36f449d90a0b165a4f47dd089747af4cf2377 + languageName: node + linkType: hard + "xdg-basedir@npm:^5.0.1, xdg-basedir@npm:^5.1.0": version: 5.1.0 resolution: "xdg-basedir@npm:5.1.0" @@ -41677,7 +41684,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.10.0, yaml@npm:^1.7.2": +"yaml@npm:^1.10.0": version: 1.10.2 resolution: "yaml@npm:1.10.2" checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f @@ -41799,7 +41806,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:*, zod@npm:4.1.12, zod@npm:^4.0.14, zod@npm:^4.0.5, zod@npm:^4.1.5": +"zod@npm:*, zod@npm:4.1.12, zod@npm:^4.0.14, zod@npm:^4.0.5, zod@npm:^4.1.5, zod@npm:^4.1.8": version: 4.1.12 resolution: "zod@npm:4.1.12" checksum: 10c0/b64c1feb19e99d77075261eaf613e0b2be4dfcd3551eff65ad8b4f2a079b61e379854d066f7d447491fcf193f45babd8095551a9d47973d30b46b6d8e2c46774 @@ -41883,7 +41890,7 @@ __metadata: languageName: node linkType: hard -"zwitch@npm:^2.0.0": +"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": version: 2.0.4 resolution: "zwitch@npm:2.0.4" checksum: 10c0/3c7830cdd3378667e058ffdb4cf2bb78ac5711214e2725900873accb23f3dfe5f9e7e5a06dcdc5f29605da976fc45c26d9a13ca334d6eea2245a15e77b8fc06e