diff --git a/.env.example b/.env.example index 1d34646f3..8cd02f224 100644 --- a/.env.example +++ b/.env.example @@ -1,8 +1,7 @@ POSTGRES_URL=postgresql://root:root@localhost:5432/vitnode -NEXT_PUBLIC_BACKEND_URL=http://localhost:3000 -NEXT_PUBLIC_BACKEND_CLIENT_URL=http://localhost:3000 -NEXT_PUBLIC_FRONTEND_URL=http://localhost:3000 +NEXT_PUBLIC_API_URL=http://localhost:3000 +NEXT_PUBLIC_WEB_URL=http://localhost:3000 # === Docker Database Postgres === POSTGRES_USER=root diff --git a/apps/api/drizzle.config.ts b/apps/api/drizzle.config.ts new file mode 100644 index 000000000..0d630172b --- /dev/null +++ b/apps/api/drizzle.config.ts @@ -0,0 +1,12 @@ +import { defineVitNodeDrizzleConfig } from '@vitnode/core/drizzle.config'; + +import { POSTGRES_URL, vitNodeApiConfig } from './src/vitnode.api.config'; + +export default defineVitNodeDrizzleConfig({ + vitNodeApiConfig, + out: './migrations/', + dialect: 'postgresql', + dbCredentials: { + url: POSTGRES_URL, + }, +}); diff --git a/apps/api/eslint.config.mjs b/apps/api/eslint.config.mjs new file mode 100644 index 000000000..dd3efc12a --- /dev/null +++ b/apps/api/eslint.config.mjs @@ -0,0 +1,8 @@ +import eslintVitNode from '@vitnode/eslint-config/eslint'; + +export default [ + ...eslintVitNode, + { + ignores: ['drizzle.config.ts'], + }, +]; diff --git a/apps/api/package.json b/apps/api/package.json new file mode 100644 index 000000000..efcd03033 --- /dev/null +++ b/apps/api/package.json @@ -0,0 +1,42 @@ +{ + "name": "api", + "version": "1.2.0-canary.31", + "private": true, + "type": "module", + "scripts": { + "dev": "tsx watch src/index.ts", + "build": "tsc && tsc-alias -p tsconfig.json", + "start": "node dist/index.js", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "drizzle-kit": "drizzle-kit" + }, + "dependencies": { + "@hono/zod-openapi": "^0.19.8", + "@hono/zod-validator": "^0.7.0", + "@react-email/components": "^0.1.1", + "@vitnode/core": "workspace:*", + "drizzle-kit": "^0.31.3", + "drizzle-orm": "^0.44.2", + "hono": "^4.8.3", + "next-intl": "^4.3.1", + "react": "^19.1", + "react-dom": "^19.1", + "zod": "^3.25.67" + }, + "devDependencies": { + "@hono/node-server": "^1.15.0", + "@types/node": "^24", + "@types/react": "^19.1", + "@types/react-dom": "^19.1", + "@vitnode/eslint-config": "workspace:*", + "dotenv": "^17.1.0", + "eslint": "^9.29.0", + "prettier": "^3.6.1", + "prettier-plugin-tailwindcss": "^0.6.12", + "react-email": "^4.0.17", + "tsc-alias": "^1.8.16", + "tsx": "^4.20.3", + "typescript": "^5.8.3" + } +} diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts new file mode 100644 index 000000000..98369de4f --- /dev/null +++ b/apps/api/src/index.ts @@ -0,0 +1,29 @@ +import { serve } from '@hono/node-server'; +import { OpenAPIHono } from '@hono/zod-openapi'; +import { VitNodeAPI } from '@vitnode/core/api/config'; + +import { vitNodeApiConfig } from './vitnode.api.config.js'; +import { vitNodeConfig } from './vitnode.config.js'; + +const app = new OpenAPIHono().basePath('/api'); + +VitNodeAPI({ + app, + vitNodeApiConfig, + vitNodeConfig, +}); + +serve( + { + fetch: app.fetch, + port: 8080, + }, + info => { + const initMessage = '\x1b[34m[VitNode]\x1b[0m'; + + // eslint-disable-next-line no-console + console.log( + `${initMessage} API server is running on http://localhost:${info.port}`, + ); + }, +); diff --git a/apps/api/src/vitnode.api.config.ts b/apps/api/src/vitnode.api.config.ts new file mode 100644 index 000000000..5111961a1 --- /dev/null +++ b/apps/api/src/vitnode.api.config.ts @@ -0,0 +1,17 @@ +import { buildApiConfig } from '@vitnode/core/vitnode.config'; +import * as dotenv from 'dotenv'; +import { drizzle } from 'drizzle-orm/postgres-js'; + +dotenv.config(); + +export const POSTGRES_URL = + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + process.env.POSTGRES_URL || 'postgresql://root:root@localhost:5432/vitnode'; + +export const vitNodeApiConfig = buildApiConfig({ + plugins: [], + dbProvider: drizzle({ + connection: POSTGRES_URL, + casing: 'camelCase', + }), +}); diff --git a/apps/api/src/vitnode.config.ts b/apps/api/src/vitnode.config.ts new file mode 100644 index 000000000..4f20e8a11 --- /dev/null +++ b/apps/api/src/vitnode.config.ts @@ -0,0 +1,32 @@ +import { buildConfig, handleRequestConfig } from '@vitnode/core/vitnode.config'; +import { getRequestConfig } from 'next-intl/server'; + +export const vitNodeConfig = buildConfig({ + metadata: { + title: 'VitNode', + shortTitle: 'VitNode', + }, + plugins: [], + i18n: { + locales: [ + { + code: 'en', + name: 'English', + }, + ], + defaultLocale: 'en', + }, + theme: { + defaultTheme: 'light', + }, +}); + +// This is the request config for the app. It will be used in the app router. +export default getRequestConfig( + async ({ requestLocale }) => + await handleRequestConfig({ + requestLocale, + vitNodeConfig, + pathToMessages: async path => await import(`./locales/${path}`), + }), +); diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json new file mode 100644 index 000000000..9498a3d91 --- /dev/null +++ b/apps/api/tsconfig.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vitnode/eslint-config/tsconfig", + "compilerOptions": { + "target": "ESNext", + "module": "NodeNext", + "baseUrl": ".", + "outDir": "./dist", + "types": ["node"], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore index 55a12ae71..c3a96f073 100644 --- a/apps/docs/.gitignore +++ b/apps/docs/.gitignore @@ -1,5 +1,6 @@ # deps /node_modules +.turbo # generated content .contentlayer diff --git a/apps/docs/.prettierrc.mjs b/apps/docs/.prettierrc.mjs deleted file mode 100644 index 92fe83d4d..000000000 --- a/apps/docs/.prettierrc.mjs +++ /dev/null @@ -1,11 +0,0 @@ -import vitnodePrettier from '@vitnode/eslint-config/prettierrc'; - -/** - * @see https://prettier.io/docs/en/configuration.html - * @type {import("prettier").Config} - */ -const config = { - ...vitnodePrettier, -}; - -export default config; diff --git a/apps/docs/content/docs/dev/config/auth.mdx b/apps/docs/content/docs/dev/advanced/auth.mdx similarity index 100% rename from apps/docs/content/docs/dev/config/auth.mdx rename to apps/docs/content/docs/dev/advanced/auth.mdx diff --git a/apps/docs/content/docs/dev/config/meta.json b/apps/docs/content/docs/dev/advanced/meta.json similarity index 50% rename from apps/docs/content/docs/dev/config/meta.json rename to apps/docs/content/docs/dev/advanced/meta.json index bcf23fb73..baff7a786 100644 --- a/apps/docs/content/docs/dev/config/meta.json +++ b/apps/docs/content/docs/dev/advanced/meta.json @@ -1,4 +1,4 @@ { - "title": "Config", + "title": "Advanced", "pages": ["..."] } diff --git a/apps/docs/content/docs/dev/config/rate-limiter.mdx b/apps/docs/content/docs/dev/advanced/rate-limiter.mdx similarity index 100% rename from apps/docs/content/docs/dev/config/rate-limiter.mdx rename to apps/docs/content/docs/dev/advanced/rate-limiter.mdx diff --git a/apps/docs/content/docs/guides/captcha/cloudflare.mdx b/apps/docs/content/docs/dev/captcha/cloudflare.mdx similarity index 100% rename from apps/docs/content/docs/guides/captcha/cloudflare.mdx rename to apps/docs/content/docs/dev/captcha/cloudflare.mdx diff --git a/apps/docs/content/docs/guides/captcha/cloudflare.png b/apps/docs/content/docs/dev/captcha/cloudflare.png similarity index 100% rename from apps/docs/content/docs/guides/captcha/cloudflare.png rename to apps/docs/content/docs/dev/captcha/cloudflare.png diff --git a/apps/docs/content/docs/dev/captcha/meta.json b/apps/docs/content/docs/dev/captcha/meta.json new file mode 100644 index 000000000..0c7e112e0 --- /dev/null +++ b/apps/docs/content/docs/dev/captcha/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Captcha", + "pages": ["overview", "---Adapters---", "..."] +} diff --git a/apps/docs/content/docs/dev/captcha.mdx b/apps/docs/content/docs/dev/captcha/overview.mdx similarity index 99% rename from apps/docs/content/docs/dev/captcha.mdx rename to apps/docs/content/docs/dev/captcha/overview.mdx index c6fd6ed0b..5d17778e0 100644 --- a/apps/docs/content/docs/dev/captcha.mdx +++ b/apps/docs/content/docs/dev/captcha/overview.mdx @@ -1,5 +1,5 @@ --- -title: Captcha +title: Overview description: Protect your forms and API call with captcha validation. --- diff --git a/apps/docs/content/docs/guides/captcha/recaptcha.mdx b/apps/docs/content/docs/dev/captcha/recaptcha.mdx similarity index 100% rename from apps/docs/content/docs/guides/captcha/recaptcha.mdx rename to apps/docs/content/docs/dev/captcha/recaptcha.mdx diff --git a/apps/docs/content/docs/guides/captcha/recaptcha.png b/apps/docs/content/docs/dev/captcha/recaptcha.png similarity index 100% rename from apps/docs/content/docs/guides/captcha/recaptcha.png rename to apps/docs/content/docs/dev/captcha/recaptcha.png diff --git a/apps/docs/content/docs/dev/debugging.mdx b/apps/docs/content/docs/dev/debugging/index.mdx similarity index 100% rename from apps/docs/content/docs/dev/debugging.mdx rename to apps/docs/content/docs/dev/debugging/index.mdx diff --git a/apps/docs/content/docs/dev/logging.mdx b/apps/docs/content/docs/dev/debugging/logging.mdx similarity index 74% rename from apps/docs/content/docs/dev/logging.mdx rename to apps/docs/content/docs/dev/debugging/logging.mdx index 93885237a..367972152 100644 --- a/apps/docs/content/docs/dev/logging.mdx +++ b/apps/docs/content/docs/dev/debugging/logging.mdx @@ -17,8 +17,8 @@ import { buildRoute } from '@vitnode/core/api/lib/route'; export const testRoute = buildRoute( {}, { - handler: c => { - c.get('log').warn('This is a test warn log'); // [!code ++] + handler: async c => { + await c.get('log').warn('This is a test warn log'); // [!code ++] return c.text('test'); }, @@ -33,15 +33,15 @@ import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; ```ts tab="Debug" -c.get('log').debug('This is a test debug log'); +await c.get('log').debug('This is a test debug log'); ``` ```ts tab="Warn" -c.get('log').warn('This is a test warning log'); +await c.get('log').warn('This is a test warning log'); ``` ```ts tab="Error" -c.get('log').error('This is a test error log'); +await c.get('log').error('This is a test error log'); ``` diff --git a/apps/docs/content/docs/dev/deployments/cloud/vercel.mdx b/apps/docs/content/docs/dev/deployments/cloud/vercel.mdx index 750605896..a2015a5ea 100644 --- a/apps/docs/content/docs/dev/deployments/cloud/vercel.mdx +++ b/apps/docs/content/docs/dev/deployments/cloud/vercel.mdx @@ -7,6 +7,13 @@ description: How to deploy your Vitnode app on Vercel. We're working hard to bring you the best documentation experience. +## Limitations + +Some features of Vitnode are not supported on Vercel due to its serverless architecture. These include: + +- Self-hosted static files +- WebSockets + ## Requirements - A Vercel account diff --git a/apps/docs/content/docs/dev/email/meta.json b/apps/docs/content/docs/dev/email/meta.json new file mode 100644 index 000000000..a0fbd5951 --- /dev/null +++ b/apps/docs/content/docs/dev/email/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Email", + "pages": ["overview", "templates", "---Adapters---", "..."] +} diff --git a/apps/docs/content/docs/dev/email/overview.mdx b/apps/docs/content/docs/dev/email/overview.mdx new file mode 100644 index 000000000..f4efc4db6 --- /dev/null +++ b/apps/docs/content/docs/dev/email/overview.mdx @@ -0,0 +1,117 @@ +--- +title: Overview +description: How to use email functionality in your application. +--- + +## Adapters + +Before you can use email functionality, you need to provide an adapter to your application. + + + + + + +or create your own custom email adapter... + +## Usage + +To send an email, you can use the context `c.get('email').send()` in your route handler. + +```ts +import { z } from 'zod'; +import { buildRoute } from '@vitnode/core/api/lib/route'; + +export const testRoute = buildRoute({ + handler: async c => { + // [!code ++:5] + await c.get('email').send({ + to: 'test@test.com', + subject: 'Test Email', + content: 'This is a test email.', + }); + + return c.text('test'); + }, +}); +``` + +## Custom Email Adapter + +Want to create your own email adapter? You can do it by implementing the `EmailApiPlugin` interface. This allows you to define how emails are sent in your application. + + + +### Create adapter + +Here is your template for a custom email adapter. + +```ts title="src/utils/email/mailer.ts" +import type { EmailApiPlugin } from '@vitnode/core/api/models/email'; + +export const MailerEmailAdapter = (): EmailApiPlugin => {}; +``` + + + + +### Add config + +If you want to provide config for you adapter, you can do it like this: + +```ts title="src/utils/email/mailer.ts" +import type { EmailApiPlugin } from '@vitnode/core/api/models/email'; + +export const MailerEmailAdapter = ({ + // [!code ++:13] + host = '', + port = 587, + secure = false, + user = '', + password = '', + from = '', +}: { + from: string | undefined; + host: string | undefined; + password: string | undefined; + port?: number; + secure?: boolean; + user: string | undefined; +}): EmailApiPlugin => {}; +``` + + + + + +### Add `sendEmail()` method + +Implement the `sendEmail()` method to send emails using your custom logic. You can use any email sending library or service. + +```ts title="src/utils/email/mailer.ts" +import type { EmailApiPlugin } from '@vitnode/core/api/models/email'; + +export const MailerEmailAdapter = ({ + host = '', + port = 587, + secure = false, + user = '', + password = '', + from = '', +}: { + from: string | undefined; + host: string | undefined; + password: string | undefined; + port?: number; + secure?: boolean; + user: string | undefined; +}): EmailApiPlugin => { + // [!code ++:3] + return { + sendEmail: async ({ metadata, to, subject, html, replyTo, text }) => {}, + }; +}; +``` + + + diff --git a/apps/docs/content/docs/dev/email/provider.mdx b/apps/docs/content/docs/dev/email/provider.mdx deleted file mode 100644 index bb8308ad2..000000000 --- a/apps/docs/content/docs/dev/email/provider.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Email Provider -description: xddd ---- - -## Custom Email Provider - - - - ### Create plugin function - -test - - - diff --git a/apps/docs/content/docs/dev/email/resend.mdx b/apps/docs/content/docs/dev/email/resend.mdx new file mode 100644 index 000000000..2355f7c04 --- /dev/null +++ b/apps/docs/content/docs/dev/email/resend.mdx @@ -0,0 +1,8 @@ +--- +title: Resend +description: How to use Resend for sending emails in your application. +--- + + + We're working hard to bring you the best documentation experience. + diff --git a/apps/docs/content/docs/dev/email/smtp.mdx b/apps/docs/content/docs/dev/email/smtp.mdx new file mode 100644 index 000000000..a1386ec4a --- /dev/null +++ b/apps/docs/content/docs/dev/email/smtp.mdx @@ -0,0 +1,13 @@ +--- +title: SMTP +description: SMTP configuration for sending emails +--- + + + This documentation is for self-hosted VitNode instances only. You cannot use + this if you are planning to deploy your application to the cloud. + + + + We're working hard to bring you the best documentation experience. + diff --git a/apps/docs/content/docs/dev/email/templates.mdx b/apps/docs/content/docs/dev/email/templates.mdx new file mode 100644 index 000000000..b2cc0a2c1 --- /dev/null +++ b/apps/docs/content/docs/dev/email/templates.mdx @@ -0,0 +1,24 @@ +--- +title: Templates +description: Template for email messages +--- + + + We're working hard to bring you the best documentation experience. + + +VitNode uses [React Email](https://react.email/) to create email templates. This allows us to create responsive and customizable email templates that can be used in various applications with React components. + + + The current `TailwindCSS` version used for this component is **3.4.10** + + +## Components + + + + diff --git a/apps/docs/content/docs/dev/meta.json b/apps/docs/content/docs/dev/meta.json index f60c036b0..f771cd0dc 100644 --- a/apps/docs/content/docs/dev/meta.json +++ b/apps/docs/content/docs/dev/meta.json @@ -9,20 +9,20 @@ "debugging", "swagger", "deployments", - "---Plugins---", + "---Framework---", "plugins", "rest-api", "fetcher", "database", + "---Integrations---", + "sso", + "captcha", + "email", "---UI---", "layouts-and-pages", "admin-page", "i18n", - "---Framework---", - "config", - "logging", - "captcha", - "---Advanced---", + "advanced", "..." ] } diff --git a/apps/docs/content/docs/ui/not-found.mdx b/apps/docs/content/docs/dev/not-found.mdx similarity index 100% rename from apps/docs/content/docs/ui/not-found.mdx rename to apps/docs/content/docs/dev/not-found.mdx diff --git a/apps/docs/content/docs/guides/sso/discord.mdx b/apps/docs/content/docs/dev/sso/discord.mdx similarity index 100% rename from apps/docs/content/docs/guides/sso/discord.mdx rename to apps/docs/content/docs/dev/sso/discord.mdx diff --git a/apps/docs/content/docs/guides/sso/facebook.mdx b/apps/docs/content/docs/dev/sso/facebook.mdx similarity index 100% rename from apps/docs/content/docs/guides/sso/facebook.mdx rename to apps/docs/content/docs/dev/sso/facebook.mdx diff --git a/apps/docs/content/docs/guides/sso/facebook/1.png b/apps/docs/content/docs/dev/sso/facebook/1.png similarity index 100% rename from apps/docs/content/docs/guides/sso/facebook/1.png rename to apps/docs/content/docs/dev/sso/facebook/1.png diff --git a/apps/docs/content/docs/guides/sso/facebook/2.png b/apps/docs/content/docs/dev/sso/facebook/2.png similarity index 100% rename from apps/docs/content/docs/guides/sso/facebook/2.png rename to apps/docs/content/docs/dev/sso/facebook/2.png diff --git a/apps/docs/content/docs/guides/sso/facebook/3.png b/apps/docs/content/docs/dev/sso/facebook/3.png similarity index 100% rename from apps/docs/content/docs/guides/sso/facebook/3.png rename to apps/docs/content/docs/dev/sso/facebook/3.png diff --git a/apps/docs/content/docs/guides/sso/google.mdx b/apps/docs/content/docs/dev/sso/google.mdx similarity index 100% rename from apps/docs/content/docs/guides/sso/google.mdx rename to apps/docs/content/docs/dev/sso/google.mdx diff --git a/apps/docs/content/docs/dev/sso/meta.json b/apps/docs/content/docs/dev/sso/meta.json new file mode 100644 index 000000000..1e680cafb --- /dev/null +++ b/apps/docs/content/docs/dev/sso/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Single Sign-On (SSO)", + "pages": ["overview", "---Adapters---", "..."] +} diff --git a/apps/docs/content/docs/dev/sso.mdx b/apps/docs/content/docs/dev/sso/overview.mdx similarity index 90% rename from apps/docs/content/docs/dev/sso.mdx rename to apps/docs/content/docs/dev/sso/overview.mdx index 20827effb..5472a5bc7 100644 --- a/apps/docs/content/docs/dev/sso.mdx +++ b/apps/docs/content/docs/dev/sso/overview.mdx @@ -1,11 +1,31 @@ --- -title: Single Sign-On (SSO) -description: Learn how to implement custom Single Sign-On providers in VitNode +title: Overview +description: Single Sign-On (SSO) simplifies the user experience by allowing access to multiple systems with a single authentication process. --- -## Getting Started +## How it works -Want to let your users sign in with their favorite services? Let's build a custom SSO provider! We'll use Discord as an example, but you can adapt this guide for any OAuth2 provider. +1. The user clicks on the SSO button. +2. The user is redirected to the SSO provider's login page. +3. The user logs in. +4. The user is redirected back to your application with a token. +5. Your application verifies the token and logs in the user. + +## Adapters + +Before you can use SSO, you need to provide an adapter to your application. + + + + + + + +or create your own custom SSO adapter... + +## Custom SSO Adapter + +Want to let your users sign in with their favorite services? Let's build a custom SSO adapter! We'll use Discord as an example, but you can adapt this guide for any OAuth2 provider. import { Callout } from 'fumadocs-ui/components/callout'; diff --git a/apps/docs/content/docs/dev/test.mdx b/apps/docs/content/docs/dev/test.mdx deleted file mode 100644 index 0dda89418..000000000 --- a/apps/docs/content/docs/dev/test.mdx +++ /dev/null @@ -1,421 +0,0 @@ ---- -title: Fields -description: How to use built-in input and WYSIWYG with i18n support in backend. ---- - -As an example, we will create a translation field for the `title (input)` and `content (WYSIWYG)` fields in the `core_terms` table. - -## Database - -You need to create a new table in the database schema. - -```ts title="backend/plugins/{your_plugin}/admin/database/schema/terms.ts" -import { pgTable, serial, timestamp, varchar } from 'drizzle-orm/pg-core'; - -export const core_terms = pgTable('core_terms', { - id: serial('id').primaryKey(), - code: varchar('code').notNull().unique(), - created: timestamp('created').notNull().defaultNow(), - updated: timestamp('updated').notNull().defaultNow(), - href: varchar('href'), -}); -``` - -You can find more information about the database schema in the [documentation](/docs/dev/database/schema). - -As you can see in the example above, we haven't added the translation fields yet. We will add them in `service` later using `core_languages_words` table. - -## Show Translation - - - - -### DTO Object - -For the translation fields to show data, you need to use `StringLanguage[]` type in the DTO for the object. - -```ts title="shared/plugins/{your_plugin}/legal.dto.ts" -import { ApiProperty } from '@nestjs/swagger'; - -import { StringLanguage } from 'vitnode-shared/string-language.dto'; // [!code ++] -import { PaginationObj } from 'vitnode-shared/utils/pagination.dto'; - -export class Legal { - @ApiProperty({ type: [StringLanguage] }) // [!code ++] - content: StringLanguage[]; // [!code ++] - - @ApiProperty({ type: [StringLanguage] }) // [!code ++] - title: StringLanguage[]; // [!code ++] -} - -export class LegalsObj extends PaginationObj { - @ApiProperty({ type: [Legal] }) - edges: Legal[]; -} -``` - -### DTO for multipart/form-data - -If you are using `multipart/form-data` all fields will be `string` type. You need to transform them to `StringLanguage[]` type in the service. - -```ts title="shared/plugins/{your_plugin}/legal.dto.ts" -export class Legal { - @ApiProperty({ type: [StringLanguage] }) - // [!code ++] - @Transform(({ value }: { value: string }) => { - // [!code ++] - const current = JSON.parse(value); - // [!code ++] - - // [!code ++] - return Array.isArray(current) ? current : [current]; - // [!code ++] - }) - title: StringLanguage[]; -} -``` - - - - -### Service - -`core_languages_words` table doesn't have relation so you need to use `StringLanguageHelper` service with `show()` to get translations. - -In return service we will filter translation by `item_id` and `variable` to get the correct translation for the `title` and `content` fields. - -```ts title="backend/plugins/{your_plugin}/terms/show/show.service.ts" -import { core_legal } from '@/database/schema/legal'; -import { StringLanguageHelper } from 'vitnode-backend/helpers/string_language/helpers.service'; // [!code ++] -import { DatabaseService } from '@/database/database.service'; -import { Injectable } from '@nestjs/common'; -import { LegalsObj, LegalsQuery } from 'shared/legal.dto'; -import { SortDirectionEnum } from 'vitnode-shared/utils/pagination.enum'; - -@Injectable() -export class ShowLegalService { - constructor( - private readonly databaseService: DatabaseService, - private readonly stringLanguageHelper: StringLanguageHelper, // [!code ++] - ) {} - - async show({ cursor, first, last }: LegalsQuery): Promise { - const pagination = await this.databaseService.paginationCursor({ - cursor, - database: core_legal, - first, - last, - defaultSortBy: { - direction: SortDirectionEnum.desc, - column: 'updated_at', - }, - query: async args => - await this.databaseService.db.query.core_legal.findMany({ - ...args, - }), - }); - - const ids = pagination.edges.map(edge => edge.id); // [!code ++] - // [!code ++] - const i18n = await this.stringLanguageHelper.get({ - // [!code ++] - item_ids: ids, - // [!code ++] - database: core_legal, - // [!code ++] - plugin_code: 'core', - // [!code ++] - variables: ['title', 'content'], - // [!code ++] - }); - - const edges = pagination.edges.map(edge => { - const currentI18n = i18n.filter(item => item.item_id === edge.id); - - return { - ...edge, - // [!code ++] - title: currentI18n - // [!code ++] - .filter(value => value.variable === 'title') - // [!code ++] - .map(value => ({ - // [!code ++] - value: value.value, - // [!code ++] - language_code: value.language_code, - // [!code ++] - })), - // [!code ++] - content: currentI18n - // [!code ++] - .filter(value => value.variable === 'content') - // [!code ++] - .map(value => ({ - // [!code ++] - value: value.value, - // [!code ++] - language_code: value.language_code, - // [!code ++] - })), - }; - }); - - return { ...pagination, edges }; - } -} -``` - -### API Reference - -import { TypeTable } from 'fumadocs-ui/components/type-table'; - - - - - - - -## Create / Edit Translation - - - - -### DTO Input - -For the translation fields to work in the input, you need to use `StringLanguage` type in the DTO for the input and `class-validator` decorators. - -```ts title="shared/plugins/{your_plugin}/admin/legal.dto.ts" -import { ApiProperty } from '@nestjs/swagger'; -import { ArrayMinSize, IsArray } from 'class-validator'; -import { StringLanguage } from 'vitnode-shared/string-language.dto'; - -export class CreateLegalSettingsAdminBody { - @ApiProperty({ type: [StringLanguage] }) - @ArrayMinSize(1) - @IsArray() - content: StringLanguage[]; - - @ApiProperty({ type: [StringLanguage] }) - @ArrayMinSize(1) - @IsArray() - title: StringLanguage[]; -} -``` - -To required translation fields you can use `@ArrayMinSize(1)` decorator. - - - - - -### Service - -To create or edit translation fields you need to use `StringLanguageHelper` service with `parse()` method. - -As an example, we will create a translation field for the `title` and `content` fields in the `core_terms` table. - -```ts title="backend/plugins/{your_plugin}/terms/create/create.service.ts" -import { core_legal } from '@/database/schema/legal'; -import { removeSpecialCharacters } from 'vitnode-backend/functions'; -import { StringLanguageHelper } from 'vitnode-backend/helpers/string_language/helpers.service'; // [!code ++] -import { DatabaseService } from '@/database/database.service'; -import { ConflictException, Injectable } from '@nestjs/common'; -import { CreateLegalSettingsAdminBody } from 'shared/admin/settings/legal.dto'; -import { Legal } from 'shared/legal.dto'; - -@Injectable() -export class CreateLegalSettingsAdminService { - constructor( - private readonly databaseService: DatabaseService, - private readonly stringLanguageHelper: StringLanguageHelper, // [!code ++] - ) {} - - async create({ - title, - content, - href, - code, - }: CreateLegalSettingsAdminBody): Promise { - const termExist = await this.databaseService.db.query.core_legal.findFirst({ - where: (table, { eq }) => eq(table.code, code), - }); - - if (termExist) { - throw new ConflictException('LEGAL_ALREADY_EXISTS'); - } - - const [term] = await this.databaseService.db - .insert(core_legal) - .values({ href, code: removeSpecialCharacters(code) }) - .returning(); - - // [!code ++] - const titleTerm = await this.stringLanguageHelper.parse({ - // [!code ++] - item_id: term.id, - // [!code ++] - plugin_code: 'core', - // [!code ++] - database: core_legal, - // [!code ++] - data: title, - // [!code ++] - variable: 'title', - // [!code ++] - }); - - // [!code ++] - const contentTerm = await this.stringLanguageHelper.parse({ - // [!code ++] - item_id: term.id, - // [!code ++] - plugin_code: 'core', - // [!code ++] - database: core_legal, - // [!code ++] - data: content, - // [!code ++] - variable: 'content', - // [!code ++] - }); - - return { - ...term, - title: titleTerm, - content: contentTerm, - }; - } -} -``` - -This method will create a translation inside `core_languages_words` table and processing content to send notifications, attachments, etc. - -### API Reference - - - - - - - -## Delete Service - -As we mention before, when you create or edit translation fields then our `parser()` method will processing content. To delete translations and other things related to it you need to use `delete()` method. - -```ts title="backend/plugins/{your_plugin}/terms/delete/delete.service.ts" -import { core_legal } from '@/database/schema/legal'; -import { StringLanguageHelper } from 'vitnode-backend/helpers/string_language/helpers.service'; // [!code ++] -import { DatabaseService } from '@/database/database.service'; -import { Injectable, NotFoundException } from '@nestjs/common'; -import { eq } from 'drizzle-orm'; - -@Injectable() -export class DeleteLegalSettingsAdminService { - constructor( - private readonly databaseService: DatabaseService, - private readonly stringLanguageHelper: StringLanguageHelper, // [!code ++] - ) {} - - async delete(code: string): Promise { - const term = await this.databaseService.db.query.core_legal.findFirst({ - where: (table, { eq }) => eq(table.code, code), - columns: { - id: true, - }, - }); - - if (!term) { - throw new NotFoundException(); - } - - // [!code ++] - await this.stringLanguageHelper.delete({ - // [!code ++] - database: core_legal, - // [!code ++] - item_id: term.id, - // [!code ++] - plugin_code: 'core', - // [!code ++] - }); - - await this.databaseService.db - .delete(core_legal) - .where(eq(core_legal.id, term.id)); - } -} -``` - - - This is important to delete translation. Otherwise, translations will be still - in the database. - - -### API Reference - - - - - - diff --git a/apps/docs/content/docs/guides/captcha/index.mdx b/apps/docs/content/docs/guides/captcha/index.mdx deleted file mode 100644 index b377a228f..000000000 --- a/apps/docs/content/docs/guides/captcha/index.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Captcha -description: Protecting your application from spam, abuse, and bot attacks is an essential feature ---- - -Captcha is a security feature that protects your application from spam, abuse, and bot attacks. It's a simple test that only humans can pass, ensuring that the user is a real person and not a bot. - -## Supported Captcha providers - -VitNode provides a build-in way to integrate Captcha in your application for: - - - - - - -Choose one of the providers and follow the guide to integrate it into your application. diff --git a/apps/docs/content/docs/guides/index.mdx b/apps/docs/content/docs/guides/index.mdx index b8bfa5001..cf7165b27 100644 --- a/apps/docs/content/docs/guides/index.mdx +++ b/apps/docs/content/docs/guides/index.mdx @@ -6,4 +6,6 @@ icon: PackageOpen VitNode is designed to simplify app management and development—even for users without technical expertise. This guide provides an overview of the framework and its features, so you can get started quickly. -We're still working on the documentation :> + + We're working hard to bring you the best documentation experience. + diff --git a/apps/docs/content/docs/guides/meta.json b/apps/docs/content/docs/guides/meta.json index 3e8466f9a..8ae742dee 100644 --- a/apps/docs/content/docs/guides/meta.json +++ b/apps/docs/content/docs/guides/meta.json @@ -3,14 +3,5 @@ "description": "Learn how to use VitNode", "icon": "BookOpenText", "root": true, - "pages": [ - "index", - "...", - "---Plugins by VitNode---", - "blog", - "--- Authorization ---", - "sso", - "--- Security ---", - "captcha" - ] + "pages": ["index", "...", "---Plugins by VitNode---", "blog"] } diff --git a/apps/docs/content/docs/guides/sso/index.mdx b/apps/docs/content/docs/guides/sso/index.mdx deleted file mode 100644 index f8d528e00..000000000 --- a/apps/docs/content/docs/guides/sso/index.mdx +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Single Sign-On (SSO) -description: Integrate Single Sign-On (SSO) effortlessly into your application. ---- - -Single Sign-On simplifies the user experience by allowing access to multiple systems with a single authentication process. It also improves security by reducing the number of passwords a user needs to remember. - -## Supported SSO providers - -VitNode provides a build-in way to integrate Single Sign-On (SSO) in your application for: - -- [Google](/docs/guides/sso/google) -- [Facebook](/docs/guides/sso/facebook) -- [Custom SSO](/docs/dev/sso) - -Choose one of the providers and follow the guide to integrate it into your application. - -## How it works - -1. The user clicks on the SSO button. -2. The user is redirected to the SSO provider's login page. -3. The user logs in. -4. The user is redirected back to your application with a token. -5. Your application verifies the token and logs in the user. - -## Custom SSO - -If your application isn't on the list, you can create a custom SSO provider by following the [Custom SSO for Dev](/docs/dev/sso) guide. diff --git a/apps/docs/content/docs/ui/badge.mdx b/apps/docs/content/docs/ui/badge.mdx index 2ed0432a5..93d864f14 100644 --- a/apps/docs/content/docs/ui/badge.mdx +++ b/apps/docs/content/docs/ui/badge.mdx @@ -3,6 +3,33 @@ title: Badge description: Display small labels or indicators. --- - - We're working hard to bring you the best documentation experience. - +## Preview + + + +## Usage + +```ts +import { Home } from 'lucide-react'; +import { Badge } from '@vitnode/core/components/ui/badge'; +``` + +```tsx + + Default + +``` + +## Props + +import { TypeTable } from 'fumadocs-ui/components/type-table'; + + diff --git a/apps/docs/package.json b/apps/docs/package.json index d8fdbad3d..c90a6aa74 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -7,7 +7,7 @@ "db:push": "vitnode push", "db:migrate": "vitnode migrate", "dev": "vitnode init && next dev --turbopack", - "dev:email": "email dev", + "dev:email": "email dev --dir src/emails", "build": "next build --turbopack", "start": "next start", "lint": "eslint .", @@ -20,44 +20,43 @@ "drizzle-kit": "drizzle-kit" }, "dependencies": { - "@hono/zod-openapi": "^0.19.8", + "@hono/zod-openapi": "^0.19.9", "@hono/zod-validator": "^0.7.0", "@vitnode/blog": "workspace:*", "@vitnode/core": "workspace:*", "babel-plugin-react-compiler": "19.1.0-rc.2", - "drizzle-kit": "^0.31.3", + "drizzle-kit": "^0.31.4", "drizzle-orm": "^0.44.2", - "fumadocs-core": "^15.6.0", + "fumadocs-core": "^15.6.1", "fumadocs-mdx": "^11.6.10", - "fumadocs-ui": "^15.6.0", - "hono": "^4.8.3", - "lucide-react": "^0.517.0", - "motion": "^12.20.1", - "next": "^15.3.4", - "next-intl": "^4.3.1", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-hook-form": "^7.58.1", + "fumadocs-ui": "^15.6.1", + "hono": "^4.8.4", + "lucide-react": "^0.525.0", + "motion": "^12.23.0", + "next": "^15.3.5", + "next-intl": "^4.3.4", + "react": "^19.1", + "react-dom": "^19.1", + "react-hook-form": "^7.60.0", "react-use": "^17.6.0", - "sonner": "^2.0.5", - "zod": "^3.25.67" + "sonner": "^2.0.6" }, "devDependencies": { - "@playwright/test": "^1.53.1", + "@playwright/test": "^1.53.2", "@tailwindcss/postcss": "^4.1.11", "@types/mdx": "^2.0.13", - "@types/node": "^24.0.7", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", + "@types/node": "^24.0.10", + "@types/react": "^19.1", + "@types/react-dom": "^19.1", "@vitnode/eslint-config": "workspace:*", "class-variance-authority": "^0.7.1", - "dotenv": "^16.6.0", - "eslint": "^9.29.0", + "eslint": "^9.30.1", "postcss": "^8.5.6", "react-email": "^4.0.17", "shiki": "^3.7.0", "tailwindcss": "^4.1.11", - "tw-animate-css": "^1.3.4", - "typescript": "^5.8.3" + "tw-animate-css": "^1.3.5", + "typescript": "^5.8.3", + "zod": "^3.25.74" } } diff --git a/apps/docs/src/app/[locale]/(docs)/docs/[[...slug]]/page.tsx b/apps/docs/src/app/[locale]/(docs)/docs/[[...slug]]/page.tsx index 5481745c5..627049e0e 100644 --- a/apps/docs/src/app/[locale]/(docs)/docs/[[...slug]]/page.tsx +++ b/apps/docs/src/app/[locale]/(docs)/docs/[[...slug]]/page.tsx @@ -1,4 +1,5 @@ import { redirect } from '@vitnode/core/lib/navigation'; +import { getBreadcrumbItems } from 'fumadocs-core/breadcrumb'; import { Step, Steps } from 'fumadocs-ui/components/steps'; import defaultMdxComponents from 'fumadocs-ui/mdx'; import { DocsBody, DocsPage } from 'fumadocs-ui/page'; @@ -35,7 +36,7 @@ export default async function Page(props: {

