diff --git a/.vscode/settings.json b/.vscode/settings.json index f2e654be4..bd4be0338 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "cSpell.words": ["vitnode"], + "cSpell.words": ["sonner", "vitnode"], "github.copilot.chat.commitMessageGeneration.instructions": [ { "text": "Follow the Conventional Commits format strictly for commit messages. Use the structure below:\n\n```\n[optional scope]: \n```\n\nGuidelines:\n\n1. **Type and Scope**: Choose an appropriate type (e.g., `feat`, `fix`, `refactor`, `docs`) and optional scope to describe the affected module or feature.\n\n2. **Gitmoji**: Include a relevant `gitmoji` that best represents the nature of the change.\n\n3. **Description**: Write a concise, informative description in the header; use backticks if referencing code or specific terms.\n\nCommit messages should be clear, informative, and professional, aiding readability and project tracking." diff --git a/apps/docs/content/docs/dev/config/rate-limiter.mdx b/apps/docs/content/docs/dev/config/rate-limiter.mdx index f6001fe07..696da72c7 100644 --- a/apps/docs/content/docs/dev/config/rate-limiter.mdx +++ b/apps/docs/content/docs/dev/config/rate-limiter.mdx @@ -11,7 +11,7 @@ Rate limiting is a powerful feature that helps protect your API from abuse and b export const vitNodeApiConfig = buildApiConfig({ // [!code ++:4] rateLimiter: { - points: 20, + points: 40, duration: 60, }, }); @@ -27,7 +27,7 @@ import { TypeTable } from 'fumadocs-ui/components/type-table'; description: 'The number of requests allowed within the specified duration.', type: 'number', - default: '20', + default: '40', }, duration: { description: diff --git a/apps/docs/content/docs/dev/logging.mdx b/apps/docs/content/docs/dev/logging.mdx new file mode 100644 index 000000000..63e1bc067 --- /dev/null +++ b/apps/docs/content/docs/dev/logging.mdx @@ -0,0 +1,4 @@ +--- +title: Logging +description: Centralized logging with VitNode +--- diff --git a/apps/docs/content/docs/dev/meta.json b/apps/docs/content/docs/dev/meta.json index 8e654a7bb..8dbb14c8c 100644 --- a/apps/docs/content/docs/dev/meta.json +++ b/apps/docs/content/docs/dev/meta.json @@ -20,6 +20,7 @@ "i18n", "---Framework---", "config", + "logging", "---Advanced---", "..." ] diff --git a/apps/docs/content/docs/ui/confirm-action-alert-dialog.mdx b/apps/docs/content/docs/ui/confirm-action-alert-dialog.mdx new file mode 100644 index 000000000..d81ab0bc4 --- /dev/null +++ b/apps/docs/content/docs/ui/confirm-action-alert-dialog.mdx @@ -0,0 +1,81 @@ +--- +title: Confirm Action Alert Dialog +description: A dialog component for confirming destructive actions like delete operations, built on top of the Alert Dialog. +--- + +The Confirm Action Alert Dialog is a specialized dialog component built on top of the [Alert Dialog](/docs/ui/alert-dialog) that provides a consistent way to confirm potentially destructive or irreversible actions before they're executed. + +It's particularly useful for: + +- Deleting items (e.g., categories, posts, users) +- Performing actions that cannot be undone (e.g., clearing data, resetting settings) +- Confirming critical operations (e.g., account deletion, data migration) +- Any action where user confirmation is necessary to prevent accidental execution + +## Usage + +```tsx +import { ConfirmActionAlertDialog } from '@vitnode/core/components/confirm-action/confirm-action-alert-dialog'; +import { Button } from '@vitnode/core/components/ui/button'; +``` + +```tsx + { + const result = await deleteCategoryApi(id); + + if (result?.error) { + toast.error(tGlobal('errors.title'), { + description: tGlobal('errors.internal_server_error'), + }); + return; // Keep dialog open on error + } + + toast.success(t('success'), { + description: title, + }); + onClose(); // Close dialog on success + }} +> + + +``` + +## Props + +import { TypeTable } from 'fumadocs-ui/components/type-table'; + + void }) => Promise', + required: true, + }, + title: { + description: + 'Custom title for the dialog. Defaults to translated "Are you sure?"', + type: 'string', + default: 'Are you sure?', + }, + description: { + description: + 'Custom description explaining what will happen when the action is confirmed.', + type: 'ReactNode', + default: 'This action cannot be undone.', + }, + textSubmit: { + description: + 'Custom text for the submit button. Defaults to translated "Confirm".', + type: 'string', + default: 'Confirm', + }, + }} +/> diff --git a/apps/docs/content/docs/ui/hooks/meta.json b/apps/docs/content/docs/ui/hooks/meta.json index 097b7bd47..6db9be2a0 100644 --- a/apps/docs/content/docs/ui/hooks/meta.json +++ b/apps/docs/content/docs/ui/hooks/meta.json @@ -1,4 +1,5 @@ { "title": "Hooks", + "icon": "Webhook", "pages": ["..."] } diff --git a/apps/docs/content/docs/ui/meta.json b/apps/docs/content/docs/ui/meta.json index 33481d696..9a3cfbdad 100644 --- a/apps/docs/content/docs/ui/meta.json +++ b/apps/docs/content/docs/ui/meta.json @@ -3,5 +3,24 @@ "description": "Make it pretty", "icon": "Paintbrush", "root": true, - "pages": ["index", "hooks", "---Forms---", "auto-form", "..."] + "pages": [ + "index", + "hooks", + "not-found", + "---Components---", + "data-table", + "confirm-action-alert-dialog", + "---Forms---", + "auto-form", + "checkbox", + "combobox-async", + "combobox", + "input", + "radio-group", + "select", + "switch", + "textarea", + "---UI---", + "..." + ] } diff --git a/apps/docs/content/docs/ui/static-pages.mdx b/apps/docs/content/docs/ui/static-pages.mdx deleted file mode 100644 index 654762102..000000000 --- a/apps/docs/content/docs/ui/static-pages.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Static Pages -description: xxx ---- - -By default VitNode diff --git a/apps/docs/package.json b/apps/docs/package.json index b9a3a6fd9..7cbe8a371 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -27,7 +27,7 @@ "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "postcss": "^8.5.6", - "shiki": "^3.6.0", + "shiki": "^3.7.0", "tailwindcss": "^4.1.10", "typescript": "^5.8.3" } diff --git a/apps/docs/src/app/global.css b/apps/docs/src/app/global.css index 83d5e327d..267bc9998 100644 --- a/apps/docs/src/app/global.css +++ b/apps/docs/src/app/global.css @@ -52,7 +52,7 @@ --popover: oklch(0.18 0 0); --popover-foreground: oklch(0.98 0 0); --primary: oklch(0.51 0.16 262.61); - --primary-foreground: oklch(0.99 0.16 262.61); + --primary-foreground: oklch(0.98 0 0); --secondary: oklch(0.24 0.01 240); --secondary-foreground: oklch(0.98 0.005 240); --muted: oklch(0.22 0 0); @@ -60,8 +60,8 @@ --accent: oklch(0.28 0 0); --destructive: oklch(0.704 0.191 22.216); --destructive-foreground: oklch(0.704 0.191 22.216); - --border: oklch(0.24 0 0); - --input: oklch(0.24 0 0); + --border: oklch(0.28 0 0); + --input: oklch(0.28 0 0); --ring: oklch(0.51 0.16 262.61); --chart-1: oklch(0.488 0.243 264.376); --chart-2: oklch(0.696 0.17 162.48); diff --git a/apps/web/migrations/0002_superb_natasha_romanoff.sql b/apps/web/migrations/0002_superb_natasha_romanoff.sql new file mode 100644 index 000000000..665631ad9 --- /dev/null +++ b/apps/web/migrations/0002_superb_natasha_romanoff.sql @@ -0,0 +1,13 @@ +CREATE TYPE "public"."typeLogs" AS ENUM('info', 'warn', 'error', 'debug');--> statement-breakpoint +CREATE TABLE "core_logs" ( + "id" serial PRIMARY KEY NOT NULL, + "pluginCode" varchar(255) NOT NULL, + "type" "typeLogs" DEFAULT 'info' NOT NULL, + "content" text NOT NULL, + "createdAt" timestamp DEFAULT now() NOT NULL, + "userId" integer, + "ipAddress" varchar(45) DEFAULT '' NOT NULL +); +--> statement-breakpoint +ALTER TABLE "core_logs" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint +ALTER TABLE "core_logs" ADD CONSTRAINT "core_logs_userId_core_users_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."core_users"("id") ON DELETE set null ON UPDATE no action; \ No newline at end of file diff --git a/apps/web/migrations/meta/0002_snapshot.json b/apps/web/migrations/meta/0002_snapshot.json new file mode 100644 index 000000000..678a7cb93 --- /dev/null +++ b/apps/web/migrations/meta/0002_snapshot.json @@ -0,0 +1,1422 @@ +{ + "id": "dc77dff2-5f35-42d7-84b1-6f6a96b81945", + "prevId": "147890d3-87ad-4e29-a83e-43b220c8af80", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.core_admin_permissions": { + "name": "core_admin_permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "roleId": { + "name": "roleId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "userId": { + "name": "userId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "protected": { + "name": "protected", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": { + "core_admin_permissions_role_id_idx": { + "name": "core_admin_permissions_role_id_idx", + "columns": [ + { + "expression": "roleId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "core_admin_permissions_user_id_idx": { + "name": "core_admin_permissions_user_id_idx", + "columns": [ + { + "expression": "userId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "core_admin_permissions_roleId_core_roles_id_fk": { + "name": "core_admin_permissions_roleId_core_roles_id_fk", + "tableFrom": "core_admin_permissions", + "tableTo": "core_roles", + "columnsFrom": [ + "roleId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "core_admin_permissions_userId_core_users_id_fk": { + "name": "core_admin_permissions_userId_core_users_id_fk", + "tableFrom": "core_admin_permissions", + "tableTo": "core_users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_admin_sessions": { + "name": "core_admin_sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "lastSeen": { + "name": "lastSeen", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "deviceId": { + "name": "deviceId", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "core_admin_sessions_token_idx": { + "name": "core_admin_sessions_token_idx", + "columns": [ + { + "expression": "token", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "core_admin_sessions_user_id_idx": { + "name": "core_admin_sessions_user_id_idx", + "columns": [ + { + "expression": "userId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "core_admin_sessions_userId_core_users_id_fk": { + "name": "core_admin_sessions_userId_core_users_id_fk", + "tableFrom": "core_admin_sessions", + "tableTo": "core_users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "core_admin_sessions_deviceId_core_sessions_known_devices_id_fk": { + "name": "core_admin_sessions_deviceId_core_sessions_known_devices_id_fk", + "tableFrom": "core_admin_sessions", + "tableTo": "core_sessions_known_devices", + "columnsFrom": [ + "deviceId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "core_admin_sessions_token_unique": { + "name": "core_admin_sessions_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_languages": { + "name": "core_languages", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "code": { + "name": "code", + "type": "varchar(32)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "timezone": { + "name": "timezone", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "default": "'UTC'" + }, + "protected": { + "name": "protected", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "default": { + "name": "default", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "time24": { + "name": "time24", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": { + "core_languages_code_idx": { + "name": "core_languages_code_idx", + "columns": [ + { + "expression": "code", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "core_languages_name_idx": { + "name": "core_languages_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "core_languages_code_unique": { + "name": "core_languages_code_unique", + "nullsNotDistinct": false, + "columns": [ + "code" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_languages_words": { + "name": "core_languages_words", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "languageCode": { + "name": "languageCode", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "pluginCode": { + "name": "pluginCode", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "itemId": { + "name": "itemId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tableName": { + "name": "tableName", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "variable": { + "name": "variable", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "core_languages_words_lang_code_idx": { + "name": "core_languages_words_lang_code_idx", + "columns": [ + { + "expression": "languageCode", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "core_languages_words_languageCode_core_languages_code_fk": { + "name": "core_languages_words_languageCode_core_languages_code_fk", + "tableFrom": "core_languages_words", + "tableTo": "core_languages", + "columnsFrom": [ + "languageCode" + ], + "columnsTo": [ + "code" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_logs": { + "name": "core_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "pluginCode": { + "name": "pluginCode", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "typeLogs", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'info'" + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "userId": { + "name": "userId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "varchar(45)", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "core_logs_userId_core_users_id_fk": { + "name": "core_logs_userId_core_users_id_fk", + "tableFrom": "core_logs", + "tableTo": "core_users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_moderators_permissions": { + "name": "core_moderators_permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "roleId": { + "name": "roleId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "userId": { + "name": "userId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "protected": { + "name": "protected", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": { + "core_moderators_permissions_role_id_idx": { + "name": "core_moderators_permissions_role_id_idx", + "columns": [ + { + "expression": "roleId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "core_moderators_permissions_user_id_idx": { + "name": "core_moderators_permissions_user_id_idx", + "columns": [ + { + "expression": "userId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "core_moderators_permissions_roleId_core_roles_id_fk": { + "name": "core_moderators_permissions_roleId_core_roles_id_fk", + "tableFrom": "core_moderators_permissions", + "tableTo": "core_roles", + "columnsFrom": [ + "roleId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "core_moderators_permissions_userId_core_users_id_fk": { + "name": "core_moderators_permissions_userId_core_users_id_fk", + "tableFrom": "core_moderators_permissions", + "tableTo": "core_users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_roles": { + "name": "core_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "protected": { + "name": "protected", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "default": { + "name": "default", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "root": { + "name": "root", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "guest": { + "name": "guest", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "color": { + "name": "color", + "type": "varchar(19)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_sessions": { + "name": "core_sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "deviceId": { + "name": "deviceId", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "core_sessions_user_id_idx": { + "name": "core_sessions_user_id_idx", + "columns": [ + { + "expression": "userId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "core_sessions_userId_core_users_id_fk": { + "name": "core_sessions_userId_core_users_id_fk", + "tableFrom": "core_sessions", + "tableTo": "core_users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "core_sessions_deviceId_core_sessions_known_devices_id_fk": { + "name": "core_sessions_deviceId_core_sessions_known_devices_id_fk", + "tableFrom": "core_sessions", + "tableTo": "core_sessions_known_devices", + "columnsFrom": [ + "deviceId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "core_sessions_token_unique": { + "name": "core_sessions_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_sessions_known_devices": { + "name": "core_sessions_known_devices", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "publicId": { + "name": "publicId", + "type": "varchar(32)", + "primaryKey": false, + "notNull": true + }, + "ipAddress": { + "name": "ipAddress", + "type": "varchar(40)", + "primaryKey": false, + "notNull": true + }, + "userAgent": { + "name": "userAgent", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastSeen": { + "name": "lastSeen", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "core_sessions_known_devices_ip_address_idx": { + "name": "core_sessions_known_devices_ip_address_idx", + "columns": [ + { + "expression": "ipAddress", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "core_sessions_known_devices_publicId_unique": { + "name": "core_sessions_known_devices_publicId_unique", + "nullsNotDistinct": false, + "columns": [ + "publicId" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_users": { + "name": "core_users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "nameCode": { + "name": "nameCode", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "newsletter": { + "name": "newsletter", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "avatarColor": { + "name": "avatarColor", + "type": "varchar(6)", + "primaryKey": false, + "notNull": true + }, + "emailVerified": { + "name": "emailVerified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "roleId": { + "name": "roleId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "birthday": { + "name": "birthday", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "varchar(40)", + "primaryKey": false, + "notNull": true + }, + "language": { + "name": "language", + "type": "varchar(32)", + "primaryKey": false, + "notNull": true, + "default": "'en'" + } + }, + "indexes": { + "core_users_name_code_idx": { + "name": "core_users_name_code_idx", + "columns": [ + { + "expression": "nameCode", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "core_users_name_idx": { + "name": "core_users_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "core_users_email_idx": { + "name": "core_users_email_idx", + "columns": [ + { + "expression": "email", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "core_users_roleId_core_roles_id_fk": { + "name": "core_users_roleId_core_roles_id_fk", + "tableFrom": "core_users", + "tableTo": "core_roles", + "columnsFrom": [ + "roleId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "core_users_language_core_languages_code_fk": { + "name": "core_users_language_core_languages_code_fk", + "tableFrom": "core_users", + "tableTo": "core_languages", + "columnsFrom": [ + "language" + ], + "columnsTo": [ + "code" + ], + "onDelete": "set default", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "core_users_nameCode_unique": { + "name": "core_users_nameCode_unique", + "nullsNotDistinct": false, + "columns": [ + "nameCode" + ] + }, + "core_users_name_unique": { + "name": "core_users_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + }, + "core_users_email_unique": { + "name": "core_users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_users_confirm_emails": { + "name": "core_users_confirm_emails", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expires": { + "name": "expires", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "core_users_confirm_emails_userId_core_users_id_fk": { + "name": "core_users_confirm_emails_userId_core_users_id_fk", + "tableFrom": "core_users_confirm_emails", + "tableTo": "core_users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "core_users_confirm_emails_token_unique": { + "name": "core_users_confirm_emails_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_users_forgot_password": { + "name": "core_users_forgot_password", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(40)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "core_users_forgot_password_userId_core_users_id_fk": { + "name": "core_users_forgot_password_userId_core_users_id_fk", + "tableFrom": "core_users_forgot_password", + "tableTo": "core_users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "core_users_forgot_password_userId_unique": { + "name": "core_users_forgot_password_userId_unique", + "nullsNotDistinct": false, + "columns": [ + "userId" + ] + }, + "core_users_forgot_password_token_unique": { + "name": "core_users_forgot_password_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.core_users_sso": { + "name": "core_users_sso", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "providerAccountId": { + "name": "providerAccountId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "core_users_sso_user_id_idx": { + "name": "core_users_sso_user_id_idx", + "columns": [ + { + "expression": "userId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "core_users_sso_userId_core_users_id_fk": { + "name": "core_users_sso_userId_core_users_id_fk", + "tableFrom": "core_users_sso", + "tableTo": "core_users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.blog_categories": { + "name": "blog_categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "titleSeo": { + "name": "titleSeo", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "blog_categories_titleSeo_unique": { + "name": "blog_categories_titleSeo_unique", + "nullsNotDistinct": false, + "columns": [ + "titleSeo" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + }, + "public.blog_posts": { + "name": "blog_posts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "titleSeo": { + "name": "titleSeo", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "categoryId": { + "name": "categoryId", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "blog_posts_categoryId_blog_categories_id_fk": { + "name": "blog_posts_categoryId_blog_categories_id_fk", + "tableFrom": "blog_posts", + "tableTo": "blog_categories", + "columnsFrom": [ + "categoryId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "blog_posts_titleSeo_unique": { + "name": "blog_posts_titleSeo_unique", + "nullsNotDistinct": false, + "columns": [ + "titleSeo" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": true + } + }, + "enums": { + "public.typeLogs": { + "name": "typeLogs", + "schema": "public", + "values": [ + "info", + "warn", + "error", + "debug" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/web/migrations/meta/_journal.json b/apps/web/migrations/meta/_journal.json index 600ef136a..1d68d9686 100644 --- a/apps/web/migrations/meta/_journal.json +++ b/apps/web/migrations/meta/_journal.json @@ -15,6 +15,13 @@ "when": 1750322132661, "tag": "0001_mute_flatman", "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1750493644570, + "tag": "0002_superb_natasha_romanoff", + "breakpoints": true } ] } \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json index 2bcc6bf09..af3430638 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -29,7 +29,7 @@ "dotenv": "^16.5.0", "drizzle-kit": "^0.31.1", "drizzle-orm": "^0.44.2", - "hono": "^4.8.0", + "hono": "^4.8.2", "lucide-react": "^0.517.0", "next": "^15.3.4", "next-intl": "^4.1.0", @@ -40,7 +40,7 @@ "zod": "^3.25.67" }, "devDependencies": { - "@playwright/test": "^1.53.0", + "@playwright/test": "^1.53.1", "@tailwindcss/postcss": "^4.1.10", "@types/node": "^24.0.3", "@types/react": "^19.1.8", diff --git a/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-blog)/blog/categories/page.tsx b/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-blog)/blog/categories/page.tsx index d0eaadf4a..38ce51e93 100644 --- a/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-blog)/blog/categories/page.tsx +++ b/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-blog)/blog/categories/page.tsx @@ -1,12 +1,13 @@ import type { Metadata } from 'next'; import { I18nProvider } from '@vitnode/core/components/i18n-provider'; +import { DataTableSkeleton } from '@vitnode/core/components/table/data-table'; import { HeaderContent } from '@vitnode/core/components/ui/header-content'; import { getTranslations } from 'next-intl/server'; - -import { CategoriesAdminView } from '@vitnode/blog/views/admin/categories/categories-admin-view'; +import React from 'react'; import { ActionsCategoriesAdmin } from '@vitnode/blog/views/admin/categories/actions/actions'; +import { CategoriesAdminView } from '@vitnode/blog/views/admin/categories/categories-admin-view'; export const generateMetadata = async (): Promise => { const t = await getTranslations('@vitnode/blog.admin.nav'); @@ -31,7 +32,9 @@ export default async function CategoriesPage( - + }> + + ); diff --git a/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-blog)/blog/posts/page.tsx b/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-blog)/blog/posts/page.tsx index 700719958..f2163bd36 100644 --- a/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-blog)/blog/posts/page.tsx +++ b/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-blog)/blog/posts/page.tsx @@ -1,8 +1,10 @@ import type { Metadata } from 'next'; import { I18nProvider } from '@vitnode/core/components/i18n-provider'; +import { DataTableSkeleton } from '@vitnode/core/components/table/data-table'; import { HeaderContent } from '@vitnode/core/components/ui/header-content'; import { getTranslations } from 'next-intl/server'; +import React from 'react'; import { ActionsPostsAdmin } from '@vitnode/blog/views/admin/posts/actions/actions'; import { PostsAdminView } from '@vitnode/blog/views/admin/posts/posts-admin-view'; @@ -30,7 +32,9 @@ export default async function PostsPage( - + }> + + ); diff --git a/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-core)/core/debug/page.tsx b/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-core)/core/debug/page.tsx new file mode 100644 index 000000000..6c3124468 --- /dev/null +++ b/apps/web/src/app/[locale]/admin/(auth)/(plugins)/(vitnode-core)/core/debug/page.tsx @@ -0,0 +1,31 @@ +import { getTranslations } from 'next-intl/server'; + +import { I18nProvider } from '@vitnode/core/components/i18n-provider'; +import { HeaderContent } from '@vitnode/core/components/ui/header-content'; +import { ClearCacheAction } from '@vitnode/core/views/admin/views/core/debug/actions/clear-cache/clear-cache'; +import { DebugAdminView } from '@vitnode/core/views/admin/views/core/debug/debug-admin-view'; + +export const generateMetadata = async () => { + const t = await getTranslations('admin.debug'); + + return { + title: t('title'), + description: t('desc'), + }; +}; + +export default async function Page() { + const t = await getTranslations('admin.debug'); + + return ( + +
+ + + + + +
+
+ ); +} diff --git a/apps/web/src/app/global.css b/apps/web/src/app/global.css index 1457f4a03..27f4d2ad0 100644 --- a/apps/web/src/app/global.css +++ b/apps/web/src/app/global.css @@ -50,7 +50,7 @@ --popover: oklch(0.18 0 0); --popover-foreground: oklch(0.98 0 0); --primary: oklch(0.51 0.16 262.61); - --primary-foreground: oklch(0.99 0.16 262.61); + --primary-foreground: oklch(0.98 0 0); --secondary: oklch(0.24 0.01 240); --secondary-foreground: oklch(0.98 0.005 240); --muted: oklch(0.22 0 0); @@ -58,8 +58,8 @@ --accent: oklch(0.28 0 0); --destructive: oklch(0.704 0.191 22.216); --destructive-foreground: oklch(0.704 0.191 22.216); - --border: oklch(0.24 0 0); - --input: oklch(0.24 0 0); + --border: oklch(0.28 0 0); + --input: oklch(0.28 0 0); --ring: oklch(0.51 0.16 262.61); --chart-1: oklch(0.488 0.243 264.376); --chart-2: oklch(0.696 0.17 162.48); diff --git a/apps/web/src/locales/@vitnode/core/en.json b/apps/web/src/locales/@vitnode/core/en.json index b89001b73..0890d7c28 100644 --- a/apps/web/src/locales/@vitnode/core/en.json +++ b/apps/web/src/locales/@vitnode/core/en.json @@ -11,6 +11,12 @@ "cancel": "Cancel", "confirm": "Yes, leave" }, + "confirm_action": { + "title": "Are you sure?", + "desc": "This action cannot be undone.", + "cancel": "Cancel", + "confirm": "Yes, confirm" + }, "search_placeholder": "Search...", "results_not_found": "No results found", "date": "{date, date}", @@ -139,7 +145,9 @@ "list": "User List" }, "user_bar": { - "home_page": "Home Page" + "home_page": "Home Page", + "debug": "Debug Panel", + "log_out": "Log Out" } } }, @@ -150,6 +158,19 @@ "createdAt": "Created At", "emailNotVerified": "Email Not Verified" } + }, + "debug": { + "title": "Debug Panel", + "desc": "Check logs, errors, and other debug information.", + "actions": { + "clear_cache": { + "label": "Clear Cache", + "title": "Are you sure you want to clear the cache?", + "desc": "This action will remove all cached data, which may affect performance temporarily.", + "success": "Cache cleared successfully.", + "confirm": "Yes, clear cache" + } + } } } } diff --git a/package.json b/package.json index c03861198..4d505f40c 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,10 @@ "test:e2e": "turbo test:e2e" }, "devDependencies": { - "@types/node": "^24", + "@types/node": "^24.0.3", "@vitnode/eslint-config": "workspace:*", "prettier": "^3.5.3", - "prettier-plugin-tailwindcss": "^0.6.12", + "prettier-plugin-tailwindcss": "^0.6.13", "tsx": "^4.20.3", "turbo": "^2.5.4", "typescript": "^5.8.3" diff --git a/packages/create-vitnode-app/src/helpers/is-online.ts b/packages/create-vitnode-app/src/helpers/is-online.ts index aa3f392e0..90046fa5b 100644 --- a/packages/create-vitnode-app/src/helpers/is-online.ts +++ b/packages/create-vitnode-app/src/helpers/is-online.ts @@ -42,7 +42,7 @@ function getProxy(): string | undefined { const httpsProxy = execSync('npm config get https-proxy').toString().trim(); return httpsProxy !== 'null' ? httpsProxy : undefined; - } catch (_) { + } catch { return; } } diff --git a/packages/create-vitnode-app/src/helpers/is-writeable.ts b/packages/create-vitnode-app/src/helpers/is-writeable.ts index 8a363d6f3..a4455b22f 100644 --- a/packages/create-vitnode-app/src/helpers/is-writeable.ts +++ b/packages/create-vitnode-app/src/helpers/is-writeable.ts @@ -6,7 +6,7 @@ export async function isWriteable(directory: string): Promise { await access(directory, W_OK); return true; - } catch (_) { + } catch { return false; } } diff --git a/packages/eslint/package.json b/packages/eslint/package.json index c964c5e1a..56780c0b8 100644 --- a/packages/eslint/package.json +++ b/packages/eslint/package.json @@ -35,8 +35,8 @@ }, "peerDependencies": { "eslint": "^9.0.0", - "typescript": "5.8.x", - "prettier": "^3.0.0" + "prettier": "^3.0.0", + "typescript": "5.8.x" }, "devDependencies": { "typescript": "^5.8.3" @@ -50,7 +50,7 @@ "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "6.0.0-rc1", - "prettier-plugin-tailwindcss": "^0.6.12", + "prettier-plugin-tailwindcss": "^0.6.13", "typescript-eslint": "^8.34.1" } } diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 8bbbb9b57..cba931444 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -41,7 +41,7 @@ "@hookform/resolvers": "^5.1.1", "@react-email/components": "0.1.0", "@swc/cli": "0.6.0", - "@swc/core": "^1.12.1", + "@swc/core": "^1.12.5", "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.3.0", "@types/node": "^24.0.3", @@ -56,7 +56,7 @@ "drizzle-kit": "^0.31.1", "drizzle-orm": "^0.44.2", "eslint": "^9.29.0", - "hono": "^4.8.0", + "hono": "^4.8.2", "jsdom": "^26.1.0", "lucide-react": "^0.517.0", "next": "^15.3.4", @@ -109,7 +109,7 @@ "dependencies": { "@dnd-kit/core": "^6.3.1", "@hono/swagger-ui": "^0.5.2", - "@tanstack/react-query": "^5.80.7", + "@tanstack/react-query": "^5.80.12", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", diff --git a/packages/vitnode/src/api/middlewares/rate-limiter.middleware.ts b/packages/vitnode/src/api/middlewares/rate-limiter.middleware.ts index 9d60ea859..72a1dd7b5 100644 --- a/packages/vitnode/src/api/middlewares/rate-limiter.middleware.ts +++ b/packages/vitnode/src/api/middlewares/rate-limiter.middleware.ts @@ -9,12 +9,14 @@ import { const createRateLimiter = ({ keyPrefix, ...options -}: { +}: Omit & { keyPrefix: string; -} & Omit): RateLimiterAbstract => { +}): RateLimiterAbstract => { + // TODO: Add support for Redis or other storage options + return new RateLimiterMemory({ keyPrefix, - points: options?.points ?? 20, // 20 requests + points: options?.points ?? 40, // 40 requests duration: options?.duration ?? 60, // per 60 seconds ...options, }); diff --git a/packages/vitnode/src/api/models/device.ts b/packages/vitnode/src/api/models/device.ts index 5d7fa160a..99190a0b5 100644 --- a/packages/vitnode/src/api/models/device.ts +++ b/packages/vitnode/src/api/models/device.ts @@ -88,7 +88,7 @@ export class DeviceModel { publicId: deviceIdFromCookie, }; } - } catch (_) { + } catch { /* empty */ } diff --git a/packages/vitnode/src/api/models/email.ts b/packages/vitnode/src/api/models/email.ts index d0eb6f956..218a6200f 100644 --- a/packages/vitnode/src/api/models/email.ts +++ b/packages/vitnode/src/api/models/email.ts @@ -19,12 +19,7 @@ export class EmailModel { protected readonly c: Context; - async send(args: { - html: string; - replyTo?: string; - subject: string; - to: string; - }) { + send(args: { html: string; replyTo?: string; subject: string; to: string }) { const core = this.c.get('core'); const provider = core.emailAdapter; if (!provider) { @@ -33,16 +28,10 @@ export class EmailModel { }); } - try { - await provider.sendEmail({ - ...args, - metadata: core.metadata, - }); - } catch (e) { - const error = e as Error; - throw new HTTPException(500, { - message: error.message, - }); - } + // TODO: Add logging when email is failed to send + void provider.sendEmail({ + ...args, + metadata: core.metadata, + }); } } diff --git a/packages/vitnode/src/api/modules/users/routes/test.route.ts b/packages/vitnode/src/api/modules/users/routes/test.route.ts index 20b03143c..53dfe0cc9 100644 --- a/packages/vitnode/src/api/modules/users/routes/test.route.ts +++ b/packages/vitnode/src/api/modules/users/routes/test.route.ts @@ -2,7 +2,8 @@ import { z } from 'zod'; import { buildRoute } from '@/api/lib/route'; import { CONFIG_PLUGIN } from '@/config'; -// import { EmailModel } from '../../../models/email'; + +import { EmailModel } from '../../../models/email'; export const testRoute = buildRoute({ ...CONFIG_PLUGIN, @@ -30,11 +31,11 @@ export const testRoute = buildRoute({ }, }, handler: c => { - // await new EmailModel(c).send({ - // html: '

Test email

', - // to: 'ithereplay@gmail.com', - // subject: 'Test Email', - // }); + new EmailModel(c).send({ + html: '

Test email

', + to: 'ithereplay@gmail.com', + subject: 'Test Email', + }); return c.text('test'); }, diff --git a/packages/vitnode/src/app_admin/core/debug/page.tsx b/packages/vitnode/src/app_admin/core/debug/page.tsx new file mode 100644 index 000000000..99c9a2ce5 --- /dev/null +++ b/packages/vitnode/src/app_admin/core/debug/page.tsx @@ -0,0 +1,31 @@ +import { getTranslations } from 'next-intl/server'; + +import { I18nProvider } from '@/components/i18n-provider'; +import { HeaderContent } from '@/components/ui/header-content'; +import { ClearCacheAction } from '@/views/admin/views/core/debug/actions/clear-cache/clear-cache'; +import { DebugAdminView } from '@/views/admin/views/core/debug/debug-admin-view'; + +export const generateMetadata = async () => { + const t = await getTranslations('admin.debug'); + + return { + title: t('title'), + description: t('desc'), + }; +}; + +export default async function Page() { + const t = await getTranslations('admin.debug'); + + return ( + +
+ + + + + +
+
+ ); +} diff --git a/packages/vitnode/src/components/confirm-action/confirm-action-alert-dialog.tsx b/packages/vitnode/src/components/confirm-action/confirm-action-alert-dialog.tsx new file mode 100644 index 000000000..5aead115d --- /dev/null +++ b/packages/vitnode/src/components/confirm-action/confirm-action-alert-dialog.tsx @@ -0,0 +1,55 @@ +'use client'; + +import { useTranslations } from 'next-intl'; +import React from 'react'; + +import { + AlertDialog, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooterSkeleton, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from '../ui/alert-dialog'; + +const ContentConfirmAction = React.lazy(async () => + import('./content').then(module => ({ + default: module.ContentConfirmAction, + })), +); + +export const ConfirmActionAlertDialog = ({ + children, + title, + description, + textSubmit, + onSubmit, + ...props +}: Omit, 'children'> & + React.ComponentProps & { + children: React.ReactNode; + description?: React.ReactNode; + title?: React.ReactNode; + }) => { + const t = useTranslations('core.global.confirm_action'); + + return ( + + {children} + + + + {title ?? t('title')} + + {description ?? t('desc')} + + + + }> + + + + + ); +}; diff --git a/packages/vitnode/src/components/confirm-action/content.tsx b/packages/vitnode/src/components/confirm-action/content.tsx new file mode 100644 index 000000000..ea7424fa4 --- /dev/null +++ b/packages/vitnode/src/components/confirm-action/content.tsx @@ -0,0 +1,36 @@ +import { useTranslations } from 'next-intl'; +import React from 'react'; + +import { + AlertDialogCancel, + AlertDialogFooter, + useAlertDialog, +} from '../ui/alert-dialog'; +import { Button } from '../ui/button'; + +export const ContentConfirmAction = ({ + onSubmit, + textSubmit, +}: { + onSubmit: (props: { onClose: () => void }) => Promise | void; + textSubmit?: string; +}) => { + const t = useTranslations('core.global.confirm_action'); + const { setOpen } = useAlertDialog(); + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [_, formAction, isLoading] = React.useActionState(async () => { + await onSubmit({ onClose: () => setOpen?.(false) }); + }, null); + + return ( +
+ + {t('cancel')} + + +
+ ); +}; diff --git a/packages/vitnode/src/components/table/data-table.tsx b/packages/vitnode/src/components/table/data-table.tsx index e7a8ccb24..c81ccf9fc 100644 --- a/packages/vitnode/src/components/table/data-table.tsx +++ b/packages/vitnode/src/components/table/data-table.tsx @@ -83,11 +83,5 @@ export function DataTable( return ; } - return ( - } - > - {...props} /> - - ); + return {...props} />; } diff --git a/packages/vitnode/src/components/ui/alert-dialog.tsx b/packages/vitnode/src/components/ui/alert-dialog.tsx index d4e4ecce9..0a3000463 100644 --- a/packages/vitnode/src/components/ui/alert-dialog.tsx +++ b/packages/vitnode/src/components/ui/alert-dialog.tsx @@ -6,10 +6,40 @@ import * as React from 'react'; import { buttonVariants } from '@/components/ui/button'; import { cn } from '@/lib/utils'; +import { Skeleton } from './skeleton'; + +const AlertDialogContext = React.createContext<{ + open: boolean; + setOpen?: (value: boolean) => void; +}>({ + open: false, + setOpen: () => {}, +}); + +export const useAlertDialog = () => React.useContext(AlertDialogContext); + function AlertDialog({ + onOpenChange, + open: openProp, ...props }: React.ComponentProps) { - return ; + const [open, setOpen] = React.useState(false); + + const handleOpenChange = (newOpen: boolean) => { + onOpenChange?.(newOpen); + setOpen(newOpen); + }; + + return ( + + + + ); } function AlertDialogTrigger({ @@ -92,6 +122,25 @@ function AlertDialogFooter({ ); } +function AlertDialogFooterSkeleton({ + className, + ...props +}: Omit, 'children'>) { + return ( +
+ + +
+ ); +} + function AlertDialogTitle({ className, ...props @@ -149,6 +198,7 @@ export { AlertDialogContent, AlertDialogDescription, AlertDialogFooter, + AlertDialogFooterSkeleton, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, diff --git a/packages/vitnode/src/database/logs.ts b/packages/vitnode/src/database/logs.ts new file mode 100644 index 000000000..d2f67de1f --- /dev/null +++ b/packages/vitnode/src/database/logs.ts @@ -0,0 +1,17 @@ +import { pgEnum, pgTable } from 'drizzle-orm/pg-core'; + +import { core_users } from './users'; + +export const typeLogs = pgEnum('typeLogs', ['info', 'warn', 'error', 'debug']); + +export const core_logs = pgTable('core_logs', t => ({ + id: t.serial().primaryKey(), + pluginCode: t.varchar({ length: 255 }).notNull(), + type: typeLogs().notNull().default('info'), + content: t.text().notNull(), + createdAt: t.timestamp().notNull().defaultNow(), + userId: t.integer().references(() => core_users.id, { + onDelete: 'set null', + }), + ipAddress: t.varchar({ length: 45 }).notNull().default(''), +})).enableRLS(); diff --git a/packages/vitnode/src/locales/en.json b/packages/vitnode/src/locales/en.json index b89001b73..0890d7c28 100644 --- a/packages/vitnode/src/locales/en.json +++ b/packages/vitnode/src/locales/en.json @@ -11,6 +11,12 @@ "cancel": "Cancel", "confirm": "Yes, leave" }, + "confirm_action": { + "title": "Are you sure?", + "desc": "This action cannot be undone.", + "cancel": "Cancel", + "confirm": "Yes, confirm" + }, "search_placeholder": "Search...", "results_not_found": "No results found", "date": "{date, date}", @@ -139,7 +145,9 @@ "list": "User List" }, "user_bar": { - "home_page": "Home Page" + "home_page": "Home Page", + "debug": "Debug Panel", + "log_out": "Log Out" } } }, @@ -150,6 +158,19 @@ "createdAt": "Created At", "emailNotVerified": "Email Not Verified" } + }, + "debug": { + "title": "Debug Panel", + "desc": "Check logs, errors, and other debug information.", + "actions": { + "clear_cache": { + "label": "Clear Cache", + "title": "Are you sure you want to clear the cache?", + "desc": "This action will remove all cached data, which may affect performance temporarily.", + "success": "Cache cleared successfully.", + "confirm": "Yes, clear cache" + } + } } } } diff --git a/packages/vitnode/src/views/admin/layouts/user-bar/client.tsx b/packages/vitnode/src/views/admin/layouts/user-bar/client.tsx index 8d6c39e8b..3e1e0e6ed 100644 --- a/packages/vitnode/src/views/admin/layouts/user-bar/client.tsx +++ b/packages/vitnode/src/views/admin/layouts/user-bar/client.tsx @@ -1,6 +1,6 @@ 'use client'; -import { HomeIcon, LogOut } from 'lucide-react'; +import { BugIcon, HomeIcon, LogOut } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { @@ -20,7 +20,7 @@ export const ClientUserBarAdmin = ({ name: string; }; }) => { - const t = useTranslations('core.global.user_bar'); + const t = useTranslations('admin.global.nav.user_bar'); return ( <> @@ -34,8 +34,14 @@ export const ClientUserBarAdmin = ({ - - Home + + {t('home_page')} + + + + + + {t('debug')} @@ -46,7 +52,7 @@ export const ClientUserBarAdmin = ({ await logOutMutationApi({ isAdmin: true }); }} > - + {t('log_out')} diff --git a/packages/vitnode/src/views/admin/views/core/debug/actions/clear-cache/clear-cache.tsx b/packages/vitnode/src/views/admin/views/core/debug/actions/clear-cache/clear-cache.tsx new file mode 100644 index 000000000..ac564d136 --- /dev/null +++ b/packages/vitnode/src/views/admin/views/core/debug/actions/clear-cache/clear-cache.tsx @@ -0,0 +1,42 @@ +'use client'; + +import { BrushCleaningIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { toast } from 'sonner'; + +import { ConfirmActionAlertDialog } from '@/components/confirm-action/confirm-action-alert-dialog'; +import { Button } from '@/components/ui/button'; + +import { clearCacheMutation } from './mutation-api'; + +export const ClearCacheAction = () => { + const t = useTranslations('admin.debug.actions.clear_cache'); + const tErrors = useTranslations('core.global.errors'); + + return ( + { + try { + await clearCacheMutation(); + } catch { + toast.error(tErrors('title'), { + description: tErrors('internal_server_error'), + }); + + return; + } + + onClose(); + toast.success(t('success')); + }} + textSubmit={t('confirm')} + title={t('title')} + > + + + ); +}; diff --git a/packages/vitnode/src/views/admin/views/core/debug/actions/clear-cache/mutation-api.ts b/packages/vitnode/src/views/admin/views/core/debug/actions/clear-cache/mutation-api.ts new file mode 100644 index 000000000..243826fd2 --- /dev/null +++ b/packages/vitnode/src/views/admin/views/core/debug/actions/clear-cache/mutation-api.ts @@ -0,0 +1,7 @@ +'use server'; + +import { revalidatePath } from 'next/cache'; + +export const clearCacheMutation = async () => { + await Promise.resolve(revalidatePath('/', 'layout')); +}; diff --git a/packages/vitnode/src/views/admin/views/core/debug/debug-admin-view.tsx b/packages/vitnode/src/views/admin/views/core/debug/debug-admin-view.tsx new file mode 100644 index 000000000..53c4c0cd3 --- /dev/null +++ b/packages/vitnode/src/views/admin/views/core/debug/debug-admin-view.tsx @@ -0,0 +1,3 @@ +export const DebugAdminView = () => { + return
DebugAdminView
; +}; diff --git a/plugins/blog/package.json b/plugins/blog/package.json index b3ba2375e..9424ab7a2 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -37,7 +37,7 @@ "@vitnode/core": "workspace:*", "drizzle-kit": "^0.31.1", "drizzle-orm": "^0.44.2", - "hono": "^4.8.0", + "hono": "^4.8.2", "lucide-react": "^0.517.0", "next": "^15.3.4", "next-intl": "^4.1.0", @@ -49,7 +49,7 @@ }, "devDependencies": { "@swc/cli": "0.6.0", - "@swc/core": "^1.12.1", + "@swc/core": "^1.12.5", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "@vitnode/eslint-config": "workspace:*", diff --git a/plugins/blog/src/app_admin/blog/categories/page.tsx b/plugins/blog/src/app_admin/blog/categories/page.tsx index 9c5005401..f7d85148c 100644 --- a/plugins/blog/src/app_admin/blog/categories/page.tsx +++ b/plugins/blog/src/app_admin/blog/categories/page.tsx @@ -1,13 +1,14 @@ import type { Metadata } from 'next'; import { I18nProvider } from '@vitnode/core/components/i18n-provider'; +import { DataTableSkeleton } from '@vitnode/core/components/table/data-table'; import { HeaderContent } from '@vitnode/core/components/ui/header-content'; import { getTranslations } from 'next-intl/server'; +import React from 'react'; +import { ActionsCategoriesAdmin } from '@/views/admin/categories/actions/actions'; import { CategoriesAdminView } from '@/views/admin/categories/categories-admin-view'; -import { ActionsCategoriesAdmin } from '../../../views/admin/categories/actions/actions'; - export const generateMetadata = async (): Promise => { const t = await getTranslations('@vitnode/blog.admin.nav'); @@ -31,7 +32,9 @@ export default async function CategoriesPage( - + }> + + ); diff --git a/plugins/blog/src/app_admin/blog/posts/page.tsx b/plugins/blog/src/app_admin/blog/posts/page.tsx index 7b1474629..1b8872400 100644 --- a/plugins/blog/src/app_admin/blog/posts/page.tsx +++ b/plugins/blog/src/app_admin/blog/posts/page.tsx @@ -1,8 +1,10 @@ import type { Metadata } from 'next'; import { I18nProvider } from '@vitnode/core/components/i18n-provider'; +import { DataTableSkeleton } from '@vitnode/core/components/table/data-table'; import { HeaderContent } from '@vitnode/core/components/ui/header-content'; import { getTranslations } from 'next-intl/server'; +import React from 'react'; import { ActionsPostsAdmin } from '@/views/admin/posts/actions/actions'; import { PostsAdminView } from '@/views/admin/posts/posts-admin-view'; @@ -30,7 +32,9 @@ export default async function PostsPage( - + }> + + ); diff --git a/plugins/blog/src/views/admin/categories/row-actions/delete/delete-action.tsx b/plugins/blog/src/views/admin/categories/row-actions/delete/delete-action.tsx index 42df0b473..d00297909 100644 --- a/plugins/blog/src/views/admin/categories/row-actions/delete/delete-action.tsx +++ b/plugins/blog/src/views/admin/categories/row-actions/delete/delete-action.tsx @@ -1,16 +1,6 @@ 'use client'; -import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, -} from '@vitnode/core/components/ui/alert-dialog'; +import { ConfirmActionAlertDialog } from '@vitnode/core/components/confirm-action/confirm-action-alert-dialog'; import { Button } from '@vitnode/core/components/ui/button'; import { Tooltip, @@ -29,53 +19,41 @@ export const DeleteAction = ({ title, id }: { id: number; title: string }) => { const tGlobal = useTranslations('core.global'); return ( - - - - - - - - - {t('title')} - - + + + ( + {title} + ), + })} + onSubmit={async ({ onClose }) => { + const mutation = await mutationApi(id); + if (mutation?.error) { + toast.error(tGlobal('errors.title'), { + description: tGlobal('errors.internal_server_error'), + }); - - - {t('title')} - - {t.rich('desc', { - title: () => ( - {title} - ), - })} - - - - {tGlobal('cancel')} - { - const mutation = await mutationApi(id); - if (mutation?.error) { - toast.error(tGlobal('errors.title'), { - description: tGlobal('errors.internal_server_error'), - }); + return; + } - return; - } + toast.success(t('success'), { + description: title, + }); + onClose(); + }} + textSubmit={t('confirm')} + title={t('title')} + > + + + + - toast.success(t('success'), { - description: title, - }); - }} - > - {t('confirm')} - - - - + {t('title')} + + ); }; diff --git a/plugins/blog/src/views/admin/categories/row-actions/delete/mutation-api.ts b/plugins/blog/src/views/admin/categories/row-actions/delete/mutation-api.ts index 2901072bc..e0409aa9a 100644 --- a/plugins/blog/src/views/admin/categories/row-actions/delete/mutation-api.ts +++ b/plugins/blog/src/views/admin/categories/row-actions/delete/mutation-api.ts @@ -3,7 +3,7 @@ import { fetcher } from '@vitnode/core/lib/fetcher'; import { revalidatePath } from 'next/cache'; -import { categoriesModule } from '../../../../../api/modules/categories/categories.module'; +import { categoriesModule } from '@/api/modules/categories/categories.module'; export const mutationApi = async (id: number) => { const res = await fetcher(categoriesModule, { diff --git a/plugins/blog/src/views/admin/posts/row-actions/delete/delete-action.tsx b/plugins/blog/src/views/admin/posts/row-actions/delete/delete-action.tsx index c83df19bd..74b6632f0 100644 --- a/plugins/blog/src/views/admin/posts/row-actions/delete/delete-action.tsx +++ b/plugins/blog/src/views/admin/posts/row-actions/delete/delete-action.tsx @@ -1,16 +1,6 @@ 'use client'; -import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, -} from '@vitnode/core/components/ui/alert-dialog'; +import { ConfirmActionAlertDialog } from '@vitnode/core/components/confirm-action/confirm-action-alert-dialog'; import { Button } from '@vitnode/core/components/ui/button'; import { Tooltip, @@ -29,53 +19,41 @@ export const DeleteAction = ({ title, id }: { id: number; title: string }) => { const tGlobal = useTranslations('core.global'); return ( - - - - - - - - - {t('title')} - - + + + ( + {title} + ), + })} + onSubmit={async ({ onClose }) => { + const mutation = await mutationApi(id); + if (mutation?.error) { + toast.error(tGlobal('errors.title'), { + description: tGlobal('errors.internal_server_error'), + }); - - - {t('title')} - - {t.rich('desc', { - title: () => ( - {title} - ), - })} - - - - {tGlobal('cancel')} - { - const mutation = await mutationApi(id); - if (mutation?.error) { - toast.error(tGlobal('errors.title'), { - description: tGlobal('errors.internal_server_error'), - }); + return; + } - return; - } + toast.success(t('success'), { + description: title, + }); + onClose(); + }} + textSubmit={t('confirm')} + title={t('title')} + > + + + + - toast.success(t('success'), { - description: title, - }); - }} - > - {t('confirm')} - - - - + {t('title')} + + ); }; diff --git a/plugins/blog/src/views/admin/posts/row-actions/delete/mutation-api.ts b/plugins/blog/src/views/admin/posts/row-actions/delete/mutation-api.ts index fcb916ba2..a336e642d 100644 --- a/plugins/blog/src/views/admin/posts/row-actions/delete/mutation-api.ts +++ b/plugins/blog/src/views/admin/posts/row-actions/delete/mutation-api.ts @@ -3,7 +3,7 @@ import { fetcher } from '@vitnode/core/lib/fetcher'; import { revalidatePath } from 'next/cache'; -import { postsModule } from '../../../../../api/modules/posts/posts.module'; +import { postsModule } from '@/api/modules/posts/posts.module'; export const mutationApi = async (id: number) => { const res = await fetcher(postsModule, { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e106e5f01..fb76a10dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ importers: .: devDependencies: '@types/node': - specifier: ^24 + specifier: ^24.0.3 version: 24.0.3 '@vitnode/eslint-config': specifier: workspace:* @@ -18,8 +18,8 @@ importers: specifier: ^3.5.3 version: 3.5.3 prettier-plugin-tailwindcss: - specifier: ^0.6.12 - version: 0.6.12(prettier-plugin-astro@0.7.2)(prettier@3.5.3) + specifier: ^0.6.13 + version: 0.6.13(prettier-plugin-astro@0.7.2)(prettier@3.5.3) tsx: specifier: ^4.20.3 version: 4.20.3 @@ -40,13 +40,13 @@ importers: version: 19.1.0-rc.2 fumadocs-core: specifier: ^15.5.3 - version: 15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) fumadocs-mdx: specifier: ^11.6.9 - version: 11.6.9(@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0))(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 11.6.9(@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0))(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) fumadocs-ui: specifier: ^15.5.3 - version: 15.5.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.1.10) + version: 15.5.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.1.10) lucide-react: specifier: ^0.517.0 version: 0.517.0(react@19.1.0) @@ -55,7 +55,7 @@ importers: version: 12.18.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next: specifier: ^15.3.4 - version: 15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: specifier: ^19.1.0 version: 19.1.0 @@ -82,8 +82,8 @@ importers: specifier: ^8.5.6 version: 8.5.6 shiki: - specifier: ^3.6.0 - version: 3.6.0 + specifier: ^3.7.0 + version: 3.7.0 tailwindcss: specifier: ^4.1.10 version: 4.1.10 @@ -95,10 +95,10 @@ importers: dependencies: '@hono/zod-openapi': specifier: ^0.19.8 - version: 0.19.8(hono@4.8.0)(zod@3.25.67) + version: 0.19.8(hono@4.8.2)(zod@3.25.67) '@hono/zod-validator': specifier: ^0.7.0 - version: 0.7.0(hono@4.8.0)(zod@3.25.67) + version: 0.7.0(hono@4.8.2)(zod@3.25.67) '@hookform/resolvers': specifier: ^5.1.1 version: 5.1.1(react-hook-form@7.58.1(react@19.1.0)) @@ -124,17 +124,17 @@ importers: specifier: ^0.44.2 version: 0.44.2(@neondatabase/serverless@0.10.4)(@types/pg@8.11.10)(gel@2.1.0)(pg@8.13.1)(postgres@3.4.7) hono: - specifier: ^4.8.0 - version: 4.8.0 + specifier: ^4.8.2 + version: 4.8.2 lucide-react: specifier: ^0.517.0 version: 0.517.0(react@19.1.0) next: specifier: ^15.3.4 - version: 15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-intl: specifier: ^4.1.0 - version: 4.1.0(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + version: 4.1.0(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3) react: specifier: ^19.1.0 version: 19.1.0 @@ -152,8 +152,8 @@ importers: version: 3.25.67 devDependencies: '@playwright/test': - specifier: ^1.53.0 - version: 1.53.0 + specifier: ^1.53.1 + version: 1.53.1 '@tailwindcss/postcss': specifier: ^4.1.10 version: 4.1.10 @@ -177,7 +177,7 @@ importers: version: 3.5.3 react-email: specifier: ^4.0.16 - version: 4.0.16(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 4.0.16(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) tailwindcss: specifier: ^4.1.10 version: 4.1.10 @@ -258,8 +258,8 @@ importers: specifier: ^3.0.0 version: 3.5.3 prettier-plugin-tailwindcss: - specifier: ^0.6.12 - version: 0.6.12(prettier-plugin-astro@0.7.2)(prettier@3.5.3) + specifier: ^0.6.13 + version: 0.6.13(prettier-plugin-astro@0.7.2)(prettier@3.5.3) typescript-eslint: specifier: ^8.34.1 version: 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) @@ -275,10 +275,10 @@ importers: version: 6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@hono/swagger-ui': specifier: ^0.5.2 - version: 0.5.2(hono@4.8.0) + version: 0.5.2(hono@4.8.2) '@tanstack/react-query': - specifier: ^5.80.7 - version: 5.80.7(react@19.1.0) + specifier: ^5.80.12 + version: 5.80.12(react@19.1.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -311,7 +311,7 @@ importers: version: 7.1.1 react-scan: specifier: ^0.3.4 - version: 0.3.4(@types/react@19.1.8)(next@15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.43.0) + version: 0.3.4(@types/react@19.1.8)(next@15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.44.0) resend: specifier: ^4.6.0 version: 4.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -327,10 +327,10 @@ importers: devDependencies: '@hono/zod-openapi': specifier: ^0.19.8 - version: 0.19.8(hono@4.8.0)(zod@3.25.67) + version: 0.19.8(hono@4.8.2)(zod@3.25.67) '@hono/zod-validator': specifier: ^0.7.0 - version: 0.7.0(hono@4.8.0)(zod@3.25.67) + version: 0.7.0(hono@4.8.2)(zod@3.25.67) '@hookform/resolvers': specifier: ^5.1.1 version: 5.1.1(react-hook-form@7.58.1(react@19.1.0)) @@ -339,10 +339,10 @@ importers: version: 0.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@swc/cli': specifier: 0.6.0 - version: 0.6.0(@swc/core@1.12.1)(chokidar@4.0.3) + version: 0.6.0(@swc/core@1.12.5)(chokidar@4.0.3) '@swc/core': - specifier: ^1.12.1 - version: 1.12.1 + specifier: ^1.12.5 + version: 1.12.5 '@testing-library/dom': specifier: ^10.4.0 version: 10.4.0 @@ -386,8 +386,8 @@ importers: specifier: ^9.29.0 version: 9.29.0(jiti@2.4.2) hono: - specifier: ^4.8.0 - version: 4.8.0 + specifier: ^4.8.2 + version: 4.8.2 jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -396,10 +396,10 @@ importers: version: 0.517.0(react@19.1.0) next: specifier: ^15.3.4 - version: 15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-intl: specifier: ^4.1.0 - version: 4.1.0(next@15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + version: 4.1.0(next@15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3) react: specifier: ^19.1.0 version: 19.1.0 @@ -408,7 +408,7 @@ importers: version: 19.1.0(react@19.1.0) react-email: specifier: ^4.0.16 - version: 4.0.16(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 4.0.16(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react-hook-form: specifier: ^7.58.1 version: 7.58.1(react@19.1.0) @@ -423,7 +423,7 @@ importers: version: 1.8.16 tsup: specifier: ^8.5.0 - version: 8.5.0(@swc/core@1.12.1)(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + version: 8.5.0(@swc/core@1.12.5)(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) tsx: specifier: ^4.20.3 version: 4.20.3 @@ -447,7 +447,7 @@ importers: dependencies: '@hono/zod-openapi': specifier: ^0.19.8 - version: 0.19.8(hono@4.8.0)(zod@3.25.67) + version: 0.19.8(hono@4.8.2)(zod@3.25.67) '@vitnode/core': specifier: workspace:* version: link:../../packages/vitnode @@ -458,17 +458,17 @@ importers: specifier: ^0.44.2 version: 0.44.2(@neondatabase/serverless@0.10.4)(@types/pg@8.11.10)(gel@2.1.0)(pg@8.13.1)(postgres@3.4.7) hono: - specifier: ^4.8.0 - version: 4.8.0 + specifier: ^4.8.2 + version: 4.8.2 lucide-react: specifier: ^0.517.0 version: 0.517.0(react@19.1.0) next: specifier: ^15.3.4 - version: 15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-intl: specifier: ^4.1.0 - version: 4.1.0(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + version: 4.1.0(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3) react: specifier: ^19.1.0 version: 19.1.0 @@ -487,10 +487,10 @@ importers: devDependencies: '@swc/cli': specifier: 0.6.0 - version: 0.6.0(@swc/core@1.12.1)(chokidar@4.0.3) + version: 0.6.0(@swc/core@1.12.5)(chokidar@4.0.3) '@swc/core': - specifier: ^1.12.1 - version: 1.12.1 + specifier: ^1.12.5 + version: 1.12.5 '@types/react': specifier: ^19.1.8 version: 19.1.8 @@ -1601,8 +1601,8 @@ packages: resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.53.0': - resolution: {integrity: sha512-15hjKreZDcp7t6TL/7jkAo6Df5STZN09jGiv5dbP9A6vMVncXRqE7/B2SncsyOwrkZRBH2i6/TPOL8BVmm3c7w==} + '@playwright/test@1.53.1': + resolution: {integrity: sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==} engines: {node: '>=18'} hasBin: true @@ -2441,103 +2441,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.43.0': - resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} + '@rollup/rollup-android-arm-eabi@4.44.0': + resolution: {integrity: sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.43.0': - resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==} + '@rollup/rollup-android-arm64@4.44.0': + resolution: {integrity: sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.43.0': - resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==} + '@rollup/rollup-darwin-arm64@4.44.0': + resolution: {integrity: sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.43.0': - resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==} + '@rollup/rollup-darwin-x64@4.44.0': + resolution: {integrity: sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.43.0': - resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==} + '@rollup/rollup-freebsd-arm64@4.44.0': + resolution: {integrity: sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.43.0': - resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==} + '@rollup/rollup-freebsd-x64@4.44.0': + resolution: {integrity: sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.43.0': - resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} + '@rollup/rollup-linux-arm-gnueabihf@4.44.0': + resolution: {integrity: sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.43.0': - resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} + '@rollup/rollup-linux-arm-musleabihf@4.44.0': + resolution: {integrity: sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.43.0': - resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} + '@rollup/rollup-linux-arm64-gnu@4.44.0': + resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.43.0': - resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} + '@rollup/rollup-linux-arm64-musl@4.44.0': + resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.43.0': - resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} + '@rollup/rollup-linux-loongarch64-gnu@4.44.0': + resolution: {integrity: sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': - resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': + resolution: {integrity: sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.43.0': - resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} + '@rollup/rollup-linux-riscv64-gnu@4.44.0': + resolution: {integrity: sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.43.0': - resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} + '@rollup/rollup-linux-riscv64-musl@4.44.0': + resolution: {integrity: sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.43.0': - resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} + '@rollup/rollup-linux-s390x-gnu@4.44.0': + resolution: {integrity: sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.43.0': - resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} + '@rollup/rollup-linux-x64-gnu@4.44.0': + resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.43.0': - resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} + '@rollup/rollup-linux-x64-musl@4.44.0': + resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.43.0': - resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} + '@rollup/rollup-win32-arm64-msvc@4.44.0': + resolution: {integrity: sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.43.0': - resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==} + '@rollup/rollup-win32-ia32-msvc@4.44.0': + resolution: {integrity: sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.43.0': - resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==} + '@rollup/rollup-win32-x64-msvc@4.44.0': + resolution: {integrity: sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==} cpu: [x64] os: [win32] @@ -2550,29 +2550,29 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@shikijs/core@3.6.0': - resolution: {integrity: sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw==} + '@shikijs/core@3.7.0': + resolution: {integrity: sha512-yilc0S9HvTPyahHpcum8eonYrQtmGTU0lbtwxhA6jHv4Bm1cAdlPFRCJX4AHebkCm75aKTjjRAW+DezqD1b/cg==} - '@shikijs/engine-javascript@3.6.0': - resolution: {integrity: sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA==} + '@shikijs/engine-javascript@3.7.0': + resolution: {integrity: sha512-0t17s03Cbv+ZcUvv+y33GtX75WBLQELgNdVghnsdhTgU3hVcWcMsoP6Lb0nDTl95ZJfbP1mVMO0p3byVh3uuzA==} - '@shikijs/engine-oniguruma@3.6.0': - resolution: {integrity: sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==} + '@shikijs/engine-oniguruma@3.7.0': + resolution: {integrity: sha512-5BxcD6LjVWsGu4xyaBC5bu8LdNgPCVBnAkWTtOCs/CZxcB22L8rcoWfv7Hh/3WooVjBZmFtyxhgvkQFedPGnFw==} - '@shikijs/langs@3.6.0': - resolution: {integrity: sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==} + '@shikijs/langs@3.7.0': + resolution: {integrity: sha512-1zYtdfXLr9xDKLTGy5kb7O0zDQsxXiIsw1iIBcNOO8Yi5/Y1qDbJ+0VsFoqTlzdmneO8Ij35g7QKF8kcLyznCQ==} - '@shikijs/rehype@3.6.0': - resolution: {integrity: sha512-r0Rr2hvXXqLl5DJ1Lx7RImU81XsK2bjThaym/lujl2A0r7SId0u1s+bcWYfFKb+7mCLH7MXF+jdzCtdWGOcYCQ==} + '@shikijs/rehype@3.7.0': + resolution: {integrity: sha512-YjAZxhQnBXE8ehppKGzuVGPoE4pjVsxqzkWhBZlkP495AjlR++MgfiRFcQfDt3qX5lK3gEDTcghB/8E3yNrWqQ==} - '@shikijs/themes@3.6.0': - resolution: {integrity: sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==} + '@shikijs/themes@3.7.0': + resolution: {integrity: sha512-VJx8497iZPy5zLiiCTSIaOChIcKQwR0FebwE9S3rcN0+J/GTWwQ1v/bqhTbpbY3zybPKeO8wdammqkpXc4NVjQ==} - '@shikijs/transformers@3.6.0': - resolution: {integrity: sha512-PYkU54lYV0RCaUG8n2FNTF+YWiU3uPhcjLGq2x/C8lIrUX9GVnRb3bK+R5xtdFHbuctntATKm7ondp/H/dux9Q==} + '@shikijs/transformers@3.7.0': + resolution: {integrity: sha512-VplaqIMRNsNOorCXJHkbF5S0pT6xm8Z/s7w7OPZLohf8tR93XH0krvUafpNy/ozEylrWuShJF0+ftEB+wFRwGA==} - '@shikijs/types@3.6.0': - resolution: {integrity: sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==} + '@shikijs/types@3.7.0': + resolution: {integrity: sha512-MGaLeaRlSWpnP0XSAum3kP3a8vtcTsITqoEPYdt3lQG3YCdQH4DnEhodkYcNMcU0uW0RffhoD1O3e0vG5eSBBg==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -2601,68 +2601,68 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.12.1': - resolution: {integrity: sha512-nUjWVcJ3YS2N40ZbKwYO2RJ4+o2tWYRzNOcIQp05FqW0+aoUCVMdAUUzQinPDynfgwVshDAXCKemY8X7nN5MaA==} + '@swc/core-darwin-arm64@1.12.5': + resolution: {integrity: sha512-3WF+naP/qkt5flrTfJr+p07b522JcixKvIivM7FgvllA6LjJxf+pheoILrTS8IwrNAK/XtHfKWYcGY+3eaA4mA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.12.1': - resolution: {integrity: sha512-OGm4a4d3OeJn+tRt8H/eiHgTFrJbS6r8mi/Ob65tAEXZGHN900T2kR7c5ALr0V2hBOQ8BfhexwPoQlGQP/B95w==} + '@swc/core-darwin-x64@1.12.5': + resolution: {integrity: sha512-GCcD3dft8YN7unTBcW02Fx41jXp2MNQHCjx5ceWSEYOGvn7vBSUp7k7LkfTxGN5Ftxb9a1mxhPq8r4rD2u/aPw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.12.1': - resolution: {integrity: sha512-76YeeQKyK0EtNkQiNBZ0nbVGooPf9IucY0WqVXVpaU4wuG7ZyLEE2ZAIgXafIuzODGQoLfetue7I8boMxh1/MA==} + '@swc/core-linux-arm-gnueabihf@1.12.5': + resolution: {integrity: sha512-jWlzP/Y4+wbE/EJM+WGIDQsklLFV3g5LmbYTBgrY4+5nb517P31mkBzf5y2knfNWPrL7HzNu0578j3Zi2E6Iig==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.12.1': - resolution: {integrity: sha512-BxJDIJPq1+aCh9UsaSAN6wo3tuln8UhNXruOrzTI8/ElIig/3sAueDM6Eq7GvZSGGSA7ljhNATMJ0elD7lFatQ==} + '@swc/core-linux-arm64-gnu@1.12.5': + resolution: {integrity: sha512-GkzgIUz+2r6J6Tn3hb7/4ByaWHRrRZt4vuN9BLAd+y65m2Bt0vlEpPtWhrB/TVe4hEkFR+W5PDETLEbUT4i0tQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.12.1': - resolution: {integrity: sha512-NhLdbffSXvY0/FwUSAl4hKBlpe5GHQGXK8DxTo3HHjLsD9sCPYieo3vG0NQoUYAy4ZUY1WeGjyxeq4qZddJzEQ==} + '@swc/core-linux-arm64-musl@1.12.5': + resolution: {integrity: sha512-g0AJ7QmZPj3Uw+C5pDa48LAUG7JBgQmB0mN5cW+s2mjaFKT0mTSxYALtx/MDZwJExDPo0yJV8kSbFO1tvFPyhg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.12.1': - resolution: {integrity: sha512-CrYnV8SZIgArQ9LKH0xEF95PKXzX9WkRSc5j55arOSBeDCeDUQk1Bg/iKdnDiuj5HC1hZpvzwMzSBJjv+Z70jA==} + '@swc/core-linux-x64-gnu@1.12.5': + resolution: {integrity: sha512-PeYoSziNy+iNiBHPtAsO84bzBne/mbCsG5ijYkAhS1GVsDgohClorUvRXXhcUZoX2gr8TfSI9WLHo30K+DKiHg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.12.1': - resolution: {integrity: sha512-BQMl3d0HaGB0/h2xcKlGtjk/cGRn2tnbsaChAKcjFdCepblKBCz1pgO/mL7w5iXq3s57wMDUn++71/a5RAkZOA==} + '@swc/core-linux-x64-musl@1.12.5': + resolution: {integrity: sha512-EJrfCCIyuV5LLmYgKtIMwtgsnjVesdFe0IgQzEKs9OfB6cL6g7WO9conn8BkGX8jphVa7jChKxShDGkreWWDzA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.12.1': - resolution: {integrity: sha512-b7NeGnpqTfmIGtUqXBl0KqoSmOnH64nRZoT5l4BAGdvwY7nxitWR94CqZuwyLPty/bLywmyDA9uO12Kvgb3+gg==} + '@swc/core-win32-arm64-msvc@1.12.5': + resolution: {integrity: sha512-FnwT7fxkJJMgsfiDoZKEVGyCzrPFbzpflFAAoTCUCu3MaHw6mW55o/MAAfofvJ1iIcEpec4o93OilsmKtpyO5Q==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.12.1': - resolution: {integrity: sha512-iU/29X2D7cHBp1to62cUg/5Xk8K+lyOJiKIGGW5rdzTW/c2zz3d/ehgpzVP/rqC4NVr88MXspqHU4il5gmDajw==} + '@swc/core-win32-ia32-msvc@1.12.5': + resolution: {integrity: sha512-jW6l4KFt9mIXSpGseE6BQOEFmbIeXeShDuWgldEJXKeXf/uPs8wrqv80XBIUwVpK0ZbmJwPQ0waGVj8UM3th2Q==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.12.1': - resolution: {integrity: sha512-+Zh+JKDwiFqV5N9yAd2DhYVGPORGh9cfenu1ptr9yge+eHAf7vZJcC3rnj6QMR1QJh0Y5VC9+YBjRFjZVA7XDw==} + '@swc/core-win32-x64-msvc@1.12.5': + resolution: {integrity: sha512-AZszwuEjlz1tSNLQRm3T5OZJ5eebxjJlDQnnzXJmg0B7DJMRoaAe1HTLOmejxjFK6yWr7fh+pSeCw2PgQLxgqA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.12.1': - resolution: {integrity: sha512-aKXdDTqxTVFl/bKQZ3EQUjEMBEoF6JBv29moMZq0kbVO43na6u/u+3Vcbhbrh+A2N0X5OL4RaveuWfAjEgOmeA==} + '@swc/core@1.12.5': + resolution: {integrity: sha512-KxA0PHHIuUBmQ/Oi+xFpVzILj2Oo37sTtftCbyowQlyx5YOknEOw1kLpas5hMcpznXgFyAWbpK71xQps4INPgA==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -2771,11 +2771,11 @@ packages: '@tailwindcss/postcss@4.1.10': resolution: {integrity: sha512-B+7r7ABZbkXJwpvt2VMnS6ujcDoR2OOcFaqrLIo1xbcdxje4Vf+VgJdBzNNbrAjBj/rLZ66/tlQ1knIGNLKOBQ==} - '@tanstack/query-core@5.80.7': - resolution: {integrity: sha512-s09l5zeUKC8q7DCCCIkVSns8zZrK4ZDT6ryEjxNBFi68G4z2EBobBS7rdOY3r6W1WbUDpc1fe5oY+YO/+2UVUg==} + '@tanstack/query-core@5.80.12': + resolution: {integrity: sha512-Cy+l+jNuII87oGpzkJ+nGDydzWJeq+gDr72lGURHXjD0UqZh5yRXcLg0Ix7jG+0Tn/ayGnR9+yph7Vbf1j8QZA==} - '@tanstack/react-query@5.80.7': - resolution: {integrity: sha512-u2F0VK6+anItoEvB3+rfvTO9GEh2vb00Je05OwlUe/A0lkJBgW1HckiY3f9YZa+jx6IOe4dHPh10dyp9aY3iRQ==} + '@tanstack/react-query@5.80.12': + resolution: {integrity: sha512-hCtE5hw4rSqMcHSlkVLhM6jXy55rQsCE8qmgLq2MIqf/r4dRFrVlSqMczmO5w0ZQMYWeeHCYMrdRxtadajQK/Q==} peerDependencies: react: ^18 || ^19 @@ -2834,9 +2834,6 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -3279,8 +3276,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001723: - resolution: {integrity: sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==} + caniuse-lite@1.0.30001724: + resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3446,8 +3443,8 @@ packages: engines: {node: '>=4'} hasBin: true - cssstyle@4.4.0: - resolution: {integrity: sha512-W0Y2HOXlPkb2yaKrCVRjinYKciu/qSLEmK0K9mcfDei3zwlnHFEHAs/Du3cIRwPqY+J4JsiBzUjoHyc8RsJ03A==} + cssstyle@4.5.0: + resolution: {integrity: sha512-/7gw8TGrvH/0g564EnhgFZogTMVe+lifpB7LWU+PEsiq5o83TUXR3fDbzTRXOJhoJwck5IS9ez3Em5LNMMO2aw==} engines: {node: '>=18'} csstype@3.1.3: @@ -3676,8 +3673,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.170: - resolution: {integrity: sha512-GP+M7aeluQo9uAyiTCxgIj/j+PrWhMlY7LFVj8prlsPljd0Fdg9AprlfUi+OCSFWy9Y5/2D/Jrj9HS8Z4rpKWA==} + electron-to-chromium@1.5.171: + resolution: {integrity: sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==} emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -4252,8 +4249,8 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hono@4.8.0: - resolution: {integrity: sha512-NoiHrqJxoe1MYXqW+/0/Q4NCizKj2Ivm4KmX8mOSBtw9UJ7KYaOGKkO7csIwO5UlZpfvVRdcgiMb0GGyjEjtcw==} + hono@4.8.2: + resolution: {integrity: sha512-hM+1RIn9PK1I6SiTNS6/y7O1mvg88awYLFEuEtoiMtRyT3SD2iu9pSFgbBXT3b1Ua4IwzvSTLvwO0SEhDxCi4w==} engines: {node: '>=16.9.0'} html-encoding-sniffer@4.0.0: @@ -5272,8 +5269,8 @@ packages: peerDependencies: pg: '>=8.0' - pg-protocol@1.10.1: - resolution: {integrity: sha512-9YS3ZonDj0Lxny//aF0ITPdfrEPgKWCJvONsSXAaIUhgpzlzl5JgaZNlbTFxvYNfm2terGEnHeOSUlF6qRGBzw==} + pg-protocol@1.10.2: + resolution: {integrity: sha512-Ci7jy8PbaWxfsck2dwZdERcDG2A0MG8JoQILs+uZNjABFuBuItAZCWUNz8sXRDMoui24rJw7WlXqgpMdBSN/vQ==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -5316,13 +5313,13 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-core@1.53.0: - resolution: {integrity: sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==} + playwright-core@1.53.1: + resolution: {integrity: sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==} engines: {node: '>=18'} hasBin: true - playwright@1.53.0: - resolution: {integrity: sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==} + playwright@1.53.1: + resolution: {integrity: sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==} engines: {node: '>=18'} hasBin: true @@ -5418,8 +5415,8 @@ packages: resolution: {integrity: sha512-mmifnkG160BtC727gqoimoxnZT/dwr8ASxpoGGl6EHevhfblSOeu+pwH1LAm5Qu1MynizktztFujHHaijLCkww==} engines: {node: ^14.15.0 || >=16.0.0, pnpm: '>=7.14.0'} - prettier-plugin-tailwindcss@0.6.12: - resolution: {integrity: sha512-OuTQKoqNwV7RnxTPwXWzOFXy6Jc4z8oeRZYGuMpRyG3WbuR3jjXdQFK8qFBMBx8UHWdHrddARz2fgUenild6aw==} + prettier-plugin-tailwindcss@0.6.13: + resolution: {integrity: sha512-uQ0asli1+ic8xrrSmIOaElDu0FacR4x69GynTh2oZjFY10JUt6EEumTQl5tB4fMeD6I1naKd+4rXQQ7esT2i1g==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' @@ -5713,8 +5710,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.43.0: - resolution: {integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==} + rollup@4.44.0: + resolution: {integrity: sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5817,8 +5814,8 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} - shiki@3.6.0: - resolution: {integrity: sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w==} + shiki@3.7.0: + resolution: {integrity: sha512-ZcI4UT9n6N2pDuM2n3Jbk0sR4Swzq43nLPgS/4h0E3B/NrFn2HKElrDtceSf8Zx/OWYOo7G1SAtBLypCp+YXqg==} side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} @@ -7130,10 +7127,10 @@ snapshots: dependencies: tslib: 2.8.1 - '@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': + '@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.15.0) - fumadocs-core: 15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fumadocs-core: 15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) gray-matter: 4.0.3 react: 19.1.0 zod: 3.25.67 @@ -7142,20 +7139,20 @@ snapshots: - supports-color optional: true - '@hono/swagger-ui@0.5.2(hono@4.8.0)': + '@hono/swagger-ui@0.5.2(hono@4.8.2)': dependencies: - hono: 4.8.0 + hono: 4.8.2 - '@hono/zod-openapi@0.19.8(hono@4.8.0)(zod@3.25.67)': + '@hono/zod-openapi@0.19.8(hono@4.8.2)(zod@3.25.67)': dependencies: '@asteasolutions/zod-to-openapi': 7.3.4(zod@3.25.67) - '@hono/zod-validator': 0.7.0(hono@4.8.0)(zod@3.25.67) - hono: 4.8.0 + '@hono/zod-validator': 0.7.0(hono@4.8.2)(zod@3.25.67) + hono: 4.8.2 zod: 3.25.67 - '@hono/zod-validator@0.7.0(hono@4.8.0)(zod@3.25.67)': + '@hono/zod-validator@0.7.0(hono@4.8.2)(zod@3.25.67)': dependencies: - hono: 4.8.0 + hono: 4.8.2 zod: 3.25.67 '@hookform/resolvers@5.1.1(react-hook-form@7.58.1(react@19.1.0))': @@ -7570,9 +7567,9 @@ snapshots: '@pkgr/core@0.2.7': {} - '@playwright/test@1.53.0': + '@playwright/test@1.53.1': dependencies: - playwright: 1.53.0 + playwright: 1.53.1 '@preact/signals-core@1.10.0': {} @@ -8442,72 +8439,72 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.11': {} - '@rollup/pluginutils@5.2.0(rollup@4.43.0)': + '@rollup/pluginutils@5.2.0(rollup@4.44.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.43.0 + rollup: 4.44.0 - '@rollup/rollup-android-arm-eabi@4.43.0': + '@rollup/rollup-android-arm-eabi@4.44.0': optional: true - '@rollup/rollup-android-arm64@4.43.0': + '@rollup/rollup-android-arm64@4.44.0': optional: true - '@rollup/rollup-darwin-arm64@4.43.0': + '@rollup/rollup-darwin-arm64@4.44.0': optional: true - '@rollup/rollup-darwin-x64@4.43.0': + '@rollup/rollup-darwin-x64@4.44.0': optional: true - '@rollup/rollup-freebsd-arm64@4.43.0': + '@rollup/rollup-freebsd-arm64@4.44.0': optional: true - '@rollup/rollup-freebsd-x64@4.43.0': + '@rollup/rollup-freebsd-x64@4.44.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.43.0': + '@rollup/rollup-linux-arm-gnueabihf@4.44.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.43.0': + '@rollup/rollup-linux-arm-musleabihf@4.44.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.43.0': + '@rollup/rollup-linux-arm64-gnu@4.44.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.43.0': + '@rollup/rollup-linux-arm64-musl@4.44.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.43.0': + '@rollup/rollup-linux-loongarch64-gnu@4.44.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.43.0': + '@rollup/rollup-linux-riscv64-gnu@4.44.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.43.0': + '@rollup/rollup-linux-riscv64-musl@4.44.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.43.0': + '@rollup/rollup-linux-s390x-gnu@4.44.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.43.0': + '@rollup/rollup-linux-x64-gnu@4.44.0': optional: true - '@rollup/rollup-linux-x64-musl@4.43.0': + '@rollup/rollup-linux-x64-musl@4.44.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.43.0': + '@rollup/rollup-win32-arm64-msvc@4.44.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.43.0': + '@rollup/rollup-win32-ia32-msvc@4.44.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.43.0': + '@rollup/rollup-win32-x64-msvc@4.44.0': optional: true '@schummar/icu-type-parser@1.21.5': {} @@ -8519,47 +8516,47 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 - '@shikijs/core@3.6.0': + '@shikijs/core@3.7.0': dependencies: - '@shikijs/types': 3.6.0 + '@shikijs/types': 3.7.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.6.0': + '@shikijs/engine-javascript@3.7.0': dependencies: - '@shikijs/types': 3.6.0 + '@shikijs/types': 3.7.0 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 - '@shikijs/engine-oniguruma@3.6.0': + '@shikijs/engine-oniguruma@3.7.0': dependencies: - '@shikijs/types': 3.6.0 + '@shikijs/types': 3.7.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.6.0': + '@shikijs/langs@3.7.0': dependencies: - '@shikijs/types': 3.6.0 + '@shikijs/types': 3.7.0 - '@shikijs/rehype@3.6.0': + '@shikijs/rehype@3.7.0': dependencies: - '@shikijs/types': 3.6.0 + '@shikijs/types': 3.7.0 '@types/hast': 3.0.4 hast-util-to-string: 3.0.1 - shiki: 3.6.0 + shiki: 3.7.0 unified: 11.0.5 unist-util-visit: 5.0.0 - '@shikijs/themes@3.6.0': + '@shikijs/themes@3.7.0': dependencies: - '@shikijs/types': 3.6.0 + '@shikijs/types': 3.7.0 - '@shikijs/transformers@3.6.0': + '@shikijs/transformers@3.7.0': dependencies: - '@shikijs/core': 3.6.0 - '@shikijs/types': 3.6.0 + '@shikijs/core': 3.7.0 + '@shikijs/types': 3.7.0 - '@shikijs/types@3.6.0': + '@shikijs/types@3.7.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -8574,9 +8571,9 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@swc/cli@0.6.0(@swc/core@1.12.1)(chokidar@4.0.3)': + '@swc/cli@0.6.0(@swc/core@1.12.5)(chokidar@4.0.3)': dependencies: - '@swc/core': 1.12.1 + '@swc/core': 1.12.5 '@swc/counter': 0.1.3 '@xhmikosr/bin-wrapper': 13.0.5 commander: 8.3.0 @@ -8589,51 +8586,51 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@swc/core-darwin-arm64@1.12.1': + '@swc/core-darwin-arm64@1.12.5': optional: true - '@swc/core-darwin-x64@1.12.1': + '@swc/core-darwin-x64@1.12.5': optional: true - '@swc/core-linux-arm-gnueabihf@1.12.1': + '@swc/core-linux-arm-gnueabihf@1.12.5': optional: true - '@swc/core-linux-arm64-gnu@1.12.1': + '@swc/core-linux-arm64-gnu@1.12.5': optional: true - '@swc/core-linux-arm64-musl@1.12.1': + '@swc/core-linux-arm64-musl@1.12.5': optional: true - '@swc/core-linux-x64-gnu@1.12.1': + '@swc/core-linux-x64-gnu@1.12.5': optional: true - '@swc/core-linux-x64-musl@1.12.1': + '@swc/core-linux-x64-musl@1.12.5': optional: true - '@swc/core-win32-arm64-msvc@1.12.1': + '@swc/core-win32-arm64-msvc@1.12.5': optional: true - '@swc/core-win32-ia32-msvc@1.12.1': + '@swc/core-win32-ia32-msvc@1.12.5': optional: true - '@swc/core-win32-x64-msvc@1.12.1': + '@swc/core-win32-x64-msvc@1.12.5': optional: true - '@swc/core@1.12.1': + '@swc/core@1.12.5': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.23 optionalDependencies: - '@swc/core-darwin-arm64': 1.12.1 - '@swc/core-darwin-x64': 1.12.1 - '@swc/core-linux-arm-gnueabihf': 1.12.1 - '@swc/core-linux-arm64-gnu': 1.12.1 - '@swc/core-linux-arm64-musl': 1.12.1 - '@swc/core-linux-x64-gnu': 1.12.1 - '@swc/core-linux-x64-musl': 1.12.1 - '@swc/core-win32-arm64-msvc': 1.12.1 - '@swc/core-win32-ia32-msvc': 1.12.1 - '@swc/core-win32-x64-msvc': 1.12.1 + '@swc/core-darwin-arm64': 1.12.5 + '@swc/core-darwin-x64': 1.12.5 + '@swc/core-linux-arm-gnueabihf': 1.12.5 + '@swc/core-linux-arm64-gnu': 1.12.5 + '@swc/core-linux-arm64-musl': 1.12.5 + '@swc/core-linux-x64-gnu': 1.12.5 + '@swc/core-linux-x64-musl': 1.12.5 + '@swc/core-win32-arm64-msvc': 1.12.5 + '@swc/core-win32-ia32-msvc': 1.12.5 + '@swc/core-win32-x64-msvc': 1.12.5 '@swc/counter@0.1.3': {} @@ -8721,11 +8718,11 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.10 - '@tanstack/query-core@5.80.7': {} + '@tanstack/query-core@5.80.12': {} - '@tanstack/react-query@5.80.7(react@19.1.0)': + '@tanstack/react-query@5.80.12(react@19.1.0)': dependencies: - '@tanstack/query-core': 5.80.7 + '@tanstack/query-core': 5.80.12 react: 19.1.0 '@testing-library/dom@10.4.0': @@ -8798,8 +8795,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - '@types/estree@1.0.7': {} - '@types/estree@1.0.8': {} '@types/hast@3.0.4': @@ -8833,14 +8828,14 @@ snapshots: '@types/pg@8.11.10': dependencies: '@types/node': 24.0.3 - pg-protocol: 1.10.1 + pg-protocol: 1.10.2 pg-types: 4.0.2 optional: true '@types/pg@8.11.6': dependencies: '@types/node': 24.0.3 - pg-protocol: 1.10.1 + pg-protocol: 1.10.2 pg-types: 4.0.2 optional: true @@ -9297,8 +9292,8 @@ snapshots: browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001723 - electron-to-chromium: 1.5.170 + caniuse-lite: 1.0.30001724 + electron-to-chromium: 1.5.171 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.0) @@ -9353,7 +9348,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001723: {} + caniuse-lite@1.0.30001724: {} ccount@2.0.1: {} @@ -9509,7 +9504,7 @@ snapshots: cssesc@3.0.0: {} - cssstyle@4.4.0: + cssstyle@4.5.0: dependencies: '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 @@ -9648,7 +9643,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.170: {} + electron-to-chromium@1.5.171: {} emoji-regex@10.4.0: {} @@ -10167,7 +10162,7 @@ snapshots: dependencies: magic-string: 0.30.17 mlly: 1.7.4 - rollup: 4.43.0 + rollup: 4.44.0 flat-cache@4.0.1: dependencies: @@ -10202,12 +10197,12 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@formatjs/intl-localematcher': 0.6.1 '@orama/orama': 3.1.7 - '@shikijs/rehype': 3.6.0 - '@shikijs/transformers': 3.6.0 + '@shikijs/rehype': 3.7.0 + '@shikijs/transformers': 3.7.0 github-slugger: 2.0.0 hast-util-to-estree: 3.1.3 hast-util-to-jsx-runtime: 2.3.6 @@ -10218,24 +10213,24 @@ snapshots: remark-gfm: 4.0.1 remark-rehype: 11.1.2 scroll-into-view-if-needed: 3.1.0 - shiki: 3.6.0 + shiki: 3.7.0 unist-util-visit: 5.0.0 optionalDependencies: '@types/react': 19.1.8 - next: 15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: - supports-color - fumadocs-mdx@11.6.9(@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0))(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)): + fumadocs-mdx@11.6.9(@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0))(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)): dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.15.0) '@standard-schema/spec': 1.0.0 chokidar: 4.0.3 esbuild: 0.25.5 estree-util-value-to-estree: 3.4.0 - fumadocs-core: 15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fumadocs-core: 15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) js-yaml: 4.1.0 lru-cache: 11.1.0 picocolors: 1.1.1 @@ -10244,14 +10239,14 @@ snapshots: unist-util-visit: 5.0.0 zod: 3.25.67 optionalDependencies: - '@fumadocs/mdx-remote': 1.3.0(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) - next: 15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@fumadocs/mdx-remote': 1.3.0(acorn@8.15.0)(fumadocs-core@15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + next: 15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - acorn - supports-color - fumadocs-ui@15.5.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.1.10): + fumadocs-ui@15.5.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.1.10): dependencies: '@radix-ui/react-accordion': 1.2.11(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-collapsible': 1.1.11(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -10264,7 +10259,7 @@ snapshots: '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) '@radix-ui/react-tabs': 1.1.12(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) class-variance-authority: 0.7.1 - fumadocs-core: 15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fumadocs-core: 15.5.3(@types/react@19.1.8)(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) lodash.merge: 4.6.2 next-themes: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) postcss-selector-parser: 7.1.0 @@ -10275,7 +10270,7 @@ snapshots: tailwind-merge: 3.3.1 optionalDependencies: '@types/react': 19.1.8 - next: 15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) tailwindcss: 4.1.10 transitivePeerDependencies: - '@oramacloud/client' @@ -10518,7 +10513,7 @@ snapshots: dependencies: hermes-estree: 0.25.1 - hono@4.8.0: {} + hono@4.8.2: {} html-encoding-sniffer@4.0.0: dependencies: @@ -10826,7 +10821,7 @@ snapshots: jsdom@26.1.0: dependencies: - cssstyle: 4.4.0 + cssstyle: 4.5.0 data-urls: 5.0.0 decimal.js: 10.5.0 html-encoding-sniffer: 4.0.0 @@ -11534,21 +11529,21 @@ snapshots: negotiator@1.0.0: {} - next-intl@4.1.0(next@15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3): + next-intl@4.1.0(next@15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 negotiator: 1.0.0 - next: 15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 use-intl: 4.1.0(react@19.1.0) optionalDependencies: typescript: 5.8.3 - next-intl@4.1.0(next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3): + next-intl@4.1.0(next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 negotiator: 1.0.0 - next: 15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 use-intl: 4.1.0(react@19.1.0) optionalDependencies: @@ -11559,13 +11554,13 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - next@15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@next/env': 15.3.4 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001723 + caniuse-lite: 1.0.30001724 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -11579,19 +11574,19 @@ snapshots: '@next/swc-linux-x64-musl': 15.3.4 '@next/swc-win32-arm64-msvc': 15.3.4 '@next/swc-win32-x64-msvc': 15.3.4 - '@playwright/test': 1.53.0 + '@playwright/test': 1.53.1 sharp: 0.34.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@next/env': 15.3.4 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001723 + caniuse-lite: 1.0.30001724 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -11605,7 +11600,7 @@ snapshots: '@next/swc-linux-x64-musl': 15.3.4 '@next/swc-win32-arm64-msvc': 15.3.4 '@next/swc-win32-x64-msvc': 15.3.4 - '@playwright/test': 1.53.0 + '@playwright/test': 1.53.1 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.2 transitivePeerDependencies: @@ -11794,7 +11789,7 @@ snapshots: pg: 8.13.1 optional: true - pg-protocol@1.10.1: + pg-protocol@1.10.2: optional: true pg-types@2.2.0: @@ -11821,7 +11816,7 @@ snapshots: dependencies: pg-connection-string: 2.9.1 pg-pool: 3.10.1(pg@8.13.1) - pg-protocol: 1.10.1 + pg-protocol: 1.10.2 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -11851,11 +11846,11 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 - playwright-core@1.53.0: {} + playwright-core@1.53.1: {} - playwright@1.53.0: + playwright@1.53.1: dependencies: - playwright-core: 1.53.0 + playwright-core: 1.53.1 optionalDependencies: fsevents: 2.3.2 @@ -11940,7 +11935,7 @@ snapshots: synckit: 0.8.8 optional: true - prettier-plugin-tailwindcss@0.6.12(prettier-plugin-astro@0.7.2)(prettier@3.5.3): + prettier-plugin-tailwindcss@0.6.13(prettier-plugin-astro@0.7.2)(prettier@3.5.3): dependencies: prettier: 3.5.3 optionalDependencies: @@ -12045,7 +12040,7 @@ snapshots: react: 19.1.0 scheduler: 0.26.0 - react-email@4.0.16(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-email@4.0.16(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@babel/parser': 7.27.5 '@babel/traverse': 7.27.4 @@ -12057,7 +12052,7 @@ snapshots: glob: 11.0.3 log-symbols: 7.0.1 mime-types: 3.0.1 - next: 15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) normalize-path: 3.0.0 ora: 8.2.0 socket.io: 4.8.1 @@ -12074,7 +12069,7 @@ snapshots: - supports-color - utf-8-validate - react-email@4.0.16(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-email@4.0.16(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@babel/parser': 7.27.5 '@babel/traverse': 7.27.4 @@ -12086,7 +12081,7 @@ snapshots: glob: 11.0.3 log-symbols: 7.0.1 mime-types: 3.0.1 - next: 15.3.4(@playwright/test@1.53.0)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@playwright/test@1.53.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) normalize-path: 3.0.0 ora: 8.2.0 socket.io: 4.8.1 @@ -12141,7 +12136,7 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 - react-scan@0.3.4(@types/react@19.1.8)(next@15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.43.0): + react-scan@0.3.4(@types/react@19.1.8)(next@15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.44.0): dependencies: '@babel/core': 7.27.4 '@babel/generator': 7.27.5 @@ -12150,20 +12145,20 @@ snapshots: '@clack/prompts': 0.8.2 '@pivanov/utils': 0.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@preact/signals': 1.3.2(preact@10.26.9) - '@rollup/pluginutils': 5.2.0(rollup@4.43.0) + '@rollup/pluginutils': 5.2.0(rollup@4.44.0) '@types/node': 20.19.1 bippy: 0.3.17(@types/react@19.1.8)(react@19.1.0) esbuild: 0.25.5 estree-walker: 3.0.3 kleur: 4.1.5 mri: 1.2.0 - playwright: 1.53.0 + playwright: 1.53.1 preact: 10.26.9 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) tsx: 4.20.3 optionalDependencies: - next: 15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@babel/core@7.27.4)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) unplugin: 2.1.0 transitivePeerDependencies: - '@types/react' @@ -12338,30 +12333,30 @@ snapshots: reusify@1.1.0: {} - rollup@4.43.0: + rollup@4.44.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.43.0 - '@rollup/rollup-android-arm64': 4.43.0 - '@rollup/rollup-darwin-arm64': 4.43.0 - '@rollup/rollup-darwin-x64': 4.43.0 - '@rollup/rollup-freebsd-arm64': 4.43.0 - '@rollup/rollup-freebsd-x64': 4.43.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.43.0 - '@rollup/rollup-linux-arm-musleabihf': 4.43.0 - '@rollup/rollup-linux-arm64-gnu': 4.43.0 - '@rollup/rollup-linux-arm64-musl': 4.43.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.43.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.43.0 - '@rollup/rollup-linux-riscv64-gnu': 4.43.0 - '@rollup/rollup-linux-riscv64-musl': 4.43.0 - '@rollup/rollup-linux-s390x-gnu': 4.43.0 - '@rollup/rollup-linux-x64-gnu': 4.43.0 - '@rollup/rollup-linux-x64-musl': 4.43.0 - '@rollup/rollup-win32-arm64-msvc': 4.43.0 - '@rollup/rollup-win32-ia32-msvc': 4.43.0 - '@rollup/rollup-win32-x64-msvc': 4.43.0 + '@rollup/rollup-android-arm-eabi': 4.44.0 + '@rollup/rollup-android-arm64': 4.44.0 + '@rollup/rollup-darwin-arm64': 4.44.0 + '@rollup/rollup-darwin-x64': 4.44.0 + '@rollup/rollup-freebsd-arm64': 4.44.0 + '@rollup/rollup-freebsd-x64': 4.44.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.0 + '@rollup/rollup-linux-arm-musleabihf': 4.44.0 + '@rollup/rollup-linux-arm64-gnu': 4.44.0 + '@rollup/rollup-linux-arm64-musl': 4.44.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.0 + '@rollup/rollup-linux-riscv64-gnu': 4.44.0 + '@rollup/rollup-linux-riscv64-musl': 4.44.0 + '@rollup/rollup-linux-s390x-gnu': 4.44.0 + '@rollup/rollup-linux-x64-gnu': 4.44.0 + '@rollup/rollup-linux-x64-musl': 4.44.0 + '@rollup/rollup-win32-arm64-msvc': 4.44.0 + '@rollup/rollup-win32-ia32-msvc': 4.44.0 + '@rollup/rollup-win32-x64-msvc': 4.44.0 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -12498,14 +12493,14 @@ snapshots: shell-quote@1.8.3: {} - shiki@3.6.0: + shiki@3.7.0: dependencies: - '@shikijs/core': 3.6.0 - '@shikijs/engine-javascript': 3.6.0 - '@shikijs/engine-oniguruma': 3.6.0 - '@shikijs/langs': 3.6.0 - '@shikijs/themes': 3.6.0 - '@shikijs/types': 3.6.0 + '@shikijs/core': 3.7.0 + '@shikijs/engine-javascript': 3.7.0 + '@shikijs/engine-oniguruma': 3.7.0 + '@shikijs/langs': 3.7.0 + '@shikijs/themes': 3.7.0 + '@shikijs/types': 3.7.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -12909,7 +12904,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.0(@swc/core@1.12.1)(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): + tsup@8.5.0(@swc/core@1.12.5)(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): dependencies: bundle-require: 5.1.0(esbuild@0.25.5) cac: 6.7.14 @@ -12922,14 +12917,14 @@ snapshots: picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0) resolve-from: 5.0.0 - rollup: 4.43.0 + rollup: 4.44.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 tinyglobby: 0.2.14 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.12.1 + '@swc/core': 1.12.5 postcss: 8.5.6 typescript: 5.8.3 transitivePeerDependencies: @@ -13191,7 +13186,7 @@ snapshots: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.6 - rollup: 4.43.0 + rollup: 4.44.0 tinyglobby: 0.2.14 optionalDependencies: '@types/node': 24.0.3