From aec3f2ff980e8edd26557834d387c5332394ab65 Mon Sep 17 00:00:00 2001 From: NHoarau Date: Fri, 12 Jun 2026 23:15:55 +0400 Subject: [PATCH 01/14] feat(project-crud-sync): add planning artifacts for CRUD project lifecycle - proposal.md: defines scope and motivation for unified CRUD operations - design.md: documents architecture decisions (Postgres, Docker Compose, Nest CLI scaffolding, Schema-Driven Pipes from @workspace/schema) - specs: contract for project lifecycle management, migrations and seeding - tasks: implementation checklist covering infra, API, Web and testing --- .../changes/project-crud-sync/.openspec.yaml | 2 ++ openspec/changes/project-crud-sync/design.md | 27 +++++++++++++++++++ .../changes/project-crud-sync/proposal.md | 21 +++++++++++++++ .../specs/project-full-lifecycle/spec.md | 22 +++++++++++++++ openspec/changes/project-crud-sync/tasks.md | 19 +++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 openspec/changes/project-crud-sync/.openspec.yaml create mode 100644 openspec/changes/project-crud-sync/design.md create mode 100644 openspec/changes/project-crud-sync/proposal.md create mode 100644 openspec/changes/project-crud-sync/specs/project-full-lifecycle/spec.md create mode 100644 openspec/changes/project-crud-sync/tasks.md diff --git a/openspec/changes/project-crud-sync/.openspec.yaml b/openspec/changes/project-crud-sync/.openspec.yaml new file mode 100644 index 0000000..8fe2055 --- /dev/null +++ b/openspec/changes/project-crud-sync/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-06-12 diff --git a/openspec/changes/project-crud-sync/design.md b/openspec/changes/project-crud-sync/design.md new file mode 100644 index 0000000..3aa6057 --- /dev/null +++ b/openspec/changes/project-crud-sync/design.md @@ -0,0 +1,27 @@ +## Context + +The previous context remains: a unified technical layer for full CRUD operations is required for the `Project` resource across API and Web UI layers. The goal is to establish a canonical method for initializing a Project resource that can be consumed both programmatically (via API) and through the standard user interface. This requires centralizing validation and persistence logic. + +## Goals / Non-Goals + +**Goals:** +* To expose a stable, RESTful endpoint (`POST /api/v1/projects`) for project creation. +* To ensure data consistency: any project created via the API must behave identically to one created via the Web UI (and vice versa). +* To establish `project-creation` as the single source of truth requirement for project setup. +* **Local Development**: The entire stack (API, Web, DB) must be orchestrated via Docker Compose to guarantee a reproducible and persistent development environment. + +**Non-Goals:** +* Implementing granular ownership/permission checks within the creation payload itself; this should be handled by middleware/services post-creation. +* Handling advanced lifecycle events (e.g., project suspension) via the creation endpoint—these should use dedicated endpoints. + +## Decisions + +* **Architecture**: The implementation must use a clear separation of concerns: Controllers handle HTTP concerns (routing, validation), Services encapsulate business logic, and Repositories handle data access. NestJS's module system enforces this structure naturally. +* **Database Technology & Setup**: PostgreSQL is mandated as the standard database engine for persistence. The root of the monorepo MUST have a `docker-compose.yml` dedicated to infrastructure services (Postgres, volumes). API and Web apps run natively via `pnpm dev` — no containerization for application code in development. +* **Lifecycle Management**: Database migrations (schema versioning) must be executed *manually* via a dedicated CLI tool. This is critical for controlling both local and production deployment processes. +* **Input Validation Standard (NEW)**: Input validation for all API endpoints MUST be handled at the Controller level using **Schema-Driven Pipes**. All schemas used (`Project` DTOs, etc.) must be imported from and adhere to the contract defined in the shared `@workspace/schema` package. + +## Risks / Trade-offs + +[Risk] The migration tooling might not cleanly support optional data seeding after a schema change. +[Mitigation] We must provide clear setup steps in the final documentation (`tasks.md`) to ensure developers run migrations first, then seed scripts separately (and idempotently). diff --git a/openspec/changes/project-crud-sync/proposal.md b/openspec/changes/project-crud-sync/proposal.md new file mode 100644 index 0000000..a572c96 --- /dev/null +++ b/openspec/changes/project-crud-sync/proposal.md @@ -0,0 +1,21 @@ +## Why + +Current project management lacks a unified layer for full CRUD operations. The ability to create, read, update, and delete projects must be available consistently across both the internal API and the public Web UI. Furthermore, robust data lifecycle management—including database migrations (schema changes) and repeatable initial population via seeding—is required to ensure data integrity and development ease. + +## What Changes + +* **New Capability**: Full Project Lifecycle Management will be implemented: Create (C), Read (R), Update (U), Delete (D). +* **Technical Change**: The system must incorporate a dedicated, idempotent database migration mechanism for the `Project` entity. +* **Data Initialization**: Implement optional seeding mechanisms to populate initial dummy data or test scenarios upon deployment/setup. + +## Capabilities + +### New Capabilities +- `project-full-lifecycle`: Governing all CRUD operations and the associated schema management (migrations) for the Project resource. + +### Modified Capabilities + + +## Impact + +This change affects the core persistence layer, requiring database migrations (`Project` table/schema), service logic updates in both API and Web layers to handle full CRUD operations, and introducing new tooling/hooks for schema versioning (migrations) and initial data population (seeding scripts). diff --git a/openspec/changes/project-crud-sync/specs/project-full-lifecycle/spec.md b/openspec/changes/project-crud-sync/specs/project-full-lifecycle/spec.md new file mode 100644 index 0000000..af3e37b --- /dev/null +++ b/openspec/changes/project-crud-sync/specs/project-full-lifecycle/spec.md @@ -0,0 +1,22 @@ +## ADDED Requirements + +### Requirement: Project Lifecycle Management (CRUD) +The system SHALL provide full CRUD functionality for the `Project` resource, managed by a central service layer. All operations must be atomic and transactionally consistent across API and Web paths. This includes validation on creation (name uniqueness). + +#### Scenario: Successful Project Creation +- **WHEN** valid payload {name, ownerId, templateType} is submitted to POST /projects +- **THEN** a unique Project resource record is created with status 'ACTIVE', and all related metadata are initialized correctly. + +### Requirement: Schema Migration Enforcement +The system SHALL enforce database schema changes via versioned migrations (e.g., using an established ORM migration tool). The deployment process MUST fail if the current schema does not match the expected state defined by the latest migration script. + +#### Scenario: Applying New Schema +- **WHEN** deploying a change requiring a new column (`last_updated`) on `projects` table +- **THEN** the deployment pipeline runs the required migration, adding the column without breaking existing application runtime logic (e.g., providing a default value or nullability). + +### Requirement: Optional Data Seeding +The system SHALL support optional data seeding scripts for development and testing environments. These scripts MUST be idempotent to allow multiple safe executions. + +#### Scenario: Running Seed Scripts +- **WHEN** running the setup script `pnpm run db:seed` in a test environment with existing data +- **THEN** any record matching seed criteria (e.g., default user) is updated rather than duplicated, and the script logs successful updates/inserts. \ No newline at end of file diff --git a/openspec/changes/project-crud-sync/tasks.md b/openspec/changes/project-crud-sync/tasks.md new file mode 100644 index 0000000..f3d32b5 --- /dev/null +++ b/openspec/changes/project-crud-sync/tasks.md @@ -0,0 +1,19 @@ +## 1. Database & Infrastructure Setup (Mandatory First Step) + +- [ ] 1.1 **Dockerization**: Create a root `docker-compose.yml` (`work-hub-server/docker-compose.yml`) that declares a PostgreSQL service and named volumes for persistence. Do NOT include API or Web app containers — they run natively during development. +- [ ] 1.2 **Persistence**: Define and map persistent volumes in the root `docker-compose.yml` to ensure project data survives container restarts. +- [ ] 1.3 **CLI Utility**: Implement a dedicated command/utility (e.g., `db:setup`) that orchestrates the execution of migrations and seeding, ensuring idempotency. + +## 2. API Layer Implementation (API) + +- [ ] 2.1 **Scaffolding**: Use the Nest CLI (`nest generate resource`) to create the basic resource structure for Project (Controller, Service, Module). This ensures adherence to module structure, dependency injection patterns, and common boilerplate across all APIs in the monorepo. +- [ ] 2.2 Implement necessary request validation using **Schema-Driven Pipes** that import their structure from `@workspace/schema`, ensuring consistency between API and Web layers. + +## 3. Web Layer Implementation (Web) + +- [ ] 3.1 Update `apps/web` store/composables to call the new API endpoints and manage state correctly following successful write or delete operations. + +## 4. Testing & Tooling + +- [ ] 4.1 Write comprehensive unit tests covering the Controller, the Service, and the Repository layers. +- [ ] 4.2 Update E2E test suites to verify complete CRUD workflows via HTTP calls and UI interactions, ensuring the service layer is correctly tested against a containerized DB. -- 2.43.7 From 7d72932a167c80867ae9581c4efdbb5735f29273 Mon Sep 17 00:00:00 2001 From: NHoarau Date: Sun, 21 Jun 2026 22:30:37 +0400 Subject: [PATCH 02/14] feat(api): first version of the implementation, done with opencode and multiple iterations --- .env.example | 12 + .fallowrc.json | 3 +- AGENTS.md | 1 - apps/api/eslint.config.mjs | 79 +- apps/api/package.json | 16 +- apps/api/src/app.module.ts | 4 +- .../common/pipes/valibot-validation.pipe.ts | 28 + apps/api/src/database/database.module.ts | 9 + apps/api/src/database/drizzle.service.ts | 43 + .../src/project/project.controller.spec.ts | 74 ++ apps/api/src/project/project.controller.ts | 37 + apps/api/src/project/project.module.ts | 10 + apps/api/src/project/project.repository.ts | 36 + apps/api/src/project/project.service.spec.ts | 112 +++ apps/api/src/project/project.service.ts | 32 + apps/api/test/__mocks__/schema.ts | 21 + apps/api/test/__mocks__/valibot.ts | 6 + apps/api/test/app.e2e-spec.ts | 63 +- apps/api/test/jest-e2e.json | 9 +- apps/api/tsconfig.build.json | 3 + apps/api/tsconfig.eslint.json | 5 + apps/api/tsconfig.json | 9 +- apps/web/app/composables/useProjectApi.ts | 106 +++ apps/web/eslint.config.mjs | 1 + apps/web/nuxt.config.ts | 6 + docker-compose.yml | 22 + openspec/changes/project-crud-sync/tasks.md | 16 +- package.json | 3 +- packages/schema/drizzle.config.ts | 14 + .../schema/drizzle/0000_yielding_photon.sql | 26 + .../schema/drizzle/meta/0000_snapshot.json | 179 ++++ packages/schema/drizzle/meta/_journal.json | 13 + packages/schema/eslint.config.mjs | 10 + packages/schema/package.json | 13 +- packages/schema/seed.ts | 31 + packages/schema/src/drizzle/enums.ts | 9 - packages/schema/src/drizzle/index.ts | 4 - packages/schema/src/drizzle/projects.ts | 22 +- packages/schema/src/drizzle/refs.ts | 4 + packages/schema/src/drizzle/relations.ts | 4 + packages/schema/src/drizzle/tasks.ts | 33 +- packages/schema/src/index.ts | 44 +- packages/schema/src/valibot.ts | 34 - packages/schema/tsconfig.json | 3 +- packages/tooling/eslint/nestjs.mjs | 2 +- packages/tooling/package.json | 1 - pnpm-lock.yaml | 843 +++++++++++++++--- turbo.json | 3 +- 48 files changed, 1838 insertions(+), 220 deletions(-) create mode 100644 .env.example create mode 100644 apps/api/src/common/pipes/valibot-validation.pipe.ts create mode 100644 apps/api/src/database/database.module.ts create mode 100644 apps/api/src/database/drizzle.service.ts create mode 100644 apps/api/src/project/project.controller.spec.ts create mode 100644 apps/api/src/project/project.controller.ts create mode 100644 apps/api/src/project/project.module.ts create mode 100644 apps/api/src/project/project.repository.ts create mode 100644 apps/api/src/project/project.service.spec.ts create mode 100644 apps/api/src/project/project.service.ts create mode 100644 apps/api/test/__mocks__/schema.ts create mode 100644 apps/api/test/__mocks__/valibot.ts create mode 100644 apps/api/tsconfig.eslint.json create mode 100644 apps/web/app/composables/useProjectApi.ts create mode 100644 docker-compose.yml create mode 100644 packages/schema/drizzle.config.ts create mode 100644 packages/schema/drizzle/0000_yielding_photon.sql create mode 100644 packages/schema/drizzle/meta/0000_snapshot.json create mode 100644 packages/schema/drizzle/meta/_journal.json create mode 100644 packages/schema/seed.ts delete mode 100644 packages/schema/src/drizzle/enums.ts delete mode 100644 packages/schema/src/drizzle/index.ts create mode 100644 packages/schema/src/drizzle/refs.ts delete mode 100644 packages/schema/src/valibot.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e9e87ef --- /dev/null +++ b/.env.example @@ -0,0 +1,12 @@ +# PostgreSQL +POSTGRES_HOST=localhost +POSTGRES_PORT=5432 +POSTGRES_USER=postgres +POSTGRES_PASSWORD=postgres +POSTGRES_DB=work_hub + +# API +API_PORT=3001 + +# Web +WEB_PORT=3000 diff --git a/.fallowrc.json b/.fallowrc.json index 116f517..2ea47a1 100644 --- a/.fallowrc.json +++ b/.fallowrc.json @@ -10,5 +10,6 @@ "mode": "semantic", "ignore": ["**/lib/**", "**/legacy/**", "**/__generated__/**", "**/generated/**"] }, - "rules": {} + "rules": {}, + "ignoreDependencies": ["@nestjs/schematics", "eslint-plugin-prettier"] } diff --git a/AGENTS.md b/AGENTS.md index 9831100..7deac64 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -82,7 +82,6 @@ All commands run from the repository root. - Key relaxed rules: - `@typescript-eslint/no-explicit-any: off` - `@typescript-eslint/no-floating-promises: warn` - - `@typescript-eslint/no-unsafe-argument: warn` - Web uses `@nuxt/eslint` with stylistic config (`commaDangle: never`, `braceStyle: 1tbs`). ### TypeScript diff --git a/apps/api/eslint.config.mjs b/apps/api/eslint.config.mjs index bb2c064..eabfb7b 100644 --- a/apps/api/eslint.config.mjs +++ b/apps/api/eslint.config.mjs @@ -1,3 +1,78 @@ -import { createNestjsConfig } from "@workspace/tooling/eslint/nestjs"; +import { base, baseRules } from "@workspace/tooling/eslint/base"; +import { globals } from "@workspace/tooling/eslint/nestjs"; +import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; +import { defineConfig } from "eslint/config"; -export default createNestjsConfig(import.meta.dirname); +export default defineConfig( + { ignores: ["eslint.config.mjs"] }, + ...base, + eslintPluginPrettierRecommended, + { + files: ["src/**/*.ts"], + languageOptions: { + globals: { + ...globals.node, + ...globals.jest, + }, + sourceType: "commonjs", + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ["src/**/*.ts"], + rules: { + "class-methods-use-this": "off", + "@typescript-eslint/no-floating-promises": "warn", + "@typescript-eslint/no-unsafe-argument": "warn", + "@typescript-eslint/no-unsafe-assignment": "warn", + "@typescript-eslint/no-unsafe-call": "warn", + "@typescript-eslint/no-unsafe-member-access": "warn", + "@typescript-eslint/no-unsafe-return": "warn", + "prettier/prettier": ["error", { endOfLine: "auto" }], + }, + }, + { + files: ["src/**/*.spec.ts"], + languageOptions: { + globals: { + ...globals.node, + ...globals.jest, + }, + sourceType: "commonjs", + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + rules: { + "@typescript-eslint/unbound-method": "off", + }, + }, + { + files: ["test/**/*.ts"], + languageOptions: { + globals: { + ...globals.node, + ...globals.jest, + }, + sourceType: "commonjs", + parserOptions: { + project: "./tsconfig.eslint.json", + tsconfigRootDir: import.meta.dirname, + }, + }, + rules: { + "class-methods-use-this": "off", + "@typescript-eslint/no-floating-promises": "warn", + "@typescript-eslint/no-unsafe-argument": "warn", + "@typescript-eslint/no-unsafe-assignment": "warn", + "@typescript-eslint/no-unsafe-call": "warn", + "@typescript-eslint/no-unsafe-member-access": "warn", + "@typescript-eslint/no-unsafe-return": "warn", + "prettier/prettier": ["error", { endOfLine: "auto" }], + }, + }, +); diff --git a/apps/api/package.json b/apps/api/package.json index 01065a5..5243bd8 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -26,27 +26,31 @@ "@nestjs/core": "^11.1.26", "@nestjs/platform-express": "^11.1.26", "@workspace/schema": "workspace:*", + "drizzle-orm": "^0.45.2", + "pg": "^8.21.0", "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.2" + "rxjs": "^7.8.2", + "valibot": "^1.4.1" }, "devDependencies": { + "@jest/globals": "^30.4.1", "@nestjs/cli": "^11.0.23", "@nestjs/schematics": "^11.1.0", "@nestjs/testing": "^11.1.26", "@types/express": "^5.0.6", "@types/jest": "^30.0.0", "@types/node": "^25.9.3", + "@types/pg": "^8.20.0", "@types/supertest": "^7.2.0", "@workspace/tooling": "workspace:*", "eslint": "^10.4.1", + "eslint-plugin-prettier": "^5.5.6", "jest": "^30.4.2", "prettier": "^3.8.4", - "source-map-support": "^0.5.21", "supertest": "^7.2.2", "ts-jest": "^29.4.11", "ts-loader": "^9.6.0", "ts-node": "^10.9.2", - "tsconfig-paths": "^4.2.0", "typescript": "^6.0.3" }, "jest": { @@ -64,6 +68,10 @@ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", - "testEnvironment": "node" + "testEnvironment": "node", + "moduleNameMapper": { + "^@workspace/schema$": "/../test/__mocks__/schema.ts", + "^valibot$": "/../test/__mocks__/valibot.ts" + } } } diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts index e93d824..c1b0d87 100644 --- a/apps/api/src/app.module.ts +++ b/apps/api/src/app.module.ts @@ -1,9 +1,11 @@ import { Module } from "@nestjs/common"; import { AppController } from "./app.controller"; import { AppService } from "./app.service"; +import { ProjectModule } from "./project/project.module"; +import { DatabaseModule } from "./database/database.module"; @Module({ - imports: [], + imports: [ProjectModule, DatabaseModule], controllers: [AppController], providers: [AppService], }) diff --git a/apps/api/src/common/pipes/valibot-validation.pipe.ts b/apps/api/src/common/pipes/valibot-validation.pipe.ts new file mode 100644 index 0000000..01ebced --- /dev/null +++ b/apps/api/src/common/pipes/valibot-validation.pipe.ts @@ -0,0 +1,28 @@ +import { PipeTransform, Injectable, BadRequestException } from "@nestjs/common"; +import { safeParse, type InferOutput, type BaseSchema, type BaseIssue } from "valibot"; + +@Injectable() +export class ValibotValidationPipe implements PipeTransform { + constructor(private readonly schema: BaseSchema>) {} + + transform(value: unknown): InferOutput>> { + const result = safeParse(this.schema, value); + + if (!result.success) { + const messages = result.issues.map((issue) => { + const path = issue.path?.map((p) => String(p.key)).join(".") ?? "root"; + return { + path, + message: issue.message, + }; + }); + throw new BadRequestException({ + statusCode: 400, + message: "Validation failed", + errors: messages, + }); + } + + return result.output; + } +} diff --git a/apps/api/src/database/database.module.ts b/apps/api/src/database/database.module.ts new file mode 100644 index 0000000..185bc03 --- /dev/null +++ b/apps/api/src/database/database.module.ts @@ -0,0 +1,9 @@ +import { Global, Module } from "@nestjs/common"; +import { DrizzleService } from "./drizzle.service"; + +@Global() +@Module({ + providers: [DrizzleService], + exports: [DrizzleService], +}) +export class DatabaseModule {} diff --git a/apps/api/src/database/drizzle.service.ts b/apps/api/src/database/drizzle.service.ts new file mode 100644 index 0000000..480fc2f --- /dev/null +++ b/apps/api/src/database/drizzle.service.ts @@ -0,0 +1,43 @@ +import { Injectable, OnModuleInit, OnModuleDestroy } from "@nestjs/common"; +import { Pool } from "pg"; +import { + drizzle, + NodePgDatabase, + migrate, + projects, + tasks, + projectsRelations, + tasksRelations, + migrationsDir, +} from "@workspace/schema"; + +const DEFAULT_PG_PORT = 5432; + +@Injectable() +export class DrizzleService implements OnModuleInit, OnModuleDestroy { + private pool: Pool; + public db: NodePgDatabase>; + + constructor() { + this.pool = new Pool({ + host: String(process.env.POSTGRES_HOST ?? "localhost"), + port: Number(process.env.POSTGRES_PORT ?? DEFAULT_PG_PORT), + user: String(process.env.POSTGRES_USER ?? "postgres"), + password: String(process.env.POSTGRES_PASSWORD ?? "postgres"), + database: String(process.env.POSTGRES_DB ?? "work_hub"), + }); + this.db = drizzle(this.pool, { + schema: { projects, tasks, projectsRelations, tasksRelations }, + }); + } + + async onModuleInit() { + await migrate(this.db, { + migrationsFolder: migrationsDir, + }); + } + + async onModuleDestroy() { + await this.pool.end(); + } +} diff --git a/apps/api/src/project/project.controller.spec.ts b/apps/api/src/project/project.controller.spec.ts new file mode 100644 index 0000000..362c7a5 --- /dev/null +++ b/apps/api/src/project/project.controller.spec.ts @@ -0,0 +1,74 @@ +import { Test, TestingModule } from "@nestjs/testing"; +import { ProjectController } from "./project.controller"; +import { ProjectService } from "./project.service"; +import { ProjectRepository } from "./project.repository"; + +describe("ProjectController", () => { + let controller: ProjectController; + + const mockRepository = { + create: jest.fn(), + findAll: jest.fn(), + findOne: jest.fn(), + update: jest.fn(), + remove: jest.fn(), + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ProjectController], + providers: [ProjectService, { provide: ProjectRepository, useValue: mockRepository }], + }).compile(); + + controller = module.get(ProjectController); + }); + + it("should be defined", () => { + expect(controller).toBeDefined(); + }); + + describe("findAll", () => { + it("should return an array", async () => { + mockRepository.findAll.mockResolvedValue([{ id: "1", name: "Test" }]); + const result = await controller.findAll(); + expect(Array.isArray(result)).toBe(true); + }); + }); + + describe("findOne", () => { + it("should return an object with the given id", async () => { + const expected = { id: "1", name: "Test" }; + mockRepository.findOne.mockResolvedValue(expected); + const result = await controller.findOne("1"); + expect(result).toEqual(expected); + }); + }); + + describe("create", () => { + it("should return the created body", async () => { + const body = { name: "Test Project" }; + mockRepository.create.mockResolvedValue(body); + const result = await controller.create(body); + expect(result).toEqual(body); + }); + }); + + describe("update", () => { + it("should merge id with the update body", async () => { + const body = { name: "Updated" }; + mockRepository.findOne.mockResolvedValue({ id: "1" }); + mockRepository.update.mockResolvedValue({ id: "1", ...body }); + const result = await controller.update("1", body); + expect(result).toEqual({ id: "1", ...body }); + }); + }); + + describe("remove", () => { + it("should return the removed id", async () => { + mockRepository.findOne.mockResolvedValue({ id: "1" }); + mockRepository.remove.mockResolvedValue({ id: "1" }); + const result = await controller.remove("1"); + expect(result).toEqual({ id: "1" }); + }); + }); +}); diff --git a/apps/api/src/project/project.controller.ts b/apps/api/src/project/project.controller.ts new file mode 100644 index 0000000..be96c3e --- /dev/null +++ b/apps/api/src/project/project.controller.ts @@ -0,0 +1,37 @@ +import { Controller, Get, Post, Body, Patch, Param, Delete, ParseUUIDPipe } from "@nestjs/common"; +import { ProjectService } from "./project.service"; +import { projectInsert, projectUpdate, type ProjectInsertDTO, type ProjectUpdateDTO } from "@workspace/schema"; +import { ValibotValidationPipe } from "../common/pipes/valibot-validation.pipe"; + +@Controller("projects") +export class ProjectController { + constructor(private readonly projectService: ProjectService) {} + + @Post() + create(@Body(new ValibotValidationPipe(projectInsert)) body: ProjectInsertDTO) { + return this.projectService.create(body); + } + + @Get() + findAll() { + return this.projectService.findAll(); + } + + @Get(":id") + findOne(@Param("id", ParseUUIDPipe) id: string) { + return this.projectService.findOne(id); + } + + @Patch(":id") + update( + @Param("id", ParseUUIDPipe) id: string, + @Body(new ValibotValidationPipe(projectUpdate)) body: ProjectUpdateDTO, + ) { + return this.projectService.update(id, body); + } + + @Delete(":id") + remove(@Param("id", ParseUUIDPipe) id: string) { + return this.projectService.remove(id); + } +} diff --git a/apps/api/src/project/project.module.ts b/apps/api/src/project/project.module.ts new file mode 100644 index 0000000..23b2795 --- /dev/null +++ b/apps/api/src/project/project.module.ts @@ -0,0 +1,10 @@ +import { Module } from "@nestjs/common"; +import { ProjectService } from "./project.service"; +import { ProjectController } from "./project.controller"; +import { ProjectRepository } from "./project.repository"; + +@Module({ + controllers: [ProjectController], + providers: [ProjectService, ProjectRepository], +}) +export class ProjectModule {} diff --git a/apps/api/src/project/project.repository.ts b/apps/api/src/project/project.repository.ts new file mode 100644 index 0000000..5804c73 --- /dev/null +++ b/apps/api/src/project/project.repository.ts @@ -0,0 +1,36 @@ +import { Injectable } from "@nestjs/common"; +import { projects, eq, ProjectInsertDTO, ProjectUpdateDTO } from "@workspace/schema"; +import { DrizzleService } from "../database/drizzle.service"; + +@Injectable() +export class ProjectRepository { + constructor(private readonly drizzle: DrizzleService) {} + + private get db() { + return this.drizzle.db; + } + + async create(body: ProjectInsertDTO) { + const [project] = await this.db.insert(projects).values(body).returning(); + return project; + } + + findAll() { + return this.db.select().from(projects); + } + + async findOne(id: string) { + const [project] = await this.db.select().from(projects).where(eq(projects.id, id)); + return project; + } + + async update(id: string, body: ProjectUpdateDTO) { + const [project] = await this.db.update(projects).set(body).where(eq(projects.id, id)).returning(); + return project; + } + + async remove(id: string) { + const [project] = await this.db.delete(projects).where(eq(projects.id, id)).returning(); + return project; + } +} diff --git a/apps/api/src/project/project.service.spec.ts b/apps/api/src/project/project.service.spec.ts new file mode 100644 index 0000000..a83139d --- /dev/null +++ b/apps/api/src/project/project.service.spec.ts @@ -0,0 +1,112 @@ +import { Test, TestingModule } from "@nestjs/testing"; +import { NotFoundException } from "@nestjs/common"; +import { ProjectService } from "./project.service"; +import { ProjectRepository } from "./project.repository"; + +type MockProject = { id: string; name: string }; + +describe("ProjectService", () => { + let service: ProjectService; + + const mockFindAll = jest.fn, []>(); + const mockFindOne = jest.fn, [string]>(); + const mockCreate = jest.fn, [Record]>(); + const mockUpdate = jest.fn, [string, Record]>(); + const mockRemove = jest.fn, [string]>(); + + beforeEach(async () => { + mockFindAll.mockReset(); + mockFindOne.mockReset(); + mockCreate.mockReset(); + mockUpdate.mockReset(); + mockRemove.mockReset(); + + const module: TestingModule = await Test.createTestingModule({ + providers: [ + ProjectService, + { + provide: ProjectRepository, + useValue: { + findAll: mockFindAll, + findOne: mockFindOne, + create: mockCreate, + update: mockUpdate, + remove: mockRemove, + }, + }, + ], + }).compile(); + + service = module.get(ProjectService); + }); + + it("should be defined", () => { + expect(service).toBeDefined(); + }); + + describe("findAll", () => { + it("should return all projects", async () => { + const expected = [{ id: "1", name: "Test" }]; + mockFindAll.mockResolvedValue(expected); + + const result = await service.findAll(); + expect(result).toEqual(expected); + expect(mockFindAll).toHaveBeenCalled(); + }); + }); + + describe("findOne", () => { + it("should return a project by id", async () => { + const expected = { id: "1", name: "Test" }; + mockFindOne.mockResolvedValue(expected); + + const result = await service.findOne("1"); + expect(result).toEqual(expected); + expect(mockFindOne).toHaveBeenCalledWith("1"); + }); + + it("should throw NotFoundException when project not found", async () => { + mockFindOne.mockResolvedValue(undefined); + + await expect(service.findOne("nonexistent")).rejects.toThrow(NotFoundException); + }); + }); + + describe("create", () => { + it("should create and return a project", async () => { + const body = { name: "New Project" }; + const expected = { id: "1", name: "New Project" }; + mockCreate.mockResolvedValue(expected); + + const result = await service.create(body); + expect(result).toEqual(expected); + expect(mockCreate).toHaveBeenCalledWith(body); + }); + }); + + describe("update", () => { + it("should update and return a project", async () => { + const body = { name: "Updated" }; + const expected = { id: "1", name: "Updated" }; + mockFindOne.mockResolvedValue({ id: "1" } as MockProject); + mockUpdate.mockResolvedValue(expected); + + const result = await service.update("1", body); + expect(result).toEqual(expected); + expect(mockFindOne).toHaveBeenCalledWith("1"); + expect(mockUpdate).toHaveBeenCalledWith("1", body); + }); + }); + + describe("remove", () => { + it("should delete and return a project", async () => { + mockFindOne.mockResolvedValue({ id: "1" } as MockProject); + mockRemove.mockResolvedValue({ id: "1" } as MockProject); + + const result = await service.remove("1"); + expect(result).toEqual({ id: "1" }); + expect(mockFindOne).toHaveBeenCalledWith("1"); + expect(mockRemove).toHaveBeenCalledWith("1"); + }); + }); +}); diff --git a/apps/api/src/project/project.service.ts b/apps/api/src/project/project.service.ts new file mode 100644 index 0000000..c0f43d4 --- /dev/null +++ b/apps/api/src/project/project.service.ts @@ -0,0 +1,32 @@ +import { Injectable, NotFoundException } from "@nestjs/common"; +import type { ProjectInsertDTO, ProjectUpdateDTO } from "@workspace/schema"; +import { ProjectRepository } from "./project.repository"; + +@Injectable() +export class ProjectService { + constructor(private readonly projectRepository: ProjectRepository) {} + + create(body: ProjectInsertDTO) { + return this.projectRepository.create(body); + } + + findAll() { + return this.projectRepository.findAll(); + } + + async findOne(id: string) { + const project = await this.projectRepository.findOne(id); + if (!project) throw new NotFoundException(); + return project; + } + + async update(id: string, body: ProjectUpdateDTO) { + await this.findOne(id); + return this.projectRepository.update(id, body); + } + + async remove(id: string) { + await this.findOne(id); + return this.projectRepository.remove(id); + } +} diff --git a/apps/api/test/__mocks__/schema.ts b/apps/api/test/__mocks__/schema.ts new file mode 100644 index 0000000..bef01d0 --- /dev/null +++ b/apps/api/test/__mocks__/schema.ts @@ -0,0 +1,21 @@ +import { jest } from "@jest/globals"; + +const noopSchema = { + type: "object", + entries: {}, +} as const; + +const mockTable = {}; + +class MockNodePgDatabase {} + +export const projectInsert = noopSchema; +export const projectUpdate = noopSchema; +export const projects = mockTable; +export const tasks = mockTable; +export const projectsRelations = {}; +export const tasksRelations = {}; +export const eq = jest.fn(() => ({})); +export const drizzle = jest.fn(() => new MockNodePgDatabase()); +export const NodePgDatabase = MockNodePgDatabase; +export const migrate = jest.fn(() => Promise.resolve()); diff --git a/apps/api/test/__mocks__/valibot.ts b/apps/api/test/__mocks__/valibot.ts new file mode 100644 index 0000000..7e23e27 --- /dev/null +++ b/apps/api/test/__mocks__/valibot.ts @@ -0,0 +1,6 @@ +import { jest } from "@jest/globals"; + +export const safeParse = jest.fn((_schema: unknown, input: unknown) => ({ + success: true as const, + output: input, +})); diff --git a/apps/api/test/app.e2e-spec.ts b/apps/api/test/app.e2e-spec.ts index fa8410c..05380c0 100644 --- a/apps/api/test/app.e2e-spec.ts +++ b/apps/api/test/app.e2e-spec.ts @@ -3,20 +3,81 @@ import { INestApplication } from "@nestjs/common"; import request from "supertest"; import { App } from "supertest/types"; import { AppModule } from "./../src/app.module"; +import { ProjectRepository } from "./../src/project/project.repository"; describe("AppController (e2e)", () => { let app: INestApplication; + const TEST_UUID = "550e8400-e29b-41d4-a716-446655440000"; + + const mockRepository = { + create: jest.fn(), + findAll: jest.fn(), + findOne: jest.fn(), + update: jest.fn(), + remove: jest.fn(), + }; + beforeEach(async () => { + mockRepository.findAll.mockResolvedValue([{ id: TEST_UUID, name: "Test" }]); + mockRepository.findOne.mockResolvedValue({ id: TEST_UUID, name: "Test" }); + mockRepository.create.mockResolvedValue({ id: TEST_UUID, name: "E2E Project" }); + mockRepository.update.mockResolvedValue({ id: TEST_UUID, name: "Updated E2E" }); + mockRepository.remove.mockResolvedValue({ id: TEST_UUID }); + const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], - }).compile(); + }) + .overrideProvider(ProjectRepository) + .useValue(mockRepository) + .compile(); app = moduleFixture.createNestApplication(); await app.init(); }); + afterEach(async () => { + await app.close(); + }); + it("/ (GET)", () => { return request(app.getHttpServer()).get("/").expect(200).expect("Hello World!"); }); + + describe("/projects", () => { + it("GET /projects returns an array", () => { + return request(app.getHttpServer()) + .get("/projects") + .expect(200) + .expect([{ id: TEST_UUID, name: "Test" }]); + }); + + it("POST /projects creates a project", () => { + const body = { name: "E2E Project", status: "active" }; + return request(app.getHttpServer()).post("/projects").send(body).expect(201); + }); + + it("GET /projects/:id returns a project by id", () => { + return request(app.getHttpServer()) + .get(`/projects/${TEST_UUID}`) + .expect(200) + .expect({ id: TEST_UUID, name: "Test" }); + }); + + it("PATCH /projects/:id updates a project", () => { + const body = { name: "Updated E2E" }; + mockRepository.findOne.mockResolvedValue({ id: TEST_UUID, name: "Updated E2E" }); + mockRepository.update.mockResolvedValue({ id: TEST_UUID, name: "Updated E2E" }); + return request(app.getHttpServer()) + .patch(`/projects/${TEST_UUID}`) + .send(body) + .expect(200) + .expect({ id: TEST_UUID, name: "Updated E2E" }); + }); + + it("DELETE /projects/:id deletes a project", () => { + mockRepository.findOne.mockResolvedValue({ id: TEST_UUID }); + return request(app.getHttpServer()).delete(`/projects/${TEST_UUID}`).expect(200).expect({ id: TEST_UUID }); + }); + }); }); diff --git a/apps/api/test/jest-e2e.json b/apps/api/test/jest-e2e.json index e9d912f..8f816a6 100644 --- a/apps/api/test/jest-e2e.json +++ b/apps/api/test/jest-e2e.json @@ -5,5 +5,12 @@ "testRegex": ".e2e-spec.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" - } + }, + "moduleNameMapper": { + "^@workspace/schema$": "/__mocks__/schema.ts", + "^valibot$": "/__mocks__/valibot.ts" + }, + "transformIgnorePatterns": [ + "node_modules/(?!@workspace)" + ] } diff --git a/apps/api/tsconfig.build.json b/apps/api/tsconfig.build.json index 64f86c6..935f99b 100644 --- a/apps/api/tsconfig.build.json +++ b/apps/api/tsconfig.build.json @@ -1,4 +1,7 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "incremental": false + }, "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] } diff --git a/apps/api/tsconfig.eslint.json b/apps/api/tsconfig.eslint.json new file mode 100644 index 0000000..5a71663 --- /dev/null +++ b/apps/api/tsconfig.eslint.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*", "test/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index cf4a8a9..f0a954d 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -2,7 +2,10 @@ "extends": "@workspace/tooling/tsconfig/nestjs.json", "compilerOptions": { "outDir": "./dist", + "rootDir": "./src", "incremental": true, - "types": ["jest"] - } -} + "types": ["jest", "node"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test"] +} \ No newline at end of file diff --git a/apps/web/app/composables/useProjectApi.ts b/apps/web/app/composables/useProjectApi.ts new file mode 100644 index 0000000..bb40288 --- /dev/null +++ b/apps/web/app/composables/useProjectApi.ts @@ -0,0 +1,106 @@ +import type { Project } from "@workspace/schema"; + +interface ApiResponse { + data: T | null; + error: string | null; +} + +function getBaseUrl(): string { + const config = useRuntimeConfig(); + return config.public.apiBaseUrl as string; +} + +async function request(path: string, options?: RequestInit): Promise> { + try { + const res = await fetch(`${getBaseUrl()}${path}`, { + headers: { "Content-Type": "application/json" }, + ...options, + }); + + if (!res.ok) { + const body = await res.json().catch(() => null); + return { data: null, error: body?.message ?? `HTTP ${res.status}` }; + } + + const data = (await res.json()) as T; + return { data, error: null }; + } catch (err) { + return { data: null, error: err instanceof Error ? err.message : "Unknown error" }; + } +} + +export function useProjectApi() { + const NOT_FOUND = -1; + + const projects = ref([]); + const loading = ref(false); + const error = ref(null); + + async function fetchProjects(): Promise { + loading.value = true; + error.value = null; + + const { data, error: err } = await request("/projects"); + if (data) projects.value = data; + else error.value = err; + + loading.value = false; + } + + async function createProject(body: Record): Promise { + loading.value = true; + error.value = null; + + const { data, error: err } = await request("/projects", { + method: "POST", + body: JSON.stringify(body), + }); + + if (data) { + projects.value.push(data); + } else { + error.value = err; + } + + loading.value = false; + return data; + } + + async function updateProject(id: string, body: Record): Promise { + loading.value = true; + error.value = null; + + const { data, error: err } = await request(`/projects/${id}`, { + method: "PATCH", + body: JSON.stringify(body), + }); + + if (data) { + const idx = projects.value.findIndex(p => p.id === id); + if (idx !== NOT_FOUND) projects.value[idx] = data; + } else { + error.value = err; + } + + loading.value = false; + return data; + } + + async function deleteProject(id: string): Promise { + loading.value = true; + error.value = null; + + const { error: err } = await request(`/projects/${id}`, { method: "DELETE" }); + + if (err) { + error.value = err; + } else { + projects.value = projects.value.filter(p => p.id !== id); + } + + loading.value = false; + return !err; + } + + return { projects, loading, error, fetchProjects, createProject, updateProject, deleteProject }; +} diff --git a/apps/web/eslint.config.mjs b/apps/web/eslint.config.mjs index b2518b0..f6ae36e 100644 --- a/apps/web/eslint.config.mjs +++ b/apps/web/eslint.config.mjs @@ -5,5 +5,6 @@ import { baseRules, } from "@workspace/tooling/eslint/base" export default withNuxt({ rules: { ...baseRules, + "@stylistic/member-delimiter-style": "off", }, },) diff --git a/apps/web/nuxt.config.ts b/apps/web/nuxt.config.ts index 9465f55..7a15056 100644 --- a/apps/web/nuxt.config.ts +++ b/apps/web/nuxt.config.ts @@ -8,6 +8,12 @@ export default defineNuxtConfig({ css: ["~/assets/css/main.css"], + runtimeConfig: { + public: { + apiBaseUrl: process.env.NUXT_PUBLIC_API_BASE_URL ?? "http://localhost:3001", + }, + }, + routeRules: { "/": { prerender: true }, }, diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..edbb1a2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +services: + postgres: + image: postgres:16-alpine + container_name: work-hub-postgres + restart: unless-stopped + ports: + - "${POSTGRES_PORT:-5432}:5432" + environment: + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + POSTGRES_DB: ${POSTGRES_DB:-work_hub} + volumes: + - postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-work_hub}"] + interval: 5s + timeout: 5s + retries: 5 + +volumes: + postgres_data: + driver: local diff --git a/openspec/changes/project-crud-sync/tasks.md b/openspec/changes/project-crud-sync/tasks.md index f3d32b5..5b756c1 100644 --- a/openspec/changes/project-crud-sync/tasks.md +++ b/openspec/changes/project-crud-sync/tasks.md @@ -1,19 +1,19 @@ ## 1. Database & Infrastructure Setup (Mandatory First Step) -- [ ] 1.1 **Dockerization**: Create a root `docker-compose.yml` (`work-hub-server/docker-compose.yml`) that declares a PostgreSQL service and named volumes for persistence. Do NOT include API or Web app containers — they run natively during development. -- [ ] 1.2 **Persistence**: Define and map persistent volumes in the root `docker-compose.yml` to ensure project data survives container restarts. -- [ ] 1.3 **CLI Utility**: Implement a dedicated command/utility (e.g., `db:setup`) that orchestrates the execution of migrations and seeding, ensuring idempotency. +- [x] 1.1 **Dockerization**: Create a root `docker-compose.yml` (`work-hub-server/docker-compose.yml`) that declares a PostgreSQL service and named volumes for persistence. Do NOT include API or Web app containers — they run natively during development. +- [x] 1.2 **Persistence**: Define and map persistent volumes in the root `docker-compose.yml` to ensure project data survives container restarts. +- [x] 1.3 **CLI Utility**: Implement a dedicated command/utility (e.g., `db:setup`) that orchestrates the execution of migrations and seeding, ensuring idempotency. ## 2. API Layer Implementation (API) -- [ ] 2.1 **Scaffolding**: Use the Nest CLI (`nest generate resource`) to create the basic resource structure for Project (Controller, Service, Module). This ensures adherence to module structure, dependency injection patterns, and common boilerplate across all APIs in the monorepo. -- [ ] 2.2 Implement necessary request validation using **Schema-Driven Pipes** that import their structure from `@workspace/schema`, ensuring consistency between API and Web layers. +- [x] 2.1 **Scaffolding**: Use the Nest CLI (`nest generate resource`) to create the basic resource structure for Project (Controller, Service, Module). This ensures adherence to module structure, dependency injection patterns, and common boilerplate across all APIs in the monorepo. +- [x] 2.2 Implement necessary request validation using **Schema-Driven Pipes** that import their structure from `@workspace/schema`, ensuring consistency between API and Web layers. ## 3. Web Layer Implementation (Web) -- [ ] 3.1 Update `apps/web` store/composables to call the new API endpoints and manage state correctly following successful write or delete operations. +- [x] 3.1 Update `apps/web` store/composables to call the new API endpoints and manage state correctly following successful write or delete operations. ## 4. Testing & Tooling -- [ ] 4.1 Write comprehensive unit tests covering the Controller, the Service, and the Repository layers. -- [ ] 4.2 Update E2E test suites to verify complete CRUD workflows via HTTP calls and UI interactions, ensuring the service layer is correctly tested against a containerized DB. +- [x] 4.1 Write comprehensive unit tests covering the Controller, the Service, and the Repository layers. +- [x] 4.2 Update E2E test suites to verify complete CRUD workflows via HTTP calls and UI interactions, ensuring the service layer is correctly tested against a containerized DB. diff --git a/package.json b/package.json index 4ff3534..be1df60 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "lint": "turbo run lint", "format": "prettier --write \"**/*.{ts,tsx,md}\"", "format:check": "prettier --check \"**/*.{ts,tsx,md}\"", - "check-types": "turbo run check-types" + "check-types": "turbo run check-types", + "db:setup": "pnpm --filter=@workspace/schema db:generate && pnpm --filter=@workspace/schema db:migrate && pnpm --filter=@workspace/schema db:seed" }, "devDependencies": { "@workspace/tooling": "workspace:*", diff --git a/packages/schema/drizzle.config.ts b/packages/schema/drizzle.config.ts new file mode 100644 index 0000000..10cb584 --- /dev/null +++ b/packages/schema/drizzle.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + schema: "./src/drizzle/index.ts", + out: "./drizzle", + dialect: "postgresql", + dbCredentials: { + host: process.env.POSTGRES_HOST ?? "localhost", + port: Number(process.env.POSTGRES_PORT ?? 5432), + user: process.env.POSTGRES_USER ?? "postgres", + password: process.env.POSTGRES_PASSWORD ?? "postgres", + database: process.env.POSTGRES_DB ?? "work_hub", + }, +}); diff --git a/packages/schema/drizzle/0000_yielding_photon.sql b/packages/schema/drizzle/0000_yielding_photon.sql new file mode 100644 index 0000000..7c2706e --- /dev/null +++ b/packages/schema/drizzle/0000_yielding_photon.sql @@ -0,0 +1,26 @@ +CREATE TABLE "projects" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "name" text NOT NULL, + "description" text, + "status" text DEFAULT 'active' NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "project_status_check" CHECK ("projects"."status" IN ('active', 'archived', 'completed')) +); +--> statement-breakpoint +CREATE TABLE "tasks" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "project_id" uuid NOT NULL, + "title" text NOT NULL, + "description" text, + "status" text DEFAULT 'todo' NOT NULL, + "priority" text DEFAULT 'medium' NOT NULL, + "sort_order" integer DEFAULT 0 NOT NULL, + "due_date" timestamp, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "task_status_check" CHECK ("tasks"."status" IN ('todo', 'in_progress', 'in_review', 'done')), + CONSTRAINT "task_priority_check" CHECK ("tasks"."priority" IN ('low', 'medium', 'high', 'urgent')) +); +--> statement-breakpoint +ALTER TABLE "tasks" ADD CONSTRAINT "tasks_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action; \ No newline at end of file diff --git a/packages/schema/drizzle/meta/0000_snapshot.json b/packages/schema/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..ee551b7 --- /dev/null +++ b/packages/schema/drizzle/meta/0000_snapshot.json @@ -0,0 +1,179 @@ +{ + "id": "9fa00e9c-266b-43c1-8f18-2a454e3fbf99", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.projects": { + "name": "projects", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "project_status_check": { + "name": "project_status_check", + "value": "\"projects\".\"status\" IN ('active', 'archived', 'completed')" + } + }, + "isRLSEnabled": false + }, + "public.tasks": { + "name": "tasks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "project_id": { + "name": "project_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'todo'" + }, + "priority": { + "name": "priority", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'medium'" + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "due_date": { + "name": "due_date", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "tasks_project_id_projects_id_fk": { + "name": "tasks_project_id_projects_id_fk", + "tableFrom": "tasks", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "task_status_check": { + "name": "task_status_check", + "value": "\"tasks\".\"status\" IN ('todo', 'in_progress', 'in_review', 'done')" + }, + "task_priority_check": { + "name": "task_priority_check", + "value": "\"tasks\".\"priority\" IN ('low', 'medium', 'high', 'urgent')" + } + }, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/packages/schema/drizzle/meta/_journal.json b/packages/schema/drizzle/meta/_journal.json new file mode 100644 index 0000000..d5a6cfc --- /dev/null +++ b/packages/schema/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1781334448956, + "tag": "0000_yielding_photon", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/packages/schema/eslint.config.mjs b/packages/schema/eslint.config.mjs index 34d4b48..28efe91 100644 --- a/packages/schema/eslint.config.mjs +++ b/packages/schema/eslint.config.mjs @@ -6,6 +6,7 @@ export default defineConfig( { ignores: ["eslint.config.mjs", "dist"] }, ...base, { + files: ["src/**/*.ts"], languageOptions: { parserOptions: { projectService: true, @@ -14,6 +15,15 @@ export default defineConfig( }, }, { + files: ["seed.ts"], + languageOptions: { + parserOptions: { + projectService: false, + }, + }, + }, + { + files: ["src/**/*.ts"], rules: { "@typescript-eslint/no-floating-promises": "warn", "@typescript-eslint/no-unsafe-argument": "warn", diff --git a/packages/schema/package.json b/packages/schema/package.json index 70f49ed..c6e5a6d 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -13,20 +13,29 @@ } }, "scripts": { - "build": "tsc", + "build": "tsup src/index.ts --format esm --dts --clean --external drizzle-orm --external drizzle-valibot --external valibot", + "dev": "tsup src/index.ts --format esm --dts --clean --external drizzle-orm --external drizzle-valibot --external valibot --watch", "clean": "rm -rf dist", "check-types": "tsc --noEmit", - "lint": "eslint \"src/**/*.ts\" --fix" + "lint": "eslint \"src/**/*.ts\" --fix", + "db:generate": "drizzle-kit generate", + "db:migrate": "drizzle-kit migrate", + "db:seed": "tsx seed.ts" }, "dependencies": { "drizzle-orm": "^0.45.2", "drizzle-valibot": "^0.4.2", + "pg": "^8.21.0", "valibot": "^1.4.1" }, "devDependencies": { "@types/node": "^25.9.3", + "@types/pg": "^8.20.0", "@workspace/tooling": "workspace:*", + "drizzle-kit": "^0.31.10", "eslint": "^10.4.1", + "tsup": "^8.5.1", + "tsx": "^4.22.4", "typescript": "^6.0.3" } } diff --git a/packages/schema/seed.ts b/packages/schema/seed.ts new file mode 100644 index 0000000..6552df7 --- /dev/null +++ b/packages/schema/seed.ts @@ -0,0 +1,31 @@ +import { drizzle } from "drizzle-orm/node-postgres"; +import pkg from "pg"; +const { Pool } = pkg; +import { projects } from "./src/drizzle/projects"; + +async function seed() { + const pool = new Pool({ + host: process.env.POSTGRES_HOST ?? "localhost", + port: Number(process.env.POSTGRES_PORT ?? 5432), + user: process.env.POSTGRES_USER ?? "postgres", + password: process.env.POSTGRES_PASSWORD ?? "postgres", + database: process.env.POSTGRES_DB ?? "work_hub", + }); + + const db = drizzle(pool); + + console.log("Seeding database..."); + + await db.insert(projects).values([ + { name: "Sample Project", description: "A sample project for development", status: "active" }, + { name: "Archived Project", description: "An archived test project", status: "archived" }, + ]); + + console.log("Seed complete."); + await pool.end(); +} + +seed().catch((err) => { + console.error("Seed failed:", err); + process.exit(1); +}); diff --git a/packages/schema/src/drizzle/enums.ts b/packages/schema/src/drizzle/enums.ts deleted file mode 100644 index 587e772..0000000 --- a/packages/schema/src/drizzle/enums.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const PROJECT_STATUSES = ["active", "archived", "completed"] as const; - -export const TASK_STATUSES = ["todo", "in_progress", "in_review", "done"] as const; - -export const PRIORITIES = ["low", "medium", "high", "urgent"] as const; - -export type ProjectStatus = (typeof PROJECT_STATUSES)[number]; -export type TaskStatus = (typeof TASK_STATUSES)[number]; -export type Priority = (typeof PRIORITIES)[number]; diff --git a/packages/schema/src/drizzle/index.ts b/packages/schema/src/drizzle/index.ts deleted file mode 100644 index 14306e6..0000000 --- a/packages/schema/src/drizzle/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { PROJECT_STATUSES, TASK_STATUSES, PRIORITIES } from "./enums"; -export { projects } from "./projects"; -export { tasks } from "./tasks"; -export { projectsRelations, tasksRelations } from "./relations"; diff --git a/packages/schema/src/drizzle/projects.ts b/packages/schema/src/drizzle/projects.ts index a835fe5..89173d5 100644 --- a/packages/schema/src/drizzle/projects.ts +++ b/packages/schema/src/drizzle/projects.ts @@ -1,8 +1,13 @@ import { pgTable, uuid, text, timestamp, check } from "drizzle-orm/pg-core"; import { sql } from "drizzle-orm"; -import { PROJECT_STATUSES } from "./enums"; +import { createInsertSchema, createSelectSchema, createUpdateSchema } from "drizzle-valibot"; +import { InferOutput, picklist, pipe } from "valibot"; + +export const PROJECT_STATUSES = ["active", "archived", "completed"] as const; +export type ProjectStatus = (typeof PROJECT_STATUSES)[number]; const projectStatusValues = PROJECT_STATUSES.map((s) => `'${s}'`).join(", "); +const createProjectStatusSchema = (schema: any) => pipe(schema, picklist([...PROJECT_STATUSES])) as any; export const projects = pgTable( "projects", @@ -16,3 +21,18 @@ export const projects = pgTable( }, (table) => [check("project_status_check", sql`${table.status} IN (${sql.raw(projectStatusValues)})`)], ); + +export const projectSelect = createSelectSchema(projects, { + status: createProjectStatusSchema, +}); +export type Project = InferOutput; + +export const projectInsert = createInsertSchema(projects, { + status: createProjectStatusSchema, +}); +export type ProjectInsertDTO = InferOutput; + +export const projectUpdate = createUpdateSchema(projects, { + status: createProjectStatusSchema, +}); +export type ProjectUpdateDTO = InferOutput; diff --git a/packages/schema/src/drizzle/refs.ts b/packages/schema/src/drizzle/refs.ts new file mode 100644 index 0000000..9466d8e --- /dev/null +++ b/packages/schema/src/drizzle/refs.ts @@ -0,0 +1,4 @@ +export const refs: Record = { + projects: undefined, + tasks: undefined, +}; diff --git a/packages/schema/src/drizzle/relations.ts b/packages/schema/src/drizzle/relations.ts index 8735d0e..93b1691 100644 --- a/packages/schema/src/drizzle/relations.ts +++ b/packages/schema/src/drizzle/relations.ts @@ -1,7 +1,11 @@ import { relations } from "drizzle-orm"; +import { refs } from "./refs"; import { projects } from "./projects"; import { tasks } from "./tasks"; +refs.projects = projects; +refs.tasks = tasks; + export const projectsRelations = relations(projects, ({ many }) => ({ tasks: many(tasks), })); diff --git a/packages/schema/src/drizzle/tasks.ts b/packages/schema/src/drizzle/tasks.ts index aee753a..cb78926 100644 --- a/packages/schema/src/drizzle/tasks.ts +++ b/packages/schema/src/drizzle/tasks.ts @@ -1,7 +1,14 @@ import { pgTable, uuid, text, integer, timestamp, check } from "drizzle-orm/pg-core"; import { sql } from "drizzle-orm"; -import { TASK_STATUSES, PRIORITIES } from "./enums"; -import { projects } from "./projects"; +import { createInsertSchema, createSelectSchema, createUpdateSchema } from "drizzle-valibot"; +import { InferOutput, picklist, pipe } from "valibot"; +import { refs } from "./refs"; + +export const TASK_STATUSES = ["todo", "in_progress", "in_review", "done"] as const; +export type TaskStatus = (typeof TASK_STATUSES)[number]; + +export const PRIORITIES = ["low", "medium", "high", "urgent"] as const; +export type Priority = (typeof PRIORITIES)[number]; const taskStatusValues = TASK_STATUSES.map((s) => `'${s}'`).join(", "); const priorityValues = PRIORITIES.map((p) => `'${p}'`).join(", "); @@ -12,7 +19,8 @@ export const tasks = pgTable( id: uuid("id").primaryKey().defaultRandom(), projectId: uuid("project_id") .notNull() - .references(() => projects.id, { onDelete: "cascade" }), + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + .references(() => refs.projects.id, { onDelete: "cascade" }), title: text("title").notNull(), description: text("description"), status: text("status").notNull().default("todo"), @@ -27,3 +35,22 @@ export const tasks = pgTable( check("task_priority_check", sql`${table.priority} IN (${sql.raw(priorityValues)})`), ], ); + +const createTaskStatusSchema = (schema: any) => pipe(schema, picklist([...TASK_STATUSES])) as any; +const createPrioritySchema = (schema: any) => pipe(schema, picklist([...PRIORITIES])) as any; + +export const taskSelect = createSelectSchema(tasks, { + status: createTaskStatusSchema, + priority: createPrioritySchema, +}); +export type Task = InferOutput; + +export const taskInsert = createInsertSchema(tasks, { + status: createTaskStatusSchema, + priority: createPrioritySchema, +}); + +export const taskUpdate = createUpdateSchema(tasks, { + status: createTaskStatusSchema, + priority: createPrioritySchema, +}); diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index 1579b94..8d69810 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -1,17 +1,37 @@ +import { fileURLToPath } from "url"; +import { dirname, resolve } from "path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export const migrationsDir = resolve(__dirname, "../drizzle"); + +export { eq } from "drizzle-orm"; +export { drizzle, NodePgDatabase } from "drizzle-orm/node-postgres"; +export { migrate } from "drizzle-orm/node-postgres/migrator"; + export { PROJECT_STATUSES, - TASK_STATUSES, - PRIORITIES, projects, - tasks, + projectSelect, + projectInsert, + projectUpdate, + type Project, + type ProjectStatus, + type ProjectInsertDTO, + type ProjectUpdateDTO, +} from "./drizzle/projects"; +export { projectsRelations, tasksRelations, -} from "./drizzle/index"; - -export { projectSelect, projectInsert, projectUpdate, taskSelect, taskInsert, taskUpdate } from "./valibot"; - -import type { InferOutput } from "valibot"; -import { projectSelect, taskSelect } from "./valibot"; - -export type Project = InferOutput; -export type Task = InferOutput; +} from "./drizzle/relations"; +export { + TASK_STATUSES, + PRIORITIES, + tasks, + taskSelect, + taskInsert, + taskUpdate, + type Task, + type TaskStatus, + type Priority, +} from "./drizzle/tasks"; diff --git a/packages/schema/src/valibot.ts b/packages/schema/src/valibot.ts deleted file mode 100644 index 83a3763..0000000 --- a/packages/schema/src/valibot.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { createInsertSchema, createSelectSchema, createUpdateSchema } from "drizzle-valibot"; -import { pipe, picklist } from "valibot"; -import { projects, tasks, PROJECT_STATUSES, TASK_STATUSES, PRIORITIES } from "./drizzle/index"; - -const createProjectStatusSchema = (schema: any) => pipe(schema, picklist([...PROJECT_STATUSES])) as any; -const createTaskStatusSchema = (schema: any) => pipe(schema, picklist([...TASK_STATUSES])) as any; -const createPrioritySchema = (schema: any) => pipe(schema, picklist([...PRIORITIES])) as any; - -export const projectSelect = createSelectSchema(projects, { - status: createProjectStatusSchema, -}); - -export const taskSelect = createSelectSchema(tasks, { - status: createTaskStatusSchema, - priority: createPrioritySchema, -}); - -export const projectInsert = createInsertSchema(projects, { - status: createProjectStatusSchema, -}); - -export const projectUpdate = createUpdateSchema(projects, { - status: createProjectStatusSchema, -}); - -export const taskInsert = createInsertSchema(tasks, { - status: createTaskStatusSchema, - priority: createPrioritySchema, -}); - -export const taskUpdate = createUpdateSchema(tasks, { - status: createTaskStatusSchema, - priority: createPrioritySchema, -}); diff --git a/packages/schema/tsconfig.json b/packages/schema/tsconfig.json index 6474a86..783ea3d 100644 --- a/packages/schema/tsconfig.json +++ b/packages/schema/tsconfig.json @@ -2,7 +2,8 @@ "extends": "@workspace/tooling/tsconfig/library.json", "compilerOptions": { "outDir": "./dist", - "rootDir": "./src" + "rootDir": "./src", + "ignoreDeprecations": "6.0" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"] diff --git a/packages/tooling/eslint/nestjs.mjs b/packages/tooling/eslint/nestjs.mjs index 88f16b9..ee3d409 100644 --- a/packages/tooling/eslint/nestjs.mjs +++ b/packages/tooling/eslint/nestjs.mjs @@ -33,7 +33,7 @@ export function createNestjsConfig(tsconfigRootDir, overrides = {}) { rules: { "class-methods-use-this": "off", "@typescript-eslint/no-floating-promises": "warn", - "@typescript-eslint/no-unsafe-argument": "warn", + // "@typescript-eslint/no-unsafe-argument": "warn", "prettier/prettier": ["error", { endOfLine: "auto" }], ...overrides, }, diff --git a/packages/tooling/package.json b/packages/tooling/package.json index 768e1a8..0cd6528 100644 --- a/packages/tooling/package.json +++ b/packages/tooling/package.json @@ -14,7 +14,6 @@ "dependencies": { "@eslint/js": "^10.0.1", "@stylistic/eslint-plugin": "^5.10.0", - "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.6", "globals": "^17.6.0", "typescript-eslint": "^8.61.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b08050..e9dbcf6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,13 +35,25 @@ importers: '@workspace/schema': specifier: workspace:* version: link:../../packages/schema + drizzle-orm: + specifier: ^0.45.2 + version: 0.45.2(@types/pg@8.20.0)(pg@8.21.0) + pg: + specifier: ^8.21.0 + version: 8.21.0 reflect-metadata: specifier: ^0.2.2 version: 0.2.2 rxjs: specifier: ^7.8.2 version: 7.8.2 + valibot: + specifier: ^1.4.1 + version: 1.4.1(typescript@6.0.3) devDependencies: + '@jest/globals': + specifier: ^30.4.1 + version: 30.4.1 '@nestjs/cli': specifier: ^11.0.23 version: 11.0.23(@types/node@25.9.3)(prettier@3.8.4) @@ -60,6 +72,9 @@ importers: '@types/node': specifier: ^25.9.3 version: 25.9.3 + '@types/pg': + specifier: ^8.20.0 + version: 8.20.0 '@types/supertest': specifier: ^7.2.0 version: 7.2.0 @@ -69,15 +84,15 @@ importers: eslint: specifier: ^10.4.1 version: 10.4.1(jiti@2.7.0) + eslint-plugin-prettier: + specifier: ^5.5.6 + version: 5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0))(prettier@3.8.4) jest: specifier: ^30.4.2 version: 30.4.2(@types/node@25.9.3)(ts-node@10.9.2(@types/node@25.9.3)(typescript@6.0.3)) prettier: specifier: ^3.8.4 version: 3.8.4 - source-map-support: - specifier: ^0.5.21 - version: 0.5.21 supertest: specifier: ^7.2.2 version: 7.2.2 @@ -90,9 +105,6 @@ importers: ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@25.9.3)(typescript@6.0.3) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -107,41 +119,41 @@ importers: version: 1.2.86 '@nuxt/a11y': specifier: 1.0.0-alpha.1 - version: 1.0.0-alpha.1(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + version: 1.0.0-alpha.1(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/hints': specifier: 1.1.2 - version: 1.1.2(@jest/globals@30.4.1)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(ioredis@5.11.1)(jest-diff@30.4.1)(jest-snapshot@30.4.1)(jest@30.4.2(@types/node@25.9.3))(magicast@0.5.3)(srvx@0.11.16)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + version: 1.1.2(@jest/globals@30.4.1)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(jest-diff@30.4.1)(jest-snapshot@30.4.1)(jest@30.4.2(@types/node@25.9.3))(magicast@0.5.3)(srvx@0.11.16)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) '@nuxt/image': specifier: 2.0.0 - version: 2.0.0(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1)(magicast@0.5.3)(srvx@0.11.16) + version: 2.0.0(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1)(magicast@0.5.3)(srvx@0.11.16) '@nuxt/test-utils': specifier: 4.0.3 - version: 4.0.3(@jest/globals@30.4.1)(crossws@0.4.6(srvx@0.11.16))(magicast@0.5.3)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.0.3(@jest/globals@30.4.1)(crossws@0.4.6(srvx@0.11.16))(magicast@0.5.3)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/ui': specifier: ^4.8.2 - version: 4.8.2(@internationalized/date@3.12.2)(@internationalized/number@3.6.7)(@tiptap/extensions@3.26.1(@tiptap/core@3.26.1(@tiptap/pm@3.26.1))(@tiptap/pm@3.26.1))(@tiptap/y-tiptap@3.0.4(prosemirror-model@1.25.8)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(change-case@5.4.4)(db0@0.3.4(drizzle-orm@0.45.2))(embla-carousel@8.6.0)(ioredis@5.11.1)(magicast@0.5.3)(superstruct@2.0.2)(tailwindcss@4.3.0)(typescript@6.0.3)(valibot@1.4.1(typescript@6.0.3))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)))(vue@3.5.38(typescript@6.0.3))(yjs@13.6.31) + version: 4.8.2(@internationalized/date@3.12.2)(@internationalized/number@3.6.7)(@tiptap/extensions@3.26.1(@tiptap/core@3.26.1(@tiptap/pm@3.26.1))(@tiptap/pm@3.26.1))(@tiptap/y-tiptap@3.0.4(prosemirror-model@1.25.8)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(change-case@5.4.4)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(embla-carousel@8.6.0)(ioredis@5.11.1)(magicast@0.5.3)(superstruct@2.0.2)(tailwindcss@4.3.0)(typescript@6.0.3)(valibot@1.4.1(typescript@6.0.3))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)))(vue@3.5.38(typescript@6.0.3))(yjs@13.6.31) '@nuxtjs/eslint-module': specifier: 4.1.0 - version: 4.1.0(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)) + version: 4.1.0(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)) '@nuxtjs/i18n': specifier: 10.4.0 - version: 10.4.0(@vue/compiler-dom@3.5.38)(db0@0.3.4(drizzle-orm@0.45.2))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(rollup@4.61.1)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + version: 10.4.0(@vue/compiler-dom@3.5.38)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(rollup@4.61.1)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) '@vueuse/nuxt': specifier: 14.3.0 - version: 14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + version: 14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) '@workspace/schema': specifier: workspace:* version: link:../../packages/schema nuxt: specifier: ^4.4.8 - version: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) + version: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) tailwindcss: specifier: ^4.3.0 version: 4.3.0 devDependencies: '@nuxt/eslint': specifier: ^1.16.0 - version: 1.16.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.38)(crossws@0.4.6(srvx@0.11.16))(eslint-webpack-plugin@4.2.0(eslint@10.4.1(jiti@2.7.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)))(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(oxc-parser@0.133.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + version: 1.16.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.38)(crossws@0.4.6(srvx@0.11.16))(eslint-webpack-plugin@4.2.0(eslint@10.4.1(jiti@2.7.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)))(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(oxc-parser@0.133.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@workspace/tooling': specifier: workspace:* version: link:../../packages/tooling @@ -157,12 +169,18 @@ importers: packages/schema: dependencies: + dotenv: + specifier: ^17.4.2 + version: 17.4.2 drizzle-orm: specifier: ^0.45.2 - version: 0.45.2 + version: 0.45.2(@types/pg@8.20.0)(pg@8.21.0) drizzle-valibot: specifier: ^0.4.2 - version: 0.4.2(drizzle-orm@0.45.2)(valibot@1.4.1(typescript@6.0.3)) + version: 0.4.2(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(valibot@1.4.1(typescript@6.0.3)) + pg: + specifier: ^8.21.0 + version: 8.21.0 valibot: specifier: ^1.4.1 version: 1.4.1(typescript@6.0.3) @@ -170,12 +188,24 @@ importers: '@types/node': specifier: ^25.9.3 version: 25.9.3 + '@types/pg': + specifier: ^8.20.0 + version: 8.20.0 '@workspace/tooling': specifier: workspace:* version: link:../tooling + drizzle-kit: + specifier: ^0.31.10 + version: 0.31.10 eslint: specifier: ^10.4.1 version: 10.4.1(jiti@2.7.0) + tsup: + specifier: ^8.5.1 + version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@6.0.3)(yaml@2.9.0) + tsx: + specifier: ^4.22.4 + version: 4.22.4 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -191,9 +221,6 @@ importers: eslint: specifier: ^10.0.0 version: 10.4.1(jiti@2.7.0) - eslint-config-prettier: - specifier: ^10.1.8 - version: 10.1.8(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-prettier: specifier: ^5.5.6 version: 5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0))(prettier@3.8.4) @@ -527,6 +554,9 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + '@dxup/nuxt@0.4.1': resolution: {integrity: sha512-gtYffW6OfWNvoLW+XD3Mx/K8uUq08PMGLYJoDxc92EzZAWqR0FhcR5iaLm5r/OxyGTKz+P5f5Y7Aoir9+SjYaw==} peerDependencies: @@ -558,6 +588,14 @@ packages: resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -576,6 +614,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} @@ -594,6 +638,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} @@ -612,6 +662,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} @@ -630,6 +686,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} @@ -648,6 +710,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} @@ -666,6 +734,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} @@ -684,6 +758,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} @@ -702,6 +782,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} @@ -720,6 +806,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} @@ -738,6 +830,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} @@ -756,6 +854,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} @@ -774,6 +878,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} @@ -792,6 +902,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} @@ -810,6 +926,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} @@ -828,6 +950,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} @@ -846,6 +974,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -882,6 +1016,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -918,6 +1058,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -954,6 +1100,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} @@ -972,6 +1124,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} @@ -990,6 +1148,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} @@ -1008,6 +1172,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -3646,6 +3816,9 @@ packages: '@types/node@25.9.3': resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} + '@types/pg@8.20.0': + resolution: {integrity: sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==} + '@types/qs@6.15.1': resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} @@ -4202,6 +4375,9 @@ packages: resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4427,6 +4603,12 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -4898,6 +5080,10 @@ packages: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} + drizzle-kit@0.31.10: + resolution: {integrity: sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==} + hasBin: true + drizzle-orm@0.45.2: resolution: {integrity: sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==} peerDependencies: @@ -5113,6 +5299,11 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -5475,6 +5666,9 @@ packages: resolution: {integrity: sha512-JGG8pvDi2C+JxidYdIwQDyS/CgcrIdh18cvgxcBge3wSHRQOrooMD3GlFBcmMJAN9M42SAZjDp5zv1dglJjwww==} engines: {node: '>=20'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -6098,6 +6292,10 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -6280,6 +6478,10 @@ packages: resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} engines: {node: '>=13.2.0'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + loader-runner@4.3.2: resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} @@ -6491,6 +6693,9 @@ packages: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -6811,6 +7016,40 @@ packages: perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + pg-cloudflare@1.4.0: + resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} + + pg-connection-string@2.13.0: + resolution: {integrity: sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-pool@3.14.0: + resolution: {integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.14.0: + resolution: {integrity: sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg@8.21.0: + resolution: {integrity: sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==} + engines: {node: '>= 16.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -6882,6 +7121,24 @@ packages: peerDependencies: postcss: ^8.5.15 + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss-merge-longhand@8.0.1: resolution: {integrity: sha512-huTfSYgQ13O81SFvAuOi7GWnO48vvybjj3xF+X3qUoPjzvvaLpJH5DcUqqXcwOEulZUcvaV4s0V9WtWs+IAQPA==} engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} @@ -7013,6 +7270,22 @@ packages: resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.1: + resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + powershell-utils@0.1.0: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} @@ -7431,6 +7704,10 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -7537,6 +7814,11 @@ packages: peerDependencies: postcss: ^8.5.15 + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + superagent@10.3.0: resolution: {integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==} engines: {node: '>=14.18.0'} @@ -7667,6 +7949,13 @@ packages: text-decoder@1.2.7: resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} @@ -7677,6 +7966,9 @@ packages: resolution: {integrity: sha512-F1oWdz8tjT17qe1d5JgDK6z03WGOhYYAN0lK3/D/fzNiy93xswLLEw7pk+3g05onhAy6Bsc6PLNUGhdgVjemMQ==} engines: {node: ^16.14.0 || >= 17.3.0} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.2.4: resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} @@ -7715,12 +8007,19 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-jest@29.4.11: resolution: {integrity: sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -7784,6 +8083,30 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsx@4.22.4: + resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + engines: {node: '>=18.0.0'} + hasBin: true + turbo@2.9.18: resolution: {integrity: sha512-bwabv6PupzeavybzEoArBAkwq5fnzwf8OFnRtpHwnviFWuwJPFxtyH+aVp36TmIqK3aYYgtTJ3J0m2ysxxSzQg==} hasBin: true @@ -8351,6 +8674,10 @@ packages: engines: {node: '>= 0.10.0'} hasBin: true + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y-protocols@1.0.7: resolution: {integrity: sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} @@ -8804,6 +9131,8 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@drizzle-team/brocli@0.10.2': {} + '@dxup/nuxt@0.4.1(magicast@0.5.3)(typescript@6.0.3)': dependencies: '@dxup/unimport': 0.1.2 @@ -8849,6 +9178,16 @@ snapshots: '@es-joy/resolve.exports@1.2.0': {} + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.14.0 + '@esbuild/aix-ppc64@0.25.12': optional: true @@ -8858,6 +9197,9 @@ snapshots: '@esbuild/aix-ppc64@0.28.1': optional: true + '@esbuild/android-arm64@0.18.20': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true @@ -8867,6 +9209,9 @@ snapshots: '@esbuild/android-arm64@0.28.1': optional: true + '@esbuild/android-arm@0.18.20': + optional: true + '@esbuild/android-arm@0.25.12': optional: true @@ -8876,6 +9221,9 @@ snapshots: '@esbuild/android-arm@0.28.1': optional: true + '@esbuild/android-x64@0.18.20': + optional: true + '@esbuild/android-x64@0.25.12': optional: true @@ -8885,6 +9233,9 @@ snapshots: '@esbuild/android-x64@0.28.1': optional: true + '@esbuild/darwin-arm64@0.18.20': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true @@ -8894,6 +9245,9 @@ snapshots: '@esbuild/darwin-arm64@0.28.1': optional: true + '@esbuild/darwin-x64@0.18.20': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true @@ -8903,6 +9257,9 @@ snapshots: '@esbuild/darwin-x64@0.28.1': optional: true + '@esbuild/freebsd-arm64@0.18.20': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true @@ -8912,6 +9269,9 @@ snapshots: '@esbuild/freebsd-arm64@0.28.1': optional: true + '@esbuild/freebsd-x64@0.18.20': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true @@ -8921,6 +9281,9 @@ snapshots: '@esbuild/freebsd-x64@0.28.1': optional: true + '@esbuild/linux-arm64@0.18.20': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true @@ -8930,6 +9293,9 @@ snapshots: '@esbuild/linux-arm64@0.28.1': optional: true + '@esbuild/linux-arm@0.18.20': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true @@ -8939,6 +9305,9 @@ snapshots: '@esbuild/linux-arm@0.28.1': optional: true + '@esbuild/linux-ia32@0.18.20': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true @@ -8948,6 +9317,9 @@ snapshots: '@esbuild/linux-ia32@0.28.1': optional: true + '@esbuild/linux-loong64@0.18.20': + optional: true + '@esbuild/linux-loong64@0.25.12': optional: true @@ -8957,6 +9329,9 @@ snapshots: '@esbuild/linux-loong64@0.28.1': optional: true + '@esbuild/linux-mips64el@0.18.20': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true @@ -8966,6 +9341,9 @@ snapshots: '@esbuild/linux-mips64el@0.28.1': optional: true + '@esbuild/linux-ppc64@0.18.20': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true @@ -8975,6 +9353,9 @@ snapshots: '@esbuild/linux-ppc64@0.28.1': optional: true + '@esbuild/linux-riscv64@0.18.20': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true @@ -8984,6 +9365,9 @@ snapshots: '@esbuild/linux-riscv64@0.28.1': optional: true + '@esbuild/linux-s390x@0.18.20': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true @@ -8993,6 +9377,9 @@ snapshots: '@esbuild/linux-s390x@0.28.1': optional: true + '@esbuild/linux-x64@0.18.20': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true @@ -9011,6 +9398,9 @@ snapshots: '@esbuild/netbsd-arm64@0.28.1': optional: true + '@esbuild/netbsd-x64@0.18.20': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true @@ -9029,6 +9419,9 @@ snapshots: '@esbuild/openbsd-arm64@0.28.1': optional: true + '@esbuild/openbsd-x64@0.18.20': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true @@ -9047,6 +9440,9 @@ snapshots: '@esbuild/openharmony-arm64@0.28.1': optional: true + '@esbuild/sunos-x64@0.18.20': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true @@ -9056,6 +9452,9 @@ snapshots: '@esbuild/sunos-x64@0.28.1': optional: true + '@esbuild/win32-arm64@0.18.20': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true @@ -9065,6 +9464,9 @@ snapshots: '@esbuild/win32-arm64@0.28.1': optional: true + '@esbuild/win32-ia32@0.18.20': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true @@ -9074,6 +9476,9 @@ snapshots: '@esbuild/win32-ia32@0.28.1': optional: true + '@esbuild/win32-x64@0.18.20': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true @@ -9496,7 +9901,7 @@ snapshots: '@intlify/shared@11.4.5': {} - '@intlify/unplugin-vue-i18n@11.2.3(@vue/compiler-dom@3.5.38)(eslint@10.4.1(jiti@2.7.0))(rollup@4.61.1)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-i18n@11.4.5(vue@3.5.38(typescript@6.0.3)))(vue@3.5.38(typescript@6.0.3))': + '@intlify/unplugin-vue-i18n@11.2.3(@vue/compiler-dom@3.5.38)(eslint@10.4.1(jiti@2.7.0))(rollup@4.61.1)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-i18n@11.4.5(vue@3.5.38(typescript@6.0.3)))(vue@3.5.38(typescript@6.0.3))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) '@intlify/bundle-utils': 11.2.3(vue-i18n@11.4.5(vue@3.5.38(typescript@6.0.3))) @@ -9512,7 +9917,7 @@ snapshots: unplugin: 2.3.11 vue: 3.5.38(typescript@6.0.3) optionalDependencies: - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) vue-i18n: 11.4.5(vue@3.5.38(typescript@6.0.3)) transitivePeerDependencies: - '@vue/compiler-dom' @@ -9936,9 +10341,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@nuxt/a11y@1.0.0-alpha.1(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))': + '@nuxt/a11y@1.0.0-alpha.1(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/kit': 4.4.8(magicast@0.5.3) axe-core: 4.12.1 sirv: 3.0.2 @@ -9986,19 +10391,19 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@2.7.0(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))': + '@nuxt/devtools-kit@2.7.0(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@nuxt/kit': 3.21.8(magicast@0.5.3) execa: 8.0.1 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) transitivePeerDependencies: - magicast - '@nuxt/devtools-kit@3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))': + '@nuxt/devtools-kit@3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) execa: 8.0.1 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) transitivePeerDependencies: - magicast @@ -10013,9 +10418,9 @@ snapshots: pkg-types: 2.3.1 semver: 7.8.4 - '@nuxt/devtools@3.2.4(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': + '@nuxt/devtools@3.2.4(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': dependencies: - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/devtools-wizard': 3.2.4 '@nuxt/kit': 4.4.8(magicast@0.5.3) '@vue/devtools-core': 8.1.2(vue@3.5.38(typescript@6.0.3)) @@ -10043,9 +10448,9 @@ snapshots: sirv: 3.0.2 structured-clone-es: 2.0.0 tinyglobby: 0.2.17 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) - vite-plugin-inspect: 11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) - vite-plugin-vue-tracer: 1.4.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite-plugin-inspect: 11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + vite-plugin-vue-tracer: 1.4.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) which: 6.0.1 ws: 8.21.0 transitivePeerDependencies: @@ -10094,10 +10499,10 @@ snapshots: - supports-color - typescript - '@nuxt/eslint@1.16.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.38)(crossws@0.4.6(srvx@0.11.16))(eslint-webpack-plugin@4.2.0(eslint@10.4.1(jiti@2.7.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)))(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(oxc-parser@0.133.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))': + '@nuxt/eslint@1.16.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.38)(crossws@0.4.6(srvx@0.11.16))(eslint-webpack-plugin@4.2.0(eslint@10.4.1(jiti@2.7.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)))(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(oxc-parser@0.133.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@eslint/config-inspector': 3.0.4(crossws@0.4.6(srvx@0.11.16))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/eslint-config': 1.16.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.38)(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) '@nuxt/eslint-plugin': 1.16.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) '@nuxt/kit': 4.4.8(magicast@0.5.3) @@ -10128,13 +10533,13 @@ snapshots: - utf-8-validate - vite - '@nuxt/fonts@0.14.0(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1)(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))': + '@nuxt/fonts@0.14.0(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1)(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/kit': 4.4.8(magicast@0.5.3) consola: 3.4.2 defu: 6.1.7 - fontless: 0.2.1(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + fontless: 0.2.1(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) h3: 1.15.11 magic-regexp: 0.10.0 ofetch: 1.5.1 @@ -10144,7 +10549,7 @@ snapshots: ufo: 1.6.4 unifont: 0.7.4 unplugin: 3.0.0 - unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1) + unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10168,9 +10573,9 @@ snapshots: - uploadthing - vite - '@nuxt/hints@1.1.2(@jest/globals@30.4.1)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(ioredis@5.11.1)(jest-diff@30.4.1)(jest-snapshot@30.4.1)(jest@30.4.2(@types/node@25.9.3))(magicast@0.5.3)(srvx@0.11.16)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': + '@nuxt/hints@1.1.2(@jest/globals@30.4.1)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(jest-diff@30.4.1)(jest-snapshot@30.4.1)(jest@30.4.2(@types/node@25.9.3))(magicast@0.5.3)(srvx@0.11.16)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': dependencies: - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/kit': 4.4.8(magicast@0.5.3) consola: 3.4.2 defu: 6.1.7 @@ -10179,15 +10584,15 @@ snapshots: html-validate: 10.17.0(@jest/globals@30.4.1)(jest-diff@30.4.1)(jest-snapshot@30.4.1)(jest@30.4.2(@types/node@25.9.3)) knitwork: 1.3.0 magic-string: 0.30.21 - nitropack: 2.13.4(drizzle-orm@0.45.2)(oxc-parser@0.130.0)(srvx@0.11.16) + nitropack: 2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.130.0)(srvx@0.11.16) oxc-parser: 0.130.0 prettier: 3.8.4 sirv: 3.0.2 ufo: 1.6.4 unplugin: 3.0.0 - unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1) + unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1) valibot: 1.4.1(typescript@6.0.3) - vite-plugin-vue-tracer: 1.4.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + vite-plugin-vue-tracer: 1.4.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) web-vitals: 5.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -10233,13 +10638,13 @@ snapshots: - vue - xml2js - '@nuxt/icon@2.2.3(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': + '@nuxt/icon@2.2.3(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': dependencies: '@iconify/collections': 1.0.695 '@iconify/types': 2.0.0 '@iconify/utils': 3.1.3 '@iconify/vue': 5.0.1(vue@3.5.38(typescript@6.0.3)) - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/kit': 4.4.8(magicast@0.5.3) consola: 3.4.2 local-pkg: 1.2.1 @@ -10254,7 +10659,7 @@ snapshots: - vite - vue - '@nuxt/image@2.0.0(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1)(magicast@0.5.3)(srvx@0.11.16)': + '@nuxt/image@2.0.0(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1)(magicast@0.5.3)(srvx@0.11.16)': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) consola: 3.4.2 @@ -10267,7 +10672,7 @@ snapshots: std-env: 3.10.0 ufo: 1.6.4 optionalDependencies: - ipx: 3.1.1(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1)(srvx@0.11.16) + ipx: 3.1.1(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1)(srvx@0.11.16) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10342,7 +10747,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/nitro-server@4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(oxc-parser@0.133.0)(srvx@0.11.16)(typescript@6.0.3)': + '@nuxt/nitro-server@4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(oxc-parser@0.133.0)(srvx@0.11.16)(typescript@6.0.3)': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.4.8(magicast@0.5.3) @@ -10359,8 +10764,8 @@ snapshots: impound: 1.1.5 klona: 2.0.6 mocked-exports: 0.1.1 - nitropack: 2.13.4(drizzle-orm@0.45.2)(oxc-parser@0.133.0)(srvx@0.11.16) - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) + nitropack: 2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.133.0)(srvx@0.11.16) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) nypm: 0.6.7 ohash: 2.0.11 pathe: 2.0.3 @@ -10368,7 +10773,7 @@ snapshots: std-env: 4.1.0 ufo: 1.6.4 unctx: 2.5.0 - unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1) + unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1) vue: 3.5.38(typescript@6.0.3) vue-bundle-renderer: 2.2.0 vue-devtools-stub: 0.1.0 @@ -10429,10 +10834,10 @@ snapshots: rc9: 3.0.1 std-env: 4.1.0 - '@nuxt/test-utils@4.0.3(@jest/globals@30.4.1)(crossws@0.4.6(srvx@0.11.16))(magicast@0.5.3)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))': + '@nuxt/test-utils@4.0.3(@jest/globals@30.4.1)(crossws@0.4.6(srvx@0.11.16))(magicast@0.5.3)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@clack/prompts': 1.2.0 - '@nuxt/devtools-kit': 2.7.0(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + '@nuxt/devtools-kit': 2.7.0(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/kit': 3.21.8(magicast@0.5.3) c12: 3.3.4(magicast@0.5.3) consola: 3.4.2 @@ -10458,7 +10863,7 @@ snapshots: tinyexec: 1.2.4 ufo: 1.6.4 unplugin: 3.0.0 - vitest-environment-nuxt: 2.0.0(@jest/globals@30.4.1)(crossws@0.4.6(srvx@0.11.16))(magicast@0.5.3)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + vitest-environment-nuxt: 2.0.0(@jest/globals@30.4.1)(crossws@0.4.6(srvx@0.11.16))(magicast@0.5.3)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) vue: 3.5.38(typescript@6.0.3) optionalDependencies: '@jest/globals': 30.4.1 @@ -10468,18 +10873,18 @@ snapshots: - typescript - vite - '@nuxt/ui@4.8.2(@internationalized/date@3.12.2)(@internationalized/number@3.6.7)(@tiptap/extensions@3.26.1(@tiptap/core@3.26.1(@tiptap/pm@3.26.1))(@tiptap/pm@3.26.1))(@tiptap/y-tiptap@3.0.4(prosemirror-model@1.25.8)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(change-case@5.4.4)(db0@0.3.4(drizzle-orm@0.45.2))(embla-carousel@8.6.0)(ioredis@5.11.1)(magicast@0.5.3)(superstruct@2.0.2)(tailwindcss@4.3.0)(typescript@6.0.3)(valibot@1.4.1(typescript@6.0.3))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)))(vue@3.5.38(typescript@6.0.3))(yjs@13.6.31)': + '@nuxt/ui@4.8.2(@internationalized/date@3.12.2)(@internationalized/number@3.6.7)(@tiptap/extensions@3.26.1(@tiptap/core@3.26.1(@tiptap/pm@3.26.1))(@tiptap/pm@3.26.1))(@tiptap/y-tiptap@3.0.4(prosemirror-model@1.25.8)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(change-case@5.4.4)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(embla-carousel@8.6.0)(ioredis@5.11.1)(magicast@0.5.3)(superstruct@2.0.2)(tailwindcss@4.3.0)(typescript@6.0.3)(valibot@1.4.1(typescript@6.0.3))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)))(vue@3.5.38(typescript@6.0.3))(yjs@13.6.31)': dependencies: '@floating-ui/dom': 1.7.6 '@iconify/vue': 5.0.1(vue@3.5.38(typescript@6.0.3)) - '@nuxt/fonts': 0.14.0(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1)(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) - '@nuxt/icon': 2.2.3(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + '@nuxt/fonts': 0.14.0(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1)(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + '@nuxt/icon': 2.2.3(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) '@nuxt/kit': 4.4.8(magicast@0.5.3) '@nuxt/schema': 4.4.8 '@nuxtjs/color-mode': 3.5.2(magicast@0.5.3) '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.3.0 - '@tailwindcss/vite': 4.3.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + '@tailwindcss/vite': 4.3.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@tanstack/vue-table': 8.21.3(vue@3.5.38(typescript@6.0.3)) '@tanstack/vue-virtual': 3.13.28(vue@3.5.38(typescript@6.0.3)) '@tiptap/core': 3.26.1(@tiptap/pm@3.26.1) @@ -10539,7 +10944,7 @@ snapshots: '@internationalized/number': 3.6.7 superstruct: 2.0.2 valibot: 1.4.1(typescript@6.0.3) - vue-router: 5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + vue-router: 5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10582,12 +10987,12 @@ snapshots: - vue - yjs - '@nuxt/vite-builder@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@25.9.3)(eslint@10.4.1(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(terser@5.48.0)(typescript@6.0.3)(vue-tsc@3.3.4(typescript@6.0.3))(vue@3.5.38(typescript@6.0.3))(yaml@2.9.0)': - dependencies: + ? '@nuxt/vite-builder@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@25.9.3)(eslint@10.4.1(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vue-tsc@3.3.4(typescript@6.0.3))(vue@3.5.38(typescript@6.0.3))(yaml@2.9.0)' + : dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) '@rollup/plugin-replace': 6.0.3(rollup@4.61.1) - '@vitejs/plugin-vue': 6.0.7(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) - '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + '@vitejs/plugin-vue': 6.0.7(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) autoprefixer: 10.5.0(postcss@8.5.15) consola: 3.4.2 cssnano: 8.0.2(postcss@8.5.15) @@ -10600,7 +11005,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) nypm: 0.6.7 pathe: 2.0.3 pkg-types: 2.3.1 @@ -10609,9 +11014,9 @@ snapshots: std-env: 4.1.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) - vite-node: 5.3.0(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) - vite-plugin-checker: 0.14.1(eslint@10.4.1(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3)) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite-node: 5.3.0(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite-plugin-checker: 0.14.1(eslint@10.4.1(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3)) vue: 3.5.38(typescript@6.0.3) vue-bundle-renderer: 2.2.0 optionalDependencies: @@ -10649,25 +11054,25 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxtjs/eslint-module@4.1.0(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15))': + '@nuxtjs/eslint-module@4.1.0(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15))': dependencies: '@nuxt/kit': 3.21.8(magicast@0.5.3) chokidar: 3.6.0 eslint: 10.4.1(jiti@2.7.0) eslint-webpack-plugin: 4.2.0(eslint@10.4.1(jiti@2.7.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)) pathe: 1.1.2 - vite-plugin-eslint: 1.8.1(eslint@10.4.1(jiti@2.7.0))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + vite-plugin-eslint: 1.8.1(eslint@10.4.1(jiti@2.7.0))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) transitivePeerDependencies: - magicast - vite - webpack - '@nuxtjs/i18n@10.4.0(@vue/compiler-dom@3.5.38)(db0@0.3.4(drizzle-orm@0.45.2))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(rollup@4.61.1)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': + '@nuxtjs/i18n@10.4.0(@vue/compiler-dom@3.5.38)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(rollup@4.61.1)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': dependencies: '@intlify/core': 11.4.5 '@intlify/h3': 0.7.4 '@intlify/shared': 11.4.5 - '@intlify/unplugin-vue-i18n': 11.2.3(@vue/compiler-dom@3.5.38)(eslint@10.4.1(jiti@2.7.0))(rollup@4.61.1)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-i18n@11.4.5(vue@3.5.38(typescript@6.0.3)))(vue@3.5.38(typescript@6.0.3)) + '@intlify/unplugin-vue-i18n': 11.2.3(@vue/compiler-dom@3.5.38)(eslint@10.4.1(jiti@2.7.0))(rollup@4.61.1)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-i18n@11.4.5(vue@3.5.38(typescript@6.0.3)))(vue@3.5.38(typescript@6.0.3)) '@intlify/utils': 0.14.1 '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.61.1) '@nuxt/kit': 4.4.8(magicast@0.5.3) @@ -10687,9 +11092,9 @@ snapshots: ufo: 1.6.4 unplugin: 3.0.0 unrouting: 0.1.7 - unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1) + unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1) vue-i18n: 11.4.5(vue@3.5.38(typescript@6.0.3)) - vue-router: 5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + vue-router: 5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11537,12 +11942,12 @@ snapshots: postcss: 8.5.15 tailwindcss: 4.3.0 - '@tailwindcss/vite@4.3.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.0 '@tailwindcss/oxide': 4.3.0 tailwindcss: 4.3.0 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) '@tanstack/table-core@8.21.3': {} @@ -11914,6 +12319,12 @@ snapshots: dependencies: undici-types: 7.24.6 + '@types/pg@8.20.0': + dependencies: + '@types/node': 25.9.3 + pg-protocol: 1.14.0 + pg-types: 2.2.0 + '@types/qs@6.15.1': {} '@types/range-parser@1.2.7': {} @@ -12224,22 +12635,22 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': + '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7) - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) vue: 3.5.38(typescript@6.0.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.7(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': + '@vitejs/plugin-vue@6.0.7(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) vue: 3.5.38(typescript@6.0.3) '@volar/language-core@2.4.28': @@ -12408,13 +12819,13 @@ snapshots: '@vueuse/metadata@14.3.0': {} - '@vueuse/nuxt@14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': + '@vueuse/nuxt@14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) '@vueuse/core': 14.3.0(vue@3.5.38(typescript@6.0.3)) '@vueuse/metadata': 14.3.0 local-pkg: 1.2.1 - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) vue: 3.5.38(typescript@6.0.3) transitivePeerDependencies: - magicast @@ -12603,6 +13014,8 @@ snapshots: ansis@4.3.1: {} + any-promise@1.3.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -12859,6 +13272,11 @@ snapshots: dependencies: run-applescript: 7.1.0 + bundle-require@5.1.0(esbuild@0.27.7): + dependencies: + esbuild: 0.27.7 + load-tsconfig: 0.2.5 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -13183,9 +13601,9 @@ snapshots: csstype@3.2.3: {} - db0@0.3.4(drizzle-orm@0.45.2): + db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)): optionalDependencies: - drizzle-orm: 0.45.2 + drizzle-orm: 0.45.2(@types/pg@8.20.0)(pg@8.21.0) debug@4.4.3: dependencies: @@ -13278,11 +13696,21 @@ snapshots: dotenv@17.4.2: {} - drizzle-orm@0.45.2: {} - - drizzle-valibot@0.4.2(drizzle-orm@0.45.2)(valibot@1.4.1(typescript@6.0.3)): + drizzle-kit@0.31.10: dependencies: - drizzle-orm: 0.45.2 + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.25.12 + tsx: 4.22.4 + + drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0): + optionalDependencies: + '@types/pg': 8.20.0 + pg: 8.21.0 + + drizzle-valibot@0.4.2(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(valibot@1.4.1(typescript@6.0.3)): + dependencies: + drizzle-orm: 0.45.2(@types/pg@8.20.0)(pg@8.21.0) valibot: 1.4.1(typescript@6.0.3) dunder-proto@1.0.1: @@ -13380,6 +13808,31 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.4 + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -13493,6 +13946,7 @@ snapshots: eslint-config-prettier@10.1.8(eslint@10.4.1(jiti@2.7.0)): dependencies: eslint: 10.4.1(jiti@2.7.0) + optional: true eslint-flat-config-utils@3.2.0: dependencies: @@ -13909,6 +14363,12 @@ snapshots: locate-path: 8.0.0 unicorn-magic: 0.3.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.2 + rollup: 4.61.1 + flat-cache@4.0.1: dependencies: flatted: 3.4.2 @@ -13930,7 +14390,7 @@ snapshots: dependencies: tiny-inflate: 1.0.3 - fontless@0.2.1(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): + fontless@0.2.1(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: consola: 3.4.2 css-tree: 3.2.1 @@ -13944,9 +14404,9 @@ snapshots: pathe: 2.0.3 ufo: 1.6.4 unifont: 0.7.4 - unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1) + unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1) optionalDependencies: - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -14285,7 +14745,7 @@ snapshots: ipaddr.js@1.9.1: {} - ipx@3.1.1(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1)(srvx@0.11.16): + ipx@3.1.1(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1)(srvx@0.11.16): dependencies: '@fastify/accept-negotiator': 2.0.1 citty: 0.1.6 @@ -14301,7 +14761,7 @@ snapshots: sharp: 0.34.5 svgo: 4.0.1 ufo: 1.6.4 - unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1) + unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1) xss: 1.0.15 transitivePeerDependencies: - '@azure/app-configuration' @@ -14772,6 +15232,8 @@ snapshots: jiti@2.7.0: {} + joycon@3.1.1: {} + js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -14933,6 +15395,8 @@ snapshots: load-esm@1.0.3: {} + load-tsconfig@0.2.5: {} + loader-runner@4.3.2: {} local-pkg@1.2.1: @@ -15131,6 +15595,12 @@ snapshots: mute-stream@2.0.0: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.12: {} nanotar@0.3.0: {} @@ -15143,7 +15613,7 @@ snapshots: neo-async@2.6.2: {} - nitropack@2.13.4(drizzle-orm@0.45.2)(oxc-parser@0.130.0)(srvx@0.11.16): + nitropack@2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.130.0)(srvx@0.11.16): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.61.1) @@ -15164,7 +15634,7 @@ snapshots: cookie-es: 2.0.1 croner: 10.0.1 crossws: 0.3.5 - db0: 0.3.4(drizzle-orm@0.45.2) + db0: 0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)) defu: 6.1.7 destr: 2.0.5 dot-prop: 10.1.0 @@ -15210,7 +15680,7 @@ snapshots: unenv: 2.0.0-rc.24 unimport: 6.3.0(oxc-parser@0.130.0) unplugin-utils: 0.3.1 - unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1) + unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1) untyped: 2.0.0 unwasm: 0.5.3 youch: 4.1.1 @@ -15248,7 +15718,7 @@ snapshots: - supports-color - uploadthing - nitropack@2.13.4(drizzle-orm@0.45.2)(oxc-parser@0.133.0)(srvx@0.11.16): + nitropack@2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.133.0)(srvx@0.11.16): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.61.1) @@ -15269,7 +15739,7 @@ snapshots: cookie-es: 2.0.1 croner: 10.0.1 crossws: 0.3.5 - db0: 0.3.4(drizzle-orm@0.45.2) + db0: 0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)) defu: 6.1.7 destr: 2.0.5 dot-prop: 10.1.0 @@ -15315,7 +15785,7 @@ snapshots: unenv: 2.0.0-rc.24 unimport: 6.3.0(oxc-parser@0.133.0) unplugin-utils: 0.3.1 - unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1) + unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1) untyped: 2.0.0 unwasm: 0.5.3 youch: 4.1.1 @@ -15408,16 +15878,16 @@ snapshots: nuxt-define@1.0.0: {} - nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0): + nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0): dependencies: '@dxup/nuxt': 0.4.1(magicast@0.5.3)(typescript@6.0.3) '@nuxt/cli': 3.35.2(@nuxt/schema@4.4.8)(cac@7.0.0)(commander@11.1.0)(magicast@0.5.3) - '@nuxt/devtools': 3.2.4(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + '@nuxt/devtools': 3.2.4(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/nitro-server': 4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(oxc-parser@0.133.0)(srvx@0.11.16)(typescript@6.0.3) + '@nuxt/nitro-server': 4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(oxc-parser@0.133.0)(srvx@0.11.16)(typescript@6.0.3) '@nuxt/schema': 4.4.8 '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.8(magicast@0.5.3)) - '@nuxt/vite-builder': 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@25.9.3)(eslint@10.4.1(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2))(drizzle-orm@0.45.2)(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(terser@5.48.0)(typescript@6.0.3)(vue-tsc@3.3.4(typescript@6.0.3))(vue@3.5.38(typescript@6.0.3))(yaml@2.9.0) + '@nuxt/vite-builder': 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@25.9.3)(eslint@10.4.1(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vue-tsc@3.3.4(typescript@6.0.3))(vue@3.5.38(typescript@6.0.3))(yaml@2.9.0) '@unhead/vue': 2.1.15(vue@3.5.38(typescript@6.0.3)) '@vue/shared': 3.5.38 chokidar: 5.0.0 @@ -15465,7 +15935,7 @@ snapshots: unrouting: 0.1.7 untyped: 2.0.0 vue: 3.5.38(typescript@6.0.3) - vue-router: 5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + vue-router: 5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) optionalDependencies: '@parcel/watcher': 2.5.6 '@types/node': 25.9.3 @@ -15872,6 +16342,41 @@ snapshots: perfect-debounce@2.1.0: {} + pg-cloudflare@1.4.0: + optional: true + + pg-connection-string@2.13.0: {} + + pg-int8@1.0.1: {} + + pg-pool@3.14.0(pg@8.21.0): + dependencies: + pg: 8.21.0 + + pg-protocol@1.14.0: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.1 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg@8.21.0: + dependencies: + pg-connection-string: 2.13.0 + pg-pool: 3.14.0(pg@8.21.0) + pg-protocol: 1.14.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.4.0 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -15935,6 +16440,15 @@ snapshots: dependencies: postcss: 8.5.15 + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(yaml@2.9.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.7.0 + postcss: 8.5.15 + tsx: 4.22.4 + yaml: 2.9.0 + postcss-merge-longhand@8.0.1(postcss@8.5.15): dependencies: postcss: 8.5.15 @@ -16062,6 +16576,16 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postgres-array@2.0.0: {} + + postgres-bytea@1.0.1: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + powershell-utils@0.1.0: {} prelude-ls@1.2.1: {} @@ -16577,6 +17101,8 @@ snapshots: spdx-license-ids@3.0.23: {} + split2@4.2.0: {} + sprintf-js@1.0.3: {} srvx@0.11.16: {} @@ -16673,6 +17199,16 @@ snapshots: postcss: 8.5.15 postcss-selector-parser: 7.1.4 + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.17 + ts-interface-checker: 0.1.13 + superagent@10.3.0: dependencies: component-emitter: 1.3.1 @@ -16804,12 +17340,22 @@ snapshots: transitivePeerDependencies: - react-native-b4a + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + tiny-inflate@1.0.3: {} tiny-invariant@1.3.3: {} tinyclip@0.1.14: {} + tinyexec@0.3.2: {} + tinyexec@1.2.4: {} tinyglobby@0.2.17: @@ -16842,6 +17388,8 @@ snapshots: tr46@0.0.3: {} + tree-kill@1.2.2: {} + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -16850,6 +17398,8 @@ snapshots: dependencies: typescript: 6.0.3 + ts-interface-checker@0.1.13: {} + ts-jest@29.4.11(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(jest-util@30.4.1)(jest@30.4.2(@types/node@25.9.3)(ts-node@10.9.2(@types/node@25.9.3)(typescript@6.0.3)))(typescript@6.0.3): dependencies: bs-logger: 0.2.6 @@ -16913,6 +17463,40 @@ snapshots: tslib@2.8.1: {} + tsup@8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@6.0.3)(yaml@2.9.0): + dependencies: + bundle-require: 5.1.0(esbuild@0.27.7) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.7 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(yaml@2.9.0) + resolve-from: 5.0.0 + rollup: 4.61.1 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.15 + typescript: 6.0.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsx@4.22.4: + dependencies: + esbuild: 0.28.1 + optionalDependencies: + fsevents: 2.3.3 + turbo@2.9.18: optionalDependencies: '@turbo/darwin-64': 2.9.18 @@ -17144,7 +17728,7 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 - unstorage@1.17.5(db0@0.3.4(drizzle-orm@0.45.2))(ioredis@5.11.1): + unstorage@1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1): dependencies: anymatch: 3.1.3 chokidar: 5.0.0 @@ -17155,7 +17739,7 @@ snapshots: ofetch: 1.5.1 ufo: 1.6.4 optionalDependencies: - db0: 0.3.4(drizzle-orm@0.45.2) + db0: 0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)) ioredis: 5.11.1 untun@0.1.3: @@ -17217,23 +17801,23 @@ snapshots: transitivePeerDependencies: - '@vue/composition-api' - vite-dev-rpc@2.0.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): + vite-dev-rpc@2.0.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: birpc: 4.0.0 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) - vite-hot-client: 2.2.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite-hot-client: 2.2.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) - vite-hot-client@2.2.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): + vite-hot-client@2.2.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) - vite-node@5.3.0(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0): + vite-node@5.3.0(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0): dependencies: cac: 6.7.14 es-module-lexer: 2.1.0 obug: 2.1.2 pathe: 2.0.3 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -17247,7 +17831,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.14.1(eslint@10.4.1(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3)): + vite-plugin-checker@0.14.1(eslint@10.4.1(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3)): dependencies: '@babel/code-frame': 7.29.7 chokidar: 5.0.0 @@ -17256,22 +17840,22 @@ snapshots: picomatch: 4.0.4 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) optionalDependencies: eslint: 10.4.1(jiti@2.7.0) optionator: 0.9.4 typescript: 6.0.3 vue-tsc: 3.3.4(typescript@6.0.3) - vite-plugin-eslint@1.8.1(eslint@10.4.1(jiti@2.7.0))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-eslint@1.8.1(eslint@10.4.1(jiti@2.7.0))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: '@rollup/pluginutils': 4.2.1 '@types/eslint': 8.56.12 eslint: 10.4.1(jiti@2.7.0) rollup: 2.80.0 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) - vite-plugin-inspect@11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-inspect@11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: ansis: 4.3.1 error-stack-parser-es: 1.0.5 @@ -17281,22 +17865,22 @@ snapshots: perfect-debounce: 2.1.0 sirv: 3.0.2 unplugin-utils: 0.3.1 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) - vite-dev-rpc: 2.0.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite-dev-rpc: 2.0.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) optionalDependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) - vite-plugin-vue-tracer@1.4.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)): + vite-plugin-vue-tracer@1.4.0(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.8 magic-string: 0.30.21 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) vue: 3.5.38(typescript@6.0.3) - vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0): + vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -17310,11 +17894,12 @@ snapshots: jiti: 2.7.0 lightningcss: 1.32.0 terser: 5.48.0 + tsx: 4.22.4 yaml: 2.9.0 - vitest-environment-nuxt@2.0.0(@jest/globals@30.4.1)(crossws@0.4.6(srvx@0.11.16))(magicast@0.5.3)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): + vitest-environment-nuxt@2.0.0(@jest/globals@30.4.1)(crossws@0.4.6(srvx@0.11.16))(magicast@0.5.3)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): dependencies: - '@nuxt/test-utils': 4.0.3(@jest/globals@30.4.1)(crossws@0.4.6(srvx@0.11.16))(magicast@0.5.3)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + '@nuxt/test-utils': 4.0.3(@jest/globals@30.4.1)(crossws@0.4.6(srvx@0.11.16))(magicast@0.5.3)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -17365,7 +17950,7 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.38(typescript@6.0.3) - vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)): + vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)): dependencies: '@babel/generator': 8.0.0-rc.6 '@vue-macros/common': 3.1.2(vue@3.5.38(typescript@6.0.3)) @@ -17387,7 +17972,7 @@ snapshots: yaml: 2.9.0 optionalDependencies: '@vue/compiler-sfc': 3.5.38 - vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) vue-tsc@3.3.4(typescript@6.0.3): dependencies: @@ -17574,6 +18159,8 @@ snapshots: cssfilter: 0.0.10 optional: true + xtend@4.0.2: {} + y-protocols@1.0.7(yjs@13.6.31): dependencies: lib0: 0.2.117 diff --git a/turbo.json b/turbo.json index edf6318..2b019c9 100644 --- a/turbo.json +++ b/turbo.json @@ -15,7 +15,8 @@ }, "dev": { "cache": false, - "persistent": true + "persistent": true, + "dependsOn": ["^build"] } } } -- 2.43.7 From 32aed2af26ad8e117506b1c94e4da3a5d9f752a8 Mon Sep 17 00:00:00 2001 From: NHoarau Date: Sun, 21 Jun 2026 23:31:55 +0400 Subject: [PATCH 03/14] feat: add rolldown configuration for building TypeScript project and removed useless refs.ts file --- apps/web/app/composables/useProjectApi.ts | 4 +- openspec/changes/project-crud-sync/design.md | 22 +- .../changes/project-crud-sync/proposal.md | 8 +- .../specs/project-full-lifecycle/spec.md | 8 +- packages/schema/package.json | 5 +- packages/schema/rolldown.config.ts | 18 ++ packages/schema/src/drizzle/refs.ts | 4 - packages/schema/src/drizzle/relations.ts | 4 - packages/schema/src/drizzle/tasks.ts | 5 +- packages/schema/src/index.ts | 5 +- pnpm-lock.yaml | 276 +++++++++++++++--- 11 files changed, 291 insertions(+), 68 deletions(-) create mode 100644 packages/schema/rolldown.config.ts delete mode 100644 packages/schema/src/drizzle/refs.ts diff --git a/apps/web/app/composables/useProjectApi.ts b/apps/web/app/composables/useProjectApi.ts index bb40288..51256c9 100644 --- a/apps/web/app/composables/useProjectApi.ts +++ b/apps/web/app/composables/useProjectApi.ts @@ -76,7 +76,7 @@ export function useProjectApi() { }); if (data) { - const idx = projects.value.findIndex(p => p.id === id); + const idx = projects.value.findIndex((p) => p.id === id); if (idx !== NOT_FOUND) projects.value[idx] = data; } else { error.value = err; @@ -95,7 +95,7 @@ export function useProjectApi() { if (err) { error.value = err; } else { - projects.value = projects.value.filter(p => p.id !== id); + projects.value = projects.value.filter((p) => p.id !== id); } loading.value = false; diff --git a/openspec/changes/project-crud-sync/design.md b/openspec/changes/project-crud-sync/design.md index 3aa6057..aea56a1 100644 --- a/openspec/changes/project-crud-sync/design.md +++ b/openspec/changes/project-crud-sync/design.md @@ -5,21 +5,23 @@ The previous context remains: a unified technical layer for full CRUD operations ## Goals / Non-Goals **Goals:** -* To expose a stable, RESTful endpoint (`POST /api/v1/projects`) for project creation. -* To ensure data consistency: any project created via the API must behave identically to one created via the Web UI (and vice versa). -* To establish `project-creation` as the single source of truth requirement for project setup. -* **Local Development**: The entire stack (API, Web, DB) must be orchestrated via Docker Compose to guarantee a reproducible and persistent development environment. + +- To expose a stable, RESTful endpoint (`POST /api/v1/projects`) for project creation. +- To ensure data consistency: any project created via the API must behave identically to one created via the Web UI (and vice versa). +- To establish `project-creation` as the single source of truth requirement for project setup. +- **Local Development**: The entire stack (API, Web, DB) must be orchestrated via Docker Compose to guarantee a reproducible and persistent development environment. **Non-Goals:** -* Implementing granular ownership/permission checks within the creation payload itself; this should be handled by middleware/services post-creation. -* Handling advanced lifecycle events (e.g., project suspension) via the creation endpoint—these should use dedicated endpoints. + +- Implementing granular ownership/permission checks within the creation payload itself; this should be handled by middleware/services post-creation. +- Handling advanced lifecycle events (e.g., project suspension) via the creation endpoint—these should use dedicated endpoints. ## Decisions -* **Architecture**: The implementation must use a clear separation of concerns: Controllers handle HTTP concerns (routing, validation), Services encapsulate business logic, and Repositories handle data access. NestJS's module system enforces this structure naturally. -* **Database Technology & Setup**: PostgreSQL is mandated as the standard database engine for persistence. The root of the monorepo MUST have a `docker-compose.yml` dedicated to infrastructure services (Postgres, volumes). API and Web apps run natively via `pnpm dev` — no containerization for application code in development. -* **Lifecycle Management**: Database migrations (schema versioning) must be executed *manually* via a dedicated CLI tool. This is critical for controlling both local and production deployment processes. -* **Input Validation Standard (NEW)**: Input validation for all API endpoints MUST be handled at the Controller level using **Schema-Driven Pipes**. All schemas used (`Project` DTOs, etc.) must be imported from and adhere to the contract defined in the shared `@workspace/schema` package. +- **Architecture**: The implementation must use a clear separation of concerns: Controllers handle HTTP concerns (routing, validation), Services encapsulate business logic, and Repositories handle data access. NestJS's module system enforces this structure naturally. +- **Database Technology & Setup**: PostgreSQL is mandated as the standard database engine for persistence. The root of the monorepo MUST have a `docker-compose.yml` dedicated to infrastructure services (Postgres, volumes). API and Web apps run natively via `pnpm dev` — no containerization for application code in development. +- **Lifecycle Management**: Database migrations (schema versioning) must be executed _manually_ via a dedicated CLI tool. This is critical for controlling both local and production deployment processes. +- **Input Validation Standard (NEW)**: Input validation for all API endpoints MUST be handled at the Controller level using **Schema-Driven Pipes**. All schemas used (`Project` DTOs, etc.) must be imported from and adhere to the contract defined in the shared `@workspace/schema` package. ## Risks / Trade-offs diff --git a/openspec/changes/project-crud-sync/proposal.md b/openspec/changes/project-crud-sync/proposal.md index a572c96..cc3df54 100644 --- a/openspec/changes/project-crud-sync/proposal.md +++ b/openspec/changes/project-crud-sync/proposal.md @@ -4,16 +4,18 @@ Current project management lacks a unified layer for full CRUD operations. The a ## What Changes -* **New Capability**: Full Project Lifecycle Management will be implemented: Create (C), Read (R), Update (U), Delete (D). -* **Technical Change**: The system must incorporate a dedicated, idempotent database migration mechanism for the `Project` entity. -* **Data Initialization**: Implement optional seeding mechanisms to populate initial dummy data or test scenarios upon deployment/setup. +- **New Capability**: Full Project Lifecycle Management will be implemented: Create (C), Read (R), Update (U), Delete (D). +- **Technical Change**: The system must incorporate a dedicated, idempotent database migration mechanism for the `Project` entity. +- **Data Initialization**: Implement optional seeding mechanisms to populate initial dummy data or test scenarios upon deployment/setup. ## Capabilities ### New Capabilities + - `project-full-lifecycle`: Governing all CRUD operations and the associated schema management (migrations) for the Project resource. ### Modified Capabilities + ## Impact diff --git a/openspec/changes/project-crud-sync/specs/project-full-lifecycle/spec.md b/openspec/changes/project-crud-sync/specs/project-full-lifecycle/spec.md index af3e37b..b384208 100644 --- a/openspec/changes/project-crud-sync/specs/project-full-lifecycle/spec.md +++ b/openspec/changes/project-crud-sync/specs/project-full-lifecycle/spec.md @@ -1,22 +1,28 @@ ## ADDED Requirements ### Requirement: Project Lifecycle Management (CRUD) + The system SHALL provide full CRUD functionality for the `Project` resource, managed by a central service layer. All operations must be atomic and transactionally consistent across API and Web paths. This includes validation on creation (name uniqueness). #### Scenario: Successful Project Creation + - **WHEN** valid payload {name, ownerId, templateType} is submitted to POST /projects - **THEN** a unique Project resource record is created with status 'ACTIVE', and all related metadata are initialized correctly. ### Requirement: Schema Migration Enforcement + The system SHALL enforce database schema changes via versioned migrations (e.g., using an established ORM migration tool). The deployment process MUST fail if the current schema does not match the expected state defined by the latest migration script. #### Scenario: Applying New Schema + - **WHEN** deploying a change requiring a new column (`last_updated`) on `projects` table - **THEN** the deployment pipeline runs the required migration, adding the column without breaking existing application runtime logic (e.g., providing a default value or nullability). ### Requirement: Optional Data Seeding + The system SHALL support optional data seeding scripts for development and testing environments. These scripts MUST be idempotent to allow multiple safe executions. #### Scenario: Running Seed Scripts + - **WHEN** running the setup script `pnpm run db:seed` in a test environment with existing data -- **THEN** any record matching seed criteria (e.g., default user) is updated rather than duplicated, and the script logs successful updates/inserts. \ No newline at end of file +- **THEN** any record matching seed criteria (e.g., default user) is updated rather than duplicated, and the script logs successful updates/inserts. diff --git a/packages/schema/package.json b/packages/schema/package.json index c6e5a6d..37364ce 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -13,8 +13,8 @@ } }, "scripts": { - "build": "tsup src/index.ts --format esm --dts --clean --external drizzle-orm --external drizzle-valibot --external valibot", - "dev": "tsup src/index.ts --format esm --dts --clean --external drizzle-orm --external drizzle-valibot --external valibot --watch", + "build": "rolldown -c rolldown.config.ts --clean-dir && tsc --declaration --emitDeclarationOnly --outDir dist", + "dev": "rolldown -c rolldown.config.ts --clean-dir --watch", "clean": "rm -rf dist", "check-types": "tsc --noEmit", "lint": "eslint \"src/**/*.ts\" --fix", @@ -34,6 +34,7 @@ "@workspace/tooling": "workspace:*", "drizzle-kit": "^0.31.10", "eslint": "^10.4.1", + "rolldown": "^1.1.2", "tsup": "^8.5.1", "tsx": "^4.22.4", "typescript": "^6.0.3" diff --git a/packages/schema/rolldown.config.ts b/packages/schema/rolldown.config.ts new file mode 100644 index 0000000..649f3e2 --- /dev/null +++ b/packages/schema/rolldown.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from "rolldown"; + +export default defineConfig({ + input: "src/index.ts", + output: { + format: "esm", + dir: "dist", + entryFileNames: "index.js", + }, + external: (id: string) => + id === "drizzle-orm" || + id.startsWith("drizzle-orm/") || + id === "drizzle-valibot" || + id.startsWith("drizzle-valibot/") || + id === "valibot" || + id.startsWith("valibot/"), + platform: "node", +}); diff --git a/packages/schema/src/drizzle/refs.ts b/packages/schema/src/drizzle/refs.ts deleted file mode 100644 index 9466d8e..0000000 --- a/packages/schema/src/drizzle/refs.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const refs: Record = { - projects: undefined, - tasks: undefined, -}; diff --git a/packages/schema/src/drizzle/relations.ts b/packages/schema/src/drizzle/relations.ts index 93b1691..8735d0e 100644 --- a/packages/schema/src/drizzle/relations.ts +++ b/packages/schema/src/drizzle/relations.ts @@ -1,11 +1,7 @@ import { relations } from "drizzle-orm"; -import { refs } from "./refs"; import { projects } from "./projects"; import { tasks } from "./tasks"; -refs.projects = projects; -refs.tasks = tasks; - export const projectsRelations = relations(projects, ({ many }) => ({ tasks: many(tasks), })); diff --git a/packages/schema/src/drizzle/tasks.ts b/packages/schema/src/drizzle/tasks.ts index cb78926..61c7455 100644 --- a/packages/schema/src/drizzle/tasks.ts +++ b/packages/schema/src/drizzle/tasks.ts @@ -2,7 +2,7 @@ import { pgTable, uuid, text, integer, timestamp, check } from "drizzle-orm/pg-c import { sql } from "drizzle-orm"; import { createInsertSchema, createSelectSchema, createUpdateSchema } from "drizzle-valibot"; import { InferOutput, picklist, pipe } from "valibot"; -import { refs } from "./refs"; +import { projects } from "./projects"; export const TASK_STATUSES = ["todo", "in_progress", "in_review", "done"] as const; export type TaskStatus = (typeof TASK_STATUSES)[number]; @@ -19,8 +19,7 @@ export const tasks = pgTable( id: uuid("id").primaryKey().defaultRandom(), projectId: uuid("project_id") .notNull() - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - .references(() => refs.projects.id, { onDelete: "cascade" }), + .references(() => projects.id, { onDelete: "cascade" }), title: text("title").notNull(), description: text("description"), status: text("status").notNull().default("todo"), diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index 8d69810..2ad3e67 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -20,10 +20,7 @@ export { type ProjectInsertDTO, type ProjectUpdateDTO, } from "./drizzle/projects"; -export { - projectsRelations, - tasksRelations, -} from "./drizzle/relations"; +export { projectsRelations, tasksRelations } from "./drizzle/relations"; export { TASK_STATUSES, PRIORITIES, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e9dbcf6..3fb188b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,7 +122,7 @@ importers: version: 1.0.0-alpha.1(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/hints': specifier: 1.1.2 - version: 1.1.2(@jest/globals@30.4.1)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(jest-diff@30.4.1)(jest-snapshot@30.4.1)(jest@30.4.2(@types/node@25.9.3))(magicast@0.5.3)(srvx@0.11.16)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + version: 1.1.2(@jest/globals@30.4.1)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(jest-diff@30.4.1)(jest-snapshot@30.4.1)(jest@30.4.2(@types/node@25.9.3))(magicast@0.5.3)(rolldown@1.1.2)(srvx@0.11.16)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) '@nuxt/image': specifier: 2.0.0 version: 2.0.0(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1)(magicast@0.5.3)(srvx@0.11.16) @@ -140,20 +140,20 @@ importers: version: 10.4.0(@vue/compiler-dom@3.5.38)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(rollup@4.61.1)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) '@vueuse/nuxt': specifier: 14.3.0 - version: 14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) + version: 14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) '@workspace/schema': specifier: workspace:* version: link:../../packages/schema nuxt: specifier: ^4.4.8 - version: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) + version: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) tailwindcss: specifier: ^4.3.0 version: 4.3.0 devDependencies: '@nuxt/eslint': specifier: ^1.16.0 - version: 1.16.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.38)(crossws@0.4.6(srvx@0.11.16))(eslint-webpack-plugin@4.2.0(eslint@10.4.1(jiti@2.7.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)))(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(oxc-parser@0.133.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + version: 1.16.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.38)(crossws@0.4.6(srvx@0.11.16))(eslint-webpack-plugin@4.2.0(eslint@10.4.1(jiti@2.7.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)))(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(oxc-parser@0.133.0)(rolldown@1.1.2)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@workspace/tooling': specifier: workspace:* version: link:../../packages/tooling @@ -169,9 +169,6 @@ importers: packages/schema: dependencies: - dotenv: - specifier: ^17.4.2 - version: 17.4.2 drizzle-orm: specifier: ^0.45.2 version: 0.45.2(@types/pg@8.20.0)(pg@8.21.0) @@ -200,6 +197,9 @@ importers: eslint: specifier: ^10.4.1 version: 10.4.1(jiti@2.7.0) + rolldown: + specifier: ^1.1.2 + version: 1.1.2 tsup: specifier: ^8.5.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@6.0.3)(yaml@2.9.0) @@ -571,15 +571,24 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/runtime@1.11.0': resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@es-joy/jsdoccomment@0.87.0': resolution: {integrity: sha512-mFXZloZMzuJZXSHUmAFu/pXTk0ZJTJBluuAkrvbzidpTN8W6F2bpRFuedSH+85kbdlRLJqc+gfN+kD3JOLJK5g==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -2751,6 +2760,9 @@ packages: '@oxc-project/types@0.133.0': resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.137.0': + resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} + '@oxc-transform/binding-android-arm-eabi@0.128.0': resolution: {integrity: sha512-qVO4izEs88ZSo7KOK4P+O5nAXXJmkSadInvFjGkhVnm2R2Wr8trU/GLhjAK0S0u8Qv9bkXspNhgpECk+CTQ/ew==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3103,6 +3115,95 @@ packages: '@poppinss/exception@1.2.3': resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + '@rolldown/binding-android-arm64@1.1.2': + resolution: {integrity: sha512-2cZ+7xRS+DBcuJBJKnfzsbleumJhBqSlJVpuzHC0nTqfd3QQ7Vx2/x5YR/D7cBamKSeWplwo82Fn9lqYUDEMfA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.1.2': + resolution: {integrity: sha512-RkPMJnygxsgOYdkfqgpwY0/Fzm8d0VQe6HGU2/B00Xa9eqdLbrII+DOKAodbJAn3ZL1AJxGHkZRPYazgGY6Ljw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.1.2': + resolution: {integrity: sha512-Uiczh6vFhwyfd7WNe7Q7mCA4KxAiLdz7jPE/WGizfRpIieoyFuNVMmM8HqZ9HwudTkY6/AeMQwlNJ9NJijguWw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.1.2': + resolution: {integrity: sha512-+TpdtTRgHiJFjCVFbw311SuLk3KfytPOQQn+VlAEv+gBxYPtL7E6JS9e/tk+8CwxhIZvemJKo4rTKgfWNsKkkA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.1.2': + resolution: {integrity: sha512-4lv1/tkmi7ueIVHnyreaOeUpiZP26BH9rRy6hoYfR9310A2B9nUEVRDvBx69vx64Nr3eTPPRkyciqJJs+j9Jmw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.1.2': + resolution: {integrity: sha512-gBSUVO0eaWgw1JMjK3gB8BMlX2Mk148s2lTiVT3e9vjVxbl7UDfMWWY8CfIaaqiXuM9fVTMxIpUz6CAo/B6Vlw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.1.2': + resolution: {integrity: sha512-LjQP/iZLBu8o8PjIfk4x3At0/mT6h282pvz8Z5LAyhGbu/kDezyO7ea62rF5uoqmgnIYqbN/MqJ3Si3Aymi7xQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.1.2': + resolution: {integrity: sha512-X/7bVLWelEsbyWDUSXt7zVsTniLLPIY2n1rH58qr78l9i7MNbbxBWD8gI2vRfBWf4NUXJCUuQnfZDsp32LqsfQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.1.2': + resolution: {integrity: sha512-gb6dYKW/1KDorGXyy48glEBJs/sxVSC5pcVrox/pFGV4mvwSFeg2sK5L2tRkVsVlh7kueqOgg4GEcuipJcGuKg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.1.2': + resolution: {integrity: sha512-JY4w85pU3iAiJVMh5nuk4/Mh9GjMsupe8MrIN53rwxAZW64GKrWeJBuN6SxQg9QTU5uB1cxyhDzW8jqRn1EABw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.1.2': + resolution: {integrity: sha512-xvpA7o5KCYLB0Rwscmuylb1/zHHSUx4g4xilm4prC5jP76pEUlzBmMbgpbh7bVDbId4NcfT96gN5i6mE6UDaiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.1.2': + resolution: {integrity: sha512-p/ts6KBLjuk49Bp21XH77poQGt02iNz7ChgHep7tudPOaLinR/De/RHdxF8w8Yj4r/bF/bqXwH6PZrB2sA+Nvw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.1.2': + resolution: {integrity: sha512-VMu/wmrZ9hJzYlRhbw7jK5PODlugyKZ5mOdX78+lS8OvuFkWNQdz1pFLrI2p3P0pjXOmUZ7B48o5VnMH9QOGtg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.1.2': + resolution: {integrity: sha512-xtUJqs8qEkuSviS0n1tsohaPuz3a1SPhZywOji4Oo+sgrJs8daEDMZ0QtqL0OS7dx8PoVpg2J/ZZycPY5I2+Zg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.1.2': + resolution: {integrity: sha512-85YiLQqjUKgSO/Zjnf9e0XIn5Ymrh1fLDWBeAkZqpuBR/3R8TpfoHXuyblqyQrftSSgWO9qpcHN8mkyKsLraoA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} @@ -7507,6 +7608,11 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rolldown@1.1.2: + resolution: {integrity: sha512-x0CrQQqCXWGeI8dTvFfN/Dnv3yMKT9hv5jFjlOreKAx9wqLq9wz7VvLLHyaAXC90/CpggTu9SisSbsJJTPSjNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-visualizer@7.0.1: resolution: {integrity: sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==} engines: {node: '>=22'} @@ -9153,6 +9259,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 @@ -9163,11 +9275,21 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@es-joy/jsdoccomment@0.87.0': dependencies: '@types/estree': 1.0.9 @@ -10220,6 +10342,13 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.2 + optional: true + '@nestjs/cli@11.0.23(@types/node@25.9.3)(prettier@3.8.4)': dependencies: '@angular-devkit/core': 19.2.27(chokidar@4.0.3) @@ -10499,7 +10628,7 @@ snapshots: - supports-color - typescript - '@nuxt/eslint@1.16.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.38)(crossws@0.4.6(srvx@0.11.16))(eslint-webpack-plugin@4.2.0(eslint@10.4.1(jiti@2.7.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)))(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(oxc-parser@0.133.0)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': + '@nuxt/eslint@1.16.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.38)(crossws@0.4.6(srvx@0.11.16))(eslint-webpack-plugin@4.2.0(eslint@10.4.1(jiti@2.7.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)))(eslint@10.4.1(jiti@2.7.0))(magicast@0.5.3)(oxc-parser@0.133.0)(rolldown@1.1.2)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@eslint/config-inspector': 3.0.4(crossws@0.4.6(srvx@0.11.16))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) @@ -10514,7 +10643,7 @@ snapshots: get-port-please: 3.2.0 mlly: 1.8.2 pathe: 2.0.3 - unimport: 6.3.0(oxc-parser@0.133.0) + unimport: 6.3.0(oxc-parser@0.133.0)(rolldown@1.1.2) optionalDependencies: eslint-webpack-plugin: 4.2.0(eslint@10.4.1(jiti@2.7.0))(webpack@5.106.2(lightningcss@1.32.0)(postcss@8.5.15)) transitivePeerDependencies: @@ -10573,7 +10702,7 @@ snapshots: - uploadthing - vite - '@nuxt/hints@1.1.2(@jest/globals@30.4.1)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(jest-diff@30.4.1)(jest-snapshot@30.4.1)(jest@30.4.2(@types/node@25.9.3))(magicast@0.5.3)(srvx@0.11.16)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': + '@nuxt/hints@1.1.2(@jest/globals@30.4.1)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(jest-diff@30.4.1)(jest-snapshot@30.4.1)(jest@30.4.2(@types/node@25.9.3))(magicast@0.5.3)(rolldown@1.1.2)(srvx@0.11.16)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': dependencies: '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@nuxt/kit': 4.4.8(magicast@0.5.3) @@ -10584,7 +10713,7 @@ snapshots: html-validate: 10.17.0(@jest/globals@30.4.1)(jest-diff@30.4.1)(jest-snapshot@30.4.1)(jest@30.4.2(@types/node@25.9.3)) knitwork: 1.3.0 magic-string: 0.30.21 - nitropack: 2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.130.0)(srvx@0.11.16) + nitropack: 2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.130.0)(rolldown@1.1.2)(srvx@0.11.16) oxc-parser: 0.130.0 prettier: 3.8.4 sirv: 3.0.2 @@ -10747,8 +10876,8 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/nitro-server@4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(oxc-parser@0.133.0)(srvx@0.11.16)(typescript@6.0.3)': - dependencies: + ? '@nuxt/nitro-server@4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(oxc-parser@0.133.0)(rolldown@1.1.2)(srvx@0.11.16)(typescript@6.0.3)' + : dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.4.8(magicast@0.5.3) '@unhead/vue': 2.1.15(vue@3.5.38(typescript@6.0.3)) @@ -10764,8 +10893,8 @@ snapshots: impound: 1.1.5 klona: 2.0.6 mocked-exports: 0.1.1 - nitropack: 2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.133.0)(srvx@0.11.16) - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) + nitropack: 2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.133.0)(rolldown@1.1.2)(srvx@0.11.16) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) nypm: 0.6.7 ohash: 2.0.11 pathe: 2.0.3 @@ -10987,7 +11116,7 @@ snapshots: - vue - yjs - ? '@nuxt/vite-builder@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@25.9.3)(eslint@10.4.1(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vue-tsc@3.3.4(typescript@6.0.3))(vue@3.5.38(typescript@6.0.3))(yaml@2.9.0)' + ? '@nuxt/vite-builder@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@25.9.3)(eslint@10.4.1(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vue-tsc@3.3.4(typescript@6.0.3))(vue@3.5.38(typescript@6.0.3))(yaml@2.9.0)' : dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) '@rollup/plugin-replace': 6.0.3(rollup@4.61.1) @@ -11005,7 +11134,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) nypm: 0.6.7 pathe: 2.0.3 pkg-types: 2.3.1 @@ -11021,7 +11150,8 @@ snapshots: vue-bundle-renderer: 2.2.0 optionalDependencies: '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - rollup-plugin-visualizer: 7.0.1(rollup@4.61.1) + rolldown: 1.1.2 + rollup-plugin-visualizer: 7.0.1(rolldown@1.1.2)(rollup@4.61.1) transitivePeerDependencies: - '@biomejs/biome' - '@types/node' @@ -11455,6 +11585,8 @@ snapshots: '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.137.0': {} + '@oxc-transform/binding-android-arm-eabi@0.128.0': optional: true @@ -11673,6 +11805,55 @@ snapshots: '@poppinss/exception@1.2.3': {} + '@rolldown/binding-android-arm64@1.1.2': + optional: true + + '@rolldown/binding-darwin-arm64@1.1.2': + optional: true + + '@rolldown/binding-darwin-x64@1.1.2': + optional: true + + '@rolldown/binding-freebsd-x64@1.1.2': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.1.2': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.1.2': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.1.2': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.1.2': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.1.2': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.1.2': + optional: true + + '@rolldown/binding-linux-x64-musl@1.1.2': + optional: true + + '@rolldown/binding-openharmony-arm64@1.1.2': + optional: true + + '@rolldown/binding-wasm32-wasi@1.1.2': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.1.2': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.1.2': + optional: true + '@rolldown/pluginutils@1.0.1': {} '@rollup/plugin-alias@6.0.0(rollup@4.61.1)': @@ -12819,13 +13000,13 @@ snapshots: '@vueuse/metadata@14.3.0': {} - '@vueuse/nuxt@14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': + '@vueuse/nuxt@14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3))': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) '@vueuse/core': 14.3.0(vue@3.5.38(typescript@6.0.3)) '@vueuse/metadata': 14.3.0 local-pkg: 1.2.1 - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) vue: 3.5.38(typescript@6.0.3) transitivePeerDependencies: - magicast @@ -15613,7 +15794,7 @@ snapshots: neo-async@2.6.2: {} - nitropack@2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.130.0)(srvx@0.11.16): + nitropack@2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.130.0)(rolldown@1.1.2)(srvx@0.11.16): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.61.1) @@ -15666,7 +15847,7 @@ snapshots: pretty-bytes: 7.1.0 radix3: 1.1.2 rollup: 4.61.1 - rollup-plugin-visualizer: 7.0.1(rollup@4.61.1) + rollup-plugin-visualizer: 7.0.1(rolldown@1.1.2)(rollup@4.61.1) scule: 1.3.0 semver: 7.8.4 serve-placeholder: 2.0.2 @@ -15678,7 +15859,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.5.0 unenv: 2.0.0-rc.24 - unimport: 6.3.0(oxc-parser@0.130.0) + unimport: 6.3.0(oxc-parser@0.130.0)(rolldown@1.1.2) unplugin-utils: 0.3.1 unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1) untyped: 2.0.0 @@ -15718,7 +15899,7 @@ snapshots: - supports-color - uploadthing - nitropack@2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.133.0)(srvx@0.11.16): + nitropack@2.13.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(oxc-parser@0.133.0)(rolldown@1.1.2)(srvx@0.11.16): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.61.1) @@ -15771,7 +15952,7 @@ snapshots: pretty-bytes: 7.1.0 radix3: 1.1.2 rollup: 4.61.1 - rollup-plugin-visualizer: 7.0.1(rollup@4.61.1) + rollup-plugin-visualizer: 7.0.1(rolldown@1.1.2)(rollup@4.61.1) scule: 1.3.0 semver: 7.8.4 serve-placeholder: 2.0.2 @@ -15783,7 +15964,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.5.0 unenv: 2.0.0-rc.24 - unimport: 6.3.0(oxc-parser@0.133.0) + unimport: 6.3.0(oxc-parser@0.133.0)(rolldown@1.1.2) unplugin-utils: 0.3.1 unstorage: 1.17.5(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(ioredis@5.11.1) untyped: 2.0.0 @@ -15878,16 +16059,16 @@ snapshots: nuxt-define@1.0.0: {} - nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0): + nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0): dependencies: '@dxup/nuxt': 0.4.1(magicast@0.5.3)(typescript@6.0.3) '@nuxt/cli': 3.35.2(@nuxt/schema@4.4.8)(cac@7.0.0)(commander@11.1.0)(magicast@0.5.3) '@nuxt/devtools': 3.2.4(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.38(typescript@6.0.3)) '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/nitro-server': 4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(oxc-parser@0.133.0)(srvx@0.11.16)(typescript@6.0.3) + '@nuxt/nitro-server': 4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(oxc-parser@0.133.0)(rolldown@1.1.2)(srvx@0.11.16)(typescript@6.0.3) '@nuxt/schema': 4.4.8 '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.8(magicast@0.5.3)) - '@nuxt/vite-builder': 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@25.9.3)(eslint@10.4.1(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vue-tsc@3.3.4(typescript@6.0.3))(vue@3.5.38(typescript@6.0.3))(yaml@2.9.0) + '@nuxt/vite-builder': 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@25.9.3)(eslint@10.4.1(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@7.0.0)(commander@11.1.0)(db0@0.3.4(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0)))(drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.21.0))(eslint@10.4.1(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0))(optionator@0.9.4)(rolldown@1.1.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1))(rollup@4.61.1)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vue-tsc@3.3.4(typescript@6.0.3))(vue@3.5.38(typescript@6.0.3))(yaml@2.9.0) '@unhead/vue': 2.1.15(vue@3.5.38(typescript@6.0.3)) '@vue/shared': 3.5.38 chokidar: 5.0.0 @@ -15915,7 +16096,7 @@ snapshots: oxc-minify: 0.133.0 oxc-parser: 0.133.0 oxc-transform: 0.133.0 - oxc-walker: 1.0.0(oxc-parser@0.133.0) + oxc-walker: 1.0.0(oxc-parser@0.133.0)(rolldown@1.1.2) pathe: 2.0.3 perfect-debounce: 2.1.0 picomatch: 4.0.4 @@ -15930,7 +16111,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.5.0 unhead: 2.1.15 - unimport: 6.3.0(oxc-parser@0.133.0) + unimport: 6.3.0(oxc-parser@0.133.0)(rolldown@1.1.2) unplugin: 3.0.0 unrouting: 0.1.7 untyped: 2.0.0 @@ -16255,11 +16436,12 @@ snapshots: magic-regexp: 0.10.0 oxc-parser: 0.128.0 - oxc-walker@1.0.0(oxc-parser@0.133.0): + oxc-walker@1.0.0(oxc-parser@0.133.0)(rolldown@1.1.2): dependencies: magic-regexp: 0.11.0 optionalDependencies: oxc-parser: 0.133.0 + rolldown: 1.1.2 p-limit@2.3.0: dependencies: @@ -16838,13 +17020,35 @@ snapshots: reusify@1.1.0: {} - rollup-plugin-visualizer@7.0.1(rollup@4.61.1): + rolldown@1.1.2: + dependencies: + '@oxc-project/types': 0.137.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.1.2 + '@rolldown/binding-darwin-arm64': 1.1.2 + '@rolldown/binding-darwin-x64': 1.1.2 + '@rolldown/binding-freebsd-x64': 1.1.2 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.2 + '@rolldown/binding-linux-arm64-gnu': 1.1.2 + '@rolldown/binding-linux-arm64-musl': 1.1.2 + '@rolldown/binding-linux-ppc64-gnu': 1.1.2 + '@rolldown/binding-linux-s390x-gnu': 1.1.2 + '@rolldown/binding-linux-x64-gnu': 1.1.2 + '@rolldown/binding-linux-x64-musl': 1.1.2 + '@rolldown/binding-openharmony-arm64': 1.1.2 + '@rolldown/binding-wasm32-wasi': 1.1.2 + '@rolldown/binding-win32-arm64-msvc': 1.1.2 + '@rolldown/binding-win32-x64-msvc': 1.1.2 + + rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.61.1): dependencies: open: 11.0.0 picomatch: 4.0.4 source-map: 0.7.6 yargs: 18.0.0 optionalDependencies: + rolldown: 1.1.2 rollup: 4.61.1 rollup@2.80.0: @@ -17609,7 +17813,7 @@ snapshots: unplugin: 2.3.11 unplugin-utils: 0.3.1 - unimport@6.3.0(oxc-parser@0.130.0): + unimport@6.3.0(oxc-parser@0.130.0)(rolldown@1.1.2): dependencies: acorn: 8.17.0 escape-string-regexp: 5.0.0 @@ -17627,8 +17831,9 @@ snapshots: unplugin-utils: 0.3.1 optionalDependencies: oxc-parser: 0.130.0 + rolldown: 1.1.2 - unimport@6.3.0(oxc-parser@0.133.0): + unimport@6.3.0(oxc-parser@0.133.0)(rolldown@1.1.2): dependencies: acorn: 8.17.0 escape-string-regexp: 5.0.0 @@ -17646,6 +17851,7 @@ snapshots: unplugin-utils: 0.3.1 optionalDependencies: oxc-parser: 0.133.0 + rolldown: 1.1.2 universalify@2.0.1: {} -- 2.43.7 From 568b04ca27a1687d5fc2ab0d5e4f9832e006fcd8 Mon Sep 17 00:00:00 2001 From: NHoarau Date: Mon, 22 Jun 2026 10:45:26 +0400 Subject: [PATCH 04/14] feat(web): implement basic first project CRUD UI --- apps/api/package.json | 1 + apps/api/src/database/drizzle.service.ts | 2 +- apps/api/src/main.ts | 1 + apps/api/test/__mocks__/schema-migrations.ts | 1 + apps/api/test/jest-e2e.json | 1 + apps/web/app/app.config.ts | 3 + apps/web/app/app.vue | 91 +++++++-------- apps/web/app/components/ProjectForm.vue | 54 +++++++++ apps/web/app/components/TemplateMenu.vue | 73 ++++++------ apps/web/app/composables/useProjectApi.ts | 10 +- apps/web/app/layouts/default.vue | 3 + apps/web/app/pages/projects/[id]/edit.vue | 62 ++++++++++ apps/web/app/pages/projects/index.vue | 117 +++++++++++++++++++ apps/web/app/pages/projects/new.vue | 34 ++++++ apps/web/eslint.config.mjs | 4 + packages/schema/package.json | 10 ++ packages/schema/rolldown.config.ts | 3 +- packages/schema/src/constants.ts | 8 ++ packages/schema/src/drizzle/projects.ts | 4 +- packages/schema/src/drizzle/tasks.ts | 7 +- packages/schema/src/index.ts | 20 ++-- packages/schema/src/migrations.ts | 6 + 22 files changed, 401 insertions(+), 114 deletions(-) create mode 100644 apps/api/test/__mocks__/schema-migrations.ts create mode 100644 apps/web/app/components/ProjectForm.vue create mode 100644 apps/web/app/layouts/default.vue create mode 100644 apps/web/app/pages/projects/[id]/edit.vue create mode 100644 apps/web/app/pages/projects/index.vue create mode 100644 apps/web/app/pages/projects/new.vue create mode 100644 packages/schema/src/constants.ts create mode 100644 packages/schema/src/migrations.ts diff --git a/apps/api/package.json b/apps/api/package.json index 5243bd8..7f5eb8d 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -71,6 +71,7 @@ "testEnvironment": "node", "moduleNameMapper": { "^@workspace/schema$": "/../test/__mocks__/schema.ts", + "^@workspace/schema/migrations$": "/../test/__mocks__/schema-migrations.ts", "^valibot$": "/../test/__mocks__/valibot.ts" } } diff --git a/apps/api/src/database/drizzle.service.ts b/apps/api/src/database/drizzle.service.ts index 480fc2f..7dd3501 100644 --- a/apps/api/src/database/drizzle.service.ts +++ b/apps/api/src/database/drizzle.service.ts @@ -1,5 +1,6 @@ import { Injectable, OnModuleInit, OnModuleDestroy } from "@nestjs/common"; import { Pool } from "pg"; +import { migrationsDir } from "@workspace/schema/migrations"; import { drizzle, NodePgDatabase, @@ -8,7 +9,6 @@ import { tasks, projectsRelations, tasksRelations, - migrationsDir, } from "@workspace/schema"; const DEFAULT_PG_PORT = 5432; diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 1962fc9..fc87c15 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -5,6 +5,7 @@ const DEFAULT_PORT = 3001; async function bootstrap() { const app = await NestFactory.create(AppModule); + app.enableCors(); await app.listen(process.env.PORT ?? DEFAULT_PORT); } // eslint-disable-next-line @typescript-eslint/no-floating-promises diff --git a/apps/api/test/__mocks__/schema-migrations.ts b/apps/api/test/__mocks__/schema-migrations.ts new file mode 100644 index 0000000..0a77362 --- /dev/null +++ b/apps/api/test/__mocks__/schema-migrations.ts @@ -0,0 +1 @@ +export const migrationsDir = "/mock/migrations"; diff --git a/apps/api/test/jest-e2e.json b/apps/api/test/jest-e2e.json index 8f816a6..6b6e73b 100644 --- a/apps/api/test/jest-e2e.json +++ b/apps/api/test/jest-e2e.json @@ -8,6 +8,7 @@ }, "moduleNameMapper": { "^@workspace/schema$": "/__mocks__/schema.ts", + "^@workspace/schema/migrations$": "/__mocks__/schema-migrations.ts", "^valibot$": "/__mocks__/valibot.ts" }, "transformIgnorePatterns": [ diff --git a/apps/web/app/app.config.ts b/apps/web/app/app.config.ts index 7420448..65f1645 100644 --- a/apps/web/app/app.config.ts +++ b/apps/web/app/app.config.ts @@ -4,5 +4,8 @@ export default defineAppConfig({ primary: "green", neutral: "slate", }, + main: { + base: "min-h-0 flex-1 overflow-y-auto", + }, }, }); diff --git a/apps/web/app/app.vue b/apps/web/app/app.vue index 534b6be..9548987 100644 --- a/apps/web/app/app.vue +++ b/apps/web/app/app.vue @@ -1,77 +1,64 @@ diff --git a/apps/web/app/components/ProjectForm.vue b/apps/web/app/components/ProjectForm.vue new file mode 100644 index 0000000..600ef7f --- /dev/null +++ b/apps/web/app/components/ProjectForm.vue @@ -0,0 +1,54 @@ + + + diff --git a/apps/web/app/components/TemplateMenu.vue b/apps/web/app/components/TemplateMenu.vue index 2443992..c8018d4 100644 --- a/apps/web/app/components/TemplateMenu.vue +++ b/apps/web/app/components/TemplateMenu.vue @@ -2,48 +2,55 @@ + size="xs"> + }" /> diff --git a/apps/web/app/composables/useProjectApi.ts b/apps/web/app/composables/useProjectApi.ts index 51256c9..c793fa1 100644 --- a/apps/web/app/composables/useProjectApi.ts +++ b/apps/web/app/composables/useProjectApi.ts @@ -1,4 +1,4 @@ -import type { Project } from "@workspace/schema"; +import type { Project, ProjectInsertDTO, ProjectUpdateDTO } from "@workspace/schema"; interface ApiResponse { data: T | null; @@ -47,7 +47,7 @@ export function useProjectApi() { loading.value = false; } - async function createProject(body: Record): Promise { + async function createProject(body: Partial): Promise { loading.value = true; error.value = null; @@ -66,7 +66,7 @@ export function useProjectApi() { return data; } - async function updateProject(id: string, body: Record): Promise { + async function updateProject(id: string, body: Partial): Promise { loading.value = true; error.value = null; @@ -76,7 +76,7 @@ export function useProjectApi() { }); if (data) { - const idx = projects.value.findIndex((p) => p.id === id); + const idx = projects.value.findIndex(p => p.id === id); if (idx !== NOT_FOUND) projects.value[idx] = data; } else { error.value = err; @@ -95,7 +95,7 @@ export function useProjectApi() { if (err) { error.value = err; } else { - projects.value = projects.value.filter((p) => p.id !== id); + projects.value = projects.value.filter(p => p.id !== id); } loading.value = false; diff --git a/apps/web/app/layouts/default.vue b/apps/web/app/layouts/default.vue new file mode 100644 index 0000000..ba4672f --- /dev/null +++ b/apps/web/app/layouts/default.vue @@ -0,0 +1,3 @@ + diff --git a/apps/web/app/pages/projects/[id]/edit.vue b/apps/web/app/pages/projects/[id]/edit.vue new file mode 100644 index 0000000..3f09dd1 --- /dev/null +++ b/apps/web/app/pages/projects/[id]/edit.vue @@ -0,0 +1,62 @@ + + + diff --git a/apps/web/app/pages/projects/index.vue b/apps/web/app/pages/projects/index.vue new file mode 100644 index 0000000..d03620b --- /dev/null +++ b/apps/web/app/pages/projects/index.vue @@ -0,0 +1,117 @@ + + + diff --git a/apps/web/app/pages/projects/new.vue b/apps/web/app/pages/projects/new.vue new file mode 100644 index 0000000..b749d06 --- /dev/null +++ b/apps/web/app/pages/projects/new.vue @@ -0,0 +1,34 @@ + + + diff --git a/apps/web/eslint.config.mjs b/apps/web/eslint.config.mjs index f6ae36e..d58f8e5 100644 --- a/apps/web/eslint.config.mjs +++ b/apps/web/eslint.config.mjs @@ -6,5 +6,9 @@ export default withNuxt({ rules: { ...baseRules, "@stylistic/member-delimiter-style": "off", + "vue/max-attributes-per-line": "off", + "vue/singleline-html-element-content-newline": "off", + "vue/html-closing-bracket-newline": "off", + "vue/no-multiple-template-root": "off", }, },) diff --git a/packages/schema/package.json b/packages/schema/package.json index 37364ce..9643db2 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -10,6 +10,16 @@ "types": "./dist/index.d.ts", "import": "./dist/index.js", "default": "./dist/index.js" + }, + "./constants": { + "types": "./src/constants.ts", + "import": "./src/constants.ts", + "default": "./src/constants.ts" + }, + "./migrations": { + "types": "./dist/migrations.d.ts", + "import": "./dist/migrations.js", + "default": "./dist/migrations.js" } }, "scripts": { diff --git a/packages/schema/rolldown.config.ts b/packages/schema/rolldown.config.ts index 649f3e2..3807cde 100644 --- a/packages/schema/rolldown.config.ts +++ b/packages/schema/rolldown.config.ts @@ -1,11 +1,10 @@ import { defineConfig } from "rolldown"; export default defineConfig({ - input: "src/index.ts", + input: ["src/index.ts", "src/migrations.ts"], output: { format: "esm", dir: "dist", - entryFileNames: "index.js", }, external: (id: string) => id === "drizzle-orm" || diff --git a/packages/schema/src/constants.ts b/packages/schema/src/constants.ts new file mode 100644 index 0000000..b531b3f --- /dev/null +++ b/packages/schema/src/constants.ts @@ -0,0 +1,8 @@ +export const PROJECT_STATUSES = ["active", "archived", "completed"] as const; +export type ProjectStatus = (typeof PROJECT_STATUSES)[number]; + +export const TASK_STATUSES = ["todo", "in_progress", "in_review", "done"] as const; +export type TaskStatus = (typeof TASK_STATUSES)[number]; + +export const PRIORITIES = ["low", "medium", "high", "urgent"] as const; +export type Priority = (typeof PRIORITIES)[number]; diff --git a/packages/schema/src/drizzle/projects.ts b/packages/schema/src/drizzle/projects.ts index 89173d5..2ddc9dc 100644 --- a/packages/schema/src/drizzle/projects.ts +++ b/packages/schema/src/drizzle/projects.ts @@ -2,9 +2,7 @@ import { pgTable, uuid, text, timestamp, check } from "drizzle-orm/pg-core"; import { sql } from "drizzle-orm"; import { createInsertSchema, createSelectSchema, createUpdateSchema } from "drizzle-valibot"; import { InferOutput, picklist, pipe } from "valibot"; - -export const PROJECT_STATUSES = ["active", "archived", "completed"] as const; -export type ProjectStatus = (typeof PROJECT_STATUSES)[number]; +import { PROJECT_STATUSES } from "../constants"; const projectStatusValues = PROJECT_STATUSES.map((s) => `'${s}'`).join(", "); const createProjectStatusSchema = (schema: any) => pipe(schema, picklist([...PROJECT_STATUSES])) as any; diff --git a/packages/schema/src/drizzle/tasks.ts b/packages/schema/src/drizzle/tasks.ts index 61c7455..2fcff6f 100644 --- a/packages/schema/src/drizzle/tasks.ts +++ b/packages/schema/src/drizzle/tasks.ts @@ -3,12 +3,7 @@ import { sql } from "drizzle-orm"; import { createInsertSchema, createSelectSchema, createUpdateSchema } from "drizzle-valibot"; import { InferOutput, picklist, pipe } from "valibot"; import { projects } from "./projects"; - -export const TASK_STATUSES = ["todo", "in_progress", "in_review", "done"] as const; -export type TaskStatus = (typeof TASK_STATUSES)[number]; - -export const PRIORITIES = ["low", "medium", "high", "urgent"] as const; -export type Priority = (typeof PRIORITIES)[number]; +import { TASK_STATUSES, PRIORITIES } from "../constants"; const taskStatusValues = TASK_STATUSES.map((s) => `'${s}'`).join(", "); const priorityValues = PRIORITIES.map((p) => `'${p}'`).join(", "); diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index 2ad3e67..75e3321 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -1,34 +1,30 @@ -import { fileURLToPath } from "url"; -import { dirname, resolve } from "path"; - -const __dirname = dirname(fileURLToPath(import.meta.url)); - -export const migrationsDir = resolve(__dirname, "../drizzle"); +export { + PROJECT_STATUSES, + type ProjectStatus, + TASK_STATUSES, + type TaskStatus, + PRIORITIES, + type Priority, +} from "./constants"; export { eq } from "drizzle-orm"; export { drizzle, NodePgDatabase } from "drizzle-orm/node-postgres"; export { migrate } from "drizzle-orm/node-postgres/migrator"; export { - PROJECT_STATUSES, projects, projectSelect, projectInsert, projectUpdate, type Project, - type ProjectStatus, type ProjectInsertDTO, type ProjectUpdateDTO, } from "./drizzle/projects"; export { projectsRelations, tasksRelations } from "./drizzle/relations"; export { - TASK_STATUSES, - PRIORITIES, tasks, taskSelect, taskInsert, taskUpdate, type Task, - type TaskStatus, - type Priority, } from "./drizzle/tasks"; diff --git a/packages/schema/src/migrations.ts b/packages/schema/src/migrations.ts new file mode 100644 index 0000000..1d1c044 --- /dev/null +++ b/packages/schema/src/migrations.ts @@ -0,0 +1,6 @@ +import { fileURLToPath } from "url"; +import { dirname, resolve } from "path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export const migrationsDir = resolve(__dirname, "../drizzle"); -- 2.43.7 From d826ee6a50c5e8147c05e2896e7b43e696c9c530 Mon Sep 17 00:00:00 2001 From: NHoarau Date: Mon, 22 Jun 2026 11:00:54 +0400 Subject: [PATCH 05/14] feat(ui): add icons to buttons in ProjectForm and projects index for better UX --- apps/web/app/components/ProjectForm.vue | 4 ++-- apps/web/app/pages/projects/index.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web/app/components/ProjectForm.vue b/apps/web/app/components/ProjectForm.vue index 600ef7f..2323e95 100644 --- a/apps/web/app/components/ProjectForm.vue +++ b/apps/web/app/components/ProjectForm.vue @@ -47,8 +47,8 @@ function onSubmit() {
- - + +
diff --git a/apps/web/app/pages/projects/index.vue b/apps/web/app/pages/projects/index.vue index d03620b..c594188 100644 --- a/apps/web/app/pages/projects/index.vue +++ b/apps/web/app/pages/projects/index.vue @@ -107,8 +107,8 @@ const columns: TableColumn[] = [ -- 2.43.7 From abdec720e1fb8a714dee0a7714e9a391e43ea097 Mon Sep 17 00:00:00 2001 From: NHoarau Date: Mon, 22 Jun 2026 12:57:24 +0400 Subject: [PATCH 06/14] fixed hydration mismatch --- apps/web/app/app.vue | 36 +++------------------------ apps/web/app/components/AppFooter.vue | 19 ++++++++++++++ apps/web/app/components/AppHeader.vue | 15 +++++++++++ apps/web/app/layouts/default.vue | 3 --- apps/web/app/pages/projects/index.vue | 2 +- apps/web/nuxt.config.ts | 4 --- 6 files changed, 38 insertions(+), 41 deletions(-) create mode 100644 apps/web/app/components/AppFooter.vue create mode 100644 apps/web/app/components/AppHeader.vue delete mode 100644 apps/web/app/layouts/default.vue diff --git a/apps/web/app/app.vue b/apps/web/app/app.vue index 9548987..003daaa 100644 --- a/apps/web/app/app.vue +++ b/apps/web/app/app.vue @@ -22,43 +22,13 @@ useSeoMeta({ diff --git a/apps/web/app/components/AppFooter.vue b/apps/web/app/components/AppFooter.vue new file mode 100644 index 0000000..5ecaeff --- /dev/null +++ b/apps/web/app/components/AppFooter.vue @@ -0,0 +1,19 @@ + diff --git a/apps/web/app/components/AppHeader.vue b/apps/web/app/components/AppHeader.vue new file mode 100644 index 0000000..a6ae194 --- /dev/null +++ b/apps/web/app/components/AppHeader.vue @@ -0,0 +1,15 @@ + diff --git a/apps/web/app/layouts/default.vue b/apps/web/app/layouts/default.vue deleted file mode 100644 index ba4672f..0000000 --- a/apps/web/app/layouts/default.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/apps/web/app/pages/projects/index.vue b/apps/web/app/pages/projects/index.vue index c594188..a6edfd6 100644 --- a/apps/web/app/pages/projects/index.vue +++ b/apps/web/app/pages/projects/index.vue @@ -36,7 +36,7 @@ const columns: TableColumn[] = [ cell: ({ row }) => row.getValue("description") ?? "—", }, { accessorKey: "createdAt", header: "Created" }, - { id: "actions", header: "" }, + { id: "actions", header: "Actions" }, ]; diff --git a/apps/web/nuxt.config.ts b/apps/web/nuxt.config.ts index 7a15056..03f6666 100644 --- a/apps/web/nuxt.config.ts +++ b/apps/web/nuxt.config.ts @@ -14,10 +14,6 @@ export default defineNuxtConfig({ }, }, - routeRules: { - "/": { prerender: true }, - }, - compatibilityDate: "2025-01-15", eslint: { -- 2.43.7 From a10773f76ac0580f101be693b213a6062cebf4a2 Mon Sep 17 00:00:00 2001 From: NHoarau Date: Mon, 22 Jun 2026 14:10:13 +0400 Subject: [PATCH 07/14] feat(i18n): implement internationalization support with English and French locales --- apps/web/app/app.vue | 16 ++---- apps/web/app/components/AppFooter.vue | 2 +- apps/web/app/components/AppHeader.vue | 20 ++++++- apps/web/app/components/ProjectForm.vue | 16 +++--- apps/web/app/pages/index.vue | 48 ++++++++-------- apps/web/app/pages/projects/[id]/edit.vue | 27 ++++++--- apps/web/app/pages/projects/index.vue | 55 ++++++++++++++----- apps/web/app/pages/projects/new.vue | 6 +- apps/web/i18n/i18n.config.ts | 7 +++ apps/web/i18n/locales/en.json | 67 +++++++++++++++++++++++ apps/web/i18n/locales/fr.json | 67 +++++++++++++++++++++++ apps/web/nuxt.config.ts | 18 +++++- 12 files changed, 284 insertions(+), 65 deletions(-) create mode 100644 apps/web/i18n/i18n.config.ts create mode 100644 apps/web/i18n/locales/en.json create mode 100644 apps/web/i18n/locales/fr.json diff --git a/apps/web/app/app.vue b/apps/web/app/app.vue index 003daaa..e96e575 100644 --- a/apps/web/app/app.vue +++ b/apps/web/app/app.vue @@ -1,20 +1,16 @@ diff --git a/apps/web/app/components/AppFooter.vue b/apps/web/app/components/AppFooter.vue index 5ecaeff..3a4693e 100644 --- a/apps/web/app/components/AppFooter.vue +++ b/apps/web/app/components/AppFooter.vue @@ -3,7 +3,7 @@