{page.data.description}

-
+
item.name as string); + return { - title: page.data.title, + title: `${page.data.title}${lastItemsBreadcrumb.length > 0 ? ` - ${lastItemsBreadcrumb.join(' - ')}` : ''}`, description: page.data.description, }; } diff --git a/apps/docs/src/app/[locale]/(docs)/docs/layout.tsx b/apps/docs/src/app/[locale]/(docs)/docs/layout.tsx index 8382dba9e..49a1f3fe9 100644 --- a/apps/docs/src/app/[locale]/(docs)/docs/layout.tsx +++ b/apps/docs/src/app/[locale]/(docs)/docs/layout.tsx @@ -22,7 +22,7 @@ export default function Layout({ children }: { children: ReactNode }) { ...option, icon: (
; +} diff --git a/apps/docs/src/app/[locale]/(main)/(home)/page.tsx b/apps/docs/src/app/[locale]/(main)/(home)/page.tsx index 5db941d06..514e6afb9 100644 --- a/apps/docs/src/app/[locale]/(main)/(home)/page.tsx +++ b/apps/docs/src/app/[locale]/(main)/(home)/page.tsx @@ -21,19 +21,19 @@ export default function HomePage() {
🎉{` `} VitNode 2.0 in progress... {/* */} -

+

Extendable Framework for Building Apps

-

+

Simplifies development with a powerful Plugin System, Admin Control Panel and extensible architecture.

diff --git a/apps/docs/src/app/[locale]/(main)/(home)/sections/admin/admin.tsx b/apps/docs/src/app/[locale]/(main)/(home)/sections/admin/admin.tsx index 34eb36d6b..9dfc71db9 100644 --- a/apps/docs/src/app/[locale]/(main)/(home)/sections/admin/admin.tsx +++ b/apps/docs/src/app/[locale]/(main)/(home)/sections/admin/admin.tsx @@ -13,8 +13,8 @@ export const AdminSection = () => {
-
-
+
+
payments illustration dark { return (
-

+

Start Building

-

+

Everything you need for modern web apps, zero config.

diff --git a/apps/docs/src/app/[locale]/(main)/(home)/sections/powering-by/logos/tailwindcss.tsx b/apps/docs/src/app/[locale]/(main)/(home)/sections/powering-by/logos/tailwindcss.tsx index 82cd065f9..0dee1a73b 100644 --- a/apps/docs/src/app/[locale]/(main)/(home)/sections/powering-by/logos/tailwindcss.tsx +++ b/apps/docs/src/app/[locale]/(main)/(home)/sections/powering-by/logos/tailwindcss.tsx @@ -2,7 +2,7 @@ export const TailwindCSSLogo = () => { return ( { -
-
+
+
diff --git a/apps/docs/src/app/[locale]/layout.tsx b/apps/docs/src/app/[locale]/layout.tsx index 15df66531..3c206b9e5 100644 --- a/apps/docs/src/app/[locale]/layout.tsx +++ b/apps/docs/src/app/[locale]/layout.tsx @@ -10,6 +10,7 @@ import { Geist, Geist_Mono } from 'next/font/google'; import { vitNodeConfig } from '@/vitnode.config'; +import SearchDialogFumadocs from '../../components/fumadocs/search-dialog'; import { Body } from './(main)/layout.client'; const geistSans = Geist({ @@ -36,7 +37,11 @@ export default async function LocaleLayout(props: RootLayoutProps) { - + diff --git a/apps/docs/src/app/global.css b/apps/docs/src/app/global.css index c581357c2..03971e78e 100644 --- a/apps/docs/src/app/global.css +++ b/apps/docs/src/app/global.css @@ -9,38 +9,38 @@ @source "../../node_modules/@vitnode/core/dist/src/views"; :root:not(.dark) { - --background: oklch(0.98 0 0); - --foreground: oklch(0.145 0 0); + --background: oklch(0.96 0.01 250); + --foreground: oklch(0.18 0.01 250); --card: oklch(1 0 0); - --card-foreground: oklch(0.145 0 0); + --card-foreground: oklch(0.22 0.01 250); --popover: oklch(1 0 0); - --popover-foreground: oklch(0.145 0 0); + --popover-foreground: oklch(0.22 0.01 250); --primary: oklch(0.51 0.16 262.61); --primary-foreground: oklch(0.985 0 0); - --secondary: oklch(0.96 0 0); - --secondary-foreground: oklch(0.205 0 0); - --muted: oklch(0.97 0 0); - --muted-foreground: oklch(0.45 0 0); - --accent: oklch(0.95 0 0); - --accent-foreground: oklch(0.205 0 0); + --secondary: oklch(0.93 0.01 250); + --secondary-foreground: oklch(0.25 0.01 250); + --muted: oklch(0.95 0.01 250); + --muted-foreground: oklch(0.35 0.01 250); + --accent: oklch(0.92 0.01 250); + --accent-foreground: oklch(0.25 0.01 250); --destructive: oklch(0.6 0.2 24.45); --warn: oklch(0.54 0.12 82.58); - --border: oklch(0.9 0 0); - --input: oklch(0.9 0 0); - --ring: oklch(0.7 0.16 262.61); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); + --border: oklch(0.9 0.01 250); + --input: oklch(0.9 0.01 250); + --ring: oklch(0.7 0.13 250); + --chart-1: oklch(0.65 0.13 250); + --chart-2: oklch(0.6 0.11 260); + --chart-3: oklch(0.45 0.09 250); + --chart-4: oklch(0.8 0.13 250); + --chart-5: oklch(0.75 0.13 250); --sidebar: var(--card); - --sidebar-foreground: oklch(0.145 0 0); + --sidebar-foreground: oklch(0.22 0.01 250); --sidebar-primary: var(--primary); --sidebar-primary-foreground: var(--primary-foreground); - --sidebar-accent: oklch(0.975 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.902 0 0); - --sidebar-ring: oklch(0.708 0 0); + --sidebar-accent: oklch(0.97 0.01 250); + --sidebar-accent-foreground: oklch(0.25 0.01 250); + --sidebar-border: oklch(0.91 0.01 250); + --sidebar-ring: oklch(0.7 0.13 250); --dev-color: oklch(0.6 0.18 50); --ui-color: oklch(0.65 0.18 170); @@ -48,37 +48,37 @@ } .dark { - --background: oklch(0.1 0 0); - --foreground: oklch(0.98 0 0); - --card: oklch(0.18 0 0); - --card-foreground: oklch(0.98 0 0); - --popover: oklch(0.18 0 0); - --popover-foreground: oklch(0.98 0 0); + --background: oklch(0.16 0.01 250); + --foreground: oklch(0.96 0.01 250); + --card: oklch(0.18 0.01 250); + --card-foreground: oklch(0.96 0.01 250); + --popover: oklch(0.18 0.01 250); + --popover-foreground: oklch(0.96 0.01 250); --primary: oklch(0.51 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); - --muted-foreground: oklch(0.7 0 0); - --accent: oklch(0.28 0 0); + --secondary: oklch(0.22 0.01 250); + --secondary-foreground: oklch(0.96 0.01 250); + --muted: oklch(0.22 0.01 250); + --muted-foreground: oklch(0.7 0.01 250); + --accent: oklch(0.28 0.01 250); --destructive: oklch(0.62 0.2 25.35); --warn: oklch(0.76 0.18 81.84); - --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); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); + --border: oklch(0.26 0.01 250); + --input: oklch(0.26 0.01 250); + --ring: oklch(0.54 0.13 250); + --chart-1: oklch(0.45 0.09 250); + --chart-2: oklch(0.6 0.11 260); + --chart-3: oklch(0.75 0.13 250); + --chart-4: oklch(0.8 0.13 250); + --chart-5: oklch(0.65 0.13 250); --sidebar: var(--card); - --sidebar-foreground: oklch(0.98 0 0); + --sidebar-foreground: oklch(0.96 0.01 250); --sidebar-primary: var(--primary); --sidebar-primary-foreground: var(--primary-foreground); - --sidebar-accent: oklch(0.22 0 0); - --sidebar-accent-foreground: oklch(0.98 0 0); - --sidebar-border: oklch(0.269 0 0); - --sidebar-ring: oklch(0.51 0.16 262.61); + --sidebar-accent: oklch(0.22 0.01 250); + --sidebar-accent-foreground: oklch(0.96 0.01 250); + --sidebar-border: oklch(0.21 0.01 250); + --sidebar-ring: oklch(0.54 0.13 250); --dev-color: oklch(0.75 0.18 50); --ui-color: oklch(0.7 0.18 170); diff --git a/apps/docs/src/components/fumadocs/search-dialog.tsx b/apps/docs/src/components/fumadocs/search-dialog.tsx new file mode 100644 index 000000000..6186fd789 --- /dev/null +++ b/apps/docs/src/components/fumadocs/search-dialog.tsx @@ -0,0 +1,39 @@ +'use client'; + +import { useDocsSearch } from 'fumadocs-core/search/client'; +import { + SearchDialog, + SearchDialogClose, + SearchDialogContent, + SearchDialogHeader, + SearchDialogIcon, + SearchDialogInput, + SearchDialogList, + SearchDialogOverlay, + type SharedProps, +} from 'fumadocs-ui/components/dialog/search'; + +export default function SearchDialogFumadocs(props: SharedProps) { + const { search, setSearch, query } = useDocsSearch({ + type: 'fetch', + }); + + return ( + + + + + + + + + + + + ); +} diff --git a/apps/docs/src/examples/badge.tsx b/apps/docs/src/examples/badge.tsx new file mode 100644 index 000000000..2a083d03e --- /dev/null +++ b/apps/docs/src/examples/badge.tsx @@ -0,0 +1,39 @@ +import { Badge } from '@vitnode/core/components/ui/badge'; +import { BadgeCheckIcon } from 'lucide-react'; + +export default function BadgeDemo() { + return ( +
+
+ Badge + Secondary + Destructive + Outline +
+
+ + + Verified + + + 8 + + + 99 + + + 20+ + +
+
+ ); +} diff --git a/apps/docs/src/examples/separator.tsx b/apps/docs/src/examples/separator.tsx index de660bcde..10dbf6dce 100644 --- a/apps/docs/src/examples/separator.tsx +++ b/apps/docs/src/examples/separator.tsx @@ -4,7 +4,7 @@ export default function ProgressDemo() { return (
-

Radix Primitives

+

Radix Primitives

An open-source UI component library.

diff --git a/apps/docs/src/vitnode.api.config.ts b/apps/docs/src/vitnode.api.config.ts index 1a4dceb94..ed34849c9 100644 --- a/apps/docs/src/vitnode.api.config.ts +++ b/apps/docs/src/vitnode.api.config.ts @@ -4,13 +4,7 @@ import { DiscordSSOApiPlugin } from '@vitnode/core/api/adapters/sso/discord'; import { FacebookSSOApiPlugin } from '@vitnode/core/api/adapters/sso/facebook'; import { GoogleSSOApiPlugin } from '@vitnode/core/api/adapters/sso/google'; import { buildApiConfig } from '@vitnode/core/vitnode.config'; -import * as dotenv from 'dotenv'; import { drizzle } from 'drizzle-orm/postgres-js'; -import { join } from 'path'; - -dotenv.config({ - path: join(process.cwd(), '..', '..', '.env'), -}); export const POSTGRES_URL = // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing @@ -31,12 +25,14 @@ export const vitNodeApiConfig = buildApiConfig({ points: 20, // 20 requests duration: 60, // per 60 seconds }, - emailAdapter: NodemailerEmailAdapter({ - from: process.env.NODE_MAILER_FROM, - host: process.env.NODE_MAILER_HOST, - password: process.env.NODE_MAILER_PASSWORD, - user: process.env.NOD_EMAILER_USER, - }), + email: { + adapter: NodemailerEmailAdapter({ + from: process.env.NODE_MAILER_FROM, + host: process.env.NODE_MAILER_HOST, + password: process.env.NODE_MAILER_PASSWORD, + user: process.env.NOD_EMAILER_USER, + }), + }, authorization: { ssoAdapters: [ DiscordSSOApiPlugin({ diff --git a/package.json b/package.json index 94c6e9e86..b836265b6 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,11 @@ "devDependencies": { "@types/node": "^24", "@vitnode/eslint-config": "workspace:*", - "prettier": "^3.6.1", + "prettier": "^3.6.2", "prettier-plugin-tailwindcss": "^0.6.13", - "tsx": "^4.20.3", "turbo": "^2.5.4", - "typescript": "^5.8.3" + "typescript": "^5.8.3", + "zod": "^3.25.74" }, "engines": { "node": ">=22" diff --git a/packages/create-vitnode-app/README.md b/packages/create-vitnode-app/README.md index f80887a89..91a9fcb0c 100644 --- a/packages/create-vitnode-app/README.md +++ b/packages/create-vitnode-app/README.md @@ -37,8 +37,9 @@ bun create vitnode-app@latest ## Options -| Option | Description | -| ------------------- | ---------------------------------------------------------- | -| `--package-manager` | Specify the package manager to use. Support `npm`, `pnpm`. | -| `--eslint` | Initialize with eslint config. | -| `--skip-install` | Skip installing packages after initializing the project. | +| Option | Description | +| ------------------- | --------------------------------------------------------------------------------- | +| `--package-manager` | Specify the package manager to use. Support `npm`, `pnpm`. | +| `--eslint` | Initialize with eslint config. | +| `--skip-install` | Skip installing packages after initializing the project. | +| `--mode` | Specify the type of app to create. Support `singleApp`, `apiMonorepo`, `onlyApi`. | diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/root/.env.example b/packages/create-vitnode-app/copy-of-vitnode-app/root/.env.example index 1d34646f3..8cd02f224 100644 --- a/packages/create-vitnode-app/copy-of-vitnode-app/root/.env.example +++ b/packages/create-vitnode-app/copy-of-vitnode-app/root/.env.example @@ -1,8 +1,7 @@ POSTGRES_URL=postgresql://root:root@localhost:5432/vitnode -NEXT_PUBLIC_BACKEND_URL=http://localhost:3000 -NEXT_PUBLIC_BACKEND_CLIENT_URL=http://localhost:3000 -NEXT_PUBLIC_FRONTEND_URL=http://localhost:3000 +NEXT_PUBLIC_API_URL=http://localhost:3000 +NEXT_PUBLIC_WEB_URL=http://localhost:3000 # === Docker Database Postgres === POSTGRES_USER=root diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/root/src/app/global.css b/packages/create-vitnode-app/copy-of-vitnode-app/root/src/app/global.css index 346d12d40..985e57ba6 100644 --- a/packages/create-vitnode-app/copy-of-vitnode-app/root/src/app/global.css +++ b/packages/create-vitnode-app/copy-of-vitnode-app/root/src/app/global.css @@ -6,72 +6,72 @@ @source "../../node_modules/@vitnode/core/dist/src/views"; :root:not(.dark) { - --background: oklch(0.98 0 0); - --foreground: oklch(0.145 0 0); + --background: oklch(0.96 0.01 250); + --foreground: oklch(0.18 0.01 250); --card: oklch(1 0 0); - --card-foreground: oklch(0.145 0 0); + --card-foreground: oklch(0.22 0.01 250); --popover: oklch(1 0 0); - --popover-foreground: oklch(0.145 0 0); + --popover-foreground: oklch(0.22 0.01 250); --primary: oklch(0.51 0.16 262.61); --primary-foreground: oklch(0.985 0 0); - --secondary: oklch(0.96 0 0); - --secondary-foreground: oklch(0.205 0 0); - --muted: oklch(0.97 0 0); - --muted-foreground: oklch(0.45 0 0); - --accent: oklch(0.95 0 0); - --accent-foreground: oklch(0.205 0 0); + --secondary: oklch(0.93 0.01 250); + --secondary-foreground: oklch(0.25 0.01 250); + --muted: oklch(0.95 0.01 250); + --muted-foreground: oklch(0.35 0.01 250); + --accent: oklch(0.92 0.01 250); + --accent-foreground: oklch(0.25 0.01 250); --destructive: oklch(0.6 0.2 24.45); --warn: oklch(0.54 0.12 82.58); - --border: oklch(0.9 0 0); - --input: oklch(0.9 0 0); - --ring: oklch(0.7 0.16 262.61); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); + --border: oklch(0.9 0.01 250); + --input: oklch(0.9 0.01 250); + --ring: oklch(0.7 0.13 250); + --chart-1: oklch(0.65 0.13 250); + --chart-2: oklch(0.6 0.11 260); + --chart-3: oklch(0.45 0.09 250); + --chart-4: oklch(0.8 0.13 250); + --chart-5: oklch(0.75 0.13 250); --sidebar: var(--card); - --sidebar-foreground: oklch(0.145 0 0); + --sidebar-foreground: oklch(0.22 0.01 250); --sidebar-primary: var(--primary); --sidebar-primary-foreground: var(--primary-foreground); - --sidebar-accent: oklch(0.975 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.902 0 0); - --sidebar-ring: oklch(0.708 0 0); + --sidebar-accent: oklch(0.97 0.01 250); + --sidebar-accent-foreground: oklch(0.25 0.01 250); + --sidebar-border: oklch(0.91 0.01 250); + --sidebar-ring: oklch(0.7 0.13 250); } .dark { - --background: oklch(0.1 0 0); - --foreground: oklch(0.98 0 0); - --card: oklch(0.18 0 0); - --card-foreground: oklch(0.98 0 0); - --popover: oklch(0.18 0 0); - --popover-foreground: oklch(0.98 0 0); + --background: oklch(0.16 0.01 250); + --foreground: oklch(0.96 0.01 250); + --card: oklch(0.18 0.01 250); + --card-foreground: oklch(0.96 0.01 250); + --popover: oklch(0.18 0.01 250); + --popover-foreground: oklch(0.96 0.01 250); --primary: oklch(0.51 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); - --muted-foreground: oklch(0.7 0 0); - --accent: oklch(0.28 0 0); + --secondary: oklch(0.22 0.01 250); + --secondary-foreground: oklch(0.96 0.01 250); + --muted: oklch(0.22 0.01 250); + --muted-foreground: oklch(0.7 0.01 250); + --accent: oklch(0.28 0.01 250); --destructive: oklch(0.62 0.2 25.35); --warn: oklch(0.76 0.18 81.84); - --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); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); + --border: oklch(0.26 0.01 250); + --input: oklch(0.26 0.01 250); + --ring: oklch(0.54 0.13 250); + --chart-1: oklch(0.45 0.09 250); + --chart-2: oklch(0.6 0.11 260); + --chart-3: oklch(0.75 0.13 250); + --chart-4: oklch(0.8 0.13 250); + --chart-5: oklch(0.65 0.13 250); --sidebar: var(--card); - --sidebar-foreground: oklch(0.98 0 0); + --sidebar-foreground: oklch(0.96 0.01 250); --sidebar-primary: var(--primary); --sidebar-primary-foreground: var(--primary-foreground); - --sidebar-accent: oklch(0.22 0 0); - --sidebar-accent-foreground: oklch(0.98 0 0); - --sidebar-border: oklch(0.269 0 0); - --sidebar-ring: oklch(0.51 0.16 262.61); + --sidebar-accent: oklch(0.22 0.01 250); + --sidebar-accent-foreground: oklch(0.96 0.01 250); + --sidebar-border: oklch(0.21 0.01 250); + --sidebar-ring: oklch(0.54 0.13 250); } :root { diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/root/tsconfig.json b/packages/create-vitnode-app/copy-of-vitnode-app/root/tsconfig.json new file mode 100644 index 000000000..13dc93961 --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-app/root/tsconfig.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vitnode/eslint-config/tsconfig", + "compilerOptions": { + "target": "ESNext", + "module": "esnext", + "moduleResolution": "bundler", + "noEmit": true, + "baseUrl": ".", + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index 427a1885b..286ab4637 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -28,18 +28,18 @@ "typescript" ], "dependencies": { - "@inquirer/prompts": "^7.5.3", + "@inquirer/prompts": "^7.6.0", "commander": "^14.0.0", "ora": "^8.2.0", "picocolors": "^1.1.1", "validate-npm-package-name": "^6.0.1" }, "devDependencies": { - "@types/node": "^24", + "@types/node": "^24.0.10", "@types/prompts": "^2.4.9", "@types/validate-npm-package-name": "^4.0.2", "@vitnode/eslint-config": "workspace:*", - "eslint": "^9.29.0", + "eslint": "^9.30.1", "typescript": "^5.8.3" } } diff --git a/packages/create-vitnode-app/src/create/create-package-json.ts b/packages/create-vitnode-app/src/create/create-package-json.ts index 5f617947e..51e5c7946 100644 --- a/packages/create-vitnode-app/src/create/create-package-json.ts +++ b/packages/create-vitnode-app/src/create/create-package-json.ts @@ -3,6 +3,7 @@ import { dirname, join } from 'path'; import { fileURLToPath } from 'url'; import type { PackageJSON } from '../helpers/packages-json.js'; +import type { CreateCliReturn } from '../questions.js'; import { getAvailablePackageManagers } from '../helpers/get-available-package-managers.js'; @@ -15,10 +16,12 @@ export const createPackageJSON = async ({ root, eslint, docker, + mode, }: { appName: string; docker?: boolean; eslint: boolean; + mode: CreateCliReturn['mode']; packageManager: string; root: string; }) => { @@ -27,24 +30,22 @@ export const createPackageJSON = async ({ await readFile(join(__dirname, '..', '..', '..', 'package.json'), 'utf-8'), ); - const packageJson: PackageJSON = { - name: appName, + const apiPackageJson: PackageJSON = { + name: mode === 'apiMonorepo' ? 'api' : appName, version: '0.1.0', private: true, type: 'module', scripts: { - 'db:push': 'vitnode push', - 'db:migrate': 'vitnode migrate', - dev: 'vitnode init && next dev --turbopack', - build: 'next build --turbopack', - start: 'next start', + dev: 'tsx watch src/index.ts', + build: 'tsc && tsc-alias -p tsconfig.json', + start: 'node dist/index.js', ...(eslint ? { lint: 'eslint .', 'lint:fix': 'eslint . --fix', } : {}), - ...(docker + ...(docker && mode === 'onlyApi' ? { 'docker:dev': `docker compose -f ./docker-compose.yml -p ${appName}-vitnode-dev up -d`, } @@ -54,45 +55,205 @@ export const createPackageJSON = async ({ dependencies: { '@hono/zod-openapi': '^0.19.8', '@hono/zod-validator': '^0.7.0', - '@hookform/resolvers': '^5.1.1', '@react-email/components': '^0.1.1', '@vitnode/core': `^${pkg.version}`, - 'babel-plugin-react-compiler': '19.1.0-rc.2', 'drizzle-kit': '^0.31.3', 'drizzle-orm': '^0.44.2', hono: '^4.8.3', - 'lucide-react': '^0.523.0', - next: '^15.3.4', 'next-intl': '^4.3.1', - react: '^19.1.0', - 'react-dom': '^19.1.0', - 'react-hook-form': '^7.58.1', - sonner: '^2.0.5', + react: '^19.1', + 'react-dom': '^19.1', zod: '^3.25.67', }, devDependencies: { - '@tailwindcss/postcss': '^4.1.11', + '@hono/node-server': '^1.15.0', '@types/node': '^24', '@types/react': '^19.1', '@types/react-dom': '^19.1', + '@vitnode/eslint-config': `^${pkg.version}`, + dotenv: '^17.1.0', ...(eslint ? { - eslint: '^9.29.0', - '@vitnode/eslint-config': `^${pkg.version}`, - 'prettier-plugin-tailwindcss': '^0.6.12', - prettier: '^3.6.1', + eslint: '^9.30.1', + ...(mode === 'onlyApi' + ? { + 'prettier-plugin-tailwindcss': '^0.6.12', + prettier: '^3.6.2', + } + : {}), } : {}), 'react-email': '^4.0.17', - tailwindcss: '^4.1.11', - 'tw-animate-css': '^1.3.2', + 'tsc-alias': '^1.8.16', + tsx: '^4.20.3', typescript: '^5.8.3', }, - packageManager: `${packageManager}@${availablePackageManagers[packageManager]}`, }; - await writeFile( - join(root, 'package.json'), - JSON.stringify(packageJson, null, 2), - ); + if (mode === 'singleApp') { + const packageJson: PackageJSON = { + name: appName, + version: '0.1.0', + private: true, + type: 'module', + scripts: { + 'db:push': 'vitnode push', + 'db:migrate': 'vitnode migrate', + dev: 'vitnode init && next dev --turbopack', + build: 'next build --turbopack', + start: 'next start', + ...(eslint + ? { + lint: 'eslint .', + 'lint:fix': 'eslint . --fix', + } + : {}), + ...(docker + ? { + 'docker:dev': `docker compose -f ./docker-compose.yml -p ${appName}-vitnode-dev up -d`, + } + : {}), + 'drizzle-kit': 'drizzle-kit', + }, + dependencies: { + '@hono/zod-openapi': '^0.19.9', + '@hono/zod-validator': '^0.7.0', + '@hookform/resolvers': '^5.1.1', + '@react-email/components': '^0.1.1', + '@vitnode/core': `^${pkg.version}`, + 'babel-plugin-react-compiler': '19.1.0-rc.2', + 'drizzle-kit': '^0.31.4', + 'drizzle-orm': '^0.44.2', + hono: '^4.8.4', + 'lucide-react': '^0.525.0', + next: '^15.3.5', + 'next-intl': '^4.3.4', + react: '^19.1', + 'react-dom': '^19.1', + 'react-hook-form': '^7.60.0', + sonner: '^2.0.6', + zod: '^3.25.74', + }, + devDependencies: { + '@tailwindcss/postcss': '^4.1.11', + '@types/node': '^24', + '@types/react': '^19.1', + '@types/react-dom': '^19.1', + '@vitnode/eslint-config': `^${pkg.version}`, + ...(eslint + ? { + eslint: '^9.30.1', + 'prettier-plugin-tailwindcss': '^0.6.12', + prettier: '^3.6.2', + } + : {}), + 'react-email': '^4.0.17', + turbo: '^2.5.4', + tailwindcss: '^4.1.11', + 'tw-animate-css': '^1.3.5', + typescript: '^5.8.3', + }, + packageManager: `${packageManager}@${availablePackageManagers[packageManager]}`, + }; + + await writeFile( + join(root, 'package.json'), + JSON.stringify(packageJson, null, 2), + ); + } else if (mode === 'apiMonorepo') { + const rootPackageJson: PackageJSON = { + name: appName, + private: true, + scripts: { + 'db:migrate': 'turbo db:migrate', + 'db:push': 'turbo db:push', + build: 'turbo build', + start: 'turbo start', + dev: ' turbo dev', + lint: 'turbo lint', + 'lint:fix': 'turbo lint:fix', + }, + devDependencies: { + '@types/node': '^24', + '@vitnode/eslint-config': `^${pkg.version}`, + ...(eslint + ? { + 'prettier-plugin-tailwindcss': '^0.6.12', + prettier: '^3.6.2', + } + : {}), + turbo: '^2.5.4', + typescript: '^5.8.3', + zod: '^3.25.74', + }, + packageManager: `${packageManager}@${availablePackageManagers[packageManager]}`, + workspaces: ['apps/*', 'plugins/*'], + }; + + await writeFile( + join(root, 'package.json'), + JSON.stringify(rootPackageJson, null, 2), + ); + + await writeFile( + join(root, 'apps', 'api', 'package.json'), + JSON.stringify(apiPackageJson, null, 2), + ); + + const webPackageJson: PackageJSON = { + name: 'web', + version: '0.1.0', + private: true, + type: 'module', + scripts: { + dev: 'vitnode init && next dev --turbopack', + build: 'next build --turbopack', + start: 'next start', + lint: 'eslint .', + 'lint:fix': 'eslint . --fix', + }, + dependencies: { + '@vitnode/core': `^${pkg.version}`, + 'babel-plugin-react-compiler': '19.1.0-rc.2', + 'lucide-react': '^0.525.0', + next: '^15.3.5', + 'next-intl': '^4.3.4', + react: '^19.1', + 'react-dom': '^19.1', + 'react-hook-form': '^7.60.0', + sonner: '^2.0.6', + }, + devDependencies: { + '@playwright/test': '^1.53.2', + '@tailwindcss/postcss': '^4.1.11', + '@types/mdx': '^2.0.13', + '@types/node': '^24.0.10', + '@types/react': '^19.1', + '@types/react-dom': '^19.1', + '@vitnode/eslint-config': `^${pkg.version}`, + 'class-variance-authority': '^0.7.1', + ...(eslint + ? { + eslint: '^9.30.1', + } + : {}), + postcss: '^8.5.6', + 'react-email': '^4.0.17', + tailwindcss: '^4.1.11', + 'tw-animate-css': '^1.3.5', + typescript: '^5.8.3', + zod: '^3.25.74', + }, + }; + + await writeFile( + join(root, 'apps', 'web', 'package.json'), + JSON.stringify(webPackageJson, null, 2), + ); + } else if (mode === 'onlyApi') { + await writeFile( + join(root, 'package.json'), + JSON.stringify(apiPackageJson, null, 2), + ); + } }; diff --git a/packages/create-vitnode-app/src/create/create-vitnode.ts b/packages/create-vitnode-app/src/create/create-vitnode.ts index a25729d2f..a56972a7a 100644 --- a/packages/create-vitnode-app/src/create/create-vitnode.ts +++ b/packages/create-vitnode-app/src/create/create-vitnode.ts @@ -22,6 +22,7 @@ export const createVitNode = async ({ eslint, install, docker, + mode, }: CreateCliReturn & { appName: string; root: string; @@ -45,11 +46,44 @@ export const createVitNode = async ({ if (!isFolderEmpty(root, appName)) { process.exit(1); } + const monorepoStructure = { + api: join(root, 'apps', 'api'), + web: join(root, 'apps', 'web'), + }; + + if (mode === 'apiMonorepo') { + spinner.text = 'Preparing monorepo structure...'; + // Create api, web folders + await Promise.all([ + mkdir(monorepoStructure.api, { recursive: true }), + mkdir(monorepoStructure.web, { recursive: true }), + ]); + } spinner.text = 'Copying files...'; - await cp(join(templatePath, 'root'), root, { - recursive: true, - }); + if (mode === 'singleApp') { + await Promise.all([ + cp(join(templatePath, 'root'), root, { + recursive: true, + }), + cp(join(templatePath, 'api-single-app'), root, { + recursive: true, + }), + ]); + } else if (mode === 'apiMonorepo') { + await Promise.all([ + cp(join(templatePath, 'root'), monorepoStructure.web, { + recursive: true, + }), + cp(join(templatePath, 'api'), monorepoStructure.api, { + recursive: true, + }), + ]); + } else if (mode === 'onlyApi') { + await cp(join(templatePath, 'api'), root, { + recursive: true, + }); + } if (eslint) { spinner.text = 'Copying eslint files...'; @@ -58,7 +92,6 @@ export const createVitNode = async ({ }); } - // Rename special files spinner.text = 'Renaming special files...'; await rename(join(root, '.gitignore_template'), join(root, '.gitignore')); @@ -69,6 +102,7 @@ export const createVitNode = async ({ packageManager, eslint, docker, + mode, }); if (docker) { diff --git a/packages/create-vitnode-app/src/helpers/packages-json.ts b/packages/create-vitnode-app/src/helpers/packages-json.ts index 240b6954e..90febe98f 100644 --- a/packages/create-vitnode-app/src/helpers/packages-json.ts +++ b/packages/create-vitnode-app/src/helpers/packages-json.ts @@ -9,6 +9,6 @@ export interface PackageJSON { private: boolean; scripts?: Record; type?: string; - version: string; + version?: string; workspaces?: string[]; } diff --git a/packages/create-vitnode-app/src/index.ts b/packages/create-vitnode-app/src/index.ts index 15718af38..ed2b53853 100644 --- a/packages/create-vitnode-app/src/index.ts +++ b/packages/create-vitnode-app/src/index.ts @@ -36,7 +36,7 @@ const init = async () => { let projectPath = ''; const program = new Command() - .version(packageJson.version) + .version(packageJson.version ?? '0.1.0') .argument('[project-directory]') .usage(`${color.green('[project-directory]')} [options]`) .action(name => { @@ -55,6 +55,12 @@ const init = async () => { 'Skip installing packages after initializing the project.', ); program.option('--plugin', 'Enable plugin mode.'); + program.addOption( + new Option( + '--mode ', + 'What type of app do you want to create?', + ).choices(['singleApp', 'apiMonorepo', 'onlyApi']), + ); program.parse(process.argv); diff --git a/packages/create-vitnode-app/src/questions.ts b/packages/create-vitnode-app/src/questions.ts index f15155aad..1233ccb43 100644 --- a/packages/create-vitnode-app/src/questions.ts +++ b/packages/create-vitnode-app/src/questions.ts @@ -10,6 +10,7 @@ export interface CreateCliReturn { docker?: boolean; eslint: boolean; install: boolean; + mode: 'apiMonorepo' | 'onlyApi' | 'singleApp'; packageManager: string; } @@ -22,6 +23,7 @@ export const createQuestionsCli = async ( eslint: optionsFromProgram.eslint, install: !optionsFromProgram.skipInstall, docker: optionsFromProgram.docker, + mode: optionsFromProgram.mode, }; if (!optionsFromProgram.packageManager) { @@ -48,6 +50,32 @@ export const createQuestionsCli = async ( }); } + if (optionsFromProgram.mode === undefined) { + options.mode = await select({ + message: `What type of ${color.blue('app')} do you want to create?`, + choices: [ + { + name: `Single App - ${color.blue('Next.js')} & ${color.blue('Hono.js')}`, + description: + 'Create a single app with Next.js and Hono.js in the same project.', + value: 'singleApp', + }, + { + name: `Monorepo App - ${color.blue('Next.js')} & ${color.blue('Hono.js')}`, + description: + 'Create a monorepo with both Next.js and Hono.js apps separately.', + value: 'apiMonorepo', + }, + { + name: `Only API - ${color.blue('Hono.js')}`, + description: 'Create only an API app using Hono.js without Next.js.', + value: 'onlyApi', + }, + ], + default: 'singleApp', + }); + } + if (optionsFromProgram.eslint === undefined) { options.eslint = await confirm({ message: `Would you like to use ${color.blue('ESLint')}?`, diff --git a/packages/eslint/package.json b/packages/eslint/package.json index 1e082439f..0fe78b74a 100644 --- a/packages/eslint/package.json +++ b/packages/eslint/package.json @@ -42,7 +42,7 @@ "typescript": "^5.8.3" }, "dependencies": { - "@eslint/js": "^9.29.0", + "@eslint/js": "^9.30.1", "eslint-config-prettier": "^10.1.5", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-perfectionist": "^4.15.0", @@ -51,6 +51,6 @@ "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "6.0.0-rc1", "prettier-plugin-tailwindcss": "^0.6.13", - "typescript-eslint": "^8.35.0" + "typescript-eslint": "^8.35.1" } } diff --git a/packages/vitnode/.npmignore b/packages/vitnode/.npmignore index 31830f40d..d47df62a2 100644 --- a/packages/vitnode/.npmignore +++ b/packages/vitnode/.npmignore @@ -16,5 +16,4 @@ /tsup.config.ts /vitest.config.ts /tsconfig.json -/scripts -/emails \ No newline at end of file +/scripts \ No newline at end of file diff --git a/packages/vitnode/emails/my-email.tsx b/packages/vitnode/emails/my-email.tsx deleted file mode 100644 index a908a62b0..000000000 --- a/packages/vitnode/emails/my-email.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Button, Html } from '@react-email/components'; - -export default function Email() { - return ( - - - - ); -} diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 1782e3dfa..bf01425b1 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -31,20 +31,20 @@ "next-intl": "4.x.x", "react": "19.1.x", "react-dom": "19.1.x", - "react-hook-form": "^7.0.0", + "react-hook-form": "^7.x.x", "typescript": "^5.8.x", "zod": "3.x.x" }, "devDependencies": { - "@hono/zod-openapi": "^0.19.8", + "@hono/zod-openapi": "^0.19.9", "@hono/zod-validator": "^0.7.0", "@hookform/resolvers": "^5.1.1", - "@react-email/components": "^0.1.0", + "@react-email/components": "^0.1.1", "@swc/cli": "0.6.0", - "@swc/core": "^1.12.7", + "@swc/core": "^1.12.9", "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.3.0", - "@types/node": "^24", + "@types/node": "^24.0.10", "@types/nodemailer": "^6.4.17", "@types/react": "^19.1", "@types/react-dom": "^19.1", @@ -53,28 +53,29 @@ "@vitnode/eslint-config": "workspace:*", "chokidar": "^4.0.3", "concurrently": "^9.2.0", - "drizzle-kit": "^0.31.3", + "dotenv": "^17.1.0", + "drizzle-kit": "^0.31.4", "drizzle-orm": "^0.44.2", - "eslint": "^9.29.0", - "hono": "^4.8.3", + "eslint": "^9.30.1", + "hono": "^4.8.4", "jsdom": "^26.1.0", - "lucide-react": "^0.523.0", - "next": "^15.3.4", - "next-intl": "^4.3.1", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "lucide-react": "^0.525.0", + "next": "^15.3.5", + "next-intl": "^4.3.4", + "react": "^19.1", + "react-dom": "^19.1", "react-email": "^4.0.17", - "react-hook-form": "^7.58.1", - "sonner": "^2.0.5", + "react-hook-form": "^7.60.0", + "sonner": "^2.0.6", "tailwindcss": "^4.1.11", "tsc-alias": "^1.8.16", "tsup": "^8.5.0", "tsx": "^4.20.3", - "tw-animate-css": "^1.3.4", + "tw-animate-css": "^1.3.5", "typescript": "^5.8.3", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.2.4", - "zod": "^3.25.67" + "zod": "^3.25.74" }, "bin": { "vitnode": "./dist/scripts/scripts.js" @@ -98,7 +99,7 @@ "start:scripts": "node dist/scripts/scripts.js plugin --w", "build:plugins": "tsc && swc src -d dist --config-file .swcrc && tsc-alias -p tsconfig.json", "dev": "concurrently \"tsc -w --preserveWatchOutput\" \"swc src -d dist --config-file .swcrc -w\" \"tsc-alias -w\" \"node dist/scripts/scripts.js plugin --w\"", - "dev:email": "email dev", + "dev:email": "email dev --dir src/emails", "lint": "eslint .", "lint:fix": "eslint . --fix", "test": "vitest run", @@ -109,18 +110,17 @@ "dependencies": { "@dnd-kit/core": "^6.3.1", "@hono/swagger-ui": "^0.5.2", - "@tanstack/react-query": "^5.81.2", + "@tanstack/react-query": "^5.81.5", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", - "dotenv": "^16.6.0", "input-otp": "^1.4.2", "next-themes": "^0.4.6", - "nodemailer": "^7.0.3", + "nodemailer": "^7.0.4", "postgres": "^3.4.7", "radix-ui": "^1.4.2", "rate-limiter-flexible": "^7.1.1", - "react-scan": "^0.3.4", + "react-scan": "^0.4.3", "resend": "^4.6.0", "tailwind-merge": "^3.3.1", "use-debounce": "^10.0.5", diff --git a/packages/vitnode/scripts/get-config.ts b/packages/vitnode/scripts/get-config.ts index 79c9c1257..033045cc7 100644 --- a/packages/vitnode/scripts/get-config.ts +++ b/packages/vitnode/scripts/get-config.ts @@ -2,16 +2,25 @@ import { join } from 'path'; import { pathToFileURL } from 'url'; -import type { VitNodeConfig } from '../src/vitnode.config'; +import type { VitNodeApiConfig, VitNodeConfig } from '../src/vitnode.config'; -export const getConfig = async (): Promise => { - const configPath = join(process.cwd(), 'src', 'vitnode.config.ts'); +type ConfigType = T extends 'config' + ? VitNodeConfig + : VitNodeApiConfig; + +export const getConfig = async ({ + type = 'config' as T, +}: { + type?: T; +}): Promise> => { + const configPath = join(process.cwd(), 'src', `vitnode.${type}.ts`); try { const configUrl = pathToFileURL(configPath).href; const loaded = await import(configUrl); - const config = loaded.vitNodeConfig; + const config = + type === 'config' ? loaded.vitNodeConfig : loaded.vitNodeApiConfig; - return config; + return config as ConfigType; } catch (error) { console.error('Failed to load config:', error); process.exit(1); diff --git a/packages/vitnode/scripts/prepare-database.ts b/packages/vitnode/scripts/prepare-database.ts index 0adbe6c48..0c402af77 100644 --- a/packages/vitnode/scripts/prepare-database.ts +++ b/packages/vitnode/scripts/prepare-database.ts @@ -1,28 +1,16 @@ /* eslint-disable no-console */ -import * as dotenv from 'dotenv'; import { count } from 'drizzle-orm'; -import { drizzle } from 'drizzle-orm/postgres-js'; -import { join } from 'path'; import { core_admin_permissions } from '@/database/admins.js'; import { core_languages, core_languages_words } from '@/database/languages.js'; import { core_moderators_permissions } from '@/database/moderators.js'; import { core_roles } from '@/database/roles.js'; +import { getConfig } from './get-config.js'; import { preparePluginsFiles } from './prepare-plugins-files.js'; import { runInteractiveShellCommand } from './run-interactive-shell-command.js'; -dotenv.config({ - path: join(process.cwd(), '..', '..', '.env'), -}); - -const dbClient = drizzle({ - connection: - process.env.POSTGRES_URL ?? 'postgresql://root:root@localhost:5432/vitnode', - casing: 'camelCase', -}); - export const generateDatabaseMigrations = async () => { try { await runInteractiveShellCommand('npm', ['run', 'drizzle-kit', 'up']); @@ -52,6 +40,9 @@ export const runPush = async () => { }; export const initialDataForDatabase = async () => { + const config = await getConfig({ type: 'api.config' }); + const dbClient = config.dbProvider; + const [roleCount] = await dbClient .select({ count: count(), @@ -164,10 +155,10 @@ export const prepareDatabase = async ({ }) => { console.log(`${initMessage} [1/4] Prepare plugins files...`); await preparePluginsFiles(); - console.log(`${initMessage} [2/4] Generate migrations...`); - await generateDatabaseMigrations(); - console.log(`${initMessage} [3/4] Run migrations...`); - await runMigrations(); + // console.log(`${initMessage} [2/4] Generate migrations...`); + // await generateDatabaseMigrations(); + // console.log(`${initMessage} [3/4] Run migrations...`); + // await runMigrations(); console.log(`\n${initMessage} [4/4] Insert initial data...`); await initialDataForDatabase(); console.log(`${initMessage} \x1b[32mDatabase prepared successfully.\x1b[0m`); diff --git a/packages/vitnode/scripts/prepare-plugins-files.ts b/packages/vitnode/scripts/prepare-plugins-files.ts index d3e514f46..a4945717c 100644 --- a/packages/vitnode/scripts/prepare-plugins-files.ts +++ b/packages/vitnode/scripts/prepare-plugins-files.ts @@ -14,7 +14,7 @@ import { } from './shared/file-utils'; export const preparePluginsFiles = async () => { - const config = await getConfig(); + const config = await getConfig({}); const plugins: string[] = [ ...config.plugins.map(plugin => plugin.pluginId), '@vitnode/core', diff --git a/packages/vitnode/scripts/run-interactive-shell-command.ts b/packages/vitnode/scripts/run-interactive-shell-command.ts index f42ba7aba..1fcd7ae12 100644 --- a/packages/vitnode/scripts/run-interactive-shell-command.ts +++ b/packages/vitnode/scripts/run-interactive-shell-command.ts @@ -5,7 +5,11 @@ export const runInteractiveShellCommand = async ( args: string[] = [], ) => { return new Promise((resolve, reject) => { - const child = spawn(cmd, args, { stdio: 'inherit', shell: true }); + const child = spawn(cmd, args, { + stdio: 'inherit', + shell: true, + env: process.env, + }); child.on('error', error => { reject(error); diff --git a/packages/vitnode/scripts/scripts.ts b/packages/vitnode/scripts/scripts.ts index 898daa265..c32681cd9 100644 --- a/packages/vitnode/scripts/scripts.ts +++ b/packages/vitnode/scripts/scripts.ts @@ -1,6 +1,8 @@ #!/usr/bin/env node /* eslint-disable no-console */ +import * as dotenv from 'dotenv'; + import { processPlugin } from './plugin.js'; import { generateDatabaseMigrations, @@ -11,6 +13,8 @@ import { } from './prepare-database.js'; import { preparePluginsFiles } from './prepare-plugins-files.js'; +dotenv.config(); + const initMessage = '\x1b[34m[VitNode]\x1b[0m'; const command = process.argv[2]; diff --git a/packages/vitnode/src/api/config.ts b/packages/vitnode/src/api/config.ts index bb8795796..2f2e95b72 100644 --- a/packages/vitnode/src/api/config.ts +++ b/packages/vitnode/src/api/config.ts @@ -61,7 +61,7 @@ export function VitNodeAPI({ app.use( '*', globalMiddleware({ - emailAdapter: vitNodeApiConfig.emailAdapter, + email: vitNodeApiConfig.email, metadata: vitNodeConfig.metadata, authorization: vitNodeApiConfig.authorization, dbProvider: vitNodeApiConfig.dbProvider, @@ -76,12 +76,12 @@ export function VitNodeAPI({ return next(); }); - app.onError((error, c) => { + app.onError(async (error, c) => { if (error instanceof HTTPException) { return error.getResponse(); } - c.get('log').error(`Unhandled error: ${error.message}`); + await c.get('log').error(`Unhandled error: ${error.message}`); return new Response( process.env.NODE_ENV === 'development' diff --git a/packages/vitnode/src/api/lib/logger-middleware.ts b/packages/vitnode/src/api/lib/logger-middleware.ts index 95015dea6..fdfb9fcae 100644 --- a/packages/vitnode/src/api/lib/logger-middleware.ts +++ b/packages/vitnode/src/api/lib/logger-middleware.ts @@ -6,9 +6,9 @@ import { core_logs } from '@/database/logs'; type CoreLogsType = 'debug' | 'error' | 'warn'; export interface LoggerMiddlewareType { - debug: (content: string) => void; - error: (content: string) => void; - warn: (content: string) => void; + debug: (content: string) => Promise; + error: (content: string) => Promise; + warn: (content: string) => Promise; } export const loggerMiddleware = (c: Context): LoggerMiddlewareType => { @@ -49,14 +49,14 @@ export const loggerMiddleware = (c: Context): LoggerMiddlewareType => { }; return { - debug: (content: string) => { - void logToDbAndConsole(content, 'debug'); + debug: async (content: string) => { + await logToDbAndConsole(content, 'debug'); }, - error: (content: string) => { - void logToDbAndConsole(content, 'error'); + error: async (content: string) => { + await logToDbAndConsole(content, 'error'); }, - warn: (content: string) => { - void logToDbAndConsole(content, 'warn'); + warn: async (content: string) => { + await logToDbAndConsole(content, 'warn'); }, }; }; diff --git a/packages/vitnode/src/api/middlewares/global.middleware.ts b/packages/vitnode/src/api/middlewares/global.middleware.ts index 8fa55d51c..096abf673 100644 --- a/packages/vitnode/src/api/middlewares/global.middleware.ts +++ b/packages/vitnode/src/api/middlewares/global.middleware.ts @@ -2,9 +2,13 @@ import type { Context, Env, Next } from 'hono'; import { HTTPException } from 'hono/http-exception'; -import type { EmailApiPlugin } from '@/api/models/email'; import type { VitNodeApiConfig, VitNodeConfig } from '@/vitnode.config'; +import { + type EmailApiPlugin, + EmailModel, + type EmailModelSendArgs, +} from '@/api/models/email'; import { SessionModel } from '@/api/models/session'; import { SessionAdminModel } from '@/api/models/session-admin'; @@ -19,7 +23,7 @@ export interface EnvVitNode extends Env { Variables: EnvVariablesVitNode; } -interface EnvVariablesVitNode { +export interface EnvVariablesVitNode { admin: null | { user: { avatarColor: string; @@ -46,13 +50,24 @@ interface EnvVariablesVitNode { ssoAdapters: SSOApiPlugin[]; }; captcha?: Pick['captcha']; - emailAdapter?: EmailApiPlugin; + email?: { + adapter?: EmailApiPlugin; + options?: { + logo?: { + className?: string; + src: Blob | string; + }; + }; + }; metadata: { shortTitle?: string; title: string; }; }; db: Pick['dbProvider']; + email: { + send: (args: EmailModelSendArgs) => Promise; + }; ipAddress: string; log: LoggerMiddlewareType; plugin: { @@ -80,12 +95,12 @@ declare module 'hono' { export const globalMiddleware = ({ authorization, metadata, - emailAdapter, + email, dbProvider, captcha, }: Pick< VitNodeApiConfig, - 'authorization' | 'captcha' | 'dbProvider' | 'emailAdapter' + 'authorization' | 'captcha' | 'dbProvider' | 'email' > & Pick) => { return async (c: Context, next: Next) => { @@ -134,10 +149,11 @@ export const globalMiddleware = ({ // Fallback to localhost if nothing found c.set('ipAddress', ipAddress ?? '127.0.0.1'); c.set('db', dbProvider); + c.set('email', new EmailModel(c)); c.set('core', { metadata, - emailAdapter, + email, authorization: { cookieName: authorization?.cookieName ?? 'vitnode_auth', cookie_expires: diff --git a/packages/vitnode/src/api/middlewares/rate-limiter.middleware.ts b/packages/vitnode/src/api/middlewares/rate-limiter.middleware.ts index 6d45cea50..3b3f1852e 100644 --- a/packages/vitnode/src/api/middlewares/rate-limiter.middleware.ts +++ b/packages/vitnode/src/api/middlewares/rate-limiter.middleware.ts @@ -18,7 +18,7 @@ const createRateLimiter = ({ return new RateLimiterMemory({ keyPrefix, - points: CONFIG.node_development ? 120 : (options?.points ?? 80), // 120 req in dev, 80 in prod + points: options?.points ?? 80, // 80 in prod duration: options?.duration ?? 60, // per 60 seconds ...options, }); @@ -27,6 +27,13 @@ const createRateLimiter = ({ export const rateLimiterMiddleware = ( options?: Omit, ) => { + if (CONFIG.node_development) { + // In development, we disable the rate limiter for easier testing + return async (c: Context, next: Next) => { + await next(); + }; + } + const rateLimiter = createRateLimiter({ ...options, keyPrefix: 'vitnode-api-rate-limiter', @@ -37,10 +44,10 @@ export const rateLimiterMiddleware = ( try { await rateLimiter.consume(key); - - await next(); } catch { return c.text('Too Many Requests', 429); } + + await next(); }; }; diff --git a/packages/vitnode/src/api/models/device.ts b/packages/vitnode/src/api/models/device.ts index 629239a01..178c514b5 100644 --- a/packages/vitnode/src/api/models/device.ts +++ b/packages/vitnode/src/api/models/device.ts @@ -44,7 +44,7 @@ export class DeviceModel { httpOnly: true, secure: this.c.get('core').authorization.cookieSecure, path: '/', - domain: CONFIG.frontend.hostname, + domain: CONFIG.web.hostname, expires: new Date( Date.now() + this.c.get('core').authorization.deviceCookieExpires, ), diff --git a/packages/vitnode/src/api/models/email.ts b/packages/vitnode/src/api/models/email.ts index a2a0ee266..534476216 100644 --- a/packages/vitnode/src/api/models/email.ts +++ b/packages/vitnode/src/api/models/email.ts @@ -1,17 +1,31 @@ import type { Context, ContextVariableMap } from 'hono'; +import type React from 'react'; +import { render } from '@react-email/components'; import { HTTPException } from 'hono/http-exception'; +import DefaultTemplateEmail from '../../emails/default-template'; +import { CONFIG } from '../../lib/config'; + export interface EmailApiPlugin { sendEmail: (args: { html: string; metadata: ContextVariableMap['core']['metadata']; replyTo?: string; subject: string; + text: string; to: string; }) => Promise; } +export interface EmailModelSendArgs { + content: React.ReactNode; + html?: string; + replyTo?: string; + subject: string; + to: string; +} + export class EmailModel { constructor(c: Context) { this.c = c; @@ -19,27 +33,44 @@ export class EmailModel { protected readonly c: Context; - send(args: { html: string; replyTo?: string; subject: string; to: string }) { + async send({ html, replyTo, subject, to, content }: EmailModelSendArgs) { const core = this.c.get('core'); - const provider = core.emailAdapter; + const provider = core.email?.adapter; if (!provider) { throw new HTTPException(500, { message: 'Email provider not found', }); } - void provider - .sendEmail({ - ...args, + const htmlContent = + html ?? + DefaultTemplateEmail({ + children: content, + metadata: { + ...core.metadata, + url: CONFIG.web.href, + }, + logo: core.email?.options?.logo, + }); + + try { + await provider.sendEmail({ + html: await render(htmlContent), + to, + subject, + replyTo, metadata: core.metadata, - }) - .catch((err: unknown) => { - const error = - err instanceof Error - ? err - : new Error('Unknown error from email provider'); - - this.c.get('log').error(`Failed to send email: ${error.message}`); + text: await render(htmlContent, { + plainText: true, + }), }); + } catch (err) { + const error = + err instanceof Error + ? err + : new Error('Unknown error from email provider'); + + await this.c.get('log').error(`Failed to send email: ${error.message}`); + } } } diff --git a/packages/vitnode/src/api/models/session-admin.ts b/packages/vitnode/src/api/models/session-admin.ts index 79269c038..acbb70aa9 100644 --- a/packages/vitnode/src/api/models/session-admin.ts +++ b/packages/vitnode/src/api/models/session-admin.ts @@ -78,7 +78,7 @@ export class SessionAdminModel { expires: new Date( Date.now() + this.c.get('core').authorization.adminCookieExpires, ), - domain: CONFIG.frontend.hostname, + domain: CONFIG.web.hostname, }); return { token }; @@ -100,7 +100,7 @@ export class SessionAdminModel { deleteCookie(this.c, this.c.get('core').authorization.adminCookieName, { path: '/', - domain: CONFIG.frontend.hostname, + domain: CONFIG.web.hostname, }); } @@ -132,7 +132,7 @@ export class SessionAdminModel { if (!session) { deleteCookie(this.c, this.c.get('core').authorization.adminCookieName, { path: '/', - domain: CONFIG.frontend.hostname, + domain: CONFIG.web.hostname, }); return null; diff --git a/packages/vitnode/src/api/models/session.ts b/packages/vitnode/src/api/models/session.ts index 3849fb4db..8bff250af 100644 --- a/packages/vitnode/src/api/models/session.ts +++ b/packages/vitnode/src/api/models/session.ts @@ -56,7 +56,7 @@ export class SessionModel { Date.now() + this.c.get('core').authorization.cookie_expires, ) : undefined, - domain: CONFIG.frontend.hostname, + domain: CONFIG.web.hostname, }); return { token }; diff --git a/packages/vitnode/src/api/models/sso.ts b/packages/vitnode/src/api/models/sso.ts index 40dac8e21..69fa191b7 100644 --- a/packages/vitnode/src/api/models/sso.ts +++ b/packages/vitnode/src/api/models/sso.ts @@ -25,7 +25,7 @@ export interface SSOApiPlugin { } export const getRedirectUri = (code: string) => - new URL(`${CONFIG.frontend.href}login/sso/${code}`).toString(); + new URL(`${CONFIG.web.href}login/sso/${code}`).toString(); export class SSOModel { constructor(c: Context) { @@ -160,7 +160,7 @@ export class SSOModel { httpOnly: true, secure: this.c.get('core').authorization.cookieSecure, path: '/', - domain: CONFIG.frontend.hostname, + domain: CONFIG.web.hostname, }, ); diff --git a/packages/vitnode/src/api/models/user/sign-up.ts b/packages/vitnode/src/api/models/user/sign-up.ts index cd98e6977..611f3dbc1 100644 --- a/packages/vitnode/src/api/models/user/sign-up.ts +++ b/packages/vitnode/src/api/models/user/sign-up.ts @@ -59,7 +59,7 @@ const getDefaultData = async ( return { roleId: defaultRole.id, - emailVerified: !c.get('core').emailAdapter, + emailVerified: !c.get('core').email?.adapter, }; }; diff --git a/packages/vitnode/src/api/modules/middleware/route.ts b/packages/vitnode/src/api/modules/middleware/route.ts index 90179811d..2f25bd22b 100644 --- a/packages/vitnode/src/api/modules/middleware/route.ts +++ b/packages/vitnode/src/api/modules/middleware/route.ts @@ -36,7 +36,7 @@ export const routeMiddleware = buildRoute({ return c.json( { - isEmail: !!c.get('core').emailAdapter, + isEmail: !!c.get('core').email?.adapter, sso: sso.map(s => ({ id: s.id, name: s.name })), captcha: c.get('core').captcha ? { 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 ffb60135d..21f595b0d 100644 --- a/packages/vitnode/src/api/modules/users/routes/test.route.ts +++ b/packages/vitnode/src/api/modules/users/routes/test.route.ts @@ -3,8 +3,6 @@ import { z } from 'zod'; import { buildRoute } from '@/api/lib/route'; import { CONFIG_PLUGIN } from '@/config'; -// import { EmailModel } from '../../../models/email'; - export const testRoute = buildRoute({ ...CONFIG_PLUGIN, route: { @@ -30,16 +28,16 @@ export const testRoute = buildRoute({ }, }, }, - handler: c => { - // new EmailModel(c).send({ - // html: '

Test email

', - // to: 'ithereplay@gmail.com', - // subject: 'Test Email', - // }); + handler: async c => { + await c.get('email').send({ + to: 'ithereplay@gmail.com', + subject: 'Test Email', + content: 'This is a test email', + }); // throw new Error('Test error'); - c.get('log').warn('This is a test warn log'); + await c.get('log').warn('This is a test warn log'); return c.text('test'); }, diff --git a/packages/vitnode/src/emails/default-template.tsx b/packages/vitnode/src/emails/default-template.tsx new file mode 100644 index 000000000..a4b69d546 --- /dev/null +++ b/packages/vitnode/src/emails/default-template.tsx @@ -0,0 +1,124 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; +import { createTranslator } from 'next-intl'; + +import { CONFIG } from '../lib/config'; + +interface DefaultTemplateEmailProps { + children: React.ReactNode; + head?: React.ReactNode; + logo?: { + className?: string; + src: Blob | string; + }; + metadata: { + shortTitle?: string; + title: string; + url: string; + }; + previewText?: string; +} + +export default function DefaultTemplateEmail({ + previewText, + head, + children, + logo, + metadata, +}: DefaultTemplateEmailProps) { + const intl = createTranslator({ + messages: { + email: { + previewText: 'This is a preview text for the email template.', + }, + }, + locale: 'en', + }); + + return ( + + {head} + {previewText && {previewText}} + + + +
+ {logo ? ( + {metadata.title} + ) : ( + + {metadata.title} + + )} +
+ +
+ + Join Us for an Exciting Event! - {intl('email.previewText')} + + + Hello + + + + {children} + +
+ + {metadata.shortTitle ?? metadata.title} ©{' '} + {new Date().getFullYear()} + +
+
+
+ +
+ + ); +} + +DefaultTemplateEmail.PreviewProps = { + children: 'This is a preview text for the email template.', + metadata: { + title: 'VitNode - Email Template', + shortTitle: 'VitNode', + url: CONFIG.web.href, + }, + logo: { + src: 'https://www.reactemailtemplate.com/_next/static/media/reactemailtemplate-logo.b3fb12d9.png', + }, +} satisfies DefaultTemplateEmailProps; diff --git a/packages/vitnode/src/lib/config.ts b/packages/vitnode/src/lib/config.ts index c76739522..daa321aae 100644 --- a/packages/vitnode/src/lib/config.ts +++ b/packages/vitnode/src/lib/config.ts @@ -1,19 +1,14 @@ const ENVS = { - backend_url: process.env.NEXT_PUBLIC_BACKEND_URL, - backend_client_url: process.env.NEXT_PUBLIC_BACKEND_CLIENT_URL, - frontend_url: process.env.NEXT_PUBLIC_FRONTEND_URL, + api_url: process.env.NEXT_PUBLIC_API_URL, + web_url: process.env.NEXT_PUBLIC_WEB_URL, }; const urls = { - backend: new URL(ENVS.backend_url ?? 'http://localhost:3000'), - backend_client: new URL( - ENVS.backend_client_url ?? ENVS.backend_url ?? 'http://localhost:3000', - ), - frontend: new URL(ENVS.frontend_url ?? 'http://localhost:3000'), + api: new URL(ENVS.api_url ?? 'http://localhost:3000'), + web: new URL(ENVS.web_url ?? 'http://localhost:3000'), }; export const CONFIG = { node_development: process.env.NODE_ENV === 'development', - backend: urls.backend, - frontend: urls.frontend, + ...urls, }; diff --git a/packages/vitnode/src/lib/fetcher/core.ts b/packages/vitnode/src/lib/fetcher/core.ts index 505a73387..5e9de765c 100644 --- a/packages/vitnode/src/lib/fetcher/core.ts +++ b/packages/vitnode/src/lib/fetcher/core.ts @@ -92,8 +92,8 @@ export async function coreFetcher< // Construct the base URL const url = new URL( - `/api/${pluginId}${prefixPath}/${module}${formattedPath}`, - CONFIG.backend.origin, + `/api/${pluginId}${prefixPath}/${module}${formattedPath === '/' ? '' : formattedPath}`, + CONFIG.api.origin, ); // Add query parameters if they exist @@ -122,6 +122,13 @@ export async function coreFetcher< ...options, }); + if (!response.ok) { + const errorText = await response.text(); + throw new Error( + `${response.status} - ${url.toString()}\n${response.statusText ?? errorText}`, + ); + } + return response as InferResponseType< M, Routes, diff --git a/packages/vitnode/src/views/layouts/theme/header/header.tsx b/packages/vitnode/src/views/layouts/theme/header/header.tsx index 02f0aa311..8435ca715 100644 --- a/packages/vitnode/src/views/layouts/theme/header/header.tsx +++ b/packages/vitnode/src/views/layouts/theme/header/header.tsx @@ -21,13 +21,10 @@ export const HeaderLayout = ({ }) => { return (
-
+
{logo}
diff --git a/packages/vitnode/src/vitnode.config.ts b/packages/vitnode/src/vitnode.config.ts index a4d5bc977..6e5496b7f 100644 --- a/packages/vitnode/src/vitnode.config.ts +++ b/packages/vitnode/src/vitnode.config.ts @@ -50,7 +50,9 @@ export interface VitNodeApiConfig { type: 'cloudflare_turnstile' | 'recaptcha_v3'; }; dbProvider: PostgresJsDatabase; - emailAdapter?: EmailApiPlugin; + email?: { + adapter?: EmailApiPlugin; + }; plugins: BuildPluginApiReturn[]; rateLimiter?: Omit; } diff --git a/packages/vitnode/tsconfig.json b/packages/vitnode/tsconfig.json index 3b57a9356..40ac9aa7d 100644 --- a/packages/vitnode/tsconfig.json +++ b/packages/vitnode/tsconfig.json @@ -24,7 +24,7 @@ "include": [ "src", "scripts", - "emails", + "src/emails", "vitest.config.ts", "tsup.config.ts", "global.d.ts" diff --git a/plugins/blog/.npmignore b/plugins/blog/.npmignore index d951735a8..47d43e60f 100644 --- a/plugins/blog/.npmignore +++ b/plugins/blog/.npmignore @@ -17,5 +17,4 @@ /vitest.config.ts /tsconfig.json /scripts -/emails /config \ No newline at end of file diff --git a/plugins/blog/package.json b/plugins/blog/package.json index 3b6d4a6e2..312a8e526 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -33,28 +33,28 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@hono/zod-openapi": "^0.19.8", + "@hono/zod-openapi": "^0.19.9", "@vitnode/core": "workspace:*", - "drizzle-kit": "^0.31.3", + "drizzle-kit": "^0.31.4", "drizzle-orm": "^0.44.2", - "hono": "^4.8.3", - "lucide-react": "^0.523.0", - "next": "^15.3.4", - "next-intl": "^4.3.1", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-hook-form": "^7.58.1", - "sonner": "^2.0.5", - "zod": "^3.25.67" + "hono": "^4.8.4", + "lucide-react": "^0.525.0", + "next": "^15.3.5", + "next-intl": "^4.3.4", + "react": "^19.1", + "react-dom": "^19.1", + "react-hook-form": "^7.60.0", + "sonner": "^2.0.6", + "zod": "^3.25.74" }, "devDependencies": { "@swc/cli": "0.6.0", - "@swc/core": "^1.12.7", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", + "@swc/core": "^1.12.9", + "@types/react": "^19.1", + "@types/react-dom": "^19.1", "@vitnode/eslint-config": "workspace:*", "concurrently": "^9.2.0", - "eslint": "^9.29.0", + "eslint": "^9.30.1", "tsc-alias": "^1.8.16", "typescript": "^5.8.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ac995a78..bdec88066 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,34 +10,110 @@ importers: devDependencies: '@types/node': specifier: ^24 - version: 24.0.4 + version: 24.0.10 '@vitnode/eslint-config': specifier: workspace:* version: link:packages/eslint prettier: - specifier: ^3.6.1 - version: 3.6.1 + specifier: ^3.6.2 + version: 3.6.2 prettier-plugin-tailwindcss: specifier: ^0.6.13 - version: 0.6.13(prettier-plugin-astro@0.7.2)(prettier@3.6.1) - tsx: - specifier: ^4.20.3 - version: 4.20.3 + version: 0.6.13(prettier-plugin-astro@0.7.2)(prettier@3.6.2) turbo: specifier: ^2.5.4 version: 2.5.4 typescript: specifier: ^5.8.3 version: 5.8.3 + zod: + specifier: ^3.25.74 + version: 3.25.74 - apps/docs: + apps/api: dependencies: '@hono/zod-openapi': specifier: ^0.19.8 - version: 0.19.8(hono@4.8.3)(zod@3.25.67) + version: 0.19.9(hono@4.8.4)(zod@3.25.74) + '@hono/zod-validator': + specifier: ^0.7.0 + version: 0.7.0(hono@4.8.4)(zod@3.25.74) + '@react-email/components': + specifier: ^0.1.1 + version: 0.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@vitnode/core': + specifier: workspace:* + version: link:../../packages/vitnode + drizzle-kit: + specifier: ^0.31.3 + version: 0.31.4 + drizzle-orm: + 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.3 + version: 4.8.4 + next-intl: + specifier: ^4.3.1 + version: 4.3.4(next@15.3.5(@playwright/test@1.53.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 + version: 19.1.0 + react-dom: + specifier: ^19.1 + version: 19.1.0(react@19.1.0) + zod: + specifier: ^3.25.67 + version: 3.25.74 + devDependencies: + '@hono/node-server': + specifier: ^1.15.0 + version: 1.15.0(hono@4.8.4) + '@types/node': + specifier: ^24 + version: 24.0.10 + '@types/react': + specifier: ^19.1 + version: 19.1.8 + '@types/react-dom': + specifier: ^19.1 + version: 19.1.6(@types/react@19.1.8) + '@vitnode/eslint-config': + specifier: workspace:* + version: link:../../packages/eslint + dotenv: + specifier: ^17.1.0 + version: 17.1.0 + eslint: + specifier: ^9.29.0 + version: 9.30.1(jiti@2.4.2) + prettier: + specifier: ^3.6.1 + version: 3.6.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.12 + version: 0.6.13(prettier-plugin-astro@0.7.2)(prettier@3.6.2) + react-email: + specifier: ^4.0.17 + version: 4.0.17(@playwright/test@1.53.2)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + tsc-alias: + specifier: ^1.8.16 + version: 1.8.16 + tsx: + specifier: ^4.20.3 + version: 4.20.3 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + + apps/docs: + dependencies: + '@hono/zod-openapi': + specifier: ^0.19.9 + version: 0.19.9(hono@4.8.4)(zod@3.25.74) '@hono/zod-validator': specifier: ^0.7.0 - version: 0.7.0(hono@4.8.3)(zod@3.25.67) + version: 0.7.0(hono@4.8.4)(zod@3.25.74) '@vitnode/blog': specifier: workspace:* version: link:../../plugins/blog @@ -48,57 +124,54 @@ importers: specifier: 19.1.0-rc.2 version: 19.1.0-rc.2 drizzle-kit: - specifier: ^0.31.3 - version: 0.31.3 + specifier: ^0.31.4 + version: 0.31.4 drizzle-orm: 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) fumadocs-core: - specifier: ^15.6.0 - version: 15.6.0(@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) + specifier: ^15.6.1 + version: 15.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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.10 - version: 11.6.10(@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.6.0(@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.6.0(@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.7)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 11.6.10(@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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.5(@playwright/test@1.53.2)(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.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) fumadocs-ui: - specifier: ^15.6.0 - version: 15.6.0(@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.11) + specifier: ^15.6.1 + version: 15.6.1(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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.11) hono: - specifier: ^4.8.3 - version: 4.8.3 + specifier: ^4.8.4 + version: 4.8.4 lucide-react: - specifier: ^0.517.0 - version: 0.517.0(react@19.1.0) + specifier: ^0.525.0 + version: 0.525.0(react@19.1.0) motion: - specifier: ^12.20.1 - version: 12.20.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^12.23.0 + version: 12.23.0(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.1)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^15.3.5 + version: 15.3.5(@playwright/test@1.53.2)(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.3.1 - version: 4.3.1(next@15.3.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) + specifier: ^4.3.4 + version: 4.3.4(next@15.3.5(@playwright/test@1.53.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 + specifier: ^19.1 version: 19.1.0 react-dom: - specifier: ^19.1.0 + specifier: ^19.1 version: 19.1.0(react@19.1.0) react-hook-form: - specifier: ^7.58.1 - version: 7.58.1(react@19.1.0) + specifier: ^7.60.0 + version: 7.60.0(react@19.1.0) react-use: specifier: ^17.6.0 version: 17.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) sonner: - specifier: ^2.0.5 - version: 2.0.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - zod: - specifier: ^3.25.67 - version: 3.25.67 + specifier: ^2.0.6 + version: 2.0.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) devDependencies: '@playwright/test': - specifier: ^1.53.1 - version: 1.53.1 + specifier: ^1.53.2 + version: 1.53.2 '@tailwindcss/postcss': specifier: ^4.1.11 version: 4.1.11 @@ -106,13 +179,13 @@ importers: specifier: ^2.0.13 version: 2.0.13 '@types/node': - specifier: ^24.0.7 - version: 24.0.7 + specifier: ^24.0.10 + version: 24.0.10 '@types/react': - specifier: ^19.1.8 + specifier: ^19.1 version: 19.1.8 '@types/react-dom': - specifier: ^19.1.6 + specifier: ^19.1 version: 19.1.6(@types/react@19.1.8) '@vitnode/eslint-config': specifier: workspace:* @@ -120,18 +193,15 @@ importers: class-variance-authority: specifier: ^0.7.1 version: 0.7.1 - dotenv: - specifier: ^16.6.0 - version: 16.6.0 eslint: - specifier: ^9.29.0 - version: 9.29.0(jiti@2.4.2) + specifier: ^9.30.1 + version: 9.30.1(jiti@2.4.2) postcss: specifier: ^8.5.6 version: 8.5.6 react-email: specifier: ^4.0.17 - version: 4.0.17(@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) + version: 4.0.17(@playwright/test@1.53.2)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) shiki: specifier: ^3.7.0 version: 3.7.0 @@ -139,17 +209,20 @@ importers: specifier: ^4.1.11 version: 4.1.11 tw-animate-css: - specifier: ^1.3.4 - version: 1.3.4 + specifier: ^1.3.5 + version: 1.3.5 typescript: specifier: ^5.8.3 version: 5.8.3 + zod: + specifier: ^3.25.74 + version: 3.25.74 packages/create-vitnode-app: dependencies: '@inquirer/prompts': - specifier: ^7.5.3 - version: 7.5.3(@types/node@24.0.4) + specifier: ^7.6.0 + version: 7.6.0(@types/node@24.0.10) commander: specifier: ^14.0.0 version: 14.0.0 @@ -164,8 +237,8 @@ importers: version: 6.0.1 devDependencies: '@types/node': - specifier: ^24 - version: 24.0.4 + specifier: ^24.0.10 + version: 24.0.10 '@types/prompts': specifier: ^2.4.9 version: 2.4.9 @@ -176,8 +249,8 @@ importers: specifier: workspace:* version: link:../eslint eslint: - specifier: ^9.29.0 - version: 9.29.0(jiti@2.4.2) + specifier: ^9.30.1 + version: 9.30.1(jiti@2.4.2) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -185,41 +258,41 @@ importers: packages/eslint: dependencies: '@eslint/js': - specifier: ^9.29.0 - version: 9.29.0 + specifier: ^9.30.1 + version: 9.30.1 eslint: specifier: ^9.0.0 - version: 9.29.0(jiti@2.4.2) + version: 9.30.1(jiti@2.4.2) eslint-config-prettier: specifier: ^10.1.5 - version: 10.1.5(eslint@9.29.0(jiti@2.4.2)) + version: 10.1.5(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-jsx-a11y: specifier: ^6.10.2 - version: 6.10.2(eslint@9.29.0(jiti@2.4.2)) + version: 6.10.2(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-perfectionist: specifier: ^4.15.0 - version: 4.15.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + version: 4.15.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-prettier: specifier: ^5.5.1 - version: 5.5.1(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.29.0(jiti@2.4.2)))(eslint@9.29.0(jiti@2.4.2))(prettier@3.6.1) + version: 5.5.1(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.29.0(jiti@2.4.2)) + version: 7.37.5(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.29.0(jiti@2.4.2)) + version: 19.1.0-rc.2(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-react-hooks: specifier: 6.0.0-rc1 - version: 6.0.0-rc1(eslint@9.29.0(jiti@2.4.2)) + version: 6.0.0-rc1(eslint@9.30.1(jiti@2.4.2)) prettier: specifier: ^3.0.0 - version: 3.6.1 + version: 3.6.2 prettier-plugin-tailwindcss: specifier: ^0.6.13 - version: 0.6.13(prettier-plugin-astro@0.7.2)(prettier@3.6.1) + version: 0.6.13(prettier-plugin-astro@0.7.2)(prettier@3.6.2) typescript-eslint: - specifier: ^8.35.0 - version: 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^8.35.1 + version: 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) devDependencies: typescript: specifier: ^5.8.3 @@ -232,10 +305,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.3) + version: 0.5.2(hono@4.8.4) '@tanstack/react-query': - specifier: ^5.81.2 - version: 5.81.2(react@19.1.0) + specifier: ^5.81.5 + version: 5.81.5(react@19.1.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -245,9 +318,6 @@ importers: cmdk: specifier: ^1.1.1 version: 1.1.1(@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) - dotenv: - specifier: ^16.6.0 - version: 16.6.0 input-otp: specifier: ^1.4.2 version: 1.4.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -255,8 +325,8 @@ importers: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) nodemailer: - specifier: ^7.0.3 - version: 7.0.3 + specifier: ^7.0.4 + version: 7.0.4 postgres: specifier: ^3.4.7 version: 3.4.7 @@ -267,8 +337,8 @@ importers: specifier: ^7.1.1 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.7)(@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.1) + specifier: ^0.4.3 + version: 0.4.3(@types/react@19.1.8)(next@15.3.5(@babel/core@7.28.0)(@playwright/test@1.53.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)(rollup@4.44.2) resend: specifier: ^4.6.0 version: 4.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -283,23 +353,23 @@ importers: version: 1.1.2(@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) devDependencies: '@hono/zod-openapi': - specifier: ^0.19.8 - version: 0.19.8(hono@4.8.3)(zod@3.25.67) + specifier: ^0.19.9 + version: 0.19.9(hono@4.8.4)(zod@3.25.74) '@hono/zod-validator': specifier: ^0.7.0 - version: 0.7.0(hono@4.8.3)(zod@3.25.67) + version: 0.7.0(hono@4.8.4)(zod@3.25.74) '@hookform/resolvers': specifier: ^5.1.1 - version: 5.1.1(react-hook-form@7.58.1(react@19.1.0)) + version: 5.1.1(react-hook-form@7.60.0(react@19.1.0)) '@react-email/components': - specifier: ^0.1.0 + specifier: ^0.1.1 version: 0.1.1(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.7)(chokidar@4.0.3) + version: 0.6.0(@swc/core@1.12.9)(chokidar@4.0.3) '@swc/core': - specifier: ^1.12.7 - version: 1.12.7 + specifier: ^1.12.9 + version: 1.12.9 '@testing-library/dom': specifier: ^10.4.0 version: 10.4.0 @@ -307,8 +377,8 @@ importers: specifier: ^16.3.0 version: 16.3.0(@testing-library/dom@10.4.0)(@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) '@types/node': - specifier: ^24 - version: 24.0.4 + specifier: ^24.0.10 + version: 24.0.10 '@types/nodemailer': specifier: ^6.4.17 version: 6.4.17 @@ -320,10 +390,10 @@ importers: version: 19.1.6(@types/react@19.1.8) '@vitejs/plugin-react': specifier: ^4.6.0 - version: 4.6.0(vite@7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.6.0(vite@7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) '@vitnode/eslint-config': specifier: workspace:* version: link:../eslint @@ -333,45 +403,48 @@ importers: concurrently: specifier: ^9.2.0 version: 9.2.0 + dotenv: + specifier: ^17.1.0 + version: 17.1.0 drizzle-kit: - specifier: ^0.31.3 - version: 0.31.3 + specifier: ^0.31.4 + version: 0.31.4 drizzle-orm: 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) eslint: - specifier: ^9.29.0 - version: 9.29.0(jiti@2.4.2) + specifier: ^9.30.1 + version: 9.30.1(jiti@2.4.2) hono: - specifier: ^4.8.3 - version: 4.8.3 + specifier: ^4.8.4 + version: 4.8.4 jsdom: specifier: ^26.1.0 version: 26.1.0 lucide-react: - specifier: ^0.523.0 - version: 0.523.0(react@19.1.0) + specifier: ^0.525.0 + version: 0.525.0(react@19.1.0) next: - specifier: ^15.3.4 - version: 15.3.4(@babel/core@7.27.7)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^15.3.5 + version: 15.3.5(@babel/core@7.28.0)(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-intl: - specifier: ^4.3.1 - version: 4.3.1(next@15.3.4(@babel/core@7.27.7)(@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) + specifier: ^4.3.4 + version: 4.3.4(next@15.3.5(@babel/core@7.28.0)(@playwright/test@1.53.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 + specifier: ^19.1 version: 19.1.0 react-dom: - specifier: ^19.1.0 + specifier: ^19.1 version: 19.1.0(react@19.1.0) react-email: specifier: ^4.0.17 - version: 4.0.17(@babel/core@7.27.7)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 4.0.17(@babel/core@7.28.0)(@playwright/test@1.53.2)(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) + specifier: ^7.60.0 + version: 7.60.0(react@19.1.0) sonner: - specifier: ^2.0.5 - version: 2.0.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^2.0.6 + version: 2.0.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) tailwindcss: specifier: ^4.1.11 version: 4.1.11 @@ -380,79 +453,79 @@ importers: version: 1.8.16 tsup: specifier: ^8.5.0 - version: 8.5.0(@swc/core@1.12.7)(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.9)(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 tw-animate-css: - specifier: ^1.3.4 - version: 1.3.4 + specifier: ^1.3.5 + version: 1.3.5 typescript: specifier: ^5.8.3 version: 5.8.3 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 5.1.4(typescript@5.8.3)(vite@7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) zod: - specifier: ^3.25.67 - version: 3.25.67 + specifier: ^3.25.74 + version: 3.25.74 plugins/blog: dependencies: '@hono/zod-openapi': - specifier: ^0.19.8 - version: 0.19.8(hono@4.8.3)(zod@3.25.67) + specifier: ^0.19.9 + version: 0.19.9(hono@4.8.4)(zod@3.25.74) '@vitnode/core': specifier: workspace:* version: link:../../packages/vitnode drizzle-kit: - specifier: ^0.31.3 - version: 0.31.3 + specifier: ^0.31.4 + version: 0.31.4 drizzle-orm: 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.3 - version: 4.8.3 + specifier: ^4.8.4 + version: 4.8.4 lucide-react: - specifier: ^0.523.0 - version: 0.523.0(react@19.1.0) + specifier: ^0.525.0 + version: 0.525.0(react@19.1.0) next: - specifier: ^15.3.4 - 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) + specifier: ^15.3.5 + version: 15.3.5(@playwright/test@1.53.2)(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.3.1 - version: 4.3.1(next@15.3.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) + specifier: ^4.3.4 + version: 4.3.4(next@15.3.5(@playwright/test@1.53.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 + specifier: ^19.1 version: 19.1.0 react-dom: - specifier: ^19.1.0 + specifier: ^19.1 version: 19.1.0(react@19.1.0) react-hook-form: - specifier: ^7.58.1 - version: 7.58.1(react@19.1.0) + specifier: ^7.60.0 + version: 7.60.0(react@19.1.0) sonner: - specifier: ^2.0.5 - version: 2.0.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^2.0.6 + version: 2.0.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) zod: - specifier: ^3.25.67 - version: 3.25.67 + specifier: ^3.25.74 + version: 3.25.74 devDependencies: '@swc/cli': specifier: 0.6.0 - version: 0.6.0(@swc/core@1.12.7)(chokidar@4.0.3) + version: 0.6.0(@swc/core@1.12.9)(chokidar@4.0.3) '@swc/core': - specifier: ^1.12.7 - version: 1.12.7 + specifier: ^1.12.9 + version: 1.12.9 '@types/react': - specifier: ^19.1.8 + specifier: ^19.1 version: 19.1.8 '@types/react-dom': - specifier: ^19.1.6 + specifier: ^19.1 version: 19.1.6(@types/react@19.1.8) '@vitnode/eslint-config': specifier: workspace:* @@ -461,8 +534,8 @@ importers: specifier: ^9.2.0 version: 9.2.0 eslint: - specifier: ^9.29.0 - version: 9.29.0(jiti@2.4.2) + specifier: ^9.30.1 + version: 9.30.1(jiti@2.4.2) tsc-alias: specifier: ^1.8.16 version: 1.8.16 @@ -495,16 +568,16 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.7': - resolution: {integrity: sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==} + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.7': - resolution: {integrity: sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==} + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -521,6 +594,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.27.1': resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} @@ -569,8 +646,8 @@ packages: resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.7': - resolution: {integrity: sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==} + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} engines: {node: '>=6.0.0'} hasBin: true @@ -607,12 +684,12 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.7': - resolution: {integrity: sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==} + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.7': - resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==} + '@babel/types@7.28.0': + resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': @@ -975,12 +1052,12 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.20.1': - resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.2.3': - resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.14.0': @@ -995,8 +1072,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.29.0': - resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==} + '@eslint/js@9.30.1': + resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -1007,20 +1084,20 @@ packages: resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@floating-ui/core@1.7.1': - resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} + '@floating-ui/core@1.7.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} - '@floating-ui/dom@1.7.1': - resolution: {integrity: sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==} + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} - '@floating-ui/react-dom@2.1.3': - resolution: {integrity: sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==} + '@floating-ui/react-dom@2.1.4': + resolution: {integrity: sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} '@formatjs/ecma402-abstract@2.3.4': resolution: {integrity: sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==} @@ -1046,13 +1123,19 @@ packages: fumadocs-core: ^14.0.0 || ^15.0.0 react: 18.x.x || 19.x.x + '@hono/node-server@1.15.0': + resolution: {integrity: sha512-MjmK4l5N4dQpZ9OSWN0tCj7ejuc7WvuWMzSKtc89bnknJykAeHxzRigXBTYZk85H6Awrii6RM59iUiUluApu2A==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + '@hono/swagger-ui@0.5.2': resolution: {integrity: sha512-7wxLKdb8h7JTdZ+K8DJNE3KXQMIpJejkBTQjrYlUWF28Z1PGOKw6kUykARe5NTfueIN37jbyG/sBYsbzXzG53A==} peerDependencies: hono: '*' - '@hono/zod-openapi@0.19.8': - resolution: {integrity: sha512-CHUSW0K+bDGUYXovxQSbVjZffzoPeTsGu6wevPoGSmBdPuUw5yZqDeomnvyAAAAvEjhLQPlAsUyASc1Zi35exQ==} + '@hono/zod-openapi@0.19.9': + resolution: {integrity: sha512-TonPfh8xUdsdzWNMiKOYSG4Wk2DkZIShHZoXkdOSjPmqpnobXpvSQU3w3XmB7N2t12I2NnnoGSHyMj+BXk+1bw==} engines: {node: '>=16.0.0'} peerDependencies: hono: '>=4.3.6' @@ -1205,8 +1288,8 @@ packages: cpu: [x64] os: [win32] - '@inquirer/checkbox@4.1.8': - resolution: {integrity: sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg==} + '@inquirer/checkbox@4.1.9': + resolution: {integrity: sha512-DBJBkzI5Wx4jFaYm221LHvAhpKYkhVS0k9plqHwaHhofGNxvYB7J3Bz8w+bFJ05zaMb0sZNHo4KdmENQFlNTuQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1214,8 +1297,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.12': - resolution: {integrity: sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==} + '@inquirer/confirm@5.1.13': + resolution: {integrity: sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1223,8 +1306,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.13': - resolution: {integrity: sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==} + '@inquirer/core@10.1.14': + resolution: {integrity: sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1232,8 +1315,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.13': - resolution: {integrity: sha512-WbicD9SUQt/K8O5Vyk9iC2ojq5RHoCLK6itpp2fHsWe44VxxcA9z3GTWlvjSTGmMQpZr+lbVmrxdHcumJoLbMA==} + '@inquirer/editor@4.2.14': + resolution: {integrity: sha512-yd2qtLl4QIIax9DTMZ1ZN2pFrrj+yL3kgIWxm34SS6uwCr0sIhsNyudUjAo5q3TqI03xx4SEBkUJqZuAInp9uA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1241,8 +1324,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.15': - resolution: {integrity: sha512-4Y+pbr/U9Qcvf+N/goHzPEXiHH8680lM3Dr3Y9h9FFw4gHS+zVpbj8LfbKWIb/jayIB4aSO4pWiBTrBYWkvi5A==} + '@inquirer/expand@4.0.16': + resolution: {integrity: sha512-oiDqafWzMtofeJyyGkb1CTPaxUkjIcSxePHHQCfif8t3HV9pHcw1Kgdw3/uGpDvaFfeTluwQtWiqzPVjAqS3zA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1254,8 +1337,8 @@ packages: resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} engines: {node: '>=18'} - '@inquirer/input@4.1.12': - resolution: {integrity: sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==} + '@inquirer/input@4.2.0': + resolution: {integrity: sha512-opqpHPB1NjAmDISi3uvZOTrjEEU5CWVu/HBkDby8t93+6UxYX0Z7Ps0Ltjm5sZiEbWenjubwUkivAEYQmy9xHw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1263,8 +1346,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.15': - resolution: {integrity: sha512-xWg+iYfqdhRiM55MvqiTCleHzszpoigUpN5+t1OMcRkJrUrw7va3AzXaxvS+Ak7Gny0j2mFSTv2JJj8sMtbV2g==} + '@inquirer/number@3.0.16': + resolution: {integrity: sha512-kMrXAaKGavBEoBYUCgualbwA9jWUx2TjMA46ek+pEKy38+LFpL9QHlTd8PO2kWPUgI/KB+qi02o4y2rwXbzr3Q==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1272,8 +1355,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.15': - resolution: {integrity: sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==} + '@inquirer/password@4.0.16': + resolution: {integrity: sha512-g8BVNBj5Zeb5/Y3cSN+hDUL7CsIFDIuVxb9EPty3lkxBaYpjL5BNRKSYOF9yOLe+JOcKFd+TSVeADQ4iSY7rbg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1281,8 +1364,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.5.3': - resolution: {integrity: sha512-8YL0WiV7J86hVAxrh3fE5mDCzcTDe1670unmJRz6ArDgN+DBK1a0+rbnNWp4DUB5rPMwqD5ZP6YHl9KK1mbZRg==} + '@inquirer/prompts@7.6.0': + resolution: {integrity: sha512-jAhL7tyMxB3Gfwn4HIJ0yuJ5pvcB5maYUcouGcgd/ub79f9MqZ+aVnBtuFf+VC2GTkCBF+R+eo7Vi63w5VZlzw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1290,8 +1373,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.1.3': - resolution: {integrity: sha512-7XrV//6kwYumNDSsvJIPeAqa8+p7GJh7H5kRuxirct2cgOcSWwwNGoXDRgpNFbY/MG2vQ4ccIWCi8+IXXyFMZA==} + '@inquirer/rawlist@4.1.4': + resolution: {integrity: sha512-5GGvxVpXXMmfZNtvWw4IsHpR7RzqAR624xtkPd1NxxlV5M+pShMqzL4oRddRkg8rVEOK9fKdJp1jjVML2Lr7TQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1299,8 +1382,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.0.15': - resolution: {integrity: sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==} + '@inquirer/search@3.0.16': + resolution: {integrity: sha512-POCmXo+j97kTGU6aeRjsPyuCpQQfKcMXdeTMw708ZMtWrj5aykZvlUxH4Qgz3+Y1L/cAVZsSpA+UgZCu2GMOMg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1308,8 +1391,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.2.3': - resolution: {integrity: sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==} + '@inquirer/select@4.2.4': + resolution: {integrity: sha512-unTppUcTjmnbl/q+h8XeQDhAqIOmwWYWNyiiP2e3orXrg6tOaa5DHXja9PChCSbChOsktyKgOieRZFnajzxoBg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1346,180 +1429,172 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/sourcemap-codec@1.5.2': - resolution: {integrity: sha512-gKYheCylLIedI+CSZoDtGkFV9YEBxRRVcfCH7OfAqh4TyUyRjEE6WVE/aXDXX0p8BIe/QgLcaAoI0220KRRFgg==} + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} - '@napi-rs/nice-android-arm-eabi@1.0.1': - resolution: {integrity: sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==} + '@napi-rs/nice-android-arm-eabi@1.0.4': + resolution: {integrity: sha512-OZFMYUkih4g6HCKTjqJHhMUlgvPiDuSLZPbPBWHLjKmFTv74COzRlq/gwHtmEVaR39mJQ6ZyttDl2HNMUbLVoA==} engines: {node: '>= 10'} cpu: [arm] os: [android] - '@napi-rs/nice-android-arm64@1.0.1': - resolution: {integrity: sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==} + '@napi-rs/nice-android-arm64@1.0.4': + resolution: {integrity: sha512-k8u7cjeA64vQWXZcRrPbmwjH8K09CBnNaPnI9L1D5N6iMPL3XYQzLcN6WwQonfcqCDv5OCY3IqX89goPTV4KMw==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/nice-darwin-arm64@1.0.1': - resolution: {integrity: sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==} + '@napi-rs/nice-darwin-arm64@1.0.4': + resolution: {integrity: sha512-GsLdQvUcuVzoyzmtjsThnpaVEizAqH5yPHgnsBmq3JdVoVZHELFo7PuJEdfOH1DOHi2mPwB9sCJEstAYf3XCJA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/nice-darwin-x64@1.0.1': - resolution: {integrity: sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==} + '@napi-rs/nice-darwin-x64@1.0.4': + resolution: {integrity: sha512-1y3gyT3e5zUY5SxRl3QDtJiWVsbkmhtUHIYwdWWIQ3Ia+byd/IHIEpqAxOGW1nhhnIKfTCuxBadHQb+yZASVoA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/nice-freebsd-x64@1.0.1': - resolution: {integrity: sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==} + '@napi-rs/nice-freebsd-x64@1.0.4': + resolution: {integrity: sha512-06oXzESPRdXUuzS8n2hGwhM2HACnDfl3bfUaSqLGImM8TA33pzDXgGL0e3If8CcFWT98aHows5Lk7xnqYNGFeA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@napi-rs/nice-linux-arm-gnueabihf@1.0.1': - resolution: {integrity: sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==} + '@napi-rs/nice-linux-arm-gnueabihf@1.0.4': + resolution: {integrity: sha512-CgklZ6g8WL4+EgVVkxkEvvsi2DSLf9QIloxWO0fvQyQBp6VguUSX3eHLeRpqwW8cRm2Hv/Q1+PduNk7VK37VZw==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@napi-rs/nice-linux-arm64-gnu@1.0.1': - resolution: {integrity: sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==} + '@napi-rs/nice-linux-arm64-gnu@1.0.4': + resolution: {integrity: sha512-wdAJ7lgjhAlsANUCv0zi6msRwq+D4KDgU+GCCHssSxWmAERZa2KZXO0H2xdmoJ/0i03i6YfK/sWaZgUAyuW2oQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/nice-linux-arm64-musl@1.0.1': - resolution: {integrity: sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==} + '@napi-rs/nice-linux-arm64-musl@1.0.4': + resolution: {integrity: sha512-4b1KYG+sriufhFrpUS9uNOEYYJqSfcbnwGx6uGX7JjrH8tELG90cOpCawz5THNIwlS3DhLgnCOcn0+4p6z26QA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/nice-linux-ppc64-gnu@1.0.1': - resolution: {integrity: sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==} + '@napi-rs/nice-linux-ppc64-gnu@1.0.4': + resolution: {integrity: sha512-iaf3vMRgr23oe1PUaKpxaH3DS0IMN0+N9iEiWVwYPm/U15vZFYdqVegGfN2PzrZLUl5lc8ZxbmEKDfuqslhAMA==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] - '@napi-rs/nice-linux-riscv64-gnu@1.0.1': - resolution: {integrity: sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==} + '@napi-rs/nice-linux-riscv64-gnu@1.0.4': + resolution: {integrity: sha512-UXoREY6Yw6rHrGuTwQgBxpfjK34t6mTjibE9/cXbefL9AuUCJ9gEgwNKZiONuR5QGswChqo9cnthjdKkYyAdDg==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - '@napi-rs/nice-linux-s390x-gnu@1.0.1': - resolution: {integrity: sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==} + '@napi-rs/nice-linux-s390x-gnu@1.0.4': + resolution: {integrity: sha512-eFbgYCRPmsqbYPAlLYU5hYTNbogmIDUvknilehHsFhCH1+0/kN87lP+XaLT0Yeq4V/rpwChSd9vlz4muzFArtw==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] - '@napi-rs/nice-linux-x64-gnu@1.0.1': - resolution: {integrity: sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==} + '@napi-rs/nice-linux-x64-gnu@1.0.4': + resolution: {integrity: sha512-4T3E6uTCwWT6IPnwuPcWVz3oHxvEp/qbrCxZhsgzwTUBEwu78EGNXGdHfKJQt3soth89MLqZJw+Zzvnhrsg1mQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/nice-linux-x64-musl@1.0.1': - resolution: {integrity: sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==} + '@napi-rs/nice-linux-x64-musl@1.0.4': + resolution: {integrity: sha512-NtbBkAeyBPLvCBkWtwkKXkNSn677eaT0cX3tygq+2qVv71TmHgX4gkX6o9BXjlPzdgPGwrUudavCYPT9tzkEqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/nice-win32-arm64-msvc@1.0.1': - resolution: {integrity: sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==} + '@napi-rs/nice-win32-arm64-msvc@1.0.4': + resolution: {integrity: sha512-vubOe3i+YtSJGEk/++73y+TIxbuVHi+W8ZzrRm2eETCjCRwNlgbfToQZ85dSA+4iBB/NJRGNp+O4hfdbbttZWA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@napi-rs/nice-win32-ia32-msvc@1.0.1': - resolution: {integrity: sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==} + '@napi-rs/nice-win32-ia32-msvc@1.0.4': + resolution: {integrity: sha512-BMOVrUDZeg1RNRKVlh4eyLv5djAAVLiSddfpuuQ47EFjBcklg0NUeKMFKNrKQR4UnSn4HAiACLD7YK7koskwmg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@napi-rs/nice-win32-x64-msvc@1.0.1': - resolution: {integrity: sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==} + '@napi-rs/nice-win32-x64-msvc@1.0.4': + resolution: {integrity: sha512-kCNk6HcRZquhw/whwh4rHsdPyOSCQCgnVDVik+Y9cuSVTDy3frpiCJTScJqPPS872h4JgZKkr/+CwcwttNEo9Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/nice@1.0.1': - resolution: {integrity: sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==} + '@napi-rs/nice@1.0.4': + resolution: {integrity: sha512-Sqih1YARrmMoHlXGgI9JrrgkzxcaaEso0AH+Y7j8NHonUs+xe4iDsgC3IBIDNdzEewbNpccNN6hip+b5vmyRLw==} engines: {node: '>= 10'} '@neondatabase/serverless@0.10.4': resolution: {integrity: sha512-2nZuh3VUO9voBauuh+IGYRhGU/MskWHt1IuZvHcJw6GLjDgtqj/KViKo7SIrLdGLdot7vFbiRRw+BgEy3wT9HA==} - '@next/env@15.3.4': - resolution: {integrity: sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ==} + '@next/env@15.3.5': + resolution: {integrity: sha512-7g06v8BUVtN2njAX/r8gheoVffhiKFVt4nx74Tt6G4Hqw9HCLYQVx/GkH2qHvPtAHZaUNZ0VXAa0pQP6v1wk7g==} - '@next/swc-darwin-arm64@15.3.4': - resolution: {integrity: sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg==} + '@next/swc-darwin-arm64@15.3.5': + resolution: {integrity: sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.4': - resolution: {integrity: sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw==} + '@next/swc-darwin-x64@15.3.5': + resolution: {integrity: sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.4': - resolution: {integrity: sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g==} + '@next/swc-linux-arm64-gnu@15.3.5': + resolution: {integrity: sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.4': - resolution: {integrity: sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw==} + '@next/swc-linux-arm64-musl@15.3.5': + resolution: {integrity: sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.4': - resolution: {integrity: sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg==} + '@next/swc-linux-x64-gnu@15.3.5': + resolution: {integrity: sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.4': - resolution: {integrity: sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A==} + '@next/swc-linux-x64-musl@15.3.5': + resolution: {integrity: sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.4': - resolution: {integrity: sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ==} + '@next/swc-win32-arm64-msvc@15.3.5': + resolution: {integrity: sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.4': - resolution: {integrity: sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg==} + '@next/swc-win32-x64-msvc@15.3.5': + resolution: {integrity: sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1536,8 +1611,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@orama/orama@3.1.9': - resolution: {integrity: sha512-UXQYvN0DYl5EMOXX3O0Rwke+0R0Pd7PW/hOVwgpPd6KKJPb3RP74m3PEbEFjdTzZVLUW81o7herYXD2h4PVcGQ==} + '@orama/orama@3.1.10': + resolution: {integrity: sha512-YNou2xlCIgPhMDe1TBEmp1wsAPFCL7Fd11rct7YfXYYiNAVBNL2rWoEydJRDJFVmqgt0l6mzSg35sDQ3i8yfKQ==} engines: {node: '>= 20.0.0'} '@petamoriken/float16@3.9.2': @@ -1561,13 +1636,13 @@ packages: resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.53.1': - resolution: {integrity: sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==} + '@playwright/test@1.53.2': + resolution: {integrity: sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw==} engines: {node: '>=18'} hasBin: true - '@preact/signals-core@1.10.0': - resolution: {integrity: sha512-qlKeXlfqtlC+sjxCPHt6Sk0/dXBrKZVcPlianqjNc/vW263YBFiP5mRrgKpHoO0q222Thm1TdYQWfCKpbbgvwA==} + '@preact/signals-core@1.11.0': + resolution: {integrity: sha512-jglbibeWHuFRzEWVFY/TT7wB1PppJxmcSfUHcK+2J9vBRtiooMfw6tAPttojNYrrpdGViqAYCbPpmWYlMm+eMQ==} '@preact/signals@1.3.2': resolution: {integrity: sha512-naxcJgUJ6BTOROJ7C3QML7KvwKwCXQJYTc5L/b0eEsdYgPB6SxwoQ1vDGcS0Q7GVjAenVq/tXrybVdFShHYZWg==} @@ -2408,103 +2483,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.44.1': - resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} + '@rollup/rollup-android-arm-eabi@4.44.2': + resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.44.1': - resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} + '@rollup/rollup-android-arm64@4.44.2': + resolution: {integrity: sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.44.1': - resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} + '@rollup/rollup-darwin-arm64@4.44.2': + resolution: {integrity: sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.44.1': - resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} + '@rollup/rollup-darwin-x64@4.44.2': + resolution: {integrity: sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.44.1': - resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} + '@rollup/rollup-freebsd-arm64@4.44.2': + resolution: {integrity: sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.44.1': - resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} + '@rollup/rollup-freebsd-x64@4.44.2': + resolution: {integrity: sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.44.1': - resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.44.2': + resolution: {integrity: sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.44.1': - resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} + '@rollup/rollup-linux-arm-musleabihf@4.44.2': + resolution: {integrity: sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.44.1': - resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} + '@rollup/rollup-linux-arm64-gnu@4.44.2': + resolution: {integrity: sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.44.1': - resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} + '@rollup/rollup-linux-arm64-musl@4.44.2': + resolution: {integrity: sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.44.1': - resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} + '@rollup/rollup-linux-loongarch64-gnu@4.44.2': + resolution: {integrity: sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': - resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': + resolution: {integrity: sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.44.1': - resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} + '@rollup/rollup-linux-riscv64-gnu@4.44.2': + resolution: {integrity: sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.44.1': - resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} + '@rollup/rollup-linux-riscv64-musl@4.44.2': + resolution: {integrity: sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.44.1': - resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} + '@rollup/rollup-linux-s390x-gnu@4.44.2': + resolution: {integrity: sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.44.1': - resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} + '@rollup/rollup-linux-x64-gnu@4.44.2': + resolution: {integrity: sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.44.1': - resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} + '@rollup/rollup-linux-x64-musl@4.44.2': + resolution: {integrity: sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.44.1': - resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} + '@rollup/rollup-win32-arm64-msvc@4.44.2': + resolution: {integrity: sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.44.1': - resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} + '@rollup/rollup-win32-ia32-msvc@4.44.2': + resolution: {integrity: sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.44.1': - resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} + '@rollup/rollup-win32-x64-msvc@4.44.2': + resolution: {integrity: sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==} cpu: [x64] os: [win32] @@ -2568,68 +2643,68 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.12.7': - resolution: {integrity: sha512-w6BBT0hBRS56yS+LbReVym0h+iB7/PpCddqrn1ha94ra4rZ4R/A91A/rkv+LnQlPqU/+fhqdlXtCJU9mrhCBtA==} + '@swc/core-darwin-arm64@1.12.9': + resolution: {integrity: sha512-GACFEp4nD6V+TZNR2JwbMZRHB+Yyvp14FrcmB6UCUYmhuNWjkxi+CLnEvdbuiKyQYv0zA+TRpCHZ+whEs6gwfA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.12.7': - resolution: {integrity: sha512-jN6LhFfGOpm4DY2mXPgwH4aa9GLOwublwMVFFZ/bGnHYYCRitLZs9+JWBbyWs7MyGcA246Ew+EREx36KVEAxjA==} + '@swc/core-darwin-x64@1.12.9': + resolution: {integrity: sha512-hv2kls7Ilkm2EpeJz+I9MCil7pGS3z55ZAgZfxklEuYsxpICycxeH+RNRv4EraggN44ms+FWCjtZFu0LGg2V3g==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.12.7': - resolution: {integrity: sha512-rHn8XXi7G2StEtZRAeJ6c7nhJPDnqsHXmeNrAaYwk8Tvpa6ZYG2nT9E1OQNXj1/dfbSFTjdiA8M8ZvGYBlpBoA==} + '@swc/core-linux-arm-gnueabihf@1.12.9': + resolution: {integrity: sha512-od9tDPiG+wMU9wKtd6y3nYJdNqgDOyLdgRRcrj1/hrbHoUPOM8wZQZdwQYGarw63iLXGgsw7t5HAF9Yc51ilFA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.12.7': - resolution: {integrity: sha512-N15hKizSSh+hkZ2x3TDVrxq0TDcbvDbkQJi2ZrLb9fK+NdFUV/x+XF16ZDPlbxtrGXl1CT7VD439SNaMN9F7qw==} + '@swc/core-linux-arm64-gnu@1.12.9': + resolution: {integrity: sha512-6qx1ka9LHcLzxIgn2Mros+CZLkHK2TawlXzi/h7DJeNnzi8F1Hw0Yzjp8WimxNCg6s2n+o3jnmin1oXB7gg8rw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.12.7': - resolution: {integrity: sha512-jxyINtBezpxd3eIUDiDXv7UQ87YWlPsM9KumOwJk09FkFSO4oYxV2RT+Wu+Nt5tVWue4N0MdXT/p7SQsDEk4YA==} + '@swc/core-linux-arm64-musl@1.12.9': + resolution: {integrity: sha512-yghFZWKPVVGbUdqiD7ft23G0JX6YFGDJPz9YbLLAwGuKZ9th3/jlWoQDAw1Naci31LQhVC+oIji6ozihSuwB2A==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.12.7': - resolution: {integrity: sha512-PR4tPVwU1BQBfFDk2XfzXxsEIjF3x/bOV1BzZpYvrlkU0TKUDbR4t2wzvsYwD/coW7/yoQmlL70/qnuPtTp1Zw==} + '@swc/core-linux-x64-gnu@1.12.9': + resolution: {integrity: sha512-SFUxyhWLZRNL8QmgGNqdi2Q43PNyFVkRZ2zIif30SOGFSxnxcf2JNeSeBgKIGVgaLSuk6xFVVCtJ3KIeaStgRg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.12.7': - resolution: {integrity: sha512-zy7JWfQtQItgMfUjSbbcS3DZqQUn2d9VuV0LSGpJxtTXwgzhRpF1S2Sj7cU9hGpbM27Y8RJ4DeFb3qbAufjbrw==} + '@swc/core-linux-x64-musl@1.12.9': + resolution: {integrity: sha512-9FB0wM+6idCGTI20YsBNBg9xSWtkDBymnpaTCsZM3qDc0l4uOpJMqbfWhQvp17x7r/ulZfb2QY8RDvQmCL6AcQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.12.7': - resolution: {integrity: sha512-52PeF0tyX04ZFD8nibNhy/GjMFOZWTEWPmIB3wpD1vIJ1po+smtBnEdRRll5WIXITKoiND8AeHlBNBPqcsdcwA==} + '@swc/core-win32-arm64-msvc@1.12.9': + resolution: {integrity: sha512-zHOusMVbOH9ik5RtRrMiGzLpKwxrPXgXkBm3SbUCa65HAdjV33NZ0/R9Rv1uPESALtEl2tzMYLUxYA5ECFDFhA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.12.7': - resolution: {integrity: sha512-WzQwkNMuhB1qQShT9uUgz/mX2j7NIEPExEtzvGsBT7TlZ9j1kGZ8NJcZH/fwOFcSJL4W7DnkL7nAhx6DBlSPaA==} + '@swc/core-win32-ia32-msvc@1.12.9': + resolution: {integrity: sha512-aWZf0PqE0ot7tCuhAjRkDFf41AzzSQO0x2xRfTbnhpROp57BRJ/N5eee1VULO/UA2PIJRG7GKQky5bSGBYlFug==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.12.7': - resolution: {integrity: sha512-R52ivBi2lgjl+Bd3XCPum0YfgbZq/W1AUExITysddP9ErsNSwnreYyNB3exEijiazWGcqHEas2ChiuMOP7NYrA==} + '@swc/core-win32-x64-msvc@1.12.9': + resolution: {integrity: sha512-C25fYftXOras3P3anSUeXXIpxmEkdAcsIL9yrr0j1xepTZ/yKwpnQ6g3coj8UXdeJy4GTVlR6+Ow/QiBgZQNOg==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.12.7': - resolution: {integrity: sha512-bcpllEihyUSnqp0UtXTvXc19CT4wp3tGWLENhWnjr4B5iEOkzqMu+xHGz1FI5IBatjfqOQb29tgIfv6IL05QaA==} + '@swc/core@1.12.9': + resolution: {integrity: sha512-O+LfT2JlVMsIMWG9x+rdxg8GzpzeGtCZQfXV7cKc1PjIKUkLFf1QJ7okuseA4f/9vncu37dQ2ZcRrPKy0Ndd5g==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -2738,11 +2813,11 @@ packages: '@tailwindcss/postcss@4.1.11': resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==} - '@tanstack/query-core@5.81.2': - resolution: {integrity: sha512-QLYkPdrudoMATDFa3MiLEwRhNnAlzHWDf0LKaXUqJd0/+QxN8uTPi7bahRlxoAyH0UbLMBdeDbYzWALj7THOtw==} + '@tanstack/query-core@5.81.5': + resolution: {integrity: sha512-ZJOgCy/z2qpZXWaj/oxvodDx07XcQa9BF92c0oINjHkoqUPsmm3uG08HpTaviviZ/N9eP1f9CM7mKSEkIo7O1Q==} - '@tanstack/react-query@5.81.2': - resolution: {integrity: sha512-pe8kFlTrL2zFLlcAj2kZk9UaYYHDk9/1hg9EBaoO3cxDhOZf1FRGJeziSXKrVZyxIfs7b3aoOj/bw7Lie0mDUg==} + '@tanstack/react-query@5.81.5': + resolution: {integrity: sha512-lOf2KqRRiYWpQT86eeeftAGnjuTR35myTP8MXyvHa81VlomoAWNEd8x5vkcAfQefu0qtYCvyqLropFZqgI2EQw==} peerDependencies: react: ^18 || ^19 @@ -2825,14 +2900,11 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@20.19.2': - resolution: {integrity: sha512-9pLGGwdzOUBDYi0GNjM97FIA+f92fqSke6joWeBjWXllfNxZBs7qeMF7tvtOIsbY45xkWkxrdwUfUf3MnQa9gA==} + '@types/node@20.19.4': + resolution: {integrity: sha512-OP+We5WV8Xnbuvw0zC2m4qfB/BJvjyCwtNjhHdJxV1639SGSKrLmJkc3fMnp2Qy8nJyHp8RO6umxELN/dS1/EA==} - '@types/node@24.0.4': - resolution: {integrity: sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==} - - '@types/node@24.0.7': - resolution: {integrity: sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw==} + '@types/node@24.0.10': + resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} '@types/nodemailer@6.4.17': resolution: {integrity: sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==} @@ -2868,63 +2940,63 @@ packages: '@types/validate-npm-package-name@4.0.2': resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} - '@typescript-eslint/eslint-plugin@8.35.0': - resolution: {integrity: sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==} + '@typescript-eslint/eslint-plugin@8.35.1': + resolution: {integrity: sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.35.0 + '@typescript-eslint/parser': ^8.35.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.35.0': - resolution: {integrity: sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==} + '@typescript-eslint/parser@8.35.1': + resolution: {integrity: sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/project-service@8.35.0': - resolution: {integrity: sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==} + '@typescript-eslint/project-service@8.35.1': + resolution: {integrity: sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.35.0': - resolution: {integrity: sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==} + '@typescript-eslint/scope-manager@8.35.1': + resolution: {integrity: sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.35.0': - resolution: {integrity: sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==} + '@typescript-eslint/tsconfig-utils@8.35.1': + resolution: {integrity: sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.35.0': - resolution: {integrity: sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==} + '@typescript-eslint/type-utils@8.35.1': + resolution: {integrity: sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.35.0': - resolution: {integrity: sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==} + '@typescript-eslint/types@8.35.1': + resolution: {integrity: sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.35.0': - resolution: {integrity: sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==} + '@typescript-eslint/typescript-estree@8.35.1': + resolution: {integrity: sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.35.0': - resolution: {integrity: sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==} + '@typescript-eslint/utils@8.35.1': + resolution: {integrity: sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.35.0': - resolution: {integrity: sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==} + '@typescript-eslint/visitor-keys@8.35.1': + resolution: {integrity: sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -3552,12 +3624,12 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dotenv@16.6.0: - resolution: {integrity: sha512-Omf1L8paOy2VJhILjyhrhqwLIdstqm1BvcDPKg4NGAlkwEu9ODyrFbvk8UymUOMCT+HXo31jg1lArIrVAAhuGA==} + dotenv@17.1.0: + resolution: {integrity: sha512-tG9VUTJTuju6GcXgbdsOuRhupE8cb4mRgY5JLRCh4MtGoVo3/gfGUtOMwmProM6d0ba2mCFvv+WrpYJV6qgJXQ==} engines: {node: '>=12'} - drizzle-kit@0.31.3: - resolution: {integrity: sha512-M8/o1oNvTzb0nhMch2W5i+Dz2YUp7ZjAeVx4L85hLjnFMxkB+LkKHTGg2MPAGc6ENFSVyozrxMa3DPqVrJt94w==} + drizzle-kit@0.31.4: + resolution: {integrity: sha512-tCPWVZWZqWVx2XUsVpJRnH9Mx0ClVOf5YUHerZ5so1OKSlqww4zy1R5ksEdGRcO3tM3zj0PYN6V48TbQCL1RfA==} hasBin: true drizzle-orm@0.44.2: @@ -3659,8 +3731,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.176: - resolution: {integrity: sha512-2nDK9orkm7M9ZZkjO3PjbEd3VUulQLyg5T9O3enJdFvUg46Hzd4DUvTvAuEgbdHYXyFsiG4A5sO9IzToMH1cDg==} + electron-to-chromium@1.5.179: + resolution: {integrity: sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==} emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -3828,8 +3900,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.29.0: - resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==} + eslint@9.30.1: + resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3894,8 +3966,8 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} ext-list@2.2.2: @@ -4006,8 +4078,8 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} - framer-motion@12.20.1: - resolution: {integrity: sha512-NW2t2GHQcNvLHq18JyNVY15VKrwru+nkNyhLdqf4MbxbGhxZcSDi68iNcAy6O1nG0yYAQJbLioBIH1Kmg8Xr1g==} + framer-motion@12.23.0: + resolution: {integrity: sha512-xf6NxTGAyf7zR4r2KlnhFmsRfKIbjqeBupEDBAaEtVIBJX96sAon00kMlsKButSIRwPSHjbRrAPnYdJJ9kyhbA==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -4030,8 +4102,8 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - fumadocs-core@15.6.0: - resolution: {integrity: sha512-qeGsainTxFwYiqHjyGqhIJBUvQina7ods0TN5YfQqXmLMm0LhQ+Im8vEpYlIhpBYxy6rwVpv06Tc+UZuDRU0UQ==} + fumadocs-core@15.6.1: + resolution: {integrity: sha512-5DXVptT+LN145xUHzUy07IAtaBYBoWOVMAKbUQQhcGNxhXPvbVAT9bIHnfjklU+yyosc8Rhn/gxSrKdlrn9HtQ==} peerDependencies: '@oramacloud/client': 1.x.x || 2.x.x '@types/react': '*' @@ -4069,8 +4141,8 @@ packages: vite: optional: true - fumadocs-ui@15.6.0: - resolution: {integrity: sha512-Pf7lo2TfawCEhJH6k0poVBduLt3a3XDtfQ3JVNn0HCG9s9/gbpdsrGaYLYMdUaUSidiTqYD0WKePpWDa1m6UQA==} + fumadocs-ui@15.6.1: + resolution: {integrity: sha512-3O0uTMeU1ohVQE7HTV7+8I/1IIlgJPIBFOHjoQkRaXTf41LJ7EKfNHue80BOuhG4vyeL/Sx184v2hjljuKrX3Q==} peerDependencies: '@types/react': '*' next: 14.x.x || 15.x.x @@ -4159,10 +4231,6 @@ packages: engines: {node: 20 || >=22} hasBin: true - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -4244,8 +4312,8 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hono@4.8.3: - resolution: {integrity: sha512-jYZ6ZtfWjzBdh8H/0CIFfCBHaFL75k+KMzaM177hrWWm2TWL39YMYaJgB74uK/niRc866NMlH9B8uCvIo284WQ==} + hono@4.8.4: + resolution: {integrity: sha512-KOIBp1+iUs0HrKztM4EHiB2UtzZDTBihDtOF5K6+WaJjCPeaW4Q92R8j63jOhvJI5+tZSMuKD9REVEXXY9illg==} engines: {node: '>=16.9.0'} html-encoding-sniffer@4.0.0: @@ -4742,13 +4810,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.517.0: - resolution: {integrity: sha512-TQCwwbwIuVG6SSutUC2Ol6PRXcuZndqoVAnDa7S7xb/RWPaiKTvLwX7byUKeh0pUgvtFh0NZZwFIDuMSeB7Iwg==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - lucide-react@0.523.0: - resolution: {integrity: sha512-rUjQoy7egZT9XYVXBK1je9ckBnNp7qzRZOhLQx5RcEp2dCGlXo+mv6vf7Am4LimEcFBJIIZzSGfgTqc9QCrPSw==} + lucide-react@0.525.0: + resolution: {integrity: sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -5016,14 +5079,14 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - motion-dom@12.20.1: - resolution: {integrity: sha512-XyveLJ9dmQTmaEsP9RlcuoNFxWlRIGdasdPJBB4aOwPr8bRcJdhltudAbiEjRQBmsGD30sjJdaEjhkHsAHapLQ==} + motion-dom@12.22.0: + resolution: {integrity: sha512-ooH7+/BPw9gOsL9VtPhEJHE2m4ltnhMlcGMhEqA0YGNhKof7jdaszvsyThXI6LVIKshJUZ9/CP6HNqQhJfV7kw==} motion-utils@12.19.0: resolution: {integrity: sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw==} - motion@12.20.1: - resolution: {integrity: sha512-UPUsh8jVxmcTPWqcdU5ZcNhO8EU4sfG+UcvKAUXFIwUE1oZJFxtyDui9tD7zlVau1eIBXqZ4Qe0hK2r8pOjDcQ==} + motion@12.23.0: + resolution: {integrity: sha512-PPNwblArRH9GRC4F3KtOTiIaYd+mtp324vYq3HIL+ueseoAVqPRK5TPFTAQBcIprfVd0NWo3DLzZSiyWaYFXXQ==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -5080,8 +5143,8 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - next-intl@4.3.1: - resolution: {integrity: sha512-FylHpOoQw5MpOyJt4cw8pNEGba7r3jKDSqt112fmBqXVceGR5YncmqpxS5MvSHsWRwbjqpOV8OsZCIY/4f4HWg==} + next-intl@4.3.4: + resolution: {integrity: sha512-VWLIDlGbnL/o4LnveJTJD1NOYN8lh3ZAGTWw2krhfgg53as3VsS4jzUVnArJdqvwtlpU/2BIDbWTZ7V4o1jFEw==} peerDependencies: next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -5096,8 +5159,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.3.4: - resolution: {integrity: sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA==} + next@15.3.5: + resolution: {integrity: sha512-RkazLBMMDJSJ4XZQ81kolSpwiCt907l0xcgcpF4xC2Vml6QVcPNXW0NQRwQ80FFtSn7UM52XN0anaw8TEJXaiw==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -5120,8 +5183,8 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - nodemailer@7.0.3: - resolution: {integrity: sha512-Ajq6Sz1x7cIK3pN6KesGTah+1gnwMnx5gKl3piQlQQE/PwyJ4Mbc8is2psWYxK3RJTVeqsDaCv8ZzXLCDHMTZw==} + nodemailer@7.0.4: + resolution: {integrity: sha512-9O00Vh89/Ld2EcVCqJ/etd7u20UhME0f/NToPfArwPEe1Don1zy4mAIz6ariRr7mJ2RDxtaDzN0WJVdVXPtZaw==} engines: {node: '>=6.0.0'} normalize-path@3.0.0: @@ -5338,13 +5401,13 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-core@1.53.1: - resolution: {integrity: sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==} + playwright-core@1.53.2: + resolution: {integrity: sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==} engines: {node: '>=18'} hasBin: true - playwright@1.53.1: - resolution: {integrity: sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==} + playwright@1.53.2: + resolution: {integrity: sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==} engines: {node: '>=18'} hasBin: true @@ -5500,8 +5563,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.6.1: - resolution: {integrity: sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true @@ -5560,8 +5623,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - react-hook-form@7.58.1: - resolution: {integrity: sha512-Lml/KZYEEFfPhUVgE0RdCVpnC4yhW+PndRhbiTtdvSlQTL8IfVR+iQkBjLIvmmc6+GGoVeM11z37ktKFPAb0FA==} + react-hook-form@7.60.0: + resolution: {integrity: sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -5605,8 +5668,8 @@ packages: '@types/react': optional: true - react-scan@0.3.4: - resolution: {integrity: sha512-jUkgs+sfK1B7T1jvZ0rQmKZtvUUE7cHB6qDTfCfOTmTJYH2aAFB1fGmE4DXBbQ1kUF+AdjyNT0Lc73LL/dQIbg==} + react-scan@0.4.3: + resolution: {integrity: sha512-jhAQuQ1nja6HUYrSpbmNFHqZPsRCXk8Yqu0lHoRIw9eb8N96uTfXCpVyQhTTnJ/nWqnwuvxbpKVG/oWZT8+iTQ==} hasBin: true peerDependencies: '@remix-run/react': '>=1.0.0' @@ -5750,8 +5813,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.44.1: - resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} + rollup@4.44.2: + resolution: {integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5915,8 +5978,8 @@ packages: resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} engines: {node: '>=10.2.0'} - sonner@2.0.5: - resolution: {integrity: sha512-YwbHQO6cSso3HBXlbCkgrgzDNIhws14r4MO87Ofy+cV2X7ES4pOoAK3+veSmVTvqNx1BWUxlhPmZzP00Crk2aQ==} + sonner@2.0.6: + resolution: {integrity: sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -6201,8 +6264,8 @@ packages: toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - token-types@6.0.0: - resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} + token-types@6.0.3: + resolution: {integrity: sha512-IKJ6EzuPPWtKtEIEPpIdXv9j5j2LGJEYk0CKY2efgKoYKLBiZdh6iQkLVBow/CB3phyWAWCyk+bZeaimJn6uRQ==} engines: {node: '>=14.16'} tough-cookie@5.1.2: @@ -6318,8 +6381,8 @@ packages: resolution: {integrity: sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA==} hasBin: true - tw-animate-css@1.3.4: - resolution: {integrity: sha512-dd1Ht6/YQHcNbq0znIT6dG8uhO7Ce+VIIhZUhjsryXsMPJQz3bZg7Q2eNzLwipb25bRZslGb2myio5mScd1TFg==} + tw-animate-css@1.3.5: + resolution: {integrity: sha512-t3u+0YNoloIhj1mMXs779P6MO9q3p3mvGn4k1n3nJPqJw/glZcuijG2qTSN4z4mgNRfW5ZC3aXJFLwDtiipZXA==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -6345,8 +6408,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.35.0: - resolution: {integrity: sha512-uEnz70b7kBz6eg/j0Czy6K5NivaYopgxRjsnAJ2Fx5oTLo3wefTHIbL7AkQr1+7tJCRVpTs/wiM8JR/11Loq9A==} + typescript-eslint@8.35.1: + resolution: {integrity: sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6427,8 +6490,8 @@ packages: peerDependencies: react: '*' - use-intl@4.3.1: - resolution: {integrity: sha512-8Xn5RXzeHZhWqqZimi1wi2pKFqm0NxRUOB41k1QdjbPX+ysoeLW3Ey+fi603D/e5EGb0fYw8WzjgtUagJdlIvg==} + use-intl@4.3.4: + resolution: {integrity: sha512-sHfiU0QeJ1rirNWRxvCyvlSh9+NczcOzRnPyMeo2rtHXhVnBsvMRjE+UG4eh3lRhCxrvcqei/I0lBxsc59on1w==} peerDependencies: react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -6523,8 +6586,8 @@ packages: yaml: optional: true - vite@7.0.0: - resolution: {integrity: sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g==} + vite@7.0.2: + resolution: {integrity: sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -6679,8 +6742,8 @@ packages: utf-8-validate: optional: true - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -6748,8 +6811,8 @@ packages: peerDependencies: zod: ^3.25.0 - zod@3.25.67: - resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} + zod@3.25.74: + resolution: {integrity: sha512-J8poo92VuhKjNknViHRAIuuN6li/EwFbAC8OedzI8uxpEPGiXHGQu9wemIAioIpqgfB4SySaJhdk0mH5Y4ICBg==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -6760,8 +6823,8 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 '@asamuzakjp/css-color@3.2.0': dependencies: @@ -6771,10 +6834,10 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 - '@asteasolutions/zod-to-openapi@7.3.4(zod@3.25.67)': + '@asteasolutions/zod-to-openapi@7.3.4(zod@3.25.74)': dependencies: openapi3-ts: 4.5.0 - zod: 3.25.67 + zod: 3.25.74 '@astrojs/compiler@0.31.4': optional: true @@ -6785,20 +6848,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.7': {} + '@babel/compat-data@7.28.0': {} - '@babel/core@7.27.7': + '@babel/core@7.28.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 + '@babel/generator': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.7 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.7 - '@babel/types': 7.27.7 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -6807,81 +6870,83 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.27.5': + '@babel/generator@7.28.0': dependencies: - '@babel/parser': 7.27.7 - '@babel/types': 7.27.7 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.7 + '@babel/types': 7.28.0 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.7 + '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 browserslist: 4.25.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.7)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.28.0 semver: 6.3.1 transitivePeerDependencies: - supports-color + '@babel/helper-globals@7.28.0': {} + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.7 - '@babel/types': 7.27.7 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.7 - '@babel/types': 7.27.7 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.7)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.7 + '@babel/types': 7.28.0 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.7)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.0 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.7 - '@babel/types': 7.27.7 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color @@ -6894,36 +6959,36 @@ snapshots: '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.7 + '@babel/types': 7.28.0 - '@babel/parser@7.27.7': + '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.27.7 + '@babel/types': 7.28.0 - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.27.7)': + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/runtime@7.27.6': {} @@ -6931,22 +6996,22 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.7 - '@babel/types': 7.27.7 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 - '@babel/traverse@7.27.7': + '@babel/traverse@7.28.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.7 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/types': 7.27.7 + '@babel/types': 7.28.0 debug: 4.4.1 - globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.27.7': + '@babel/types@7.28.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -7160,14 +7225,14 @@ snapshots: '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))': dependencies: - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.20.1': + '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.1 @@ -7175,7 +7240,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.3': {} + '@eslint/config-helpers@0.3.0': {} '@eslint/core@0.14.0': dependencies: @@ -7199,7 +7264,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.29.0': {} + '@eslint/js@9.30.1': {} '@eslint/object-schema@2.1.6': {} @@ -7208,22 +7273,22 @@ snapshots: '@eslint/core': 0.15.1 levn: 0.4.1 - '@floating-ui/core@1.7.1': + '@floating-ui/core@1.7.2': dependencies: - '@floating-ui/utils': 0.2.9 + '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.7.1': + '@floating-ui/dom@1.7.2': dependencies: - '@floating-ui/core': 1.7.1 - '@floating-ui/utils': 0.2.9 + '@floating-ui/core': 1.7.2 + '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@floating-ui/react-dom@2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/dom': 1.7.1 + '@floating-ui/dom': 1.7.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@floating-ui/utils@0.2.9': {} + '@floating-ui/utils@0.2.10': {} '@formatjs/ecma402-abstract@2.3.4': dependencies: @@ -7255,38 +7320,43 @@ snapshots: dependencies: tslib: 2.8.1 - '@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.6.0(@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)': + '@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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.6.0(@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-core: 15.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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 + zod: 3.25.74 transitivePeerDependencies: - acorn - supports-color optional: true - '@hono/swagger-ui@0.5.2(hono@4.8.3)': + '@hono/node-server@1.15.0(hono@4.8.4)': + dependencies: + hono: 4.8.4 + + '@hono/swagger-ui@0.5.2(hono@4.8.4)': dependencies: - hono: 4.8.3 + hono: 4.8.4 - '@hono/zod-openapi@0.19.8(hono@4.8.3)(zod@3.25.67)': + '@hono/zod-openapi@0.19.9(hono@4.8.4)(zod@3.25.74)': dependencies: - '@asteasolutions/zod-to-openapi': 7.3.4(zod@3.25.67) - '@hono/zod-validator': 0.7.0(hono@4.8.3)(zod@3.25.67) - hono: 4.8.3 - zod: 3.25.67 + '@asteasolutions/zod-to-openapi': 7.3.4(zod@3.25.74) + '@hono/zod-validator': 0.7.0(hono@4.8.4)(zod@3.25.74) + hono: 4.8.4 + openapi3-ts: 4.5.0 + zod: 3.25.74 - '@hono/zod-validator@0.7.0(hono@4.8.3)(zod@3.25.67)': + '@hono/zod-validator@0.7.0(hono@4.8.4)(zod@3.25.74)': dependencies: - hono: 4.8.3 - zod: 3.25.67 + hono: 4.8.4 + zod: 3.25.74 - '@hookform/resolvers@5.1.1(react-hook-form@7.58.1(react@19.1.0))': + '@hookform/resolvers@5.1.1(react-hook-form@7.60.0(react@19.1.0))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.58.1(react@19.1.0) + react-hook-form: 7.60.0(react@19.1.0) '@humanfs/core@0.19.1': {} @@ -7382,27 +7452,27 @@ snapshots: '@img/sharp-win32-x64@0.34.2': optional: true - '@inquirer/checkbox@4.1.8(@types/node@24.0.4)': + '@inquirer/checkbox@4.1.9(@types/node@24.0.10)': dependencies: - '@inquirer/core': 10.1.13(@types/node@24.0.4) + '@inquirer/core': 10.1.14(@types/node@24.0.10) '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/type': 3.0.7(@types/node@24.0.10) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 - '@inquirer/confirm@5.1.12(@types/node@24.0.4)': + '@inquirer/confirm@5.1.13(@types/node@24.0.10)': dependencies: - '@inquirer/core': 10.1.13(@types/node@24.0.4) - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/core': 10.1.14(@types/node@24.0.10) + '@inquirer/type': 3.0.7(@types/node@24.0.10) optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 - '@inquirer/core@10.1.13(@types/node@24.0.4)': + '@inquirer/core@10.1.14(@types/node@24.0.10)': dependencies: '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/type': 3.0.7(@types/node@24.0.10) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -7410,93 +7480,93 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 - '@inquirer/editor@4.2.13(@types/node@24.0.4)': + '@inquirer/editor@4.2.14(@types/node@24.0.10)': dependencies: - '@inquirer/core': 10.1.13(@types/node@24.0.4) - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/core': 10.1.14(@types/node@24.0.10) + '@inquirer/type': 3.0.7(@types/node@24.0.10) external-editor: 3.1.0 optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 - '@inquirer/expand@4.0.15(@types/node@24.0.4)': + '@inquirer/expand@4.0.16(@types/node@24.0.10)': dependencies: - '@inquirer/core': 10.1.13(@types/node@24.0.4) - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/core': 10.1.14(@types/node@24.0.10) + '@inquirer/type': 3.0.7(@types/node@24.0.10) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 '@inquirer/figures@1.0.12': {} - '@inquirer/input@4.1.12(@types/node@24.0.4)': + '@inquirer/input@4.2.0(@types/node@24.0.10)': dependencies: - '@inquirer/core': 10.1.13(@types/node@24.0.4) - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/core': 10.1.14(@types/node@24.0.10) + '@inquirer/type': 3.0.7(@types/node@24.0.10) optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 - '@inquirer/number@3.0.15(@types/node@24.0.4)': + '@inquirer/number@3.0.16(@types/node@24.0.10)': dependencies: - '@inquirer/core': 10.1.13(@types/node@24.0.4) - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/core': 10.1.14(@types/node@24.0.10) + '@inquirer/type': 3.0.7(@types/node@24.0.10) optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 - '@inquirer/password@4.0.15(@types/node@24.0.4)': + '@inquirer/password@4.0.16(@types/node@24.0.10)': dependencies: - '@inquirer/core': 10.1.13(@types/node@24.0.4) - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/core': 10.1.14(@types/node@24.0.10) + '@inquirer/type': 3.0.7(@types/node@24.0.10) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 24.0.4 - - '@inquirer/prompts@7.5.3(@types/node@24.0.4)': - dependencies: - '@inquirer/checkbox': 4.1.8(@types/node@24.0.4) - '@inquirer/confirm': 5.1.12(@types/node@24.0.4) - '@inquirer/editor': 4.2.13(@types/node@24.0.4) - '@inquirer/expand': 4.0.15(@types/node@24.0.4) - '@inquirer/input': 4.1.12(@types/node@24.0.4) - '@inquirer/number': 3.0.15(@types/node@24.0.4) - '@inquirer/password': 4.0.15(@types/node@24.0.4) - '@inquirer/rawlist': 4.1.3(@types/node@24.0.4) - '@inquirer/search': 3.0.15(@types/node@24.0.4) - '@inquirer/select': 4.2.3(@types/node@24.0.4) + '@types/node': 24.0.10 + + '@inquirer/prompts@7.6.0(@types/node@24.0.10)': + dependencies: + '@inquirer/checkbox': 4.1.9(@types/node@24.0.10) + '@inquirer/confirm': 5.1.13(@types/node@24.0.10) + '@inquirer/editor': 4.2.14(@types/node@24.0.10) + '@inquirer/expand': 4.0.16(@types/node@24.0.10) + '@inquirer/input': 4.2.0(@types/node@24.0.10) + '@inquirer/number': 3.0.16(@types/node@24.0.10) + '@inquirer/password': 4.0.16(@types/node@24.0.10) + '@inquirer/rawlist': 4.1.4(@types/node@24.0.10) + '@inquirer/search': 3.0.16(@types/node@24.0.10) + '@inquirer/select': 4.2.4(@types/node@24.0.10) optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 - '@inquirer/rawlist@4.1.3(@types/node@24.0.4)': + '@inquirer/rawlist@4.1.4(@types/node@24.0.10)': dependencies: - '@inquirer/core': 10.1.13(@types/node@24.0.4) - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/core': 10.1.14(@types/node@24.0.10) + '@inquirer/type': 3.0.7(@types/node@24.0.10) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 - '@inquirer/search@3.0.15(@types/node@24.0.4)': + '@inquirer/search@3.0.16(@types/node@24.0.10)': dependencies: - '@inquirer/core': 10.1.13(@types/node@24.0.4) + '@inquirer/core': 10.1.14(@types/node@24.0.10) '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/type': 3.0.7(@types/node@24.0.10) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 - '@inquirer/select@4.2.3(@types/node@24.0.4)': + '@inquirer/select@4.2.4(@types/node@24.0.10)': dependencies: - '@inquirer/core': 10.1.13(@types/node@24.0.4) + '@inquirer/core': 10.1.14(@types/node@24.0.10) '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@24.0.4) + '@inquirer/type': 3.0.7(@types/node@24.0.10) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 - '@inquirer/type@3.0.7(@types/node@24.0.4)': + '@inquirer/type@3.0.7(@types/node@24.0.10)': optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 '@isaacs/balanced-match@4.0.1': {} @@ -7519,24 +7589,19 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/sourcemap-codec@1.5.2': {} + '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@mdx-js/mdx@3.1.0(acorn@8.15.0)': dependencies: @@ -7568,72 +7633,72 @@ snapshots: - acorn - supports-color - '@napi-rs/nice-android-arm-eabi@1.0.1': + '@napi-rs/nice-android-arm-eabi@1.0.4': optional: true - '@napi-rs/nice-android-arm64@1.0.1': + '@napi-rs/nice-android-arm64@1.0.4': optional: true - '@napi-rs/nice-darwin-arm64@1.0.1': + '@napi-rs/nice-darwin-arm64@1.0.4': optional: true - '@napi-rs/nice-darwin-x64@1.0.1': + '@napi-rs/nice-darwin-x64@1.0.4': optional: true - '@napi-rs/nice-freebsd-x64@1.0.1': + '@napi-rs/nice-freebsd-x64@1.0.4': optional: true - '@napi-rs/nice-linux-arm-gnueabihf@1.0.1': + '@napi-rs/nice-linux-arm-gnueabihf@1.0.4': optional: true - '@napi-rs/nice-linux-arm64-gnu@1.0.1': + '@napi-rs/nice-linux-arm64-gnu@1.0.4': optional: true - '@napi-rs/nice-linux-arm64-musl@1.0.1': + '@napi-rs/nice-linux-arm64-musl@1.0.4': optional: true - '@napi-rs/nice-linux-ppc64-gnu@1.0.1': + '@napi-rs/nice-linux-ppc64-gnu@1.0.4': optional: true - '@napi-rs/nice-linux-riscv64-gnu@1.0.1': + '@napi-rs/nice-linux-riscv64-gnu@1.0.4': optional: true - '@napi-rs/nice-linux-s390x-gnu@1.0.1': + '@napi-rs/nice-linux-s390x-gnu@1.0.4': optional: true - '@napi-rs/nice-linux-x64-gnu@1.0.1': + '@napi-rs/nice-linux-x64-gnu@1.0.4': optional: true - '@napi-rs/nice-linux-x64-musl@1.0.1': + '@napi-rs/nice-linux-x64-musl@1.0.4': optional: true - '@napi-rs/nice-win32-arm64-msvc@1.0.1': + '@napi-rs/nice-win32-arm64-msvc@1.0.4': optional: true - '@napi-rs/nice-win32-ia32-msvc@1.0.1': + '@napi-rs/nice-win32-ia32-msvc@1.0.4': optional: true - '@napi-rs/nice-win32-x64-msvc@1.0.1': + '@napi-rs/nice-win32-x64-msvc@1.0.4': optional: true - '@napi-rs/nice@1.0.1': + '@napi-rs/nice@1.0.4': optionalDependencies: - '@napi-rs/nice-android-arm-eabi': 1.0.1 - '@napi-rs/nice-android-arm64': 1.0.1 - '@napi-rs/nice-darwin-arm64': 1.0.1 - '@napi-rs/nice-darwin-x64': 1.0.1 - '@napi-rs/nice-freebsd-x64': 1.0.1 - '@napi-rs/nice-linux-arm-gnueabihf': 1.0.1 - '@napi-rs/nice-linux-arm64-gnu': 1.0.1 - '@napi-rs/nice-linux-arm64-musl': 1.0.1 - '@napi-rs/nice-linux-ppc64-gnu': 1.0.1 - '@napi-rs/nice-linux-riscv64-gnu': 1.0.1 - '@napi-rs/nice-linux-s390x-gnu': 1.0.1 - '@napi-rs/nice-linux-x64-gnu': 1.0.1 - '@napi-rs/nice-linux-x64-musl': 1.0.1 - '@napi-rs/nice-win32-arm64-msvc': 1.0.1 - '@napi-rs/nice-win32-ia32-msvc': 1.0.1 - '@napi-rs/nice-win32-x64-msvc': 1.0.1 + '@napi-rs/nice-android-arm-eabi': 1.0.4 + '@napi-rs/nice-android-arm64': 1.0.4 + '@napi-rs/nice-darwin-arm64': 1.0.4 + '@napi-rs/nice-darwin-x64': 1.0.4 + '@napi-rs/nice-freebsd-x64': 1.0.4 + '@napi-rs/nice-linux-arm-gnueabihf': 1.0.4 + '@napi-rs/nice-linux-arm64-gnu': 1.0.4 + '@napi-rs/nice-linux-arm64-musl': 1.0.4 + '@napi-rs/nice-linux-ppc64-gnu': 1.0.4 + '@napi-rs/nice-linux-riscv64-gnu': 1.0.4 + '@napi-rs/nice-linux-s390x-gnu': 1.0.4 + '@napi-rs/nice-linux-x64-gnu': 1.0.4 + '@napi-rs/nice-linux-x64-musl': 1.0.4 + '@napi-rs/nice-win32-arm64-msvc': 1.0.4 + '@napi-rs/nice-win32-ia32-msvc': 1.0.4 + '@napi-rs/nice-win32-x64-msvc': 1.0.4 optional: true '@neondatabase/serverless@0.10.4': @@ -7641,30 +7706,30 @@ snapshots: '@types/pg': 8.11.6 optional: true - '@next/env@15.3.4': {} + '@next/env@15.3.5': {} - '@next/swc-darwin-arm64@15.3.4': + '@next/swc-darwin-arm64@15.3.5': optional: true - '@next/swc-darwin-x64@15.3.4': + '@next/swc-darwin-x64@15.3.5': optional: true - '@next/swc-linux-arm64-gnu@15.3.4': + '@next/swc-linux-arm64-gnu@15.3.5': optional: true - '@next/swc-linux-arm64-musl@15.3.4': + '@next/swc-linux-arm64-musl@15.3.5': optional: true - '@next/swc-linux-x64-gnu@15.3.4': + '@next/swc-linux-x64-gnu@15.3.5': optional: true - '@next/swc-linux-x64-musl@15.3.4': + '@next/swc-linux-x64-musl@15.3.5': optional: true - '@next/swc-win32-arm64-msvc@15.3.4': + '@next/swc-win32-arm64-msvc@15.3.5': optional: true - '@next/swc-win32-x64-msvc@15.3.4': + '@next/swc-win32-x64-msvc@15.3.5': optional: true '@nodelib/fs.scandir@2.1.5': @@ -7679,7 +7744,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@orama/orama@3.1.9': {} + '@orama/orama@3.1.10': {} '@petamoriken/float16@3.9.2': optional: true @@ -7697,15 +7762,15 @@ snapshots: '@pkgr/core@0.2.7': {} - '@playwright/test@1.53.1': + '@playwright/test@1.53.2': dependencies: - playwright: 1.53.1 + playwright: 1.53.2 - '@preact/signals-core@1.10.0': {} + '@preact/signals-core@1.11.0': {} '@preact/signals@1.3.2(preact@10.26.9)': dependencies: - '@preact/signals-core': 1.10.0 + '@preact/signals-core': 1.11.0 preact: 10.26.9 '@radix-ui/number@1.1.1': {} @@ -8100,7 +8165,7 @@ snapshots: '@radix-ui/react-popper@1.2.7(@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)': dependencies: - '@floating-ui/react-dom': 2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@floating-ui/react-dom': 2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-arrow': 1.1.7(@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-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) @@ -8546,7 +8611,7 @@ snapshots: '@react-email/render@1.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: html-to-text: 9.0.5 - prettier: 3.6.1 + prettier: 3.6.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-promise-suspense: 0.3.4 @@ -8554,7 +8619,7 @@ snapshots: '@react-email/render@1.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: html-to-text: 9.0.5 - prettier: 3.6.1 + prettier: 3.6.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-promise-suspense: 0.3.4 @@ -8577,72 +8642,72 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.19': {} - '@rollup/pluginutils@5.2.0(rollup@4.44.1)': + '@rollup/pluginutils@5.2.0(rollup@4.44.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.44.1 + rollup: 4.44.2 - '@rollup/rollup-android-arm-eabi@4.44.1': + '@rollup/rollup-android-arm-eabi@4.44.2': optional: true - '@rollup/rollup-android-arm64@4.44.1': + '@rollup/rollup-android-arm64@4.44.2': optional: true - '@rollup/rollup-darwin-arm64@4.44.1': + '@rollup/rollup-darwin-arm64@4.44.2': optional: true - '@rollup/rollup-darwin-x64@4.44.1': + '@rollup/rollup-darwin-x64@4.44.2': optional: true - '@rollup/rollup-freebsd-arm64@4.44.1': + '@rollup/rollup-freebsd-arm64@4.44.2': optional: true - '@rollup/rollup-freebsd-x64@4.44.1': + '@rollup/rollup-freebsd-x64@4.44.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.44.1': + '@rollup/rollup-linux-arm-gnueabihf@4.44.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.44.1': + '@rollup/rollup-linux-arm-musleabihf@4.44.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.44.1': + '@rollup/rollup-linux-arm64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.44.1': + '@rollup/rollup-linux-arm64-musl@4.44.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.44.1': + '@rollup/rollup-linux-loongarch64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.44.1': + '@rollup/rollup-linux-riscv64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.44.1': + '@rollup/rollup-linux-riscv64-musl@4.44.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.44.1': + '@rollup/rollup-linux-s390x-gnu@4.44.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.44.1': + '@rollup/rollup-linux-x64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-x64-musl@4.44.1': + '@rollup/rollup-linux-x64-musl@4.44.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.44.1': + '@rollup/rollup-win32-arm64-msvc@4.44.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.44.1': + '@rollup/rollup-win32-ia32-msvc@4.44.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.44.1': + '@rollup/rollup-win32-x64-msvc@4.44.2': optional: true '@schummar/icu-type-parser@1.21.5': {} @@ -8709,9 +8774,9 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@swc/cli@0.6.0(@swc/core@1.12.7)(chokidar@4.0.3)': + '@swc/cli@0.6.0(@swc/core@1.12.9)(chokidar@4.0.3)': dependencies: - '@swc/core': 1.12.7 + '@swc/core': 1.12.9 '@swc/counter': 0.1.3 '@xhmikosr/bin-wrapper': 13.0.5 commander: 8.3.0 @@ -8724,51 +8789,51 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@swc/core-darwin-arm64@1.12.7': + '@swc/core-darwin-arm64@1.12.9': optional: true - '@swc/core-darwin-x64@1.12.7': + '@swc/core-darwin-x64@1.12.9': optional: true - '@swc/core-linux-arm-gnueabihf@1.12.7': + '@swc/core-linux-arm-gnueabihf@1.12.9': optional: true - '@swc/core-linux-arm64-gnu@1.12.7': + '@swc/core-linux-arm64-gnu@1.12.9': optional: true - '@swc/core-linux-arm64-musl@1.12.7': + '@swc/core-linux-arm64-musl@1.12.9': optional: true - '@swc/core-linux-x64-gnu@1.12.7': + '@swc/core-linux-x64-gnu@1.12.9': optional: true - '@swc/core-linux-x64-musl@1.12.7': + '@swc/core-linux-x64-musl@1.12.9': optional: true - '@swc/core-win32-arm64-msvc@1.12.7': + '@swc/core-win32-arm64-msvc@1.12.9': optional: true - '@swc/core-win32-ia32-msvc@1.12.7': + '@swc/core-win32-ia32-msvc@1.12.9': optional: true - '@swc/core-win32-x64-msvc@1.12.7': + '@swc/core-win32-x64-msvc@1.12.9': optional: true - '@swc/core@1.12.7': + '@swc/core@1.12.9': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.23 optionalDependencies: - '@swc/core-darwin-arm64': 1.12.7 - '@swc/core-darwin-x64': 1.12.7 - '@swc/core-linux-arm-gnueabihf': 1.12.7 - '@swc/core-linux-arm64-gnu': 1.12.7 - '@swc/core-linux-arm64-musl': 1.12.7 - '@swc/core-linux-x64-gnu': 1.12.7 - '@swc/core-linux-x64-musl': 1.12.7 - '@swc/core-win32-arm64-msvc': 1.12.7 - '@swc/core-win32-ia32-msvc': 1.12.7 - '@swc/core-win32-x64-msvc': 1.12.7 + '@swc/core-darwin-arm64': 1.12.9 + '@swc/core-darwin-x64': 1.12.9 + '@swc/core-linux-arm-gnueabihf': 1.12.9 + '@swc/core-linux-arm64-gnu': 1.12.9 + '@swc/core-linux-arm64-musl': 1.12.9 + '@swc/core-linux-x64-gnu': 1.12.9 + '@swc/core-linux-x64-musl': 1.12.9 + '@swc/core-win32-arm64-msvc': 1.12.9 + '@swc/core-win32-ia32-msvc': 1.12.9 + '@swc/core-win32-x64-msvc': 1.12.9 '@swc/counter@0.1.3': {} @@ -8856,11 +8921,11 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.11 - '@tanstack/query-core@5.81.2': {} + '@tanstack/query-core@5.81.5': {} - '@tanstack/react-query@5.81.2(react@19.1.0)': + '@tanstack/react-query@5.81.5(react@19.1.0)': dependencies: - '@tanstack/query-core': 5.81.2 + '@tanstack/query-core': 5.81.5 react: 19.1.0 '@testing-library/dom@10.4.0': @@ -8890,24 +8955,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.7 - '@babel/types': 7.27.7 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.7 + '@babel/types': 7.28.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.7 - '@babel/types': 7.27.7 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.7 + '@babel/types': 7.28.0 '@types/chai@5.2.2': dependencies: @@ -8915,7 +8980,7 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 24.0.7 + '@types/node': 24.0.10 '@types/debug@4.1.12': dependencies: @@ -8953,39 +9018,35 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@20.19.2': + '@types/node@20.19.4': dependencies: undici-types: 6.21.0 - '@types/node@24.0.4': - dependencies: - undici-types: 7.8.0 - - '@types/node@24.0.7': + '@types/node@24.0.10': dependencies: undici-types: 7.8.0 '@types/nodemailer@6.4.17': dependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 '@types/pg@8.11.10': dependencies: - '@types/node': 24.0.7 + '@types/node': 24.0.10 pg-protocol: 1.10.3 pg-types: 4.0.2 optional: true '@types/pg@8.11.6': dependencies: - '@types/node': 24.0.7 + '@types/node': 24.0.10 pg-protocol: 1.10.3 pg-types: 4.0.2 optional: true '@types/prompts@2.4.9': dependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 kleur: 3.0.3 '@types/react-dom@19.1.6(@types/react@19.1.8)': @@ -9006,15 +9067,15 @@ snapshots: '@types/validate-npm-package-name@4.0.2': {} - '@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.35.0 - '@typescript-eslint/type-utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.35.0 - eslint: 9.29.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.35.1 + '@typescript-eslint/type-utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.1 + eslint: 9.30.1(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -9023,55 +9084,55 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.35.0 - '@typescript-eslint/types': 8.35.0 - '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.35.0 + '@typescript-eslint/scope-manager': 8.35.1 + '@typescript-eslint/types': 8.35.1 + '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.1 debug: 4.4.1 - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.35.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.35.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3) - '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) + '@typescript-eslint/types': 8.35.1 debug: 4.4.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.35.0': + '@typescript-eslint/scope-manager@8.35.1': dependencies: - '@typescript-eslint/types': 8.35.0 - '@typescript-eslint/visitor-keys': 8.35.0 + '@typescript-eslint/types': 8.35.1 + '@typescript-eslint/visitor-keys': 8.35.1 - '@typescript-eslint/tsconfig-utils@8.35.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.35.1(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.35.0': {} + '@typescript-eslint/types@8.35.1': {} - '@typescript-eslint/typescript-estree@8.35.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.35.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/project-service': 8.35.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3) - '@typescript-eslint/types': 8.35.0 - '@typescript-eslint/visitor-keys': 8.35.0 + '@typescript-eslint/project-service': 8.35.1(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) + '@typescript-eslint/types': 8.35.1 + '@typescript-eslint/visitor-keys': 8.35.1 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -9082,37 +9143,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.35.0 - '@typescript-eslint/types': 8.35.0 - '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) - eslint: 9.29.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.35.1 + '@typescript-eslint/types': 8.35.1 + '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) + eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.35.0': + '@typescript-eslint/visitor-keys@8.35.1': dependencies: - '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/types': 8.35.1 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.6.0(vite@7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': + '@vitejs/plugin-react@4.6.0(vite@7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - '@babel/core': 7.27.7 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.7) + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -9127,7 +9188,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -9139,13 +9200,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -9370,7 +9431,7 @@ snapshots: ast-v8-to-istanbul@0.3.3: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 estree-walker: 3.0.3 js-tokens: 9.0.1 @@ -9390,7 +9451,7 @@ snapshots: babel-plugin-react-compiler@19.1.0-rc.2: dependencies: - '@babel/types': 7.27.7 + '@babel/types': 7.28.0 bail@2.0.2: {} @@ -9439,7 +9500,7 @@ snapshots: browserslist@4.25.1: dependencies: caniuse-lite: 1.0.30001726 - electron-to-chromium: 1.5.176 + electron-to-chromium: 1.5.179 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) @@ -9775,9 +9836,9 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dotenv@16.6.0: {} + dotenv@17.1.0: {} - drizzle-kit@0.31.3: + drizzle-kit@0.31.4: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 @@ -9802,7 +9863,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.176: {} + electron-to-chromium@1.5.179: {} emoji-regex@10.4.0: {} @@ -9815,7 +9876,7 @@ snapshots: engine.io@6.6.4: dependencies: '@types/cors': 2.8.19 - '@types/node': 24.0.7 + '@types/node': 24.0.10 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -10027,11 +10088,11 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.5(eslint@9.29.0(jiti@2.4.2)): + eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)): dependencies: - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) - eslint-plugin-jsx-a11y@6.10.2(eslint@9.29.0(jiti@2.4.2)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.30.1(jiti@2.4.2)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -10041,7 +10102,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -10050,51 +10111,51 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-perfectionist@4.15.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3): + eslint-plugin-perfectionist@4.15.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/types': 8.35.0 - '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.29.0(jiti@2.4.2) + '@typescript-eslint/types': 8.35.1 + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.4.2) natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-prettier@5.5.1(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.29.0(jiti@2.4.2)))(eslint@9.29.0(jiti@2.4.2))(prettier@3.6.1): + eslint-plugin-prettier@5.5.1(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2): dependencies: - eslint: 9.29.0(jiti@2.4.2) - prettier: 3.6.1 + eslint: 9.30.1(jiti@2.4.2) + prettier: 3.6.2 prettier-linter-helpers: 1.0.0 synckit: 0.11.8 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.5(eslint@9.29.0(jiti@2.4.2)) + eslint-config-prettier: 10.1.5(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.29.0(jiti@2.4.2)): + eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.30.1(jiti@2.4.2)): dependencies: - '@babel/core': 7.27.7 - '@babel/parser': 7.27.7 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.7) - eslint: 9.29.0(jiti@2.4.2) + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.28.0) + eslint: 9.30.1(jiti@2.4.2) hermes-parser: 0.25.1 - zod: 3.25.67 - zod-validation-error: 3.5.2(zod@3.25.67) + zod: 3.25.74 + zod-validation-error: 3.5.2(zod@3.25.74) transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@6.0.0-rc1(eslint@9.29.0(jiti@2.4.2)): + eslint-plugin-react-hooks@6.0.0-rc1(eslint@9.30.1(jiti@2.4.2)): dependencies: - '@babel/core': 7.27.7 - '@babel/parser': 7.27.7 - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.7) - eslint: 9.29.0(jiti@2.4.2) + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) + eslint: 9.30.1(jiti@2.4.2) hermes-parser: 0.25.1 - zod: 3.25.67 - zod-validation-error: 3.5.2(zod@3.25.67) + zod: 3.25.74 + zod-validation-error: 3.5.2(zod@3.25.74) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.29.0(jiti@2.4.2)): + eslint-plugin-react@7.37.5(eslint@9.30.1(jiti@2.4.2)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -10102,7 +10163,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -10125,15 +10186,15 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.29.0(jiti@2.4.2): + eslint@9.30.1(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.1 - '@eslint/config-helpers': 0.2.3 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.29.0 + '@eslint/js': 9.30.1 '@eslint/plugin-kit': 0.3.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -10239,7 +10300,7 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - expect-type@1.2.1: {} + expect-type@1.2.2: {} ext-list@2.2.2: dependencies: @@ -10303,7 +10364,7 @@ snapshots: dependencies: get-stream: 9.0.1 strtok3: 9.1.1 - token-types: 6.0.0 + token-types: 6.0.3 uint8array-extras: 1.4.0 filename-reserved-regex@3.0.0: {} @@ -10329,7 +10390,7 @@ snapshots: dependencies: magic-string: 0.30.17 mlly: 1.7.4 - rollup: 4.44.1 + rollup: 4.44.2 flat-cache@4.0.1: dependencies: @@ -10349,9 +10410,9 @@ snapshots: form-data-encoder@2.1.4: {} - framer-motion@12.20.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + framer-motion@12.23.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - motion-dom: 12.20.1 + motion-dom: 12.22.0 motion-utils: 12.19.0 tslib: 2.8.1 optionalDependencies: @@ -10364,10 +10425,10 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@15.6.0(@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-core@15.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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.9 + '@orama/orama': 3.1.10 '@shikijs/rehype': 3.7.0 '@shikijs/transformers': 3.7.0 github-slugger: 2.0.0 @@ -10385,36 +10446,36 @@ snapshots: unist-util-visit: 5.0.0 optionalDependencies: '@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) + next: 15.3.5(@playwright/test@1.53.2)(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.10(@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.6.0(@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.6.0(@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.7)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)): + fumadocs-mdx@11.6.10(@fumadocs/mdx-remote@1.3.0(acorn@8.15.0)(fumadocs-core@15.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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.5(@playwright/test@1.53.2)(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.10)(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.6.0(@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-core: 15.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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 tinyexec: 1.0.1 tinyglobby: 0.2.14 unist-util-visit: 5.0.0 - zod: 3.25.67 + zod: 3.25.74 optionalDependencies: - '@fumadocs/mdx-remote': 1.3.0(acorn@8.15.0)(fumadocs-core@15.6.0(@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.7)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + '@fumadocs/mdx-remote': 1.3.0(acorn@8.15.0)(fumadocs-core@15.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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.5(@playwright/test@1.53.2)(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.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - acorn - supports-color - fumadocs-ui@15.6.0(@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.11): + fumadocs-ui@15.6.1(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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.11): 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) @@ -10427,7 +10488,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.6.0(@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-core: 15.6.1(@types/react@19.1.8)(next@15.3.5(@playwright/test@1.53.2)(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 @@ -10438,7 +10499,7 @@ snapshots: tailwind-merge: 3.3.1 optionalDependencies: '@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) + next: 15.3.5(@playwright/test@1.53.2)(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.11 transitivePeerDependencies: - '@oramacloud/client' @@ -10542,8 +10603,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 - globals@11.12.0: {} - globals@14.0.0: {} globalthis@1.0.4: @@ -10681,7 +10740,7 @@ snapshots: dependencies: hermes-estree: 0.25.1 - hono@4.8.3: {} + hono@4.8.4: {} html-encoding-sniffer@4.0.0: dependencies: @@ -10945,7 +11004,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -11015,7 +11074,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.18.2 + ws: 8.18.3 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -11151,11 +11210,7 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@0.517.0(react@19.1.0): - dependencies: - react: 19.1.0 - - lucide-react@0.523.0(react@19.1.0): + lucide-react@0.525.0(react@19.1.0): dependencies: react: 19.1.0 @@ -11163,12 +11218,12 @@ snapshots: magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 magicast@0.3.5: dependencies: - '@babel/parser': 7.27.7 - '@babel/types': 7.27.7 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 source-map-js: 1.2.1 make-dir@4.0.0: @@ -11675,15 +11730,15 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 - motion-dom@12.20.1: + motion-dom@12.22.0: dependencies: motion-utils: 12.19.0 motion-utils@12.19.0: {} - motion@12.20.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + motion@12.23.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - framer-motion: 12.20.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + framer-motion: 12.23.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) tslib: 2.8.1 optionalDependencies: react: 19.1.0 @@ -11705,7 +11760,7 @@ snapshots: nano-css@5.6.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@jridgewell/sourcemap-codec': 1.5.2 + '@jridgewell/sourcemap-codec': 1.5.4 css-tree: 1.1.3 csstype: 3.1.3 fastest-stable-stringify: 2.0.2 @@ -11726,23 +11781,23 @@ snapshots: negotiator@1.0.0: {} - next-intl@4.3.1(next@15.3.4(@babel/core@7.27.7)(@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): + next-intl@4.3.4(next@15.3.5(@babel/core@7.28.0)(@playwright/test@1.53.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(@babel/core@7.27.7)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.5(@babel/core@7.28.0)(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 - use-intl: 4.3.1(react@19.1.0) + use-intl: 4.3.4(react@19.1.0) optionalDependencies: typescript: 5.8.3 - next-intl@4.3.1(next@15.3.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): + next-intl@4.3.4(next@15.3.5(@playwright/test@1.53.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.1)(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.5(@playwright/test@1.53.2)(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.3.1(react@19.1.0) + use-intl: 4.3.4(react@19.1.0) optionalDependencies: typescript: 5.8.3 @@ -11751,9 +11806,9 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - next@15.3.4(@babel/core@7.27.7)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.3.5(@babel/core@7.28.0)(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@next/env': 15.3.4 + '@next/env': 15.3.5 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -11761,25 +11816,25 @@ snapshots: postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(@babel/core@7.27.7)(react@19.1.0) + styled-jsx: 5.1.6(@babel/core@7.28.0)(react@19.1.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.4 - '@next/swc-darwin-x64': 15.3.4 - '@next/swc-linux-arm64-gnu': 15.3.4 - '@next/swc-linux-arm64-musl': 15.3.4 - '@next/swc-linux-x64-gnu': 15.3.4 - '@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.1 + '@next/swc-darwin-arm64': 15.3.5 + '@next/swc-darwin-x64': 15.3.5 + '@next/swc-linux-arm64-gnu': 15.3.5 + '@next/swc-linux-arm64-musl': 15.3.5 + '@next/swc-linux-x64-gnu': 15.3.5 + '@next/swc-linux-x64-musl': 15.3.5 + '@next/swc-win32-arm64-msvc': 15.3.5 + '@next/swc-win32-x64-msvc': 15.3.5 + '@playwright/test': 1.53.2 sharp: 0.34.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - 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): + next@15.3.5(@playwright/test@1.53.2)(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 + '@next/env': 15.3.5 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -11787,17 +11842,17 @@ snapshots: postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(@babel/core@7.27.7)(react@19.1.0) + styled-jsx: 5.1.6(@babel/core@7.28.0)(react@19.1.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.4 - '@next/swc-darwin-x64': 15.3.4 - '@next/swc-linux-arm64-gnu': 15.3.4 - '@next/swc-linux-arm64-musl': 15.3.4 - '@next/swc-linux-x64-gnu': 15.3.4 - '@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.1 + '@next/swc-darwin-arm64': 15.3.5 + '@next/swc-darwin-x64': 15.3.5 + '@next/swc-linux-arm64-gnu': 15.3.5 + '@next/swc-linux-arm64-musl': 15.3.5 + '@next/swc-linux-x64-gnu': 15.3.5 + '@next/swc-linux-x64-musl': 15.3.5 + '@next/swc-win32-arm64-msvc': 15.3.5 + '@next/swc-win32-x64-msvc': 15.3.5 + '@playwright/test': 1.53.2 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.2 transitivePeerDependencies: @@ -11806,7 +11861,7 @@ snapshots: node-releases@2.0.19: {} - nodemailer@7.0.3: {} + nodemailer@7.0.4: {} normalize-path@3.0.0: {} @@ -12037,7 +12092,7 @@ snapshots: piscina@4.9.2: optionalDependencies: - '@napi-rs/nice': 1.0.1 + '@napi-rs/nice': 1.0.4 pkg-types@1.3.1: dependencies: @@ -12045,11 +12100,11 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 - playwright-core@1.53.1: {} + playwright-core@1.53.2: {} - playwright@1.53.1: + playwright@1.53.2: dependencies: - playwright-core: 1.53.1 + playwright-core: 1.53.2 optionalDependencies: fsevents: 2.3.2 @@ -12134,16 +12189,16 @@ snapshots: synckit: 0.8.8 optional: true - prettier-plugin-tailwindcss@0.6.13(prettier-plugin-astro@0.7.2)(prettier@3.6.1): + prettier-plugin-tailwindcss@0.6.13(prettier-plugin-astro@0.7.2)(prettier@3.6.2): dependencies: - prettier: 3.6.1 + prettier: 3.6.2 optionalDependencies: prettier-plugin-astro: 0.7.2 prettier@2.8.8: optional: true - prettier@3.6.1: {} + prettier@3.6.2: {} pretty-format@27.5.1: dependencies: @@ -12239,10 +12294,10 @@ snapshots: react: 19.1.0 scheduler: 0.26.0 - react-email@4.0.17(@babel/core@7.27.7)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-email@4.0.17(@babel/core@7.28.0)(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@babel/parser': 7.27.7 - '@babel/traverse': 7.27.7 + '@babel/parser': 7.28.0 + '@babel/traverse': 7.28.0 chalk: 5.4.1 chokidar: 4.0.3 commander: 13.1.0 @@ -12251,7 +12306,7 @@ snapshots: glob: 11.0.3 log-symbols: 7.0.1 mime-types: 3.0.1 - next: 15.3.4(@babel/core@7.27.7)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.5(@babel/core@7.28.0)(@playwright/test@1.53.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 @@ -12269,10 +12324,10 @@ snapshots: - supports-color - utf-8-validate - react-email@4.0.17(@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-email@4.0.17(@playwright/test@1.53.2)(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.7 - '@babel/traverse': 7.27.7 + '@babel/parser': 7.28.0 + '@babel/traverse': 7.28.0 chalk: 5.4.1 chokidar: 4.0.3 commander: 13.1.0 @@ -12281,7 +12336,7 @@ snapshots: glob: 11.0.3 log-symbols: 7.0.1 mime-types: 3.0.1 - 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) + next: 15.3.5(@playwright/test@1.53.2)(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 @@ -12299,7 +12354,7 @@ snapshots: - supports-color - utf-8-validate - react-hook-form@7.58.1(react@19.1.0): + react-hook-form@7.60.0(react@19.1.0): dependencies: react: 19.1.0 @@ -12337,29 +12392,29 @@ 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.7)(@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.1): + react-scan@0.4.3(@types/react@19.1.8)(next@15.3.5(@babel/core@7.28.0)(@playwright/test@1.53.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)(rollup@4.44.2): dependencies: - '@babel/core': 7.27.7 - '@babel/generator': 7.27.5 - '@babel/types': 7.27.7 + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/types': 7.28.0 '@clack/core': 0.3.5 '@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.44.1) - '@types/node': 20.19.2 + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) + '@types/node': 20.19.4 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.1 + playwright: 1.53.2 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.7)(@playwright/test@1.53.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.5(@babel/core@7.28.0)(@playwright/test@1.53.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) unplugin: 2.1.0 transitivePeerDependencies: - '@types/react' @@ -12560,30 +12615,30 @@ snapshots: reusify@1.1.0: {} - rollup@4.44.1: + rollup@4.44.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.44.1 - '@rollup/rollup-android-arm64': 4.44.1 - '@rollup/rollup-darwin-arm64': 4.44.1 - '@rollup/rollup-darwin-x64': 4.44.1 - '@rollup/rollup-freebsd-arm64': 4.44.1 - '@rollup/rollup-freebsd-x64': 4.44.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.1 - '@rollup/rollup-linux-arm-musleabihf': 4.44.1 - '@rollup/rollup-linux-arm64-gnu': 4.44.1 - '@rollup/rollup-linux-arm64-musl': 4.44.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1 - '@rollup/rollup-linux-riscv64-gnu': 4.44.1 - '@rollup/rollup-linux-riscv64-musl': 4.44.1 - '@rollup/rollup-linux-s390x-gnu': 4.44.1 - '@rollup/rollup-linux-x64-gnu': 4.44.1 - '@rollup/rollup-linux-x64-musl': 4.44.1 - '@rollup/rollup-win32-arm64-msvc': 4.44.1 - '@rollup/rollup-win32-ia32-msvc': 4.44.1 - '@rollup/rollup-win32-x64-msvc': 4.44.1 + '@rollup/rollup-android-arm-eabi': 4.44.2 + '@rollup/rollup-android-arm64': 4.44.2 + '@rollup/rollup-darwin-arm64': 4.44.2 + '@rollup/rollup-darwin-x64': 4.44.2 + '@rollup/rollup-freebsd-arm64': 4.44.2 + '@rollup/rollup-freebsd-x64': 4.44.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.2 + '@rollup/rollup-linux-arm-musleabihf': 4.44.2 + '@rollup/rollup-linux-arm64-gnu': 4.44.2 + '@rollup/rollup-linux-arm64-musl': 4.44.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.2 + '@rollup/rollup-linux-riscv64-gnu': 4.44.2 + '@rollup/rollup-linux-riscv64-musl': 4.44.2 + '@rollup/rollup-linux-s390x-gnu': 4.44.2 + '@rollup/rollup-linux-x64-gnu': 4.44.2 + '@rollup/rollup-linux-x64-musl': 4.44.2 + '@rollup/rollup-win32-arm64-msvc': 4.44.2 + '@rollup/rollup-win32-ia32-msvc': 4.44.2 + '@rollup/rollup-win32-x64-msvc': 4.44.2 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -12812,7 +12867,7 @@ snapshots: - supports-color - utf-8-validate - sonner@2.0.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + sonner@2.0.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -12999,18 +13054,18 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - styled-jsx@5.1.6(@babel/core@7.27.7)(react@19.1.0): + styled-jsx@5.1.6(@babel/core@7.28.0)(react@19.1.0): dependencies: client-only: 0.0.1 react: 19.1.0 optionalDependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.0 stylis@4.3.6: {} sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/gen-mapping': 0.3.12 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -13121,7 +13176,7 @@ snapshots: toggle-selection@1.0.6: {} - token-types@6.0.0: + token-types@6.0.3: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 @@ -13174,7 +13229,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.0(@swc/core@1.12.7)(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.9)(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 @@ -13187,14 +13242,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.44.1 + rollup: 4.44.2 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.7 + '@swc/core': 1.12.9 postcss: 8.5.6 typescript: 5.8.3 transitivePeerDependencies: @@ -13237,7 +13292,7 @@ snapshots: turbo-windows-64: 2.5.4 turbo-windows-arm64: 2.5.4 - tw-animate-css@1.3.4: {} + tw-animate-css@1.3.5: {} type-check@0.4.0: dependencies: @@ -13278,12 +13333,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.29.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -13374,7 +13429,7 @@ snapshots: dependencies: react: 19.1.0 - use-intl@4.3.1(react@19.1.0): + use-intl@4.3.4(react@19.1.0): dependencies: '@formatjs/fast-memoize': 2.2.7 '@schummar/icu-type-parser': 1.21.5 @@ -13418,13 +13473,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -13439,27 +13494,27 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@6.3.5(@types/node@24.0.7)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vite@6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.6 - rollup: 4.44.1 + rollup: 4.44.2 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.0.7 + '@types/node': 24.0.10 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 @@ -13467,27 +13522,27 @@ snapshots: yaml: 2.8.0 optional: true - vite@7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vite@7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.6 - rollup: 4.44.1 + rollup: 4.44.2 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.0.4 + '@types/node': 24.0.10 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 tsx: 4.20.3 yaml: 2.8.0 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -13495,7 +13550,7 @@ snapshots: '@vitest/utils': 3.2.4 chai: 5.2.0 debug: 4.4.1 - expect-type: 1.2.1 + expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 picomatch: 4.0.2 @@ -13505,12 +13560,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.0.0(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@24.0.4)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.2(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.0.4 + '@types/node': 24.0.10 jsdom: 26.1.0 transitivePeerDependencies: - jiti @@ -13631,7 +13686,7 @@ snapshots: ws@8.17.1: {} - ws@8.18.2: {} + ws@8.18.3: {} xml-name-validator@5.0.0: {} @@ -13671,10 +13726,10 @@ snapshots: yoctocolors@2.1.1: {} - zod-validation-error@3.5.2(zod@3.25.67): + zod-validation-error@3.5.2(zod@3.25.74): dependencies: - zod: 3.25.67 + zod: 3.25.74 - zod@3.25.67: {} + zod@3.25.74: {} zwitch@2.0.4: {} diff --git a/scripts/files/file-copy-manager.ts b/scripts/files/file-copy-manager.ts index c53722c73..0d5af3a78 100644 --- a/scripts/files/file-copy-manager.ts +++ b/scripts/files/file-copy-manager.ts @@ -15,15 +15,52 @@ export class FileCopyManager { 'copy-of-vitnode-app', 'root', ); + const singleAppApiDestPath = join( + this.env.WORKSPACE, + 'packages', + 'create-vitnode-app', + 'copy-of-vitnode-app', + 'apps', + 'api-single-app', + ); - if ( - !FileSystem.validatePath(sourcePath, 'web app directory') || - !FileSystem.validatePath(destPath, 'copy-of-vitnode-app directory') - ) { + if (!FileSystem.validatePath(sourcePath, 'web app directory')) { throw new Error('Required paths not found'); } - await this.copyFiles(sourcePath, destPath); + await this.copyFiles(sourcePath, destPath, [ + 'src/app/[locale]/(main)/[...rest]', + 'src/app/[locale]/(main)/not-found.tsx', + 'src/app/[locale]/admin', + 'src/app/favicon.ico', + 'src/app/global-error.tsx', + 'src/app/layout.tsx', + 'src/app/not-found.tsx', + 'postcss.config.mjs', + '.prettierrc.mjs', + ]); + + const apiSourcePath = join(this.env.WORKSPACE, 'apps', 'api'); + const apiDestPath = join( + this.env.WORKSPACE, + 'packages', + 'create-vitnode-app', + 'copy-of-vitnode-app', + 'apps', + 'api', + ); + + await this.copyFiles(apiSourcePath, apiDestPath, [ + 'src', + 'tsconfig.json', + 'drizzle.config.ts', + 'package.json', + ]); + + await this.copyFiles(apiSourcePath, singleAppApiDestPath, [ + 'src/app/api/[...route]', + 'drizzle.config.ts', + ]); } async copyFileOrDirectory( @@ -47,23 +84,11 @@ export class FileCopyManager { } } - async copyFiles(sourcePath: string, destPath: string): Promise { - // Define files and directories to copy (relative paths) - const filesToCopy = [ - 'src/app/[locale]/(main)/[...rest]', - 'src/app/[locale]/(main)/not-found.tsx', - 'src/app/[locale]/admin', - 'src/app/favicon.ico', - 'src/app/global-error.tsx', - 'src/app/layout.tsx', - 'src/app/not-found.tsx', - 'src/app/api/[...route]', - 'tsconfig.json', - 'postcss.config.mjs', - 'drizzle.config.ts', - '.prettierrc.mjs', - ]; - + async copyFiles( + sourcePath: string, + destPath: string, + filesToCopy: string[], + ): Promise { // Handle special files with different names const specialFiles = [ { source: '.gitignore', dest: '.gitignore_template' }, diff --git a/scripts/files/file-system.ts b/scripts/files/file-system.ts index aa3bfbf79..bbb25008a 100644 --- a/scripts/files/file-system.ts +++ b/scripts/files/file-system.ts @@ -23,7 +23,7 @@ export class FileSystem { } for (const item of readdirSync(from)) { - if (item === '(plugins)') continue; + if (item === '(plugins)' || item === '.env') continue; const sourcePath = join(from, item); const destinationPath = join(to, item); @@ -44,6 +44,7 @@ export class FileSystem { static validatePath(filePath: string, description: string): boolean { if (existsSync(filePath)) return true; + console.error(`✖ Missing ${description}: ${filePath}`); return false; } diff --git a/turbo.json b/turbo.json index a57517788..21757c1d2 100644 --- a/turbo.json +++ b/turbo.json @@ -10,28 +10,29 @@ "dependsOn": ["^db:migrate"], "persistent": true, "cache": false, + "inputs": ["$TURBO_DEFAULT$", ".env*"], "env": ["POSTGRES_URL"] }, "db:push": { "dependsOn": ["^db:push"], "cache": false, "persistent": true, + "inputs": ["$TURBO_DEFAULT$", ".env*"], "env": ["POSTGRES_URL"] }, "build:plugins": { "dependsOn": ["^build:plugins"], - "inputs": ["$TURBO_DEFAULT$"], "outputs": ["dist/**"] }, "build": { "dependsOn": ["^build:plugins", "^build"], "inputs": ["$TURBO_DEFAULT$", ".env*"], "outputs": [".next/**", "!.next/cache/**", "dist/**"], - "env": ["POSTGRES_URL"] + "env": ["POSTGRES_URL", "NEXT_PUBLIC_API_URL", "NEXT_PUBLIC_WEB_URL"] }, "build:scripts": { "dependsOn": ["^build:scripts"], - "inputs": ["$TURBO_DEFAULT$"], + "cache": false, "outputs": ["dist/**"] }, "lint": { @@ -43,7 +44,8 @@ "dev": { "cache": false, "persistent": true, - "env": ["POSTGRES_URL"] + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "env": ["POSTGRES_URL", "NEXT_PUBLIC_API_URL", "NEXT_PUBLIC_WEB_URL"] }, "start": { "dependsOn": ["^start"]