From ca0f5eac48e913995f0548c99e359a0fd03c562a Mon Sep 17 00:00:00 2001 From: Theo Gravity Date: Sat, 21 Sep 2024 22:34:12 -0700 Subject: [PATCH] feat: upgrade to fastify v5, and more --- .changeset/config.json | 2 +- .github/workflows/lint.yml | 37 + .github/workflows/release-snapshot.yml | 52 + .github/workflows/release.yml | 58 + .github/workflows/test.yml | 42 + .gitignore | 1 + CHANGELOG.md | 10 + README.md | 27 +- apps/backend/.hash-runnerrc.json | 5 + apps/backend/package.json | 46 +- apps/backend/src/api-lib/ajv-plugins.ts | 3 - apps/backend/src/api-lib/error-handler.ts | 28 +- apps/backend/src/api-lib/keywords/README.md | 6 - .../src/api-lib/keywords/sanitize.keyword.ts | 17 - .../src/api-lib/types/user-provider.type.ts | 1 + apps/backend/src/api-lib/types/user.type.ts | 1 + .../__tests__/create-email-user.route.test.ts | 4 +- .../src/api/users/create-email-user.route.ts | 3 - apps/backend/src/constants.ts | 1 + apps/backend/src/db/repositories/README.md | 2 + .../repositories/user-providers.repository.ts | 4 + .../src/db/repositories/users.repository.ts | 3 + apps/backend/src/server.ts | 2 +- .../plugins/enable-test-logger.plugin.ts | 2 + apps/backend/src/test-utils/plugins/index.ts | 2 +- apps/backend/src/test-utils/test-server.ts | 7 +- apps/backend/src/utils/logger.ts | 41 +- package.json | 25 +- packages/backend-client/.hash-runnerrc.json | 5 + packages/backend-client/openapi.yml | 2 + packages/backend-client/package.json | 4 +- packages/backend-client/src/schemas.gen.ts | 2 + packages/backend-errors/.hash-runnerrc.json | 5 + packages/backend-errors/package.json | 6 +- packages/backend-errors/src/lib.ts | 170 ++- pnpm-lock.yaml | 1104 +++++++++-------- turbo.json | 26 +- 37 files changed, 1128 insertions(+), 628 deletions(-) create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/release-snapshot.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test.yml create mode 100644 apps/backend/.hash-runnerrc.json delete mode 100644 apps/backend/src/api-lib/keywords/README.md delete mode 100644 apps/backend/src/api-lib/keywords/sanitize.keyword.ts create mode 100644 packages/backend-client/.hash-runnerrc.json create mode 100644 packages/backend-errors/.hash-runnerrc.json diff --git a/.changeset/config.json b/.changeset/config.json index fab67b6..972ed9b 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,6 +1,6 @@ { "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", - "changelog": ["@changesets/changelog-github", { "repo": "theogravity/boilerplate-typescript-monorepo" }], + "changelog": ["@changesets/changelog-github", { "repo": "theogravity/fastify-starter-turbo-monorepo" }], "access": "public", "baseBranch": "main" } diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..ec8b775 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,37 @@ +name: Lint + +on: + pull_request: + +jobs: + lint: + name: Linting + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Use pnpm + uses: pnpm/action-setup@v3 + with: + version: 9.11.0 + + - name: Install Dependencies + run: pnpm install --frozen-lockfile --prefer-offline + + - name: Build workspace packages + run: pnpm build + + - name: Run package checking + run: pnpm run lint:packages + + - name: Run type checking + run: pnpm run typecheck + + - name: Run linting + run: pnpm run lint diff --git a/.github/workflows/release-snapshot.yml b/.github/workflows/release-snapshot.yml new file mode 100644 index 0000000..9739555 --- /dev/null +++ b/.github/workflows/release-snapshot.yml @@ -0,0 +1,52 @@ +name: Snapshot Release + +on: + workflow_dispatch: + +env: + PNPM_CACHE_FOLDER: .pnpm-store + +jobs: + snapshot: + name: Snapshot Release + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Use pnpm + uses: pnpm/action-setup@v3 + with: + version: 9.11.0 + + - name: setup pnpm config + run: pnpm config set store-dir $PNPM_CACHE_FOLDER + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Build workspace packages + run: pnpm build + + - name: Run package checking + run: pnpm run lint:packages + + - name: Run type checking + run: pnpm run typecheck + + - name: Run linting + run: pnpm run lint + + - name: Create Snapshot Release + run: | + pnpm run version-packages --snapshot "${{ github.ref_name }}" + echo '---' + echo 'Detected Changes:' + git diff + echo '---' + pnpm run release --tag "${{ github.ref_name }}" --no-git-tag diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..f4cbbb6 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,58 @@ +name: Release + +on: + push: + branches: + - main + +env: + PNPM_CACHE_FOLDER: .pnpm-store + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + release: + name: Releasing + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Use pnpm + uses: pnpm/action-setup@v3 + with: + version: 9.11.0 + + - name: setup pnpm config + run: pnpm config set store-dir $PNPM_CACHE_FOLDER + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Build workspace packages + run: pnpm build + + - name: Run package checking + run: pnpm run lint:packages + + - name: Run type checking + run: pnpm run typecheck + + - name: Run linting + run: pnpm run lint + + - name: Create Release Pull Request / Publish Packages + uses: changesets/action@v1 + with: + publish: pnpm run release + version: pnpm run version-packages + commit: 'chore: release package(s)' + title: 'chore: release package(s)' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..08f1b83 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,42 @@ +name: Test + +on: + pull_request: + +jobs: + test: + name: Testing + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Use pnpm + uses: pnpm/action-setup@v3 + with: + version: 9.11.0 + + - name: Install Dependencies + run: pnpm install --frozen-lockfile --prefer-offline + + - name: Build workspace packages + run: pnpm build + + - name: Branch Information + run: | + echo "Git Branch: $(git branch)" + echo "Git Log: $(git log --oneline)" + echo "HEAD SHA: $(git rev-parse HEAD)" + echo "HEAD^1 SHA: $(git rev-parse HEAD^1)" + echo "Git Diff: $(git diff HEAD^1)" + + - name: Run Package(s) Tests + run: | + pnpm run test diff --git a/.gitignore b/.gitignore index 610ae73..6cd02d0 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,4 @@ dist .pnp.* .idea/ .turbo/ +.hashes.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 67e6db0..11df499 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # boilerplate-typescript-monorepo +## Sept-21-2024 + +- Upgrade fastify to v5, all packages to latest versions +- Better error handling for the backend +- Fixed bugs around logs not showing in certain cases during tests +- Add package publishing support +- Add dev build caching for faster builds during dev +- Removed AJV sanitize plugin. In real-world usage, you wouldn't want to sanitize the input to your API immediately, but later on. + + ## Sept-07-2024 - Added better formatting for logs diff --git a/README.md b/README.md index 6fb8ca0..fc67166 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ # Fastify Turbo Monorepo Starter -This is a starter project for building an API server using Typescript, Fastify and Kysely with Postgres. +This is a starter project for building an API server using Typescript, Fastify v5 and Kysely with Postgres. ## Features +- Fastify v5 with Typescript. - It is setup as a monorepo using [`turbo`](https://turbo.build/) and [`pnpm`](https://pnpm.io/). - Outputs OpenAPI schema for the API and has a web UI for viewing it. - A sample REST test is included using Vitest. @@ -20,6 +21,7 @@ This is a starter project for building an API server using Typescript, Fastify a - [`commitlint`](https://commitlint.js.org/) for commit message linting - [`turbo`](https://turbo.build/) for monorepo management - [`fastify`](https://www.fastify.io/) for the API server framework +- [`hash-runner`](https://github.com/theogravity/hash-runner) for caching builds - [`kysely`](https://kysely.dev/) for the database query builder - [`postgres`](https://www.postgresql.org/) + pgAdmin for the database - [`testcontainers`](https://www.testcontainers.org/) for testing with a sandboxed postgres instance @@ -45,6 +47,14 @@ Perform database migrations: `pnpm db:migrate:lastest` +In Github settings (to publish packages and changelogs): +- Edit `.changeset/config.json` to your repository +- `Code and Automation > Actions > Workflow permissions` + * `Read and write permissions` + * `Allow Github Actions to create and approve pull requests` +- `Secrets and variables > Actions` + * `Repository Secrets > Actions > create NPM_TOKEN > your npm publish token` + ## Development `turbo watch dev` @@ -83,15 +93,16 @@ Generators for the following: `pnpm syncpack:update` -## Add a new CHANGELOG.md entry + package versioning - -Create a new changeset entry: - -`pnpm changeset` +## Development workflow / Add a new CHANGELOG.md entry + package versioning -Update all package versions and generate changelogs: +- Create a branch and make changes. +- Create a new changeset entry: `pnpm changeset` +- Commit your changes and create a pull request. +- Merge the pull request +- A new PR will be created with the changeset entry/ies. +- When the PR is merged, the package versions will be bumped and published and the changelog updated. -`pnpm changeset version` +**note: To publish a package, `private: false` must be set in the package.json** ## Troubleshooting diff --git a/apps/backend/.hash-runnerrc.json b/apps/backend/.hash-runnerrc.json new file mode 100644 index 0000000..d9902f7 --- /dev/null +++ b/apps/backend/.hash-runnerrc.json @@ -0,0 +1,5 @@ +{ + "include": ["src/**", "package.json"], + "execOnChange": "pnpm run build", + "hashFile": ".hashes.json" +} \ No newline at end of file diff --git a/apps/backend/package.json b/apps/backend/package.json index 069e26e..c912d96 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -9,38 +9,39 @@ "db:migrate:latest": "kysely migrate latest", "db:migrate:undo": "kysely migrate down", "generate": "NODE_OPTIONS=\"--import=./loader.js\" IS_GENERATING_CLIENT=true fastify generate-swagger --yaml=true dist/api/index.js > ../../packages/backend-client/openapi.yml | tee ../../packages/backend-client/openapi.yml", + "build:dev": "hash-runner", "build": "rm -rf dist && tsc -p tsconfig.json && pnpm run generate", "clean": "rm -rf .turbo node_modules dist", "dev": "tsx --inspect=9230 ./src/index.ts", "lint": "biome check --write --unsafe src && biome format src --write && biome lint src --fix", "prod": "NODE_OPTIONS=\"--import=./loader.js\" node ./dist/index.js", "typecheck": "tsc --noEmit", - "test": "vitest --watch", - "test:ci": "vitest" + "test": "NODE_OPTIONS=\"--no-deprecation\" IS_TEST=true TESTCONTAINERS_HOST_OVERRIDE=127.0.0.1 vitest --watch", + "test:debug": "NODE_OPTIONS=\"--no-deprecation\" IS_TEST=true TESTCONTAINERS_HOST_OVERRIDE=127.0.0.1 vitest --inspect-brk --pool forks --poolOptions.forks.singleFork --no-file-parallelism", + "test:ci": "NODE_OPTIONS=\"--no-deprecation\" IS_TEST=true TESTCONTAINERS_HOST_OVERRIDE=127.0.0.1 vitest --watch=false" }, "dependencies": { - "@dotenvx/dotenvx": "1.14.0", - "@fastify/cors": "9.0.1", - "@fastify/jwt": "8.0.1", - "@fastify/swagger": "8.15.0", - "@fastify/swagger-ui": "4.1.0", - "@fastify/type-provider-typebox": "4.1.0", + "@dotenvx/dotenvx": "1.14.1", + "@fastify/cors": "10.0.0", + "@fastify/jwt": "9.0.0", + "@fastify/swagger": "9.0.0", + "@fastify/swagger-ui": "5.0.1", + "@fastify/type-provider-typebox": "5.0.0", "@internal/backend-errors": "workspace:*", - "@sinclair/typebox": "0.33.9", + "@sinclair/typebox": "0.33.12", "ajv-formats": "3.0.1", - "ajv-sanitizer": "1.2.1", "asyncforge": "0.5.0", "bcrypt": "5.1.1", "chalk": "5.3.0", "dotenv": "16.4.5", "env-var": "7.5.0", - "fastify": "4.28.1", - "fastify-cli": "6.3.0", - "fastify-plugin": "4.5.1", + "fastify": "5.0.0", + "fastify-cli": "7.0.0", + "fastify-plugin": "5.0.1", "kysely": "0.27.4", "loglayer": "4.7.0", "nanoid": "5.0.7", - "pg": "8.12.0", + "pg": "8.13.0", "pino": "9.4.0", "pino-pretty": "11.2.2", "serialize-error": "11.0.3", @@ -48,16 +49,17 @@ "uuid": "10.0.0" }, "devDependencies": { - "@faker-js/faker": "9.0.0", + "@faker-js/faker": "9.0.1", "@internal/tsconfig": "workspace:*", - "@testcontainers/postgresql": "10.13.0", - "@turbo/gen": "2.1.1", - "@types/node": "22.5.4", - "@types/pg": "8.11.8", + "@testcontainers/postgresql": "10.13.1", + "@turbo/gen": "2.1.2", + "@types/node": "22.5.5", + "@types/pg": "8.11.10", + "hash-runner": "2.0.1", "kysely-ctl": "0.9.0", "ts-node": "10.9.2", - "tsx": "4.19.0", - "typescript": "5.5.4", - "vitest": "2.0.5" + "tsx": "4.19.1", + "typescript": "5.6.2", + "vitest": "2.1.1" } } diff --git a/apps/backend/src/api-lib/ajv-plugins.ts b/apps/backend/src/api-lib/ajv-plugins.ts index 0333ff1..b1dbcbb 100644 --- a/apps/backend/src/api-lib/ajv-plugins.ts +++ b/apps/backend/src/api-lib/ajv-plugins.ts @@ -1,9 +1,6 @@ import ajvFormats from "ajv-formats"; -import ajvSanitizer from "ajv-sanitizer"; export const ajvPlugins = [ - // https://www.npmjs.com/package/ajv-sanitizer - ajvSanitizer, // https://ajv.js.org/packages/ajv-formats.html ajvFormats, ]; diff --git a/apps/backend/src/api-lib/error-handler.ts b/apps/backend/src/api-lib/error-handler.ts index e082cec..d173005 100644 --- a/apps/backend/src/api-lib/error-handler.ts +++ b/apps/backend/src/api-lib/error-handler.ts @@ -1,24 +1,44 @@ import { ApiError, BackendErrorCodes, createApiError } from "@internal/backend-errors"; +import { IS_PROD } from "../constants"; export function errorHandler(error: any, request, reply) { if (error instanceof ApiError) { error.reqId = request.id; - request.log.errorOnly(error); - reply.status(error.statusCode).send(error.toJSON()); + request.log.errorOnly(error, { + logLevel: error.logLevel, + }); + + if (error.isInternalError) { + const e = createApiError({ + code: BackendErrorCodes.INTERNAL_SERVER_ERROR, + validation: error.validation, + validationContext: error.validationContext, + causedBy: error, + }); + + e.errId = error.errId; + e.reqId = request.id; + + reply.status(e.statusCode).send(IS_PROD ? e.toJSONSafe() : e.toJSON()); + } else { + reply.status(error.statusCode).send(IS_PROD ? error.toJSONSafe() : error.toJSON()); + } } else if (error?.code === "FST_ERR_VALIDATION") { const e = createApiError({ code: BackendErrorCodes.INPUT_VALIDATION_ERROR, validation: error.validation, validationContext: error.validationContext, + causedBy: error, }); e.reqId = request.id; - reply.status(e.statusCode).send(e.toJSON()); + reply.status(500).send(IS_PROD ? e.toJSONSafe() : e.toJSON()); } else { const e = createApiError({ code: BackendErrorCodes.INTERNAL_SERVER_ERROR, message: "An internal server error occurred.", + causedBy: error, }); e.reqId = request.id; @@ -30,6 +50,6 @@ export function errorHandler(error: any, request, reply) { }) .errorOnly(error); - reply.status(500).send(e.toJSON()); + reply.status(500).send(IS_PROD ? e.toJSONSafe() : e.toJSON()); } } diff --git a/apps/backend/src/api-lib/keywords/README.md b/apps/backend/src/api-lib/keywords/README.md deleted file mode 100644 index 62d72ea..0000000 --- a/apps/backend/src/api-lib/keywords/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# AJV keywords - -This directory contains custom AJV keywords -that are used to validate / re-format the request body of -the API endpoints. - diff --git a/apps/backend/src/api-lib/keywords/sanitize.keyword.ts b/apps/backend/src/api-lib/keywords/sanitize.keyword.ts deleted file mode 100644 index eb58247..0000000 --- a/apps/backend/src/api-lib/keywords/sanitize.keyword.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { IS_GENERATING_CLIENT } from "../../constants"; - -/** - * Sanitizes the input using ajv-sanitizer - * @see https://www.npmjs.com/package/ajv-sanitizer - */ -export function sanitizeKeyword() { - // the sanitize keyword doesn't exist in OpenAPI, - // so we exclude it during client generation - if (IS_GENERATING_CLIENT) { - return {}; - } - - return { - sanitize: "text", - }; -} diff --git a/apps/backend/src/api-lib/types/user-provider.type.ts b/apps/backend/src/api-lib/types/user-provider.type.ts index 7fa74c0..8bbe684 100644 --- a/apps/backend/src/api-lib/types/user-provider.type.ts +++ b/apps/backend/src/api-lib/types/user-provider.type.ts @@ -5,6 +5,7 @@ export const UserProviderSchema = Type.Object( { userId: Type.String({ description: "ID of the user", + format: "uuid", }), providerType: UserProviderTypeSchema, accountId: Type.String({ diff --git a/apps/backend/src/api-lib/types/user.type.ts b/apps/backend/src/api-lib/types/user.type.ts index bddbb44..ec84b4c 100644 --- a/apps/backend/src/api-lib/types/user.type.ts +++ b/apps/backend/src/api-lib/types/user.type.ts @@ -4,6 +4,7 @@ export const UserSchema = Type.Object( { id: Type.String({ description: "ID of the user", + format: "uuid", }), givenName: Type.String({ description: "Given name of the user", diff --git a/apps/backend/src/api/users/__tests__/create-email-user.route.test.ts b/apps/backend/src/api/users/__tests__/create-email-user.route.test.ts index 0986200..b8a3a9d 100644 --- a/apps/backend/src/api/users/__tests__/create-email-user.route.test.ts +++ b/apps/backend/src/api/users/__tests__/create-email-user.route.test.ts @@ -1,15 +1,15 @@ import { faker } from "@faker-js/faker"; import { describe, expect, it } from "vitest"; +import { testFramework } from "../../../test-utils/test-framework"; import { testFastify } from "../../../test-utils/test-server"; import type { CreateEMailUserResponse } from "../create-email-user.route"; -import {testFramework} from "../../../test-utils/test-framework"; describe("Create e-mail user API", () => { it("should create an e-mail user", async () => { const { headers } = await testFramework.generateTestFacets({ // Enables server-side logging for this test withLogging: true, - }) + }); // This inject is a custom version of the Fastify inject function // that logs the response if it's not what we expected diff --git a/apps/backend/src/api/users/create-email-user.route.ts b/apps/backend/src/api/users/create-email-user.route.ts index 44e8a00..a1347e6 100644 --- a/apps/backend/src/api/users/create-email-user.route.ts +++ b/apps/backend/src/api/users/create-email-user.route.ts @@ -1,6 +1,5 @@ import { type Static, Type } from "@sinclair/typebox"; import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify"; -import { sanitizeKeyword } from "../../api-lib/keywords/sanitize.keyword"; import { UserProviderSchema } from "../../api-lib/types/user-provider.type"; import { UserSchema } from "../../api-lib/types/user.type"; import { UserProviderType } from "../../db/types/user-providers.db-types"; @@ -10,12 +9,10 @@ const CreateEMailUserRequestSchema = Type.Object( givenName: Type.String({ minLength: 1, maxLength: 50, - ...sanitizeKeyword(), }), familyName: Type.String({ minLength: 1, maxLength: 100, - ...sanitizeKeyword(), }), email: Type.String({ minLength: 3, diff --git a/apps/backend/src/constants.ts b/apps/backend/src/constants.ts index 656914a..9c08b57 100644 --- a/apps/backend/src/constants.ts +++ b/apps/backend/src/constants.ts @@ -17,3 +17,4 @@ export const DB_PASS = env.get("DB_PASS").required().asString(); export const IS_GENERATING_CLIENT = env.get("IS_GENERATING_CLIENT").default("false").asBoolStrict(); export const IS_PROD = process.env.NODE_ENV === "production"; export const IS_TEST = process.env.NODE_ENV === "test"; +export const BACKEND_LOG_LEVEL = env.get("BACKEND_LOG_LEVEL").default("debug").asString(); diff --git a/apps/backend/src/db/repositories/README.md b/apps/backend/src/db/repositories/README.md index ee2ff2c..41f6d63 100644 --- a/apps/backend/src/db/repositories/README.md +++ b/apps/backend/src/db/repositories/README.md @@ -4,3 +4,5 @@ This directory contains the database repositories. Each repository is responsibl Services would use and combine these repositories to perform operations on the database. +You should not use repositories in a controller. Instead, use services to implement the behavior you need using the +repositories. diff --git a/apps/backend/src/db/repositories/user-providers.repository.ts b/apps/backend/src/db/repositories/user-providers.repository.ts index f4c0091..ab36b68 100644 --- a/apps/backend/src/db/repositories/user-providers.repository.ts +++ b/apps/backend/src/db/repositories/user-providers.repository.ts @@ -3,6 +3,10 @@ import type { Database } from "../types"; import type { NewUserProvider, UserProviderDb } from "../types/user-providers.db-types"; import { BaseRepository } from "./base.repository"; +/** + * Stores user authentication provider information. Allows usage of multiple + * authentication providers per user. + */ export class UserProvidersRepository extends BaseRepository { async createUserProvider({ db, diff --git a/apps/backend/src/db/repositories/users.repository.ts b/apps/backend/src/db/repositories/users.repository.ts index 1496f94..464efa1 100644 --- a/apps/backend/src/db/repositories/users.repository.ts +++ b/apps/backend/src/db/repositories/users.repository.ts @@ -3,6 +3,9 @@ import type { Database } from "../types"; import type { NewUser, UserDb, UserUpdate } from "../types/users.db-types"; import { BaseRepository } from "./base.repository"; +/** + * Stores profile information for users. + */ export class UsersRepository extends BaseRepository { async createUser({ db, diff --git a/apps/backend/src/server.ts b/apps/backend/src/server.ts index 1088247..d329a8f 100644 --- a/apps/backend/src/server.ts +++ b/apps/backend/src/server.ts @@ -19,7 +19,7 @@ export async function startServer({ const fastify = Fastify({ // @ts-ignore - logger, + loggerInstance: logger, disableRequestLogging: true, ajv: { plugins: ajvPlugins, diff --git a/apps/backend/src/test-utils/plugins/enable-test-logger.plugin.ts b/apps/backend/src/test-utils/plugins/enable-test-logger.plugin.ts index 02153fc..6754610 100644 --- a/apps/backend/src/test-utils/plugins/enable-test-logger.plugin.ts +++ b/apps/backend/src/test-utils/plugins/enable-test-logger.plugin.ts @@ -6,7 +6,9 @@ async function plugin(fastify: FastifyInstance, _opts) { // Because we're running a server in a test environment, if we want to enable logging // we need to set a header to enable it. if (request.headers["test-logging-enabled"] === "true") { + request.ctx.log.enableLogging(); request.log.enableLogging(); + fastify.log.enableLogging(); } done(); }); diff --git a/apps/backend/src/test-utils/plugins/index.ts b/apps/backend/src/test-utils/plugins/index.ts index 80ac867..0f7b4da 100644 --- a/apps/backend/src/test-utils/plugins/index.ts +++ b/apps/backend/src/test-utils/plugins/index.ts @@ -4,7 +4,7 @@ import { enableTestLoggerPlugin } from "./enable-test-logger.plugin"; import { testHeadersPlugin } from "./test-headers.plugin"; export async function testPlugins(fastify: FastifyInstance, _opts) { - fastify.register(enableTestLoggerPlugin); fastify.register(contextPlugin); + fastify.register(enableTestLoggerPlugin); fastify.register(testHeadersPlugin); } diff --git a/apps/backend/src/test-utils/test-server.ts b/apps/backend/src/test-utils/test-server.ts index 8c243cd..1cf20e0 100644 --- a/apps/backend/src/test-utils/test-server.ts +++ b/apps/backend/src/test-utils/test-server.ts @@ -35,16 +35,13 @@ export function serverTestSetup(routes: any) { plugins: ajvPlugins, }, // @ts-ignore - logger, + loggerInstance: logger, genReqId: () => nanoid(12), }) .withTypeProvider() .setValidatorCompiler(TypeBoxValidatorCompiler); - fastify.setErrorHandler((error, _request, reply) => { - reply.send(error); - }); - + fastify.setErrorHandler(errorHandler); fastify.register(fp(testPlugins)); fastify.register(routes); diff --git a/apps/backend/src/utils/logger.ts b/apps/backend/src/utils/logger.ts index 7e74f80..4568c68 100644 --- a/apps/backend/src/utils/logger.ts +++ b/apps/backend/src/utils/logger.ts @@ -3,7 +3,7 @@ import { type ILogLayer, LogLayer, LoggerType } from "loglayer"; import { type LogDescriptor, type P, pino } from "pino"; import { prettyFactory } from "pino-pretty"; import { serializeError } from "serialize-error"; -import { IS_PROD, IS_TEST } from "../constants"; +import { BACKEND_LOG_LEVEL, IS_PROD, IS_TEST } from "../constants"; import { asyncLocalStorage } from "./async-local-storage"; declare module "fastify" { @@ -52,16 +52,29 @@ const pinoOpts = { return; } - process.stdout.write( - prettify({ - level: d.level, - time: d.time, - msg: d.msg, - context: d.context, - metadata: d.metadata, - err: d.err, - }), - ); + if (IS_TEST) { + console.log( + prettify({ + level: d.level, + time: d.time, + msg: d.msg, + context: d.context, + metadata: d.metadata, + err: d.err, + }), + ); + } else { + process.stdout.write( + prettify({ + level: d.level, + time: d.time, + msg: d.msg, + context: d.context, + metadata: d.metadata, + err: d.err, + }), + ); + } }, }; @@ -70,19 +83,19 @@ const pinoOpts = { if (IS_TEST) { p = pino( { - level: "debug", + level: BACKEND_LOG_LEVEL, base: null, }, pinoOpts, ); } else if (IS_PROD) { p = pino({ - level: "error", + level: BACKEND_LOG_LEVEL, }); } else { p = pino( { - level: "debug", + level: BACKEND_LOG_LEVEL, base: null, }, pinoOpts, diff --git a/package.json b/package.json index 21864e0..dea54da 100644 --- a/package.json +++ b/package.json @@ -4,32 +4,37 @@ "version": "1.0.0", "private": true, "scripts": { + "start": "turbo watch dev", + "add-changeset": "changeset add", + "build": "turbo run build", "changeset": "changeset", "db:migrate:create": "cd apps/backend && pnpm run db:migrate:create", "db:migrate:latest": "cd apps/backend && pnpm run db:migrate:latest", "db:migrate:undo": "cd apps/backend && pnpm run db:migrate:undo", - "clean:git": "git clean -xdf node_modules", - "clean:workspaces": "apps/backend/turbo clean", + "clean:repo": "git add --all && git reset --hard", + "clean:workspaces": "turbo clean", + "clean:node_modules": "find . -name \"node_modules\" -type d -prune -exec rm -rf '{}' +\n", "lint": "turbo run lint --continue --", "typecheck": "turbo run typecheck --continue --", "syncpack:update": "syncpack update && syncpack fix-mismatches && pnpm i", "syncpack:format": "syncpack format", "syncpack:lint": "syncpack lint", + "version-packages": "changeset version", "prepare": "husky" }, "devDependencies": { - "@biomejs/biome": "1.8.3", + "@biomejs/biome": "1.9.2", "@changesets/changelog-github": "0.5.0", "@changesets/cli": "2.27.8", - "@commitlint/cli": "19.4.1", - "@commitlint/config-conventional": "19.4.1", + "@commitlint/cli": "19.5.0", + "@commitlint/config-conventional": "19.5.0", "@internal/tsconfig": "workspace:*", - "@types/node": "22.5.4", - "husky": "9.1.5", + "@types/node": "22.5.5", + "husky": "9.1.6", "lint-staged": "15.2.10", "syncpack": "13.0.0", - "turbo": "2.1.1", - "typescript": "5.5.4" + "turbo": "2.1.2", + "typescript": "5.6.2" }, "lint-staged": { "**/*.{js,jsx,ts,tsx,html,css,json}": [ @@ -45,5 +50,5 @@ "node": ">=20.16.0" }, "engineStrict": true, - "packageManager": "pnpm@9.9.0" + "packageManager": "pnpm@9.11.0" } diff --git a/packages/backend-client/.hash-runnerrc.json b/packages/backend-client/.hash-runnerrc.json new file mode 100644 index 0000000..6cacb56 --- /dev/null +++ b/packages/backend-client/.hash-runnerrc.json @@ -0,0 +1,5 @@ +{ + "include": ["openapi.yml", "package.json"], + "execOnChange": "pnpm run build", + "hashFile": ".hashes.json" +} \ No newline at end of file diff --git a/packages/backend-client/openapi.yml b/packages/backend-client/openapi.yml index 4af8e4e..b8ceece 100644 --- a/packages/backend-client/openapi.yml +++ b/packages/backend-client/openapi.yml @@ -20,6 +20,7 @@ components: properties: id: description: ID of the user + format: uuid type: string givenName: description: Given name of the user @@ -37,6 +38,7 @@ components: properties: userId: description: ID of the user + format: uuid type: string providerType: enum: diff --git a/packages/backend-client/package.json b/packages/backend-client/package.json index 4d964d5..eb18c0f 100644 --- a/packages/backend-client/package.json +++ b/packages/backend-client/package.json @@ -14,6 +14,7 @@ "types": "dist/index.d.ts", "scripts": { "build": "openapi-ts && tsup src/index.ts", + "build:dev": "hash-runner", "clean": "rm -rf .turbo node_modules dist", "typecheck": "tsc --noEmit" }, @@ -22,6 +23,7 @@ "@hey-api/client-fetch": "0.1.14", "@internal/tsconfig": "workspace:*", "@internal/backend": "workspace:*", - "tsup": "8.2.4" + "hash-runner": "2.0.1", + "tsup": "8.3.0" } } diff --git a/packages/backend-client/src/schemas.gen.ts b/packages/backend-client/src/schemas.gen.ts index 8e26245..f89d89a 100644 --- a/packages/backend-client/src/schemas.gen.ts +++ b/packages/backend-client/src/schemas.gen.ts @@ -12,6 +12,7 @@ export const $User = { properties: { id: { description: 'ID of the user', + format: 'uuid', type: 'string' }, givenName: { @@ -32,6 +33,7 @@ export const $UserProvider = { properties: { userId: { description: 'ID of the user', + format: 'uuid', type: 'string' }, providerType: { diff --git a/packages/backend-errors/.hash-runnerrc.json b/packages/backend-errors/.hash-runnerrc.json new file mode 100644 index 0000000..de52308 --- /dev/null +++ b/packages/backend-errors/.hash-runnerrc.json @@ -0,0 +1,5 @@ +{ + "include": ["src/**", "package.json"], + "execOnChange": "pnpm run build", + "hashFile": ".hashes.json" +} diff --git a/packages/backend-errors/package.json b/packages/backend-errors/package.json index ec15c60..61fe538 100644 --- a/packages/backend-errors/package.json +++ b/packages/backend-errors/package.json @@ -14,19 +14,23 @@ "types": "dist/index.d.ts", "scripts": { "build": "tsup src/index.ts", + "build:dev": "hash-runner", "clean": "rm -rf .turbo node_modules dist", "lint": "biome check --write --unsafe src && biome format src --write && biome lint src --fix", "typecheck": "tsc --noEmit" }, "dependencies": { + "clean-stack": "5.2.0", "nanoid": "5.0.7", + "serialize-error": "11.0.3", "sprintf-js": "1.1.3" }, "devDependencies": { "@types/sprintf-js": "1.1.4", "@internal/tsconfig": "workspace:*", "ajv": "8.17.1", - "tsup": "8.2.4" + "hash-runner": "2.0.1", + "tsup": "8.3.0" }, "peerDependencies": { "ajv": "8.17.1" diff --git a/packages/backend-errors/src/lib.ts b/packages/backend-errors/src/lib.ts index 17a1241..65e5367 100644 --- a/packages/backend-errors/src/lib.ts +++ b/packages/backend-errors/src/lib.ts @@ -1,8 +1,12 @@ import type { ErrorObject } from "ajv"; +import cleanStack from "clean-stack"; import { nanoid } from "nanoid"; +import { serializeError } from "serialize-error"; import sprintf from "sprintf-js"; import { BackendErrorCodeDefs, type BackendErrorCodes } from "./error-codes"; +const stackFilter = (path) => !/backend-errors/.test(path); + export interface ApiErrorParams { /** * Error code @@ -17,9 +21,13 @@ export interface ApiErrorParams { */ statusCode: number; /** - * Additional metadata + * Additional unsafe metadata that won't return to the client */ metadata?: Record; + /** + * Additional safe metadata that can be returned to the client + */ + metadataSafe?: Record; /** * AJV-style validation errors */ @@ -28,6 +36,19 @@ export interface ApiErrorParams { * Context of the validation errors */ validationContext?: string; + /** + * Error object. + */ + causedBy?: any; + /** + * If set to true, the error will be treated as an internal error on output to the client side, but the original + * error will still be logged by the fastify error handler. + */ + isInternalError?: boolean; + /** + * Log level to use for the error. Default is "error". + */ + logLevel?: "error" | "warn" | "info" | "debug" | "trace" | "fatal"; } export class ApiError extends Error { @@ -40,9 +61,13 @@ export class ApiError extends Error { */ statusCode: number; /** - * Additional metadata + * Additional unsafe metadata that won't return to the client */ metadata?: Record; + /** + * Additional safe metadata that can be returned to the client + */ + metadataSafe?: Record; /** * Error ID */ @@ -59,19 +84,49 @@ export class ApiError extends Error { * Context of the validation errors */ validationContext?: string; + /** + * Error object + */ + causedBy?: any; + /** + * If set to true, the error will be treated as an internal error on output to the client side, but the original + * error will still be logged by the fastify error handler. + */ + isInternalError?: boolean; + /** + * Log level to use for the error. Default is "error". + */ + logLevel?: "error" | "warn" | "info" | "debug" | "trace" | "fatal"; - constructor({ code, message, statusCode, metadata, validation, validationContext }: ApiErrorParams) { + constructor({ + code, + message, + statusCode, + metadata, + metadataSafe, + validation, + validationContext, + causedBy, + isInternalError, + logLevel, + }: ApiErrorParams) { super(message); this.errId = nanoid(12); this.code = code; this.statusCode = statusCode; this.metadata = metadata; + this.metadataSafe = metadataSafe; this.validation = validation; this.validationContext = validationContext; + this.causedBy = causedBy; + this.isInternalError = isInternalError || false; + this.logLevel = logLevel || "error"; if (Error.captureStackTrace) { Error.captureStackTrace(this, ApiError); } + + this.stack = cleanStack(this.stack, { pathFilter: stackFilter }); } /** @@ -83,34 +138,121 @@ export class ApiError extends Error { } toJSON() { + let causedBy: any = {}; + + if (this.causedBy instanceof ApiError) { + causedBy = this.causedBy.toJSON(); + } else if (this.causedBy instanceof Error) { + causedBy = serializeError(this.causedBy); + } else if (this.causedBy) { + try { + causedBy = JSON.stringify(this.causedBy); + } catch (e) { + causedBy = this.causedBy; + } + } + + let metadata: Record = {}; + + if (this.metadata || this.metadataSafe) { + metadata = { + ...(this.metadata ? { metadata: this.metadata } : {}), + ...(this.metadataSafe ? { metadataSafe: this.metadataSafe } : {}), + }; + } + return { ...(this.reqId ? { reqId: this.reqId } : {}), errId: this.errId, code: this.code, message: this.message, statusCode: this.statusCode, - ...(this.metadata ? { metadata: this.metadata } : {}), + ...metadata, + ...(causedBy ? { causedBy } : {}), + ...(this.validation ? { validation: this.validation } : {}), + ...(this.validationContext ? { validationContext: this.validationContext } : {}), + stack: this.stack, + }; + } + + /** + * Use to output production-safe values. Omits the following: + * + * - Stack trace + * - Caused by + * - unsafe metadata + */ + toJSONSafe() { + return { + ...(this.reqId ? { reqId: this.reqId } : {}), + errId: this.errId, + code: this.code, + message: this.message, + statusCode: this.statusCode, + ...(this.metadataSafe ? { metadata: this.metadataSafe } : {}), ...(this.validation ? { validation: this.validation } : {}), ...(this.validationContext ? { validationContext: this.validationContext } : {}), }; } } -export type ApiErrorShort = Pick & { +export type ApiErrorShort = Pick< + ApiErrorParams, + | "metadataSafe" + | "logLevel" + | "isInternalError" + | "code" + | "metadata" + | "validation" + | "validationContext" + | "causedBy" +> & { message?: string; }; /** * Creates an API error and throws it + * @throws {ApiError} */ -export function throwApiError({ code, metadata, validation, validationContext, message }: ApiErrorShort) { - throw createApiError({ code, message, metadata, validation, validationContext }); +export function throwApiError({ + code, + metadata, + metadataSafe, + validation, + validationContext, + message, + causedBy, + isInternalError, + logLevel, +}: ApiErrorShort) { + throw createApiError({ + code, + message, + metadata, + metadataSafe, + validation, + validationContext, + causedBy, + isInternalError, + logLevel, + }); } /** * Creates an API error + * @throws {ApiError} */ -export function createApiError({ code, message, metadata, validation, validationContext }: ApiErrorShort) { +export function createApiError({ + code, + message, + metadata, + metadataSafe, + validation, + validationContext, + causedBy, + isInternalError, + logLevel, +}: ApiErrorShort) { const { message: predefinedMessage, statusCode } = BackendErrorCodeDefs[code]; return new ApiError({ @@ -118,7 +260,19 @@ export function createApiError({ code, message, metadata, validation, validation message: message || predefinedMessage, statusCode, metadata, + metadataSafe, validation, validationContext, + causedBy, + isInternalError, + logLevel, }); } + +export function getErrorStatusCode(code: BackendErrorCodes): number { + return BackendErrorCodeDefs[code].statusCode; +} + +export function getErrorMessage(code: BackendErrorCodes): string { + return BackendErrorCodeDefs[code].message; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32494ca..5c37413 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 1.8.3 - version: 1.8.3 + specifier: 1.9.2 + version: 1.9.2 '@changesets/changelog-github': specifier: 0.5.0 version: 0.5.0 @@ -18,65 +18,62 @@ importers: specifier: 2.27.8 version: 2.27.8 '@commitlint/cli': - specifier: 19.4.1 - version: 19.4.1(@types/node@22.5.4)(typescript@5.5.4) + specifier: 19.5.0 + version: 19.5.0(@types/node@22.5.5)(typescript@5.6.2) '@commitlint/config-conventional': - specifier: 19.4.1 - version: 19.4.1 + specifier: 19.5.0 + version: 19.5.0 '@internal/tsconfig': specifier: workspace:* version: link:packages/tsconfig '@types/node': - specifier: 22.5.4 - version: 22.5.4 + specifier: 22.5.5 + version: 22.5.5 husky: - specifier: 9.1.5 - version: 9.1.5 + specifier: 9.1.6 + version: 9.1.6 lint-staged: specifier: 15.2.10 version: 15.2.10 syncpack: specifier: 13.0.0 - version: 13.0.0(typescript@5.5.4) + version: 13.0.0(typescript@5.6.2) turbo: - specifier: 2.1.1 - version: 2.1.1 + specifier: 2.1.2 + version: 2.1.2 typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: 5.6.2 + version: 5.6.2 apps/backend: dependencies: '@dotenvx/dotenvx': - specifier: 1.14.0 - version: 1.14.0 + specifier: 1.14.1 + version: 1.14.1 '@fastify/cors': - specifier: 9.0.1 - version: 9.0.1 + specifier: 10.0.0 + version: 10.0.0 '@fastify/jwt': - specifier: 8.0.1 - version: 8.0.1 + specifier: 9.0.0 + version: 9.0.0 '@fastify/swagger': - specifier: 8.15.0 - version: 8.15.0 + specifier: 9.0.0 + version: 9.0.0 '@fastify/swagger-ui': - specifier: 4.1.0 - version: 4.1.0 + specifier: 5.0.1 + version: 5.0.1 '@fastify/type-provider-typebox': - specifier: 4.1.0 - version: 4.1.0(@sinclair/typebox@0.33.9) + specifier: 5.0.0 + version: 5.0.0(@sinclair/typebox@0.33.12) '@internal/backend-errors': specifier: workspace:* version: link:../../packages/backend-errors '@sinclair/typebox': - specifier: 0.33.9 - version: 0.33.9 + specifier: 0.33.12 + version: 0.33.12 ajv-formats: specifier: 3.0.1 version: 3.0.1(ajv@8.17.1) - ajv-sanitizer: - specifier: 1.2.1 - version: 1.2.1(ajv@8.17.1) asyncforge: specifier: 0.5.0 version: 0.5.0 @@ -93,14 +90,14 @@ importers: specifier: 7.5.0 version: 7.5.0 fastify: - specifier: 4.28.1 - version: 4.28.1 + specifier: 5.0.0 + version: 5.0.0 fastify-cli: - specifier: 6.3.0 - version: 6.3.0 + specifier: 7.0.0 + version: 7.0.0 fastify-plugin: - specifier: 4.5.1 - version: 4.5.1 + specifier: 5.0.1 + version: 5.0.1 kysely: specifier: 0.27.4 version: 0.27.4 @@ -111,8 +108,8 @@ importers: specifier: 5.0.7 version: 5.0.7 pg: - specifier: 8.12.0 - version: 8.12.0 + specifier: 8.13.0 + version: 8.13.0 pino: specifier: 9.4.0 version: 9.4.0 @@ -130,38 +127,41 @@ importers: version: 10.0.0 devDependencies: '@faker-js/faker': - specifier: 9.0.0 - version: 9.0.0 + specifier: 9.0.1 + version: 9.0.1 '@internal/tsconfig': specifier: workspace:* version: link:../../packages/tsconfig '@testcontainers/postgresql': - specifier: 10.13.0 - version: 10.13.0 + specifier: 10.13.1 + version: 10.13.1 '@turbo/gen': - specifier: 2.1.1 - version: 2.1.1(@types/node@22.5.4)(typescript@5.5.4) + specifier: 2.1.2 + version: 2.1.2(@types/node@22.5.5)(typescript@5.6.2) '@types/node': - specifier: 22.5.4 - version: 22.5.4 + specifier: 22.5.5 + version: 22.5.5 '@types/pg': - specifier: 8.11.8 - version: 8.11.8 + specifier: 8.11.10 + version: 8.11.10 + hash-runner: + specifier: 2.0.1 + version: 2.0.1 kysely-ctl: specifier: 0.9.0 version: 0.9.0(kysely@0.27.4) ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@22.5.4)(typescript@5.5.4) + version: 10.9.2(@types/node@22.5.5)(typescript@5.6.2) tsx: - specifier: 4.19.0 - version: 4.19.0 + specifier: 4.19.1 + version: 4.19.1 typescript: - specifier: 5.5.4 - version: 5.5.4 + specifier: 5.6.2 + version: 5.6.2 vitest: - specifier: 2.0.5 - version: 2.0.5(@types/node@22.5.4) + specifier: 2.1.1 + version: 2.1.1(@types/node@22.5.5) packages/backend-client: devDependencies: @@ -170,22 +170,31 @@ importers: version: 0.1.14 '@hey-api/openapi-ts': specifier: 0.51.0 - version: 0.51.0(typescript@5.5.4) + version: 0.51.0(typescript@5.6.2) '@internal/backend': specifier: workspace:* version: link:../../apps/backend '@internal/tsconfig': specifier: workspace:* version: link:../tsconfig + hash-runner: + specifier: 2.0.1 + version: 2.0.1 tsup: - specifier: 8.2.4 - version: 8.2.4(jiti@1.21.6)(postcss@8.4.41)(tsx@4.19.0)(typescript@5.5.4)(yaml@2.5.0) + specifier: 8.3.0 + version: 8.3.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.19.1)(typescript@5.6.2)(yaml@2.5.0) packages/backend-errors: dependencies: + clean-stack: + specifier: 5.2.0 + version: 5.2.0 nanoid: specifier: 5.0.7 version: 5.0.7 + serialize-error: + specifier: 11.0.3 + version: 11.0.3 sprintf-js: specifier: 1.1.3 version: 1.1.3 @@ -199,18 +208,17 @@ importers: ajv: specifier: 8.17.1 version: 8.17.1 + hash-runner: + specifier: 2.0.1 + version: 2.0.1 tsup: - specifier: 8.2.4 - version: 8.2.4(jiti@1.21.6)(postcss@8.4.41)(tsx@4.19.0)(typescript@5.5.4)(yaml@2.5.0) + specifier: 8.3.0 + version: 8.3.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.19.1)(typescript@5.6.2)(yaml@2.5.0) packages/tsconfig: {} packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@apidevtools/json-schema-ref-parser@11.6.4': resolution: {integrity: sha512-9K6xOqeevacvweLGik6LnZCb1fBtCOSIWQs8d096XGeqoLKC33UVMGz9+77Gw44KvbH4pKcQPWo4ZpxkXYj05w==} engines: {node: '>= 16'} @@ -238,55 +246,55 @@ packages: '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} - '@biomejs/biome@1.8.3': - resolution: {integrity: sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==} + '@biomejs/biome@1.9.2': + resolution: {integrity: sha512-4j2Gfwft8Jqp1X0qLYvK4TEy4xhTo4o6rlvJPsjPeEame8gsmbGQfOPBkw7ur+7/Z/f0HZmCZKqbMvR7vTXQYQ==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.8.3': - resolution: {integrity: sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==} + '@biomejs/cli-darwin-arm64@1.9.2': + resolution: {integrity: sha512-rbs9uJHFmhqB3Td0Ro+1wmeZOHhAPTL3WHr8NtaVczUmDhXkRDWScaxicG9+vhSLj1iLrW47itiK6xiIJy6vaA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.8.3': - resolution: {integrity: sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==} + '@biomejs/cli-darwin-x64@1.9.2': + resolution: {integrity: sha512-BlfULKijNaMigQ9GH9fqJVt+3JTDOSiZeWOQtG/1S1sa8Lp046JHG3wRJVOvekTPL9q/CNFW1NVG8J0JN+L1OA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.8.3': - resolution: {integrity: sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==} + '@biomejs/cli-linux-arm64-musl@1.9.2': + resolution: {integrity: sha512-ZATvbUWhNxegSALUnCKWqetTZqrK72r2RsFD19OK5jXDj/7o1hzI1KzDNG78LloZxftrwr3uI9SqCLh06shSZw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@1.8.3': - resolution: {integrity: sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==} + '@biomejs/cli-linux-arm64@1.9.2': + resolution: {integrity: sha512-T8TJuSxuBDeQCQzxZu2o3OU4eyLumTofhCxxFd3+aH2AEWVMnH7Z/c3QP1lHI5RRMBP9xIJeMORqDQ5j+gVZzw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@1.8.3': - resolution: {integrity: sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==} + '@biomejs/cli-linux-x64-musl@1.9.2': + resolution: {integrity: sha512-CjPM6jT1miV5pry9C7qv8YJk0FIZvZd86QRD3atvDgfgeh9WQU0k2Aoo0xUcPdTnoz0WNwRtDicHxwik63MmSg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@1.8.3': - resolution: {integrity: sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==} + '@biomejs/cli-linux-x64@1.9.2': + resolution: {integrity: sha512-T0cPk3C3Jr2pVlsuQVTBqk2qPjTm8cYcTD9p/wmR9MeVqui1C/xTVfOIwd3miRODFMrJaVQ8MYSXnVIhV9jTjg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@1.8.3': - resolution: {integrity: sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==} + '@biomejs/cli-win32-arm64@1.9.2': + resolution: {integrity: sha512-2x7gSty75bNIeD23ZRPXyox6Z/V0M71ObeJtvQBhi1fgrvPdtkEuw7/0wEHg6buNCubzOFuN9WYJm6FKoUHfhg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.8.3': - resolution: {integrity: sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==} + '@biomejs/cli-win32-x64@1.9.2': + resolution: {integrity: sha512-JC3XvdYcjmu1FmAehVwVV0SebLpeNTnO2ZaMdGCSOdS7f8O9Fq14T2P1gTG1Q29Q8Dt1S03hh0IdVpIZykOL8g==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -352,81 +360,81 @@ packages: '@changesets/write@0.3.2': resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} - '@commitlint/cli@19.4.1': - resolution: {integrity: sha512-EerFVII3ZcnhXsDT9VePyIdCJoh3jEzygN1L37MjQXgPfGS6fJTWL/KHClVMod1d8w94lFC3l4Vh/y5ysVAz2A==} + '@commitlint/cli@19.5.0': + resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==} engines: {node: '>=v18'} hasBin: true - '@commitlint/config-conventional@19.4.1': - resolution: {integrity: sha512-D5S5T7ilI5roybWGc8X35OBlRXLAwuTseH1ro0XgqkOWrhZU8yOwBOslrNmSDlTXhXLq8cnfhQyC42qaUCzlXA==} + '@commitlint/config-conventional@19.5.0': + resolution: {integrity: sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==} engines: {node: '>=v18'} - '@commitlint/config-validator@19.0.3': - resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + '@commitlint/config-validator@19.5.0': + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} engines: {node: '>=v18'} - '@commitlint/ensure@19.0.3': - resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} + '@commitlint/ensure@19.5.0': + resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} engines: {node: '>=v18'} - '@commitlint/execute-rule@19.0.0': - resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + '@commitlint/execute-rule@19.5.0': + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} engines: {node: '>=v18'} - '@commitlint/format@19.3.0': - resolution: {integrity: sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==} + '@commitlint/format@19.5.0': + resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} engines: {node: '>=v18'} - '@commitlint/is-ignored@19.2.2': - resolution: {integrity: sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==} + '@commitlint/is-ignored@19.5.0': + resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==} engines: {node: '>=v18'} - '@commitlint/lint@19.4.1': - resolution: {integrity: sha512-Ws4YVAZ0jACTv6VThumITC1I5AG0UyXMGua3qcf55JmXIXm/ejfaVKykrqx7RyZOACKVAs8uDRIsEsi87JZ3+Q==} + '@commitlint/lint@19.5.0': + resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==} engines: {node: '>=v18'} - '@commitlint/load@19.4.0': - resolution: {integrity: sha512-I4lCWaEZYQJ1y+Y+gdvbGAx9pYPavqZAZ3/7/8BpWh+QjscAn8AjsUpLV2PycBsEx7gupq5gM4BViV9xwTIJuw==} + '@commitlint/load@19.5.0': + resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} engines: {node: '>=v18'} - '@commitlint/message@19.0.0': - resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} + '@commitlint/message@19.5.0': + resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} engines: {node: '>=v18'} - '@commitlint/parse@19.0.3': - resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} + '@commitlint/parse@19.5.0': + resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} engines: {node: '>=v18'} - '@commitlint/read@19.4.0': - resolution: {integrity: sha512-r95jLOEZzKDakXtnQub+zR3xjdnrl2XzerPwm7ch1/cc5JGq04tyaNpa6ty0CRCWdVrk4CZHhqHozb8yZwy2+g==} + '@commitlint/read@19.5.0': + resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} engines: {node: '>=v18'} - '@commitlint/resolve-extends@19.1.0': - resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} + '@commitlint/resolve-extends@19.5.0': + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} engines: {node: '>=v18'} - '@commitlint/rules@19.4.1': - resolution: {integrity: sha512-AgctfzAONoVxmxOXRyxXIq7xEPrd7lK/60h2egp9bgGUMZK9v0+YqLOA+TH+KqCa63ZoCr8owP2YxoSSu7IgnQ==} + '@commitlint/rules@19.5.0': + resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==} engines: {node: '>=v18'} - '@commitlint/to-lines@19.0.0': - resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} + '@commitlint/to-lines@19.5.0': + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} engines: {node: '>=v18'} - '@commitlint/top-level@19.0.0': - resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} + '@commitlint/top-level@19.5.0': + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} engines: {node: '>=v18'} - '@commitlint/types@19.0.3': - resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + '@commitlint/types@19.5.0': + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} engines: {node: '>=v18'} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dotenvx/dotenvx@1.14.0': - resolution: {integrity: sha512-ujWncblsqokvW8w6tCW35hjwlD3FHySMdrC5OPMYqfcGR96B/H6xK9xSu5F/SyZ8uk8USoPZynsXxB24IGvfmQ==} + '@dotenvx/dotenvx@1.14.1': + resolution: {integrity: sha512-uuv4JJxyy2dA1VaoyJpv404tzg+xpShYOy7eMYD7MZTAdO5JMnYlm7x5UZV6jgaHk5w99OTTe17i/R2fOS5jbw==} hasBin: true '@effect/schema@0.71.1': @@ -716,53 +724,52 @@ packages: cpu: [x64] os: [win32] - '@faker-js/faker@9.0.0': - resolution: {integrity: sha512-dTDHJSmz6c1OJ6HO7jiUiIb4sB20Dlkb3pxYsKm0qTXm2Bmj97rlXIhlvaFsW2rvCi+OLlwKLVSS6ZxFUVZvjQ==} + '@faker-js/faker@9.0.1': + resolution: {integrity: sha512-4mDeYIgM3By7X6t5E6eYwLAa+2h4DeZDF7thhzIg6XB76jeEvMwadYAMCFJL/R4AnEBcAUO9+gL0vhy3s+qvZA==} engines: {node: '>=18.0.0', npm: '>=9.0.0'} - '@fastify/accept-negotiator@1.1.0': - resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} - engines: {node: '>=14'} + '@fastify/accept-negotiator@2.0.0': + resolution: {integrity: sha512-/Sce/kBzuTxIq5tJh85nVNOq9wKD8s+viIgX0fFMDBdw95gnpf53qmF1oBgJym3cPFliWUuSloVg/1w/rH0FcQ==} - '@fastify/ajv-compiler@3.6.0': - resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} + '@fastify/ajv-compiler@4.0.0': + resolution: {integrity: sha512-dt0jyLAlay14LpIn4Fg1SY7V5NJ9KH0YFDpYVQY5cgIVBvdI8908AMx5zQ0bBYPGT6Wh+bM3f2caMmOXLP3QsQ==} '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@fastify/cors@9.0.1': - resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} + '@fastify/cors@10.0.0': + resolution: {integrity: sha512-kb9fkc/LVbLTQ3lhA+ZZjC/Styzysodo/MTCdVCvTtgHa/gBwxrEEkcp3fuoKIfAQt85wksrpXjUGbw5NQffEQ==} '@fastify/deepmerge@2.0.0': resolution: {integrity: sha512-fsaybTGDyQ5KpPsplQqb9yKdCf2x/pbNpMNk8Tvp3rRz7lVcupKysH4b2ELMN2P4Hak1+UqTYdTj/u4FNV2p0g==} - '@fastify/error@3.4.1': - resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + '@fastify/error@4.0.0': + resolution: {integrity: sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==} - '@fastify/fast-json-stringify-compiler@4.3.0': - resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + '@fastify/fast-json-stringify-compiler@5.0.1': + resolution: {integrity: sha512-f2d3JExJgFE3UbdFcpPwqNUEoHWmt8pAKf8f+9YuLESdefA0WgqxeT6DrGL4Yrf/9ihXNSKOqpjEmurV405meA==} - '@fastify/jwt@8.0.1': - resolution: {integrity: sha512-295bd7V6bDCnZOu8MAQgM6r7V1KILB+kdEq1q6nbHfXCnML569n7NSo3WzeLDG6IAqDl+Rhzi1vjxwaNHhRCBA==} + '@fastify/jwt@9.0.0': + resolution: {integrity: sha512-3XKFgpK/D/6vGY6gqy9Fe8TvUEk+UYBkFcIHvTvwLhe4wmmlNCE1si16wUdCZmeHRajjZKxfdBwRUklK8cHGIA==} '@fastify/merge-json-schemas@0.1.1': resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} - '@fastify/send@2.1.0': - resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} + '@fastify/send@3.1.1': + resolution: {integrity: sha512-LdiV2mle/2tH8vh6GwGl0ubfUAgvY+9yF9oGI1iiwVyNUVOQamvw5n+OFu6iCNNoyuCY80FFURBn4TZCbTe8LA==} - '@fastify/static@7.0.4': - resolution: {integrity: sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==} + '@fastify/static@8.0.1': + resolution: {integrity: sha512-7idyhbcgf14v4bjWzUeHEFvnVxvNJ1n5cyGPgFtwTZjnjUQ1wgC7a2FQai7OGKqCKywDEjzbPhAZRW+uEK1LMg==} - '@fastify/swagger-ui@4.1.0': - resolution: {integrity: sha512-Bqsd6VFQR7WoT6eRammOF8/gXf5GKywq2zYy8/3fj2rsZw43cmXdfsEKxVAmAwOW2Nv+dnyQaf5qM6kBqyXRlw==} + '@fastify/swagger-ui@5.0.1': + resolution: {integrity: sha512-nCDV5l0OTziK8nIeHaLZ30ENFFftZ4Pcs7GHDcqOO6Jp3qSnyOsqBg1/EosM+d1mrCvH4vSlM09xolkjrbuJQQ==} - '@fastify/swagger@8.15.0': - resolution: {integrity: sha512-zy+HEEKFqPMS2sFUsQU5X0MHplhKJvWeohBwTCkBAJA/GDYGLGUWQaETEhptiqxK7Hs0fQB9B4MDb3pbwIiCwA==} + '@fastify/swagger@9.0.0': + resolution: {integrity: sha512-E7TQbBCbhvS2djGLxJ7t2OFbhc2F+KCsOZCNhh6xQIlJxq9H4ZR5KuLKG+vn6COVqkLxRVUOZ9qtbbzdf5Jfqw==} - '@fastify/type-provider-typebox@4.1.0': - resolution: {integrity: sha512-mXNBaBEoS6Yf4/O2ujNhu9yEZwvBC7niqRESsiftE9NP1hV6ZdV3ZsFbPf1S520BK3rTZ0F28zr+sMdIXNJlfw==} + '@fastify/type-provider-typebox@5.0.0': + resolution: {integrity: sha512-E6D31dfF0l7wLwUji0DIoHlaHzyUCTJV4K0FP+bdibuEj+YVh8QGhwH9MqYi+FoTZRTu+bXaDs+W9kdMImt+Bw==} peerDependencies: '@sinclair/typebox': '>=0.26 <=0.33' @@ -924,15 +931,15 @@ packages: cpu: [x64] os: [win32] - '@sinclair/typebox@0.33.9': - resolution: {integrity: sha512-agK7y8hO5Gz4Thu5kxTtLiZudNRflR1rTwmnWW5skxMd/+aqQ9XQene8HyyBsiajs5HV6ZQ/pCd3IKsqIfu4Kw==} + '@sinclair/typebox@0.33.12': + resolution: {integrity: sha512-d5KrXIdPolLp8VpGpZAQvEz8ioVtFlUQSyCIS2sEBi7FKhceIB7nj9BlNfqqvp5wmOfg8v8bP1rAvYYkjz21/Q==} '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} - '@testcontainers/postgresql@10.13.0': - resolution: {integrity: sha512-wsZHOEkcAA2rszCeq5Jk/46FwjpuQCxx8dT41Ka7Pjk41WP41vgFptXeykQbd8qqIe8V7vaXcbuzprAec58V4g==} + '@testcontainers/postgresql@10.13.1': + resolution: {integrity: sha512-HAh/3uLAzAhOmzXsOE6hVxkvetczPnX/Zoyt+SgK7QotW98Npr1MDx8OKiaLGTJ8XkIvVvS4Ch6bl+frt4pnkQ==} '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} @@ -949,12 +956,12 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@turbo/gen@2.1.1': - resolution: {integrity: sha512-IaC8k3u/00giD3WjEy81Zwj8CFZJCrSf7sCA8gdug76C2DUm79CdAQ+tImR3KOMwnefIP0LH1NSPtREMKi59zQ==} + '@turbo/gen@2.1.2': + resolution: {integrity: sha512-YsRYh6+J+1VCP+TI1wT6ZR7lXVcXTaAUZ0+jY5xHOs1zR9Z5AR0ltTOVM1r01YUHVdk2eULD8ukRPMVDgZxRvw==} hasBin: true - '@turbo/workspaces@2.1.1': - resolution: {integrity: sha512-E9tnNIBRC09IjM521TaExmHUBo26qT41OCSgFpg2FdmLiobqxG2G2hzmdbDFC7QwcVifVF9FD/3gRtDqRqDj5g==} + '@turbo/workspaces@2.1.2': + resolution: {integrity: sha512-PbowgdRe19+1LvG9yDoesSxtps2bTu1Riuaip1/VBq0AXhd417TzISWDti+V6jRCFE5cwtszNsJo+gGREIlWLQ==} hasBin: true '@types/conventional-commits-parser@5.0.0': @@ -987,11 +994,11 @@ packages: '@types/node@18.19.44': resolution: {integrity: sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==} - '@types/node@22.5.4': - resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} + '@types/node@22.5.5': + resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} - '@types/pg@8.11.8': - resolution: {integrity: sha512-IqpCf8/569txXN/HoP5i1LjXfKZWL76Yr2R77xgeIICUbAYHeoaEZFhYHo2uDftecLWrTJUq63JvQu8q3lnDyA==} + '@types/pg@8.11.10': + resolution: {integrity: sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -1014,23 +1021,35 @@ packages: '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} - '@vitest/expect@2.0.5': - resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + '@vitest/expect@2.1.1': + resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} - '@vitest/pretty-format@2.0.5': - resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + '@vitest/mocker@2.1.1': + resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} + peerDependencies: + '@vitest/spy': 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} - '@vitest/runner@2.0.5': - resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} + '@vitest/runner@2.1.1': + resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} - '@vitest/snapshot@2.0.5': - resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + '@vitest/snapshot@2.1.1': + resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} - '@vitest/spy@2.0.5': - resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/spy@2.1.1': + resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} - '@vitest/utils@2.0.5': - resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} @@ -1067,14 +1086,6 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -1083,11 +1094,6 @@ packages: ajv: optional: true - ajv-sanitizer@1.2.1: - resolution: {integrity: sha512-ZIMKDJfrjL3I4fiXlcRs9Ngk+DUn2TooruXFR/PeBKWfIBcUdNbFppgxAByZZw+LdKKiprf87LmbPcPotjBq2Q==} - peerDependencies: - ajv: 8.x - ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -1189,8 +1195,8 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - avvio@8.4.0: - resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} + avvio@9.0.0: + resolution: {integrity: sha512-UbYrOXgE/I+knFG+3kJr9AgC7uNo8DG+FGGODpH9Bj1O1kL/QDjBXnTem9leD3VdQKtaHjV3O85DQ7hHh4IIHw==} b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} @@ -1354,6 +1360,10 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + clean-stack@5.2.0: + resolution: {integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==} + engines: {node: '>=14.16'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -1386,8 +1396,8 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - close-with-grace@1.3.0: - resolution: {integrity: sha512-lvm0rmLIR5bNz4CRKW6YvCfn9Wg5Wb9A8PJ3Bb+hjyikgC1RO1W3J4z9rBXQYw97mAte7dNSQI8BmUsxdlXQyw==} + close-with-grace@2.1.0: + resolution: {integrity: sha512-rME1AtzKc9dfpLr8XBVhXqhVZDvtaIA7FIpjPaO+DmDsomaTNtuEBZMoNDgIvjHYK5q8/Afxy34YTXInUBsT1A==} color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1544,6 +1554,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -1684,6 +1703,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -1735,9 +1758,6 @@ packages: resolution: {integrity: sha512-QpmbiqRFRZ+SIlBJh6xi5d/PgXciUc/xWKc4Vi2RWEHHIRx6oM3f0fWNna++zP9VB5HUBTObUK9gTKQP3vVcrQ==} engines: {node: '>=8.0.0'} - fast-content-type-parse@1.1.0: - resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} - fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} @@ -1754,8 +1774,8 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} - fast-json-stringify@5.16.1: - resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + fast-json-stringify@6.0.0: + resolution: {integrity: sha512-FGMKZwniMTgZh7zQp9b6XnBVxUmKVahQLQeRQHqwYmPDqDhcEKZ3BaQsxelFFI5PY7nN71OEeiL47/zUWcYe1A==} fast-jwt@4.0.2: resolution: {integrity: sha512-uSG3osRm3QNEkoCMwQ25qVs+pxn0f1n4/WLE+BmKaQZSmwhFhkkimHw7MXIPprrEF01CbNI1wL/35LRvLMfn7g==} @@ -1781,15 +1801,15 @@ packages: resolution: {integrity: sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==} engines: {node: '>=0.10.0'} - fastify-cli@6.3.0: - resolution: {integrity: sha512-FORXCwuBiNAArMMxp5hTthQCU9Xa7oO1wnCsGSgvuWC2k5ZarEEIXNm5RekcO9koZDQ0NACU6gGRF96Tf7ZI7Q==} + fastify-cli@7.0.0: + resolution: {integrity: sha512-9LFeYeIi8DZYar7/Q0bGq5Ihyi3pL5RZ9Z7hdxshRxTqxO1aoxZ6i5UKncQI1MpLtYS0HePPhre0t7QCIQ9n6w==} hasBin: true - fastify-plugin@4.5.1: - resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + fastify-plugin@5.0.1: + resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} - fastify@4.28.1: - resolution: {integrity: sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==} + fastify@5.0.0: + resolution: {integrity: sha512-Qe4dU+zGOzg7vXjw4EvcuyIbNnMwTmcuOhlOrOJsgwzvjEZmsM/IeHulgJk+r46STjdJS/ZJbxO8N70ODXDMEQ==} fastparallel@2.4.1: resolution: {integrity: sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==} @@ -1808,6 +1828,14 @@ packages: picomatch: optional: true + fdir@6.3.0: + resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -1816,8 +1844,8 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-my-way@8.2.0: - resolution: {integrity: sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==} + find-my-way@9.0.1: + resolution: {integrity: sha512-/5NN/R0pFWuff16TMajeKt2JyiW+/OE8nOO8vo1DwZTxLaIURb7lcBYPIgRPh61yCNh9l8voeKwcrkUzmB00vw==} engines: {node: '>=14'} find-up@3.0.0: @@ -1930,6 +1958,11 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -1978,6 +2011,11 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + hash-runner@2.0.1: + resolution: {integrity: sha512-S0jsW7JuFNDGv9lC7oV9SG+CmwFnMgUCnLuBcpMvakd3jzMfhHNPsysxQL5NrMLD4WNGKMXZZ3ATgoailfgwAw==} + engines: {node: '>=20'} + hasBin: true + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -2022,8 +2060,8 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - husky@9.1.5: - resolution: {integrity: sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==} + husky@9.1.6: + resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} engines: {node: '>=18'} hasBin: true @@ -2194,6 +2232,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.0.1: + resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} + engines: {node: 20 || >=22} + jiti@1.21.6: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true @@ -2265,8 +2307,8 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} - light-my-request@5.13.0: - resolution: {integrity: sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==} + light-my-request@6.0.0: + resolution: {integrity: sha512-kFkFXrmKCL0EEeOmJybMH5amWFd+AFvlvMlvFTRxCUwbhfapZqDmeLMPoWihntnYY6JpoQDE9k+vOzObF1fDqg==} lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} @@ -2368,6 +2410,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.0.1: + resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} + engines: {node: 20 || >=22} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -2427,6 +2473,10 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2472,9 +2522,6 @@ packages: mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} - mnemonist@0.39.6: - resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} - mnemonist@0.39.8: resolution: {integrity: sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==} @@ -2485,6 +2532,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -2722,6 +2772,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -2743,8 +2797,8 @@ packages: pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} - pg-connection-string@2.6.4: - resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + pg-connection-string@2.7.0: + resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} @@ -2754,14 +2808,17 @@ packages: resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} engines: {node: '>=4'} - pg-pool@3.6.2: - resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + pg-pool@3.7.0: + resolution: {integrity: sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==} peerDependencies: pg: '>=8.0' pg-protocol@1.6.1: resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + pg-protocol@1.7.0: + resolution: {integrity: sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==} + pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} @@ -2770,8 +2827,8 @@ packages: resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} engines: {node: '>=10'} - pg@8.12.0: - resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} + pg@8.13.0: + resolution: {integrity: sha512-34wkUTh3SxTClfoHB3pQ7bIMvw9dpFU1audQQeZG837fmHfHpr14n/AELVDoOYVDW2h5RDWU78tFjkD+erSBsw==} engines: {node: '>= 8.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -2899,9 +2956,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - process-warning@4.0.0: resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} @@ -3035,8 +3089,8 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - ret@0.4.3: - resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + ret@0.5.0: + resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} engines: {node: '>=10'} retry@0.12.0: @@ -3080,8 +3134,8 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex2@3.1.0: - resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + safe-regex2@4.0.0: + resolution: {integrity: sha512-Hvjfv25jPDVr3U+4LDzBuZPPOymELG3PYcSk5hcevooo1yxxamQL/bHs/GrEPGmMoMEwRrHVGiCA1pXi97B8Ew==} safe-stable-stringify@2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} @@ -3339,8 +3393,8 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - testcontainers@10.13.0: - resolution: {integrity: sha512-SDblQvirbJw1ZpenxaAairGtAesw5XMOCHLbRhTTUBJtBkZJGce8Vx/I8lXQxWIM8HRXsg3HILTHGQvYo4x7wQ==} + testcontainers@10.13.1: + resolution: {integrity: sha512-JBbOhxmygj/ouH/47GnoVNt+c55Telh/45IjVxEbDoswsLchVmJiuKiw/eF6lE5i7LN+/99xsrSCttI3YRtirg==} text-decoder@1.1.1: resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} @@ -3372,6 +3426,13 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + + tinyglobby@0.2.6: + resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} + engines: {node: '>=12.0.0'} + tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} @@ -3452,8 +3513,8 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tsup@8.2.4: - resolution: {integrity: sha512-akpCPePnBnC/CXgRrcy72ZSntgIEUa1jN0oJbbvpALWKNOz1B7aM+UVDWGRGIO/T/PZugAESWDJUAb5FD48o8Q==} + tsup@8.3.0: + resolution: {integrity: sha512-ALscEeyS03IomcuNdFdc0YWGVIkwH1Ws7nfTbAPuoILvEV2hpGQAY72LIOjglGo4ShWpZfpBqP/jpQVCzqYQag==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -3471,43 +3532,43 @@ packages: typescript: optional: true - tsx@4.19.0: - resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==} + tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.1.1: - resolution: {integrity: sha512-aYNuJpZlCoi0Htd79fl/2DywpewGKijdXeOfg9KzNuPVKzSMYlAXuAlNGh0MKjiOcyqxQGL7Mq9LFhwA0VpDpQ==} + turbo-darwin-64@2.1.2: + resolution: {integrity: sha512-3TEBxHWh99h2yIzkuIigMEOXt/ItYQp0aPiJjPd1xN4oDcsKK5AxiFKPH9pdtfIBzYsY59kQhZiFj0ELnSP7Bw==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.1.1: - resolution: {integrity: sha512-tifJKD8yHY48rHXPMcM8o1jI/Jk2KCaXiNjTKvvy9Zsim61BZksNVLelIbrRoCGwAN6PUBZO2lGU5iL/TQJ5Pw==} + turbo-darwin-arm64@2.1.2: + resolution: {integrity: sha512-he0miWNq2WxJzsH82jS2Z4MXpnkzn9SH8a79iPXiJkq25QREImucscM4RPasXm8wARp91pyysJMq6aasD45CeA==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.1.1: - resolution: {integrity: sha512-Js6d/bSQe9DuV9c7ITXYpsU/ADzFHABdz1UIHa7Oqjj9VOEbFeA9WpAn0c+mdJrVD+IXJFbbDZUjN7VYssmtcg==} + turbo-linux-64@2.1.2: + resolution: {integrity: sha512-fKUBcc0rK8Vdqv5a/E3CSpMBLG1bzwv+Q0Q83F8fG2ZfNCNKGbcEYABdonNZkkx141Rj03cZQFCgxu3MVEGU+A==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.1.1: - resolution: {integrity: sha512-LidzTCq0yvQ+N8w8Qub9FmhQ/mmEIeoqFi7DSupekEV2EjvE9jw/zYc9Pk67X+g7dHVfgOnvVzmrjChdxpFePw==} + turbo-linux-arm64@2.1.2: + resolution: {integrity: sha512-sV8Bpmm0WiuxgbhxymcC7wSsuxfBBieI98GegSwbr/bs1ANAgzCg93urIrdKdQ3/b31zZxQwcaP4FBF1wx1Qdg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.1.1: - resolution: {integrity: sha512-GKc9ZywKwy4xLDhwXd6H07yzl0TB52HjXMrFLyHGhCVnf/w0oq4sLJv2sjbvuarPjsyx4xnCBJ3m3oyL2XmFtA==} + turbo-windows-64@2.1.2: + resolution: {integrity: sha512-wcmIJZI9ORT9ykHGliFE6kWRQrlH930QGSjSgWC8uFChFFuOyUlvC7ttcxuSvU9VqC7NF4C+GVAcFJQ8lTjN7g==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.1.1: - resolution: {integrity: sha512-oFKkMj11KKUv3xSK9/fhAEQTxLUp1Ol1EOktwc32+SFtEU0uls7kosAz0b+qe8k3pJGEMFdDPdqoEjyJidbxtQ==} + turbo-windows-arm64@2.1.2: + resolution: {integrity: sha512-zdnXjrhk7YO6CP+Q5wPueEvOCLH4lDa6C4rrwiakcWcPgcQGbVozJlo4uaQ6awo8HLWQEvOwu84RkWTdLAc/Hw==} cpu: [arm64] os: [win32] - turbo@2.1.1: - resolution: {integrity: sha512-u9gUDkmR9dFS8b5kAYqIETK4OnzsS4l2ragJ0+soSMHh6VEeNHjTfSjk1tKxCqLyziCrPogadxP680J+v6yGHw==} + turbo@2.1.2: + resolution: {integrity: sha512-Jb0rbU4iHEVQ18An/YfakdIv9rKnd3zUfSE117EngrfWXFHo3RndVH96US3GsT8VHpwTncPePDBT2t06PaFLrw==} hasBin: true tweetnacl@0.14.5: @@ -3521,8 +3582,8 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true @@ -3582,12 +3643,8 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} - engines: {node: '>= 0.10'} - - vite-node@2.0.5: - resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} + vite-node@2.1.1: + resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -3622,15 +3679,15 @@ packages: terser: optional: true - vitest@2.0.5: - resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} + vitest@2.1.1: + resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.5 - '@vitest/ui': 2.0.5 + '@vitest/browser': 2.1.1 + '@vitest/ui': 2.1.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3750,11 +3807,6 @@ packages: snapshots: - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - '@apidevtools/json-schema-ref-parser@11.6.4': dependencies: '@jsdevtools/ono': 7.1.3 @@ -3786,39 +3838,39 @@ snapshots: '@balena/dockerignore@1.0.2': {} - '@biomejs/biome@1.8.3': + '@biomejs/biome@1.9.2': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.8.3 - '@biomejs/cli-darwin-x64': 1.8.3 - '@biomejs/cli-linux-arm64': 1.8.3 - '@biomejs/cli-linux-arm64-musl': 1.8.3 - '@biomejs/cli-linux-x64': 1.8.3 - '@biomejs/cli-linux-x64-musl': 1.8.3 - '@biomejs/cli-win32-arm64': 1.8.3 - '@biomejs/cli-win32-x64': 1.8.3 - - '@biomejs/cli-darwin-arm64@1.8.3': + '@biomejs/cli-darwin-arm64': 1.9.2 + '@biomejs/cli-darwin-x64': 1.9.2 + '@biomejs/cli-linux-arm64': 1.9.2 + '@biomejs/cli-linux-arm64-musl': 1.9.2 + '@biomejs/cli-linux-x64': 1.9.2 + '@biomejs/cli-linux-x64-musl': 1.9.2 + '@biomejs/cli-win32-arm64': 1.9.2 + '@biomejs/cli-win32-x64': 1.9.2 + + '@biomejs/cli-darwin-arm64@1.9.2': optional: true - '@biomejs/cli-darwin-x64@1.8.3': + '@biomejs/cli-darwin-x64@1.9.2': optional: true - '@biomejs/cli-linux-arm64-musl@1.8.3': + '@biomejs/cli-linux-arm64-musl@1.9.2': optional: true - '@biomejs/cli-linux-arm64@1.8.3': + '@biomejs/cli-linux-arm64@1.9.2': optional: true - '@biomejs/cli-linux-x64-musl@1.8.3': + '@biomejs/cli-linux-x64-musl@1.9.2': optional: true - '@biomejs/cli-linux-x64@1.8.3': + '@biomejs/cli-linux-x64@1.9.2': optional: true - '@biomejs/cli-win32-arm64@1.8.3': + '@biomejs/cli-win32-arm64@1.9.2': optional: true - '@biomejs/cli-win32-x64@1.8.3': + '@biomejs/cli-win32-x64@1.9.2': optional: true '@changesets/apply-release-plan@7.0.5': @@ -3980,66 +4032,66 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 - '@commitlint/cli@19.4.1(@types/node@22.5.4)(typescript@5.5.4)': + '@commitlint/cli@19.5.0(@types/node@22.5.5)(typescript@5.6.2)': dependencies: - '@commitlint/format': 19.3.0 - '@commitlint/lint': 19.4.1 - '@commitlint/load': 19.4.0(@types/node@22.5.4)(typescript@5.5.4) - '@commitlint/read': 19.4.0 - '@commitlint/types': 19.0.3 - execa: 8.0.1 + '@commitlint/format': 19.5.0 + '@commitlint/lint': 19.5.0 + '@commitlint/load': 19.5.0(@types/node@22.5.5)(typescript@5.6.2) + '@commitlint/read': 19.5.0 + '@commitlint/types': 19.5.0 + tinyexec: 0.3.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - typescript - '@commitlint/config-conventional@19.4.1': + '@commitlint/config-conventional@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 conventional-changelog-conventionalcommits: 7.0.2 - '@commitlint/config-validator@19.0.3': + '@commitlint/config-validator@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 ajv: 8.17.1 - '@commitlint/ensure@19.0.3': + '@commitlint/ensure@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 - '@commitlint/execute-rule@19.0.0': {} + '@commitlint/execute-rule@19.5.0': {} - '@commitlint/format@19.3.0': + '@commitlint/format@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 chalk: 5.3.0 - '@commitlint/is-ignored@19.2.2': + '@commitlint/is-ignored@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 semver: 7.6.3 - '@commitlint/lint@19.4.1': + '@commitlint/lint@19.5.0': dependencies: - '@commitlint/is-ignored': 19.2.2 - '@commitlint/parse': 19.0.3 - '@commitlint/rules': 19.4.1 - '@commitlint/types': 19.0.3 + '@commitlint/is-ignored': 19.5.0 + '@commitlint/parse': 19.5.0 + '@commitlint/rules': 19.5.0 + '@commitlint/types': 19.5.0 - '@commitlint/load@19.4.0(@types/node@22.5.4)(typescript@5.5.4)': + '@commitlint/load@19.5.0(@types/node@22.5.5)(typescript@5.6.2)': dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/execute-rule': 19.0.0 - '@commitlint/resolve-extends': 19.1.0 - '@commitlint/types': 19.0.3 + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@5.5.4) - cosmiconfig-typescript-loader: 5.0.0(@types/node@22.5.4)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4) + cosmiconfig: 9.0.0(typescript@5.6.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@22.5.5)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -4047,46 +4099,45 @@ snapshots: - '@types/node' - typescript - '@commitlint/message@19.0.0': {} + '@commitlint/message@19.5.0': {} - '@commitlint/parse@19.0.3': + '@commitlint/parse@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - '@commitlint/read@19.4.0': + '@commitlint/read@19.5.0': dependencies: - '@commitlint/top-level': 19.0.0 - '@commitlint/types': 19.0.3 - execa: 8.0.1 + '@commitlint/top-level': 19.5.0 + '@commitlint/types': 19.5.0 git-raw-commits: 4.0.0 minimist: 1.2.8 + tinyexec: 0.3.0 - '@commitlint/resolve-extends@19.1.0': + '@commitlint/resolve-extends@19.5.0': dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/types': 19.0.3 + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 global-directory: 4.0.1 import-meta-resolve: 4.1.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - '@commitlint/rules@19.4.1': + '@commitlint/rules@19.5.0': dependencies: - '@commitlint/ensure': 19.0.3 - '@commitlint/message': 19.0.0 - '@commitlint/to-lines': 19.0.0 - '@commitlint/types': 19.0.3 - execa: 8.0.1 + '@commitlint/ensure': 19.5.0 + '@commitlint/message': 19.5.0 + '@commitlint/to-lines': 19.5.0 + '@commitlint/types': 19.5.0 - '@commitlint/to-lines@19.0.0': {} + '@commitlint/to-lines@19.5.0': {} - '@commitlint/top-level@19.0.0': + '@commitlint/top-level@19.5.0': dependencies: find-up: 7.0.0 - '@commitlint/types@19.0.3': + '@commitlint/types@19.5.0': dependencies: '@types/conventional-commits-parser': 5.0.0 chalk: 5.3.0 @@ -4095,7 +4146,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dotenvx/dotenvx@1.14.0': + '@dotenvx/dotenvx@1.14.1': dependencies: commander: 11.1.0 dotenv: 16.4.5 @@ -4253,44 +4304,44 @@ snapshots: '@esbuild/win32-x64@0.23.0': optional: true - '@faker-js/faker@9.0.0': {} + '@faker-js/faker@9.0.1': {} - '@fastify/accept-negotiator@1.1.0': {} + '@fastify/accept-negotiator@2.0.0': {} - '@fastify/ajv-compiler@3.6.0': + '@fastify/ajv-compiler@4.0.0': dependencies: ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - fast-uri: 2.4.0 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-uri: 3.0.1 '@fastify/busboy@2.1.1': {} - '@fastify/cors@9.0.1': + '@fastify/cors@10.0.0': dependencies: - fastify-plugin: 4.5.1 - mnemonist: 0.39.6 + fastify-plugin: 5.0.1 + mnemonist: 0.39.8 '@fastify/deepmerge@2.0.0': {} - '@fastify/error@3.4.1': {} + '@fastify/error@4.0.0': {} - '@fastify/fast-json-stringify-compiler@4.3.0': + '@fastify/fast-json-stringify-compiler@5.0.1': dependencies: - fast-json-stringify: 5.16.1 + fast-json-stringify: 6.0.0 - '@fastify/jwt@8.0.1': + '@fastify/jwt@9.0.0': dependencies: - '@fastify/error': 3.4.1 + '@fastify/error': 4.0.0 '@lukeed/ms': 2.0.2 fast-jwt: 4.0.2 - fastify-plugin: 4.5.1 + fastify-plugin: 5.0.1 steed: 1.1.3 '@fastify/merge-json-schemas@0.1.1': dependencies: fast-deep-equal: 3.1.3 - '@fastify/send@2.1.0': + '@fastify/send@3.1.1': dependencies: '@lukeed/ms': 2.0.2 escape-html: 1.0.3 @@ -4298,26 +4349,26 @@ snapshots: http-errors: 2.0.0 mime: 3.0.0 - '@fastify/static@7.0.4': + '@fastify/static@8.0.1': dependencies: - '@fastify/accept-negotiator': 1.1.0 - '@fastify/send': 2.1.0 + '@fastify/accept-negotiator': 2.0.0 + '@fastify/send': 3.1.1 content-disposition: 0.5.4 - fastify-plugin: 4.5.1 + fastify-plugin: 5.0.1 fastq: 1.17.1 - glob: 10.4.5 + glob: 11.0.0 - '@fastify/swagger-ui@4.1.0': + '@fastify/swagger-ui@5.0.1': dependencies: - '@fastify/static': 7.0.4 - fastify-plugin: 4.5.1 + '@fastify/static': 8.0.1 + fastify-plugin: 5.0.1 openapi-types: 12.1.3 rfdc: 1.4.1 yaml: 2.5.0 - '@fastify/swagger@8.15.0': + '@fastify/swagger@9.0.0': dependencies: - fastify-plugin: 4.5.1 + fastify-plugin: 5.0.1 json-schema-resolver: 2.0.0 openapi-types: 12.1.3 rfdc: 1.4.1 @@ -4325,20 +4376,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@fastify/type-provider-typebox@4.1.0(@sinclair/typebox@0.33.9)': + '@fastify/type-provider-typebox@5.0.0(@sinclair/typebox@0.33.12)': dependencies: - '@sinclair/typebox': 0.33.9 + '@sinclair/typebox': 0.33.12 '@hey-api/client-fetch@0.1.14': {} - '@hey-api/openapi-ts@0.51.0(typescript@5.5.4)': + '@hey-api/openapi-ts@0.51.0(typescript@5.6.2)': dependencies: '@apidevtools/json-schema-ref-parser': 11.6.4 c12: 1.11.1 camelcase: 8.0.0 commander: 12.1.0 handlebars: 4.7.8 - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: - magicast @@ -4479,13 +4530,13 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.20.0': optional: true - '@sinclair/typebox@0.33.9': {} + '@sinclair/typebox@0.33.12': {} '@sindresorhus/merge-streams@2.3.0': {} - '@testcontainers/postgresql@10.13.0': + '@testcontainers/postgresql@10.13.1': dependencies: - testcontainers: 10.13.0 + testcontainers: 10.13.1 transitivePeerDependencies: - supports-color @@ -4499,9 +4550,9 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@2.1.1(@types/node@22.5.4)(typescript@5.5.4)': + '@turbo/gen@2.1.2(@types/node@22.5.5)(typescript@5.6.2)': dependencies: - '@turbo/workspaces': 2.1.1 + '@turbo/workspaces': 2.1.2 commander: 10.0.1 fs-extra: 10.1.0 inquirer: 8.2.6 @@ -4509,7 +4560,7 @@ snapshots: node-plop: 0.26.3 picocolors: 1.0.1 proxy-agent: 6.4.0 - ts-node: 10.9.2(@types/node@22.5.4)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@22.5.5)(typescript@5.6.2) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -4519,7 +4570,7 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@2.1.1': + '@turbo/workspaces@2.1.2': dependencies: commander: 10.0.1 execa: 5.1.1 @@ -4536,17 +4587,17 @@ snapshots: '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 '@types/docker-modem@3.0.6': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 '@types/ssh2': 1.15.0 '@types/dockerode@3.3.31': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 22.5.4 + '@types/node': 22.5.5 '@types/ssh2': 1.15.0 '@types/estree@1.0.5': {} @@ -4554,7 +4605,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.5.4 + '@types/node': 22.5.5 '@types/inquirer@6.5.0': dependencies: @@ -4571,13 +4622,13 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.5.4': + '@types/node@22.5.5': dependencies: undici-types: 6.19.6 - '@types/pg@8.11.8': + '@types/pg@8.11.10': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 pg-protocol: 1.6.1 pg-types: 4.0.2 @@ -4587,11 +4638,11 @@ snapshots: '@types/ssh2-streams@0.1.12': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 '@types/ssh2@0.5.52': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 '@types/ssh2-streams': 0.1.12 '@types/ssh2@1.15.0': @@ -4600,40 +4651,47 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 '@types/tinycolor2@1.4.6': {} - '@vitest/expect@2.0.5': + '@vitest/expect@2.1.1': dependencies: - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/pretty-format@2.0.5': + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.0(@types/node@22.5.5))': + dependencies: + '@vitest/spy': 2.1.1 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.4.0(@types/node@22.5.5) + + '@vitest/pretty-format@2.1.1': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.0.5': + '@vitest/runner@2.1.1': dependencies: - '@vitest/utils': 2.0.5 + '@vitest/utils': 2.1.1 pathe: 1.1.2 - '@vitest/snapshot@2.0.5': + '@vitest/snapshot@2.1.1': dependencies: - '@vitest/pretty-format': 2.0.5 + '@vitest/pretty-format': 2.1.1 magic-string: 0.30.11 pathe: 1.1.2 - '@vitest/spy@2.0.5': + '@vitest/spy@2.1.1': dependencies: tinyspy: 3.0.0 - '@vitest/utils@2.0.5': + '@vitest/utils@2.1.1': dependencies: - '@vitest/pretty-format': 2.0.5 - estree-walker: 3.0.3 + '@vitest/pretty-format': 2.1.1 loupe: 3.1.1 tinyrainbow: 1.2.0 @@ -4658,13 +4716,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.6 + debug: 4.3.7 transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.6 + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -4673,19 +4731,10 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - ajv-formats@3.0.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 - ajv-sanitizer@1.2.1(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - validator: 13.12.0 - ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 @@ -4788,9 +4837,9 @@ snapshots: atomic-sleep@1.0.0: {} - avvio@8.4.0: + avvio@9.0.0: dependencies: - '@fastify/error': 3.4.1 + '@fastify/error': 4.0.0 fastq: 1.17.1 b4a@1.6.6: {} @@ -4990,6 +5039,10 @@ snapshots: clean-stack@2.2.0: {} + clean-stack@5.2.0: + dependencies: + escape-string-regexp: 5.0.0 + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -5019,7 +5072,7 @@ snapshots: clone@1.0.4: {} - close-with-grace@1.3.0: {} + close-with-grace@2.1.0: {} color-convert@1.9.3: dependencies: @@ -5102,21 +5155,21 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@5.0.0(@types/node@22.5.4)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4): + cosmiconfig-typescript-loader@5.0.0(@types/node@22.5.5)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2): dependencies: - '@types/node': 22.5.4 - cosmiconfig: 9.0.0(typescript@5.5.4) + '@types/node': 22.5.5 + cosmiconfig: 9.0.0(typescript@5.6.2) jiti: 1.21.6 - typescript: 5.5.4 + typescript: 5.6.2 - cosmiconfig@9.0.0(typescript@5.5.4): + cosmiconfig@9.0.0(typescript@5.6.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 cpu-features@0.0.10: dependencies: @@ -5157,6 +5210,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.7: + dependencies: + ms: 2.1.3 + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -5206,7 +5263,7 @@ snapshots: docker-modem@3.0.8: dependencies: - debug: 4.3.6 + debug: 4.3.7 readable-stream: 3.6.2 split-ca: 1.0.1 ssh2: 1.15.0 @@ -5331,6 +5388,8 @@ snapshots: escape-string-regexp@1.0.5: {} + escape-string-regexp@5.0.0: {} + escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -5391,8 +5450,6 @@ snapshots: dependencies: pure-rand: 6.1.0 - fast-content-type-parse@1.1.0: {} - fast-copy@3.0.2: {} fast-decode-uri-component@1.0.1: {} @@ -5409,7 +5466,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.7 - fast-json-stringify@5.16.1: + fast-json-stringify@6.0.0: dependencies: '@fastify/merge-json-schemas': 0.1.1 ajv: 8.17.1 @@ -5442,16 +5499,16 @@ snapshots: dependencies: reusify: 1.0.4 - fastify-cli@6.3.0: + fastify-cli@7.0.0: dependencies: '@fastify/deepmerge': 2.0.0 chalk: 4.1.2 chokidar: 3.6.0 - close-with-grace: 1.3.0 + close-with-grace: 2.1.0 commist: 3.2.0 dotenv: 16.4.5 - fastify: 4.28.1 - fastify-plugin: 4.5.1 + fastify: 5.0.0 + fastify-plugin: 5.0.1 generify: 4.2.0 help-me: 4.2.0 is-docker: 2.2.1 @@ -5461,21 +5518,20 @@ snapshots: semver: 7.6.3 yargs-parser: 21.1.1 - fastify-plugin@4.5.1: {} + fastify-plugin@5.0.1: {} - fastify@4.28.1: + fastify@5.0.0: dependencies: - '@fastify/ajv-compiler': 3.6.0 - '@fastify/error': 3.4.1 - '@fastify/fast-json-stringify-compiler': 4.3.0 + '@fastify/ajv-compiler': 4.0.0 + '@fastify/error': 4.0.0 + '@fastify/fast-json-stringify-compiler': 5.0.1 abstract-logging: 2.0.1 - avvio: 8.4.0 - fast-content-type-parse: 1.1.0 - fast-json-stringify: 5.16.1 - find-my-way: 8.2.0 - light-my-request: 5.13.0 + avvio: 9.0.0 + fast-json-stringify: 6.0.0 + find-my-way: 9.0.1 + light-my-request: 6.0.0 pino: 9.4.0 - process-warning: 3.0.0 + process-warning: 4.0.0 proxy-addr: 2.0.7 rfdc: 1.4.1 secure-json-parse: 2.7.0 @@ -5500,6 +5556,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.3.0(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -5508,11 +5568,11 @@ snapshots: dependencies: to-regex-range: 5.0.1 - find-my-way@8.2.0: + find-my-way@9.0.1: dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 - safe-regex2: 3.1.0 + safe-regex2: 4.0.0 find-up@3.0.0: dependencies: @@ -5612,7 +5672,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.3.6 + debug: 4.3.7 fs-extra: 11.2.0 transitivePeerDependencies: - supports-color @@ -5647,6 +5707,15 @@ snapshots: package-json-from-dist: 1.0.0 path-scurry: 1.11.1 + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.1 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -5719,6 +5788,15 @@ snapshots: has-unicode@2.0.1: {} + hash-runner@2.0.1: + dependencies: + commander: 12.1.0 + debug: 4.3.7 + glob: 11.0.0 + lilconfig: 3.1.2 + transitivePeerDependencies: + - supports-color + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -5750,21 +5828,21 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.6 + debug: 4.3.7 transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.6 + debug: 4.3.7 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.6 + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -5774,7 +5852,7 @@ snapshots: human-signals@5.0.0: {} - husky@9.1.5: {} + husky@9.1.6: {} iconv-lite@0.4.24: dependencies: @@ -5925,6 +6003,12 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.0.1: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jiti@1.21.6: {} joycon@3.1.1: {} @@ -5950,7 +6034,7 @@ snapshots: json-schema-resolver@2.0.0: dependencies: - debug: 4.3.6 + debug: 4.3.7 rfdc: 1.4.1 uri-js: 4.4.1 transitivePeerDependencies: @@ -5985,7 +6069,7 @@ snapshots: pathe: 1.1.2 pkg-types: 1.1.3 std-env: 3.7.0 - tsx: 4.19.0 + tsx: 4.19.1 transitivePeerDependencies: - magicast @@ -5995,10 +6079,10 @@ snapshots: dependencies: readable-stream: 2.3.8 - light-my-request@5.13.0: + light-my-request@6.0.0: dependencies: cookie: 0.6.0 - process-warning: 3.0.0 + process-warning: 4.0.0 set-cookie-parser: 2.7.0 lilconfig@3.1.2: {} @@ -6104,6 +6188,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.0.1: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -6151,6 +6237,10 @@ snapshots: minimalistic-assert@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -6193,10 +6283,6 @@ snapshots: pkg-types: 1.1.3 ufo: 1.5.4 - mnemonist@0.39.6: - dependencies: - obliterator: 2.0.4 - mnemonist@0.39.8: dependencies: obliterator: 2.0.4 @@ -6205,6 +6291,8 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + mute-stream@0.0.8: {} mz@2.7.0: @@ -6398,7 +6486,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.1 - debug: 4.3.6 + debug: 4.3.7 get-uri: 6.0.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 @@ -6459,6 +6547,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.1 + minipass: 7.1.2 + path-type@4.0.0: {} path-type@5.0.0: {} @@ -6472,18 +6565,20 @@ snapshots: pg-cloudflare@1.1.1: optional: true - pg-connection-string@2.6.4: {} + pg-connection-string@2.7.0: {} pg-int8@1.0.1: {} pg-numeric@1.0.2: {} - pg-pool@3.6.2(pg@8.12.0): + pg-pool@3.7.0(pg@8.13.0): dependencies: - pg: 8.12.0 + pg: 8.13.0 pg-protocol@1.6.1: {} + pg-protocol@1.7.0: {} + pg-types@2.2.0: dependencies: pg-int8: 1.0.1 @@ -6502,11 +6597,11 @@ snapshots: postgres-interval: 3.0.0 postgres-range: 1.1.4 - pg@8.12.0: + pg@8.13.0: dependencies: - pg-connection-string: 2.6.4 - pg-pool: 3.6.2(pg@8.12.0) - pg-protocol: 1.6.1 + pg-connection-string: 2.7.0 + pg-pool: 3.7.0(pg@8.13.0) + pg-protocol: 1.7.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -6578,19 +6673,19 @@ snapshots: dependencies: find-up: 3.0.0 - postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.4.41)(tsx@4.19.0)(yaml@2.5.0): + postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.4.41)(tsx@4.19.1)(yaml@2.5.0): dependencies: lilconfig: 3.1.2 optionalDependencies: jiti: 1.21.6 postcss: 8.4.41 - tsx: 4.19.0 + tsx: 4.19.1 yaml: 2.5.0 postcss@8.4.41: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 + picocolors: 1.1.0 source-map-js: 1.2.0 postgres-array@2.0.0: {} @@ -6621,8 +6716,6 @@ snapshots: process-nextick-args@2.0.1: {} - process-warning@3.0.0: {} - process-warning@4.0.0: {} process@0.11.10: {} @@ -6650,7 +6743,7 @@ snapshots: proxy-agent@6.4.0: dependencies: agent-base: 7.1.1 - debug: 4.3.6 + debug: 4.3.7 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 lru-cache: 7.18.3 @@ -6779,7 +6872,7 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - ret@0.4.3: {} + ret@0.5.0: {} retry@0.12.0: {} @@ -6831,9 +6924,9 @@ snapshots: safe-buffer@5.2.1: {} - safe-regex2@3.1.0: + safe-regex2@4.0.0: dependencies: - ret: 0.4.3 + ret: 0.5.0 safe-stable-stringify@2.4.3: {} @@ -6903,7 +6996,7 @@ snapshots: socks-proxy-agent@8.0.4: dependencies: agent-base: 7.1.1 - debug: 4.3.6 + debug: 4.3.7 socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -7052,13 +7145,13 @@ snapshots: lower-case: 1.1.4 upper-case: 1.1.3 - syncpack@13.0.0(typescript@5.5.4): + syncpack@13.0.0(typescript@5.6.2): dependencies: '@effect/schema': 0.71.1(effect@3.6.5) chalk: 5.3.0 chalk-template: 1.1.0 commander: 12.1.0 - cosmiconfig: 9.0.0(typescript@5.5.4) + cosmiconfig: 9.0.0(typescript@5.6.2) effect: 3.6.5 enquirer: 2.4.1 fast-check: 3.21.0 @@ -7115,14 +7208,14 @@ snapshots: term-size@2.2.1: {} - testcontainers@10.13.0: + testcontainers@10.13.1: dependencies: '@balena/dockerignore': 1.0.2 '@types/dockerode': 3.3.31 archiver: 7.0.1 async-lock: 1.4.1 byline: 5.0.0 - debug: 4.3.6 + debug: 4.3.7 docker-compose: 0.24.8 dockerode: 3.3.5 get-port: 5.1.1 @@ -7161,6 +7254,13 @@ snapshots: tinycolor2@1.6.0: {} + tinyexec@0.3.0: {} + + tinyglobby@0.2.6: + dependencies: + fdir: 6.3.0(picomatch@4.0.2) + picomatch: 4.0.2 + tinygradient@1.1.5: dependencies: '@types/tinycolor2': 1.4.6 @@ -7203,21 +7303,21 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@22.5.4)(typescript@5.5.4): + ts-node@10.9.2(@types/node@22.5.5)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.5.4 + '@types/node': 22.5.5 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -7232,66 +7332,66 @@ snapshots: tslib@2.6.3: {} - tsup@8.2.4(jiti@1.21.6)(postcss@8.4.41)(tsx@4.19.0)(typescript@5.5.4)(yaml@2.5.0): + tsup@8.3.0(jiti@1.21.6)(postcss@8.4.41)(tsx@4.19.1)(typescript@5.6.2)(yaml@2.5.0): dependencies: bundle-require: 5.0.0(esbuild@0.23.0) cac: 6.7.14 chokidar: 3.6.0 consola: 3.2.3 - debug: 4.3.6 + debug: 4.3.7 esbuild: 0.23.0 execa: 5.1.1 - globby: 11.1.0 joycon: 3.1.1 - picocolors: 1.0.1 - postcss-load-config: 6.0.1(jiti@1.21.6)(postcss@8.4.41)(tsx@4.19.0)(yaml@2.5.0) + picocolors: 1.1.0 + postcss-load-config: 6.0.1(jiti@1.21.6)(postcss@8.4.41)(tsx@4.19.1)(yaml@2.5.0) resolve-from: 5.0.0 rollup: 4.20.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 + tinyglobby: 0.2.6 tree-kill: 1.2.2 optionalDependencies: postcss: 8.4.41 - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: - jiti - supports-color - tsx - yaml - tsx@4.19.0: + tsx@4.19.1: dependencies: esbuild: 0.23.0 get-tsconfig: 4.7.6 optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.1.1: + turbo-darwin-64@2.1.2: optional: true - turbo-darwin-arm64@2.1.1: + turbo-darwin-arm64@2.1.2: optional: true - turbo-linux-64@2.1.1: + turbo-linux-64@2.1.2: optional: true - turbo-linux-arm64@2.1.1: + turbo-linux-arm64@2.1.2: optional: true - turbo-windows-64@2.1.1: + turbo-windows-64@2.1.2: optional: true - turbo-windows-arm64@2.1.1: + turbo-windows-arm64@2.1.2: optional: true - turbo@2.1.1: + turbo@2.1.2: optionalDependencies: - turbo-darwin-64: 2.1.1 - turbo-darwin-arm64: 2.1.1 - turbo-linux-64: 2.1.1 - turbo-linux-arm64: 2.1.1 - turbo-windows-64: 2.1.1 - turbo-windows-arm64: 2.1.1 + turbo-darwin-64: 2.1.2 + turbo-darwin-arm64: 2.1.2 + turbo-linux-64: 2.1.2 + turbo-linux-arm64: 2.1.2 + turbo-windows-64: 2.1.2 + turbo-windows-arm64: 2.1.2 tweetnacl@0.14.5: {} @@ -7299,7 +7399,7 @@ snapshots: type-fest@2.19.0: {} - typescript@5.5.4: {} + typescript@5.6.2: {} ufo@1.5.4: {} @@ -7343,15 +7443,12 @@ snapshots: validate-npm-package-name@5.0.1: {} - validator@13.12.0: {} - - vite-node@2.0.5(@types/node@22.5.4): + vite-node@2.1.1(@types/node@22.5.5): dependencies: cac: 6.7.14 - debug: 4.3.6 + debug: 4.3.7 pathe: 1.1.2 - tinyrainbow: 1.2.0 - vite: 5.4.0(@types/node@22.5.4) + vite: 5.4.0(@types/node@22.5.5) transitivePeerDependencies: - '@types/node' - less @@ -7363,41 +7460,42 @@ snapshots: - supports-color - terser - vite@5.4.0(@types/node@22.5.4): + vite@5.4.0(@types/node@22.5.5): dependencies: esbuild: 0.21.5 postcss: 8.4.41 rollup: 4.20.0 optionalDependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 fsevents: 2.3.3 - vitest@2.0.5(@types/node@22.5.4): + vitest@2.1.1(@types/node@22.5.5): dependencies: - '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.5 - '@vitest/pretty-format': 2.0.5 - '@vitest/runner': 2.0.5 - '@vitest/snapshot': 2.0.5 - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.0(@types/node@22.5.5)) + '@vitest/pretty-format': 2.1.1 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 chai: 5.1.1 - debug: 4.3.6 - execa: 8.0.1 + debug: 4.3.7 magic-string: 0.30.11 pathe: 1.1.2 std-env: 3.7.0 tinybench: 2.9.0 + tinyexec: 0.3.0 tinypool: 1.0.0 tinyrainbow: 1.2.0 - vite: 5.4.0(@types/node@22.5.4) - vite-node: 2.0.5(@types/node@22.5.4) + vite: 5.4.0(@types/node@22.5.5) + vite-node: 2.1.1(@types/node@22.5.5) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 transitivePeerDependencies: - less - lightningcss + - msw - sass - sass-embedded - stylus diff --git a/turbo.json b/turbo.json index e40e66e..897923d 100644 --- a/turbo.json +++ b/turbo.json @@ -5,31 +5,26 @@ "biome.json", "packages/tsconfig/**" ], - "ui": "tui", "tasks": { + "build:dev": {}, "build": { "dependsOn": ["lint", "^build"], "cache": true, "inputs": [ - "packages/backend-errors/**", - "!packages/backend-errors/dist/**", - "apps/backend-api/**", - "!apps/backend-api/dist/**", - "apps/backend/**", - "!apps/backend/.next/**" + "$TURBO_DEFAULT$", + ".env*" ], "outputs": ["dist/**", ".next/**", "!.next/cache/**"] }, "typecheck": {}, "lint": {}, "test": { - "dependsOn": ["@internal/backend-errors#build"], + "dependsOn": ["@internal/backend-errors#build:dev"], "persistent": true, - "interactive": true, "cache": false }, "build:backend": { - "dependsOn": ["@internal/backend#lint","@internal/backend#build"], + "dependsOn": ["@internal/backend#lint","@internal/backend#build:dev"], "cache": true, "inputs": ["apps/backend-api/**", "!apps/backend-api/dist/**"], "outputs": [ @@ -40,17 +35,12 @@ "generate:sdk": { "dependsOn": [ "build:backend", - "@internal/backend-client#build" + "@internal/backend-client#build:dev" ], - "cache": true, - "inputs": [ - "apps/backend-api/dist/api/**", - "packages/backend-client/openapi.yml" - ], - "outputs": ["packages/backend-client/dist/**"] + "cache": true }, "dev": { - "dependsOn": ["@internal/backend-errors#build"], + "dependsOn": ["build:dev"], "cache": false, "persistent": true },