From e77b9bb3d27324a8822c54e2556d7461f4eb5459 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Thu, 30 Apr 2026 18:28:32 +0200 Subject: [PATCH 001/116] ci: support releases on next branch (#5599) Co-authored-by: Copilot --- .github/workflows/deployment-docker-image.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/deployment-docker-image.yml b/.github/workflows/deployment-docker-image.yml index cec31c489..12d3025cd 100644 --- a/.github/workflows/deployment-docker-image.yml +++ b/.github/workflows/deployment-docker-image.yml @@ -5,6 +5,7 @@ on: branches: - main - beta + - next - dev workflow_dispatch: inputs: @@ -34,7 +35,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 env: - SKIP_RELEASE: ${{ github.event_name == 'workflow_dispatch' || github.ref_name == 'dev' }} + SKIP_RELEASE: ${{ github.event_name == 'workflow_dispatch' || github.ref_name == 'dev' || github.ref_name == 'next' }} outputs: version: ${{ steps.read-semver.outputs.version || steps.version-fallback.outputs.version }} git_ref: ${{ steps.read-git-ref.outputs.ref || github.ref }} @@ -54,7 +55,7 @@ jobs: with: private-key: ${{ secrets.RENOVATE_MERGE_PRIVATE_KEY }} app-id: ${{ secrets.RENOVATE_MERGE_APP_ID }} - permission-contents: write # required to commit package.json & changelog changes, merge them to dev and publish the release + permission-contents: write # required to commit package.json & changelog changes, merge them to dev / next and publish the release - uses: actions/checkout@v6 if: env.SKIP_RELEASE == 'false' @@ -95,20 +96,21 @@ jobs: id: read-git-ref run: | echo "ref=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" - - name: Update dev branch + - name: Update dev / next branch if: env.SKIP_RELEASE == 'false' continue-on-error: true # Prevent pipeline from failing when merge fails env: GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }} + UPSTREAM_BRANCH: ${{ github.ref_name == 'main' && 'dev' || 'next' }} run: | git config user.name "Releases Homarr" git config user.email "175486441+homarr-releases[bot]@users.noreply.github.com" git remote set-url origin https://x-access-token:${{ steps.obtainToken.outputs.token }}@github.com/${{ github.repository }}.git - git fetch origin dev - git checkout dev - git pull origin dev + git fetch origin ${{ env.UPSTREAM_BRANCH }} + git checkout ${{ env.UPSTREAM_BRANCH }} + git pull origin ${{ env.UPSTREAM_BRANCH }} git rebase ${{ github.ref_name }} - git push origin dev + git push origin ${{ env.UPSTREAM_BRANCH }} build-amd64: name: Build docker image for amd64 needs: release From ed6680ba6a42864185818eb8d90b2303846c1761 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 1 May 2026 16:21:22 +0200 Subject: [PATCH 002/116] perf(icons): updater takes 10 seconds to run with high cpu usage (#5608) --- packages/common/src/stopwatch.ts | 4 + packages/cron-jobs/src/jobs/icons-updater.ts | 86 +++++++++----------- packages/db/package.json | 2 + 3 files changed, 45 insertions(+), 47 deletions(-) diff --git a/packages/common/src/stopwatch.ts b/packages/common/src/stopwatch.ts index 33693631c..c58697083 100644 --- a/packages/common/src/stopwatch.ts +++ b/packages/common/src/stopwatch.ts @@ -41,6 +41,10 @@ export class Stopwatch { return dayjs().millisecond(this.startTime).fromNow(true); } + getElapsedInFormattedMilliseconds() { + return `${this.getElapsedInMilliseconds().toFixed(0)}ms`; + } + getElapsedInMilliseconds() { return performance.now() - this.startTime; } diff --git a/packages/cron-jobs/src/jobs/icons-updater.ts b/packages/cron-jobs/src/jobs/icons-updater.ts index b48c26ea6..cc33727b8 100644 --- a/packages/cron-jobs/src/jobs/icons-updater.ts +++ b/packages/cron-jobs/src/jobs/icons-updater.ts @@ -1,9 +1,12 @@ +import type { MySqlRawQueryResult } from "drizzle-orm/mysql2"; +import type { QueryResult } from "pg"; + import { createId, splitToNChunks, Stopwatch } from "@homarr/common"; import { env } from "@homarr/common/env"; import { createLogger } from "@homarr/core/infrastructure/logs"; import { EVERY_WEEK } from "@homarr/cron-jobs-core/expressions"; import type { InferInsertModel } from "@homarr/db"; -import { db, handleTransactionsAsync, inArray, sql } from "@homarr/db"; +import { and, db, eq, handleTransactionsAsync, inArray, notInArray, or } from "@homarr/db"; import { iconRepositories, icons } from "@homarr/db/schema"; import { fetchIconsAsync } from "@homarr/icons"; @@ -26,7 +29,7 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { logger.info("Fetched icons from repositories", { repositoryCount: repositoryIconGroups.length, iconCount: countIcons, - duration: stopWatch.getElapsedInHumanWords(), + duration: stopWatch.getElapsedInFormattedMilliseconds(), }); const databaseIconRepositories = await db.query.iconRepositories.findMany({ @@ -35,7 +38,7 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { }, }); - const skippedChecksums: `${string}.${string}`[] = []; + const skippedChecksums = new Map(); let countDeleted = 0; let countInserted = 0; @@ -50,6 +53,7 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { if (!repositoryIconGroup.success) { continue; } + const localSkippedChecksums: string[] = []; const repositoryInDb = databaseIconRepositories.find( (dbIconGroup) => dbIconGroup.slug === repositoryIconGroup.slug, @@ -66,7 +70,7 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { for (const icon of repositoryIconGroup.icons) { if (dbIconsInRepository.some((dbIcon) => dbIcon.checksum === icon.checksum)) { - skippedChecksums.push(`${iconRepositoryId}.${icon.checksum}`); + localSkippedChecksums.push(icon.checksum); continue; } @@ -79,38 +83,28 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { }); countInserted++; } - } - const deadIcons = allDbIcons.filter( - (icon) => !skippedChecksums.includes(`${icon.iconRepositoryId}.${icon.checksum}`), - ); + skippedChecksums.set(iconRepositoryId, localSkippedChecksums); + } const deadIconRepositories = databaseIconRepositories.filter( (iconRepository) => !repositoryIconGroups.some((group) => group.slug === iconRepository.slug), ); + const deadIconsFilter = or( + ...[...skippedChecksums.entries()].map(([iconRepositoryId, checksums]) => + and(eq(icons.iconRepositoryId, iconRepositoryId), notInArray(icons.checksum, checksums)), + ), + ); + await handleTransactionsAsync(db, { async handleAsync(db, schema) { await db.transaction(async (transaction) => { - if (newIconRepositories.length >= 1) { - await transaction.insert(schema.iconRepositories).values(newIconRepositories); - } + const result = (await transaction.delete(schema.icons).where(deadIconsFilter)) as + | MySqlRawQueryResult + | QueryResult; - if (newIcons.length >= 1) { - // We only insert 5000 icons at a time to avoid SQLite limitations - for (const chunck of splitToNChunks(newIcons, Math.ceil(newIcons.length / 5000))) { - await transaction.insert(schema.icons).values(chunck); - } - } - if (deadIcons.length >= 1) { - await transaction.delete(schema.icons).where( - inArray( - // Combine iconRepositoryId and checksum to allow same icons on different repositories - sql`concat(${icons.iconRepositoryId}, '.', ${icons.checksum})`, - deadIcons.map((icon) => `${icon.iconRepositoryId}.${icon.checksum}`), - ), - ); - } + countDeleted += Array.isArray(result) ? result[0].affectedRows : (result.rowCount ?? 0); if (deadIconRepositories.length >= 1) { await transaction.delete(schema.iconRepositories).where( @@ -121,33 +115,22 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { ); } - countDeleted += deadIcons.length; - }); - }, - handleSync() { - db.transaction((transaction) => { if (newIconRepositories.length >= 1) { - transaction.insert(iconRepositories).values(newIconRepositories).run(); + await transaction.insert(schema.iconRepositories).values(newIconRepositories); } if (newIcons.length >= 1) { // We only insert 5000 icons at a time to avoid SQLite limitations for (const chunck of splitToNChunks(newIcons, Math.ceil(newIcons.length / 5000))) { - transaction.insert(icons).values(chunck).run(); + await transaction.insert(schema.icons).values(chunck); } } - if (deadIcons.length >= 1) { - transaction - .delete(icons) - .where( - inArray( - // Combine iconRepositoryId and checksum to allow same icons on different repositories - sql`concat(${icons.iconRepositoryId}, '.', ${icons.checksum})`, - deadIcons.map((icon) => `${icon.iconRepositoryId}.${icon.checksum}`), - ), - ) - .run(); - } + }); + }, + handleSync() { + db.transaction((transaction) => { + const result = transaction.delete(icons).where(deadIconsFilter).run(); + countDeleted += result.changes; if (deadIconRepositories.length >= 1) { transaction @@ -161,13 +144,22 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, { .run(); } - countDeleted += deadIcons.length; + if (newIconRepositories.length >= 1) { + transaction.insert(iconRepositories).values(newIconRepositories).run(); + } + + if (newIcons.length >= 1) { + // We only insert 5000 icons at a time to avoid SQLite limitations + for (const chunck of splitToNChunks(newIcons, Math.ceil(newIcons.length / 5000))) { + transaction.insert(icons).values(chunck).run(); + } + } }); }, }); logger.info("Updated icons in database", { - duration: stopWatch.getElapsedInHumanWords(), + duration: stopWatch.getElapsedInFormattedMilliseconds(), added: countInserted, deleted: countDeleted, }); diff --git a/packages/db/package.json b/packages/db/package.json index 2dd2b1070..6e6c4851d 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -37,6 +37,8 @@ "push:sqlite": "pnpm with-env drizzle-kit push --config ./configs/sqlite.config.ts", "seed": "pnpm with-env tsx ./migrations/run-seed.ts", "studio": "pnpm with-env drizzle-kit studio --config ./configs/sqlite.config.ts", + "studio:mysql": "pnpm with-env drizzle-kit studio --config ./configs/mysql.config.ts", + "studio:postgresql": "pnpm with-env drizzle-kit studio --config ./configs/postgresql.config.ts", "typecheck": "tsc --noEmit", "with-env": "dotenv -e ../../.env --" }, From e8edc203b6c862141668b043ef4232c22b8fae24 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 1 May 2026 16:21:38 +0200 Subject: [PATCH 003/116] fix: migrate from node-cron to croner (#5407) --- apps/tasks/package.json | 1 + apps/tasks/src/job-manager.ts | 39 ++++++++----- packages/api/src/router/cron-jobs.ts | 4 +- packages/cron-job-api/package.json | 2 - packages/cron-job-api/src/index.ts | 13 ++--- packages/cron-jobs-core/package.json | 3 +- packages/cron-jobs-core/src/creator.ts | 23 ++++---- packages/cron-jobs-core/src/group.ts | 22 ++++---- pnpm-lock.yaml | 78 ++++++-------------------- pnpm-workspace.yaml | 3 +- 10 files changed, 72 insertions(+), 116 deletions(-) diff --git a/apps/tasks/package.json b/apps/tasks/package.json index 3cb918df5..fc1f9c50b 100644 --- a/apps/tasks/package.json +++ b/apps/tasks/package.json @@ -37,6 +37,7 @@ "@homarr/server-settings": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0", + "croner": "catalog:", "dayjs": "catalog:", "dotenv": "catalog:", "fastify": "catalog:", diff --git a/apps/tasks/src/job-manager.ts b/apps/tasks/src/job-manager.ts index f4ec8bf97..6ba3d637e 100644 --- a/apps/tasks/src/job-manager.ts +++ b/apps/tasks/src/job-manager.ts @@ -1,4 +1,4 @@ -import { schedule, validate as validateCron } from "node-cron"; +import { Cron } from "croner"; import { createLogger } from "@homarr/core/infrastructure/logs"; import type { IJobManager } from "@homarr/cron-job-api"; @@ -21,28 +21,31 @@ export class JobManager implements IJobManager { public async triggerAsync(name: JobGroupKeys): Promise { await this.jobGroup.runManuallyAsync(name); } - public async stopAsync(name: JobGroupKeys): Promise { - await this.jobGroup.stopAsync(name); + public stop(name: JobGroupKeys): void { + this.jobGroup.stop(name); } public async updateIntervalAsync(name: JobGroupKeys, cron: string): Promise { logger.info("Updating cron job interval", { name, expression: cron }); const job = this.jobGroup.getJobRegistry().get(name); if (!job) throw new Error(`Job ${name} not found`); - if (!validateCron(cron)) { - throw new Error(`Invalid cron expression: ${cron}`); - } if (job.preventCustomInterval && cron !== job.cronExpression) { throw new Error(`Custom cron expressions are not allowed for job ${name}`); } - await this.updateConfigurationAsync(name, { cronExpression: cron }); - await this.jobGroup.getTask(name)?.destroy(); + const updatedConfig = await this.updateConfigurationAsync(name, { cronExpression: cron }); + this.jobGroup.getTask(name)?.stop(); this.jobGroup.setTask( name, - schedule(cron, () => void job.executeAsync(), { - name, - }), + new Cron( + cron, + { + name, + timezone: job.timezone, + paused: !updatedConfig.isEnabled, + }, + () => void job.executeAsync(), + ), ); logger.info("Cron job interval updated", { name, expression: cron }); } @@ -52,7 +55,7 @@ export class JobManager implements IJobManager { if (!job) throw new Error(`Job ${name} not found`); await this.updateConfigurationAsync(name, { isEnabled: false }); - await this.jobGroup.stopAsync(name); + this.jobGroup.stop(name); logger.info("Cron job disabled", { name }); } public async enableAsync(name: JobGroupKeys): Promise { @@ -86,21 +89,27 @@ export class JobManager implements IJobManager { name, configuration: JSON.stringify(configuration), }); - return; + return { + name, + cronExpression: configuration.cronExpression ?? existingConfig.cronExpression, + isEnabled: configuration.isEnabled ?? existingConfig.isEnabled, + }; } const job = this.jobGroup.getJobRegistry().get(name); if (!job) throw new Error(`Job ${name} not found`); - await this.db.insert(cronJobConfigurations).values({ + const updatedConfig = { name, cronExpression: configuration.cronExpression ?? job.cronExpression, isEnabled: configuration.isEnabled ?? true, - }); + }; + await this.db.insert(cronJobConfigurations).values(updatedConfig); logger.debug("Cron job configuration updated", { name, configuration: JSON.stringify(configuration), }); + return updatedConfig; } public async getAllAsync(): Promise< diff --git a/packages/api/src/router/cron-jobs.ts b/packages/api/src/router/cron-jobs.ts index 5428ac374..14bcb2019 100644 --- a/packages/api/src/router/cron-jobs.ts +++ b/packages/api/src/router/cron-jobs.ts @@ -2,7 +2,7 @@ import { observable } from "@trpc/server/observable"; import z from "zod/v4"; import { createLogger } from "@homarr/core/infrastructure/logs"; -import { cronExpressionSchema, jobGroupKeys, jobNameSchema } from "@homarr/cron-job-api"; +import { jobGroupKeys, jobNameSchema } from "@homarr/cron-job-api"; import { cronJobApi } from "@homarr/cron-job-api/client"; import type { TaskStatus } from "@homarr/cron-job-status"; import { createCronJobStatusChannel } from "@homarr/cron-job-status"; @@ -35,7 +35,7 @@ export const cronJobsRouter = createTRPCRouter({ .input( z.object({ name: jobNameSchema, - cron: cronExpressionSchema, + cron: z.string(), }), ) .mutation(async ({ input }) => { diff --git a/packages/cron-job-api/package.json b/packages/cron-job-api/package.json index 09bde876b..db59b1326 100644 --- a/packages/cron-job-api/package.json +++ b/packages/cron-job-api/package.json @@ -32,7 +32,6 @@ "@trpc/client": "catalog:", "@trpc/server": "catalog:", "@trpc/tanstack-react-query": "catalog:", - "node-cron": "catalog:", "react": "catalog:", "zod": "catalog:" }, @@ -40,7 +39,6 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "@types/node-cron": "catalog:", "@types/react": "catalog:", "eslint": "catalog:", "typescript": "catalog:" diff --git a/packages/cron-job-api/src/index.ts b/packages/cron-job-api/src/index.ts index 270a51242..220e70d68 100644 --- a/packages/cron-job-api/src/index.ts +++ b/packages/cron-job-api/src/index.ts @@ -1,5 +1,4 @@ import { initTRPC, TRPCError } from "@trpc/server"; -import { validate } from "node-cron"; import { z } from "zod/v4"; import type { JobGroupKeys } from "@homarr/cron-jobs"; @@ -13,7 +12,7 @@ export const jobNameSchema = z.enum(jobGroup.getKeys()); export interface IJobManager { startAsync(name: JobGroupKeys): Promise; triggerAsync(name: JobGroupKeys): Promise; - stopAsync(name: JobGroupKeys): Promise; + stop(name: JobGroupKeys): void; updateIntervalAsync(name: JobGroupKeys, cron: string): Promise; disableAsync(name: JobGroupKeys): Promise; enableAsync(name: JobGroupKeys): Promise; @@ -52,10 +51,6 @@ const apiKeyProcedure = t.procedure.use(({ ctx, next }) => { }); }); -export const cronExpressionSchema = z.string().refine((expression) => validate(expression), { - error: "Invalid cron expression", -}); - export const jobRouter = createTrpcRouter({ start: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { await ctx.manager.startAsync(input); @@ -63,14 +58,14 @@ export const jobRouter = createTrpcRouter({ trigger: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { await ctx.manager.triggerAsync(input); }), - stop: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.stopAsync(input); + stop: apiKeyProcedure.input(jobNameSchema).mutation(({ input, ctx }) => { + ctx.manager.stop(input); }), updateInterval: apiKeyProcedure .input( z.object({ name: jobNameSchema, - cron: cronExpressionSchema, + cron: z.string(), }), ) .mutation(async ({ input, ctx }) => { diff --git a/packages/cron-jobs-core/package.json b/packages/cron-jobs-core/package.json index 02570d692..71704bdfc 100644 --- a/packages/cron-jobs-core/package.json +++ b/packages/cron-jobs-core/package.json @@ -27,13 +27,12 @@ "@homarr/common": "workspace:^0.1.0", "@homarr/core": "workspace:^", "@homarr/db": "workspace:^0.1.0", - "node-cron": "catalog:" + "croner": "catalog:" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "@types/node-cron": "catalog:", "eslint": "catalog:", "typescript": "catalog:" } diff --git a/packages/cron-jobs-core/src/creator.ts b/packages/cron-jobs-core/src/creator.ts index 4f7a9310f..f693a054e 100644 --- a/packages/cron-jobs-core/src/creator.ts +++ b/packages/cron-jobs-core/src/creator.ts @@ -1,4 +1,4 @@ -import { createTask, validate } from "node-cron"; +import { Cron } from "croner"; import { Stopwatch } from "@homarr/common"; import type { MaybePromise } from "@homarr/common/types"; @@ -83,10 +83,15 @@ const createCallback = void catchingCallbackAsync(), { - name, - timezone: creatorOptions.timezone, - }); + const scheduledTask = new Cron( + cronExpression, + { + name, + timezone: creatorOptions.timezone, + paused: true, + }, + () => void catchingCallbackAsync(), + ); creatorOptions.logger.logDebug("The scheduled task for cron job was created", { name, cronExpression: defaultCronExpression, @@ -116,6 +121,7 @@ const createCallback = ( defaultCronExpression: TExpression, options: CreateCronJobOptions = { runOnStart: false }, ) => { - creatorOptions.logger.logDebug("Validating cron expression for cron job", { - name, - cronExpression: defaultCronExpression, - }); - if (!validate(defaultCronExpression)) { - throw new Error(`Invalid cron expression '${defaultCronExpression}' for job '${name}'`); - } creatorOptions.logger.logDebug("Cron job expression for cron job is valid", { name, cronExpression: defaultCronExpression, diff --git a/packages/cron-jobs-core/src/group.ts b/packages/cron-jobs-core/src/group.ts index 77cd6057d..cfb024a9a 100644 --- a/packages/cron-jobs-core/src/group.ts +++ b/packages/cron-jobs-core/src/group.ts @@ -1,4 +1,4 @@ -import type { ScheduledTask } from "node-cron"; +import type { Cron } from "croner"; import { objectEntries, objectKeys } from "@homarr/common"; import { db } from "@homarr/db"; @@ -34,7 +34,7 @@ export const createJobGroupCreator = ( }); } - const tasks = new Map(); + const tasks = new Map(); return { initializeAsync: async () => { @@ -62,7 +62,7 @@ export const createJobGroupCreator = ( name: job.name, }); await job.onStartAsync(); - await tasks.get(name as string)?.start(); + tasks.get(name as string)?.resume(); }, startAllAsync: async () => { for (const job of jobRegistry.values()) { @@ -74,7 +74,7 @@ export const createJobGroupCreator = ( name: job.name, }); await job.onStartAsync(); - await tasks.get(job.name)?.start(); + tasks.get(job.name)?.resume(); } }, runManuallyAsync: async (name: keyof TJobs) => { @@ -87,23 +87,23 @@ export const createJobGroupCreator = ( options.logger.logInfo("Running schedule cron job manually.", { name: job.name, }); - await tasks.get(name as string)?.execute(); + await tasks.get(name as string)?.trigger(); }, - stopAsync: async (name: keyof TJobs) => { + stop: (name: keyof TJobs) => { const job = jobRegistry.get(name as string); if (!job) return; options.logger.logInfo("Stopping schedule of cron job.", { name: job.name, }); - await tasks.get(name as string)?.stop(); + tasks.get(name as string)?.pause(); }, - stopAllAsync: async () => { + stopAll: () => { for (const job of jobRegistry.values()) { options.logger.logInfo("Stopping schedule of cron job.", { name: job.name, }); - await tasks.get(job.name)?.stop(); + tasks.get(job.name)?.pause(); } }, getJobRegistry() { @@ -112,8 +112,8 @@ export const createJobGroupCreator = ( getTask(name: keyof TJobs) { return tasks.get(name as string) ?? null; }, - setTask(name: keyof TJobs, task: ScheduledTask) { - tasks.set(name as string, task); + setTask(name: keyof TJobs, cron: Cron) { + tasks.set(name as string, cron); }, getKeys() { return objectKeys(jobs); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1284a9dc2..fe7c71537 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -240,9 +240,6 @@ catalogs: '@types/node': specifier: ^24.12.2 version: 24.12.2 - '@types/node-cron': - specifier: ^3.0.11 - version: 3.0.11 '@types/node-unifi': specifier: ^2.5.1 version: 2.5.1 @@ -321,6 +318,9 @@ catalogs: cookies: specifier: ^0.9.1 version: 0.9.1 + croner: + specifier: 10.0.1 + version: 10.0.1 cross-env: specifier: ^10.1.0 version: 10.1.0 @@ -435,9 +435,6 @@ catalogs: next-intl: specifier: 4.9.1 version: 4.9.1 - node-cron: - specifier: ^4.2.1 - version: 4.2.1 node-loader: specifier: ^2.1.0 version: 2.1.0 @@ -986,6 +983,9 @@ importers: '@homarr/widgets': specifier: workspace:^0.1.0 version: link:../../packages/widgets + croner: + specifier: 'catalog:' + version: 10.0.1 dayjs: specifier: 'catalog:' version: 1.11.20 @@ -1526,9 +1526,6 @@ importers: '@trpc/tanstack-react-query': specifier: 'catalog:' version: 11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) - node-cron: - specifier: 'catalog:' - version: 4.2.1 react: specifier: 'catalog:' version: 19.2.5 @@ -1545,9 +1542,6 @@ importers: '@homarr/tsconfig': specifier: workspace:^0.1.0 version: link:../../tooling/typescript - '@types/node-cron': - specifier: 'catalog:' - version: 3.0.11 '@types/react': specifier: 'catalog:' version: 19.2.14 @@ -1661,9 +1655,9 @@ importers: '@homarr/db': specifier: workspace:^0.1.0 version: link:../db - node-cron: + croner: specifier: 'catalog:' - version: 4.2.1 + version: 10.0.1 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1674,9 +1668,6 @@ importers: '@homarr/tsconfig': specifier: workspace:^0.1.0 version: link:../../tooling/typescript - '@types/node-cron': - specifier: 'catalog:' - version: 3.0.11 eslint: specifier: 'catalog:' version: 9.39.4 @@ -4383,7 +4374,6 @@ packages: '@million/lint@1.0.14': resolution: {integrity: sha512-u6/kglVwZRu5+GMmtkNlGLqJVkgTl0TtM+hLa9rBg7pldx+5NG5bk45NvL37uZmAr2Xfa1C6qHb7GrFwfP372g==} - deprecated: This package is no longer maintained hasBin: true '@ndaidong/bellajs@12.0.1': @@ -5688,9 +5678,6 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node-cron@3.0.11': - resolution: {integrity: sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==} - '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} @@ -6635,6 +6622,10 @@ packages: resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} engines: {node: '>= 14'} + croner@10.0.1: + resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} + engines: {node: '>=18.0'} + cross-env@10.1.0: resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} engines: {node: '>=20'} @@ -6886,9 +6877,6 @@ packages: dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - dompurify@3.3.3: - resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} - dompurify@3.4.1: resolution: {integrity: sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==} @@ -7403,10 +7391,6 @@ packages: fast-xml-builder@1.1.5: resolution: {integrity: sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==} - fast-xml-parser@5.7.1: - resolution: {integrity: sha512-8Cc3f8GUGUULg34pBch/KGyPLglS+OFs05deyOlY7fL2MTagYPKrVQNmR1fLF/yJ9PH5ZSTd3YDF6pnmeZU+zA==} - hasBin: true - fast-xml-parser@5.7.2: resolution: {integrity: sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==} hasBin: true @@ -7503,15 +7487,6 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -8793,10 +8768,6 @@ packages: resolution: {integrity: sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==} engines: {node: ^18 || ^20 || >= 21} - node-cron@4.2.1: - resolution: {integrity: sha512-lgimEHPE/QDgFlywTd8yTR61ptugX3Qer29efeyWw2rv259HtGBNn1vZVmp8lB9uo9wC0t/AT4iGqXxia+CJFg==} - engines: {node: '>=6.0.0'} - node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -11867,7 +11838,7 @@ snapshots: dependencies: '@ndaidong/bellajs': 12.0.1 cross-fetch: 4.1.0 - fast-xml-parser: 5.7.1 + fast-xml-parser: 5.7.2 html-entities: 2.6.0 transitivePeerDependencies: - encoding @@ -14021,8 +13992,6 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node-cron@3.0.11': {} - '@types/node-fetch@2.6.13': dependencies: '@types/node': 24.12.2 @@ -14675,7 +14644,7 @@ snapshots: axios@1.9.0: dependencies: - follow-redirects: 1.15.9 + follow-redirects: 1.16.0 form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -15103,6 +15072,8 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.5.2 + croner@10.0.1: {} + cross-env@10.1.0: dependencies: '@epic-web/invariant': 1.0.0 @@ -15340,10 +15311,6 @@ snapshots: dom-walk@0.1.2: {} - dompurify@3.3.3: - optionalDependencies: - '@types/trusted-types': 2.0.7 - dompurify@3.4.1: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -15991,13 +15958,6 @@ snapshots: dependencies: path-expression-matcher: 1.5.0 - fast-xml-parser@5.7.1: - dependencies: - '@nodable/entities': 2.1.0 - fast-xml-builder: 1.1.5 - path-expression-matcher: 1.5.0 - strnum: 2.2.3 - fast-xml-parser@5.7.2: dependencies: '@nodable/entities': 2.1.0 @@ -16102,8 +16062,6 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.9: {} - follow-redirects@1.16.0: {} for-each@0.3.5: @@ -17512,8 +17470,6 @@ snapshots: node-addon-api@8.3.1: {} - node-cron@4.2.1: {} - node-domexception@1.0.0: {} node-emoji@2.2.0: @@ -19220,7 +19176,7 @@ snapshots: classnames: 2.5.1 css.escape: 1.5.1 deep-extend: 0.6.0 - dompurify: 3.3.3 + dompurify: 3.4.1 ieee754: 1.2.1 immutable: 3.8.2 js-file-download: 0.4.12 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 869cf5397..e70b39a68 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -86,7 +86,6 @@ catalog: "@types/css-modules": ^1.0.5 "@types/dockerode": ^4.0.1 "@types/node": ^24.12.2 - "@types/node-cron": ^3.0.11 "@types/node-unifi": ^2.5.1 "@types/pg": ^8.20.0 "@types/prismjs": ^1.26.6 @@ -113,6 +112,7 @@ catalog: conventional-changelog-conventionalcommits: ^9.3.1 cookie: 1.1.1 cookies: ^0.9.1 + croner: 10.0.1 cross-env: ^10.1.0 crypto-js: ^4.2.0 dayjs: ^1.11.20 @@ -151,7 +151,6 @@ catalog: next: 16.2.4 next-auth: 5.0.0-beta.31 next-intl: 4.9.1 - node-cron: ^4.2.1 node-loader: ^2.1.0 octokit: ^5.0.5 pg: ^8.20.0 From e9289bd174ee3295e668b6c01fed819a48d133d1 Mon Sep 17 00:00:00 2001 From: "homarr-update-contributors[bot]" <210161987+homarr-update-contributors[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 14:25:59 +0000 Subject: [PATCH 004/116] chore: update contributors (#5609) Co-authored-by: Homarr Update Contributors <210161987+homarr-update-contributors[bot]@users.noreply.github.com> --- static-data/contributors.json | 2 +- static-data/translators.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/static-data/contributors.json b/static-data/contributors.json index 79bf72e01..5db83ab61 100644 --- a/static-data/contributors.json +++ b/static-data/contributors.json @@ -1 +1 @@ -[{"login":"ajnart","avatar_url":"https://avatars.githubusercontent.com/u/49837342?v=4"},{"login":"manuel-rw","avatar_url":"https://avatars.githubusercontent.com/u/30572287?v=4"},{"login":"Meierschlumpf","avatar_url":"https://avatars.githubusercontent.com/u/63781622?v=4"},{"login":"SeDemal","avatar_url":"https://avatars.githubusercontent.com/u/26098587?v=4"},{"login":"lammersbjorn","avatar_url":"https://avatars.githubusercontent.com/u/71191962?v=4"},{"login":"LarveyOfficial","avatar_url":"https://avatars.githubusercontent.com/u/39219859?v=4"},{"login":"c00ldude1oo","avatar_url":"https://avatars.githubusercontent.com/u/15677803?v=4"},{"login":"InterN0te","avatar_url":"https://avatars.githubusercontent.com/u/10882916?v=4"},{"login":"Aimsucks","avatar_url":"https://avatars.githubusercontent.com/u/1828486?v=4"},{"login":"JannesV","avatar_url":"https://avatars.githubusercontent.com/u/5984244?v=4"},{"login":"MauriceNino","avatar_url":"https://avatars.githubusercontent.com/u/18658092?v=4"},{"login":"hillaliy","avatar_url":"https://avatars.githubusercontent.com/u/950010?v=4"},{"login":"Skeeww","avatar_url":"https://avatars.githubusercontent.com/u/9639992?v=4"},{"login":"RichyHBM","avatar_url":"https://avatars.githubusercontent.com/u/5472275?v=4"},{"login":"Bonfire","avatar_url":"https://avatars.githubusercontent.com/u/5704760?v=4"},{"login":"wieli99","avatar_url":"https://avatars.githubusercontent.com/u/46794825?v=4"},{"login":"ishaanparlikar","avatar_url":"https://avatars.githubusercontent.com/u/43013132?v=4"},{"login":"Zareix","avatar_url":"https://avatars.githubusercontent.com/u/29818713?v=4"},{"login":"tuggan","avatar_url":"https://avatars.githubusercontent.com/u/4325608?v=4"},{"login":"Spillebulle","avatar_url":"https://avatars.githubusercontent.com/u/46653946?v=4"},{"login":"tancak","avatar_url":"https://avatars.githubusercontent.com/u/11760749?v=4"},{"login":"spkesDE","avatar_url":"https://avatars.githubusercontent.com/u/1682314?v=4"},{"login":"j3lte","avatar_url":"https://avatars.githubusercontent.com/u/2557568?v=4"},{"login":"dslatt","avatar_url":"https://avatars.githubusercontent.com/u/5211001?v=4"},{"login":"Malong11-007","avatar_url":"https://avatars.githubusercontent.com/u/40298510?v=4"},{"login":"StefanB7","avatar_url":"https://avatars.githubusercontent.com/u/22056509?v=4"},{"login":"souravghosh01","avatar_url":"https://avatars.githubusercontent.com/u/37548139?v=4"},{"login":"SR3u","avatar_url":"https://avatars.githubusercontent.com/u/2380522?v=4"},{"login":"Rikpat","avatar_url":"https://avatars.githubusercontent.com/u/33869814?v=4"},{"login":"NormanJS","avatar_url":"https://avatars.githubusercontent.com/u/83409549?v=4"},{"login":"No-Maines-Land","avatar_url":"https://avatars.githubusercontent.com/u/20687725?v=4"},{"login":"stark1tty","avatar_url":"https://avatars.githubusercontent.com/u/69326376?v=4"},{"login":"Momcilo42","avatar_url":"https://avatars.githubusercontent.com/u/10118137?v=4"},{"login":"marius-arch","avatar_url":"https://avatars.githubusercontent.com/u/72494359?v=4"},{"login":"Lumilias","avatar_url":"https://avatars.githubusercontent.com/u/10852161?v=4"},{"login":"Havock94","avatar_url":"https://avatars.githubusercontent.com/u/7635248?v=4"},{"login":"Lollyde","avatar_url":"https://avatars.githubusercontent.com/u/11347524?v=4"},{"login":"krishnamuppaneni","avatar_url":"https://avatars.githubusercontent.com/u/4703366?v=4"},{"login":"devtobi","avatar_url":"https://avatars.githubusercontent.com/u/28538704?v=4"},{"login":"TyxTang","avatar_url":"https://avatars.githubusercontent.com/u/90897955?v=4"},{"login":"alotlikebeans","avatar_url":"https://avatars.githubusercontent.com/u/19630511?v=4"},{"login":"WillyJL","avatar_url":"https://avatars.githubusercontent.com/u/49810075?v=4"},{"login":"anonysoul","avatar_url":"https://avatars.githubusercontent.com/u/105715150?v=4"},{"login":"cospeedster","avatar_url":"https://avatars.githubusercontent.com/u/52749645?v=4"},{"login":"diederbert","avatar_url":"https://avatars.githubusercontent.com/u/162878798?v=4"},{"login":"digdilem","avatar_url":"https://avatars.githubusercontent.com/u/4052275?v=4"},{"login":"dinghino","avatar_url":"https://avatars.githubusercontent.com/u/14729459?v=4"},{"login":"gfomichev","avatar_url":"https://avatars.githubusercontent.com/u/1596146?v=4"},{"login":"gnattu","avatar_url":"https://avatars.githubusercontent.com/u/12995396?v=4"},{"login":"tuxpizza","avatar_url":"https://avatars.githubusercontent.com/u/84710786?v=4"},{"login":"xmarkurion","avatar_url":"https://avatars.githubusercontent.com/u/46654687?v=4"},{"login":"huanga","avatar_url":"https://avatars.githubusercontent.com/u/732970?v=4"},{"login":"taos15","avatar_url":"https://avatars.githubusercontent.com/u/122130728?v=4"},{"login":"arghyadipchak","avatar_url":"https://avatars.githubusercontent.com/u/32430374?v=4"},{"login":"AuthorShin","avatar_url":"https://avatars.githubusercontent.com/u/4959043?v=4"},{"login":"benniblot","avatar_url":"https://avatars.githubusercontent.com/u/47495914?v=4"},{"login":"bebsworthy","avatar_url":"https://avatars.githubusercontent.com/u/5266759?v=4"},{"login":"catrielmuller","avatar_url":"https://avatars.githubusercontent.com/u/2272323?v=4"},{"login":"Vysp3r","avatar_url":"https://avatars.githubusercontent.com/u/62019735?v=4"},{"login":"DR-Blogs","avatar_url":"https://avatars.githubusercontent.com/u/96393186?v=4"},{"login":"singular0","avatar_url":"https://avatars.githubusercontent.com/u/1925883?v=4"},{"login":"diogovalentte","avatar_url":"https://avatars.githubusercontent.com/u/49578155?v=4"},{"login":"codezninja","avatar_url":"https://avatars.githubusercontent.com/u/4400773?v=4"},{"login":"fabricionaweb","avatar_url":"https://avatars.githubusercontent.com/u/15933?v=4"},{"login":"nyok1912","avatar_url":"https://avatars.githubusercontent.com/u/32163949?v=4"},{"login":"bo3bdo","avatar_url":"https://avatars.githubusercontent.com/u/5271380?v=4"},{"login":"hskrtich","avatar_url":"https://avatars.githubusercontent.com/u/1214484?v=4"},{"login":"ishults","avatar_url":"https://avatars.githubusercontent.com/u/7275442?v=4"},{"login":"jelliuk","avatar_url":"https://avatars.githubusercontent.com/u/4790959?v=4"},{"login":"Moohan","avatar_url":"https://avatars.githubusercontent.com/u/5982260?v=4"},{"login":"tesar-tech","avatar_url":"https://avatars.githubusercontent.com/u/33880579?v=4"},{"login":"jbruell","avatar_url":"https://avatars.githubusercontent.com/u/31685172?v=4"},{"login":"JasonLeeB06","avatar_url":"https://avatars.githubusercontent.com/u/82266978?v=4"},{"login":"jeffersonraimon","avatar_url":"https://avatars.githubusercontent.com/u/80064475?v=4"},{"login":"jo-chemla","avatar_url":"https://avatars.githubusercontent.com/u/16822841?v=4"},{"login":"joser93","avatar_url":"https://avatars.githubusercontent.com/u/6912089?v=4"},{"login":"justijndepover","avatar_url":"https://avatars.githubusercontent.com/u/9008623?v=4"},{"login":"Aandree5","avatar_url":"https://avatars.githubusercontent.com/u/32734153?v=4"},{"login":"jackwellerreal","avatar_url":"https://avatars.githubusercontent.com/u/97435840?v=4"},{"login":"SergioChan","avatar_url":"https://avatars.githubusercontent.com/u/10103766?v=4"},{"login":"toineenzo","avatar_url":"https://avatars.githubusercontent.com/u/4921397?v=4"},{"login":"oben01","avatar_url":"https://avatars.githubusercontent.com/u/22369027?v=4"},{"login":"rezstje","avatar_url":"https://avatars.githubusercontent.com/u/45420315?v=4"},{"login":"castielwaverly","avatar_url":"https://avatars.githubusercontent.com/u/137005689?v=4"},{"login":"xoxyuxu","avatar_url":"https://avatars.githubusercontent.com/u/3543416?v=4"},{"login":"MaienM","avatar_url":"https://avatars.githubusercontent.com/u/583129?v=4"},{"login":"mvanhorn","avatar_url":"https://avatars.githubusercontent.com/u/455140?v=4"},{"login":"HeapReaper","avatar_url":"https://avatars.githubusercontent.com/u/31496522?v=4"},{"login":"Copilot","avatar_url":"https://avatars.githubusercontent.com/in/1143301?v=4"},{"login":"mairas","avatar_url":"https://avatars.githubusercontent.com/u/407010?v=4"},{"login":"itzTheMeow","avatar_url":"https://avatars.githubusercontent.com/u/50887230?v=4"},{"login":"NicolasNewman","avatar_url":"https://avatars.githubusercontent.com/u/16135852?v=4"},{"login":"NikeLaosClericus","avatar_url":"https://avatars.githubusercontent.com/u/39810627?v=4"},{"login":"noahcroghan","avatar_url":"https://avatars.githubusercontent.com/u/27422774?v=4"},{"login":"ohmzi","avatar_url":"https://avatars.githubusercontent.com/u/6551272?v=4"},{"login":"Rhiz3K","avatar_url":"https://avatars.githubusercontent.com/u/33246262?v=4"},{"login":"saschabuehrle","avatar_url":"https://avatars.githubusercontent.com/u/47737812?v=4"},{"login":"StrandedTurtle","avatar_url":"https://avatars.githubusercontent.com/u/132835255?v=4"},{"login":"CrazyWolf13","avatar_url":"https://avatars.githubusercontent.com/u/96661824?v=4"},{"login":"generalmat82","avatar_url":"https://avatars.githubusercontent.com/u/110256073?v=4"},{"login":"lthomsen","avatar_url":"https://avatars.githubusercontent.com/u/28560325?v=4"},{"login":"pitschi","avatar_url":"https://avatars.githubusercontent.com/u/6841565?v=4"},{"login":"tech62","avatar_url":"https://avatars.githubusercontent.com/u/16237642?v=4"},{"login":"leandroscardua","avatar_url":"https://avatars.githubusercontent.com/u/24698541?v=4"},{"login":"kylegrieder","avatar_url":"https://avatars.githubusercontent.com/u/25424229?v=4"},{"login":"hotrungnhan","avatar_url":"https://avatars.githubusercontent.com/u/40029631?v=4"},{"login":"KelianB","avatar_url":"https://avatars.githubusercontent.com/u/11216155?v=4"},{"login":"Kaotic3","avatar_url":"https://avatars.githubusercontent.com/u/80522225?v=4"},{"login":"frankvHoof93","avatar_url":"https://avatars.githubusercontent.com/u/7346516?v=4"},{"login":"faugusto-oliveira","avatar_url":"https://avatars.githubusercontent.com/u/37384074?v=4"},{"login":"ieugen","avatar_url":"https://avatars.githubusercontent.com/u/1050920?v=4"},{"login":"KartulUdus","avatar_url":"https://avatars.githubusercontent.com/u/23346150?v=4"},{"login":"dgshue","avatar_url":"https://avatars.githubusercontent.com/u/12952156?v=4"},{"login":"DZ945brH","avatar_url":"https://avatars.githubusercontent.com/u/42635243?v=4"},{"login":"Oupsman","avatar_url":"https://avatars.githubusercontent.com/u/11260343?v=4"},{"login":"m0s4ik","avatar_url":"https://avatars.githubusercontent.com/u/26578395?v=4"},{"login":"AartSchinkel","avatar_url":"https://avatars.githubusercontent.com/u/189675191?v=4"}] \ No newline at end of file +[{"login":"ajnart","avatar_url":"https://avatars.githubusercontent.com/u/49837342?v=4"},{"login":"manuel-rw","avatar_url":"https://avatars.githubusercontent.com/u/30572287?v=4"},{"login":"Meierschlumpf","avatar_url":"https://avatars.githubusercontent.com/u/63781622?v=4"},{"login":"SeDemal","avatar_url":"https://avatars.githubusercontent.com/u/26098587?v=4"},{"login":"lammersbjorn","avatar_url":"https://avatars.githubusercontent.com/u/71191962?v=4"},{"login":"LarveyOfficial","avatar_url":"https://avatars.githubusercontent.com/u/39219859?v=4"},{"login":"c00ldude1oo","avatar_url":"https://avatars.githubusercontent.com/u/15677803?v=4"},{"login":"InterN0te","avatar_url":"https://avatars.githubusercontent.com/u/10882916?v=4"},{"login":"Aimsucks","avatar_url":"https://avatars.githubusercontent.com/u/1828486?v=4"},{"login":"JannesV","avatar_url":"https://avatars.githubusercontent.com/u/5984244?v=4"},{"login":"MauriceNino","avatar_url":"https://avatars.githubusercontent.com/u/18658092?v=4"},{"login":"hillaliy","avatar_url":"https://avatars.githubusercontent.com/u/950010?v=4"},{"login":"Skeeww","avatar_url":"https://avatars.githubusercontent.com/u/9639992?v=4"},{"login":"RichyHBM","avatar_url":"https://avatars.githubusercontent.com/u/5472275?v=4"},{"login":"Bonfire","avatar_url":"https://avatars.githubusercontent.com/u/5704760?v=4"},{"login":"wieli99","avatar_url":"https://avatars.githubusercontent.com/u/46794825?v=4"},{"login":"ishaanparlikar","avatar_url":"https://avatars.githubusercontent.com/u/43013132?v=4"},{"login":"Zareix","avatar_url":"https://avatars.githubusercontent.com/u/29818713?v=4"},{"login":"tuggan","avatar_url":"https://avatars.githubusercontent.com/u/4325608?v=4"},{"login":"Spillebulle","avatar_url":"https://avatars.githubusercontent.com/u/46653946?v=4"},{"login":"spkesDE","avatar_url":"https://avatars.githubusercontent.com/u/1682314?v=4"},{"login":"j3lte","avatar_url":"https://avatars.githubusercontent.com/u/2557568?v=4"},{"login":"dslatt","avatar_url":"https://avatars.githubusercontent.com/u/5211001?v=4"},{"login":"Malong11-007","avatar_url":"https://avatars.githubusercontent.com/u/40298510?v=4"},{"login":"StefanB7","avatar_url":"https://avatars.githubusercontent.com/u/22056509?v=4"},{"login":"souravghosh01","avatar_url":"https://avatars.githubusercontent.com/u/37548139?v=4"},{"login":"SR3u","avatar_url":"https://avatars.githubusercontent.com/u/2380522?v=4"},{"login":"Rikpat","avatar_url":"https://avatars.githubusercontent.com/u/33869814?v=4"},{"login":"NormanJS","avatar_url":"https://avatars.githubusercontent.com/u/83409549?v=4"},{"login":"No-Maines-Land","avatar_url":"https://avatars.githubusercontent.com/u/20687725?v=4"},{"login":"stark1tty","avatar_url":"https://avatars.githubusercontent.com/u/69326376?v=4"},{"login":"Momcilo42","avatar_url":"https://avatars.githubusercontent.com/u/10118137?v=4"},{"login":"marius-arch","avatar_url":"https://avatars.githubusercontent.com/u/72494359?v=4"},{"login":"Lumilias","avatar_url":"https://avatars.githubusercontent.com/u/10852161?v=4"},{"login":"Havock94","avatar_url":"https://avatars.githubusercontent.com/u/7635248?v=4"},{"login":"Lollyde","avatar_url":"https://avatars.githubusercontent.com/u/11347524?v=4"},{"login":"krishnamuppaneni","avatar_url":"https://avatars.githubusercontent.com/u/4703366?v=4"},{"login":"devtobi","avatar_url":"https://avatars.githubusercontent.com/u/28538704?v=4"},{"login":"TyxTang","avatar_url":"https://avatars.githubusercontent.com/u/90897955?v=4"},{"login":"alotlikebeans","avatar_url":"https://avatars.githubusercontent.com/u/19630511?v=4"},{"login":"WillyJL","avatar_url":"https://avatars.githubusercontent.com/u/49810075?v=4"},{"login":"anonysoul","avatar_url":"https://avatars.githubusercontent.com/u/105715150?v=4"},{"login":"cospeedster","avatar_url":"https://avatars.githubusercontent.com/u/52749645?v=4"},{"login":"diederbert","avatar_url":"https://avatars.githubusercontent.com/u/162878798?v=4"},{"login":"digdilem","avatar_url":"https://avatars.githubusercontent.com/u/4052275?v=4"},{"login":"dinghino","avatar_url":"https://avatars.githubusercontent.com/u/14729459?v=4"},{"login":"gfomichev","avatar_url":"https://avatars.githubusercontent.com/u/1596146?v=4"},{"login":"gnattu","avatar_url":"https://avatars.githubusercontent.com/u/12995396?v=4"},{"login":"tuxpizza","avatar_url":"https://avatars.githubusercontent.com/u/84710786?v=4"},{"login":"xmarkurion","avatar_url":"https://avatars.githubusercontent.com/u/46654687?v=4"},{"login":"huanga","avatar_url":"https://avatars.githubusercontent.com/u/732970?v=4"},{"login":"taos15","avatar_url":"https://avatars.githubusercontent.com/u/122130728?v=4"},{"login":"arghyadipchak","avatar_url":"https://avatars.githubusercontent.com/u/32430374?v=4"},{"login":"AuthorShin","avatar_url":"https://avatars.githubusercontent.com/u/4959043?v=4"},{"login":"benniblot","avatar_url":"https://avatars.githubusercontent.com/u/47495914?v=4"},{"login":"bebsworthy","avatar_url":"https://avatars.githubusercontent.com/u/5266759?v=4"},{"login":"catrielmuller","avatar_url":"https://avatars.githubusercontent.com/u/2272323?v=4"},{"login":"Vysp3r","avatar_url":"https://avatars.githubusercontent.com/u/62019735?v=4"},{"login":"DR-Blogs","avatar_url":"https://avatars.githubusercontent.com/u/96393186?v=4"},{"login":"singular0","avatar_url":"https://avatars.githubusercontent.com/u/1925883?v=4"},{"login":"diogovalentte","avatar_url":"https://avatars.githubusercontent.com/u/49578155?v=4"},{"login":"codezninja","avatar_url":"https://avatars.githubusercontent.com/u/4400773?v=4"},{"login":"fabricionaweb","avatar_url":"https://avatars.githubusercontent.com/u/15933?v=4"},{"login":"nyok1912","avatar_url":"https://avatars.githubusercontent.com/u/32163949?v=4"},{"login":"bo3bdo","avatar_url":"https://avatars.githubusercontent.com/u/5271380?v=4"},{"login":"hskrtich","avatar_url":"https://avatars.githubusercontent.com/u/1214484?v=4"},{"login":"ishults","avatar_url":"https://avatars.githubusercontent.com/u/7275442?v=4"},{"login":"jelliuk","avatar_url":"https://avatars.githubusercontent.com/u/4790959?v=4"},{"login":"Moohan","avatar_url":"https://avatars.githubusercontent.com/u/5982260?v=4"},{"login":"tesar-tech","avatar_url":"https://avatars.githubusercontent.com/u/33880579?v=4"},{"login":"jbruell","avatar_url":"https://avatars.githubusercontent.com/u/31685172?v=4"},{"login":"JasonLeeB06","avatar_url":"https://avatars.githubusercontent.com/u/82266978?v=4"},{"login":"jeffersonraimon","avatar_url":"https://avatars.githubusercontent.com/u/80064475?v=4"},{"login":"jo-chemla","avatar_url":"https://avatars.githubusercontent.com/u/16822841?v=4"},{"login":"joser93","avatar_url":"https://avatars.githubusercontent.com/u/6912089?v=4"},{"login":"justijndepover","avatar_url":"https://avatars.githubusercontent.com/u/9008623?v=4"},{"login":"Aandree5","avatar_url":"https://avatars.githubusercontent.com/u/32734153?v=4"},{"login":"jackwellerreal","avatar_url":"https://avatars.githubusercontent.com/u/97435840?v=4"},{"login":"SergioChan","avatar_url":"https://avatars.githubusercontent.com/u/10103766?v=4"},{"login":"toineenzo","avatar_url":"https://avatars.githubusercontent.com/u/4921397?v=4"},{"login":"oben01","avatar_url":"https://avatars.githubusercontent.com/u/22369027?v=4"},{"login":"rezstje","avatar_url":"https://avatars.githubusercontent.com/u/45420315?v=4"},{"login":"castielwaverly","avatar_url":"https://avatars.githubusercontent.com/u/137005689?v=4"},{"login":"xoxyuxu","avatar_url":"https://avatars.githubusercontent.com/u/3543416?v=4"},{"login":"MaienM","avatar_url":"https://avatars.githubusercontent.com/u/583129?v=4"},{"login":"mvanhorn","avatar_url":"https://avatars.githubusercontent.com/u/455140?v=4"},{"login":"HeapReaper","avatar_url":"https://avatars.githubusercontent.com/u/31496522?v=4"},{"login":"Copilot","avatar_url":"https://avatars.githubusercontent.com/in/1143301?v=4"},{"login":"mairas","avatar_url":"https://avatars.githubusercontent.com/u/407010?v=4"},{"login":"itzTheMeow","avatar_url":"https://avatars.githubusercontent.com/u/50887230?v=4"},{"login":"NicolasNewman","avatar_url":"https://avatars.githubusercontent.com/u/16135852?v=4"},{"login":"NikeLaosClericus","avatar_url":"https://avatars.githubusercontent.com/u/39810627?v=4"},{"login":"noahcroghan","avatar_url":"https://avatars.githubusercontent.com/u/27422774?v=4"},{"login":"ohmzi","avatar_url":"https://avatars.githubusercontent.com/u/6551272?v=4"},{"login":"Rhiz3K","avatar_url":"https://avatars.githubusercontent.com/u/33246262?v=4"},{"login":"saschabuehrle","avatar_url":"https://avatars.githubusercontent.com/u/47737812?v=4"},{"login":"StrandedTurtle","avatar_url":"https://avatars.githubusercontent.com/u/132835255?v=4"},{"login":"CrazyWolf13","avatar_url":"https://avatars.githubusercontent.com/u/96661824?v=4"},{"login":"generalmat82","avatar_url":"https://avatars.githubusercontent.com/u/110256073?v=4"},{"login":"lthomsen","avatar_url":"https://avatars.githubusercontent.com/u/28560325?v=4"},{"login":"pitschi","avatar_url":"https://avatars.githubusercontent.com/u/6841565?v=4"},{"login":"tech62","avatar_url":"https://avatars.githubusercontent.com/u/16237642?v=4"},{"login":"leandroscardua","avatar_url":"https://avatars.githubusercontent.com/u/24698541?v=4"},{"login":"kylegrieder","avatar_url":"https://avatars.githubusercontent.com/u/25424229?v=4"},{"login":"hotrungnhan","avatar_url":"https://avatars.githubusercontent.com/u/40029631?v=4"},{"login":"KelianB","avatar_url":"https://avatars.githubusercontent.com/u/11216155?v=4"},{"login":"Kaotic3","avatar_url":"https://avatars.githubusercontent.com/u/80522225?v=4"},{"login":"frankvHoof93","avatar_url":"https://avatars.githubusercontent.com/u/7346516?v=4"},{"login":"faugusto-oliveira","avatar_url":"https://avatars.githubusercontent.com/u/37384074?v=4"},{"login":"ieugen","avatar_url":"https://avatars.githubusercontent.com/u/1050920?v=4"},{"login":"KartulUdus","avatar_url":"https://avatars.githubusercontent.com/u/23346150?v=4"},{"login":"dgshue","avatar_url":"https://avatars.githubusercontent.com/u/12952156?v=4"},{"login":"DZ945brH","avatar_url":"https://avatars.githubusercontent.com/u/42635243?v=4"},{"login":"Oupsman","avatar_url":"https://avatars.githubusercontent.com/u/11260343?v=4"},{"login":"m0s4ik","avatar_url":"https://avatars.githubusercontent.com/u/26578395?v=4"},{"login":"AartSchinkel","avatar_url":"https://avatars.githubusercontent.com/u/189675191?v=4"}] \ No newline at end of file diff --git a/static-data/translators.json b/static-data/translators.json index bcd4ba1f4..acb321d6e 100644 --- a/static-data/translators.json +++ b/static-data/translators.json @@ -1 +1 @@ -[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg"},{"username":"f1refa11","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png"},{"username":"jeffersonraimon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png"},{"username":"giop98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg"},{"username":"tomislav.kraljevic","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png"},{"username":"Walkx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png"},{"username":"andrea.rosso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png"},{"username":"ajnart","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg"},{"username":"Witchling","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg"},{"username":"guineuu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg"},{"username":"Bulgus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg"},{"username":"Narno","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png"},{"username":"BySempron","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png"},{"username":"jonathan.berglin.work","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png"},{"username":"icdmkg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif"},{"username":"irithys","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png"},{"username":"JannesV","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png"},{"username":"benniblot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg"},{"username":"pacjo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png"},{"username":"Payou6994","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png"},{"username":"fzibi21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png"},{"username":"WowMurdock","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png"},{"username":"hbooo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg"},{"username":"Manicraft1001","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg"},{"username":"Void123","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png"},{"username":"R4cc","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg"},{"username":"fabricionaweb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png"},{"username":"JokeOfDead","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg"},{"username":"hkz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png"},{"username":"Steken","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png"},{"username":"flar.anton","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg"},{"username":"Bon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg"},{"username":"bfkadan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png"},{"username":"BunnySweety","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png"},{"username":"HRKings","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png"},{"username":"wiston81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg"},{"username":"qaz0911","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png"},{"username":"qqyule","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png"},{"username":"Bims0n","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg"},{"username":"TariqDaCoder","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png"},{"username":"Anarchon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg"},{"username":"Ashun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png"},{"username":"sebekmartin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg"},{"username":"RagnarGraves","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png"},{"username":"PrtmPhlp","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png"},{"username":"DooYoo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png"},{"username":"espentruls","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg"},{"username":"frisco82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg"},{"username":"lupineDK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png"},{"username":"hillaliy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg"},{"username":"MarcOrfilaCarreras","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png"},{"username":"robertbridda","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png"},{"username":"MKoniuszko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg"},{"username":"HeroSizy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png"},{"username":"dwt136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png"},{"username":"asifthewebguy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png"},{"username":"eiloogs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif"},{"username":"_vytdv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png"},{"username":"crendasien","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg"},{"username":"edxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png"},{"username":"somerlev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg"},{"username":"kid1412621","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png"},{"username":"suming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png"},{"username":"nick.gher","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png"},{"username":"DataCat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png"},{"username":"dizo89","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg"},{"username":"tee_noodle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png"},{"username":"Marty88","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg"},{"username":"Spillebulle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG"},{"username":"petitmewen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg"},{"username":"NoProsNoNoobs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png"},{"username":"y.gybson","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg"},{"username":"inside90","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png"},{"username":"RJSkudra","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png"},{"username":"binge203","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif"},{"username":"Mailootje","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg"},{"username":"tim-wiegers","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png"},{"username":"GkhnG","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png"},{"username":"Zoen-Millo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg"},{"username":"HooinKyoma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg"},{"username":"wathergeen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png"},{"username":"MoeToo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png"},{"username":"itodouble","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png"},{"username":"loslocitos","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg"},{"username":"Oversleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png"},{"username":"Beardy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png"},{"username":"raelyan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg"},{"username":"dolphin738","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png"},{"username":"brunotco","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png"},{"username":"LukeIsHereToDevelop","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png"},{"username":"kennit","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png"},{"username":"kuunpire","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg"},{"username":"Sandor-dev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png"},{"username":"Meierschlumpf","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg"},{"username":"harmlesscat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png"},{"username":"OrzWTF","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg"},{"username":"tagaishi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png"},{"username":"azurite928","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png"},{"username":"Ronner231","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg"},{"username":"ugyes","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png"},{"username":"rpieja","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png"},{"username":"flambyisyou","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png"},{"username":"Topbcy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg"},{"username":"ai5d02sb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png"},{"username":"explosiveparrot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png"},{"username":"DestroyCom","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png"},{"username":"neotraxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png"},{"username":"gzxpa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png"},{"username":"TORIK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png"},{"username":"sergio.pibot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg"},{"username":"karam-ajaj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg"},{"username":"SimonHenz97","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png"},{"username":"olsson82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png"},{"username":"bo3bdo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg"},{"username":"AngryPlayer04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg"},{"username":"ehatamm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg"},{"username":"Balionelis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png"},{"username":"kwargs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png"},{"username":"lucicu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png"},{"username":"Michael5564445","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png"},{"username":"Netscream","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png"},{"username":"belicstefan04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png"},{"username":"Hamad2066","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg"},{"username":"3ct0pl4sm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png"},{"username":"sanchez.marcell626","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png"},{"username":"Minoctis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg"},{"username":"homarr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png"},{"username":"mwgg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png"},{"username":"kiwinho","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg"},{"username":"tjvg4m34r13","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg"},{"username":"Diegoem","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png"},{"username":"bouks69","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg"},{"username":"futhgar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg"},{"username":"GrimSQL","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png"},{"username":"chnikel","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png"},{"username":"yuki19870616","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png"},{"username":"noamdal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png"},{"username":"MalithRukshan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png"},{"username":"minirope19","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg"},{"username":"prubin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17503492/medium/96ac87644691e49c1f983f2f094e541c_default.png"},{"username":"sam-tam-sam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17578052/medium/1628dc2954ce3ae95e0caaa2bd60ab0c.png"},{"username":"toineenzo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png"},{"username":"ArcaneWater","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png"},{"username":"Ebedami","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12974801/medium/b596dea5c09454c4c828eac558389755.jpg"},{"username":"perrygamerptyt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13117177/medium/1406c949507ecd438480473c8a1f6124.jpg"},{"username":"SergiSvK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png"},{"username":"jeongeon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13362856/medium/eb572f72cde5e5526c517ca3a6489850_default.png"},{"username":"MrTranCFCVN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13439475/medium/a1789d69c85d90c667194b5d6a518c08_default.png"},{"username":"Tobost06","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13467449/medium/9227dc07f6366bc060d28304f5cb8ce7.jpeg"},{"username":"Kf637","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13530622/medium/118b00bb72d01d3229c97409637e25d1_default.png"},{"username":"Cruellest","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg"},{"username":"olavinto","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14424644/medium/37c01732bd2b7a272b421807a05ccfeb.png"},{"username":"Thario","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png"},{"username":"Wjouter","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14585620/medium/b91a51513332bdc0a0a9ecbed99ecbc3.png"},{"username":"albanobattistella","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14686194/medium/564afcfd76f5cd24751bd669cf4943aa.jpg"},{"username":"Kachelkaiser","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png"},{"username":"regi4","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png"},{"username":"baton5129","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG"},{"username":"meviper","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15958903/medium/209f521ce33a05831fa8d7d1b7babc20_default.png"},{"username":"GerOriki","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16268376/medium/da00e54b08cd40348231d92873a0cd0a_default.png"},{"username":"TheRedCyclops","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png"},{"username":"dymek37","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png"},{"username":"B3CKDOOR","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png"},{"username":"Larsluph","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png"},{"username":"FOEDI","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png"},{"username":"xmarkurion","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png"},{"username":"gregid","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png"},{"username":"Flameberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png"},{"username":"Playfust","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg"},{"username":"Cotignac","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg"},{"username":"LeaHun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png"},{"username":"jackwellerreal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png"},{"username":"renan.costaalencar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16938427/medium/6d25b25320c5bde734118dec4af9cd5b.png"},{"username":"andrius.cim","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png"},{"username":"xjxexrxrxyx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg"},{"username":"bilhal.fellah","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png"},{"username":"the_octo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png"},{"username":"BamesJond","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png"},{"username":"Kornikus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png"},{"username":"xoxyuxu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png"},{"username":"cryptodntsleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/b9e15aa2b24a0dbc1e4f194aa8ed5109.png"},{"username":"yaniorg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17261842/medium/7dbfc77f21c826845961243c44540d26.jpg"},{"username":"Vidariondr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17262438/medium/45fbc71be02ef27296b6f423e97b6a03_default.png"},{"username":"Fastery","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17263066/medium/701b0edc59676174863ad651528bbb37.jpeg"},{"username":"stratself","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17290388/medium/57d9d8161b3fd0abf4dc5558b4a1fa05_default.png"},{"username":"wuzeqin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17292606/medium/b9e0308410b31337e2d7aa6ed346d718_default.png"},{"username":"ChristopherBull","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17304338/medium/21a175ce596bfae81430767467908b90.jpeg"},{"username":"darkbcnlord","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17311436/medium/b271bc0b419ec3a26ddb7b63ff8ffc4b.png"},{"username":"zhoran1997","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17344028/medium/c8f450b5a8f1e9494a45dc60af7ce63e.png"},{"username":"gilalves1703","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17447768/medium/3f1de562a5c2391c88bbf8d5cf40a266.png"},{"username":"iServeCloud","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17470960/medium/11649b99d609438d66455a4d2fdc70f7.png"},{"username":"guibolzantvbox","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17474136/medium/59a576e6da538664ceb972253916fa02.jpeg"},{"username":"ivann136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17506062/medium/67d09ada36fac5f444a1f7517e3a97bd_default.png"},{"username":"Maheshivara","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17516082/medium/576e1e6581cf969615b265de6aeff8b7.jpeg"},{"username":"brunogui81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17517542/medium/7c0d174e810435af518fe8e0c05e151f.jpeg"},{"username":"michelwilhelm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17542190/medium/4c6b33fd8993ff565fa75add2ce8355e.jpeg"},{"username":"dias-gxstavo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17547376/medium/8c6b109aae8aeb651192346a39ae9e5b.jpeg"},{"username":"ToxykAuBleu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17614030/medium/8d21e0608560172b121bd46126d827c7.jpeg"},{"username":"e.erdemir","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17617994/medium/7259a29db9941c6171a8cbbd643b92bd.png"},{"username":"sjonkreutz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17618306/medium/7601c45d015189a863656e21348d223b.png"},{"username":"volovich0377","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17620388/medium/c929a8fbd24f96d17620fa497ade7309.png"},{"username":"Hamstio1","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17624898/medium/406e0bf40094c24a01c3064f8f5b2a82.png"},{"username":"i3laa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17627462/medium/613a9d283ed8b69819ee181903851660.jpeg"},{"username":"bastiengrignon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17629884/medium/ddfc3339285bd65195fcd834e512e9b7.jpeg"},{"username":"kauhee","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17644600/medium/def1b9066cf9275b4273a5a5dca7f325.png"}] \ No newline at end of file +[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg"},{"username":"f1refa11","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png"},{"username":"jeffersonraimon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png"},{"username":"giop98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg"},{"username":"tomislav.kraljevic","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png"},{"username":"Walkx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png"},{"username":"andrea.rosso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png"},{"username":"ajnart","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg"},{"username":"Witchling","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg"},{"username":"guineuu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg"},{"username":"Bulgus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg"},{"username":"Narno","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png"},{"username":"BySempron","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png"},{"username":"jonathan.berglin.work","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png"},{"username":"icdmkg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif"},{"username":"irithys","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png"},{"username":"JannesV","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png"},{"username":"benniblot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg"},{"username":"pacjo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png"},{"username":"Payou6994","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png"},{"username":"fzibi21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png"},{"username":"WowMurdock","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png"},{"username":"hbooo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg"},{"username":"Manicraft1001","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg"},{"username":"Void123","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png"},{"username":"R4cc","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg"},{"username":"fabricionaweb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png"},{"username":"JokeOfDead","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg"},{"username":"hkz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png"},{"username":"Steken","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png"},{"username":"flar.anton","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg"},{"username":"Bon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg"},{"username":"bfkadan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png"},{"username":"BunnySweety","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png"},{"username":"HRKings","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png"},{"username":"wiston81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg"},{"username":"qaz0911","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png"},{"username":"qqyule","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png"},{"username":"Bims0n","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg"},{"username":"TariqDaCoder","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png"},{"username":"Anarchon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg"},{"username":"Ashun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png"},{"username":"sebekmartin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg"},{"username":"RagnarGraves","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png"},{"username":"PrtmPhlp","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png"},{"username":"DooYoo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png"},{"username":"espentruls","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg"},{"username":"frisco82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg"},{"username":"lupineDK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png"},{"username":"hillaliy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg"},{"username":"MarcOrfilaCarreras","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png"},{"username":"robertbridda","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png"},{"username":"MKoniuszko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg"},{"username":"HeroSizy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png"},{"username":"dwt136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png"},{"username":"asifthewebguy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png"},{"username":"eiloogs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif"},{"username":"_vytdv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png"},{"username":"crendasien","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg"},{"username":"edxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png"},{"username":"somerlev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg"},{"username":"kid1412621","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png"},{"username":"suming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png"},{"username":"nick.gher","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png"},{"username":"DataCat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png"},{"username":"dizo89","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg"},{"username":"tee_noodle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png"},{"username":"Marty88","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg"},{"username":"Spillebulle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG"},{"username":"petitmewen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg"},{"username":"NoProsNoNoobs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png"},{"username":"y.gybson","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg"},{"username":"inside90","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png"},{"username":"RJSkudra","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png"},{"username":"binge203","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif"},{"username":"Mailootje","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg"},{"username":"tim-wiegers","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png"},{"username":"GkhnG","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png"},{"username":"Zoen-Millo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg"},{"username":"HooinKyoma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg"},{"username":"wathergeen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png"},{"username":"MoeToo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png"},{"username":"itodouble","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png"},{"username":"loslocitos","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg"},{"username":"Oversleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png"},{"username":"Beardy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png"},{"username":"raelyan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg"},{"username":"dolphin738","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png"},{"username":"brunotco","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png"},{"username":"LukeIsHereToDevelop","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png"},{"username":"kennit","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png"},{"username":"kuunpire","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg"},{"username":"Sandor-dev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png"},{"username":"Meierschlumpf","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg"},{"username":"harmlesscat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png"},{"username":"OrzWTF","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg"},{"username":"tagaishi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png"},{"username":"azurite928","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png"},{"username":"Ronner231","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg"},{"username":"ugyes","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png"},{"username":"rpieja","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png"},{"username":"flambyisyou","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png"},{"username":"Topbcy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg"},{"username":"ai5d02sb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png"},{"username":"explosiveparrot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png"},{"username":"DestroyCom","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png"},{"username":"neotraxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png"},{"username":"gzxpa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png"},{"username":"TORIK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png"},{"username":"sergio.pibot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg"},{"username":"karam-ajaj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg"},{"username":"SimonHenz97","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png"},{"username":"olsson82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png"},{"username":"bo3bdo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg"},{"username":"AngryPlayer04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg"},{"username":"ehatamm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg"},{"username":"Balionelis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png"},{"username":"kwargs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png"},{"username":"lucicu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png"},{"username":"Michael5564445","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png"},{"username":"Netscream","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png"},{"username":"belicstefan04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png"},{"username":"Hamad2066","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg"},{"username":"3ct0pl4sm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png"},{"username":"sanchez.marcell626","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png"},{"username":"Minoctis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg"},{"username":"homarr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png"},{"username":"mwgg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png"},{"username":"kiwinho","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg"},{"username":"tjvg4m34r13","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg"},{"username":"Diegoem","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png"},{"username":"bouks69","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg"},{"username":"futhgar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg"},{"username":"GrimSQL","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png"},{"username":"chnikel","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png"},{"username":"yuki19870616","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png"},{"username":"noamdal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png"},{"username":"MalithRukshan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png"},{"username":"minirope19","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg"},{"username":"prubin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17503492/medium/96ac87644691e49c1f983f2f094e541c_default.png"},{"username":"sam-tam-sam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17578052/medium/1628dc2954ce3ae95e0caaa2bd60ab0c.png"},{"username":"toineenzo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png"},{"username":"ArcaneWater","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png"},{"username":"Ebedami","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12974801/medium/b596dea5c09454c4c828eac558389755.jpg"},{"username":"perrygamerptyt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13117177/medium/1406c949507ecd438480473c8a1f6124.jpg"},{"username":"SergiSvK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png"},{"username":"jeongeon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13362856/medium/eb572f72cde5e5526c517ca3a6489850_default.png"},{"username":"MrTranCFCVN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13439475/medium/a1789d69c85d90c667194b5d6a518c08_default.png"},{"username":"Tobost06","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13467449/medium/9227dc07f6366bc060d28304f5cb8ce7.jpeg"},{"username":"Kf637","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13530622/medium/118b00bb72d01d3229c97409637e25d1_default.png"},{"username":"Cruellest","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg"},{"username":"olavinto","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14424644/medium/37c01732bd2b7a272b421807a05ccfeb.png"},{"username":"Thario","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png"},{"username":"Wjouter","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14585620/medium/b91a51513332bdc0a0a9ecbed99ecbc3.png"},{"username":"albanobattistella","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14686194/medium/564afcfd76f5cd24751bd669cf4943aa.jpg"},{"username":"Kachelkaiser","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png"},{"username":"regi4","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png"},{"username":"baton5129","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG"},{"username":"meviper","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15958903/medium/209f521ce33a05831fa8d7d1b7babc20_default.png"},{"username":"GerOriki","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16268376/medium/da00e54b08cd40348231d92873a0cd0a_default.png"},{"username":"TheRedCyclops","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png"},{"username":"dymek37","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png"},{"username":"B3CKDOOR","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png"},{"username":"Larsluph","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png"},{"username":"FOEDI","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png"},{"username":"xmarkurion","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png"},{"username":"gregid","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png"},{"username":"Flameberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png"},{"username":"Playfust","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg"},{"username":"Cotignac","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg"},{"username":"LeaHun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png"},{"username":"jackwellerreal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png"},{"username":"renan.costaalencar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16938427/medium/6d25b25320c5bde734118dec4af9cd5b.png"},{"username":"andrius.cim","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png"},{"username":"xjxexrxrxyx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg"},{"username":"bilhal.fellah","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png"},{"username":"the_octo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png"},{"username":"BamesJond","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png"},{"username":"Kornikus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png"},{"username":"xoxyuxu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png"},{"username":"cryptodntsleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/b9e15aa2b24a0dbc1e4f194aa8ed5109.png"},{"username":"yaniorg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17261842/medium/7dbfc77f21c826845961243c44540d26.jpg"},{"username":"Vidariondr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17262438/medium/45fbc71be02ef27296b6f423e97b6a03_default.png"},{"username":"Fastery","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17263066/medium/701b0edc59676174863ad651528bbb37.jpeg"},{"username":"stratself","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17290388/medium/57d9d8161b3fd0abf4dc5558b4a1fa05_default.png"},{"username":"wuzeqin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17292606/medium/b9e0308410b31337e2d7aa6ed346d718_default.png"},{"username":"ChristopherBull","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17304338/medium/21a175ce596bfae81430767467908b90.jpeg"},{"username":"darkbcnlord","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17311436/medium/b271bc0b419ec3a26ddb7b63ff8ffc4b.png"},{"username":"zhoran1997","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17344028/medium/c8f450b5a8f1e9494a45dc60af7ce63e.png"},{"username":"gilalves1703","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17447768/medium/3f1de562a5c2391c88bbf8d5cf40a266.png"},{"username":"iServeCloud","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17470960/medium/11649b99d609438d66455a4d2fdc70f7.png"},{"username":"guibolzantvbox","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17474136/medium/59a576e6da538664ceb972253916fa02.jpeg"},{"username":"ivann136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17506062/medium/67d09ada36fac5f444a1f7517e3a97bd_default.png"},{"username":"Maheshivara","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17516082/medium/576e1e6581cf969615b265de6aeff8b7.jpeg"},{"username":"brunogui81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17517542/medium/7c0d174e810435af518fe8e0c05e151f.jpeg"},{"username":"michelwilhelm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17542190/medium/4c6b33fd8993ff565fa75add2ce8355e.jpeg"},{"username":"dias-gxstavo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17547376/medium/8c6b109aae8aeb651192346a39ae9e5b.jpeg"},{"username":"ToxykAuBleu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17614030/medium/8d21e0608560172b121bd46126d827c7.jpeg"},{"username":"e.erdemir","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17617994/medium/7259a29db9941c6171a8cbbd643b92bd.png"},{"username":"sjonkreutz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17618306/medium/7601c45d015189a863656e21348d223b.png"},{"username":"volovich0377","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17620388/medium/c929a8fbd24f96d17620fa497ade7309.png"},{"username":"Hamstio1","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17624898/medium/406e0bf40094c24a01c3064f8f5b2a82.png"},{"username":"i3laa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17627462/medium/613a9d283ed8b69819ee181903851660.jpeg"},{"username":"bastiengrignon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17629884/medium/ddfc3339285bd65195fcd834e512e9b7.jpeg"},{"username":"kauhee","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17644600/medium/def1b9066cf9275b4273a5a5dca7f325.png"},{"username":"hongminzheng","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17683860/medium/a764f4963912777d27a7cd98e136a2b2.png"}] \ No newline at end of file From a1aa5505a365688b456090a882770e561479833e Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 1 May 2026 16:35:11 +0200 Subject: [PATCH 005/116] perf(memory): combine 3 node processes into one (#5600) Co-authored-by: Copilot --- .env.example | 4 - Dockerfile | 2 - apps/nextjs/package.json | 2 + apps/nextjs/src/instrumentation.ts | 6 ++ apps/tasks/package.json | 4 +- apps/tasks/src/main.ts | 40 ------- apps/websocket/package.json | 4 +- package.json | 2 +- packages/api/package.json | 1 - packages/api/src/router/cron-jobs.ts | 35 +++--- packages/cron-job-api/eslint.config.js | 9 -- packages/cron-job-api/package.json | 48 --------- packages/cron-job-api/src/client.ts | 20 ---- packages/cron-job-api/src/constants.ts | 3 - packages/cron-job-api/src/env.ts | 11 -- packages/cron-job-api/src/index.ts | 90 ---------------- packages/cron-job-api/tsconfig.json | 8 -- packages/cron-jobs/package.json | 8 +- packages/cron-jobs/src/index.ts | 68 +++++++----- .../cron-jobs}/src/job-manager.ts | 3 +- packages/cron-jobs/src/schemas.ts | 6 ++ pnpm-lock.yaml | 101 ++++-------------- scripts/run.sh | 12 +-- 23 files changed, 105 insertions(+), 382 deletions(-) create mode 100644 apps/nextjs/src/instrumentation.ts delete mode 100644 packages/cron-job-api/eslint.config.js delete mode 100644 packages/cron-job-api/package.json delete mode 100644 packages/cron-job-api/src/client.ts delete mode 100644 packages/cron-job-api/src/constants.ts delete mode 100644 packages/cron-job-api/src/env.ts delete mode 100644 packages/cron-job-api/src/index.ts delete mode 100644 packages/cron-job-api/tsconfig.json rename {apps/tasks => packages/cron-jobs}/src/job-manager.ts (97%) create mode 100644 packages/cron-jobs/src/schemas.ts diff --git a/.env.example b/.env.example index d643c1194..ff3c38f3d 100644 --- a/.env.example +++ b/.env.example @@ -12,10 +12,6 @@ AUTH_SECRET="supersecret" # or starting the project without any (which will show a randomly generated one). SECRET_ENCRYPTION_KEY=0000000000000000000000000000000000000000000000000000000000000000 -# Cron job API key is generated every time the container starts as it is required for communication between nextjs-api and tasks-api -# export CRON_JOB_API_KEY=$(openssl rand -base64 32) -# CRON_JOB_API_KEY="your-generated-api-key" - LOG_LEVEL='info' # This is how you can use the sqlite driver: diff --git a/Dockerfile b/Dockerfile index eab3c4419..51b562f7d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,8 +43,6 @@ RUN mkdir -p /var/cache/nginx && \ COPY --from=builder /app/apps/nextjs/next.config.ts . COPY --from=builder /app/apps/nextjs/package.json . -COPY --from=builder /app/apps/tasks/tasks.cjs ./apps/tasks/tasks.cjs -COPY --from=builder /app/apps/websocket/wssServer.cjs ./apps/websocket/wssServer.cjs COPY --from=builder /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/build/better_sqlite3.node COPY --from=builder /app/packages/db/migrations ./db/migrations diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 92538095f..4a7323606 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -44,9 +44,11 @@ "@homarr/server-settings": "workspace:^0.1.0", "@homarr/settings": "workspace:^0.1.0", "@homarr/spotlight": "workspace:^0.1.0", + "@homarr/tasks": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", + "@homarr/websocket": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0", "@mantine/colors-generator": "catalog:", "@mantine/core": "catalog:", diff --git a/apps/nextjs/src/instrumentation.ts b/apps/nextjs/src/instrumentation.ts new file mode 100644 index 000000000..19a2865b7 --- /dev/null +++ b/apps/nextjs/src/instrumentation.ts @@ -0,0 +1,6 @@ +export async function register() { + if (process.env.NEXT_RUNTIME === "nodejs") { + await import("@homarr/tasks"); + await import("@homarr/websocket"); + } +} diff --git a/apps/tasks/package.json b/apps/tasks/package.json index 3cb918df5..552beb0f1 100644 --- a/apps/tasks/package.json +++ b/apps/tasks/package.json @@ -5,12 +5,11 @@ "license": "Apache-2.0", "type": "module", "exports": { - ".": "./src/index.ts" + ".": "./src/main.ts" }, "main": "./src/main.ts", "types": "./src/main.ts", "scripts": { - "build": "esbuild src/main.ts --bundle --platform=node --loader:.scss=text --external:*.node --external:@opentelemetry/api --external:deasync --external:bcrypt --outfile=tasks.cjs", "clean": "rm -rf .turbo node_modules", "dev": "pnpm with-env tsx ./src/main.ts", "format": "prettier --check . --ignore-path ../../.gitignore", @@ -24,7 +23,6 @@ "@homarr/auth": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", "@homarr/core": "workspace:^", - "@homarr/cron-job-api": "workspace:^0.1.0", "@homarr/cron-jobs": "workspace:^0.1.0", "@homarr/cron-jobs-core": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0", diff --git a/apps/tasks/src/main.ts b/apps/tasks/src/main.ts index 4c60f1646..55416e689 100644 --- a/apps/tasks/src/main.ts +++ b/apps/tasks/src/main.ts @@ -1,52 +1,12 @@ // This import has to be the first import in the file so that the agent is overridden before any other modules are imported. import "./overrides"; -import type { FastifyTRPCPluginOptions } from "@trpc/server/adapters/fastify"; -import { fastifyTRPCPlugin } from "@trpc/server/adapters/fastify"; -import fastify from "fastify"; - -import { createLogger } from "@homarr/core/infrastructure/logs"; -import { ErrorWithMetadata } from "@homarr/core/infrastructure/logs/error"; -import type { JobRouter } from "@homarr/cron-job-api"; -import { jobRouter } from "@homarr/cron-job-api"; -import { CRON_JOB_API_KEY_HEADER, CRON_JOB_API_PATH, CRON_JOB_API_PORT } from "@homarr/cron-job-api/constants"; import { jobGroup } from "@homarr/cron-jobs"; -import { db } from "@homarr/db"; -import { JobManager } from "./job-manager"; import { onStartAsync } from "./on-start"; -const logger = createLogger({ module: "tasksMain" }); - -const server = fastify({ - maxParamLength: 5000, -}); -server.register(fastifyTRPCPlugin, { - prefix: CRON_JOB_API_PATH, - trpcOptions: { - router: jobRouter, - createContext: ({ req }) => ({ - manager: new JobManager(db, jobGroup), - apiKey: req.headers[CRON_JOB_API_KEY_HEADER] as string | undefined, - }), - onError({ path, error }) { - logger.error(new ErrorWithMetadata("Error in tasks tRPC handler", { path }, { cause: error })); - }, - } satisfies FastifyTRPCPluginOptions["trpcOptions"], -}); - void (async () => { await onStartAsync(); await jobGroup.initializeAsync(); await jobGroup.startAllAsync(); - - try { - await server.listen({ port: CRON_JOB_API_PORT }); - logger.info("Tasks web server started successfully", { port: CRON_JOB_API_PORT }); - } catch (err) { - logger.error( - new ErrorWithMetadata("Failed to start tasks web server", { port: CRON_JOB_API_PORT }, { cause: err }), - ); - process.exit(1); - } })(); diff --git a/apps/websocket/package.json b/apps/websocket/package.json index 8fe731bcb..c4a9cf9d0 100644 --- a/apps/websocket/package.json +++ b/apps/websocket/package.json @@ -4,10 +4,12 @@ "private": true, "license": "Apache-2.0", "type": "module", + "exports": { + ".": "./src/main.ts" + }, "main": "./src/main.ts", "types": "./src/main.ts", "scripts": { - "build": "esbuild src/main.ts --bundle --platform=node --outfile=wssServer.cjs --external:bcrypt --external:@opentelemetry/api --external:deasync --external:cpu-features --loader:.html=text --loader:.scss=text --loader:.node=text", "clean": "rm -rf .turbo node_modules", "dev": "pnpm with-env tsx ./src/main.ts", "format": "prettier --check . --ignore-path ../../.gitignore", diff --git a/package.json b/package.json index cf499a5af..fe347d041 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "db:migration:sqlite:run": "pnpm -F db migration:sqlite:run", "db:push": "pnpm -F db push:sqlite", "db:studio": "pnpm -F db studio", - "dev": "turbo dev --parallel", + "dev": "pnpm -F nextjs dev", "docker:dev": "docker compose -f ./development/development.docker-compose.yml up", "format": "turbo format --continue -- --cache --cache-location node_modules/.cache/.prettiercache", "format:fix": "turbo format --continue -- --write --cache --cache-location node_modules/.cache/.prettiercache", diff --git a/packages/api/package.json b/packages/api/package.json index 04f7bae84..8aa4b9a10 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -24,7 +24,6 @@ "@homarr/auth": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0", - "@homarr/cron-job-api": "workspace:^0.1.0", "@homarr/cron-job-status": "workspace:^0.1.0", "@homarr/cron-jobs": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0", diff --git a/packages/api/src/router/cron-jobs.ts b/packages/api/src/router/cron-jobs.ts index 5428ac374..4fd3fba5b 100644 --- a/packages/api/src/router/cron-jobs.ts +++ b/packages/api/src/router/cron-jobs.ts @@ -2,33 +2,36 @@ import { observable } from "@trpc/server/observable"; import z from "zod/v4"; import { createLogger } from "@homarr/core/infrastructure/logs"; -import { cronExpressionSchema, jobGroupKeys, jobNameSchema } from "@homarr/cron-job-api"; -import { cronJobApi } from "@homarr/cron-job-api/client"; import type { TaskStatus } from "@homarr/cron-job-status"; import { createCronJobStatusChannel } from "@homarr/cron-job-status"; +import { cronExpressionSchema, jobGroup } from "@homarr/cron-jobs"; +import { JobManager } from "@homarr/cron-jobs/job-manager"; import { createTRPCRouter, permissionRequiredProcedure } from "../trpc"; +const jobGroupKeys = jobGroup.getKeys(); +const jobNameSchema = z.enum(jobGroup.getKeys()); + const logger = createLogger({ module: "cronJobsRouter" }); export const cronJobsRouter = createTRPCRouter({ triggerJob: permissionRequiredProcedure .requiresPermission("admin") .input(jobNameSchema) - .mutation(async ({ input }) => { - await cronJobApi.trigger.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).triggerAsync(input); }), startJob: permissionRequiredProcedure .requiresPermission("admin") .input(jobNameSchema) - .mutation(async ({ input }) => { - await cronJobApi.start.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).startAsync(input); }), stopJob: permissionRequiredProcedure .requiresPermission("admin") .input(jobNameSchema) - .mutation(async ({ input }) => { - await cronJobApi.stop.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).stopAsync(input); }), updateJobInterval: permissionRequiredProcedure .requiresPermission("admin") @@ -38,23 +41,23 @@ export const cronJobsRouter = createTRPCRouter({ cron: cronExpressionSchema, }), ) - .mutation(async ({ input }) => { - await cronJobApi.updateInterval.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).updateIntervalAsync(input.name, input.cron); }), disableJob: permissionRequiredProcedure .requiresPermission("admin") .input(jobNameSchema) - .mutation(async ({ input }) => { - await cronJobApi.disable.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).disableAsync(input); }), enableJob: permissionRequiredProcedure .requiresPermission("admin") .input(jobNameSchema) - .mutation(async ({ input }) => { - await cronJobApi.enable.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).enableAsync(input); }), - getJobs: permissionRequiredProcedure.requiresPermission("admin").query(async () => { - return await cronJobApi.getAll.query(); + getJobs: permissionRequiredProcedure.requiresPermission("admin").query(async ({ ctx }) => { + return await new JobManager(ctx.db, jobGroup).getAllAsync(); }), subscribeToStatusUpdates: permissionRequiredProcedure.requiresPermission("admin").subscription(() => { return observable((emit) => { diff --git a/packages/cron-job-api/eslint.config.js b/packages/cron-job-api/eslint.config.js deleted file mode 100644 index 5b19b6f8a..000000000 --- a/packages/cron-job-api/eslint.config.js +++ /dev/null @@ -1,9 +0,0 @@ -import baseConfig from "@homarr/eslint-config/base"; - -/** @type {import('typescript-eslint').Config} */ -export default [ - { - ignores: [], - }, - ...baseConfig, -]; diff --git a/packages/cron-job-api/package.json b/packages/cron-job-api/package.json deleted file mode 100644 index 09bde876b..000000000 --- a/packages/cron-job-api/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "@homarr/cron-job-api", - "version": "0.1.0", - "private": true, - "license": "Apache-2.0", - "type": "module", - "exports": { - ".": "./src/index.ts", - "./env": "./src/env.ts", - "./constants": "./src/constants.ts", - "./client": "./src/client.ts" - }, - "typesVersions": { - "*": { - "*": [ - "src/*" - ] - } - }, - "scripts": { - "clean": "rm -rf .turbo node_modules", - "format": "prettier --check . --ignore-path ../../.gitignore", - "lint": "eslint", - "typecheck": "tsc --noEmit" - }, - "prettier": "@homarr/prettier-config", - "dependencies": { - "@homarr/common": "workspace:^0.1.0", - "@homarr/core": "workspace:^0.1.0", - "@homarr/cron-jobs": "workspace:^0.1.0", - "@tanstack/react-query": "catalog:", - "@trpc/client": "catalog:", - "@trpc/server": "catalog:", - "@trpc/tanstack-react-query": "catalog:", - "node-cron": "catalog:", - "react": "catalog:", - "zod": "catalog:" - }, - "devDependencies": { - "@homarr/eslint-config": "workspace:^0.2.0", - "@homarr/prettier-config": "workspace:^0.1.0", - "@homarr/tsconfig": "workspace:^0.1.0", - "@types/node-cron": "catalog:", - "@types/react": "catalog:", - "eslint": "catalog:", - "typescript": "catalog:" - } -} diff --git a/packages/cron-job-api/src/client.ts b/packages/cron-job-api/src/client.ts deleted file mode 100644 index 0d376a328..000000000 --- a/packages/cron-job-api/src/client.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createTRPCClient, httpLink } from "@trpc/client"; - -import type { JobRouter } from "."; -import { CRON_JOB_API_KEY_HEADER, CRON_JOB_API_PATH, CRON_JOB_API_PORT } from "./constants"; -import { env } from "./env"; - -export const cronJobApi = createTRPCClient({ - links: [ - httpLink({ - url: `${getBaseUrl()}${CRON_JOB_API_PATH}`, - headers: { - [CRON_JOB_API_KEY_HEADER]: env.CRON_JOB_API_KEY, - }, - }), - ], -}); - -function getBaseUrl() { - return `http://localhost:${CRON_JOB_API_PORT}`; -} diff --git a/packages/cron-job-api/src/constants.ts b/packages/cron-job-api/src/constants.ts deleted file mode 100644 index 8ce789e72..000000000 --- a/packages/cron-job-api/src/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const CRON_JOB_API_PORT = 3002; -export const CRON_JOB_API_PATH = "/trpc"; -export const CRON_JOB_API_KEY_HEADER = "cron-job-api-key"; diff --git a/packages/cron-job-api/src/env.ts b/packages/cron-job-api/src/env.ts deleted file mode 100644 index 7efb3f6e2..000000000 --- a/packages/cron-job-api/src/env.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { z } from "zod/v4"; - -import { env as commonEnv } from "@homarr/common/env"; -import { createEnv } from "@homarr/core/infrastructure/env"; - -export const env = createEnv({ - server: { - CRON_JOB_API_KEY: commonEnv.NODE_ENV === "development" ? z.string().default("test") : z.string(), - }, - experimental__runtimeEnv: process.env, -}); diff --git a/packages/cron-job-api/src/index.ts b/packages/cron-job-api/src/index.ts deleted file mode 100644 index 270a51242..000000000 --- a/packages/cron-job-api/src/index.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { initTRPC, TRPCError } from "@trpc/server"; -import { validate } from "node-cron"; -import { z } from "zod/v4"; - -import type { JobGroupKeys } from "@homarr/cron-jobs"; -import { jobGroup } from "@homarr/cron-jobs"; - -import { env } from "./env"; - -export const jobGroupKeys = jobGroup.getKeys(); -export const jobNameSchema = z.enum(jobGroup.getKeys()); - -export interface IJobManager { - startAsync(name: JobGroupKeys): Promise; - triggerAsync(name: JobGroupKeys): Promise; - stopAsync(name: JobGroupKeys): Promise; - updateIntervalAsync(name: JobGroupKeys, cron: string): Promise; - disableAsync(name: JobGroupKeys): Promise; - enableAsync(name: JobGroupKeys): Promise; - getAllAsync(): Promise< - { - name: JobGroupKeys; - cron: string; - preventManualExecution: boolean; - preventCustomInterval: boolean; - isEnabled: boolean; - }[] - >; -} - -const t = initTRPC - .context<{ - manager: IJobManager; - apiKey?: string; - }>() - .create(); - -const createTrpcRouter = t.router; -const apiKeyProcedure = t.procedure.use(({ ctx, next }) => { - if (ctx.apiKey !== env.CRON_JOB_API_KEY) { - throw new TRPCError({ - code: "FORBIDDEN", - message: "Missing or invalid API key", - }); - } - - return next({ - ctx: { - ...ctx, - apiKey: undefined, // Clear the API key after checking - }, - }); -}); - -export const cronExpressionSchema = z.string().refine((expression) => validate(expression), { - error: "Invalid cron expression", -}); - -export const jobRouter = createTrpcRouter({ - start: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.startAsync(input); - }), - trigger: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.triggerAsync(input); - }), - stop: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.stopAsync(input); - }), - updateInterval: apiKeyProcedure - .input( - z.object({ - name: jobNameSchema, - cron: cronExpressionSchema, - }), - ) - .mutation(async ({ input, ctx }) => { - await ctx.manager.updateIntervalAsync(input.name, input.cron); - }), - disable: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.disableAsync(input); - }), - enable: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.enableAsync(input); - }), - getAll: apiKeyProcedure.query(({ ctx }) => { - return ctx.manager.getAllAsync(); - }), -}); - -export type JobRouter = typeof jobRouter; diff --git a/packages/cron-job-api/tsconfig.json b/packages/cron-job-api/tsconfig.json deleted file mode 100644 index cbe8483d9..000000000 --- a/packages/cron-job-api/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "@homarr/tsconfig/base.json", - "compilerOptions": { - "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" - }, - "include": ["*.ts", "src"], - "exclude": ["node_modules"] -} diff --git a/packages/cron-jobs/package.json b/packages/cron-jobs/package.json index d0a55d25a..99e91bd16 100644 --- a/packages/cron-jobs/package.json +++ b/packages/cron-jobs/package.json @@ -5,7 +5,8 @@ "license": "Apache-2.0", "type": "module", "exports": { - ".": "./index.ts" + ".": "./index.ts", + "./job-manager": "./src/job-manager.ts" }, "typesVersions": { "*": { @@ -38,12 +39,15 @@ "@homarr/server-settings": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "semver-parser": "catalog:" + "node-cron": "catalog:", + "semver-parser": "catalog:", + "zod": "catalog:" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", + "@types/node-cron": "catalog:", "eslint": "catalog:", "typescript": "catalog:" } diff --git a/packages/cron-jobs/src/index.ts b/packages/cron-jobs/src/index.ts index 7f2b2349f..0abe74a36 100644 --- a/packages/cron-jobs/src/index.ts +++ b/packages/cron-jobs/src/index.ts @@ -27,33 +27,45 @@ import { updateCheckerJob } from "./jobs/update-checker"; import { weatherJob } from "./jobs/weather"; import { createCronJobGroup } from "./lib"; -export const jobGroup = createCronJobGroup({ - analytics: analyticsJob, - iconsUpdater: iconsUpdaterJob, - ping: pingJob, - smartHomeEntityState: smartHomeEntityStateJob, - mediaServer: mediaServerJob, - mediaOrganizer: mediaOrganizerJob, - downloads: downloadsJob, - dnsHole: dnsHoleJob, - mediaRequestStats: mediaRequestStatsJob, - mediaRequestList: mediaRequestListJob, - rssFeeds: rssFeedsJob, - indexerManager: indexerManagerJob, - healthMonitoring: healthMonitoringJob, - updateChecker: updateCheckerJob, - mediaTranscoding: mediaTranscodingJob, - minecraftServerStatus: minecraftServerStatusJob, - dockerContainers: dockerContainersJob, - networkController: networkControllerJob, - firewallCpu: firewallCpuJob, - firewallMemory: firewallMemoryJob, - firewallVersion: firewallVersionJob, - firewallInterfaces: firewallInterfacesJob, - refreshNotifications: refreshNotificationsJob, - weather: weatherJob, - timetable: timetableJob, - tracearr: tracearrJob, -}); +const getJobGroup = () => { + return createCronJobGroup({ + analytics: analyticsJob, + iconsUpdater: iconsUpdaterJob, + ping: pingJob, + smartHomeEntityState: smartHomeEntityStateJob, + mediaServer: mediaServerJob, + mediaOrganizer: mediaOrganizerJob, + downloads: downloadsJob, + dnsHole: dnsHoleJob, + mediaRequestStats: mediaRequestStatsJob, + mediaRequestList: mediaRequestListJob, + rssFeeds: rssFeedsJob, + indexerManager: indexerManagerJob, + healthMonitoring: healthMonitoringJob, + updateChecker: updateCheckerJob, + mediaTranscoding: mediaTranscodingJob, + minecraftServerStatus: minecraftServerStatusJob, + dockerContainers: dockerContainersJob, + networkController: networkControllerJob, + firewallCpu: firewallCpuJob, + firewallMemory: firewallMemoryJob, + firewallVersion: firewallVersionJob, + firewallInterfaces: firewallInterfacesJob, + refreshNotifications: refreshNotificationsJob, + weather: weatherJob, + timetable: timetableJob, + tracearr: tracearrJob, + }); +}; + +// Add global type augmentation for homarr +declare global { + var cronJobs: ReturnType | undefined; +} + +global.cronJobs ??= getJobGroup(); + +export const jobGroup = global.cronJobs; export type JobGroupKeys = ReturnType<(typeof jobGroup)["getKeys"]>[number]; +export * from "./schemas"; diff --git a/apps/tasks/src/job-manager.ts b/packages/cron-jobs/src/job-manager.ts similarity index 97% rename from apps/tasks/src/job-manager.ts rename to packages/cron-jobs/src/job-manager.ts index f4ec8bf97..19ef8f6e8 100644 --- a/apps/tasks/src/job-manager.ts +++ b/packages/cron-jobs/src/job-manager.ts @@ -1,7 +1,6 @@ import { schedule, validate as validateCron } from "node-cron"; import { createLogger } from "@homarr/core/infrastructure/logs"; -import type { IJobManager } from "@homarr/cron-job-api"; import type { jobGroup as cronJobGroup, JobGroupKeys } from "@homarr/cron-jobs"; import type { Database, InferInsertModel } from "@homarr/db"; import { eq } from "@homarr/db"; @@ -9,7 +8,7 @@ import { cronJobConfigurations } from "@homarr/db/schema"; const logger = createLogger({ module: "jobManager" }); -export class JobManager implements IJobManager { +export class JobManager { constructor( private db: Database, private jobGroup: typeof cronJobGroup, diff --git a/packages/cron-jobs/src/schemas.ts b/packages/cron-jobs/src/schemas.ts new file mode 100644 index 000000000..af9f8b727 --- /dev/null +++ b/packages/cron-jobs/src/schemas.ts @@ -0,0 +1,6 @@ +import { validate } from "node-cron"; +import z from "zod"; + +export const cronExpressionSchema = z.string().refine((expression) => validate(expression), { + error: "Invalid cron expression", +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index addb9194c..cb2c7d694 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -754,6 +754,9 @@ importers: '@homarr/spotlight': specifier: workspace:^0.1.0 version: link:../../packages/spotlight + '@homarr/tasks': + specifier: workspace:^0.1.0 + version: link:../tasks '@homarr/translation': specifier: workspace:^0.1.0 version: link:../../packages/translation @@ -763,6 +766,9 @@ importers: '@homarr/validation': specifier: workspace:^0.1.0 version: link:../../packages/validation + '@homarr/websocket': + specifier: workspace:^0.1.0 + version: link:../websocket '@homarr/widgets': specifier: workspace:^0.1.0 version: link:../../packages/widgets @@ -947,9 +953,6 @@ importers: '@homarr/core': specifier: workspace:^ version: link:../../packages/core - '@homarr/cron-job-api': - specifier: workspace:^0.1.0 - version: link:../../packages/cron-job-api '@homarr/cron-jobs': specifier: workspace:^0.1.0 version: link:../../packages/cron-jobs @@ -1148,9 +1151,6 @@ importers: '@homarr/core': specifier: workspace:^0.1.0 version: link:../core - '@homarr/cron-job-api': - specifier: workspace:^0.1.0 - version: link:../cron-job-api '@homarr/cron-job-status': specifier: workspace:^0.1.0 version: link:../cron-job-status @@ -1503,61 +1503,6 @@ importers: specifier: 'catalog:' version: 5.9.3 - packages/cron-job-api: - dependencies: - '@homarr/common': - specifier: workspace:^0.1.0 - version: link:../common - '@homarr/core': - specifier: workspace:^0.1.0 - version: link:../core - '@homarr/cron-jobs': - specifier: workspace:^0.1.0 - version: link:../cron-jobs - '@tanstack/react-query': - specifier: 'catalog:' - version: 5.99.2(react@19.2.5) - '@trpc/client': - specifier: 'catalog:' - version: 11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3) - '@trpc/server': - specifier: 'catalog:' - version: 11.16.0(typescript@5.9.3) - '@trpc/tanstack-react-query': - specifier: 'catalog:' - version: 11.16.0(@tanstack/react-query@5.99.2(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) - node-cron: - specifier: 'catalog:' - version: 4.2.1 - react: - specifier: 'catalog:' - version: 19.2.5 - zod: - specifier: 'catalog:' - version: 4.3.6 - devDependencies: - '@homarr/eslint-config': - specifier: workspace:^0.2.0 - version: link:../../tooling/eslint - '@homarr/prettier-config': - specifier: workspace:^0.1.0 - version: link:../../tooling/prettier - '@homarr/tsconfig': - specifier: workspace:^0.1.0 - version: link:../../tooling/typescript - '@types/node-cron': - specifier: 'catalog:' - version: 3.0.11 - '@types/react': - specifier: 'catalog:' - version: 19.2.14 - eslint: - specifier: 'catalog:' - version: 9.39.4 - typescript: - specifier: 'catalog:' - version: 5.9.3 - packages/cron-job-status: dependencies: '@homarr/redis': @@ -1630,9 +1575,15 @@ importers: '@homarr/validation': specifier: workspace:^0.1.0 version: link:../validation + node-cron: + specifier: 'catalog:' + version: 4.2.1 semver-parser: specifier: 'catalog:' version: 4.1.8 + zod: + specifier: 'catalog:' + version: 4.3.6 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1643,6 +1594,9 @@ importers: '@homarr/tsconfig': specifier: workspace:^0.1.0 version: link:../../tooling/typescript + '@types/node-cron': + specifier: 'catalog:' + version: 3.0.11 eslint: specifier: 'catalog:' version: 9.39.4 @@ -4383,7 +4337,6 @@ packages: '@million/lint@1.0.14': resolution: {integrity: sha512-u6/kglVwZRu5+GMmtkNlGLqJVkgTl0TtM+hLa9rBg7pldx+5NG5bk45NvL37uZmAr2Xfa1C6qHb7GrFwfP372g==} - deprecated: This package is no longer maintained hasBin: true '@ndaidong/bellajs@12.0.1': @@ -6882,9 +6835,6 @@ packages: dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - dompurify@3.3.3: - resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} - dompurify@3.4.0: resolution: {integrity: sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg==} @@ -7495,15 +7445,6 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -10783,10 +10724,12 @@ packages: uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true validate-npm-package-license@3.0.4: @@ -14665,7 +14608,7 @@ snapshots: axios@1.9.0: dependencies: - follow-redirects: 1.15.9 + follow-redirects: 1.16.0 form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -15319,10 +15262,6 @@ snapshots: dom-walk@0.1.2: {} - dompurify@3.3.3: - optionalDependencies: - '@types/trusted-types': 2.0.7 - dompurify@3.4.0: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -16074,8 +16013,6 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.9: {} - follow-redirects@1.16.0: {} for-each@0.3.5: @@ -19192,7 +19129,7 @@ snapshots: classnames: 2.5.1 css.escape: 1.5.1 deep-extend: 0.6.0 - dompurify: 3.3.3 + dompurify: 3.4.0 ieee754: 1.2.1 immutable: 3.8.2 js-file-download: 0.4.12 diff --git a/scripts/run.sh b/scripts/run.sh index 4d90499d5..fc6e80ba4 100644 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -16,8 +16,6 @@ fi # Auth secret is generated every time the container starts as it is required, but not used because we don't need JWTs or Mail hashing export AUTH_SECRET=$(openssl rand -base64 32) -# Cron job API key is generated every time the container starts as it is required for communication between nextjs-api and tasks-api -export CRON_JOB_API_KEY=$(openssl rand -base64 32) # Support secret file for encryption key (is not empty and file exists) if [ -n "$SECRET_ENCRYPTION_KEY_FILE" ] && [ -f "$SECRET_ENCRYPTION_KEY_FILE" ]; then @@ -43,21 +41,13 @@ else REDIS_PID=$! fi - - -node apps/tasks/tasks.cjs & -TASKS_PID=$! - -node apps/websocket/wssServer.cjs & -WSS_PID=$! - node apps/nextjs/server.js & NEXTJS_PID=$! # Function to handle SIGTERM and shut down services terminate() { echo "Received SIGTERM. Shutting down..." - kill -TERM $NGINX_PID $TASKS_PID $WSS_PID $NEXTJS_PID 2>/dev/null + kill -TERM $NGINX_PID $NEXTJS_PID 2>/dev/null wait # kill redis-server last because of logging of other services and only if $REDIS_PID is set if [ -n "$REDIS_PID" ]; then From 97311b338a4db20e933ad44e9c36375fba4a7d76 Mon Sep 17 00:00:00 2001 From: Releases Homarr <175486441+homarr-releases[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 20:04:34 +0000 Subject: [PATCH 006/116] chore(release): 1.60.0 [skip ci] --- CHANGELOG.md | 15 +++++++++++++++ package.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9aae9c1e..18ee3d037 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## [1.60.0](https://github.com/homarr-labs/homarr/compare/v1.59.3...v1.60.0) (2026-05-01) + +### Features + +* **about:** add opencollective contributors ([#5481](https://github.com/homarr-labs/homarr/issues/5481)) ([3d202d4](https://github.com/homarr-labs/homarr/commit/3d202d409febf33d0218b589c979744c84f87407)) + +### Bug Fixes + +* migrate from node-cron to croner ([#5407](https://github.com/homarr-labs/homarr/issues/5407)) ([e8edc20](https://github.com/homarr-labs/homarr/commit/e8edc203b6c862141668b043ef4232c22b8fae24)) +* **openapi:** openapi document empty ([#5579](https://github.com/homarr-labs/homarr/issues/5579)) ([ce8e330](https://github.com/homarr-labs/homarr/commit/ce8e330c82bc0be9f299f3071a1e80daafc5f789)) + +### Performance Improvements + +* **icons:** updater takes 10 seconds to run with high cpu usage ([#5608](https://github.com/homarr-labs/homarr/issues/5608)) ([ed6680b](https://github.com/homarr-labs/homarr/commit/ed6680ba6a42864185818eb8d90b2303846c1761)) + ## [1.59.3](https://github.com/homarr-labs/homarr/compare/v1.59.2...v1.59.3) (2026-04-24) ### Bug Fixes diff --git a/package.json b/package.json index c9ea46f32..f1be117ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homarr", - "version": "1.59.3", + "version": "1.60.0", "private": true, "scripts": { "build": "cross-env CI=true turbo build", From 5200c17bafe9295a8bd16bf2d3a5e4a8af6a9793 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 1 May 2026 22:10:44 +0200 Subject: [PATCH 007/116] chore: retrigger release v1.60.0 From e31555776ee8b3d51963664a6a65dc62118017a5 Mon Sep 17 00:00:00 2001 From: Releases Homarr <175486441+homarr-releases[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 20:12:31 +0000 Subject: [PATCH 008/116] chore(release): 1.60.0 [skip ci] --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18ee3d037..94131c6d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,21 @@ * **icons:** updater takes 10 seconds to run with high cpu usage ([#5608](https://github.com/homarr-labs/homarr/issues/5608)) ([ed6680b](https://github.com/homarr-labs/homarr/commit/ed6680ba6a42864185818eb8d90b2303846c1761)) +## [1.60.0](https://github.com/homarr-labs/homarr/compare/v1.59.3...v1.60.0) (2026-05-01) + +### Features + +* **about:** add opencollective contributors ([#5481](https://github.com/homarr-labs/homarr/issues/5481)) ([3d202d4](https://github.com/homarr-labs/homarr/commit/3d202d409febf33d0218b589c979744c84f87407)) + +### Bug Fixes + +* migrate from node-cron to croner ([#5407](https://github.com/homarr-labs/homarr/issues/5407)) ([e8edc20](https://github.com/homarr-labs/homarr/commit/e8edc203b6c862141668b043ef4232c22b8fae24)) +* **openapi:** openapi document empty ([#5579](https://github.com/homarr-labs/homarr/issues/5579)) ([ce8e330](https://github.com/homarr-labs/homarr/commit/ce8e330c82bc0be9f299f3071a1e80daafc5f789)) + +### Performance Improvements + +* **icons:** updater takes 10 seconds to run with high cpu usage ([#5608](https://github.com/homarr-labs/homarr/issues/5608)) ([ed6680b](https://github.com/homarr-labs/homarr/commit/ed6680ba6a42864185818eb8d90b2303846c1761)) + ## [1.59.3](https://github.com/homarr-labs/homarr/compare/v1.59.2...v1.59.3) (2026-04-24) ### Bug Fixes From bfa8566284e4ef9cba6fdc3bafc7ceb54f04936c Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 1 May 2026 22:18:45 +0200 Subject: [PATCH 009/116] ci: add beta release workflow (#5601) Co-authored-by: Copilot --- .github/workflows/deployment-beta-release.yml | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 .github/workflows/deployment-beta-release.yml diff --git a/.github/workflows/deployment-beta-release.yml b/.github/workflows/deployment-beta-release.yml new file mode 100644 index 000000000..fd79d1502 --- /dev/null +++ b/.github/workflows/deployment-beta-release.yml @@ -0,0 +1,104 @@ +name: "[Deployment] Beta Release" + +on: + workflow_dispatch: + inputs: + send-notifications: + type: boolean + required: false + default: true + description: Send notifications + +permissions: + contents: write + pull-requests: write + +jobs: + create-and-merge-pr: + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - name: Discord notification + if: ${{ github.event.inputs.send-notifications }} + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + uses: Ilshidur/action-discord@0.4.0 + with: + args: "Beta release has been triggered: [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: Get Next Version + id: semver + uses: ietf-tools/semver-action@v1 + with: + token: ${{ github.token }} + branch: next + - name: Create pull request + id: create-pull-request + run: 'gh pr create --title "chore(release): release ${{ steps.semver.outputs.next }}-beta" --body "Detected change to be ``${{ steps.semver.outputs.bump }}``
Bump version from ``${{ steps.semver.outputs.current }}`` to ``${{ steps.semver.outputs.next }}-beta``" --base beta --head next --label automerge' + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + - name: Discord notification + if: ${{ github.event.inputs.send-notifications }} + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + uses: Ilshidur/action-discord@0.4.0 + with: + args: "Created a release PR ${{ steps.create-pull-request.outputs.url }} for version ${{ steps.semver.outputs.next }}-beta (new behaviour: ${{ steps.semver.outputs.bump }})" + - name: Obtain token + id: obtainApprovalToken + uses: actions/create-github-app-token@v3 + with: + private-key: ${{ secrets.RENOVATE_APPROVE_PRIVATE_KEY }} + client-id: ${{ secrets.RENOVATE_APPROVE_APP_ID }} + permission-pull-requests: write + - name: Approve PR + env: + GITHUB_TOKEN: ${{ steps.obtainApprovalToken.outputs.token }} + run: | + gh pr review --approve --body "Automatically approved by GitHub Action" + - name: Obtain token + id: obtainMergeToken + uses: actions/create-github-app-token@v3 + with: + private-key: ${{ secrets.RENOVATE_MERGE_PRIVATE_KEY }} + client-id: ${{ secrets.RENOVATE_MERGE_APP_ID }} + permission-contents: write # write to beta branch (due to merge) + permission-pull-requests: write # merge pull request + - id: automerge + if: ${{ steps.semver.outputs.bump != 'major' }} + name: automerge + uses: "pascalgn/automerge-action@v0.16.4" + env: + GITHUB_TOKEN: ${{ steps.obtainMergeToken.outputs.token }} + MERGE_METHOD: merge # we prefer merge commits for merging to beta + MERGE_COMMIT_MESSAGE: "chore(release): release ${{ steps.semver.outputs.next }}-beta" + MERGE_DELETE_BRANCH: false # never set to true! + PULL_REQUEST: "${{ steps.create-pull-request.outputs.pr_number }}" + MERGE_RETRIES: 20 # 20 retries * MERGE_RETRY_SLEEP until step fails + MERGE_RETRY_SLEEP: 10000 # 10 seconds * MERGE_RETRIES until step fails + MERGE_REQUIRED_APPROVALS: 0 # do not require approvals + + - name: Merged Discord notification + if: ${{ steps.automerge.outputs.mergeResult == 'merged' && github.event.inputs.send-notifications }} + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + uses: Ilshidur/action-discord@0.4.0 + with: + args: "Merged PR ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}-beta" + - name: Major Bump Discord notification + if: ${{ steps.semver.outputs.bump == 'major' && github.event.inputs.send-notifications }} + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + uses: Ilshidur/action-discord@0.4.0 + with: + args: "The release PR must be manually merged because the next version is a major version: ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}-beta" + - name: Discord Fail Notification + if: failure() && github.event.inputs.send-notifications + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + uses: Ilshidur/action-discord@0.4.0 + with: + args: "The beta release workflow [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) has failed" From 647afbe2cbc358d3e30d8539fa6432034709356a Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 1 May 2026 22:18:45 +0200 Subject: [PATCH 010/116] ci: add beta release workflow (#5601) Co-authored-by: Copilot --- .github/workflows/deployment-beta-release.yml | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 .github/workflows/deployment-beta-release.yml diff --git a/.github/workflows/deployment-beta-release.yml b/.github/workflows/deployment-beta-release.yml new file mode 100644 index 000000000..fd79d1502 --- /dev/null +++ b/.github/workflows/deployment-beta-release.yml @@ -0,0 +1,104 @@ +name: "[Deployment] Beta Release" + +on: + workflow_dispatch: + inputs: + send-notifications: + type: boolean + required: false + default: true + description: Send notifications + +permissions: + contents: write + pull-requests: write + +jobs: + create-and-merge-pr: + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - name: Discord notification + if: ${{ github.event.inputs.send-notifications }} + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + uses: Ilshidur/action-discord@0.4.0 + with: + args: "Beta release has been triggered: [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: Get Next Version + id: semver + uses: ietf-tools/semver-action@v1 + with: + token: ${{ github.token }} + branch: next + - name: Create pull request + id: create-pull-request + run: 'gh pr create --title "chore(release): release ${{ steps.semver.outputs.next }}-beta" --body "Detected change to be ``${{ steps.semver.outputs.bump }}``
Bump version from ``${{ steps.semver.outputs.current }}`` to ``${{ steps.semver.outputs.next }}-beta``" --base beta --head next --label automerge' + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + - name: Discord notification + if: ${{ github.event.inputs.send-notifications }} + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + uses: Ilshidur/action-discord@0.4.0 + with: + args: "Created a release PR ${{ steps.create-pull-request.outputs.url }} for version ${{ steps.semver.outputs.next }}-beta (new behaviour: ${{ steps.semver.outputs.bump }})" + - name: Obtain token + id: obtainApprovalToken + uses: actions/create-github-app-token@v3 + with: + private-key: ${{ secrets.RENOVATE_APPROVE_PRIVATE_KEY }} + client-id: ${{ secrets.RENOVATE_APPROVE_APP_ID }} + permission-pull-requests: write + - name: Approve PR + env: + GITHUB_TOKEN: ${{ steps.obtainApprovalToken.outputs.token }} + run: | + gh pr review --approve --body "Automatically approved by GitHub Action" + - name: Obtain token + id: obtainMergeToken + uses: actions/create-github-app-token@v3 + with: + private-key: ${{ secrets.RENOVATE_MERGE_PRIVATE_KEY }} + client-id: ${{ secrets.RENOVATE_MERGE_APP_ID }} + permission-contents: write # write to beta branch (due to merge) + permission-pull-requests: write # merge pull request + - id: automerge + if: ${{ steps.semver.outputs.bump != 'major' }} + name: automerge + uses: "pascalgn/automerge-action@v0.16.4" + env: + GITHUB_TOKEN: ${{ steps.obtainMergeToken.outputs.token }} + MERGE_METHOD: merge # we prefer merge commits for merging to beta + MERGE_COMMIT_MESSAGE: "chore(release): release ${{ steps.semver.outputs.next }}-beta" + MERGE_DELETE_BRANCH: false # never set to true! + PULL_REQUEST: "${{ steps.create-pull-request.outputs.pr_number }}" + MERGE_RETRIES: 20 # 20 retries * MERGE_RETRY_SLEEP until step fails + MERGE_RETRY_SLEEP: 10000 # 10 seconds * MERGE_RETRIES until step fails + MERGE_REQUIRED_APPROVALS: 0 # do not require approvals + + - name: Merged Discord notification + if: ${{ steps.automerge.outputs.mergeResult == 'merged' && github.event.inputs.send-notifications }} + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + uses: Ilshidur/action-discord@0.4.0 + with: + args: "Merged PR ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}-beta" + - name: Major Bump Discord notification + if: ${{ steps.semver.outputs.bump == 'major' && github.event.inputs.send-notifications }} + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + uses: Ilshidur/action-discord@0.4.0 + with: + args: "The release PR must be manually merged because the next version is a major version: ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}-beta" + - name: Discord Fail Notification + if: failure() && github.event.inputs.send-notifications + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + uses: Ilshidur/action-discord@0.4.0 + with: + args: "The beta release workflow [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) has failed" From 9cf00704428206216ffd1a01a322915204acd8e0 Mon Sep 17 00:00:00 2001 From: "homarr-releases[bot]" <175486441+homarr-releases[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 20:23:03 +0000 Subject: [PATCH 011/116] chore: update bug report template (#5612) Co-authored-by: Releases Homarr <175486441+homarr-releases[bot]@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index d824200e4..f55d73f53 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -33,6 +33,7 @@ body: options: # The below comment is used to insert a new version with on-release.yml #NEXT_VERSION# + - 1.60.0 - 1.59.3 - 1.59.2 - 1.59.1 From 3f6b830f9b001cb7639c8e1bd2357de95bfa5700 Mon Sep 17 00:00:00 2001 From: Releases Homarr <175486441+homarr-releases[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 20:36:08 +0000 Subject: [PATCH 012/116] chore(release): 1.60.1-beta.1 [skip ci] --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94131c6d2..f0d76e36e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## [1.60.1-beta.1](https://github.com/homarr-labs/homarr/compare/v1.60.0...v1.60.1-beta.1) (2026-05-01) + +### Performance Improvements + +* **memory:** combine 3 node processes into one ([#5600](https://github.com/homarr-labs/homarr/issues/5600)) ([a1aa550](https://github.com/homarr-labs/homarr/commit/a1aa5505a365688b456090a882770e561479833e)) + ## [1.60.0](https://github.com/homarr-labs/homarr/compare/v1.59.3...v1.60.0) (2026-05-01) ### Features diff --git a/package.json b/package.json index 5f0eed5d9..36f5822ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homarr", - "version": "1.60.0", + "version": "1.60.1-beta.1", "private": true, "scripts": { "build": "cross-env CI=true turbo build", From ce3c1b6cc1d874d180c716272edc909e681226c7 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 1 May 2026 22:38:50 +0200 Subject: [PATCH 013/116] chore: retrigger release v1.60.1-beta.1 From beac1ed780878cdfb45798ffda398356b46e099e Mon Sep 17 00:00:00 2001 From: Releases Homarr <175486441+homarr-releases[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 20:41:02 +0000 Subject: [PATCH 014/116] chore(release): 1.60.1-beta.1 [skip ci] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0d76e36e..4e60fe46d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ * **memory:** combine 3 node processes into one ([#5600](https://github.com/homarr-labs/homarr/issues/5600)) ([a1aa550](https://github.com/homarr-labs/homarr/commit/a1aa5505a365688b456090a882770e561479833e)) +## [1.60.1-beta.1](https://github.com/homarr-labs/homarr/compare/v1.60.0...v1.60.1-beta.1) (2026-05-01) + +### Performance Improvements + +* **memory:** combine 3 node processes into one ([#5600](https://github.com/homarr-labs/homarr/issues/5600)) ([a1aa550](https://github.com/homarr-labs/homarr/commit/a1aa5505a365688b456090a882770e561479833e)) + ## [1.60.0](https://github.com/homarr-labs/homarr/compare/v1.59.3...v1.60.0) (2026-05-01) ### Features From 453360fe61c7f14261bce6f132eb06d9d9899429 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 1 May 2026 22:42:02 +0200 Subject: [PATCH 015/116] ci: disable package-manager cache --- .github/workflows/deployment-docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deployment-docker-image.yml b/.github/workflows/deployment-docker-image.yml index 9dea69600..cc742b590 100644 --- a/.github/workflows/deployment-docker-image.yml +++ b/.github/workflows/deployment-docker-image.yml @@ -67,7 +67,7 @@ jobs: if: env.SKIP_RELEASE == 'false' with: node-version: 24.15.0 - cache: "pnpm" + package-manager-cache: false - run: npm i -g pnpm if: env.SKIP_RELEASE == 'false' - name: Install dependencies From 80d18bb10d81cb46343030c604302ad773fe35a1 Mon Sep 17 00:00:00 2001 From: Releases Homarr <175486441+homarr-releases[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 20:44:34 +0000 Subject: [PATCH 016/116] chore(release): 1.60.1-beta.1 [skip ci] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e60fe46d..412e216a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,12 @@ * **memory:** combine 3 node processes into one ([#5600](https://github.com/homarr-labs/homarr/issues/5600)) ([a1aa550](https://github.com/homarr-labs/homarr/commit/a1aa5505a365688b456090a882770e561479833e)) +## [1.60.1-beta.1](https://github.com/homarr-labs/homarr/compare/v1.60.0...v1.60.1-beta.1) (2026-05-01) + +### Performance Improvements + +* **memory:** combine 3 node processes into one ([#5600](https://github.com/homarr-labs/homarr/issues/5600)) ([a1aa550](https://github.com/homarr-labs/homarr/commit/a1aa5505a365688b456090a882770e561479833e)) + ## [1.60.0](https://github.com/homarr-labs/homarr/compare/v1.59.3...v1.60.0) (2026-05-01) ### Features From b0f2c9467473e5592b65b6c1a2267303ea56f853 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 1 May 2026 22:51:17 +0200 Subject: [PATCH 017/116] chore: update bug report template --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index f55d73f53..c76536d88 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -33,6 +33,7 @@ body: options: # The below comment is used to insert a new version with on-release.yml #NEXT_VERSION# + - 1.60.1-beta.1 - 1.60.0 - 1.59.3 - 1.59.2 From b6d23e7546fc7fa0066df72a7071b891021a810b Mon Sep 17 00:00:00 2001 From: "homarr-crowdin[bot]" <190541745+homarr-crowdin[bot]@users.noreply.github.com> Date: Sat, 2 May 2026 01:32:16 +0000 Subject: [PATCH 018/116] chore(lang): updated translations from crowdin * chore(lang): update translations from crowdin * chore(lang): update translations from crowdin * chore(lang): update translations from crowdin --------- Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com> Co-authored-by: Meier Lukas --- packages/translation/src/lang/it.json | 4 +- packages/translation/src/lang/no.json | 176 +++++++++++++------------- 2 files changed, 90 insertions(+), 90 deletions(-) diff --git a/packages/translation/src/lang/it.json b/packages/translation/src/lang/it.json index 497c28d60..5146e0ecd 100644 --- a/packages/translation/src/lang/it.json +++ b/packages/translation/src/lang/it.json @@ -3791,8 +3791,8 @@ "subtitle": "{count} contribuendo alle traduzioni in molte lingue" }, "sponsors": { - "title": "", - "subtitle": "" + "title": "Sponsor", + "subtitle": "{count} sostengono il progetto finanziariamente" }, "libraries": { "title": "Librerie", diff --git a/packages/translation/src/lang/no.json b/packages/translation/src/lang/no.json index 5f7c0c6db..7d4166803 100644 --- a/packages/translation/src/lang/no.json +++ b/packages/translation/src/lang/no.json @@ -1526,13 +1526,13 @@ } }, "timetable": { - "name": "", - "description": "", - "title": "", - "noStation": "", + "name": "Timeplan", + "description": "Viser avgangstid for en stasjon", + "title": "Avganger {station}", + "noStation": "Ingen stasjon valgt", "option": { "station": { - "label": "" + "label": "Stasjon" } } }, @@ -1607,32 +1607,32 @@ } }, "anchorNote": { - "name": "", - "description": "", + "name": "Ankermerknad", + "description": "Viser et valgt notat fra anker", "option": { "noteId": { - "label": "" + "label": "Notat" }, "showTitle": { - "label": "" + "label": "Vis tittel" }, "showUpdatedAt": { - "label": "" + "label": "Vis sist oppdatert" } }, - "empty": "", - "emptyContent": "", - "notFound": "", - "noNotes": "", - "integrationRequired": "", - "updatedAt": "", - "untitled": "", - "edit": "", - "save": "", - "cancel": "", - "readOnlyViewer": "", - "saveForbidden": "", - "saveFailed": "" + "empty": "Velg et notat som skal vises", + "emptyContent": "Dette notatet har ikke innhold", + "notFound": "Notat ikke funnet", + "noNotes": "Fant ingen notater", + "integrationRequired": "Velg en ankerintegrasjon først", + "updatedAt": "Oppdatert {date}", + "untitled": "Uten navn", + "edit": "Rediger", + "save": "Lagre", + "cancel": "Avbryt", + "readOnlyViewer": "Du har seertilgang til dette notatet. Redigering er deaktivert.", + "saveForbidden": "Du har ikke tillatelse til å redigere dette notatet.", + "saveFailed": "Kunne ikke lagre dette notatet. Prøv på nytt." }, "iframe": { "name": "iFrame", @@ -1666,7 +1666,7 @@ "label": "Tillat geolokalisering" }, "allowModals": { - "label": "" + "label": "Tillat modaler" } }, "error": { @@ -1901,7 +1901,7 @@ "label": "Vis minneinfo" }, "gpu": { - "label": "" + "label": "Vis CPU-info" }, "showUptime": { "label": "Vis oppetid" @@ -2042,58 +2042,58 @@ } }, "tracearr": { - "name": "", - "description": "", + "name": "Tracearr", + "description": "Forbedret medieserverovervåking med detaljert strøm- og transkodingsdata", "option": { "showStreams": { - "label": "" + "label": "Vis aktive strømmer" }, "showStats": { - "label": "" + "label": "Vis statistikksammendrag" }, "showRecentActivity": { - "label": "" + "label": "Vis nylig aktivitet" }, "showViolations": { - "label": "" + "label": "Vis brudd" } }, "stats": { - "activeStreams": "", - "totalUsers": "", - "transcodes": "", - "bandwidth": "" + "activeStreams": "Aktive strømmninger", + "totalUsers": "Totalt antall brukere", + "transcodes": "Transkoder", + "bandwidth": "Båndbredde" }, "streams": { - "empty": "", - "user": "", - "media": "", - "state": "", - "quality": "", - "device": "", - "progress": "", + "empty": "Ingen aktive strømminger", + "user": "Bruker", + "media": "Media", + "state": "Tilstand", + "quality": "Kvalitet", + "device": "Enhet", + "progress": "Fremgang", "videoDecision": { - "directPlay": "", - "transcode": "", - "directStream": "" + "directPlay": "Direkte avspilling", + "transcode": "Transkode", + "directStream": "Direktestrøm" } }, "recentActivity": { - "title": "", - "empty": "", - "watched": "", - "partial": "" + "title": "Nylig aktivitet", + "empty": "Ingen nylig aktivitet", + "watched": "Sett", + "partial": "Delvis" }, "violations": { - "title": "", - "empty": "", - "rule": "", - "user": "" + "title": "Brudd", + "empty": "Ingen nylige brudd", + "rule": "Regel", + "user": "Bruker" }, - "noSectionsEnabled": "", + "noSectionsEnabled": "Ingen seksjoner aktivert", "error": { - "noIntegration": "", - "internalServerError": "" + "noIntegration": "Ingen Tracearr-integrasjon konfigurert", + "internalServerError": "Kunne ikke hente Tracearr data" } }, "common": { @@ -2546,7 +2546,7 @@ "label": "Skjul beskrivelse" }, "showPosterImage": { - "label": "" + "label": "Vis plakatbilde" } } }, @@ -2761,42 +2761,42 @@ "option": {} }, "speedtestTracker": { - "name": "", - "description": "", + "name": "Speedtest tracker", + "description": "Viser hastighetstesten i fra din Speedtest Tracker-instans.", "option": { "showLatestResult": { - "label": "" + "label": "Vis siste resultat" }, "showStats": { - "label": "" + "label": "Vis gjennomsnitt" }, "showRecentResults": { - "label": "" + "label": "Vis nylige resultater" }, "showPingGraph": { - "label": "" + "label": "Vis ping-graf" } }, - "latestResult": "", - "averages": "", - "tests": "", - "recentResults": "", - "recentResultsSpeed": "", - "recentResultsPing": "", - "download": "", - "upload": "", - "ping": "", - "status": "", - "avgDownload": "", - "avgUpload": "", - "avgPing": "", - "healthy": "", - "unhealthy": "", - "ok": "", - "fail": "", - "noSectionsEnabled": "", + "latestResult": "Siste resultat", + "averages": "Gjennomsnitt", + "tests": "{count} tester", + "recentResults": "Nylige resultater", + "recentResultsSpeed": "Hastighet", + "recentResultsPing": "Ping", + "download": "Nedlasting", + "upload": "Opplastning", + "ping": "Ping", + "status": "Status", + "avgDownload": "Snitt nedlasting", + "avgUpload": "Snitt opplasting", + "avgPing": "Snitt ping", + "healthy": "Frisk", + "unhealthy": "Usunn", + "ok": "OK", + "fail": "Feil", + "noSectionsEnabled": "Aktiver minst ett avsnitt i widgetalternativer.", "error": { - "internalServerError": "" + "internalServerError": "Kunne ikke hente hastighetsteste data" } }, "systemResources": { @@ -2812,7 +2812,7 @@ "option": { "cpu": "CPU", "memory": "Minne", - "gpu": "", + "gpu": "GPU", "network": "Nettverk" } }, @@ -2829,7 +2829,7 @@ "card": { "cpu": "CPU", "memory": "Minne", - "gpu": "", + "gpu": "GPU", "network": "NETT", "up": "OPP", "down": "NED" @@ -3595,7 +3595,7 @@ "label": "Minecraft serverstatus" }, "timetable": { - "label": "" + "label": "Timeplan" }, "iconsUpdater": { "label": "Ikon oppdatering" @@ -3667,7 +3667,7 @@ "label": "Vær" }, "tracearr": { - "label": "" + "label": "Tracearr" } }, "interval": { @@ -3791,8 +3791,8 @@ "subtitle": "{count} bidrar med oversettelser på mange språk" }, "sponsors": { - "title": "", - "subtitle": "" + "title": "Sponsorer", + "subtitle": "{count} støtter prosjektet økonomisk" }, "libraries": { "title": "Biblioteker", From a6f6c2e945f8b15d6eea07992d38fd9025f9fbee Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sat, 2 May 2026 02:53:35 +0000 Subject: [PATCH 019/116] chore(deps): update dependency jsdom to ^29.1.0 (#5620) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 145 +++++++++++++++++++++++++++++++++++++++++--- pnpm-workspace.yaml | 2 +- 2 files changed, 138 insertions(+), 9 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fe7c71537..dac98963b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -403,8 +403,8 @@ catalogs: specifier: ^2.19.1 version: 2.19.1 jsdom: - specifier: ^29.0.2 - version: 29.0.2 + specifier: ^29.1.0 + version: 29.1.0 json5: specifier: ^2.2.3 version: 2.2.3 @@ -636,7 +636,7 @@ importers: version: 10.1.0 jsdom: specifier: 'catalog:' - version: 29.0.2(@noble/hashes@2.0.1) + version: 29.1.0(@noble/hashes@2.0.1) json5: specifier: 'catalog:' version: 2.2.3 @@ -660,7 +660,7 @@ importers: version: 6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: 'catalog:' - version: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.0.2(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.0(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) apps/nextjs: dependencies: @@ -3001,6 +3001,10 @@ packages: '@ark/util@0.46.0': resolution: {integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==} + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@asamuzakjp/css-color@5.1.8': resolution: {integrity: sha512-OISPR9c2uPo23rUdvfEQiLPjoMLOpEeLNnP5iGkxr6tDDxJd3NjD+6fxY0mdaMbIPUjFGL4HFOJqLvow5q4aqQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -3009,6 +3013,14 @@ packages: resolution: {integrity: sha512-erMO6FgtM02dC24NGm0xufMzWz5OF0wXKR7BpvGD973bq/GbmR8/DbxNZbj0YevQ5hlToJaWSVK/G9/NDgGEVw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -3173,6 +3185,13 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-calc@3.2.0': + resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-color-parser@4.0.2': resolution: {integrity: sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==} engines: {node: '>=20.19.0'} @@ -3180,6 +3199,13 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-color-parser@4.1.0': + resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms@4.0.0': resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} engines: {node: '>=20.19.0'} @@ -3194,6 +3220,14 @@ packages: css-tree: optional: true + '@csstools/css-syntax-patches-for-csstree@1.1.3': + resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + '@csstools/css-tokenizer@4.0.0': resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} @@ -4374,6 +4408,7 @@ packages: '@million/lint@1.0.14': resolution: {integrity: sha512-u6/kglVwZRu5+GMmtkNlGLqJVkgTl0TtM+hLa9rBg7pldx+5NG5bk45NvL37uZmAr2Xfa1C6qHb7GrFwfP372g==} + deprecated: This package is no longer maintained hasBin: true '@ndaidong/bellajs@12.0.1': @@ -7067,6 +7102,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + env-ci@11.2.0: resolution: {integrity: sha512-D5kWfzkmaOQDioPmiviWAVtKmpPT4/iJmMVQxWxMPJTFyTkdc5JQUfc5iXEeWxcOdsYTKSAiA/Age4NUOqKsRA==} engines: {node: ^18.17 || >=20.6.1} @@ -8198,6 +8237,15 @@ packages: canvas: optional: true + jsdom@29.1.0: + resolution: {integrity: sha512-YNUc7fB9QuvSSQWfrH0xF+TyABkxUwx8sswgIDaCrw4Hol8BghdZDkITtZheRJeMtzWlnTfsM3bBBusRvpO1wg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsep@1.4.0: resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} engines: {node: '>= 10.16.0'} @@ -8386,6 +8434,10 @@ packages: resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} + lru-cache@11.3.5: + resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -9091,6 +9143,9 @@ packages: parse5@8.0.0: resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -10611,6 +10666,10 @@ packages: resolution: {integrity: sha512-Xi4agocCbRzt0yYMZGMA6ApD7gvtUFaxm4ZmeacWI4cZxaF6C+8I8QfofC20NAePiB/IcvZmzkJ7XPa471AEtA==} engines: {node: '>=20.18.1'} + undici@7.25.0: + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + engines: {node: '>=20.18.1'} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} @@ -11205,6 +11264,14 @@ snapshots: '@ark/util@0.46.0': optional: true + '@asamuzakjp/css-color@5.1.11': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + '@asamuzakjp/css-color@5.1.8': dependencies: '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) @@ -11219,6 +11286,16 @@ snapshots: css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 + '@asamuzakjp/dom-selector@7.1.1': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + + '@asamuzakjp/generational-cache@1.0.1': {} + '@asamuzakjp/nwsapi@2.3.9': {} '@auth/core@0.41.2': @@ -11431,6 +11508,11 @@ snapshots: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-color-parser@4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/color-helpers': 6.0.2 @@ -11438,6 +11520,13 @@ snapshots: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.0.2 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-tokenizer': 4.0.0 @@ -11446,6 +11535,10 @@ snapshots: optionalDependencies: css-tree: 3.2.1 + '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + '@csstools/css-tokenizer@4.0.0': {} '@ctrl/deluge@8.0.0': @@ -14237,7 +14330,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.0.2(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.0(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/expect@4.1.5': dependencies: @@ -14283,7 +14376,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.0.2(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.0(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/utils@4.1.5': dependencies: @@ -15433,6 +15526,8 @@ snapshots: entities@6.0.1: {} + entities@8.0.0: {} + env-ci@11.2.0: dependencies: execa: 8.0.1 @@ -16790,6 +16885,32 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + jsdom@29.1.0(@noble/hashes@2.0.1): + dependencies: + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) + '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) + css-tree: 3.2.1 + data-urls: 7.0.0(@noble/hashes@2.0.1) + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.3.5 + parse5: 8.0.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.1 + undici: 7.25.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1(@noble/hashes@2.0.1) + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + jsep@1.4.0: {} jsesc@3.0.2: {} @@ -16960,6 +17081,8 @@ snapshots: lru-cache@11.2.7: {} + lru-cache@11.3.5: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -17738,6 +17861,10 @@ snapshots: dependencies: entities: 6.0.1 + parse5@8.0.1: + dependencies: + entities: 8.0.0 + path-exists@3.0.0: {} path-exists@4.0.0: {} @@ -19585,6 +19712,8 @@ snapshots: undici@7.24.6: {} + undici@7.25.0: {} + unicode-emoji-modifier-base@1.0.0: {} unicorn-magic@0.1.0: {} @@ -19832,7 +19961,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.3 - vitest@4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.0.2(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.0(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.5 '@vitest/mocker': 4.1.5(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) @@ -19858,7 +19987,7 @@ snapshots: '@types/node': 24.12.2 '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) '@vitest/ui': 4.1.5(vitest@4.1.5) - jsdom: 29.0.2(@noble/hashes@2.0.1) + jsdom: 29.1.0(@noble/hashes@2.0.1) transitivePeerDependencies: - msw diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e70b39a68..2f3de99dc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -140,7 +140,7 @@ catalog: ioredis: 5.10.1 isomorphic-dompurify: ^3.10.0 jotai: ^2.19.1 - jsdom: ^29.0.2 + jsdom: ^29.1.0 json5: ^2.2.3 ldapts: 8.1.7 lodash.clonedeep: ^4.5.0 From 9f4634a95dc99cab9dafd87783326fa17a288479 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sat, 2 May 2026 11:25:52 +0000 Subject: [PATCH 020/116] chore(deps): update dependency mysql2 to v3.22.3 (#5619) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 28 ++++++++++++++-------------- pnpm-workspace.yaml | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dac98963b..9bed47f02 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -424,8 +424,8 @@ catalogs: specifier: ^0.4.1 version: 0.4.1 mysql2: - specifier: 3.22.2 - version: 3.22.2 + specifier: 3.22.3 + version: 3.22.3 next: specifier: 16.2.4 version: 16.2.4 @@ -1461,13 +1461,13 @@ importers: version: 0.2.9 drizzle-orm: specifier: 'catalog:' - version: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.2(@types/node@24.12.2))(pg@8.20.0) + version: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0) ioredis: specifier: 'catalog:' version: 5.10.1 mysql2: specifier: 'catalog:' - version: 3.22.2(@types/node@24.12.2) + version: 3.22.3(@types/node@24.12.2) pg: specifier: 'catalog:' version: 8.20.0 @@ -1715,13 +1715,13 @@ importers: version: 0.31.10 drizzle-orm: specifier: 'catalog:' - version: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.2(@types/node@24.12.2))(pg@8.20.0) + version: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0) drizzle-zod: specifier: 'catalog:' - version: 0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.2(@types/node@24.12.2))(pg@8.20.0))(zod@4.3.6) + version: 0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0))(zod@4.3.6) mysql2: specifier: 'catalog:' - version: 3.22.2(@types/node@24.12.2) + version: 3.22.3(@types/node@24.12.2) pg: specifier: 'catalog:' version: 8.20.0 @@ -8699,8 +8699,8 @@ packages: engines: {node: '>=8', npm: '>=5'} hasBin: true - mysql2@3.22.2: - resolution: {integrity: sha512-snC/L6YoCJPFpozZo3p3hiOlt9ItQ7sCnLSziFLlIttEzsPhrdcPT8g21BiQ7Oqif25W4Xq1IFuBzBvoFYDf0Q==} + mysql2@3.22.3: + resolution: {integrity: sha512-uWWxvZSRvRhtBdh2CdcuK83YcOfPdmEeEYB069bAmPnV93QApDGVPuvCQOLjlh7tYHEWdgQPrn6kosDxHBVLkA==} engines: {node: '>= 8.0'} peerDependencies: '@types/node': '>= 8' @@ -15438,19 +15438,19 @@ snapshots: esbuild: 0.25.12 tsx: 4.21.0 - drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.2(@types/node@24.12.2))(pg@8.20.0): + drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0): optionalDependencies: '@libsql/client-wasm': 0.14.0 '@types/better-sqlite3': 7.6.13 '@types/pg': 8.20.0 better-sqlite3: 12.9.0 gel: 2.0.0 - mysql2: 3.22.2(@types/node@24.12.2) + mysql2: 3.22.3(@types/node@24.12.2) pg: 8.20.0 - drizzle-zod@0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.2(@types/node@24.12.2))(pg@8.20.0))(zod@4.3.6): + drizzle-zod@0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0))(zod@4.3.6): dependencies: - drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.2(@types/node@24.12.2))(pg@8.20.0) + drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0) zod: 4.3.6 dunder-proto@1.0.1: @@ -17454,7 +17454,7 @@ snapshots: '@babel/runtime': 7.29.2 global: 4.4.0 - mysql2@3.22.2(@types/node@24.12.2): + mysql2@3.22.3(@types/node@24.12.2): dependencies: '@types/node': 24.12.2 aws-ssl-profiles: 1.1.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2f3de99dc..283b1c16f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -147,7 +147,7 @@ catalog: mantine-form-zod-resolver: ^1.3.0 mantine-react-table: 2.0.0-beta.9 maria2: ^0.4.1 - mysql2: 3.22.2 + mysql2: 3.22.3 next: 16.2.4 next-auth: 5.0.0-beta.31 next-intl: 4.9.1 From b52e664d0f0f40dedeba051c35a0bd480c576fa9 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sat, 2 May 2026 13:21:15 +0000 Subject: [PATCH 021/116] chore(deps): update dependency swagger-ui-react to ^5.32.5 (#5621) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 500 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 251 insertions(+), 251 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9bed47f02..20cd3675a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -496,8 +496,8 @@ catalogs: specifier: ^5.3.1 version: 5.3.1 swagger-ui-react: - specifier: ^5.32.4 - version: 5.32.4 + specifier: ^5.32.5 + version: 5.32.5 testcontainers: specifier: ^11.14.0 version: 11.14.0 @@ -876,7 +876,7 @@ importers: version: 2.2.6 swagger-ui-react: specifier: 'catalog:' - version: 5.32.4(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 5.32.5(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) use-deep-compare-effect: specifier: 'catalog:' version: 1.8.1(react@19.2.5) @@ -4979,113 +4979,113 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@swagger-api/apidom-ast@1.10.2': - resolution: {integrity: sha512-vTl8gWyeZaj887/NSWYs3as4K8wXHar5wY/606XRBjR2UgmJBokBgKjq7S23LW9tsYjsT4MjQKC8idjgw17xvg==} + '@swagger-api/apidom-ast@1.11.0': + resolution: {integrity: sha512-poLd6eNipLCFCrxjZD+E9E0Z85CLfFzueNiVcYj86rwMp2OszYsTzZS2jz82yR/usNCjXCpkQ2xEXWSmDhefPg==} - '@swagger-api/apidom-core@1.10.2': - resolution: {integrity: sha512-qryNBGHNWDvSRyK1w5rox0UOrHrVBjZOHgeXFpGHF+oBO7ntSc/H7BSiYMDR+KQESkzMcAxn4tZMLYItaBt06w==} + '@swagger-api/apidom-core@1.11.0': + resolution: {integrity: sha512-7TvbbC3dG3yM8cjqyrFXoTOpwgOC68+Z17Ro36drJwZ0k/c7QQc0dI/KvTSPHn9UfimEMdZ0q+yIIzqrAiEmww==} - '@swagger-api/apidom-error@1.10.2': - resolution: {integrity: sha512-SWyPyL5xwTUsDzPi0A5zwTFwqPezvlwj4opEqruqjESNTYupUA7+vt4Mdj7IlDaRYRG1qyCWQgKhIBXznVUD4w==} + '@swagger-api/apidom-error@1.11.0': + resolution: {integrity: sha512-JPt37oOrf73CAZNQBPffnLzU5iEUs8cT9pFmc9vy2gHQp+vjSKxeJ9F6zagTp8VnLPUq0gVjIvCQvcX8NPW2jA==} - '@swagger-api/apidom-json-pointer@1.10.2': - resolution: {integrity: sha512-zySHPqIXF4HZ3VWbHwTxO+H1e9dJw7mGHzoX+tZjx5wVyLQO3kZDCAAXzz3c3/TIY21Y2Zkpkez3q9hjFyuLvQ==} + '@swagger-api/apidom-json-pointer@1.11.0': + resolution: {integrity: sha512-11JWHr55FciYGTbcicNZrBsFEwNuLLZybi00YHJ3OBcuXcFJPKmKluLnVL7GhZYEqvLYOcVsCfInYW5MXoj00w==} - '@swagger-api/apidom-ns-api-design-systems@1.10.2': - resolution: {integrity: sha512-MsZ4GWmWN7wkWv7G9Pwk8sHU1j0bwk7xoGeaZmNCylbTfYvGkg6jJGMHdAdQNCQXbbpfLeKt1O+3YCN//JUQ7w==} + '@swagger-api/apidom-ns-api-design-systems@1.11.0': + resolution: {integrity: sha512-IskDsUkUtNas4guoChRKKkw0wOst64nRA24WuIjLf8ztfBdcl/oqx/cgy8pwWCUqNYvL9L3+sD5HeuokqMrySw==} - '@swagger-api/apidom-ns-arazzo-1@1.10.2': - resolution: {integrity: sha512-fQSwDlIR85tbnLXAjtV/ypSGUBfrzFcZ4NbH6BL1DSTR4uEunVxAULdD4wlhCt9gGNDl/zxZD3vQtlYDkXDFmw==} + '@swagger-api/apidom-ns-arazzo-1@1.11.0': + resolution: {integrity: sha512-n+aGSlLHyrpmCaBa9DBZkIqnNVzYAYSa010MvAwhlwtW3EbFYNwYWinbTwLqCd3leN6XWTvQYCvk0/k7/9Cq4A==} - '@swagger-api/apidom-ns-asyncapi-2@1.10.2': - resolution: {integrity: sha512-obWHe3pyAj65Nf9ISwnbtJ4C5mZ15C6mtQXxzHVW5maVZqlqt3s/YbPY87EqK9ArdNOwOZHkQt2Uth02GMmjxA==} + '@swagger-api/apidom-ns-asyncapi-2@1.11.0': + resolution: {integrity: sha512-SHh3naFZlXFI0gG36tNYvJ/VO8aZsjnXIQAqJHfOE6rrpl5msJrdDatmNczh+57WPZxEZA+KTXWCqNKdeu3G3Q==} - '@swagger-api/apidom-ns-asyncapi-3@1.10.2': - resolution: {integrity: sha512-yqNmXeObF2OLAusgGEapXz2CrGjXwkcfG3DYcQDtOvgRytvGZxC2EkCUR+wEXCVNYhoJ7QpVzzTJOHs3jOvptg==} + '@swagger-api/apidom-ns-asyncapi-3@1.11.0': + resolution: {integrity: sha512-4vrgNYDj68hgmgZj1eGBaBr5xqIETWn4jAioiRHek4jV1FLvmxCs3nC2nYs8CzQqqJ1bqirdiirrUpqhaQvTEA==} - '@swagger-api/apidom-ns-json-schema-2019-09@1.10.2': - resolution: {integrity: sha512-I1FaBoDFMjybF4QVsesIYl8OilkwycZ0mQ0jf1P++zfTRG27uIePB8M+Iuj6iqMsE3qpkjjJJ6ZLnrLPdKvmRw==} + '@swagger-api/apidom-ns-json-schema-2019-09@1.11.0': + resolution: {integrity: sha512-5avPMY1YbQmJIqXlu7rm3yftf4xhT2REBxpEgw8Nc7Zlbn4Z5iGXBsHr60982MwqeE6W8wA+HHQMKHM5siuhdQ==} - '@swagger-api/apidom-ns-json-schema-2020-12@1.10.2': - resolution: {integrity: sha512-lg9XfRlJRNoBa2EDGpEFc7HvFV39G6RG0/SbjQY0BE/WZer10wmfTCU7l3RUNJXRFGKH6/O/nsYgP7AFjTanXQ==} + '@swagger-api/apidom-ns-json-schema-2020-12@1.11.0': + resolution: {integrity: sha512-zddyOxWKlQ9WPaZR0e8ykmy8AbGnDvqCqqy6BdYqKZ9Ts8ZK1XwOB2j9ruccZpoiy/rp2tow+CUf3XE5rricmQ==} - '@swagger-api/apidom-ns-json-schema-draft-4@1.10.2': - resolution: {integrity: sha512-C50KnSKynrmHky/oOB6+hHyZVpwng78Fz5aZjay3h8X5C/PJHmm3sDJFvF3/9wkYHO3N9sPp7cpu4Xm9VJ4/wQ==} + '@swagger-api/apidom-ns-json-schema-draft-4@1.11.0': + resolution: {integrity: sha512-upc0xKb3nxsYPECRDf5UygnZHTSj78xHj5+SBIHNDXoaGDhvMCtWoDVGAKFtZ+jZlIkyJt7cGAeOX0w9IV3XkA==} - '@swagger-api/apidom-ns-json-schema-draft-6@1.10.2': - resolution: {integrity: sha512-/wiP8+2lF8UJRrkoQ9HvKnMbnqijk2uY/hAg+/Bo73T9NGKkEa29jYVUKYNYj7gJBw4hhkUHfHFWuZUpxPC4ZA==} + '@swagger-api/apidom-ns-json-schema-draft-6@1.11.0': + resolution: {integrity: sha512-sd/U6Y34uRqdgd3Phz1oEhO7UBCn60+OfIasFFpHZcKe7O0jTmayiaJqbpwirhwt7Fv5Ev5m58+y1nVomLnhQw==} - '@swagger-api/apidom-ns-json-schema-draft-7@1.10.2': - resolution: {integrity: sha512-firN/uvnVxQgACqcyzV3NU9qjbMvNMJkpmm3wOat3URmaFMaFBT3qjbU1pFHBGbnXI3+I9pQJZHmJSwqNzfUbQ==} + '@swagger-api/apidom-ns-json-schema-draft-7@1.11.0': + resolution: {integrity: sha512-7ptuxmuh2vN1hDr3cLkYm2rl+ak2J1byoGxswucKfSb+7IaFoA36/t7kcOsE/hIO4yI7T3ZPOuNSpeg1NBVjEw==} - '@swagger-api/apidom-ns-openapi-2@1.10.2': - resolution: {integrity: sha512-FK5kYvo/1uwAByumRVRsynBlnKxUUImfsjPEFgRCW6yhbCGRqN47NaZ7GYFHpbhjC3OmMN5/etYj6B0jnZx7Gg==} + '@swagger-api/apidom-ns-openapi-2@1.11.0': + resolution: {integrity: sha512-cAIPJhLxm/nj1kzneNySeaTahY+hH5gkGNsgbmifGnLPsC5YOOfEVMKLj18IREdXqdnxJgRbsI9Azl4g09TPkg==} - '@swagger-api/apidom-ns-openapi-3-0@1.10.2': - resolution: {integrity: sha512-ziyv85QbJYHRdc9oTEFBy3pxwxg7BW/a9GrwH01/SmuXVQPjLjwzRb+SjCxLogJppm0yjxOkDFI2VWPp2RADFg==} + '@swagger-api/apidom-ns-openapi-3-0@1.11.0': + resolution: {integrity: sha512-IUEWVSuETE5DdgTJhIt6oZyRTYUV892/I9UdyTResR0Bypc7gy3YXwlzMlUZx73S2klaiFo1dL4iu/fqzA2fEg==} - '@swagger-api/apidom-ns-openapi-3-1@1.10.2': - resolution: {integrity: sha512-ngcmO4dH77JT5hZB04OJdyTzgKnt2lNhAZQ+4wXjum/xhszjUmDhOeYfXdHw3Lm7MxsEsTesWzLYQ5LKADc41A==} + '@swagger-api/apidom-ns-openapi-3-1@1.11.0': + resolution: {integrity: sha512-WpUvFgOs4YMUmyeJRQEADps+U5o71YTtzKMPNr1cF1ZHKKkcRMUJL9QlJ4Y9cxAdjo6oXzXZa5922XOpwMYhxA==} - '@swagger-api/apidom-ns-openapi-3-2@1.10.2': - resolution: {integrity: sha512-3SWJ5ipWwn+w11HTUESWex/522jy2aGLzBqqMgH36sy+Wdwx+9Mw2bgSDqkxmNC5+jpzOGUOIWoQAMuCpS/Gzg==} + '@swagger-api/apidom-ns-openapi-3-2@1.11.0': + resolution: {integrity: sha512-mUErHIq8rHVoOrkHnRj3mhoNYVIl8th474/m0+E8OB2wBAe0KgiczaJX9KkBQoAo5XIxoRfmI5T3bp+fRabwCA==} - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.10.2': - resolution: {integrity: sha512-kzhJUGzsJ38Uohj5xRQDkQC08rqNhatbqgD30LZ0/UWryJ9nAsjqK2ovuP9t+5WKcDE4iwcYeGSt1NA2XgEZwg==} + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.11.0': + resolution: {integrity: sha512-0OdwcnV/QF+Vs3Vj0dTmlRHEp9WQg9aBvWWl8Fq25OviyDhGGRpqgkEAOjtVYCH3XyZ1Xz+jhIDOdd5pxBajsA==} - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.10.2': - resolution: {integrity: sha512-i3CmSxJ/iG67ybRDAJ9xpuMrOMFvC/obX2lI36E0VZzBTb+llw4Zd5qFmBqNnImLpwdmk11Z1V7i+5HM+J7ijQ==} + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.11.0': + resolution: {integrity: sha512-K714DT6nFW+ZM9LTo+c120zkUjsEcIFO2DU+0cnzReRyenb1x6RZe+uOqTt7iWohnnWp2FV/j0exd/mCsxW65Q==} - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.10.2': - resolution: {integrity: sha512-HwiUkwvo5i2hV2SS6KWrdj62BdceZGfhuXhr1il8akWekpU4jXPtr5pv4gOnKKJN7VgjAmwt/DlcCSRo1+9jVA==} + '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.11.0': + resolution: {integrity: sha512-z9K6XEr3AafV2EA+1pfW+8VoMCCSSpm2IU7oUTjSnhxRb5t/DZR4Qg8FEK8tRKdS2BO2kFFLb2xikrY3Qx8B+g==} - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.10.2': - resolution: {integrity: sha512-w8VTVuE7GPbRqWxvMgRoTb726JRsMhFPMfTBf8+MJ4pQThjk78dSXPV2Zlse71b2DWBuQy2sr6zGyLUNs/3ePQ==} + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.11.0': + resolution: {integrity: sha512-HPb7Wzr+cj0IJkRRlqsK1tNCQXivuGRP4iB2yek16sQZXo2eqSUZ3j3Lz/WwWgnN/FWGAODm4bj9+EhGQ11TnA==} - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.10.2': - resolution: {integrity: sha512-FDNjqmn2vV1jFoVVwQDO0XPPm8R5xzmcyY/6yBLFmKZADin3smSKVZ+njYHmfRjpspXwN0AwI0drdvuH0FZLJg==} + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.11.0': + resolution: {integrity: sha512-sQenLXZRmTDQehe3JCSQpz6jpE3DhMQ0aoe2gpNqo23Gt/4oeW6nAP2h49q9Ne+CHPp0ApFUUyIXF7UTmbUWqA==} - '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.10.2': - resolution: {integrity: sha512-x/0vM2nDDzYzFnXr69+so/KSH+2py2TiZd1K49pWcX8cHsPV1Y4Ppih7GVOMymd8m/IOCjLYlV7qt4eWDwdldg==} + '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.11.0': + resolution: {integrity: sha512-aGnG3AYp4Qsimn1FOP0B9leYCJAQVockzHqyJj30xiNAXquBMXr6lq3L2/AEsmpDGv/x/++YJ4p2ggSxy12QNw==} - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.10.2': - resolution: {integrity: sha512-2bVACmU9ZmAVVnqQWSc3Bs+xG0HHLU1tfZbYL8xNgSi8kw4HcnejF5mWtN+MLFzTaBmWCi2In7P7BYNR8+2Dyg==} + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.11.0': + resolution: {integrity: sha512-iIRlB8B46UPiu0EkKhq1TvwloBgObASJ5ROx8rhT5+Pj+BBegE+KIY02EUKwcz5FgXJrH3XcltLiI7ZA68347Q==} - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.10.2': - resolution: {integrity: sha512-oHpbf+iqBcDS3qtsipMpgCwAeckKMxg0qFKYTCRZyJdctRgupJTxVeir6t/SGo0Ny0a1iknt2LN0u5frEen0kg==} + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.11.0': + resolution: {integrity: sha512-BF2ZyQYMUNrjP1nMneX6ZD2IWBLycWpxg3yllXDCJtfdQT/IMzldIPKCNI9qoBE57lM6j2hpy+Jd86QJk20t2w==} - '@swagger-api/apidom-parser-adapter-json@1.10.2': - resolution: {integrity: sha512-VnwEkarKfsJYRF0zCI9AGiSIyBUXqS2d32KQuhVCt/HeuF1XO9sjeLjGiosA/24YVOnO0ul5TpiNFQn0pw89mA==} + '@swagger-api/apidom-parser-adapter-json@1.11.0': + resolution: {integrity: sha512-DObW0LxYwif0erzGoXiEAZ6ecc/18LIEKxjEAc5Bw2M5I0C/iGW4y/UxAywihGvhMEo1gOvdO6w9Jh6UnuPVmA==} - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.10.2': - resolution: {integrity: sha512-+d/o/8TrNBjvFzgPb0RQhrCc8gOWnrHZF+xvCO5gwp+4MUr1XP1AJIox1e6t1SO+j7IQjiF2ocx2r7eFE5QC7w==} + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.11.0': + resolution: {integrity: sha512-dREUHAEHVry9aSGjqDpYF9Wzm1lgUkV6EgoYDflyQ9HxgCwhucDPFmUgI7UaR0G6bplnJumMcZXh1I1TGn1v7Q==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.10.2': - resolution: {integrity: sha512-3ieUeX8/WywkUzdOO1U1QKQDNmpZFfOeTAeb4ISDd/PKOVwuEx/b0w5I8EuOu97tKAe3UUesEdii+pJlkcFlFw==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.11.0': + resolution: {integrity: sha512-U/NZpvuj9IpUS48zF2tYbgW2AtTw6Yi6kXNiHUtgUEomxYdb6XQeKLDGvgeWjgAgfUROohakcH+wx713VCGxfQ==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.10.2': - resolution: {integrity: sha512-z0c7IgMPLSDhE+ldTb54Xlhq+yPF0w/8LHXyeHX4V6BS1VG3Utb+mM/qTVfy1Eo+p1KGNlwNDEPsBp6jIaVb5Q==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.11.0': + resolution: {integrity: sha512-fYarNeaz39oKZ6VwqwON+IeJszidZGPvUYDfggLaar81NGimrz07y1U+DhAf96IX3qgUa2J6Fu3Bv1r57hs6Ng==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-2@1.10.2': - resolution: {integrity: sha512-bx/kEIXWtpHu+4LEiyNdt0v8ER5EVwPjhQdlpOaC5qghnRH9aUYOTawZtVHsNHAQWTIMNn9DdPKYQgttQKD0Pw==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-2@1.11.0': + resolution: {integrity: sha512-jtMoAH3R73bQUc4D2cJTUUvO4iJz9CV1W4+zoU/gT2l6h8Ji5EhZH0/VyynUk4J6mW/GdwxUN/q5z2P/DtSmfA==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.10.2': - resolution: {integrity: sha512-e86JUXHGGEVsO4/xpy/GRSvYXGN30hLt1lMUhjzCFuE95N6/K3hmQHE3rA/H7ot1ajCWUhzukW5rGQac79NIjA==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.11.0': + resolution: {integrity: sha512-e8L4kHahgkOIzCCSGs5jTahXLInERNr37teSLS4SuqYgSVWr9AVXuNvpHNYGeMECD8briGIGfAAtnZChCGYrEA==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.10.2': - resolution: {integrity: sha512-ucfc13Ai31tJ0ruAm1YiHhqENgcBuiOXL00OhoICWA56ggAcnA5WfWmvtsXVMlZsTHVbhZP3XpsH5rui2N8u5w==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.11.0': + resolution: {integrity: sha512-s+AXnNzLeAk28jUAeXwTSR1AlX+TXIAt2GfFgWUAV+SFw2OhRpoKYLzItN3n2UsHselqHvfyUL9xNCJBZleQtQ==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.10.2': - resolution: {integrity: sha512-7o8j93qgf9yYAaaJ/GpH+5sB3fC9EmvmjTCqlw5YWXp+cRgCn9q7f80Sv4+NjbracUafB6qL4i9F/m+Xs0XZaQ==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.11.0': + resolution: {integrity: sha512-xyUyehHhB+BSOAT7mYGqmcEozuLKxmx1Hug97O9SVgNU8QTClc95+VWrAHhJbn8juPR6y2vSwm/wrQDwb4yq7w==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2@1.10.2': - resolution: {integrity: sha512-blDIeVmo8bpXYV/C+b6PYi54yS+5jPEZTFsK5jQ2NzpCPrkBPacp/KTuHBUBzJsYj4bj/ivRL3+JXGw4YovUHw==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2@1.11.0': + resolution: {integrity: sha512-u7Y98zdjEs+0Upa8TdxOsb7z8hYJmLz9lVleRiB7rqysVga6oSDI5NAFdLVqMB6uAUuFi/tyiuiFT4Qosfd6Vw==} - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.10.2': - resolution: {integrity: sha512-I5eCls8XS3SVEwH/cuL6T3iar1TPaFYh3gXwS/2rzP1aZQNKSHDP3y3ney7nAomKG4dFvE8Q248FL36arG7T/w==} + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.11.0': + resolution: {integrity: sha512-FZK9KfwiTnNc+imxg7Wu2ktKhXCYPeFQZ1uZJzJL/hk1n+zyPfRY/4Aue4HzDcG8+wbItd3dRjKClFanVZAXoA==} - '@swagger-api/apidom-reference@1.10.2': - resolution: {integrity: sha512-H5UqOmae9CXdiLJbbh1j+/hwvcECmr6ci2XtUKTQpFviemvsIDZmPV1DKUAxCfzGr2iOkDO6SZc+/OEWlETqiQ==} + '@swagger-api/apidom-reference@1.11.0': + resolution: {integrity: sha512-ftqegYrxxl9UwQFbdVOtXIqNolVd25M5u53X8fP96Wx6lEVr5Ed7B6+dzch8ttCUmKeoLIeagvt76b6BoYtnLw==} '@swaggerexpert/cookie@2.0.2': resolution: {integrity: sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==} @@ -10302,11 +10302,11 @@ packages: svgson@5.3.1: resolution: {integrity: sha512-qdPgvUNWb40gWktBJnbJRelWcPzkLed/ShhnRsjbayXz8OtdPOzbil9jtiZdrYvSDumAz/VNQr6JaNfPx/gvPA==} - swagger-client@3.37.2: - resolution: {integrity: sha512-KcB8psL1On4GWwv9Ribp1oteh50ygNnAyvQbd5MwiXMGkcB4f53rkZEdvZKPDdJO764mQjgErxQEGDVw6QBUMQ==} + swagger-client@3.37.3: + resolution: {integrity: sha512-PZv5smQPnPwfP6mnkq96fOp/RNDKBqd8vfwE4UuwA229wsesj20yd7RadXx+9uLBC3c0H6cu/H+bnbMTWG6oUQ==} - swagger-ui-react@5.32.4: - resolution: {integrity: sha512-OsTqKCiDT/o8/oqZbt+p1djPkrOk3unKK/7+wGvP1+WY6pOzFoDLM4D39cNFtpIArtlg9uoK6MKIz3W00WX8qw==} + swagger-ui-react@5.32.5: + resolution: {integrity: sha512-u86Qx36C5FvmJFVGMF3s62dxR3l0EfUmlylJVqCJ4vL0tvfd38kNdCQan9app6Y+C25uqVAjGLYu2w87UMD35Q==} peerDependencies: react: '>=16.8.0 <20' react-dom: '>=16.8.0 <20' @@ -13070,20 +13070,20 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@swagger-api/apidom-ast@1.10.2': + '@swagger-api/apidom-ast@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-error': 1.10.2 + '@swagger-api/apidom-error': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) unraw: 3.0.0 - '@swagger-api/apidom-core@1.10.2': + '@swagger-api/apidom-core@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 + '@swagger-api/apidom-ast': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 '@types/ramda': 0.30.2 minim: 0.23.8 ramda: 0.30.1 @@ -13091,260 +13091,260 @@ snapshots: short-unique-id: 5.3.2 ts-mixer: 6.0.4 - '@swagger-api/apidom-error@1.10.2': + '@swagger-api/apidom-error@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-json-pointer@1.10.2': + '@swagger-api/apidom-json-pointer@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 '@swaggerexpert/json-pointer': 2.10.2 - '@swagger-api/apidom-ns-api-design-systems@1.10.2': + '@swagger-api/apidom-ns-api-design-systems@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-1': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-arazzo-1@1.10.2': + '@swagger-api/apidom-ns-arazzo-1@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-asyncapi-2@1.10.2': + '@swagger-api/apidom-ns-asyncapi-2@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-asyncapi-3@1.10.2': + '@swagger-api/apidom-ns-asyncapi-3@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-asyncapi-2': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-json-schema-2019-09@1.10.2': + '@swagger-api/apidom-ns-json-schema-2019-09@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-2020-12@1.10.2': + '@swagger-api/apidom-ns-json-schema-2020-12@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 - '@swagger-api/apidom-ns-json-schema-2019-09': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 + '@swagger-api/apidom-ns-json-schema-2019-09': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-4@1.10.2': + '@swagger-api/apidom-ns-json-schema-draft-4@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.10.2 - '@swagger-api/apidom-core': 1.10.2 + '@swagger-api/apidom-ast': 1.11.0 + '@swagger-api/apidom-core': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-6@1.10.2': + '@swagger-api/apidom-ns-json-schema-draft-6@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-7@1.10.2': + '@swagger-api/apidom-ns-json-schema-draft-7@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 - '@swagger-api/apidom-ns-json-schema-draft-6': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 + '@swagger-api/apidom-ns-json-schema-draft-6': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-2@1.10.2': + '@swagger-api/apidom-ns-openapi-2@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-openapi-3-0@1.10.2': + '@swagger-api/apidom-ns-openapi-3-0@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-3-1@1.10.2': + '@swagger-api/apidom-ns-openapi-3-1@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.10.2 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-json-pointer': 1.10.2 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-0': 1.10.2 + '@swagger-api/apidom-ast': 1.11.0 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-json-pointer': 1.11.0 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-3-2@1.10.2': + '@swagger-api/apidom-ns-openapi-3-2@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.10.2 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-json-pointer': 1.10.2 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-0': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-1': 1.10.2 + '@swagger-api/apidom-ast': 1.11.0 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-json-pointer': 1.11.0 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.10.2': + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-api-design-systems': 1.10.2 - '@swagger-api/apidom-parser-adapter-json': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-api-design-systems': 1.11.0 + '@swagger-api/apidom-parser-adapter-json': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.10.2': + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-api-design-systems': 1.10.2 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-api-design-systems': 1.11.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.10.2': + '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-arazzo-1': 1.10.2 - '@swagger-api/apidom-parser-adapter-json': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-arazzo-1': 1.11.0 + '@swagger-api/apidom-parser-adapter-json': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.10.2': + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-arazzo-1': 1.10.2 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-arazzo-1': 1.11.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.10.2': + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-asyncapi-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-json': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-json': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.10.2': + '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-asyncapi-3': 1.10.2 - '@swagger-api/apidom-parser-adapter-json': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-asyncapi-3': 1.11.0 + '@swagger-api/apidom-parser-adapter-json': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.10.2': + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-asyncapi-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.10.2': + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-asyncapi-3': 1.10.2 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-asyncapi-3': 1.11.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-json@1.10.2': + '@swagger-api/apidom-parser-adapter-json@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.10.2 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 + '@swagger-api/apidom-ast': 1.11.0 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) @@ -13353,100 +13353,100 @@ snapshots: web-tree-sitter: 0.24.5 optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.10.2': + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-openapi-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-json': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-openapi-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-json': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.10.2': + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-0': 1.10.2 - '@swagger-api/apidom-parser-adapter-json': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.11.0 + '@swagger-api/apidom-parser-adapter-json': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.10.2': + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-1': 1.10.2 - '@swagger-api/apidom-parser-adapter-json': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 + '@swagger-api/apidom-parser-adapter-json': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-2@1.10.2': + '@swagger-api/apidom-parser-adapter-openapi-json-3-2@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-json': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-json': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.10.2': + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-openapi-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-openapi-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.10.2': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-0': 1.10.2 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.11.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.10.2': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-1': 1.10.2 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2@1.10.2': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.10.2': + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.10.2 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 + '@swagger-api/apidom-ast': 1.11.0 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 '@tree-sitter-grammars/tree-sitter-yaml': 0.7.1(tree-sitter@0.22.4) '@types/ramda': 0.30.2 ramda: 0.30.1 @@ -13455,42 +13455,42 @@ snapshots: web-tree-sitter: 0.24.5 optional: true - '@swagger-api/apidom-reference@1.10.2': + '@swagger-api/apidom-reference@1.11.0': dependencies: '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 '@types/ramda': 0.30.2 axios: 1.15.0 minimatch: 10.2.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optionalDependencies: - '@swagger-api/apidom-json-pointer': 1.10.2 - '@swagger-api/apidom-ns-arazzo-1': 1.10.2 - '@swagger-api/apidom-ns-asyncapi-2': 1.10.2 - '@swagger-api/apidom-ns-openapi-2': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-0': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-1': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.10.2 - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.10.2 - '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.10.2 - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.10.2 - '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-asyncapi-json-3': 1.10.2 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3': 1.10.2 - '@swagger-api/apidom-parser-adapter-json': 1.10.2 - '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.10.2 - '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.10.2 - '@swagger-api/apidom-parser-adapter-openapi-json-3-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.10.2 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.10.2 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2': 1.10.2 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.10.2 + '@swagger-api/apidom-json-pointer': 1.11.0 + '@swagger-api/apidom-ns-arazzo-1': 1.11.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.11.0 + '@swagger-api/apidom-ns-openapi-2': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.11.0 + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.11.0 + '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.11.0 + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.11.0 + '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-asyncapi-json-3': 1.11.0 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3': 1.11.0 + '@swagger-api/apidom-parser-adapter-json': 1.11.0 + '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.11.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.11.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.11.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.11.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2': 1.11.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 transitivePeerDependencies: - debug @@ -19270,16 +19270,16 @@ snapshots: deep-rename-keys: 0.2.1 xml-reader: 2.4.3 - swagger-client@3.37.2: + swagger-client@3.37.3: dependencies: '@babel/runtime-corejs3': 7.27.1 '@scarf/scarf': 1.4.0 - '@swagger-api/apidom-core': 1.10.2 - '@swagger-api/apidom-error': 1.10.2 - '@swagger-api/apidom-json-pointer': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-1': 1.10.2 - '@swagger-api/apidom-ns-openapi-3-2': 1.10.2 - '@swagger-api/apidom-reference': 1.10.2 + '@swagger-api/apidom-core': 1.11.0 + '@swagger-api/apidom-error': 1.11.0 + '@swagger-api/apidom-json-pointer': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 + '@swagger-api/apidom-ns-openapi-3-2': 1.11.0 + '@swagger-api/apidom-reference': 1.11.0 '@swaggerexpert/cookie': 2.0.2 deepmerge: 4.3.1 fast-json-patch: 3.1.1 @@ -19294,7 +19294,7 @@ snapshots: transitivePeerDependencies: - debug - swagger-ui-react@5.32.4(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + swagger-ui-react@5.32.5(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: '@babel/runtime-corejs3': 7.27.1 '@scarf/scarf': 1.4.0 @@ -19327,7 +19327,7 @@ snapshots: reselect: 5.1.1 serialize-error: 8.1.0 sha.js: 2.4.12 - swagger-client: 3.37.2 + swagger-client: 3.37.3 url-parse: 1.5.10 xml: 1.0.1 xml-but-prettier: 1.0.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 283b1c16f..44f17a32d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -171,7 +171,7 @@ catalog: semver-parser: ^4.1.8 superjson: 2.2.6 svgson: ^5.3.1 - swagger-ui-react: ^5.32.4 + swagger-ui-react: ^5.32.5 testcontainers: ^11.14.0 timezones-ical-library: ^2.1.3 trpc-to-openapi: ^3.2.0 From 0a4e4c3b7027d9cc9f7ddbde51dacce2f8d60282 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sat, 2 May 2026 19:07:29 +0000 Subject: [PATCH 022/116] chore(deps): update dependency next-intl to v4.9.2 (#5625) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 38 +++++++++++++++++++------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20cd3675a..14f6ec1e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -433,8 +433,8 @@ catalogs: specifier: 5.0.0-beta.31 version: 5.0.0-beta.31 next-intl: - specifier: 4.9.1 - version: 4.9.1 + specifier: 4.9.2 + version: 4.9.2 node-loader: specifier: ^2.1.0 version: 2.1.0 @@ -2598,7 +2598,7 @@ importers: version: 16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) next-intl: specifier: 'catalog:' - version: 4.9.1(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3) + version: 4.9.2(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3) react: specifier: 'catalog:' version: 19.2.5 @@ -7845,8 +7845,8 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} - icu-minify@4.9.1: - resolution: {integrity: sha512-6NkfF9GHHFouqnz+wuiLjCWQiyxoEyJ5liUv4Jxxo/8wyhV7MY0L0iTEGDAVEa4aAD58WqTxFMa20S5nyMjwNw==} + icu-minify@4.11.0: + resolution: {integrity: sha512-XRvblCwLqWXio5ZLcmDqXvJv7alSACK6UjXuuMOdQWB//d25AQX6xlVlI1FEbc3Q6iPLXXo6HaVLn8LcAFhn1Q==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -8765,11 +8765,11 @@ packages: nodemailer: optional: true - next-intl-swc-plugin-extractor@4.9.1: - resolution: {integrity: sha512-8whJJ6oxJz8JqkHarggmmuEDyXgC7nEnaPhZD91CJwEWW4xp0AST3Mw17YxvHyP2vAF3taWfFbs1maD+WWtz3w==} + next-intl-swc-plugin-extractor@4.11.0: + resolution: {integrity: sha512-WUGBSxGNd8eQ0rAsJHFmRw2H7+SZAXQIY/HAnYM57JaUsj5D2vx4KOz4zFtXlyKDtsw9awHfgWVvBae2/RDF9A==} - next-intl@4.9.1: - resolution: {integrity: sha512-N7ga0CjtYcdxNvaKNIi6eJ2mmatlHK5hp8rt0YO2Omoc1m0gean242/Ukdj6+gJNiReBVcYIjK0HZeNx7CV1ug==} + next-intl@4.9.2: + resolution: {integrity: sha512-AZoMRsVGLZczB2hisq1OTWmNAYAKwk/jaWH4+9pfl5TCG8kbILZZptZHux9zw7DyN1yzh6X7jmaQvoykHs9Y7Q==} peerDependencies: next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -10778,8 +10778,8 @@ packages: peerDependencies: react: '>=16.13' - use-intl@4.9.1: - resolution: {integrity: sha512-iGVV/xFYlhe3btafRlL8RPLD2Jsuet4yqn9DR6LWWbMhULsJnXgLonDkzDmsAIBIwFtk02oJuX/Ox2vwHKF+UQ==} + use-intl@4.11.0: + resolution: {integrity: sha512-7ILhTLuo3fnSKhoTGDk5X9591pjtWr6qB4inrlvGkN9OEyKhoiG73GZFoLSs68wz3BsSGtoWa62iWvrYEYU+iA==} peerDependencies: react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -16503,7 +16503,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icu-minify@4.9.1: + icu-minify@4.11.0: dependencies: '@formatjs/icu-messageformat-parser': 3.5.0 @@ -17503,20 +17503,20 @@ snapshots: next: 16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) react: 19.2.5 - next-intl-swc-plugin-extractor@4.9.1: {} + next-intl-swc-plugin-extractor@4.11.0: {} - next-intl@4.9.1(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3): + next-intl@4.9.2(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.8.1 '@parcel/watcher': 2.4.1 '@swc/core': 1.15.3 - icu-minify: 4.9.1 + icu-minify: 4.11.0 negotiator: 1.0.0 next: 16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) - next-intl-swc-plugin-extractor: 4.9.1 + next-intl-swc-plugin-extractor: 4.11.0 po-parser: 2.1.1 react: 19.2.5 - use-intl: 4.9.1(react@19.2.5) + use-intl: 4.11.0(react@19.2.5) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -19835,11 +19835,11 @@ snapshots: dequal: 2.0.3 react: 19.2.5 - use-intl@4.9.1(react@19.2.5): + use-intl@4.11.0(react@19.2.5): dependencies: '@formatjs/fast-memoize': 3.1.0 '@schummar/icu-type-parser': 1.21.5 - icu-minify: 4.9.1 + icu-minify: 4.11.0 intl-messageformat: 11.1.1 react: 19.2.5 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 44f17a32d..882bf2124 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -150,7 +150,7 @@ catalog: mysql2: 3.22.3 next: 16.2.4 next-auth: 5.0.0-beta.31 - next-intl: 4.9.1 + next-intl: 4.9.2 node-loader: ^2.1.0 octokit: ^5.0.5 pg: ^8.20.0 From a183339063a66a8027860f05a6394841b88df5bd Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sat, 2 May 2026 21:41:16 +0200 Subject: [PATCH 023/116] chore(deps): update dependency eslint to v10 (#5038) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> Co-authored-by: Meier Lukas --- packages/api/src/router/user.ts | 2 +- .../src/anchor/anchor-integration.ts | 2 +- pnpm-lock.yaml | 365 +++++++++--------- pnpm-workspace.yaml | 13 +- tooling/eslint/base.js | 5 +- tooling/eslint/package.json | 1 + tooling/eslint/react.js | 2 + tooling/eslint/types.d.ts | 45 --- 8 files changed, 191 insertions(+), 244 deletions(-) diff --git a/packages/api/src/router/user.ts b/packages/api/src/router/user.ts index ad11f4fce..43862b969 100644 --- a/packages/api/src/router/user.ts +++ b/packages/api/src/router/user.ts @@ -110,7 +110,7 @@ export const userRouter = createTRPCRouter({ const queryResult = (await trx.delete(schema.invites).where(inviteWhere)) as | QueryResult | MySqlRawQueryResult; - let count = 0; + let count: number; if (Array.isArray(queryResult)) { count = queryResult[0].affectedRows; } else { diff --git a/packages/integrations/src/anchor/anchor-integration.ts b/packages/integrations/src/anchor/anchor-integration.ts index 5db4a024c..4c4931894 100644 --- a/packages/integrations/src/anchor/anchor-integration.ts +++ b/packages/integrations/src/anchor/anchor-integration.ts @@ -77,7 +77,7 @@ export class AnchorIntegration extends Integration { }); if (!response.ok) { - let errorBody: string | null = null; + let errorBody: string | null; try { errorBody = await response.text(); } catch { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14f6ec1e2..3e44f1ff7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,6 +36,9 @@ catalogs: '@drizzle-team/brocli': specifier: ^0.12.0 version: 0.12.0 + '@eslint/js': + specifier: 10.0.1 + version: 10.0.1 '@extractus/feed-extractor': specifier: 7.1.7 version: 7.1.7 @@ -358,8 +361,8 @@ catalogs: specifier: ^0.28.0 version: 0.28.0 eslint: - specifier: ^9.39.4 - version: 9.39.4 + specifier: ^10.2.1 + version: 10.2.1 eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8 @@ -919,7 +922,7 @@ importers: version: 9.2.1 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 node-loader: specifier: 'catalog:' version: 2.1.0(webpack@5.94.0) @@ -1022,7 +1025,7 @@ importers: version: 0.28.0 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 prettier: specifier: 'catalog:' version: 3.8.3 @@ -1086,7 +1089,7 @@ importers: version: 0.28.0 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 prettier: specifier: 'catalog:' version: 3.8.3 @@ -1132,7 +1135,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1247,7 +1250,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 prettier: specifier: 'catalog:' version: 3.8.3 @@ -1320,7 +1323,7 @@ importers: version: 0.9.2 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 prettier: specifier: 'catalog:' version: 3.8.3 @@ -1351,7 +1354,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1391,7 +1394,7 @@ importers: version: 0.28.0 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1443,7 +1446,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1498,7 +1501,7 @@ importers: version: 8.20.0 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1547,7 +1550,7 @@ importers: version: 19.2.14 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1569,7 +1572,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1639,7 +1642,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1670,7 +1673,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1752,7 +1755,7 @@ importers: version: 0.28.0 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 prettier: specifier: 'catalog:' version: 3.8.3 @@ -1786,7 +1789,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 tsx: specifier: 'catalog:' version: 4.20.4 @@ -1820,7 +1823,7 @@ importers: version: 4.0.1 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1857,7 +1860,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1909,7 +1912,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1937,7 +1940,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1971,7 +1974,7 @@ importers: version: 6.0.0 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2071,7 +2074,7 @@ importers: version: 0.4.14 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2105,7 +2108,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2178,7 +2181,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2206,7 +2209,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2288,7 +2291,7 @@ importers: version: 0.5.8 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2313,7 +2316,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2338,7 +2341,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2375,7 +2378,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2433,7 +2436,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2458,7 +2461,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2495,7 +2498,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2571,7 +2574,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2617,7 +2620,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2687,7 +2690,7 @@ importers: version: 1.0.5 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2718,7 +2721,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2905,7 +2908,7 @@ importers: version: 7.3.58 eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2917,26 +2920,29 @@ importers: version: 16.2.4 eslint-config-prettier: specifier: 'catalog:' - version: 10.1.8(eslint@9.39.4) + version: 10.1.8(eslint@10.2.1) eslint-config-turbo: specifier: 'catalog:' - version: 2.9.6(eslint@9.39.4)(turbo@2.9.6) + version: 2.9.6(eslint@10.2.1)(turbo@2.9.6) eslint-plugin-import: specifier: 'catalog:' - version: 2.32.0(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4) + version: 2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint@10.2.1) eslint-plugin-jsx-a11y: specifier: 'catalog:' - version: 6.10.2(eslint@9.39.4) + version: 6.10.2(eslint@10.2.1) eslint-plugin-react: specifier: 'catalog:' - version: 7.37.5(eslint@9.39.4) + version: 7.37.5(eslint@10.2.1) eslint-plugin-react-hooks: specifier: 'catalog:' - version: 6.1.1(eslint@9.39.4) + version: 6.1.1(eslint@10.2.1) typescript-eslint: specifier: 'catalog:' - version: 8.58.2(eslint@9.39.4)(typescript@5.9.3) + version: 8.58.2(eslint@10.2.1)(typescript@5.9.3) devDependencies: + '@eslint/js': + specifier: 'catalog:' + version: 10.0.1(eslint@10.2.1) '@homarr/prettier-config': specifier: workspace:^0.1.0 version: link:../prettier @@ -2945,7 +2951,7 @@ importers: version: link:../typescript eslint: specifier: 'catalog:' - version: 9.39.4 + version: 10.2.1 typescript: specifier: 'catalog:' version: 5.9.3 @@ -3787,33 +3793,34 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.2': - resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true - '@eslint/js@9.39.4': - resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@exodus/bytes@1.15.0': resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} @@ -5674,6 +5681,9 @@ packages: '@types/dockerode@4.0.1': resolution: {integrity: sha512-cmUpB+dPN955PxBEuXE3f6lKO1hHiIGYJA46IVF3BJpNsZGvtBDcRnlrHYHtOH/B6vtDOyl2kZ2ShAu3mgc27Q==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -7275,25 +7285,25 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@5.0.0: resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.39.4: - resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.2.1: + resolution: {integrity: sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -7301,17 +7311,17 @@ packages: jiti: optional: true - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -7680,10 +7690,6 @@ packages: global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -8401,9 +8407,6 @@ packages: lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.uniqby@4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} @@ -8646,6 +8649,10 @@ packages: resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==} engines: {node: 18 || 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} @@ -10236,10 +10243,6 @@ packages: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - strnum@2.2.3: resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} @@ -11877,50 +11880,38 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1)': dependencies: - eslint: 9.39.4 + eslint: 10.2.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.2': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.5 debug: 4.4.3 - minimatch: 3.1.5 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.5.5': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 - '@eslint/core@0.17.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5': + '@eslint/js@10.0.1(eslint@10.2.1)': + optionalDependencies: + eslint: 10.2.1 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.1': dependencies: - ajv: 6.14.0 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.1 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.39.4': {} - - '@eslint/object-schema@2.1.7': {} - - '@eslint/plugin-kit@0.4.1': - dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 levn: 0.4.1 '@exodus/bytes@1.15.0(@noble/hashes@2.0.1)': @@ -14043,6 +14034,8 @@ snapshots: '@types/node': 24.12.2 '@types/ssh2': 1.15.1 + '@types/esrecurse@4.3.1': {} + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -14183,15 +14176,15 @@ snapshots: dependencies: '@types/node': 24.12.2 - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint@10.2.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.2(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.1)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.2(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.1)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 9.39.4 + eslint: 10.2.1 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -14199,14 +14192,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.58.2 '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 - eslint: 9.39.4 + eslint: 10.2.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -14229,13 +14222,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.58.2(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.58.2(eslint@10.2.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.2(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.1)(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.4 + eslint: 10.2.1 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -14258,13 +14251,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/utils@8.58.2(eslint@10.2.1)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) '@typescript-eslint/scope-manager': 8.58.2 '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - eslint: 9.39.4 + eslint: 10.2.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -15748,14 +15741,14 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.39.4): + eslint-config-prettier@10.1.8(eslint@10.2.1): dependencies: - eslint: 9.39.4 + eslint: 10.2.1 - eslint-config-turbo@2.9.6(eslint@9.39.4)(turbo@2.9.6): + eslint-config-turbo@2.9.6(eslint@10.2.1)(turbo@2.9.6): dependencies: - eslint: 9.39.4 - eslint-plugin-turbo: 2.9.6(eslint@9.39.4)(turbo@2.9.6) + eslint: 10.2.1 + eslint-plugin-turbo: 2.9.6(eslint@10.2.1)(turbo@2.9.6) turbo: 2.9.6 eslint-import-resolver-node@0.3.9: @@ -15766,17 +15759,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.2.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@9.39.4)(typescript@5.9.3) - eslint: 9.39.4 + '@typescript-eslint/parser': 8.58.2(eslint@10.2.1)(typescript@5.9.3) + eslint: 10.2.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint@10.2.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -15785,9 +15778,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.4 + eslint: 10.2.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.2.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15799,13 +15792,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.1)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4): + eslint-plugin-jsx-a11y@6.10.2(eslint@10.2.1): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -15815,7 +15808,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.4 + eslint: 10.2.1 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -15824,17 +15817,17 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@6.1.1(eslint@9.39.4): + eslint-plugin-react-hooks@6.1.1(eslint@10.2.1): dependencies: '@babel/core': 7.29.0 '@babel/parser': 7.29.2 - eslint: 9.39.4 + eslint: 10.2.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.4): + eslint-plugin-react@7.37.5(eslint@10.2.1): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -15842,7 +15835,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.39.4 + eslint: 10.2.1 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -15856,10 +15849,10 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.9.6(eslint@9.39.4)(turbo@2.9.6): + eslint-plugin-turbo@2.9.6(eslint@10.2.1)(turbo@2.9.6): dependencies: dotenv: 16.0.3 - eslint: 9.39.4 + eslint: 10.2.1 turbo: 2.9.6 eslint-scope@5.1.1: @@ -15867,40 +15860,39 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.1: {} - eslint-visitor-keys@5.0.0: {} - eslint@9.39.4: + eslint-visitor-keys@5.0.1: {} + + eslint@10.2.1: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.39.4 - '@eslint/plugin-kit': 0.4.1 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.8 ajv: 6.14.0 - chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -15910,22 +15902,21 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: - supports-color - espree@10.4.0: + espree@11.2.0: dependencies: acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 4.2.1 + eslint-visitor-keys: 5.0.1 esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -16324,8 +16315,6 @@ snapshots: min-document: 2.19.0 process: 0.11.10 - globals@14.0.0: {} - globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -17049,8 +17038,6 @@ snapshots: lodash.isstring@4.0.1: {} - lodash.merge@4.6.2: {} - lodash.uniqby@4.7.0: {} lodash@4.18.1: {} @@ -17412,6 +17399,10 @@ snapshots: dependencies: brace-expansion: 5.0.5 + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 + minimatch@3.1.5: dependencies: brace-expansion: 5.0.5 @@ -19205,8 +19196,6 @@ snapshots: strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} - strnum@2.2.3: {} style-to-js@1.1.16: @@ -19675,13 +19664,13 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript-eslint@8.58.2(eslint@9.39.4)(typescript@5.9.3): + typescript-eslint@8.58.2(eslint@10.2.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/parser': 8.58.2(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint@10.2.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.1)(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.2(eslint@9.39.4)(typescript@5.9.3) - eslint: 9.39.4 + '@typescript-eslint/utils': 8.58.2(eslint@10.2.1)(typescript@5.9.3) + eslint: 10.2.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 882bf2124..a64edc836 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,11 +2,6 @@ packages: - apps/* - packages/* - tooling/* -minimumReleaseAge: 4320 -minimumReleaseAgeExclude: - - next - - "@next/*" -catalogMode: strict catalog: "@auth/core": ^0.41.2 "@auth/drizzle-adapter": ^1.11.2 @@ -18,6 +13,7 @@ catalog: "@dnd-kit/sortable": ^10.0.0 "@dnd-kit/utilities": ^3.2.2 "@drizzle-team/brocli": ^0.12.0 + '@eslint/js': 10.0.1 "@extractus/feed-extractor": 7.1.7 "@gitbeaker/rest": ^43.8.0 "@homarr/gridstack": ^1.12.0 @@ -125,7 +121,7 @@ catalog: drizzle-orm: ^0.45.2 drizzle-zod: ^0.8.3 esbuild: ^0.28.0 - eslint: ^9.39.4 + eslint: ^10.2.1 eslint-config-prettier: ^10.1.8 eslint-config-turbo: ^2.9.6 eslint-plugin-import: ^2.32.0 @@ -192,3 +188,8 @@ catalog: zod: ^4.3.6 zod-form-data: ^3.0.1 zod-validation-error: ^5.0.0 +catalogMode: strict +minimumReleaseAge: 4320 +minimumReleaseAgeExclude: + - next + - "@next/*" diff --git a/tooling/eslint/base.js b/tooling/eslint/base.js index c84d20581..638928a52 100644 --- a/tooling/eslint/base.js +++ b/tooling/eslint/base.js @@ -1,10 +1,9 @@ -/// - import eslint from "@eslint/js"; import importPlugin from "eslint-plugin-import"; +import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; -export default tseslint.config( +export default defineConfig( { // Globally ignored files ignores: ["**/*.config.js", "**/*.cjs", "**/lang/*.d.json.ts"], diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index de116c6a1..60cee7fb8 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -27,6 +27,7 @@ "typescript-eslint": "catalog:" }, "devDependencies": { + "@eslint/js": "catalog:", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "catalog:", diff --git a/tooling/eslint/react.js b/tooling/eslint/react.js index abbf8f1d1..d9e9e7355 100644 --- a/tooling/eslint/react.js +++ b/tooling/eslint/react.js @@ -1,3 +1,5 @@ +/// + import reactPlugin from "eslint-plugin-react"; import hooksPlugin from "eslint-plugin-react-hooks"; diff --git a/tooling/eslint/types.d.ts b/tooling/eslint/types.d.ts index 37cfded93..bdee07619 100644 --- a/tooling/eslint/types.d.ts +++ b/tooling/eslint/types.d.ts @@ -1,38 +1,3 @@ -/** - * Since the ecosystem hasn't fully migrated to ESLint's new FlatConfig system yet, - * we "need" to type some of the plugins manually :( - */ - -declare module "@eslint/js" { - // Why the hell doesn't eslint themselves export their types? - import type { Linter } from "eslint"; - - export const configs: { - readonly recommended: { readonly rules: Readonly }; - readonly all: { readonly rules: Readonly }; - }; -} - -declare module "eslint-plugin-import" { - import type { Linter, Rule } from "eslint"; - - export const configs: { - recommended: { rules: Linter.RulesRecord }; - }; - export const rules: Record; -} - -declare module "eslint-plugin-react" { - import type { Linter, Rule } from "eslint"; - - export const configs: { - recommended: { rules: Linter.RulesRecord }; - all: { rules: Linter.RulesRecord }; - "jsx-runtime": { rules: Linter.RulesRecord }; - }; - export const rules: Record; -} - declare module "eslint-plugin-react-hooks" { import type { Linter, Rule } from "eslint"; @@ -46,13 +11,3 @@ declare module "eslint-plugin-react-hooks" { }; export const rules: Record; } - -declare module "@next/eslint-plugin-next" { - import type { Linter, Rule } from "eslint"; - - export const configs: { - recommended: { rules: Linter.RulesRecord }; - "core-web-vitals": { rules: Linter.RulesRecord }; - }; - export const rules: Record; -} From 90ca3770a1ac41633fc12651a91dc217489aa573 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sun, 3 May 2026 10:12:22 +0000 Subject: [PATCH 024/116] chore(deps): update tiptap monorepo to v3.22.5 (#5628) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 584 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 32 +-- 2 files changed, 308 insertions(+), 308 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e44f1ff7..e2ffba230 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -151,53 +151,53 @@ catalogs: specifier: ^11.14.0 version: 11.14.0 '@tiptap/extension-color': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-highlight': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-image': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-link': - specifier: ^3.22.4 - version: 3.22.4 + specifier: ^3.22.5 + version: 3.22.5 '@tiptap/extension-placeholder': - specifier: ^3.22.4 - version: 3.22.4 + specifier: ^3.22.5 + version: 3.22.5 '@tiptap/extension-table': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-table-cell': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-table-header': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-table-row': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-task-item': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-task-list': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-text-align': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-text-style': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/extension-underline': - specifier: 3.22.4 - version: 3.22.4 + specifier: 3.22.5 + version: 3.22.5 '@tiptap/react': - specifier: ^3.22.4 - version: 3.22.4 + specifier: ^3.22.5 + version: 3.22.5 '@tiptap/starter-kit': - specifier: ^3.22.4 - version: 3.22.4 + specifier: ^3.22.5 + version: 3.22.5 '@trpc/client': specifier: ^11.16.0 version: 11.16.0 @@ -783,7 +783,7 @@ importers: version: 8.3.18(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/hooks@8.3.18(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@mantine/tiptap': specifier: 'catalog:' - version: 8.3.18(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/hooks@8.3.18(react@19.2.5))(@tiptap/extension-link@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))(@tiptap/react@3.22.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 8.3.18(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/hooks@8.3.18(react@19.2.5))(@tiptap/extension-link@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))(@tiptap/react@3.22.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@million/lint': specifier: 'catalog:' version: 1.0.14(webpack-sources@3.3.4) @@ -2811,52 +2811,52 @@ importers: version: 3.41.1(react@19.2.5) '@tiptap/extension-color': specifier: 'catalog:' - version: 3.22.4(@tiptap/extension-text-style@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))) + version: 3.22.5(@tiptap/extension-text-style@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))) '@tiptap/extension-highlight': specifier: 'catalog:' - version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) '@tiptap/extension-image': specifier: 'catalog:' - version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) '@tiptap/extension-link': specifier: 'catalog:' - version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + version: 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) '@tiptap/extension-placeholder': specifier: 'catalog:' - version: 3.22.4(@tiptap/extensions@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) '@tiptap/extension-table': specifier: 'catalog:' - version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + version: 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) '@tiptap/extension-table-cell': specifier: 'catalog:' - version: 3.22.4(@tiptap/extension-table@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/extension-table@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) '@tiptap/extension-table-header': specifier: 'catalog:' - version: 3.22.4(@tiptap/extension-table@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/extension-table@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) '@tiptap/extension-table-row': specifier: 'catalog:' - version: 3.22.4(@tiptap/extension-table@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/extension-table@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) '@tiptap/extension-task-item': specifier: 'catalog:' - version: 3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) '@tiptap/extension-task-list': specifier: 'catalog:' - version: 3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) '@tiptap/extension-text-align': specifier: 'catalog:' - version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) '@tiptap/extension-text-style': specifier: 'catalog:' - version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) '@tiptap/extension-underline': specifier: 'catalog:' - version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) + version: 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) '@tiptap/react': specifier: 'catalog:' - version: 3.22.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 3.22.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tiptap/starter-kit': specifier: 'catalog:' - version: 3.22.4 + version: 3.22.5 clsx: specifier: 'catalog:' version: 2.1.1 @@ -5283,215 +5283,215 @@ packages: '@testcontainers/redis@11.14.0': resolution: {integrity: sha512-WX005slz2JMQPw2avbSjf5awVjpmFhOs5xCxeGSYLcV5ia4W1edv/P6MdOw4dZnvDQDuN5LfqNoV/ut3XGb2pA==} - '@tiptap/core@3.22.4': - resolution: {integrity: sha512-vGIGm/HpqLg8EAAQXQ+koV+/S828OEpzocfWcPOwo1u2QUVf9dQG47Yy6JJ8zFFaJwfv4dBcOXli+7BrJwsxDQ==} + '@tiptap/core@3.22.5': + resolution: {integrity: sha512-L1lhWz6ujGny8LduTJ7MBWYhzigwOvfUJUrJ7IzOJSuy3+OAzisdGDD1GV7LEO/hU0Hr2Mkm1wajRIHExvS9HQ==} peerDependencies: - '@tiptap/pm': 3.22.4 + '@tiptap/pm': 3.22.5 - '@tiptap/extension-blockquote@3.22.4': - resolution: {integrity: sha512-7/61kNPbGFhMgM//zMknD0pSb69rGdRIkpulXOWS1JBrFHkH6hjZDfrOETNzgKkO+NlmzVl9rXSTv0xauS3lzA==} + '@tiptap/extension-blockquote@3.22.5': + resolution: {integrity: sha512-ajyP5W8fG5Hrru47T/eF3xMKOpNvWofgNJqBTeNuGl02sYxsy9a4EunyFxudsaZP9WW3VOD4SaIWr5+MqpbnOQ==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-bold@3.22.4': - resolution: {integrity: sha512-jIaPKfNOQu2lhpbLDvtwlQqM+mjF+Kk+auHpzYjBnsuwUli1Cl5ZOau7RH+rru/SQvZe1DtpQlANujDywugZAA==} + '@tiptap/extension-bold@3.22.5': + resolution: {integrity: sha512-l/uDtpJISiFFyfctvnODNWBN/XPZI1jVZRacTRDDnSn8+x6KQ7G2qgFYueU7KvVJGDFVT39Iio56mcFRG/Pozg==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-bubble-menu@3.22.4': - resolution: {integrity: sha512-v4pux5Ql3THAEjaLMY4ldtdy/Xy2qU7PJLBkq8ugLp8qicaKC+tpqxp6sGif4vLIjz7Ap5hurRbTNbXzszyyHA==} + '@tiptap/extension-bubble-menu@3.22.5': + resolution: {integrity: sha512-yrNlFQQJY5MmhBpmD8tnmaSmyUQrEvgyPKa3bzVeWEhDSG1CW4A0ZSMx3hrA9yFO0HWfw3IJmvSCycEZQBalpQ==} peerDependencies: - '@tiptap/core': 3.22.4 - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5 + '@tiptap/pm': 3.22.5 - '@tiptap/extension-bullet-list@3.22.4': - resolution: {integrity: sha512-TB+d3fGcTixYjO7coKqTr1mGTJuqr8hjDCPUFgzuvKyJnBhqWITmBzQ/8CLq4rr6mihgGURbD3N+xkQuPAKFiw==} + '@tiptap/extension-bullet-list@3.22.5': + resolution: {integrity: sha512-cf54fG9AybU8NgPMv1TOcoqAkELeRc/VpnSCt/rIJZphWQx9nsFmrtkrlCatrIcCaGtNZYwlHlMnC5LVVMu0uA==} peerDependencies: - '@tiptap/extension-list': 3.22.4 + '@tiptap/extension-list': 3.22.5 - '@tiptap/extension-code-block@3.22.4': - resolution: {integrity: sha512-MEurzNXfMET3rhjpoPJYUgMfxTdTqbzT9+ToFrqNGAHocdXVm6m1hhO2frVC7fEtHPnxXKsn0Z3NUbCRkRTLuA==} + '@tiptap/extension-code-block@3.22.5': + resolution: {integrity: sha512-d123kCfLdJTi4fue1m0+TNFztDkmIRSZGZmGu6H9KqwG5Q7IzjT9o8lzRsz+pXxYqHvqgYmXoEpM6srbzXx/Ag==} peerDependencies: - '@tiptap/core': 3.22.4 - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5 + '@tiptap/pm': 3.22.5 - '@tiptap/extension-code@3.22.4': - resolution: {integrity: sha512-cnbxmVhAcc7X3G81QUYEmKP0ve2hRmvAiFXBuuv9RUtQlBiRnzmhHoJOMgkX0CsMR7+8kMRpTfeDUYq2xp5s5w==} + '@tiptap/extension-code@3.22.5': + resolution: {integrity: sha512-mwDNOJC9rYbDu/JcqrN4dbUQRklJU8Fuk2raxD/IvFw9qUIcPCmxQ2XT9UTKmZz/Ju7Kdy72fss6XpgWv6gLAQ==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-color@3.22.4': - resolution: {integrity: sha512-1vDuVsrOETshe4j4nZhWalbKYcWfNybRCe30h829ExX06XwFryUYLb/LgTIaGCr9beWZUldsK+vOkBWdDTGMTw==} + '@tiptap/extension-color@3.22.5': + resolution: {integrity: sha512-4aTygOUlTFBYCvJy67SeKVdXCQw7du3Rj+N5ZutVnDnrpfzUBWsO7f+I+iDS8eMQFbWxVFLlWxGMcTbjtk1a+Q==} peerDependencies: - '@tiptap/extension-text-style': 3.22.4 + '@tiptap/extension-text-style': 3.22.5 - '@tiptap/extension-document@3.22.4': - resolution: {integrity: sha512-XQKla1+703FqQJC48tPDVgt9ucGiFbIEmQdOg5L5o07z9a6/NzuaZAc+1zJ7NxcUZzy+z6wBn1PrVMTiqiSXlw==} + '@tiptap/extension-document@3.22.5': + resolution: {integrity: sha512-8NJERd+pCtvSuEP4C4WMGYmRRCV12ePZL7bC+QUdFlbdXg+kNZS0zZ7hh879tYA0Kidbi8rWWD1Tx+H2ezkmMw==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-dropcursor@3.22.4': - resolution: {integrity: sha512-N9/yMDC35jJp0V/naL0+6gi4gUDUIcPpWEzFdCDWUSYBA8mt41c1kI1ZU7UTKYIBzTClenhYHRc2XKZxxx0+LQ==} + '@tiptap/extension-dropcursor@3.22.5': + resolution: {integrity: sha512-Mp40DaFrY3sEUVtFqmxrR0BmU4G3k8GCYYNGqNa9OqWv7BrcFDC03V2n3okESDKt4MKkzhQQmypq+ouLy8dLfA==} peerDependencies: - '@tiptap/extensions': 3.22.4 + '@tiptap/extensions': 3.22.5 - '@tiptap/extension-floating-menu@3.22.4': - resolution: {integrity: sha512-DFuyYxgaZPgxum5z1yvJPbfYCvDdO8geXsdyqt0qYYdiat3aGE4ncJhiLRIFDhSHBhaZg5eCgu/YPYAN6jZnrA==} + '@tiptap/extension-floating-menu@3.22.5': + resolution: {integrity: sha512-dhem4sTPhyQgQ+pFp2Oud4k4FSQz9PVMgeQAC9288SmGwxBkJNveDAw6sKTMrumqDvwkJrtslXIupq9TZYQnzg==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': 3.22.4 - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5 + '@tiptap/pm': 3.22.5 - '@tiptap/extension-gapcursor@3.22.4': - resolution: {integrity: sha512-UYBEUj3SFpKINIE7AdzcyeS3xICK+ee+YLBbuqNXyHStYChjJOohzJehqiqhjR16A88KQQ+ZjgyDcItKGygSog==} + '@tiptap/extension-gapcursor@3.22.5': + resolution: {integrity: sha512-4WkMu7qqjbsm8hCQS+8X+la1wjriN0SKoRdvpfKH33qM50MB34tYJuGLAO+y7TTh4MMMco3AZCKPBL5JVMqNIg==} peerDependencies: - '@tiptap/extensions': 3.22.4 + '@tiptap/extensions': 3.22.5 - '@tiptap/extension-hard-break@3.22.4': - resolution: {integrity: sha512-xq+a4dE7T6VwApCkh/yU3p30gn3F8g8Arb9CyEZm58/WIJUIGvHSTjDdHmvU16+kiWSBg+wOOsaFHhYjJjxcKA==} + '@tiptap/extension-hard-break@3.22.5': + resolution: {integrity: sha512-n0R2mUVYZU2AVbJhg/WcY9+zx690wVwvsItHJf0DrYbf1tCYHx+PRHUt/AoXk6u8BSmnkb8/FDziS8m3mjfpSg==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-heading@3.22.4': - resolution: {integrity: sha512-TUaj5f0Ir5qy9HKKt2ocnwfXKpZDYeHgbbP9gshKFzdq5PLe1RbIgkjfy6bnoI865cYjmPYWRjcT7XsKyIcb9Q==} + '@tiptap/extension-heading@3.22.5': + resolution: {integrity: sha512-hjyEG4947PAhMBfP1G6B0QAh6+y9mp2C5BQmNjprA05/lQzDAT7KFZzNh8ZVp3ol6aICKq/N1gFOW9Dc/9FUOw==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-highlight@3.22.4': - resolution: {integrity: sha512-QItbgkWqGZ04rOdYfjrn1TaUTv9XLKQE9VVJm9f6bxCpacPREJpz4lzkdea6zISHBZjEXJzlkjRWZP0zQLXXFA==} + '@tiptap/extension-highlight@3.22.5': + resolution: {integrity: sha512-byWruAOKcqRN0OuzVSKqLLrced3M9AZaR2pD1BV3aUZHzMzeBjLBfByh8s4lExH2Z547xQUdHHnUflBQ572I5A==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-horizontal-rule@3.22.4': - resolution: {integrity: sha512-cCI1HekGQwhY/MbgaKQ0R/7HcH5ZM1oFAyI/J72QGLC0XnF403S/OXoHMuBWr1mCu8hNiQWCzeNRJUty0iytNw==} + '@tiptap/extension-horizontal-rule@3.22.5': + resolution: {integrity: sha512-vUV0/ugIbXOc8SJib0h8UMhgcqZXWu/dkEhlswZN4VVven1o5enkfxEiDw+OyIJHi5rUkrdhsQ/KTxG/Xb7X8A==} peerDependencies: - '@tiptap/core': 3.22.4 - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5 + '@tiptap/pm': 3.22.5 - '@tiptap/extension-image@3.22.4': - resolution: {integrity: sha512-ZDc+fLaratTQ4IgnKcJJwfUgUgpcHjbZSBi6UQAILJwkflMy1Zxj8mpbma5P934nLSI+uDnR5ret6ZZLNITKhA==} + '@tiptap/extension-image@3.22.5': + resolution: {integrity: sha512-ezMzA6w6UsPesQp6fxTQojI/IkGJLmkwR/VGTimva7sudP3HdSW8k3SGBkjfvp0L2xqUrC/l4nWOchu01A/xtQ==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-italic@3.22.4': - resolution: {integrity: sha512-fVSDx5AYXgDI3v2zZIqb7V8EewthwM2NJ/ZCX+XaxRsqNEpnjVhgHs7UlvDqK1wj2OJ6zmUNjPtVlAFRxwT+HQ==} + '@tiptap/extension-italic@3.22.5': + resolution: {integrity: sha512-4T8baSiLkeIymTgEwirxDFt5YgYofkP3m1+MGYdGy2HKcOK+1vpvlPhEO1X5qtZngtJW5S4+njKjinRg52A4PA==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-link@3.22.4': - resolution: {integrity: sha512-uoP3yus02uwGPVzW2QaEPJWVIrUb/r5nKm6c8DiJv9fNSX1+gykZZMg42c6GwRFLZ/vyfWjVCbAE03VMUqafgA==} + '@tiptap/extension-link@3.22.5': + resolution: {integrity: sha512-d671MvF3GPKoS2OVxjIlQ7hIE7MS3hREdR+d4cvnnoiLLD+ZJ6KgDnxmWqF0a1s4qxLWK2KxKRSOIfYGE31QWQ==} peerDependencies: - '@tiptap/core': 3.22.4 - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5 + '@tiptap/pm': 3.22.5 - '@tiptap/extension-list-item@3.22.4': - resolution: {integrity: sha512-H659KXTvggSypIDWSOJBZ37jh9pKjQriDDvYPYvOZCdfij0D0hsDXN/wXoypArneUkoBdgruHfTtMkFOaQlgkw==} + '@tiptap/extension-list-item@3.22.5': + resolution: {integrity: sha512-W7uTmyKLhlsvuTPLv+8WwnsY+mlikBFIoLSvVcBaFt4MwpsZ+DeB6KQg02Y7tbtaAnG7rXu9Fvw2QORh2P728A==} peerDependencies: - '@tiptap/extension-list': 3.22.4 + '@tiptap/extension-list': 3.22.5 - '@tiptap/extension-list-keymap@3.22.4': - resolution: {integrity: sha512-t/zhker4oIS78AIGYDdFFfZC6zSBlszfD7z/zqFLGCg5PHNNgkZK5hKj6Vyix6D2SapRn/ajnx+8mhbKIUH5eA==} + '@tiptap/extension-list-keymap@3.22.5': + resolution: {integrity: sha512-cGUnxJ0y515e1bVHNjUmbx7oWHoEon59w6BA5N2KwV9iW2mZZchlTX4yxJSOX+ixeVRChsa7YwC3Z1jUZ6AMEg==} peerDependencies: - '@tiptap/extension-list': 3.22.4 + '@tiptap/extension-list': 3.22.5 - '@tiptap/extension-list@3.22.4': - resolution: {integrity: sha512-Xe8UFvvHmyp/c/TJsFwlwU9CWACYbBirNsluJ3U1+H8BTu1wqdrT/AXR5uIXeyCl5kiWKgX5q71eHWbYFOrqrg==} + '@tiptap/extension-list@3.22.5': + resolution: {integrity: sha512-cVO3ZHCgxAWZ4zrFSs81FO2nyCk1wb2EHkpLpW98FzbJLkN9rDkazhW99P3HRWy/CvUldOT+8ecI1YrQtBojMg==} peerDependencies: - '@tiptap/core': 3.22.4 - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5 + '@tiptap/pm': 3.22.5 - '@tiptap/extension-ordered-list@3.22.4': - resolution: {integrity: sha512-w77hPVf7pcHt97vfrybg/l0t5CimCd4y75OJKuHuo3CfgM5xbUP/gaPNMDyLLe7MYole/UHi/XvG3XjgzqTzAw==} + '@tiptap/extension-ordered-list@3.22.5': + resolution: {integrity: sha512-OXdh4k4CNrukwiSdWdEQ49uvgnqvR0Z9aNSP4HI5/kZQ/Te1NtRtYCpUrzWyO/7CtjcCisXHti0o9C/TV8YMbQ==} peerDependencies: - '@tiptap/extension-list': 3.22.4 + '@tiptap/extension-list': 3.22.5 - '@tiptap/extension-paragraph@3.22.4': - resolution: {integrity: sha512-de6dFkIhigiENESY6rNJ3yTVS/337ybfP30dNPudTwGe9oAu9ZCS+04j6QCvXSjhlI3ULiv7wiSHqrP26Gd+Hw==} + '@tiptap/extension-paragraph@3.22.5': + resolution: {integrity: sha512-52KCto4+XKpnBWpIufspWLyq4UWxAWC72ANPdGuIhbi72NRTabiTbTVN40uwGSPkyakeESG0/vKdWJCVvB4f0g==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-placeholder@3.22.4': - resolution: {integrity: sha512-Z3wtWL+KufwkC7CkJge5enAxx4q8C3oOYixme02snY9zfjX3V/1pjAmEfP4wxScgM5GIuTEJ83B9Yz3wRzPA6Q==} + '@tiptap/extension-placeholder@3.22.5': + resolution: {integrity: sha512-MZAohQ3FCS763BkhGXgaWRya6WruZjwRwEAkXP8vkxbERzl2OJRjniS4uXCWzAlRb3ttE103SnY7LMdM8FvsXw==} peerDependencies: - '@tiptap/extensions': 3.22.4 + '@tiptap/extensions': 3.22.5 - '@tiptap/extension-strike@3.22.4': - resolution: {integrity: sha512-aRHWQj42HiailXSC9LkKYM3jWMcSeGwOjbqM4PiuxQZmHVDRFmeHkfJItOdn2cSHaO0vuEVK+TvrWUWsBFi3pg==} + '@tiptap/extension-strike@3.22.5': + resolution: {integrity: sha512-42WrrFK5gOom/0znH85x12Mw5IQ/6O6DWdyUWoRIrNA/qJpuHtU8oVU+bIgU2tuomMGHruRjIzgBQv5sBjEtww==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-table-cell@3.22.4': - resolution: {integrity: sha512-uvFegCc1UQYK2nfIV2sIHg+hzLIMroJJm00XomzBgC1w/eSO7Ui8APiDh/baBcTPpCSU3SLiQLTgx7AU7oE3pg==} + '@tiptap/extension-table-cell@3.22.5': + resolution: {integrity: sha512-Wn4asCgNLfOPH5EOpiMjzOJXTZvv+TTqUT+gzm2fV69ZkleCGNO0BZwuR/TCIDLGIArbvHzyYy2/lJAfG4UCtg==} peerDependencies: - '@tiptap/extension-table': 3.22.4 + '@tiptap/extension-table': 3.22.5 - '@tiptap/extension-table-header@3.22.4': - resolution: {integrity: sha512-V4kLLWeRdc/I+IXiXZZhLAjsaHHiJWuLXTuOtZRDrCxQUiFLi4AgNg1DPQ09JAANkEWDhXq3x6BoUXaFwumbEw==} + '@tiptap/extension-table-header@3.22.5': + resolution: {integrity: sha512-aJmbgbO6QbSj0Rw3X4ogGPyd+8FwP6RgG71Dpa3NovzVkqJc3ZUq0wC3XH48U9Hd89F8f4AggFgHjU6/kQAgQQ==} peerDependencies: - '@tiptap/extension-table': 3.22.4 + '@tiptap/extension-table': 3.22.5 - '@tiptap/extension-table-row@3.22.4': - resolution: {integrity: sha512-9tdS6jgS6DqUu5TpEmNrRoo/DL5Xam0PyrQaUEXUC+ssci+bMRCJ8PAWMcunNsI9NKf/Tb3wYrv6hGFChaT9uA==} + '@tiptap/extension-table-row@3.22.5': + resolution: {integrity: sha512-9A2BdX+R+P71f192Fo74OttMHj1WoFVO0ezaCzFbT8uNVG3nCJ7B5/1UkTlzqDdGOuWh1VpR63pFZP9LFsUv6A==} peerDependencies: - '@tiptap/extension-table': 3.22.4 + '@tiptap/extension-table': 3.22.5 - '@tiptap/extension-table@3.22.4': - resolution: {integrity: sha512-kjvLv3Z4JI+1tLDqZKa+bKU8VcxY+ZOyMCKWQA7wYmy8nKWkLJ60W+xy8AcXXpHB2goCIgSFLhsTyswx0GXH4w==} + '@tiptap/extension-table@3.22.5': + resolution: {integrity: sha512-GMBM07bCwzHx1NK08zXRr2mNTDnP78Hd0VxFsRBIDFddDMZ2qG5jhwKHXN5cHMTrdWokWFUjvnEeJeV3guHoGg==} peerDependencies: - '@tiptap/core': 3.22.4 - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5 + '@tiptap/pm': 3.22.5 - '@tiptap/extension-task-item@3.22.4': - resolution: {integrity: sha512-PhoiOMatdRXJU1HJz0fMP5N7wv0eYAz/Id/gphby/gdxjYQaMhJ7vQiLTR28EkVBkdntTUb1bwZ4XQn9thFtpw==} + '@tiptap/extension-task-item@3.22.5': + resolution: {integrity: sha512-OVJKiq67lU+RiC6slIhhgTJBlP/Vads6MZ7Ld5wxzCtWMdGKDuzQ1dgF7vrMEs7mhSeSH3phNcIdQ5ypYftZ9w==} peerDependencies: - '@tiptap/extension-list': 3.22.4 + '@tiptap/extension-list': 3.22.5 - '@tiptap/extension-task-list@3.22.4': - resolution: {integrity: sha512-5M3XiZMZJ2mwWSUKPG4mb90g86rpgYw7yf8lBEkaCgke9XxsLg8mXmYRpCc6n/v1TQXryB+WDKuenCzJTx/4/A==} + '@tiptap/extension-task-list@3.22.5': + resolution: {integrity: sha512-SfZeJSALtFODs0i3fml1TSi4vQ4Uopu0p/LndK+mX5FGNBtNmWiy7Wr5cH03ANfzj8c2EzfGIyH+F2/V0HLK9g==} peerDependencies: - '@tiptap/extension-list': 3.22.4 + '@tiptap/extension-list': 3.22.5 - '@tiptap/extension-text-align@3.22.4': - resolution: {integrity: sha512-W7TnXWSyfDXSatGXp5y/CahE8G4btrQPb0/sy+eG+42FxdzYsqvh1ys3OE9j2XSuTrZ1q/tZA/NLPUkc7vw6Kw==} + '@tiptap/extension-text-align@3.22.5': + resolution: {integrity: sha512-LNUinhsZJC+/Vm7ugtghSjqlO64FQuww8oJkHq54Oh135fJ+kY2yBRakYFeH0P0gl4VPJH13AUetLF696CM2UQ==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-text-style@3.22.4': - resolution: {integrity: sha512-24DVBdySNKq3ovY+v9ERVxAyHStDa6ftUlyoHuZv0YXQ2amjUNOmqQtGEHBIULpCbBb1jZ+atHhv9MBZ0Ia9Pw==} + '@tiptap/extension-text-style@3.22.5': + resolution: {integrity: sha512-jt63jy8YbhZJUGMxTUzeivLhowGtFp6YbCFrrmZJ7G6IHu8X8LJzO81ksz5nT5l8DKpldGwnINUfA6iE91JIAg==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-text@3.22.4': - resolution: {integrity: sha512-mM69uUW5cSxIhyEpWXi/YcfyupcJMDLCPEfYi62awH0iOP/LRoCv/nHjJq4Hyj/KxRJbe8HKwIUnqaCUf7m5Pg==} + '@tiptap/extension-text@3.22.5': + resolution: {integrity: sha512-bzpDOdAEo1JeoVZDIyV0oY0jGXkEG+AzF70SzHoRSjOvFDtKWunyXf9eO1OnOr2/fmMcckT2qwUBNBMQplWBzw==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extension-underline@3.22.4': - resolution: {integrity: sha512-08kGdbhIrA6h10GWXqOkqIveaBj5tmxclK208/nUIAlonI9hPd739vu7fmVtpnmqCnSSNpoRtU4u6Gj5at0ZpA==} + '@tiptap/extension-underline@3.22.5': + resolution: {integrity: sha512-9ut09rJD0iEbS6sk7yd2j6IwuFDLTNmDEGTDLodvqAfi+bq7ddsTDv0YviXoZaA9sdHAdTEVr2ITy2m6WK5jpA==} peerDependencies: - '@tiptap/core': 3.22.4 + '@tiptap/core': 3.22.5 - '@tiptap/extensions@3.22.4': - resolution: {integrity: sha512-fOe8VptJvLPs32bNdUYo8SRyljwqKNQVXWW056VoXIc5en/59OdJlJQVeHI0jRRciH3MtrqODi/gfJR0VHNZ8A==} + '@tiptap/extensions@3.22.5': + resolution: {integrity: sha512-Ifg4MzKCj3uRqe3ieTwYnomu2y4p7EXr2avVSKZYfh12i2dyWe2Gkn1KuZDREANVE+gHqFlQjJRYzhJFwzSCrg==} peerDependencies: - '@tiptap/core': 3.22.4 - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5 + '@tiptap/pm': 3.22.5 - '@tiptap/pm@3.22.4': - resolution: {integrity: sha512-hj8Qka6WcHRllHUdeSjDnq2XaisUo4KsoGJc1WcFpoa1Yd+OeD861zUMnV7DFVGdZRy45Obht0CUYJpXQ4yA4w==} + '@tiptap/pm@3.22.5': + resolution: {integrity: sha512-Cr9Mv4igxvI2tKMiahw48sZxva3PfDzypErH8IB82N+9qa9n9ygVMt0BOaDg53hLKxEEVeYr2S/wCcJIVFgBTw==} - '@tiptap/react@3.22.4': - resolution: {integrity: sha512-XIQZPwLakR1t8+Q1UeCpr+kUHDWxpJzGy9r2xUi3mpPd6Wh8dtNltScBkUlCcr0sqc6J1GF6Is02JJVQGmCZMA==} + '@tiptap/react@3.22.5': + resolution: {integrity: sha512-36WHEs+vPmB//V1ff7Ujcnpz7Ey5g8lhpI/0+hoanSbdiPMTQ7qZVWwMovIkMKDlqWVp2fxBgeYM1861jyFzTw==} peerDependencies: - '@tiptap/core': 3.22.4 - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5 + '@tiptap/pm': 3.22.5 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@3.22.4': - resolution: {integrity: sha512-qWjw+vfdin1rzMRpRU4cC5tLTwMJtUpXeQukv+6mOqqvhptuwuZBjUHImVEJaSPoHXS7+1ut+nTnrLyWyEuE5Q==} + '@tiptap/starter-kit@3.22.5': + resolution: {integrity: sha512-LZ/LYbwH6rnDi5DnRyagkuNsYAVyhM+yJvvz+ZuYA0JkPiTXJV86J5PWSKew8M0gVfMHcNVtKjfQCvViFCeIgw==} '@tree-sitter-grammars/tree-sitter-yaml@0.7.1': resolution: {integrity: sha512-AynBwkIoQCTgjDR33bDUp9Mqq+YTco0is3n5hRApMqG9of/6A4eQsfC1/uSEeHSUyMQSYawcAWamsexnVpIP4Q==} @@ -12482,12 +12482,12 @@ snapshots: dependencies: react: 19.2.5 - '@mantine/tiptap@8.3.18(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/hooks@8.3.18(react@19.2.5))(@tiptap/extension-link@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))(@tiptap/react@3.22.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@mantine/tiptap@8.3.18(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/hooks@8.3.18(react@19.2.5))(@tiptap/extension-link@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))(@tiptap/react@3.22.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@mantine/core': 8.3.18(@mantine/hooks@8.3.18(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@mantine/hooks': 8.3.18(react@19.2.5) - '@tiptap/extension-link': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) - '@tiptap/react': 3.22.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tiptap/extension-link': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/react': 3.22.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react: 19.2.5 react-dom: 19.2.5(react@19.2.5) @@ -13632,168 +13632,168 @@ snapshots: - bare-buffer - supports-color - '@tiptap/core@3.22.4(@tiptap/pm@3.22.4)': + '@tiptap/core@3.22.5(@tiptap/pm@3.22.5)': dependencies: - '@tiptap/pm': 3.22.4 + '@tiptap/pm': 3.22.5 - '@tiptap/extension-blockquote@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-blockquote@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-bold@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-bold@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-bubble-menu@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)': + '@tiptap/extension-bubble-menu@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': dependencies: '@floating-ui/dom': 1.7.4 - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/pm': 3.22.5 optional: true - '@tiptap/extension-bullet-list@3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-bullet-list@3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extension-list': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-code-block@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)': + '@tiptap/extension-code-block@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/pm': 3.22.5 - '@tiptap/extension-code@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-code@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-color@3.22.4(@tiptap/extension-text-style@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)))': + '@tiptap/extension-color@3.22.5(@tiptap/extension-text-style@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)))': dependencies: - '@tiptap/extension-text-style': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) + '@tiptap/extension-text-style': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-document@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-document@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-dropcursor@3.22.4(@tiptap/extensions@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-dropcursor@3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extensions': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extensions': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-floating-menu@3.22.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)': + '@tiptap/extension-floating-menu@3.22.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': dependencies: '@floating-ui/dom': 1.7.4 - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/pm': 3.22.5 optional: true - '@tiptap/extension-gapcursor@3.22.4(@tiptap/extensions@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-gapcursor@3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extensions': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extensions': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-hard-break@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-hard-break@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-heading@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-heading@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-highlight@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-highlight@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-horizontal-rule@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)': + '@tiptap/extension-horizontal-rule@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/pm': 3.22.5 - '@tiptap/extension-image@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-image@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-italic@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-italic@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-link@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)': + '@tiptap/extension-link@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/pm': 3.22.5 linkifyjs: 4.3.2 - '@tiptap/extension-list-item@3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-list-item@3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extension-list': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-list-keymap@3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-list-keymap@3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extension-list': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)': + '@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/pm': 3.22.5 - '@tiptap/extension-ordered-list@3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-ordered-list@3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extension-list': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-paragraph@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-paragraph@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-placeholder@3.22.4(@tiptap/extensions@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-placeholder@3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extensions': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extensions': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-strike@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-strike@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-table-cell@3.22.4(@tiptap/extension-table@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-table-cell@3.22.5(@tiptap/extension-table@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extension-table': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extension-table': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-table-header@3.22.4(@tiptap/extension-table@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-table-header@3.22.5(@tiptap/extension-table@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extension-table': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extension-table': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-table-row@3.22.4(@tiptap/extension-table@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-table-row@3.22.5(@tiptap/extension-table@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extension-table': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extension-table': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-table@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)': + '@tiptap/extension-table@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/pm': 3.22.5 - '@tiptap/extension-task-item@3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-task-item@3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extension-list': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-task-list@3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4))': + '@tiptap/extension-task-list@3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/extension-list': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-text-align@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-text-align@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-text-style@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-text-style@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-text@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-text@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-underline@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': + '@tiptap/extension-underline@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extensions@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)': + '@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/pm': 3.22.5 - '@tiptap/pm@3.22.4': + '@tiptap/pm@3.22.5': dependencies: prosemirror-changeset: 2.3.0 prosemirror-commands: 1.6.2 @@ -13808,10 +13808,10 @@ snapshots: prosemirror-transform: 1.10.2 prosemirror-view: 1.41.4 - '@tiptap/react@3.22.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@tiptap/react@3.22.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/pm': 3.22.5 '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/use-sync-external-store': 0.0.6 @@ -13820,37 +13820,37 @@ snapshots: react-dom: 19.2.5(react@19.2.5) use-sync-external-store: 1.4.0(react@19.2.5) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) - '@tiptap/extension-floating-menu': 3.22.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) + '@tiptap/extension-bubble-menu': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extension-floating-menu': 3.22.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.22.4': + '@tiptap/starter-kit@3.22.5': dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/extension-blockquote': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-bold': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-bullet-list': 3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) - '@tiptap/extension-code': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-code-block': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) - '@tiptap/extension-document': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-dropcursor': 3.22.4(@tiptap/extensions@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) - '@tiptap/extension-gapcursor': 3.22.4(@tiptap/extensions@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) - '@tiptap/extension-hard-break': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-heading': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-horizontal-rule': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) - '@tiptap/extension-italic': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-link': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) - '@tiptap/extension-list': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) - '@tiptap/extension-list-item': 3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) - '@tiptap/extension-list-keymap': 3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) - '@tiptap/extension-ordered-list': 3.22.4(@tiptap/extension-list@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)) - '@tiptap/extension-paragraph': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-strike': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-text': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-underline': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extensions': 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 + '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/extension-blockquote': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-bold': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-bullet-list': 3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) + '@tiptap/extension-code': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-code-block': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extension-document': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-dropcursor': 3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) + '@tiptap/extension-gapcursor': 3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) + '@tiptap/extension-hard-break': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-heading': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-horizontal-rule': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extension-italic': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-link': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extension-list-item': 3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) + '@tiptap/extension-list-keymap': 3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) + '@tiptap/extension-ordered-list': 3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) + '@tiptap/extension-paragraph': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-strike': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-text': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-underline': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extensions': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/pm': 3.22.5 '@tree-sitter-grammars/tree-sitter-yaml@0.7.1(tree-sitter@0.22.4)': dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a64edc836..b16135137 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -51,22 +51,22 @@ catalog: "@testcontainers/mysql": ^11.14.0 "@testcontainers/postgresql": ^11.14.0 "@testcontainers/redis": ^11.14.0 - "@tiptap/extension-color": 3.22.4 - "@tiptap/extension-highlight": 3.22.4 - "@tiptap/extension-image": 3.22.4 - "@tiptap/extension-link": ^3.22.4 - "@tiptap/extension-placeholder": ^3.22.4 - "@tiptap/extension-table": 3.22.4 - "@tiptap/extension-table-cell": 3.22.4 - "@tiptap/extension-table-header": 3.22.4 - "@tiptap/extension-table-row": 3.22.4 - "@tiptap/extension-task-item": 3.22.4 - "@tiptap/extension-task-list": 3.22.4 - "@tiptap/extension-text-align": 3.22.4 - "@tiptap/extension-text-style": 3.22.4 - "@tiptap/extension-underline": 3.22.4 - "@tiptap/react": ^3.22.4 - "@tiptap/starter-kit": ^3.22.4 + "@tiptap/extension-color": 3.22.5 + "@tiptap/extension-highlight": 3.22.5 + "@tiptap/extension-image": 3.22.5 + "@tiptap/extension-link": ^3.22.5 + "@tiptap/extension-placeholder": ^3.22.5 + "@tiptap/extension-table": 3.22.5 + "@tiptap/extension-table-cell": 3.22.5 + "@tiptap/extension-table-header": 3.22.5 + "@tiptap/extension-table-row": 3.22.5 + "@tiptap/extension-task-item": 3.22.5 + "@tiptap/extension-task-list": 3.22.5 + "@tiptap/extension-text-align": 3.22.5 + "@tiptap/extension-text-style": 3.22.5 + "@tiptap/extension-underline": 3.22.5 + "@tiptap/react": ^3.22.5 + "@tiptap/starter-kit": ^3.22.5 "@trpc/client": ^11.16.0 "@trpc/next": ^11.16.0 "@trpc/react-query": ^11.16.0 From 9cd45f7832437ff6d13e424ab5fd0073bb542da0 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sun, 3 May 2026 13:19:32 +0000 Subject: [PATCH 025/116] chore(deps): update trpc monorepo to ^11.17.0 (#5630) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 110 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 10 ++-- 2 files changed, 60 insertions(+), 60 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e2ffba230..eb5a90232 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -199,20 +199,20 @@ catalogs: specifier: ^3.22.5 version: 3.22.5 '@trpc/client': - specifier: ^11.16.0 - version: 11.16.0 + specifier: ^11.17.0 + version: 11.17.0 '@trpc/next': - specifier: ^11.16.0 - version: 11.16.0 + specifier: ^11.17.0 + version: 11.17.0 '@trpc/react-query': - specifier: ^11.16.0 - version: 11.16.0 + specifier: ^11.17.0 + version: 11.17.0 '@trpc/server': - specifier: ^11.16.0 - version: 11.16.0 + specifier: ^11.17.0 + version: 11.17.0 '@trpc/tanstack-react-query': - specifier: ^11.16.0 - version: 11.16.0 + specifier: ^11.17.0 + version: 11.17.0 '@turbo/gen': specifier: ^2.9.6 version: 2.9.6 @@ -801,16 +801,16 @@ importers: version: 5.100.5(@tanstack/react-query@5.100.5(react@19.2.5))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5) '@trpc/client': specifier: 'catalog:' - version: 11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3) + version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/next': specifier: 'catalog:' - version: 11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) '@trpc/react-query': specifier: 'catalog:' - version: 11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) '@trpc/server': specifier: 'catalog:' - version: 11.16.0(typescript@5.9.3) + version: 11.17.0(typescript@5.9.3) '@xterm/addon-canvas': specifier: 'catalog:' version: 0.7.0(@xterm/xterm@6.0.0) @@ -1207,16 +1207,16 @@ importers: version: 5.100.5(react@19.2.5) '@trpc/client': specifier: 'catalog:' - version: 11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3) + version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/react-query': specifier: 'catalog:' - version: 11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) '@trpc/server': specifier: 'catalog:' - version: 11.16.0(typescript@5.9.3) + version: 11.17.0(typescript@5.9.3) '@trpc/tanstack-react-query': specifier: 'catalog:' - version: 11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) lodash.clonedeep: specifier: 'catalog:' version: 4.5.0 @@ -1234,7 +1234,7 @@ importers: version: 2.2.6 trpc-to-openapi: specifier: 'catalog:' - version: 3.2.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.16.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.3.6))(zod@4.3.6) + version: 3.2.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.17.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.3.6))(zod@4.3.6) zod: specifier: 'catalog:' version: 4.3.6 @@ -1522,13 +1522,13 @@ importers: version: 5.100.5(react@19.2.5) '@trpc/client': specifier: 'catalog:' - version: 11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3) + version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/server': specifier: 'catalog:' - version: 11.16.0(typescript@5.9.3) + version: 11.17.0(typescript@5.9.3) '@trpc/tanstack-react-query': specifier: 'catalog:' - version: 11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) react: specifier: 'catalog:' version: 19.2.5 @@ -5501,21 +5501,21 @@ packages: tree-sitter: optional: true - '@trpc/client@11.16.0': - resolution: {integrity: sha512-TxIzm7OoK3baKZ0XCbuMUbI3GhgjcbKHIc4nWVKaRpCRnbSh0T31BT6fTPYwtnA/Nur8pBCGqC2B4J5hEPiPFQ==} + '@trpc/client@11.17.0': + resolution: {integrity: sha512-KpJBFrbKTDeVCFv/3ckL1XBBH5Yssn8hethI/rUy7GIpTj+VzjtPjykDqJpzobuVOz+d26cXCSu1t4I6MYI5Zg==} hasBin: true peerDependencies: - '@trpc/server': 11.16.0 + '@trpc/server': 11.17.0 typescript: '>=5.7.2' - '@trpc/next@11.16.0': - resolution: {integrity: sha512-6KyedRnGd7wZ44crr7oZ/fHxVDPkyItvg2PS6kfhM5Y6yLlBcEsMOhqxqKQNQZHBjAtnQzZjPuCslP05gZ6BSA==} + '@trpc/next@11.17.0': + resolution: {integrity: sha512-EjwMkyamGjf5aslgfYB70hMKs4cgmsjSJbMinmuXktkGvbmdW54VbV04Sk4o4QTY5b//Rns9dz+ku8DN6lVhvw==} hasBin: true peerDependencies: '@tanstack/react-query': ^5.59.15 - '@trpc/client': 11.16.0 - '@trpc/react-query': 11.16.0 - '@trpc/server': 11.16.0 + '@trpc/client': 11.17.0 + '@trpc/react-query': 11.17.0 + '@trpc/server': 11.17.0 next: '*' react: '>=16.8.0' react-dom: '>=16.8.0' @@ -5526,28 +5526,28 @@ packages: '@trpc/react-query': optional: true - '@trpc/react-query@11.16.0': - resolution: {integrity: sha512-ah6ULOu4k7lCEFAEoEgqg14YPVu1lnCVVYcz8TP7avPPKwtcB0CbFKYve3ElRP+V5DoBT75Q+G66bRdR+rQ5fg==} + '@trpc/react-query@11.17.0': + resolution: {integrity: sha512-AGcl5YAF8NnhBmyJ6PqJqKb1M5VTGSoNRNqJ3orct4o4epdcg0GWhW+qT9q6gPzs/2ImIwYCdfFpgNGdZ9yLHA==} peerDependencies: '@tanstack/react-query': ^5.80.3 - '@trpc/client': 11.16.0 - '@trpc/server': 11.16.0 + '@trpc/client': 11.17.0 + '@trpc/server': 11.17.0 react: '>=18.2.0' typescript: '>=5.7.2' - '@trpc/server@11.16.0': - resolution: {integrity: sha512-XgGuUMddrUTd04+za/WE5GFuZ1/YU9XQG0t3VL5WOIu2JspkOlq6k4RYEiqS6HSJt+S0RXaPdIoE2anIP/BBRQ==} + '@trpc/server@11.17.0': + resolution: {integrity: sha512-jbAOUe0PpUTCYqziyu+8vYXZdDXPudZgnEhWCQ2NjKnVEjfE93RqHTt1oycZJv/HNf51YlRXfEEwSIAbb161rw==} hasBin: true peerDependencies: typescript: '>=5.7.2' - '@trpc/tanstack-react-query@11.16.0': - resolution: {integrity: sha512-kfNYJ5NCk67tmRCO/QWCycJmRamuEKmZf1HRG8yCBl8aTJdTwVq7l6AffFIMab3Q+NmQzwP8XXkAEK/EelKYOA==} + '@trpc/tanstack-react-query@11.17.0': + resolution: {integrity: sha512-OFxjvCgisP0yaCj7lgP6qPaFwJvJDgnrAUxH3cNIPPR89TpYbndn5vsdKNkc7EnvER9b6wq9Yz8aCcPcOBpDXg==} hasBin: true peerDependencies: '@tanstack/react-query': ^5.80.3 - '@trpc/client': 11.16.0 - '@trpc/server': 11.16.0 + '@trpc/client': 11.17.0 + '@trpc/server': 11.17.0 react: '>=18.2.0' typescript: '>=5.7.2' @@ -13860,40 +13860,40 @@ snapshots: tree-sitter: 0.22.4 optional: true - '@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3)': + '@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@trpc/server': 11.16.0(typescript@5.9.3) + '@trpc/server': 11.17.0(typescript@5.9.3) typescript: 5.9.3 - '@trpc/next@11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)': + '@trpc/next@11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)': dependencies: - '@trpc/client': 11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3) - '@trpc/server': 11.16.0(typescript@5.9.3) + '@trpc/client': 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) + '@trpc/server': 11.17.0(typescript@5.9.3) next: 16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) react: 19.2.5 react-dom: 19.2.5(react@19.2.5) typescript: 5.9.3 optionalDependencies: '@tanstack/react-query': 5.100.5(react@19.2.5) - '@trpc/react-query': 11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + '@trpc/react-query': 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) - '@trpc/react-query@11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': + '@trpc/react-query@11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': dependencies: '@tanstack/react-query': 5.100.5(react@19.2.5) - '@trpc/client': 11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3) - '@trpc/server': 11.16.0(typescript@5.9.3) + '@trpc/client': 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) + '@trpc/server': 11.17.0(typescript@5.9.3) react: 19.2.5 typescript: 5.9.3 - '@trpc/server@11.16.0(typescript@5.9.3)': + '@trpc/server@11.17.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@trpc/tanstack-react-query@11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': + '@trpc/tanstack-react-query@11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': dependencies: '@tanstack/react-query': 5.100.5(react@19.2.5) - '@trpc/client': 11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3) - '@trpc/server': 11.16.0(typescript@5.9.3) + '@trpc/client': 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) + '@trpc/server': 11.17.0(typescript@5.9.3) react: 19.2.5 typescript: 5.9.3 @@ -19527,9 +19527,9 @@ snapshots: trough@2.2.0: {} - trpc-to-openapi@3.2.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.16.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.3.6))(zod@4.3.6): + trpc-to-openapi@3.2.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.17.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.3.6))(zod@4.3.6): dependencies: - '@trpc/server': 11.16.0(typescript@5.9.3) + '@trpc/server': 11.17.0(typescript@5.9.3) co-body: 6.2.0 h3: 1.15.1 openapi3-ts: 4.4.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b16135137..a2a7655eb 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -67,11 +67,11 @@ catalog: "@tiptap/extension-underline": 3.22.5 "@tiptap/react": ^3.22.5 "@tiptap/starter-kit": ^3.22.5 - "@trpc/client": ^11.16.0 - "@trpc/next": ^11.16.0 - "@trpc/react-query": ^11.16.0 - "@trpc/server": ^11.16.0 - "@trpc/tanstack-react-query": ^11.16.0 + "@trpc/client": ^11.17.0 + "@trpc/next": ^11.17.0 + "@trpc/react-query": ^11.17.0 + "@trpc/server": ^11.17.0 + "@trpc/tanstack-react-query": ^11.17.0 "@turbo/gen": ^2.9.6 "@types/adm-zip": 0.5.8 "@types/bcrypt": 6.0.0 From 3e918e5d3dd8737b7ebee4419ffee8433fb68a14 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sun, 3 May 2026 14:57:50 +0000 Subject: [PATCH 026/116] chore(deps): update dependency tsdav to ^2.2.0 (#5627) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 14 ++++++-------- pnpm-workspace.yaml | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb5a90232..249cc25f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -511,8 +511,8 @@ catalogs: specifier: ^3.2.0 version: 3.2.0 tsdav: - specifier: ^2.1.8 - version: 2.1.8 + specifier: ^2.2.0 + version: 2.2.0 tsx: specifier: 4.20.4 version: 4.20.4 @@ -2046,7 +2046,7 @@ importers: version: 2.1.3 tsdav: specifier: 'catalog:' - version: 2.1.8 + version: 2.2.0 undici: specifier: 'catalog:' version: 7.24.6 @@ -10539,8 +10539,8 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsdav@2.1.8: - resolution: {integrity: sha512-zvQvhZLzTaEmNNgJbBlUYT/JOq9Xpw/xkxCqs7IT2d2/7o7pss0iZOlZXuHJ5VcvSvTny42Vc6+6GyzZcrCJ1g==} + tsdav@2.2.0: + resolution: {integrity: sha512-ISMp2d8eeM7nzNIWzFLYbq5TBvv1gZYm+sRLaT3ec6HUj84wn2IlcuioPL9/NXhahStspCauD1BVBg98Y4e9+Q==} engines: {node: '>=18'} tslib@2.8.1: @@ -19557,14 +19557,12 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsdav@2.1.8: + tsdav@2.2.0: dependencies: base-64: 1.0.0 - cross-fetch: 4.1.0 debug: 4.4.3 xml-js: 1.6.11 transitivePeerDependencies: - - encoding - supports-color tslib@2.8.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a2a7655eb..fc3c8d1e8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -171,7 +171,7 @@ catalog: testcontainers: ^11.14.0 timezones-ical-library: ^2.1.3 trpc-to-openapi: ^3.2.0 - tsdav: ^2.1.8 + tsdav: ^2.2.0 tsx: 4.20.4 turbo: ^2.9.6 typescript: ^5.9.3 From 7c39e4de134b93d7c8514f0c0cf5778c87d4bad2 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sun, 3 May 2026 15:56:23 +0000 Subject: [PATCH 027/116] chore(deps): update dependency next-intl to v4.10.0 (#5631) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 12 ++++++------ pnpm-workspace.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 249cc25f5..462991c6f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -436,8 +436,8 @@ catalogs: specifier: 5.0.0-beta.31 version: 5.0.0-beta.31 next-intl: - specifier: 4.9.2 - version: 4.9.2 + specifier: 4.10.0 + version: 4.10.0 node-loader: specifier: ^2.1.0 version: 2.1.0 @@ -2601,7 +2601,7 @@ importers: version: 16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) next-intl: specifier: 'catalog:' - version: 4.9.2(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3) + version: 4.10.0(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3) react: specifier: 'catalog:' version: 19.2.5 @@ -8775,8 +8775,8 @@ packages: next-intl-swc-plugin-extractor@4.11.0: resolution: {integrity: sha512-WUGBSxGNd8eQ0rAsJHFmRw2H7+SZAXQIY/HAnYM57JaUsj5D2vx4KOz4zFtXlyKDtsw9awHfgWVvBae2/RDF9A==} - next-intl@4.9.2: - resolution: {integrity: sha512-AZoMRsVGLZczB2hisq1OTWmNAYAKwk/jaWH4+9pfl5TCG8kbILZZptZHux9zw7DyN1yzh6X7jmaQvoykHs9Y7Q==} + next-intl@4.10.0: + resolution: {integrity: sha512-xkvps3PDfYHhoYAop9xpdyvx6dpsXYDA0yr2gQN0w1ILSJcaSScVFUiWfK4eJX4kGZXXdgqvHbnWphK6xkMBUw==} peerDependencies: next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -17496,7 +17496,7 @@ snapshots: next-intl-swc-plugin-extractor@4.11.0: {} - next-intl@4.9.2(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3): + next-intl@4.10.0(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.8.1 '@parcel/watcher': 2.4.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index fc3c8d1e8..0328909d4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -146,7 +146,7 @@ catalog: mysql2: 3.22.3 next: 16.2.4 next-auth: 5.0.0-beta.31 - next-intl: 4.9.2 + next-intl: 4.10.0 node-loader: ^2.1.0 octokit: ^5.0.5 pg: ^8.20.0 From af77f729ec79e7368b9390422ebdc2b703cf3c81 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sun, 3 May 2026 16:59:30 +0000 Subject: [PATCH 028/116] chore(deps): update tanstack-query monorepo to ^5.100.6 (#5633) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 88 ++++++++++++++++++++++----------------------- pnpm-workspace.yaml | 6 ++-- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 462991c6f..c2fc90d14 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -133,14 +133,14 @@ catalogs: specifier: ^3.41.1 version: 3.41.1 '@tanstack/react-query': - specifier: ^5.100.5 - version: 5.100.5 + specifier: ^5.100.6 + version: 5.100.6 '@tanstack/react-query-devtools': - specifier: ^5.100.5 - version: 5.100.5 + specifier: ^5.100.6 + version: 5.100.6 '@tanstack/react-query-next-experimental': - specifier: ^5.100.5 - version: 5.100.5 + specifier: ^5.100.6 + version: 5.100.6 '@testcontainers/mysql': specifier: ^11.14.0 version: 11.14.0 @@ -792,22 +792,22 @@ importers: version: 3.41.1(react@19.2.5) '@tanstack/react-query': specifier: 'catalog:' - version: 5.100.5(react@19.2.5) + version: 5.100.6(react@19.2.5) '@tanstack/react-query-devtools': specifier: 'catalog:' - version: 5.100.5(@tanstack/react-query@5.100.5(react@19.2.5))(react@19.2.5) + version: 5.100.6(@tanstack/react-query@5.100.6(react@19.2.5))(react@19.2.5) '@tanstack/react-query-next-experimental': specifier: 'catalog:' - version: 5.100.5(@tanstack/react-query@5.100.5(react@19.2.5))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5) + version: 5.100.6(@tanstack/react-query@5.100.6(react@19.2.5))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5) '@trpc/client': specifier: 'catalog:' version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/next': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) '@trpc/react-query': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) '@trpc/server': specifier: 'catalog:' version: 11.17.0(typescript@5.9.3) @@ -1204,19 +1204,19 @@ importers: version: 1.4.0 '@tanstack/react-query': specifier: 'catalog:' - version: 5.100.5(react@19.2.5) + version: 5.100.6(react@19.2.5) '@trpc/client': specifier: 'catalog:' version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/react-query': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) '@trpc/server': specifier: 'catalog:' version: 11.17.0(typescript@5.9.3) '@trpc/tanstack-react-query': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) lodash.clonedeep: specifier: 'catalog:' version: 4.5.0 @@ -1519,7 +1519,7 @@ importers: version: link:../cron-jobs '@tanstack/react-query': specifier: 'catalog:' - version: 5.100.5(react@19.2.5) + version: 5.100.6(react@19.2.5) '@trpc/client': specifier: 'catalog:' version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) @@ -1528,7 +1528,7 @@ importers: version: 11.17.0(typescript@5.9.3) '@trpc/tanstack-react-query': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) react: specifier: 'catalog:' version: 19.2.5 @@ -5230,27 +5230,27 @@ packages: resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@5.100.5': - resolution: {integrity: sha512-t20KrhKkf0HXzqQkPbJ5erhFesup68BAbwFgYmTrS7bxMF7O5MdmL8jUkik4thsG7Hg00fblz30h6yF1d5TxGg==} + '@tanstack/query-core@5.100.6': + resolution: {integrity: sha512-Os2CPUr98to98RYm+D4qGqGkiffn7MGSyl2547a4MljVkHE30AMJRqTiyCqBfMwzAx/I91vCkAxp5tHSla6Twg==} - '@tanstack/query-devtools@5.100.5': - resolution: {integrity: sha512-SuCkVCqqliRYJvm+LEL2U/TcFv92zTnHj6OGrJFHp1v/RsiwamI+ZDgQzbeUrLsJb8/Nj/52aIw0NyDMcVHl4A==} + '@tanstack/query-devtools@5.100.6': + resolution: {integrity: sha512-2SiNwlOiAdTbqktCSmwlXZH8x8mckSbES2O0bdr3qZNhdQl5DCtImZx0S3HGeNHWTIkzTaHx2Isg+bD4M3WRIg==} - '@tanstack/react-query-devtools@5.100.5': - resolution: {integrity: sha512-bItQERx7dJoiI0WEoS4tIrvNnmk4kUYsaQLdIpm4o9Kttmsi5B6xlY6JBDkavstR3hH/R2+VT5dr3L5LBFPW4g==} + '@tanstack/react-query-devtools@5.100.6': + resolution: {integrity: sha512-sz3ksMKA2t1rx0+Odzb0x1A3pXH/SVf7fzlzd3sKXzwXz8980f5sbOwfQD6+UfTG8G4Y2KaIg9e3sBn+uC4VTg==} peerDependencies: - '@tanstack/react-query': ^5.100.5 + '@tanstack/react-query': ^5.100.6 react: ^18 || ^19 - '@tanstack/react-query-next-experimental@5.100.5': - resolution: {integrity: sha512-v6XsDcwHQFIMVqwUx9qvuhTnTEN10mvKm9Yfojfo5C1aOUx9dKZGDeL5NM+63GHlR589/Oeba7cCyEQi97nwYQ==} + '@tanstack/react-query-next-experimental@5.100.6': + resolution: {integrity: sha512-LqEhb6BG/KgwOEKdnKsBpiB96fudmKnrEYcfJxE27gBReBpuJZZGcllEtYXt6S8TFS2uIwmks4zNnRcspFOoBQ==} peerDependencies: - '@tanstack/react-query': ^5.100.5 + '@tanstack/react-query': ^5.100.6 next: ^13 || ^14 || ^15 || ^16 react: ^18 || ^19 - '@tanstack/react-query@5.100.5': - resolution: {integrity: sha512-aNwj1mi2v2bQ9IxkyR1grLOUkv3BYWoykHy9KDyLNbjC3tsahbOHJibK+Wjtr1wRhG59/AvJhiJG5OlthaCgJA==} + '@tanstack/react-query@5.100.6': + resolution: {integrity: sha512-uVSrps0PV16Cxmcn2rvL+dUhwTpTUtiRW347AEeYxMZXO2pZe9ja7E24PAMGoQ5u2g89DD8u4QhOviBk+RN8RA==} peerDependencies: react: ^18 || ^19 @@ -13574,25 +13574,25 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@5.100.5': {} + '@tanstack/query-core@5.100.6': {} - '@tanstack/query-devtools@5.100.5': {} + '@tanstack/query-devtools@5.100.6': {} - '@tanstack/react-query-devtools@5.100.5(@tanstack/react-query@5.100.5(react@19.2.5))(react@19.2.5)': + '@tanstack/react-query-devtools@5.100.6(@tanstack/react-query@5.100.6(react@19.2.5))(react@19.2.5)': dependencies: - '@tanstack/query-devtools': 5.100.5 - '@tanstack/react-query': 5.100.5(react@19.2.5) + '@tanstack/query-devtools': 5.100.6 + '@tanstack/react-query': 5.100.6(react@19.2.5) react: 19.2.5 - '@tanstack/react-query-next-experimental@5.100.5(@tanstack/react-query@5.100.5(react@19.2.5))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)': + '@tanstack/react-query-next-experimental@5.100.6(@tanstack/react-query@5.100.6(react@19.2.5))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)': dependencies: - '@tanstack/react-query': 5.100.5(react@19.2.5) + '@tanstack/react-query': 5.100.6(react@19.2.5) next: 16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) react: 19.2.5 - '@tanstack/react-query@5.100.5(react@19.2.5)': + '@tanstack/react-query@5.100.6(react@19.2.5)': dependencies: - '@tanstack/query-core': 5.100.5 + '@tanstack/query-core': 5.100.6 react: 19.2.5 '@tanstack/react-table@8.20.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': @@ -13865,7 +13865,7 @@ snapshots: '@trpc/server': 11.17.0(typescript@5.9.3) typescript: 5.9.3 - '@trpc/next@11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)': + '@trpc/next@11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)': dependencies: '@trpc/client': 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/server': 11.17.0(typescript@5.9.3) @@ -13874,12 +13874,12 @@ snapshots: react-dom: 19.2.5(react@19.2.5) typescript: 5.9.3 optionalDependencies: - '@tanstack/react-query': 5.100.5(react@19.2.5) - '@trpc/react-query': 11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + '@tanstack/react-query': 5.100.6(react@19.2.5) + '@trpc/react-query': 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) - '@trpc/react-query@11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': + '@trpc/react-query@11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': dependencies: - '@tanstack/react-query': 5.100.5(react@19.2.5) + '@tanstack/react-query': 5.100.6(react@19.2.5) '@trpc/client': 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/server': 11.17.0(typescript@5.9.3) react: 19.2.5 @@ -13889,9 +13889,9 @@ snapshots: dependencies: typescript: 5.9.3 - '@trpc/tanstack-react-query@11.17.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': + '@trpc/tanstack-react-query@11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': dependencies: - '@tanstack/react-query': 5.100.5(react@19.2.5) + '@tanstack/react-query': 5.100.6(react@19.2.5) '@trpc/client': 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/server': 11.17.0(typescript@5.9.3) react: 19.2.5 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0328909d4..3bb77dc83 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -45,9 +45,9 @@ catalog: "@semantic-release/release-notes-generator": ^14.1.0 "@t3-oss/env-nextjs": ^0.13.11 "@tabler/icons-react": ^3.41.1 - "@tanstack/react-query": ^5.100.5 - "@tanstack/react-query-devtools": ^5.100.5 - "@tanstack/react-query-next-experimental": ^5.100.5 + "@tanstack/react-query": ^5.100.6 + "@tanstack/react-query-devtools": ^5.100.6 + "@tanstack/react-query-next-experimental": ^5.100.6 "@testcontainers/mysql": ^11.14.0 "@testcontainers/postgresql": ^11.14.0 "@testcontainers/redis": ^11.14.0 From e52ecd64ee286c202994df41a79cada30e5fd1d6 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sun, 3 May 2026 16:59:56 +0000 Subject: [PATCH 029/116] chore(deps): update dependency next-intl to v4.10.1 (#5632) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 12 ++++++------ pnpm-workspace.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2fc90d14..258cd4541 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -436,8 +436,8 @@ catalogs: specifier: 5.0.0-beta.31 version: 5.0.0-beta.31 next-intl: - specifier: 4.10.0 - version: 4.10.0 + specifier: 4.10.1 + version: 4.10.1 node-loader: specifier: ^2.1.0 version: 2.1.0 @@ -2601,7 +2601,7 @@ importers: version: 16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) next-intl: specifier: 'catalog:' - version: 4.10.0(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3) + version: 4.10.1(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3) react: specifier: 'catalog:' version: 19.2.5 @@ -8775,8 +8775,8 @@ packages: next-intl-swc-plugin-extractor@4.11.0: resolution: {integrity: sha512-WUGBSxGNd8eQ0rAsJHFmRw2H7+SZAXQIY/HAnYM57JaUsj5D2vx4KOz4zFtXlyKDtsw9awHfgWVvBae2/RDF9A==} - next-intl@4.10.0: - resolution: {integrity: sha512-xkvps3PDfYHhoYAop9xpdyvx6dpsXYDA0yr2gQN0w1ILSJcaSScVFUiWfK4eJX4kGZXXdgqvHbnWphK6xkMBUw==} + next-intl@4.10.1: + resolution: {integrity: sha512-+j8+7W2x86Dt0pVPl9AZgHvsqZz34R/nYsUmNASR5l/cXDS/Y+XITfeRdyBxwLoirt881pfz9E7Z6dG0bwGsZA==} peerDependencies: next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -17496,7 +17496,7 @@ snapshots: next-intl-swc-plugin-extractor@4.11.0: {} - next-intl@4.10.0(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3): + next-intl@4.10.1(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.8.1 '@parcel/watcher': 2.4.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3bb77dc83..4f21bf73f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -146,7 +146,7 @@ catalog: mysql2: 3.22.3 next: 16.2.4 next-auth: 5.0.0-beta.31 - next-intl: 4.10.0 + next-intl: 4.10.1 node-loader: ^2.1.0 octokit: ^5.0.5 pg: ^8.20.0 From b9c701a71b4d0049c4fb90309a0c24bb5df04721 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sun, 3 May 2026 19:08:04 +0000 Subject: [PATCH 030/116] chore(deps): update dependency next-intl to v4.11.0 (#5635) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 12 ++++++------ pnpm-workspace.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 258cd4541..1dd1a2776 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -436,8 +436,8 @@ catalogs: specifier: 5.0.0-beta.31 version: 5.0.0-beta.31 next-intl: - specifier: 4.10.1 - version: 4.10.1 + specifier: 4.11.0 + version: 4.11.0 node-loader: specifier: ^2.1.0 version: 2.1.0 @@ -2601,7 +2601,7 @@ importers: version: 16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) next-intl: specifier: 'catalog:' - version: 4.10.1(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3) + version: 4.11.0(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3) react: specifier: 'catalog:' version: 19.2.5 @@ -8775,8 +8775,8 @@ packages: next-intl-swc-plugin-extractor@4.11.0: resolution: {integrity: sha512-WUGBSxGNd8eQ0rAsJHFmRw2H7+SZAXQIY/HAnYM57JaUsj5D2vx4KOz4zFtXlyKDtsw9awHfgWVvBae2/RDF9A==} - next-intl@4.10.1: - resolution: {integrity: sha512-+j8+7W2x86Dt0pVPl9AZgHvsqZz34R/nYsUmNASR5l/cXDS/Y+XITfeRdyBxwLoirt881pfz9E7Z6dG0bwGsZA==} + next-intl@4.11.0: + resolution: {integrity: sha512-Chp8rgEVUYOX/bCtYy+PXH6lDX3X+GPT9sR9HScHroL283em/4urP9btfdHEMEHJJXdq2W/5wDaDDtWONPdNSA==} peerDependencies: next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -17496,7 +17496,7 @@ snapshots: next-intl-swc-plugin-extractor@4.11.0: {} - next-intl@4.10.1(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3): + next-intl@4.11.0(next@16.2.4(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.8.1 '@parcel/watcher': 2.4.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4f21bf73f..9beacf88e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -146,7 +146,7 @@ catalog: mysql2: 3.22.3 next: 16.2.4 next-auth: 5.0.0-beta.31 - next-intl: 4.10.1 + next-intl: 4.11.0 node-loader: ^2.1.0 octokit: ^5.0.5 pg: ^8.20.0 From acd11c3fc1f750e5aa25b52e86ed4b401dd3467c Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 16:53:37 +0000 Subject: [PATCH 031/116] chore(deps): update dependency isomorphic-dompurify to ^3.11.0 (#5638) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 122 +++----------------------------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 8 insertions(+), 116 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1dd1a2776..36318302a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -400,8 +400,8 @@ catalogs: specifier: 5.10.1 version: 5.10.1 isomorphic-dompurify: - specifier: ^3.10.0 - version: 3.10.0 + specifier: ^3.11.0 + version: 3.11.0 jotai: specifier: ^2.19.1 version: 2.19.1 @@ -843,7 +843,7 @@ importers: version: 13.0.6 isomorphic-dompurify: specifier: 'catalog:' - version: 3.10.0(@noble/hashes@2.0.1) + version: 3.11.0(@noble/hashes@2.0.1) jotai: specifier: 'catalog:' version: 2.19.1(@babel/core@7.26.0)(@babel/template@7.28.6)(@types/react@19.2.14)(react@19.2.5) @@ -3011,14 +3011,6 @@ packages: resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/css-color@5.1.8': - resolution: {integrity: sha512-OISPR9c2uPo23rUdvfEQiLPjoMLOpEeLNnP5iGkxr6tDDxJd3NjD+6fxY0mdaMbIPUjFGL4HFOJqLvow5q4aqQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/dom-selector@7.0.8': - resolution: {integrity: sha512-erMO6FgtM02dC24NGm0xufMzWz5OF0wXKR7BpvGD973bq/GbmR8/DbxNZbj0YevQ5hlToJaWSVK/G9/NDgGEVw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/dom-selector@7.1.1': resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -3184,13 +3176,6 @@ packages: resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.1.1': - resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-calc@3.2.0': resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} engines: {node: '>=20.19.0'} @@ -3198,13 +3183,6 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.0.2': - resolution: {integrity: sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.1.0': resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} engines: {node: '>=20.19.0'} @@ -3218,14 +3196,6 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.1': - resolution: {integrity: sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==} - peerDependencies: - css-tree: ^3.2.1 - peerDependenciesMeta: - css-tree: - optional: true - '@csstools/css-syntax-patches-for-csstree@1.1.3': resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} peerDependencies: @@ -7108,10 +7078,6 @@ packages: resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - entities@8.0.0: resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} engines: {node: '>=20.19.0'} @@ -8147,8 +8113,8 @@ packages: resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} engines: {node: '>=18'} - isomorphic-dompurify@3.10.0: - resolution: {integrity: sha512-Gj2duy4dACsP/FLPvwJ3+MXTlGtOo+O4yfpA0jdxuz/sZlbZzazGzScajOHRwH7PCy4j3bh5ibLGJY4/Rb5kGQ==} + isomorphic-dompurify@3.11.0: + resolution: {integrity: sha512-il0sNhLnfawc6vKoMqnZX1JXzEzw0pP3DZWg7mM7VJNJ8cq6DCxeAjEcfjTazyBF8dkUn+rBsBPS5NQs4ZaI3g==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} isomorphic-fetch@3.0.0: @@ -8234,15 +8200,6 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsdom@29.0.2: - resolution: {integrity: sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - jsdom@29.1.0: resolution: {integrity: sha512-YNUc7fB9QuvSSQWfrH0xF+TyABkxUwx8sswgIDaCrw4Hol8BghdZDkITtZheRJeMtzWlnTfsM3bBBusRvpO1wg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} @@ -9147,9 +9104,6 @@ packages: parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parse5@8.0.0: - resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} - parse5@8.0.1: resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} @@ -11275,20 +11229,6 @@ snapshots: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@asamuzakjp/css-color@5.1.8': - dependencies: - '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - - '@asamuzakjp/dom-selector@7.0.8': - dependencies: - '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.0.3 - css-tree: 3.2.1 - is-potential-custom-element-name: 1.0.1 - '@asamuzakjp/dom-selector@7.1.1': dependencies: '@asamuzakjp/generational-cache': 1.0.1 @@ -11506,23 +11446,11 @@ snapshots: '@csstools/color-helpers@6.0.2': {} - '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/color-helpers': 6.0.2 - '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/color-helpers': 6.0.2 @@ -11534,10 +11462,6 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.1(css-tree@3.2.1)': - optionalDependencies: - css-tree: 3.2.1 - '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 @@ -15517,8 +15441,6 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.2 - entities@6.0.1: {} - entities@8.0.0: {} env-ci@11.2.0: @@ -16750,10 +16672,10 @@ snapshots: isexe@3.1.5: optional: true - isomorphic-dompurify@3.10.0(@noble/hashes@2.0.1): + isomorphic-dompurify@3.11.0(@noble/hashes@2.0.1): dependencies: dompurify: 3.4.1 - jsdom: 29.0.2(@noble/hashes@2.0.1) + jsdom: 29.1.0(@noble/hashes@2.0.1) transitivePeerDependencies: - '@noble/hashes' - canvas @@ -16848,32 +16770,6 @@ snapshots: jsbn@1.1.0: {} - jsdom@29.0.2(@noble/hashes@2.0.1): - dependencies: - '@asamuzakjp/css-color': 5.1.8 - '@asamuzakjp/dom-selector': 7.0.8 - '@bramus/specificity': 2.4.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.1(css-tree@3.2.1) - '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) - css-tree: 3.2.1 - data-urls: 7.0.0(@noble/hashes@2.0.1) - decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) - is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.7 - parse5: 8.0.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.1 - undici: 7.24.6 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.1 - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@2.0.1) - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - '@noble/hashes' - jsdom@29.1.0(@noble/hashes@2.0.1): dependencies: '@asamuzakjp/css-color': 5.1.11 @@ -17848,10 +17744,6 @@ snapshots: parse5@6.0.1: {} - parse5@8.0.0: - dependencies: - entities: 6.0.1 - parse5@8.0.1: dependencies: entities: 8.0.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9beacf88e..f083b5141 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -134,7 +134,7 @@ catalog: glob: ^13.0.6 ical.js: ^2.2.1 ioredis: 5.10.1 - isomorphic-dompurify: ^3.10.0 + isomorphic-dompurify: ^3.11.0 jotai: ^2.19.1 jsdom: ^29.1.0 json5: ^2.2.3 From 44bf36fff93a016a456e3114fe26daed55400438 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 00:01:35 +0000 Subject: [PATCH 032/116] chore(deps): update dependency timezones-ical-library to ^2.2.0 (#5640) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 12 ++++++------ pnpm-workspace.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 36318302a..62bcb326a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -505,8 +505,8 @@ catalogs: specifier: ^11.14.0 version: 11.14.0 timezones-ical-library: - specifier: ^2.1.3 - version: 2.1.3 + specifier: ^2.2.0 + version: 2.2.0 trpc-to-openapi: specifier: ^3.2.0 version: 3.2.0 @@ -2043,7 +2043,7 @@ importers: version: 1.1.1 timezones-ical-library: specifier: 'catalog:' - version: 2.1.3 + version: 2.2.0 tsdav: specifier: 'catalog:' version: 2.2.0 @@ -10351,8 +10351,8 @@ packages: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} - timezones-ical-library@2.1.3: - resolution: {integrity: sha512-3ihogrr88TefPpa2og2fHw22VsWxlPUN4YDiLZRV9pbRsmguMyDsHhm8i0kkj7ihQYFgERZkj6eVOYY+TSOaOw==} + timezones-ical-library@2.2.0: + resolution: {integrity: sha512-D8pKEBzYnCAGZSEyinMZqh2yTc7ZJqonXtNkpTzhPuJlkJjPEUJOXBs7ExeHcHGBaGpaJRTye5t0mLR20BeklA==} engines: {node: '>=22.18.0', npm: '>=10.9.3'} tiny-invariant@1.3.3: @@ -19328,7 +19328,7 @@ snapshots: dependencies: convert-hrtime: 5.0.0 - timezones-ical-library@2.1.3: {} + timezones-ical-library@2.2.0: {} tiny-invariant@1.3.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f083b5141..e2229309f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -169,7 +169,7 @@ catalog: svgson: ^5.3.1 swagger-ui-react: ^5.32.5 testcontainers: ^11.14.0 - timezones-ical-library: ^2.1.3 + timezones-ical-library: ^2.2.0 trpc-to-openapi: ^3.2.0 tsdav: ^2.2.0 tsx: 4.20.4 From 2829d145afb052586843f337a85a37410682af70 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 02:56:52 +0000 Subject: [PATCH 033/116] chore(deps): update dependency zod to ^4.4.1 (#5641) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 93 ++++++++++++++++++++++++--------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 50 insertions(+), 45 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62bcb326a..d5780c116 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -553,8 +553,8 @@ catalogs: specifier: 2.8.3 version: 2.8.3 zod: - specifier: ^4.3.6 - version: 4.3.6 + specifier: ^4.4.1 + version: 4.4.2 zod-form-data: specifier: ^3.0.1 version: 3.0.1 @@ -888,7 +888,7 @@ importers: version: 2.8.3 zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1234,10 +1234,10 @@ importers: version: 2.2.6 trpc-to-openapi: specifier: 'catalog:' - version: 3.2.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.17.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.3.6))(zod@4.3.6) + version: 3.2.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.17.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.4.2))(zod@4.4.2) zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1304,7 +1304,7 @@ importers: version: 19.2.5(react@19.2.5) zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1430,10 +1430,10 @@ importers: version: 7.24.6 zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 zod-validation-error: specifier: 'catalog:' - version: 5.0.0(zod@4.3.6) + version: 5.0.0(zod@4.4.2) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1455,7 +1455,7 @@ importers: dependencies: '@t3-oss/env-nextjs': specifier: 'catalog:' - version: 0.13.11(arktype@2.1.20)(typescript@5.9.3)(zod@4.3.6) + version: 0.13.11(arktype@2.1.20)(typescript@5.9.3)(zod@4.4.2) better-sqlite3: specifier: 'catalog:' version: 12.9.0 @@ -1482,7 +1482,7 @@ importers: version: 3.19.0 zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1534,7 +1534,7 @@ importers: version: 19.2.5 zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1721,7 +1721,7 @@ importers: version: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0) drizzle-zod: specifier: 'catalog:' - version: 0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0))(zod@4.3.6) + version: 0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0))(zod@4.4.2) mysql2: specifier: 'catalog:' version: 3.22.3(@types/node@24.12.2) @@ -1776,7 +1776,7 @@ importers: version: 5.7.2 zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1844,10 +1844,10 @@ importers: version: 8.3.18(react@19.2.5) mantine-form-zod-resolver: specifier: 'catalog:' - version: 1.3.0(@mantine/form@8.3.18(react@19.2.5))(zod@4.3.6) + version: 1.3.0(@mantine/form@8.3.18(react@19.2.5))(zod@4.4.2) zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1899,7 +1899,7 @@ importers: version: 19.2.5 zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2055,7 +2055,7 @@ importers: version: 0.6.2 zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2168,7 +2168,7 @@ importers: version: 19.2.5(react@19.2.5) zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2272,10 +2272,10 @@ importers: version: 2.2.6 zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 zod-form-data: specifier: 'catalog:' - version: 3.0.1(zod@4.3.6) + version: 3.0.1(zod@4.4.2) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2303,7 +2303,7 @@ importers: version: link:../common zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2423,7 +2423,7 @@ importers: version: 7.24.6 zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2705,10 +2705,10 @@ importers: version: link:../translation zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 zod-form-data: specifier: 'catalog:' - version: 3.0.1(zod@4.3.6) + version: 3.0.1(zod@4.4.2) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2865,7 +2865,7 @@ importers: version: 1.11.20 mantine-form-zod-resolver: specifier: 'catalog:' - version: 1.3.0(@mantine/form@8.3.18(react@19.2.5))(zod@4.3.6) + version: 1.3.0(@mantine/form@8.3.18(react@19.2.5))(zod@4.4.2) mantine-react-table: specifier: 'catalog:' version: 2.0.0-beta.9(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/dates@8.3.18(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/hooks@8.3.18(react@19.2.5))(dayjs@1.11.20)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/hooks@8.3.18(react@19.2.5))(@tabler/icons-react@3.41.1(react@19.2.5))(clsx@2.1.1)(dayjs@1.11.20)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -2892,7 +2892,7 @@ importers: version: 8.23.7 zod: specifier: 'catalog:' - version: 4.3.6 + version: 4.4.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -11185,6 +11185,9 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.2: + resolution: {integrity: sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -13473,19 +13476,19 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@t3-oss/env-core@0.13.11(arktype@2.1.20)(typescript@5.9.3)(zod@4.3.6)': + '@t3-oss/env-core@0.13.11(arktype@2.1.20)(typescript@5.9.3)(zod@4.4.2)': optionalDependencies: arktype: 2.1.20 typescript: 5.9.3 - zod: 4.3.6 + zod: 4.4.2 - '@t3-oss/env-nextjs@0.13.11(arktype@2.1.20)(typescript@5.9.3)(zod@4.3.6)': + '@t3-oss/env-nextjs@0.13.11(arktype@2.1.20)(typescript@5.9.3)(zod@4.4.2)': dependencies: - '@t3-oss/env-core': 0.13.11(arktype@2.1.20)(typescript@5.9.3)(zod@4.3.6) + '@t3-oss/env-core': 0.13.11(arktype@2.1.20)(typescript@5.9.3)(zod@4.4.2) optionalDependencies: arktype: 2.1.20 typescript: 5.9.3 - zod: 4.3.6 + zod: 4.4.2 '@tabler/icons-react@3.41.1(react@19.2.5)': dependencies: @@ -15365,10 +15368,10 @@ snapshots: mysql2: 3.22.3(@types/node@24.12.2) pg: 8.20.0 - drizzle-zod@0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0))(zod@4.3.6): + drizzle-zod@0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0))(zod@4.4.2): dependencies: drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(gel@2.0.0)(mysql2@3.22.3(@types/node@24.12.2))(pg@8.20.0) - zod: 4.3.6 + zod: 4.4.2 dunder-proto@1.0.1: dependencies: @@ -16996,10 +16999,10 @@ snapshots: dependencies: semver: 7.7.4 - mantine-form-zod-resolver@1.3.0(@mantine/form@8.3.18(react@19.2.5))(zod@4.3.6): + mantine-form-zod-resolver@1.3.0(@mantine/form@8.3.18(react@19.2.5))(zod@4.4.2): dependencies: '@mantine/form': 8.3.18(react@19.2.5) - zod: 4.3.6 + zod: 4.4.2 mantine-react-table@2.0.0-beta.9(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/dates@8.3.18(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/hooks@8.3.18(react@19.2.5))(dayjs@1.11.20)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@mantine/hooks@8.3.18(react@19.2.5))(@tabler/icons-react@3.41.1(react@19.2.5))(clsx@2.1.1)(dayjs@1.11.20)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: @@ -19419,14 +19422,14 @@ snapshots: trough@2.2.0: {} - trpc-to-openapi@3.2.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.17.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.3.6))(zod@4.3.6): + trpc-to-openapi@3.2.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.17.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.4.2))(zod@4.4.2): dependencies: '@trpc/server': 11.17.0(typescript@5.9.3) co-body: 6.2.0 h3: 1.15.1 openapi3-ts: 4.4.0 - zod: 4.3.6 - zod-openapi: 5.3.0(zod@4.3.6) + zod: 4.4.2 + zod-openapi: 5.3.0(zod@4.4.2) optionalDependencies: '@rollup/rollup-linux-x64-gnu': 4.6.1 @@ -20156,23 +20159,25 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.5.2 - zod-form-data@3.0.1(zod@4.3.6): + zod-form-data@3.0.1(zod@4.4.2): dependencies: '@rvf/set-get': 7.0.1 - zod: 4.3.6 + zod: 4.4.2 - zod-openapi@5.3.0(zod@4.3.6): + zod-openapi@5.3.0(zod@4.4.2): dependencies: - zod: 4.3.6 + zod: 4.4.2 zod-validation-error@4.0.2(zod@4.3.6): dependencies: zod: 4.3.6 - zod-validation-error@5.0.0(zod@4.3.6): + zod-validation-error@5.0.0(zod@4.4.2): dependencies: - zod: 4.3.6 + zod: 4.4.2 zod@4.3.6: {} + zod@4.4.2: {} + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e2229309f..92b579459 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -185,7 +185,7 @@ catalog: ws: ^8.20.0 xml2js: ^0.6.2 yaml: 2.8.3 - zod: ^4.3.6 + zod: ^4.4.1 zod-form-data: ^3.0.1 zod-validation-error: ^5.0.0 catalogMode: strict From 7c83d2cb6e996970d93fe5a369dbb328842d2137 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 10:54:29 +0000 Subject: [PATCH 034/116] chore(deps): update dependency hono@<4.6.5 to >=4.12.16 (#5642) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index f1be117ec..0b91e4a5e 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "brace-expansion@>=1.0.0 <=1.1.11": ">=5.0.5", "esbuild@<=0.24.2": ">=0.28.0", "form-data@>=4.0.0 <4.0.4": ">=4.0.5", - "hono@<4.6.5": ">=4.12.15", + "hono@<4.6.5": ">=4.12.16", "linkifyjs@<4.3.2": ">=4.3.2", "nanoid@>=4.0.0 <5.0.9": ">=5.1.9", "prismjs@<1.30.0": ">=1.30.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5780c116..deb1c5079 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -570,7 +570,7 @@ overrides: brace-expansion@>=1.0.0 <=1.1.11: '>=5.0.5' esbuild@<=0.24.2: '>=0.28.0' form-data@>=4.0.0 <4.0.4: '>=4.0.5' - hono@<4.6.5: '>=4.12.15' + hono@<4.6.5: '>=4.12.16' linkifyjs@<4.3.2: '>=4.3.2' nanoid@>=4.0.0 <5.0.9: '>=5.1.9' prismjs@<1.30.0: '>=1.30.0' @@ -3897,7 +3897,7 @@ packages: resolution: {integrity: sha512-kz323qIQkNQElEGroo/E9MKPDuIR5pkuk/XEWd50K+cSEKdmdiYx0PKWUdaNY2ecJYngtF+njDMsMKplL6zfEg==} engines: {node: '>=18.14.1'} peerDependencies: - hono: '>=4.12.15' + hono: '>=4.12.16' '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -7739,8 +7739,8 @@ packages: highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - hono@4.12.15: - resolution: {integrity: sha512-qM0jDhFEaCBb4TxoW7f53Qrpv9RBiayUHo0S52JudprkhvpjIrGoU1mnnr29Fvd1U335ZFPZQY1wlkqgfGXyLg==} + hono@4.12.16: + resolution: {integrity: sha512-jN0ZewiNAWSe5khM3EyCmBb250+b40wWbwNILNfEvq84VREWwOIkuUsFONk/3i3nqkz7Oe1PcpM2mwQEK2L9Kg==} engines: {node: '>=16.9.0'} hook-std@4.0.0: @@ -11981,9 +11981,9 @@ snapshots: - undici - utf-8-validate - '@hono/node-server@1.13.0(hono@4.12.15)': + '@hono/node-server@1.13.0(hono@4.12.16)': dependencies: - hono: 4.12.15 + hono: 4.12.16 '@humanfs/core@0.19.1': {} @@ -12438,7 +12438,7 @@ snapshots: '@axiomhq/js': 1.0.0-rc.3 '@babel/core': 7.26.0 '@babel/types': 7.26.0 - '@hono/node-server': 1.13.0(hono@4.12.15) + '@hono/node-server': 1.13.0(hono@4.12.16) '@million/install': 1.0.14 '@rollup/pluginutils': 5.1.0 '@rrweb/types': 2.0.0-alpha.16 @@ -12446,7 +12446,7 @@ snapshots: ci-info: 4.0.0 esbuild: 0.28.0 faster-babel-types: 0.1.0(@babel/types@7.26.0) - hono: 4.12.15 + hono: 4.12.16 isomorphic-fetch: 3.0.0 nanoid: 5.1.9 ohash: 1.1.4 @@ -16346,7 +16346,7 @@ snapshots: highlightjs-vue@1.0.0: {} - hono@4.12.15: {} + hono@4.12.16: {} hook-std@4.0.0: {} From 04daeba0893ffbe7823d3afaaa8ed22eda92245d Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 10:55:08 +0000 Subject: [PATCH 035/116] chore(deps): update dependency jsdom to ^29.1.1 (#5643) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 55 ++++++++++++++++++++++++++++++++++++--------- pnpm-workspace.yaml | 2 +- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index deb1c5079..78d6fe81b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -406,8 +406,8 @@ catalogs: specifier: ^2.19.1 version: 2.19.1 jsdom: - specifier: ^29.1.0 - version: 29.1.0 + specifier: ^29.1.1 + version: 29.1.1 json5: specifier: ^2.2.3 version: 2.2.3 @@ -639,7 +639,7 @@ importers: version: 10.1.0 jsdom: specifier: 'catalog:' - version: 29.1.0(@noble/hashes@2.0.1) + version: 29.1.1(@noble/hashes@2.0.1) json5: specifier: 'catalog:' version: 2.2.3 @@ -663,7 +663,7 @@ importers: version: 6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: 'catalog:' - version: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.0(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) apps/nextjs: dependencies: @@ -8209,6 +8209,15 @@ packages: canvas: optional: true + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsep@1.4.0: resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} engines: {node: '>= 10.16.0'} @@ -14250,7 +14259,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.0(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/expect@4.1.5': dependencies: @@ -14296,7 +14305,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.0(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/utils@4.1.5': dependencies: @@ -16356,7 +16365,7 @@ snapshots: hosted-git-info@9.0.2: dependencies: - lru-cache: 11.2.7 + lru-cache: 11.3.5 hpagent@1.2.0: {} @@ -16799,6 +16808,32 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + jsdom@29.1.1(@noble/hashes@2.0.1): + dependencies: + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) + '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) + css-tree: 3.2.1 + data-urls: 7.0.0(@noble/hashes@2.0.1) + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.3.5 + parse5: 8.0.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.1 + undici: 7.25.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1(@noble/hashes@2.0.1) + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + jsep@1.4.0: {} jsesc@3.0.2: {} @@ -17770,7 +17805,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.2.7 + lru-cache: 11.3.5 minipass: 7.1.3 path-type@4.0.0: {} @@ -19843,7 +19878,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.3 - vitest@4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.0(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.5 '@vitest/mocker': 4.1.5(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) @@ -19869,7 +19904,7 @@ snapshots: '@types/node': 24.12.2 '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) '@vitest/ui': 4.1.5(vitest@4.1.5) - jsdom: 29.1.0(@noble/hashes@2.0.1) + jsdom: 29.1.1(@noble/hashes@2.0.1) transitivePeerDependencies: - msw diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 92b579459..ba61cd01b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -136,7 +136,7 @@ catalog: ioredis: 5.10.1 isomorphic-dompurify: ^3.11.0 jotai: ^2.19.1 - jsdom: ^29.1.0 + jsdom: ^29.1.1 json5: ^2.2.3 ldapts: 8.1.7 lodash.clonedeep: ^4.5.0 From e06abbc176f791518fabfc897da424e4ff393ccd Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 21:10:38 +0000 Subject: [PATCH 036/116] chore(deps): update dependency nanoid@>=4.0.0 <5.0.9 to >=5.1.10 (#5646) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 0b91e4a5e..3e9753994 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "form-data@>=4.0.0 <4.0.4": ">=4.0.5", "hono@<4.6.5": ">=4.12.16", "linkifyjs@<4.3.2": ">=4.3.2", - "nanoid@>=4.0.0 <5.0.9": ">=5.1.9", + "nanoid@>=4.0.0 <5.0.9": ">=5.1.10", "prismjs@<1.30.0": ">=1.30.0", "proxmox-api>undici": "7.24.6", "react-is": "^19.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78d6fe81b..95a8979bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -572,7 +572,7 @@ overrides: form-data@>=4.0.0 <4.0.4: '>=4.0.5' hono@<4.6.5: '>=4.12.16' linkifyjs@<4.3.2: '>=4.3.2' - nanoid@>=4.0.0 <5.0.9: '>=5.1.9' + nanoid@>=4.0.0 <5.0.9: '>=5.1.10' prismjs@<1.30.0: '>=1.30.0' proxmox-api>undici: 7.24.6 react-is: ^19.2.5 @@ -8693,8 +8693,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.9: - resolution: {integrity: sha512-ZUvP7KeBLe3OZ1ypw6dI/TzYJuvHP77IM4Ry73waSQTLn8/g8rpdjfyVAh7t1/+FjBtG4lCP42MEbDxOsRpBMw==} + nanoid@5.1.11: + resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} engines: {node: ^18 || >=20} hasBin: true @@ -12438,7 +12438,7 @@ snapshots: cli-high: 0.4.3 diff: 5.2.2 effect: 3.21.0 - nanoid: 5.1.9 + nanoid: 5.1.11 recast: 0.23.11 xycolors: 0.1.2 @@ -12457,7 +12457,7 @@ snapshots: faster-babel-types: 0.1.0(@babel/types@7.26.0) hono: 4.12.16 isomorphic-fetch: 3.0.0 - nanoid: 5.1.9 + nanoid: 5.1.11 ohash: 1.1.4 pako: 2.1.0 pathe: 1.1.2 @@ -17406,7 +17406,7 @@ snapshots: nanoid@3.3.11: {} - nanoid@5.1.9: {} + nanoid@5.1.11: {} napi-build-utils@1.0.2: {} From 2f301bb56ae686de358c23a095ea5af6e632c00c Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 03:01:59 +0000 Subject: [PATCH 037/116] chore(deps): update turbo monorepo to ^2.9.7 (#5649) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 96 ++++++++++++++++++++++----------------------- pnpm-workspace.yaml | 6 +-- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 95a8979bd..08ed53b8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -214,8 +214,8 @@ catalogs: specifier: ^11.17.0 version: 11.17.0 '@turbo/gen': - specifier: ^2.9.6 - version: 2.9.6 + specifier: ^2.9.7 + version: 2.9.8 '@types/adm-zip': specifier: 0.5.8 version: 0.5.8 @@ -367,8 +367,8 @@ catalogs: specifier: ^10.1.8 version: 10.1.8 eslint-config-turbo: - specifier: ^2.9.6 - version: 2.9.6 + specifier: ^2.9.7 + version: 2.9.8 eslint-plugin-import: specifier: ^2.32.0 version: 2.32.0 @@ -517,8 +517,8 @@ catalogs: specifier: 4.20.4 version: 4.20.4 turbo: - specifier: ^2.9.6 - version: 2.9.6 + specifier: ^2.9.7 + version: 2.9.8 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -621,7 +621,7 @@ importers: version: 11.14.0 '@turbo/gen': specifier: 'catalog:' - version: 2.9.6(@types/node@24.12.2) + version: 2.9.8(@types/node@24.12.2) '@vitejs/plugin-react': specifier: 'catalog:' version: 5.2.0(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) @@ -654,7 +654,7 @@ importers: version: 11.14.0 turbo: specifier: 'catalog:' - version: 2.9.6 + version: 2.9.8 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2923,7 +2923,7 @@ importers: version: 10.1.8(eslint@10.2.1) eslint-config-turbo: specifier: 'catalog:' - version: 2.9.6(eslint@10.2.1)(turbo@2.9.6) + version: 2.9.8(eslint@10.2.1)(turbo@2.9.8) eslint-plugin-import: specifier: 'catalog:' version: 2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint@10.2.1) @@ -5524,37 +5524,37 @@ packages: '@tsconfig/svelte@1.0.13': resolution: {integrity: sha512-5lYJP45Xllo4yE/RUBccBT32eBlRDbqN8r1/MIvQbKxW3aFqaYPCNgm8D5V20X4ShHcwvYWNlKg3liDh1MlBoA==} - '@turbo/darwin-64@2.9.6': - resolution: {integrity: sha512-X/56SnVXIQZBLKwniGTwEQTGmtE5brSACnKMBWpY3YafuxVYefrC2acamfjgxP7BG5w3I+6jf0UrLoSzgPcSJg==} + '@turbo/darwin-64@2.9.8': + resolution: {integrity: sha512-zU1P95ygDpsQ+2QHh7CVTqvYwi9UBlhKWzoIyUnP3vUoge7H9SQEzrd8dj+XcTrslAp9Db3vIBcXtMVoTEYDnA==} cpu: [x64] os: [darwin] - '@turbo/darwin-arm64@2.9.6': - resolution: {integrity: sha512-aalBeSl4agT/QtYGDyf/XLajedWzUC9Vg/pm/YO6QQ93vkQ91Vz5uK1ta5RbVRDozQSz4njxUNqRNmOXDzW+qw==} + '@turbo/darwin-arm64@2.9.8': + resolution: {integrity: sha512-nKRFI5ZhCGUi4eXNlrojzWcT/CehMj0raot1WE4lw5qf66ZxZHbRbBqcwNEy+ZLY7RkJJRY+TaU89fuj3BcgGg==} cpu: [arm64] os: [darwin] - '@turbo/gen@2.9.6': - resolution: {integrity: sha512-94E/WMvxidupdafLgh6zmlgeWXx1NAkw0d5Q508xDkrPzUNZEPdweK90Gbs3gNDgNFQ7XntZQqvrsCGggeid5A==} + '@turbo/gen@2.9.8': + resolution: {integrity: sha512-whc1xUXvYQ05etSNs6akwU4KpB1mn8q8GIVTz+nB0ruTqvN0tdS7gN/l+UZC0hvipoKUPW9IRrUIxljMq8AKWg==} hasBin: true - '@turbo/linux-64@2.9.6': - resolution: {integrity: sha512-YKi05jnNHaD7vevgYwahpzGwbsNNTwzU2c7VZdmdFm7+cGDP4oREUWSsainiMfRqjRuolQxBwRn8wf1jmu+YZA==} + '@turbo/linux-64@2.9.8': + resolution: {integrity: sha512-Wf/kQpVDCaWM3P5d6lKvJnqjYn/ofUBGbT4h4vRFrdC4N6B/nsun03S2kQNJJMXpXg39woeS4CI367RMU3/OAg==} cpu: [x64] os: [linux] - '@turbo/linux-arm64@2.9.6': - resolution: {integrity: sha512-02o/ZS69cOYEDczXvOB2xmyrtzjQ2hVFtWZK1iqxXUfzMmTjZK4UumrfNnjckSg+gqeBfnPRHa0NstA173Ik3g==} + '@turbo/linux-arm64@2.9.8': + resolution: {integrity: sha512-v6S3HuKVoa9CEx16IxKj1i/+crxXx22A9O80zW1350zyUlcX0T/zLOxVf1k+ruK/7ssXnDJVg8uSYOxlYRedlA==} cpu: [arm64] os: [linux] - '@turbo/windows-64@2.9.6': - resolution: {integrity: sha512-wVdQjvnBI15wB6JrA+43CtUtagjIMmX6XYO758oZHAsCNSxqRlJtdyujih0D8OCnwCRWiGWGI63zAxR0hO6s9g==} + '@turbo/windows-64@2.9.8': + resolution: {integrity: sha512-JaefWOJNBazDylAn3f+lLB34XMNu8nEBbgPRP/Ewysg81cBubGfcyyyzpQOGVuMwfaqdNAE/kitG7w3AbJn9/g==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.9.6': - resolution: {integrity: sha512-1XUUyWW0W6FTSqGEhU8RHVqb2wP1SPkr7hIvBlMEwH9jr+sJQK5kqeosLJ/QaUv4ecSAd1ZhIrLoW7qslAzT4A==} + '@turbo/windows-arm64@2.9.8': + resolution: {integrity: sha512-Or6ljjB4TiiwCdVKDYWew0SokQ9kep5zruL8P3nbum9WdkH5XA41rQID4Ulc215Z+R3DrB+qXSHPsJjU3/n2ng==} cpu: [arm64] os: [win32] @@ -7183,8 +7183,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-config-turbo@2.9.6: - resolution: {integrity: sha512-yCZ2YcUKU2KtAO7fjqBQLI7bIc/cIH4lF/yk4ntSRDfsQiRpAtWaGTxqqMPVLZj5JpFfSZGceuM6YFHufJD5iA==} + eslint-config-turbo@2.9.8: + resolution: {integrity: sha512-NEF7KAULL8FYZEhug9jUUakQ+7S9ANe+KVSxzi4QXhuUdJb1+f85zqkL0ssM+hIlRLgOz5rKJiZQEYgmHo9IKg==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -7241,8 +7241,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.9.6: - resolution: {integrity: sha512-mntEkRe71izva2mJHZGxH2ccOdySqXiNJf5tdzRabaxhudLCeonPUdTE6aNGOhgVeL1lclxg5/ibp3C/cpe+kQ==} + eslint-plugin-turbo@2.9.8: + resolution: {integrity: sha512-czP2GjPzR6G+BpVEKXNa7Vs45/Zz0QjUEyB+SSLNpVJTqBe331AlE9IxkC2Eh00H6a1hf/Q6BVwf+1WJupyVYA==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -10530,8 +10530,8 @@ packages: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - turbo@2.9.6: - resolution: {integrity: sha512-+v2QJey7ZUeUiuigkU+uFfklvNUyPI2VO2vBpMYJA+a1hKFLFiKtUYlRHdb3P9CrAvMzi0upbjI4WT+zKtqkBg==} + turbo@2.9.8: + resolution: {integrity: sha512-REEB2rVTVDTf4hav1gJ5dIsGylWZrNonvjXFtk1dCi8gND3PhZtnYkyry1bra/Fo+iP6ctTEZbg6vWfdfHq/1A==} hasBin: true tweetnacl@0.14.5: @@ -13835,29 +13835,29 @@ snapshots: '@tsconfig/svelte@1.0.13': {} - '@turbo/darwin-64@2.9.6': + '@turbo/darwin-64@2.9.8': optional: true - '@turbo/darwin-arm64@2.9.6': + '@turbo/darwin-arm64@2.9.8': optional: true - '@turbo/gen@2.9.6(@types/node@24.12.2)': + '@turbo/gen@2.9.8(@types/node@24.12.2)': dependencies: '@inquirer/prompts': 7.10.1(@types/node@24.12.2) esbuild: 0.25.12 transitivePeerDependencies: - '@types/node' - '@turbo/linux-64@2.9.6': + '@turbo/linux-64@2.9.8': optional: true - '@turbo/linux-arm64@2.9.6': + '@turbo/linux-arm64@2.9.8': optional: true - '@turbo/windows-64@2.9.6': + '@turbo/windows-64@2.9.8': optional: true - '@turbo/windows-arm64@2.9.6': + '@turbo/windows-arm64@2.9.8': optional: true '@types/adm-zip@0.5.8': @@ -15679,11 +15679,11 @@ snapshots: dependencies: eslint: 10.2.1 - eslint-config-turbo@2.9.6(eslint@10.2.1)(turbo@2.9.6): + eslint-config-turbo@2.9.8(eslint@10.2.1)(turbo@2.9.8): dependencies: eslint: 10.2.1 - eslint-plugin-turbo: 2.9.6(eslint@10.2.1)(turbo@2.9.6) - turbo: 2.9.6 + eslint-plugin-turbo: 2.9.8(eslint@10.2.1)(turbo@2.9.8) + turbo: 2.9.8 eslint-import-resolver-node@0.3.9: dependencies: @@ -15783,11 +15783,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.9.6(eslint@10.2.1)(turbo@2.9.6): + eslint-plugin-turbo@2.9.8(eslint@10.2.1)(turbo@2.9.8): dependencies: dotenv: 16.0.3 eslint: 10.2.1 - turbo: 2.9.6 + turbo: 2.9.8 eslint-scope@5.1.1: dependencies: @@ -19519,14 +19519,14 @@ snapshots: tunnel@0.0.6: {} - turbo@2.9.6: + turbo@2.9.8: optionalDependencies: - '@turbo/darwin-64': 2.9.6 - '@turbo/darwin-arm64': 2.9.6 - '@turbo/linux-64': 2.9.6 - '@turbo/linux-arm64': 2.9.6 - '@turbo/windows-64': 2.9.6 - '@turbo/windows-arm64': 2.9.6 + '@turbo/darwin-64': 2.9.8 + '@turbo/darwin-arm64': 2.9.8 + '@turbo/linux-64': 2.9.8 + '@turbo/linux-arm64': 2.9.8 + '@turbo/windows-64': 2.9.8 + '@turbo/windows-arm64': 2.9.8 tweetnacl@0.14.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ba61cd01b..d98c168b0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -72,7 +72,7 @@ catalog: "@trpc/react-query": ^11.17.0 "@trpc/server": ^11.17.0 "@trpc/tanstack-react-query": ^11.17.0 - "@turbo/gen": ^2.9.6 + "@turbo/gen": ^2.9.7 "@types/adm-zip": 0.5.8 "@types/bcrypt": 6.0.0 "@types/better-sqlite3": 7.6.13 @@ -123,7 +123,7 @@ catalog: esbuild: ^0.28.0 eslint: ^10.2.1 eslint-config-prettier: ^10.1.8 - eslint-config-turbo: ^2.9.6 + eslint-config-turbo: ^2.9.7 eslint-plugin-import: ^2.32.0 eslint-plugin-jsx-a11y: ^6.10.2 eslint-plugin-react: ^7.37.5 @@ -173,7 +173,7 @@ catalog: trpc-to-openapi: ^3.2.0 tsdav: ^2.2.0 tsx: 4.20.4 - turbo: ^2.9.6 + turbo: ^2.9.7 typescript: ^5.9.3 typescript-eslint: ^8.58.2 undici: 7.24.6 From 3c7a7615badddc8b232a620d61d4a0e7dbce5366 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 06:13:36 +0000 Subject: [PATCH 038/116] chore(deps): update dependency nanoid@>=4.0.0 <5.0.9 to >=5.1.11 (#5648) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3e9753994..67f4b654f 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "form-data@>=4.0.0 <4.0.4": ">=4.0.5", "hono@<4.6.5": ">=4.12.16", "linkifyjs@<4.3.2": ">=4.3.2", - "nanoid@>=4.0.0 <5.0.9": ">=5.1.10", + "nanoid@>=4.0.0 <5.0.9": ">=5.1.11", "prismjs@<1.30.0": ">=1.30.0", "proxmox-api>undici": "7.24.6", "react-is": "^19.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08ed53b8b..e555c315c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -572,7 +572,7 @@ overrides: form-data@>=4.0.0 <4.0.4: '>=4.0.5' hono@<4.6.5: '>=4.12.16' linkifyjs@<4.3.2: '>=4.3.2' - nanoid@>=4.0.0 <5.0.9: '>=5.1.10' + nanoid@>=4.0.0 <5.0.9: '>=5.1.11' prismjs@<1.30.0: '>=1.30.0' proxmox-api>undici: 7.24.6 react-is: ^19.2.5 @@ -5843,6 +5843,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@videojs/http-streaming@3.17.4': resolution: {integrity: sha512-XAvdG2dolBuV2Fx8bu1kjmQ2D4TonGzZH68Pgv/O9xMSFWdZtITSMFismeQLEAtMmGwze8qNJp3RgV+jStrJqg==} From 6671ac48f9615922ab88fec0ab5dcd26c22d5e8e Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 09:30:45 +0000 Subject: [PATCH 039/116] chore(deps): update tanstack-query monorepo to ^5.100.7 (#5651) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 88 ++++++++++++++++++++++----------------------- pnpm-workspace.yaml | 6 ++-- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e555c315c..722afcdae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -133,14 +133,14 @@ catalogs: specifier: ^3.41.1 version: 3.41.1 '@tanstack/react-query': - specifier: ^5.100.6 - version: 5.100.6 + specifier: ^5.100.7 + version: 5.100.8 '@tanstack/react-query-devtools': - specifier: ^5.100.6 - version: 5.100.6 + specifier: ^5.100.7 + version: 5.100.8 '@tanstack/react-query-next-experimental': - specifier: ^5.100.6 - version: 5.100.6 + specifier: ^5.100.7 + version: 5.100.8 '@testcontainers/mysql': specifier: ^11.14.0 version: 11.14.0 @@ -792,22 +792,22 @@ importers: version: 3.41.1(react@19.2.5) '@tanstack/react-query': specifier: 'catalog:' - version: 5.100.6(react@19.2.5) + version: 5.100.8(react@19.2.5) '@tanstack/react-query-devtools': specifier: 'catalog:' - version: 5.100.6(@tanstack/react-query@5.100.6(react@19.2.5))(react@19.2.5) + version: 5.100.8(@tanstack/react-query@5.100.8(react@19.2.5))(react@19.2.5) '@tanstack/react-query-next-experimental': specifier: 'catalog:' - version: 5.100.6(@tanstack/react-query@5.100.6(react@19.2.5))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5) + version: 5.100.8(@tanstack/react-query@5.100.8(react@19.2.5))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5) '@trpc/client': specifier: 'catalog:' version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/next': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) '@trpc/react-query': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) '@trpc/server': specifier: 'catalog:' version: 11.17.0(typescript@5.9.3) @@ -1204,19 +1204,19 @@ importers: version: 1.4.0 '@tanstack/react-query': specifier: 'catalog:' - version: 5.100.6(react@19.2.5) + version: 5.100.8(react@19.2.5) '@trpc/client': specifier: 'catalog:' version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/react-query': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) '@trpc/server': specifier: 'catalog:' version: 11.17.0(typescript@5.9.3) '@trpc/tanstack-react-query': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) lodash.clonedeep: specifier: 'catalog:' version: 4.5.0 @@ -1519,7 +1519,7 @@ importers: version: link:../cron-jobs '@tanstack/react-query': specifier: 'catalog:' - version: 5.100.6(react@19.2.5) + version: 5.100.8(react@19.2.5) '@trpc/client': specifier: 'catalog:' version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) @@ -1528,7 +1528,7 @@ importers: version: 11.17.0(typescript@5.9.3) '@trpc/tanstack-react-query': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) react: specifier: 'catalog:' version: 19.2.5 @@ -5200,27 +5200,27 @@ packages: resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@5.100.6': - resolution: {integrity: sha512-Os2CPUr98to98RYm+D4qGqGkiffn7MGSyl2547a4MljVkHE30AMJRqTiyCqBfMwzAx/I91vCkAxp5tHSla6Twg==} + '@tanstack/query-core@5.100.8': + resolution: {integrity: sha512-ceYwSFOqjPwET5TA6IOYxzxlGc0ekyH/gfOtWkP0PX43rzX9bxW48Iuw8KAduKCToi4rJAQ6nRy2kAe8gszdmg==} - '@tanstack/query-devtools@5.100.6': - resolution: {integrity: sha512-2SiNwlOiAdTbqktCSmwlXZH8x8mckSbES2O0bdr3qZNhdQl5DCtImZx0S3HGeNHWTIkzTaHx2Isg+bD4M3WRIg==} + '@tanstack/query-devtools@5.100.8': + resolution: {integrity: sha512-29D6k564h7eudwNdfRcq6Je2VFUWGxHwADPg1xC2yHxrovYBwZiqzIv/DkPRsK/EMoOIPIvPq+IU0uCxiQXYPA==} - '@tanstack/react-query-devtools@5.100.6': - resolution: {integrity: sha512-sz3ksMKA2t1rx0+Odzb0x1A3pXH/SVf7fzlzd3sKXzwXz8980f5sbOwfQD6+UfTG8G4Y2KaIg9e3sBn+uC4VTg==} + '@tanstack/react-query-devtools@5.100.8': + resolution: {integrity: sha512-BKpysWo1u3kVMtv92XOv/Gu6eCbE/IxBLJPs0GG/qyySUQvZI2h7mqRwyf8Aa6WfUoX8Yf2AAh0uugQLAr8KtQ==} peerDependencies: - '@tanstack/react-query': ^5.100.6 + '@tanstack/react-query': ^5.100.8 react: ^18 || ^19 - '@tanstack/react-query-next-experimental@5.100.6': - resolution: {integrity: sha512-LqEhb6BG/KgwOEKdnKsBpiB96fudmKnrEYcfJxE27gBReBpuJZZGcllEtYXt6S8TFS2uIwmks4zNnRcspFOoBQ==} + '@tanstack/react-query-next-experimental@5.100.8': + resolution: {integrity: sha512-B1p5yeqWeLrWasZ0s2pG7b7do37XNXIlzHnj8RcEsoJ8DsGWXvAfSjXgnLvG0HdZUTPWjHrVRMIJ0Pgmy+bCtw==} peerDependencies: - '@tanstack/react-query': ^5.100.6 + '@tanstack/react-query': ^5.100.8 next: ^13 || ^14 || ^15 || ^16 react: ^18 || ^19 - '@tanstack/react-query@5.100.6': - resolution: {integrity: sha512-uVSrps0PV16Cxmcn2rvL+dUhwTpTUtiRW347AEeYxMZXO2pZe9ja7E24PAMGoQ5u2g89DD8u4QhOviBk+RN8RA==} + '@tanstack/react-query@5.100.8': + resolution: {integrity: sha512-iNNEekixXU5vtAGKKZX2lx3jTooG5yNY+kv0wSgEdEYG0Mj0JM5bcuQtC35ZAP3nDopT6jciUK3xeX65U7AnfA==} peerDependencies: react: ^18 || ^19 @@ -13511,25 +13511,25 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@5.100.6': {} + '@tanstack/query-core@5.100.8': {} - '@tanstack/query-devtools@5.100.6': {} + '@tanstack/query-devtools@5.100.8': {} - '@tanstack/react-query-devtools@5.100.6(@tanstack/react-query@5.100.6(react@19.2.5))(react@19.2.5)': + '@tanstack/react-query-devtools@5.100.8(@tanstack/react-query@5.100.8(react@19.2.5))(react@19.2.5)': dependencies: - '@tanstack/query-devtools': 5.100.6 - '@tanstack/react-query': 5.100.6(react@19.2.5) + '@tanstack/query-devtools': 5.100.8 + '@tanstack/react-query': 5.100.8(react@19.2.5) react: 19.2.5 - '@tanstack/react-query-next-experimental@5.100.6(@tanstack/react-query@5.100.6(react@19.2.5))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)': + '@tanstack/react-query-next-experimental@5.100.8(@tanstack/react-query@5.100.8(react@19.2.5))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)': dependencies: - '@tanstack/react-query': 5.100.6(react@19.2.5) + '@tanstack/react-query': 5.100.8(react@19.2.5) next: 16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) react: 19.2.5 - '@tanstack/react-query@5.100.6(react@19.2.5)': + '@tanstack/react-query@5.100.8(react@19.2.5)': dependencies: - '@tanstack/query-core': 5.100.6 + '@tanstack/query-core': 5.100.8 react: 19.2.5 '@tanstack/react-table@8.20.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': @@ -13802,7 +13802,7 @@ snapshots: '@trpc/server': 11.17.0(typescript@5.9.3) typescript: 5.9.3 - '@trpc/next@11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)': + '@trpc/next@11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.4(@babel/core@7.26.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)': dependencies: '@trpc/client': 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/server': 11.17.0(typescript@5.9.3) @@ -13811,12 +13811,12 @@ snapshots: react-dom: 19.2.5(react@19.2.5) typescript: 5.9.3 optionalDependencies: - '@tanstack/react-query': 5.100.6(react@19.2.5) - '@trpc/react-query': 11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) + '@tanstack/react-query': 5.100.8(react@19.2.5) + '@trpc/react-query': 11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) - '@trpc/react-query@11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': + '@trpc/react-query@11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': dependencies: - '@tanstack/react-query': 5.100.6(react@19.2.5) + '@tanstack/react-query': 5.100.8(react@19.2.5) '@trpc/client': 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/server': 11.17.0(typescript@5.9.3) react: 19.2.5 @@ -13826,9 +13826,9 @@ snapshots: dependencies: typescript: 5.9.3 - '@trpc/tanstack-react-query@11.17.0(@tanstack/react-query@5.100.6(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': + '@trpc/tanstack-react-query@11.17.0(@tanstack/react-query@5.100.8(react@19.2.5))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3)': dependencies: - '@tanstack/react-query': 5.100.6(react@19.2.5) + '@tanstack/react-query': 5.100.8(react@19.2.5) '@trpc/client': 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/server': 11.17.0(typescript@5.9.3) react: 19.2.5 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d98c168b0..313014355 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -45,9 +45,9 @@ catalog: "@semantic-release/release-notes-generator": ^14.1.0 "@t3-oss/env-nextjs": ^0.13.11 "@tabler/icons-react": ^3.41.1 - "@tanstack/react-query": ^5.100.6 - "@tanstack/react-query-devtools": ^5.100.6 - "@tanstack/react-query-next-experimental": ^5.100.6 + "@tanstack/react-query": ^5.100.7 + "@tanstack/react-query-devtools": ^5.100.7 + "@tanstack/react-query-next-experimental": ^5.100.7 "@testcontainers/mysql": ^11.14.0 "@testcontainers/postgresql": ^11.14.0 "@testcontainers/redis": ^11.14.0 From 62a476a949ed086715624425aa1e6e3bf6e3bb4f Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 16:35:25 +0000 Subject: [PATCH 040/116] chore(deps): update dependency eslint to ^10.3.0 (#5652) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 200 +++++++++++++++++++++----------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 98 insertions(+), 104 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 722afcdae..d12858181 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -361,8 +361,8 @@ catalogs: specifier: ^0.28.0 version: 0.28.0 eslint: - specifier: ^10.2.1 - version: 10.2.1 + specifier: ^10.3.0 + version: 10.3.0 eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8 @@ -922,7 +922,7 @@ importers: version: 9.2.1 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 node-loader: specifier: 'catalog:' version: 2.1.0(webpack@5.94.0) @@ -1025,7 +1025,7 @@ importers: version: 0.28.0 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 prettier: specifier: 'catalog:' version: 3.8.3 @@ -1089,7 +1089,7 @@ importers: version: 0.28.0 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 prettier: specifier: 'catalog:' version: 3.8.3 @@ -1135,7 +1135,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1250,7 +1250,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 prettier: specifier: 'catalog:' version: 3.8.3 @@ -1323,7 +1323,7 @@ importers: version: 0.9.2 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 prettier: specifier: 'catalog:' version: 3.8.3 @@ -1354,7 +1354,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1394,7 +1394,7 @@ importers: version: 0.28.0 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1446,7 +1446,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1501,7 +1501,7 @@ importers: version: 8.20.0 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1550,7 +1550,7 @@ importers: version: 19.2.14 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1572,7 +1572,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1642,7 +1642,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1673,7 +1673,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1755,7 +1755,7 @@ importers: version: 0.28.0 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 prettier: specifier: 'catalog:' version: 3.8.3 @@ -1789,7 +1789,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 tsx: specifier: 'catalog:' version: 4.20.4 @@ -1823,7 +1823,7 @@ importers: version: 4.0.1 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1860,7 +1860,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1912,7 +1912,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1940,7 +1940,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1974,7 +1974,7 @@ importers: version: 6.0.0 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2074,7 +2074,7 @@ importers: version: 0.4.14 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2108,7 +2108,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2181,7 +2181,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2209,7 +2209,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2291,7 +2291,7 @@ importers: version: 0.5.8 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2316,7 +2316,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2341,7 +2341,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2378,7 +2378,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2436,7 +2436,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2461,7 +2461,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2498,7 +2498,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2574,7 +2574,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2620,7 +2620,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2690,7 +2690,7 @@ importers: version: 1.0.5 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2721,7 +2721,7 @@ importers: version: link:../../tooling/typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2908,7 +2908,7 @@ importers: version: 7.3.58 eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -2920,29 +2920,29 @@ importers: version: 16.2.4 eslint-config-prettier: specifier: 'catalog:' - version: 10.1.8(eslint@10.2.1) + version: 10.1.8(eslint@10.3.0) eslint-config-turbo: specifier: 'catalog:' - version: 2.9.8(eslint@10.2.1)(turbo@2.9.8) + version: 2.9.8(eslint@10.3.0)(turbo@2.9.8) eslint-plugin-import: specifier: 'catalog:' - version: 2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint@10.2.1) + version: 2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.3.0)(typescript@5.9.3))(eslint@10.3.0) eslint-plugin-jsx-a11y: specifier: 'catalog:' - version: 6.10.2(eslint@10.2.1) + version: 6.10.2(eslint@10.3.0) eslint-plugin-react: specifier: 'catalog:' - version: 7.37.5(eslint@10.2.1) + version: 7.37.5(eslint@10.3.0) eslint-plugin-react-hooks: specifier: 'catalog:' - version: 6.1.1(eslint@10.2.1) + version: 6.1.1(eslint@10.3.0) typescript-eslint: specifier: 'catalog:' - version: 8.58.2(eslint@10.2.1)(typescript@5.9.3) + version: 8.58.2(eslint@10.3.0)(typescript@5.9.3) devDependencies: '@eslint/js': specifier: 'catalog:' - version: 10.0.1(eslint@10.2.1) + version: 10.0.1(eslint@10.3.0) '@homarr/prettier-config': specifier: workspace:^0.1.0 version: link:../prettier @@ -2951,7 +2951,7 @@ importers: version: link:../typescript eslint: specifier: 'catalog:' - version: 10.2.1 + version: 10.3.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -7260,16 +7260,12 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@5.0.0: - resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.1: - resolution: {integrity: sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==} + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -11817,9 +11813,9 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': dependencies: - eslint: 10.2.1 + eslint: 10.3.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -11840,9 +11836,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.2.1)': + '@eslint/js@10.0.1(eslint@10.3.0)': optionalDependencies: - eslint: 10.2.1 + eslint: 10.3.0 '@eslint/object-schema@3.0.5': {} @@ -13390,7 +13386,7 @@ snapshots: '@swagger-api/apidom-error': 1.11.0 '@types/ramda': 0.30.2 axios: 1.15.0 - minimatch: 10.2.2 + minimatch: 10.2.5 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optionalDependencies: @@ -14113,15 +14109,15 @@ snapshots: dependencies: '@types/node': 24.12.2 - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint@10.2.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.3.0)(typescript@5.9.3))(eslint@10.3.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.3.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.58.2(eslint@10.3.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.3.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 10.2.1 + eslint: 10.3.0 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -14129,14 +14125,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.58.2(eslint@10.3.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.58.2 '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 - eslint: 10.2.1 + eslint: 10.3.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -14159,13 +14155,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.58.2(eslint@10.3.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.3.0)(typescript@5.9.3) debug: 4.4.3 - eslint: 10.2.1 + eslint: 10.3.0 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -14180,7 +14176,7 @@ snapshots: '@typescript-eslint/types': 8.58.2 '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 - minimatch: 10.2.2 + minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -14188,13 +14184,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.58.2(eslint@10.3.0)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) '@typescript-eslint/scope-manager': 8.58.2 '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - eslint: 10.2.1 + eslint: 10.3.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -14202,7 +14198,7 @@ snapshots: '@typescript-eslint/visitor-keys@8.58.2': dependencies: '@typescript-eslint/types': 8.58.2 - eslint-visitor-keys: 5.0.0 + eslint-visitor-keys: 5.0.1 '@umami/node@0.4.0': {} @@ -15676,14 +15672,14 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.2.1): + eslint-config-prettier@10.1.8(eslint@10.3.0): dependencies: - eslint: 10.2.1 + eslint: 10.3.0 - eslint-config-turbo@2.9.8(eslint@10.2.1)(turbo@2.9.8): + eslint-config-turbo@2.9.8(eslint@10.3.0)(turbo@2.9.8): dependencies: - eslint: 10.2.1 - eslint-plugin-turbo: 2.9.8(eslint@10.2.1)(turbo@2.9.8) + eslint: 10.3.0 + eslint-plugin-turbo: 2.9.8(eslint@10.3.0)(turbo@2.9.8) turbo: 2.9.8 eslint-import-resolver-node@0.3.9: @@ -15694,17 +15690,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.2.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.3.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.3.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1)(typescript@5.9.3) - eslint: 10.2.1 + '@typescript-eslint/parser': 8.58.2(eslint@10.3.0)(typescript@5.9.3) + eslint: 10.3.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint@10.2.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.3.0)(typescript@5.9.3))(eslint@10.3.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -15713,9 +15709,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.2.1 + eslint: 10.3.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.2.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.3.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.3.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15727,13 +15723,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.3.0)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@10.2.1): + eslint-plugin-jsx-a11y@6.10.2(eslint@10.3.0): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -15743,7 +15739,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 10.2.1 + eslint: 10.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -15752,17 +15748,17 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@6.1.1(eslint@10.2.1): + eslint-plugin-react-hooks@6.1.1(eslint@10.3.0): dependencies: '@babel/core': 7.29.0 '@babel/parser': 7.29.2 - eslint: 10.2.1 + eslint: 10.3.0 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@10.2.1): + eslint-plugin-react@7.37.5(eslint@10.3.0): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -15770,7 +15766,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 10.2.1 + eslint: 10.3.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -15784,10 +15780,10 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.9.8(eslint@10.2.1)(turbo@2.9.8): + eslint-plugin-turbo@2.9.8(eslint@10.3.0)(turbo@2.9.8): dependencies: dotenv: 16.0.3 - eslint: 10.2.1 + eslint: 10.3.0 turbo: 2.9.8 eslint-scope@5.1.1: @@ -15804,13 +15800,11 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@5.0.0: {} - eslint-visitor-keys@5.0.1: {} - eslint@10.2.1: + eslint@10.3.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 @@ -19593,13 +19587,13 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript-eslint@8.58.2(eslint@10.2.1)(typescript@5.9.3): + typescript-eslint@8.58.2(eslint@10.3.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@5.9.3))(eslint@10.2.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.3.0)(typescript@5.9.3))(eslint@10.3.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.3.0)(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1)(typescript@5.9.3) - eslint: 10.2.1 + '@typescript-eslint/utils': 8.58.2(eslint@10.3.0)(typescript@5.9.3) + eslint: 10.3.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 313014355..e0200e962 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -121,7 +121,7 @@ catalog: drizzle-orm: ^0.45.2 drizzle-zod: ^0.8.3 esbuild: ^0.28.0 - eslint: ^10.2.1 + eslint: ^10.3.0 eslint-config-prettier: ^10.1.8 eslint-config-turbo: ^2.9.7 eslint-plugin-import: ^2.32.0 From b07a4a0f3e3af384ec477bf5c505a705b003de47 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Wed, 6 May 2026 21:23:14 +0200 Subject: [PATCH 041/116] fix(update-checker): hide prereleases on non-prerelease versions (#5645) --- .../src/test/update-checker.spec.ts | 138 +++++++++++++++++ .../request-handler/src/update-checker.ts | 140 ++++++++++++------ 2 files changed, 230 insertions(+), 48 deletions(-) create mode 100644 packages/request-handler/src/test/update-checker.spec.ts diff --git a/packages/request-handler/src/test/update-checker.spec.ts b/packages/request-handler/src/test/update-checker.spec.ts new file mode 100644 index 000000000..4c8c1e94b --- /dev/null +++ b/packages/request-handler/src/test/update-checker.spec.ts @@ -0,0 +1,138 @@ +import type { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods"; +import { Octokit } from "octokit"; +import { beforeEach, describe, expect, test, vi } from "vitest"; + +import { getAvailableUpdatesAsync } from "../update-checker"; + +const mockEnv = vi.hoisted(() => ({ + NO_EXTERNAL_CONNECTION: false, +})); + +vi.mock("@homarr/common/env", () => ({ + env: mockEnv, +})); + +vi.mock("octokit", () => { + const mockOctokit = { + rest: { + repos: { + listReleases: vi.fn(), + }, + }, + }; + return { + Octokit: class { + rest = mockOctokit.rest; + }, + }; +}); + +describe("getAvailableUpdatesAsync", () => { + beforeEach(() => { + mockEnv.NO_EXTERNAL_CONNECTION = false; + }); + + test("should return available non pre-release updates", async () => { + // Arrange + const currentVersion = "v1.2.3"; + const releases = fakeReleasesWithPrereleases(); + const listReleasesSpy = vi.spyOn(new Octokit().rest.repos, "listReleases"); + listReleasesSpy.mockReturnValue(Promise.resolve({ data: releases, status: 200, headers: {}, url: "" })); + + // Act + const result = await getAvailableUpdatesAsync(currentVersion); + + // Assert + expect(result.map((update) => update.tagName)).toEqual(["v1.3.0", "v1.2.4"]); + expect(listReleasesSpy).toHaveBeenCalledWith({ + owner: "homarr-labs", + repo: "homarr", + }); + }); + + test("should return all available updates", async () => { + // Arrange + const currentVersion = "v1.2.4-beta.2"; + const releases = fakeReleasesWithPrereleases(); + const listReleasesSpy = vi.spyOn(new Octokit().rest.repos, "listReleases"); + listReleasesSpy.mockReturnValue(Promise.resolve({ data: releases, status: 200, headers: {}, url: "" })); + + // Act + const result = await getAvailableUpdatesAsync(currentVersion); + + // Assert + expect(result.map((update) => update.tagName)).toEqual([ + "v1.3.1-beta.1", + "v1.3.0", + "v1.3.0-beta.1", + "v1.2.4", + "v1.2.4-beta.3", + ]); + expect(listReleasesSpy).toHaveBeenCalledWith({ + owner: "homarr-labs", + repo: "homarr", + query: undefined, + }); + }); + + test("should skip releases with invalid semver tags", async () => { + // Arrange + const currentVersion = "v1.2.3"; + const releases = fakeReleases(["v1.2.4", false], ["invalid-tag", false], ["v1.3.0", false]); + const listReleasesSpy = vi.spyOn(new Octokit().rest.repos, "listReleases"); + listReleasesSpy.mockReturnValue(Promise.resolve({ data: releases, status: 200, headers: {}, url: "" })); + + // Act + const result = await getAvailableUpdatesAsync(currentVersion); + + // Assert + expect(result.map((update) => update.tagName)).toEqual(["v1.3.0", "v1.2.4"]); + }); + + test("should throw error for invalid current version", async () => { + // Arrange + const currentVersion = "invalid-version"; + + // Act + const act = () => getAvailableUpdatesAsync(currentVersion); + + // Assert + await expect(act()).rejects.toThrow("non semantic current version"); + }); + + test("should return empty array when NO_EXTERNAL_CONNECTION=true", async () => { + // Arrange + mockEnv.NO_EXTERNAL_CONNECTION = true; + const currentVersion = "v1.0.0"; + + // Act + const result = await getAvailableUpdatesAsync(currentVersion); + + // Assert + expect(result).toEqual([]); + }); +}); + +const fakeReleases = (...inputs: [string, boolean][]) => inputs.map(fakeRelease); +const fakeRelease = ([tagName, isPrerelease]: [string, boolean]) => + ({ + tag_name: tagName, + html_url: `https://github.com/homarr-labs/homarr/releases/tag/${tagName}`, + name: tagName, + body_html: undefined, + prerelease: isPrerelease, + }) as RestEndpointMethodTypes["repos"]["listReleases"]["response"]["data"][number]; + +const fakeReleasesWithPrereleases = () => + fakeReleases( + ["v1.1.0", false], + ["v1.2.2", false], + ["v1.2.3", false], + ["v1.2.4-beta.1", true], + ["v1.2.4-beta.2", true], + ["v1.2.4-beta.3", true], + ["v1.2.4", false], + ["v1.3.0-beta.1", true], + ["v1.3.0", false], + ["v1.3.1-beta.1", true], + ); diff --git a/packages/request-handler/src/update-checker.ts b/packages/request-handler/src/update-checker.ts index 755f14d3b..bd09ce89d 100644 --- a/packages/request-handler/src/update-checker.ts +++ b/packages/request-handler/src/update-checker.ts @@ -1,10 +1,11 @@ import dayjs from "dayjs"; import { Octokit } from "octokit"; -import { compareSemVer, isValidSemVer } from "semver-parser"; +import { compareSemVer, isValidSemVer, parseSemVer } from "semver-parser"; import { env } from "@homarr/common/env"; import { fetchWithTrustedCertificatesAsync } from "@homarr/core/infrastructure/http"; import { createLogger } from "@homarr/core/infrastructure/logs"; +import { ErrorWithMetadata } from "@homarr/core/infrastructure/logs/error"; import { createChannelWithLatestAndEvents } from "@homarr/redis"; import { createCachedRequestHandler } from "@homarr/request-handler/lib/cached-request-handler"; @@ -16,58 +17,101 @@ export const updateCheckerRequestHandler = createCachedRequestHandler({ queryKey: "homarr-update-checker", cacheDuration: dayjs.duration(1, "hour"), async requestAsync(_) { - if (env.NO_EXTERNAL_CONNECTION) - return { - availableUpdates: [], - }; - - const octokit = new Octokit({ - request: { - fetch: fetchWithTrustedCertificatesAsync, - }, - }); - const releases = await octokit.rest.repos.listReleases({ - owner: "homarr-labs", - repo: "homarr", - }); - - const currentVersion = (packageJson as { version: string }).version; - const availableReleases = []; - - for (const release of releases.data) { - if (!isValidSemVer(release.tag_name)) { - logger.warn("Unable to parse semantic tag. Update check might not work.", { tagName: release.tag_name }); - continue; - } - - availableReleases.push(release); - } - - const availableNewerReleases = availableReleases - .filter((release) => compareSemVer(release.tag_name, currentVersion) > 0) - .sort((releaseA, releaseB) => compareSemVer(releaseB.tag_name, releaseA.tag_name)); - if (availableNewerReleases.length > 0) { - logger.info( - "Update checker found a new available version", - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - { version: availableReleases[0]!.tag_name, currentVersion }, - ); - } else { - logger.debug("Update checker did not find any available updates", { currentVersion }); - } - return { - availableUpdates: availableNewerReleases.map((release) => ({ - name: release.name, - contentHtml: release.body_html, - url: release.html_url, - tagName: release.tag_name, - })), + availableUpdates: await getAvailableUpdatesAsync(packageJson.version), }; }, createRedisChannel() { return createChannelWithLatestAndEvents<{ - availableUpdates: { name: string | null; contentHtml?: string; url: string; tagName: string }[]; + availableUpdates: Update[]; }>("homarr:update"); }, }); + +interface Update { + name: string | null; + contentHtml?: string; + url: string; + tagName: string; + isPrerelease: boolean; +} + +const isPrereleaseTag = (tagName: string) => { + try { + const parsed = parseSemVer(tagName); + return Boolean(parsed.pre?.length); + } catch { + return false; + } +}; + +export const getAvailableUpdatesAsync = async (currentVersion: string) => { + if (env.NO_EXTERNAL_CONNECTION) return []; + + if (!isValidSemVer(currentVersion)) { + throw new ErrorWithMetadata("Unable to check for updates due to non semantic current version", { + currentVersion, + }); + } + + const octokit = new Octokit({ + request: { + fetch: fetchWithTrustedCertificatesAsync, + }, + }); + + const isCurrentPrerelease = isPrereleaseTag(currentVersion); + + const releases = await octokit.rest.repos.listReleases({ + owner: "homarr-labs", + repo: "homarr", + }); + + const { skippedTags, semanticReleases } = releases.data + .map((release) => ({ + name: release.name, + contentHtml: release.body_html, + url: release.html_url, + tagName: release.tag_name, + isPrerelease: release.prerelease, + })) + .reduce( + (prev, curr) => { + if (!isValidSemVer(curr.tagName)) { + prev.skippedTags.push(curr.tagName); + return prev; + } + + prev.semanticReleases.push(curr); + return prev; + }, + { semanticReleases: [] as Update[], skippedTags: [] as string[] }, + ); + + if (skippedTags.length > 0) { + logger.warn( + "Some releases were skipped during the update check because their tag name is not a valid semantic version", + { + skippedTags: skippedTags.join(","), + }, + ); + } + + const availableUpdates = semanticReleases + .filter((release) => isCurrentPrerelease || !release.isPrerelease) + .filter((release) => compareSemVer(release.tagName, currentVersion) > 0) + .sort((releaseA, releaseB) => compareSemVer(releaseB.tagName, releaseA.tagName)); + + if (availableUpdates.length === 0) { + logger.debug("No available updates found", { currentVersion }); + return []; + } + + logger.info("Found available updates", { + version: availableUpdates[0]?.tagName, + count: availableUpdates.length, + currentVersion, + }); + + return availableUpdates; +}; From 5ee84f8cf464c308729281cb4db572950ba85a82 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 6 May 2026 23:39:26 +0200 Subject: [PATCH 042/116] perf: (next branch) reduce idle memory on startup (#5637) --- apps/nextjs/next.config.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/nextjs/next.config.ts b/apps/nextjs/next.config.ts index a3dabe151..e0f496772 100644 --- a/apps/nextjs/next.config.ts +++ b/apps/nextjs/next.config.ts @@ -32,6 +32,8 @@ const nextConfig: NextConfig = { experimental: { optimizePackageImports: ["@mantine/core", "@mantine/hooks", "@tabler/icons-react"], turbopackFileSystemCacheForDev: true, + preloadEntriesOnStart: false, + webpackMemoryOptimizations: true, }, transpilePackages: ["@homarr/ui", "@homarr/notifications", "@homarr/modals", "@homarr/spotlight", "@homarr/widgets"], images: { From 71e4526ad50c513307a3cb9c7434a4fbbaafde08 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 22:04:29 +0000 Subject: [PATCH 043/116] chore(deps): update dependency zod to ^4.4.2 (#5656) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 15 +++++---------- pnpm-workspace.yaml | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d12858181..e8637fe60 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -553,7 +553,7 @@ catalogs: specifier: 2.8.3 version: 2.8.3 zod: - specifier: ^4.4.1 + specifier: ^4.4.2 version: 4.4.2 zod-form-data: specifier: ^3.0.1 @@ -11188,9 +11188,6 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - zod@4.4.2: resolution: {integrity: sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw==} @@ -15753,8 +15750,8 @@ snapshots: '@babel/core': 7.29.0 '@babel/parser': 7.29.2 eslint: 10.3.0 - zod: 4.3.6 - zod-validation-error: 4.0.2(zod@4.3.6) + zod: 4.4.2 + zod-validation-error: 4.0.2(zod@4.4.2) transitivePeerDependencies: - supports-color @@ -20198,16 +20195,14 @@ snapshots: dependencies: zod: 4.4.2 - zod-validation-error@4.0.2(zod@4.3.6): + zod-validation-error@4.0.2(zod@4.4.2): dependencies: - zod: 4.3.6 + zod: 4.4.2 zod-validation-error@5.0.0(zod@4.4.2): dependencies: zod: 4.4.2 - zod@4.3.6: {} - zod@4.4.2: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e0200e962..07b0c48fc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -185,7 +185,7 @@ catalog: ws: ^8.20.0 xml2js: ^0.6.2 yaml: 2.8.3 - zod: ^4.4.1 + zod: ^4.4.2 zod-form-data: ^3.0.1 zod-validation-error: ^5.0.0 catalogMode: strict From 698e551790e13956b0ca23513f35c319e72c5840 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 06:18:42 +0000 Subject: [PATCH 044/116] chore(deps): update tanstack-query monorepo to ^5.100.8 (#5657) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 6 +++--- pnpm-workspace.yaml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e8637fe60..eac4080a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -133,13 +133,13 @@ catalogs: specifier: ^3.41.1 version: 3.41.1 '@tanstack/react-query': - specifier: ^5.100.7 + specifier: ^5.100.8 version: 5.100.8 '@tanstack/react-query-devtools': - specifier: ^5.100.7 + specifier: ^5.100.8 version: 5.100.8 '@tanstack/react-query-next-experimental': - specifier: ^5.100.7 + specifier: ^5.100.8 version: 5.100.8 '@testcontainers/mysql': specifier: ^11.14.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 07b0c48fc..528ada51c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -45,9 +45,9 @@ catalog: "@semantic-release/release-notes-generator": ^14.1.0 "@t3-oss/env-nextjs": ^0.13.11 "@tabler/icons-react": ^3.41.1 - "@tanstack/react-query": ^5.100.7 - "@tanstack/react-query-devtools": ^5.100.7 - "@tanstack/react-query-next-experimental": ^5.100.7 + "@tanstack/react-query": ^5.100.8 + "@tanstack/react-query-devtools": ^5.100.8 + "@tanstack/react-query-next-experimental": ^5.100.8 "@testcontainers/mysql": ^11.14.0 "@testcontainers/postgresql": ^11.14.0 "@testcontainers/redis": ^11.14.0 From 9e2c487389f6d9babba1c45f46fe35e762a2a821 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 06:19:31 +0000 Subject: [PATCH 045/116] chore(deps): update dependency isomorphic-dompurify to ^3.12.0 (#5658) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 58 ++++++++++++--------------------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 16 insertions(+), 44 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eac4080a3..11c3875d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -400,8 +400,8 @@ catalogs: specifier: 5.10.1 version: 5.10.1 isomorphic-dompurify: - specifier: ^3.11.0 - version: 3.11.0 + specifier: ^3.12.0 + version: 3.12.0 jotai: specifier: ^2.19.1 version: 2.19.1 @@ -843,7 +843,7 @@ importers: version: 13.0.6 isomorphic-dompurify: specifier: 'catalog:' - version: 3.11.0(@noble/hashes@2.0.1) + version: 3.12.0(@noble/hashes@2.0.1) jotai: specifier: 'catalog:' version: 2.19.1(@babel/core@7.26.0)(@babel/template@7.28.6)(@types/react@19.2.14)(react@19.2.5) @@ -6896,6 +6896,9 @@ packages: dompurify@3.4.1: resolution: {integrity: sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==} + dompurify@3.4.2: + resolution: {integrity: sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==} + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -8110,8 +8113,8 @@ packages: resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} engines: {node: '>=18'} - isomorphic-dompurify@3.11.0: - resolution: {integrity: sha512-il0sNhLnfawc6vKoMqnZX1JXzEzw0pP3DZWg7mM7VJNJ8cq6DCxeAjEcfjTazyBF8dkUn+rBsBPS5NQs4ZaI3g==} + isomorphic-dompurify@3.12.0: + resolution: {integrity: sha512-8n+j+6ypTHvriJwFOQ2qusQ6bzGjZVcR3jbe1pBpLcGI1dn4WIl0ctLBngqE5QttquQBAlKXwJeTMw+X7x7qKw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} isomorphic-fetch@3.0.0: @@ -8197,15 +8200,6 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsdom@29.1.0: - resolution: {integrity: sha512-YNUc7fB9QuvSSQWfrH0xF+TyABkxUwx8sswgIDaCrw4Hol8BghdZDkITtZheRJeMtzWlnTfsM3bBBusRvpO1wg==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - jsdom@29.1.1: resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} @@ -15331,6 +15325,10 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 + dompurify@3.4.2: + optionalDependencies: + '@types/trusted-types': 2.0.7 + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 @@ -16676,10 +16674,10 @@ snapshots: isexe@3.1.5: optional: true - isomorphic-dompurify@3.11.0(@noble/hashes@2.0.1): + isomorphic-dompurify@3.12.0(@noble/hashes@2.0.1): dependencies: - dompurify: 3.4.1 - jsdom: 29.1.0(@noble/hashes@2.0.1) + dompurify: 3.4.2 + jsdom: 29.1.1(@noble/hashes@2.0.1) transitivePeerDependencies: - '@noble/hashes' - canvas @@ -16774,32 +16772,6 @@ snapshots: jsbn@1.1.0: {} - jsdom@29.1.0(@noble/hashes@2.0.1): - dependencies: - '@asamuzakjp/css-color': 5.1.11 - '@asamuzakjp/dom-selector': 7.1.1 - '@bramus/specificity': 2.4.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) - '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) - css-tree: 3.2.1 - data-urls: 7.0.0(@noble/hashes@2.0.1) - decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) - is-potential-custom-element-name: 1.0.1 - lru-cache: 11.3.5 - parse5: 8.0.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.1 - undici: 7.25.0 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.1 - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@2.0.1) - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - '@noble/hashes' - jsdom@29.1.1(@noble/hashes@2.0.1): dependencies: '@asamuzakjp/css-color': 5.1.11 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 528ada51c..57dccd9b4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -134,7 +134,7 @@ catalog: glob: ^13.0.6 ical.js: ^2.2.1 ioredis: 5.10.1 - isomorphic-dompurify: ^3.11.0 + isomorphic-dompurify: ^3.12.0 jotai: ^2.19.1 jsdom: ^29.1.1 json5: ^2.2.3 From 663fe980bfe743e091e03a79af6a1ba3fdf72049 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 09:39:58 +0000 Subject: [PATCH 046/116] chore(deps): update dependency yaml to v2.8.4 (#5659) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 45 ++++++++++++++++++++++++++------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11c3875d6..e80d3410c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -550,8 +550,8 @@ catalogs: specifier: ^0.6.2 version: 0.6.2 yaml: - specifier: 2.8.3 - version: 2.8.3 + specifier: 2.8.4 + version: 2.8.4 zod: specifier: ^4.4.2 version: 4.4.2 @@ -624,7 +624,7 @@ importers: version: 2.9.8(@types/node@24.12.2) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.2.0(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 5.2.0(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4)) '@vitest/coverage-v8': specifier: 'catalog:' version: 4.1.5(vitest@4.1.5) @@ -660,10 +660,10 @@ importers: version: 5.9.3 vite-tsconfig-paths: specifier: 'catalog:' - version: 6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4)) vitest: specifier: 'catalog:' - version: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4)) apps/nextjs: dependencies: @@ -885,7 +885,7 @@ importers: version: 1.8.1(react@19.2.5) yaml: specifier: 'catalog:' - version: 2.8.3 + version: 2.8.4 zod: specifier: 'catalog:' version: 4.4.2 @@ -11116,6 +11116,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.8.4: + resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -14223,7 +14228,7 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-react@5.2.0(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitejs/plugin-react@5.2.0(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -14231,7 +14236,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4) transitivePeerDependencies: - supports-color @@ -14247,7 +14252,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4)) '@vitest/expect@4.1.5': dependencies: @@ -14258,13 +14263,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.5(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4))': dependencies: '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4) '@vitest/pretty-format@4.1.5': dependencies: @@ -14293,7 +14298,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4)) '@vitest/utils@4.1.5': dependencies: @@ -19815,17 +19820,17 @@ snapshots: dependencies: global: 4.4.0 - vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.3(typescript@5.9.3) - vite: 7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4) transitivePeerDependencies: - supports-color - typescript - vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): + vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) @@ -19840,12 +19845,12 @@ snapshots: sugarss: 5.0.0(postcss@8.5.8) terser: 5.46.1 tsx: 4.21.0 - yaml: 2.8.3 + yaml: 2.8.4 - vitest@4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.5(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4)): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.5(vite@7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4)) '@vitest/pretty-format': 4.1.5 '@vitest/runner': 4.1.5 '@vitest/snapshot': 4.1.5 @@ -19862,7 +19867,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.1.12(@types/node@24.12.2)(sass@1.99.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.4) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.12.2 @@ -20109,6 +20114,8 @@ snapshots: yaml@2.8.3: {} + yaml@2.8.4: {} + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 57dccd9b4..7978ed6f1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -184,7 +184,7 @@ catalog: winston: 3.19.0 ws: ^8.20.0 xml2js: ^0.6.2 - yaml: 2.8.3 + yaml: 2.8.4 zod: ^4.4.2 zod-form-data: ^3.0.1 zod-validation-error: ^5.0.0 From 0937555d49c29455bc33307ae5e50bf5b812c7c7 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Thu, 7 May 2026 16:54:57 +0200 Subject: [PATCH 047/116] feat(entity-state): add data attributes for custom-css styling (#5655) --- packages/widgets/src/smart-home/entity-state/component.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/widgets/src/smart-home/entity-state/component.tsx b/packages/widgets/src/smart-home/entity-state/component.tsx index 587978a42..f11cfa844 100644 --- a/packages/widgets/src/smart-home/entity-state/component.tsx +++ b/packages/widgets/src/smart-home/entity-state/component.tsx @@ -76,6 +76,7 @@ export default function SmartHomeEntityStateWidget({ return ( Date: Thu, 7 May 2026 11:50:58 -0400 Subject: [PATCH 048/116] feat: add Umami Analytics integration and widget (#5362) Co-authored-by: Josh G Co-authored-by: Meier Lukas Co-authored-by: Thomas --- .gitignore | 2 +- packages/api/src/router/widgets/index.ts | 1 + packages/api/src/router/widgets/umami.ts | 205 ++++++++ packages/cron-jobs/src/index.ts | 2 + .../cron-jobs/src/jobs/integrations/umami.ts | 14 + packages/db/migrations/seed.ts | 4 +- packages/definitions/src/integration.ts | 10 + packages/definitions/src/widget.ts | 1 + packages/integrations/src/base/creator.ts | 2 + packages/integrations/src/index.ts | 2 + packages/integrations/src/types.ts | 1 + .../src/umami/umami-integration.ts | 450 ++++++++++++++++++ .../integrations/src/umami/umami-types.ts | 84 ++++ packages/request-handler/src/umami.ts | 84 ++++ packages/translation/src/lang/en.json | 101 ++++ packages/widgets/src/_inputs/index.ts | 6 + .../src/_inputs/widget-umami-event-input.tsx | 46 ++ .../widget-umami-event-names-input.tsx | 44 ++ .../_inputs/widget-umami-website-input.tsx | 44 ++ packages/widgets/src/index.tsx | 2 + packages/widgets/src/options.ts | 15 + packages/widgets/src/umami/component.tsx | 39 ++ packages/widgets/src/umami/index.ts | 88 ++++ packages/widgets/src/umami/umami-content.tsx | 220 +++++++++ .../src/umami/umami-events-content.tsx | 138 ++++++ packages/widgets/src/umami/umami-top-list.tsx | 77 +++ packages/widgets/src/umami/umami-utils.ts | 33 ++ 27 files changed, 1713 insertions(+), 2 deletions(-) create mode 100644 packages/api/src/router/widgets/umami.ts create mode 100644 packages/cron-jobs/src/jobs/integrations/umami.ts create mode 100644 packages/integrations/src/umami/umami-integration.ts create mode 100644 packages/integrations/src/umami/umami-types.ts create mode 100644 packages/request-handler/src/umami.ts create mode 100644 packages/widgets/src/_inputs/widget-umami-event-input.tsx create mode 100644 packages/widgets/src/_inputs/widget-umami-event-names-input.tsx create mode 100644 packages/widgets/src/_inputs/widget-umami-website-input.tsx create mode 100644 packages/widgets/src/umami/component.tsx create mode 100644 packages/widgets/src/umami/index.ts create mode 100644 packages/widgets/src/umami/umami-content.tsx create mode 100644 packages/widgets/src/umami/umami-events-content.tsx create mode 100644 packages/widgets/src/umami/umami-top-list.tsx create mode 100644 packages/widgets/src/umami/umami-utils.ts diff --git a/.gitignore b/.gitignore index 43488df7a..0e991cc6c 100644 --- a/.gitignore +++ b/.gitignore @@ -71,4 +71,4 @@ en.d.json.ts # personal agent config AGENTS.md -.opencode \ No newline at end of file +.opencode diff --git a/packages/api/src/router/widgets/index.ts b/packages/api/src/router/widgets/index.ts index 5e29dfa72..e40c3f000 100644 --- a/packages/api/src/router/widgets/index.ts +++ b/packages/api/src/router/widgets/index.ts @@ -30,4 +30,5 @@ export const widgetRouter = createTRPCRouter({ timetable: lazy(() => import("./timetable").then((mod) => mod.timetableRouter)), tracearr: lazy(() => import("./tracearr").then((mod) => mod.tracearrRouter)), speedtestTracker: lazy(() => import("./speedtest-tracker").then((mod) => mod.speedtestTrackerRouter)), + umami: lazy(() => import("./umami").then((mod) => mod.umamiRouter)), }); diff --git a/packages/api/src/router/widgets/umami.ts b/packages/api/src/router/widgets/umami.ts new file mode 100644 index 000000000..2c240f4bb --- /dev/null +++ b/packages/api/src/router/widgets/umami.ts @@ -0,0 +1,205 @@ +import { observable } from "@trpc/server/observable"; +import { z } from "zod/v4"; + +import { createLogger } from "@homarr/core/infrastructure/logs"; +import { ErrorWithMetadata } from "@homarr/core/infrastructure/logs/error"; +import { createIntegrationAsync } from "@homarr/integrations"; +import { + umamiActiveVisitorsRequestHandler, + umamiEventNamesRequestHandler, + umamiMultiEventRequestHandler, + umamiRequestHandler, + umamiTopPagesRequestHandler, + umamiTopReferrersRequestHandler, +} from "@homarr/request-handler/umami"; + +import { createManyIntegrationMiddleware, createOneIntegrationMiddleware } from "../../middlewares/integration"; +import { createTRPCRouter, publicProcedure } from "../../trpc"; + +const logger = createLogger({ module: "umami-router" }); + +export const umamiRouter = createTRPCRouter({ + getWebsites: publicProcedure.concat(createOneIntegrationMiddleware("query", "umami")).query(async ({ ctx }) => { + try { + const instance = await createIntegrationAsync(ctx.integration); + return await instance.getWebsitesAsync(); + } catch (error) { + logger.warn(new Error("Failed to load websites", { cause: error })); + return []; + } + }), + + getVisitorStats: publicProcedure + .input( + z.object({ + websiteId: z.string(), + timeFrame: z.string(), + eventName: z.string().optional(), + }), + ) + .concat(createManyIntegrationMiddleware("query", "umami")) + .query(async ({ ctx, input }) => { + const results = await Promise.all( + ctx.integrations.map(async (integration) => { + const innerHandler = umamiRequestHandler.handler(integration, { + websiteId: input.websiteId, + timeFrame: input.timeFrame, + eventName: input.eventName, + }); + const { data, timestamp } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + + return { + integrationId: integration.id, + integrationName: integration.name, + integrationUrl: integration.url, + visitorStats: data, + updatedAt: timestamp, + }; + }), + ); + + return results; + }), + + getEventNames: publicProcedure + .input(z.object({ websiteId: z.string() })) + .concat(createOneIntegrationMiddleware("query", "umami")) + .query(async ({ ctx, input }) => { + try { + const innerHandler = umamiEventNamesRequestHandler.handler(ctx.integration, { websiteId: input.websiteId }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + return data; + } catch (error) { + logger.warn( + new ErrorWithMetadata("Failed to load event names", { websiteId: input.websiteId }, { cause: error }), + ); + return []; + } + }), + + getTopPages: publicProcedure + .input( + z.object({ + websiteId: z.string(), + timeFrame: z.string(), + limit: z.number().int().min(1).max(500), + }), + ) + .concat(createOneIntegrationMiddleware("query", "umami")) + .query(async ({ ctx, input }) => { + try { + const innerHandler = umamiTopPagesRequestHandler.handler(ctx.integration, { + websiteId: input.websiteId, + timeFrame: input.timeFrame, + limit: input.limit, + }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + return data; + } catch (error) { + logger.warn( + new ErrorWithMetadata( + "Failed to load top pages", + { websiteId: input.websiteId, timeFrame: input.timeFrame, limit: input.limit }, + { cause: error }, + ), + ); + return []; + } + }), + + getTopReferrers: publicProcedure + .input( + z.object({ + websiteId: z.string(), + timeFrame: z.string(), + limit: z.number().int().min(1).max(500), + }), + ) + .concat(createOneIntegrationMiddleware("query", "umami")) + .query(async ({ ctx, input }) => { + try { + const innerHandler = umamiTopReferrersRequestHandler.handler(ctx.integration, { + websiteId: input.websiteId, + timeFrame: input.timeFrame, + limit: input.limit, + }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + return data; + } catch (error) { + logger.warn( + new ErrorWithMetadata( + "Failed to load top referrers", + { websiteId: input.websiteId, timeFrame: input.timeFrame, limit: input.limit }, + { cause: error }, + ), + ); + return []; + } + }), + + getMultiEventTimeSeries: publicProcedure + .input( + z.object({ + websiteId: z.string(), + timeFrame: z.string(), + eventNames: z.array(z.string()), + }), + ) + .concat(createOneIntegrationMiddleware("query", "umami")) + .query(async ({ ctx, input }) => { + try { + const sortedNames = [...input.eventNames].sort(); + const innerHandler = umamiMultiEventRequestHandler.handler(ctx.integration, { + websiteId: input.websiteId, + timeFrame: input.timeFrame, + eventNames: sortedNames, + }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + return data; + } catch (error) { + logger.warn( + new ErrorWithMetadata( + "Failed to load multi-event time series", + { websiteId: input.websiteId, timeFrame: input.timeFrame, eventNames: JSON.stringify(input.eventNames) }, + { cause: error }, + ), + ); + return []; + } + }), + + getActiveVisitors: publicProcedure + .input(z.object({ websiteId: z.string() })) + .concat(createOneIntegrationMiddleware("query", "umami")) + .query(async ({ ctx, input }) => { + try { + const innerHandler = umamiActiveVisitorsRequestHandler.handler(ctx.integration, { + websiteId: input.websiteId, + }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + return data; + } catch (error) { + logger.warn( + new ErrorWithMetadata("Failed to load active visitors", { websiteId: input.websiteId }, { cause: error }), + ); + return 0; + } + }), + + subscribeActiveVisitors: publicProcedure + .input(z.object({ websiteId: z.string() })) + .concat(createOneIntegrationMiddleware("query", "umami")) + .subscription(({ ctx, input }) => { + return observable((emit) => { + const innerHandler = umamiActiveVisitorsRequestHandler.handler(ctx.integration, { + websiteId: input.websiteId, + }); + const unsubscribe = innerHandler.subscribe((count) => { + emit.next(count); + }); + return () => { + unsubscribe(); + }; + }); + }), +}); diff --git a/packages/cron-jobs/src/index.ts b/packages/cron-jobs/src/index.ts index 7f2b2349f..685fcb448 100644 --- a/packages/cron-jobs/src/index.ts +++ b/packages/cron-jobs/src/index.ts @@ -20,6 +20,7 @@ import { networkControllerJob } from "./jobs/integrations/network-controller"; import { refreshNotificationsJob } from "./jobs/integrations/notifications"; import { timetableJob } from "./jobs/integrations/timetable"; import { tracearrJob } from "./jobs/integrations/tracearr"; +import { umamiActiveVisitorsJob } from "./jobs/integrations/umami"; import { minecraftServerStatusJob } from "./jobs/minecraft-server-status"; import { pingJob } from "./jobs/ping"; import { rssFeedsJob } from "./jobs/rss-feeds"; @@ -54,6 +55,7 @@ export const jobGroup = createCronJobGroup({ weather: weatherJob, timetable: timetableJob, tracearr: tracearrJob, + umamiActiveVisitors: umamiActiveVisitorsJob, }); export type JobGroupKeys = ReturnType<(typeof jobGroup)["getKeys"]>[number]; diff --git a/packages/cron-jobs/src/jobs/integrations/umami.ts b/packages/cron-jobs/src/jobs/integrations/umami.ts new file mode 100644 index 000000000..c50a3c604 --- /dev/null +++ b/packages/cron-jobs/src/jobs/integrations/umami.ts @@ -0,0 +1,14 @@ +import { EVERY_30_SECONDS } from "@homarr/cron-jobs-core/expressions"; +import { createRequestIntegrationJobHandler } from "@homarr/request-handler/lib/cached-request-integration-job-handler"; +import { umamiActiveVisitorsRequestHandler } from "@homarr/request-handler/umami"; + +import { createCronJob } from "../../lib"; + +export const umamiActiveVisitorsJob = createCronJob("umamiActiveVisitors", EVERY_30_SECONDS).withCallback( + createRequestIntegrationJobHandler(umamiActiveVisitorsRequestHandler.handler, { + widgetKinds: ["umami"], + getInput: { + umami: (options) => (options.websiteId ? { websiteId: options.websiteId } : []), + }, + }), +); diff --git a/packages/db/migrations/seed.ts b/packages/db/migrations/seed.ts index 407c03746..a436b19c0 100644 --- a/packages/db/migrations/seed.ts +++ b/packages/db/migrations/seed.ts @@ -4,6 +4,7 @@ import { everyoneGroup, getIntegrationDefaultUrl, getIntegrationName, + integrationDefs, integrationKinds, } from "@homarr/definitions"; import { defaultServerSettings, defaultServerSettingsKeys } from "@homarr/server-settings"; @@ -143,8 +144,9 @@ const seedDefaultIntegrationsAsync = async (db: Database) => { const defaultIntegrations = integrationKinds.reduce((acc, kind) => { const name = getIntegrationName(kind); const defaultUrl = getIntegrationDefaultUrl(kind); + const hasNoAuthOption = integrationDefs[kind].secretKinds.some((kinds) => kinds.length === 0); - if (defaultUrl !== undefined) { + if (defaultUrl !== undefined && hasNoAuthOption) { acc.push({ id: "new", name: `${name} Default`, diff --git a/packages/definitions/src/integration.ts b/packages/definitions/src/integration.ts index 006bc9ab7..81c58b0af 100644 --- a/packages/definitions/src/integration.ts +++ b/packages/definitions/src/integration.ts @@ -370,6 +370,15 @@ export const integrationDefs = { category: ["speedtest"], documentationUrl: createDocumentationLink("/docs/integrations/speedtest-tracker"), }, + umami: { + name: "Umami", + secretKinds: [["username", "password"], ["apiKey"]], + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/umami.svg", + category: ["analytics"], + defaultUrl: "https://api.umami.is/v1", + // @ts-expect-error - docs page will be created when integration is merged + documentationUrl: createDocumentationLink("/docs/integrations/umami"), + }, // This integration only returns mock data, it is used during development (but can also be used in production by directly going to the create page) mock: { name: "Mock", @@ -461,6 +470,7 @@ export const integrationCategories = [ "notes", "mediaMonitoring", "speedtest", + "analytics", ] as const; export type IntegrationCategory = (typeof integrationCategories)[number]; diff --git a/packages/definitions/src/widget.ts b/packages/definitions/src/widget.ts index b246b32ea..d6305a08e 100644 --- a/packages/definitions/src/widget.ts +++ b/packages/definitions/src/widget.ts @@ -37,5 +37,6 @@ export const widgetKinds = [ "immich-albumCarousel", "tracearr", "speedtestTracker", + "umami", ] as const; export type WidgetKind = (typeof widgetKinds)[number]; diff --git a/packages/integrations/src/base/creator.ts b/packages/integrations/src/base/creator.ts index 5748bdd96..9e2466bea 100644 --- a/packages/integrations/src/base/creator.ts +++ b/packages/integrations/src/base/creator.ts @@ -46,6 +46,7 @@ import { SeerrIntegration } from "../seerr/seerr-integration"; import { SpeedtestTrackerIntegration } from "../speedtest-tracker/speedtest-tracker-integration"; import { TracearrIntegration } from "../tracearr/tracearr-integration"; import { TrueNasIntegration } from "../truenas/truenas-integration"; +import { UmamiIntegration } from "../umami/umami-integration"; import { UnifiControllerIntegration } from "../unifi-controller/unifi-controller-integration"; import { UnraidIntegration } from "../unraid/unraid-integration"; import type { Integration, IntegrationInput } from "./integration"; @@ -121,6 +122,7 @@ export const integrationCreators = { searchCh: SearchChIntegration, immich: ImmichIntegration, speedtestTracker: SpeedtestTrackerIntegration, + umami: UmamiIntegration, } satisfies Record Promise]>; type IntegrationInstanceOfKind = { diff --git a/packages/integrations/src/index.ts b/packages/integrations/src/index.ts index 2ac590bdb..c7451265c 100644 --- a/packages/integrations/src/index.ts +++ b/packages/integrations/src/index.ts @@ -33,6 +33,7 @@ export { CoolifyIntegration } from "./coolify/coolify-integration"; export { ImmichIntegration } from "./immich/immich-integration"; export { TracearrIntegration } from "./tracearr/tracearr-integration"; export { SpeedtestTrackerIntegration } from "./speedtest-tracker/speedtest-tracker-integration"; +export { UmamiIntegration } from "./umami/umami-integration"; // Types export type { IntegrationInput } from "./base/integration"; @@ -68,6 +69,7 @@ export type { } from "./anchor/anchor-types"; export type { TracearrDashboardData } from "./tracearr/tracearr-types"; export type { SpeedtestTrackerDashboardData } from "./speedtest-tracker/speedtest-tracker-types"; +export type { UmamiVisitorStats } from "./umami/umami-types"; // Schemas export { anchorNotesListInputSchema } from "./anchor/anchor-types"; diff --git a/packages/integrations/src/types.ts b/packages/integrations/src/types.ts index eb8b9e6ca..10ae96ee4 100644 --- a/packages/integrations/src/types.ts +++ b/packages/integrations/src/types.ts @@ -16,3 +16,4 @@ export * from "./anchor/anchor-types"; export * from "./interfaces/timetable/timetable-types"; export * from "./tracearr/tracearr-types"; export * from "./speedtest-tracker/speedtest-tracker-types"; +export * from "./umami/umami-types"; diff --git a/packages/integrations/src/umami/umami-integration.ts b/packages/integrations/src/umami/umami-integration.ts new file mode 100644 index 000000000..730cd5477 --- /dev/null +++ b/packages/integrations/src/umami/umami-integration.ts @@ -0,0 +1,450 @@ +import dayjs from "dayjs"; + +import { ResponseError } from "@homarr/common/server"; +import { fetchWithTrustedCertificatesAsync } from "@homarr/core/infrastructure/http"; +import { createLogger } from "@homarr/core/infrastructure/logs"; + +import type { IntegrationTestingInput } from "../base/integration"; +import { Integration } from "../base/integration"; +import { TestConnectionError } from "../base/test-connection/test-connection-error"; +import type { TestingResult } from "../base/test-connection/test-connection-service"; +import type { + UmamiEventSeries, + UmamiMetricItem, + UmamiPageviewDataPoint, + UmamiPageviews, + UmamiStats, + UmamiVisitorStats, + UmamiWebsite, +} from "./umami-types"; +import { + umamiActiveVisitorsSchema, + umamiAuthResponseSchema, + umamiMetricItemSchema, + umamiPageviewDataPointSchema, + umamiPageviewsSchema, + umamiStatsSchema, + umamiWebsiteSchema, +} from "./umami-types"; + +// Umami event type ID for custom events (type 1 = page view, type 2 = custom event) +const UMAMI_CUSTOM_EVENT_TYPE = 2; + +const logger = createLogger({ module: "umami-integration" }); + +export class UmamiIntegration extends Integration { + protected async testingAsync(input: IntegrationTestingInput): Promise { + const authHeaders = await this.getAuthHeadersAsync(); + const url = this.url("/websites"); + const response = await input.fetchAsync(url, { + headers: authHeaders, + }); + + if (!response.ok) { + return TestConnectionError.StatusResult(response); + } + + return { success: true }; + } + + public async getWebsitesAsync(): Promise { + const authHeaders = await this.getAuthHeadersAsync(); + const url = this.url("/websites"); + const response = await fetchWithTrustedCertificatesAsync(url, { headers: authHeaders }); + if (!response.ok) throw new ResponseError(response); + const json = await response.json(); + // Response envelope differs by hosting: + // - Umami self-hosted returns the array directly: [website, ...] + // - Umami Cloud wraps it: { data: [website, ...] } + // Same divergence applies to the /events list responses below. + return Array.isArray(json) + ? umamiWebsiteSchema.array().parse(json) + : umamiWebsiteSchema.array().parse((json as { data: unknown }).data); + } + + // Server-side timeFrame resolution is intentional. Keeping `timeFrame` (a + // stable string like "7d") in the cache key means all users viewing the same + // dashboard share one Redis cache entry per (integration, website, timeFrame) + // for the 5-minute TTL. Client-supplied startAt/endAt would include a + // per-second `now` and fragment the cache one-per-user-per-second. + // + // Window bounds mirror Umami UI preset semantics, verified against the + // Umami Cloud dashboard for the same site and timeFrame: each "Last N" + // preset includes the in-progress period as one of N + 1 buckets, snapped + // to bucket boundaries. + // - "24h": current hour + 24 prior hours (25-bucket hour grid) + // - "7d": current day + 7 prior days ( 8-bucket day grid) + // - "30d": current day + 30 prior days (31-bucket day grid) + // - "today" / "month" / "lastMonth": calendar-aligned windows. + // + // Caveat: dayjs() uses the server's local timezone. Callers needing user-local + // boundaries (e.g. "today") may see off-by-one behaviour when the server + // runs in UTC but the user is in a different timezone. + private computeTimeRange(timeFrame: string): { startAt: number; endAt: number; unit: string } { + const startOfToday = dayjs().startOf("day"); + const endOfToday = dayjs().endOf("day"); + + switch (timeFrame) { + case "today": + return { startAt: startOfToday.valueOf(), endAt: endOfToday.valueOf(), unit: "hour" }; + case "7d": + return { + startAt: startOfToday.subtract(7, "day").valueOf(), + endAt: endOfToday.valueOf(), + unit: "day", + }; + case "30d": + return { + startAt: startOfToday.subtract(30, "day").valueOf(), + endAt: endOfToday.valueOf(), + unit: "day", + }; + case "month": + return { + startAt: dayjs().startOf("month").valueOf(), + endAt: dayjs().endOf("month").valueOf(), + unit: "day", + }; + case "lastMonth": { + const lastMonth = dayjs().subtract(1, "month"); + return { + startAt: lastMonth.startOf("month").valueOf(), + endAt: lastMonth.endOf("month").valueOf(), + unit: "day", + }; + } + case "24h": + default: + return { + startAt: dayjs().subtract(24, "hour").startOf("hour").valueOf(), + endAt: dayjs().endOf("hour").valueOf(), + unit: "hour", + }; + } + } + + public async getVisitorStatsAsync( + websiteId: string, + timeFrame = "24h", + eventName?: string, + ): Promise { + const authHeaders = await this.getAuthHeadersAsync(); + const website = await this.getWebsiteByIdAsync(websiteId, authHeaders); + + const { startAt, endAt, unit } = this.computeTimeRange(timeFrame); + + const [stats, pageviews, eventMetrics, eventTimeSeries] = await Promise.all([ + this.getWebsiteStatsAsync(website.id, startAt, endAt, authHeaders), + this.getWebsitePageviewsAsync(website.id, startAt, endAt, authHeaders, unit), + eventName ? this.getWebsiteEventMetricsAsync(website.id, startAt, endAt, authHeaders) : Promise.resolve(null), + eventName + ? this.getWebsiteEventTimeSeriesAsync(website.id, startAt, endAt, unit, eventName, authHeaders) + : Promise.resolve(null), + ]); + + const eventCount = eventName && eventMetrics ? (eventMetrics.find(({ x }) => x === eventName)?.y ?? 0) : undefined; + + const eventByTimestamp = new Map( + (eventTimeSeries ?? []).map(({ x, y }) => [this.parseUmamiDate(x), y]), + ); + const dataPoints = pageviews.sessions.map((point) => ({ + timestamp: point.x, + visitors: point.y, + ...(eventTimeSeries ? { events: eventByTimestamp.get(this.parseUmamiDate(point.x)) ?? 0 } : {}), + })); + + return { + domain: website.domain, + websiteName: website.name, + websiteId: website.id, + totalVisitors: stats.visitors, + totalPageviews: stats.pageviews, + totalVisits: stats.visits, + bounceRate: stats.visits > 0 ? Math.round((stats.bounces / stats.visits) * 100) : 0, + avgDuration: stats.visits > 0 ? Math.round(stats.totaltime / stats.visits) : 0, + dataPoints, + timeFrame, + eventCount, + }; + } + + public async getEventNamesAsync(websiteId: string): Promise { + const authHeaders = await this.getAuthHeadersAsync(); + const now = Date.now(); + const startAt = dayjs().subtract(30, "day").valueOf(); + const url = this.url(`/websites/${websiteId}/events`, { + startAt: startAt.toString(), + endAt: now.toString(), + pageSize: "100000", + }); + const response = await fetchWithTrustedCertificatesAsync(url, { headers: authHeaders }); + if (!response.ok) { + logger.warn("Failed to load event names", { status: response.status, websiteId }); + return []; + } + const json = await response.json(); + const rawArray: unknown[] = Array.isArray(json) + ? json + : json && typeof json === "object" && "data" in json && Array.isArray((json as { data: unknown }).data) + ? (json as { data: unknown[] }).data + : []; + const names = new Set(); + for (const item of rawArray) { + const record = item as Record; + if (typeof record.eventName === "string" && record.eventName) { + names.add(record.eventName); + } + } + return [...names].sort(); + } + + public async getActiveVisitorsAsync(websiteId: string): Promise { + const authHeaders = await this.getAuthHeadersAsync(); + const url = this.url(`/websites/${websiteId}/active`); + const response = await fetchWithTrustedCertificatesAsync(url, { headers: authHeaders }); + if (!response.ok) { + logger.warn("Failed to load active visitors", { status: response.status, websiteId }); + return 0; + } + return umamiActiveVisitorsSchema.parse(await response.json()).visitors; + } + + /** + * Umami self-hosted returns "YYYY-MM-DD HH:MM:SS"; Umami Cloud returns ISO 8601. + * Normalise both to epoch ms so timestamps from /pageviews and /events join. + */ + private parseUmamiDate(dateString: string): number { + return new Date(dateString.includes("T") ? dateString : `${dateString.replace(" ", "T")}Z`).getTime(); + } + + private async getWebsiteByIdAsync(websiteId: string, authHeaders: Record): Promise { + const url = this.url(`/websites/${websiteId}`); + const response = await fetchWithTrustedCertificatesAsync(url, { headers: authHeaders }); + if (!response.ok) throw new ResponseError(response); + return umamiWebsiteSchema.parse(await response.json()); + } + + public async getTopPagesAsync(websiteId: string, timeFrame: string, limit: number): Promise { + const authHeaders = await this.getAuthHeadersAsync(); + const { startAt, endAt } = this.computeTimeRange(timeFrame); + return this.getWebsiteMetricsAsync(websiteId, startAt, endAt, "path", authHeaders, limit); + } + + public async getTopReferrersAsync(websiteId: string, timeFrame: string, limit: number): Promise { + const authHeaders = await this.getAuthHeadersAsync(); + const { startAt, endAt } = this.computeTimeRange(timeFrame); + return this.getWebsiteMetricsAsync(websiteId, startAt, endAt, "referrer", authHeaders, limit); + } + + public async getMultiEventTimeSeriesAsync( + websiteId: string, + timeFrame: string, + eventNames: string[], + ): Promise { + const authHeaders = await this.getAuthHeadersAsync(); + const { startAt, endAt, unit } = this.computeTimeRange(timeFrame); + const results = await Promise.all( + eventNames.map(async (eventName) => { + const dataPoints = await this.getWebsiteEventTimeSeriesAsync( + websiteId, + startAt, + endAt, + unit, + eventName, + authHeaders, + ); + return { eventName, dataPoints: dataPoints ?? [] }; + }), + ); + return results; + } + + private async getWebsiteEventMetricsAsync( + websiteId: string, + startAt: number, + endAt: number, + authHeaders: Record, + ): Promise { + return await this.getWebsiteMetricsAsync(websiteId, startAt, endAt, "event", authHeaders); + } + + private async getWebsiteMetricsAsync( + websiteId: string, + startAt: number, + endAt: number, + type: "event" | "path" | "referrer", + authHeaders: Record, + limit?: number, + ): Promise { + const params: Record = { + startAt: startAt.toString(), + endAt: endAt.toString(), + type, + }; + if (limit !== undefined) params.limit = limit.toString(); + const url = this.url(`/websites/${websiteId}/metrics`, params); + const response = await fetchWithTrustedCertificatesAsync(url, { + headers: authHeaders, + }); + + if (!response.ok) { + logger.warn("Failed to load website metrics", { status: response.status, websiteId, type }); + return []; + } + + const json = await response.json(); + if (Array.isArray(json)) return umamiMetricItemSchema.array().parse(json); + logger.warn("Unexpected metrics response shape", { websiteId, type }); + return []; + } + + private async getWebsiteEventTimeSeriesAsync( + websiteId: string, + startAt: number, + endAt: number, + unit: string, + eventName: string, + authHeaders: Record, + ): Promise { + const url = this.url(`/websites/${websiteId}/events`, { + startAt: startAt.toString(), + endAt: endAt.toString(), + unit, + timezone: "UTC", + eventName, + pageSize: "100000", + }); + const response = await fetchWithTrustedCertificatesAsync(url, { + headers: authHeaders, + }); + + if (!response.ok) { + logger.warn("Failed to load event time series", { status: response.status, websiteId, eventName }); + return undefined; + } + + const json = await response.json(); + const rawArray: unknown[] = Array.isArray(json) + ? json + : json && typeof json === "object" && "data" in json && Array.isArray((json as { data: unknown }).data) + ? (json as { data: unknown[] }).data + : []; + + if (rawArray.length === 0) return undefined; + + const firstItem = rawArray[0] as Record; + + // Two response shapes coexist: + // - Umami self-hosted returns aggregated buckets: { x: timestamp, y: count } + // - Umami Cloud returns raw event records: { createdAt, eventName, eventType } + // We aggregate the raw Cloud records ourselves into the same bucket grid so + // the result joins cleanly with /pageviews timestamps. + + // Aggregated { x, y } format — parse directly (self-hosted instances) + if ("x" in firstItem && "y" in firstItem) { + const points = umamiPageviewDataPointSchema.array().parse(rawArray); + return points.length === 0 ? undefined : points; + } + + // Raw event records — aggregate by time bucket (Umami Cloud) + if ("createdAt" in firstItem) { + const pad = (number: number) => String(number).padStart(2, "0"); + // Format must match Umami's pageview x-axis timestamps: "YYYY-MM-DD HH:MM:SS" + const truncate = (isoDate: string): string => { + const date = new Date(isoDate); + const dateString = `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`; + if (unit === "hour") { + return `${dateString} ${pad(date.getUTCHours())}:00:00`; + } + if (unit === "month") { + return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-01 00:00:00`; + } + return `${dateString} 00:00:00`; + }; + + const buckets = new Map(); + for (const item of rawArray) { + const event = item as { eventType?: number; eventName?: string; createdAt: string }; + if (event.eventType !== UMAMI_CUSTOM_EVENT_TYPE || event.eventName !== eventName) continue; + const bucket = truncate(event.createdAt); + buckets.set(bucket, (buckets.get(bucket) ?? 0) + 1); + } + if (buckets.size === 0) return undefined; + return ( + Array.from(buckets.entries()) + .sort(([itemA], [itemB]) => itemA.localeCompare(itemB)) + // eslint-disable-next-line id-length + .map(([x, y]) => ({ x, y })) + ); + } + + return undefined; + } + + private async getWebsiteStatsAsync( + websiteId: string, + startAt: number, + endAt: number, + authHeaders: Record, + ): Promise { + const url = this.url(`/websites/${websiteId}/stats`, { + startAt: startAt.toString(), + endAt: endAt.toString(), + }); + const response = await fetchWithTrustedCertificatesAsync(url, { + headers: authHeaders, + }); + + if (!response.ok) { + throw new ResponseError(response); + } + + return umamiStatsSchema.parse(await response.json()); + } + + private async getWebsitePageviewsAsync( + websiteId: string, + startAt: number, + endAt: number, + authHeaders: Record, + unit = "hour", + ): Promise { + const url = this.url(`/websites/${websiteId}/pageviews`, { + startAt: startAt.toString(), + endAt: endAt.toString(), + unit, + timezone: "UTC", + }); + const response = await fetchWithTrustedCertificatesAsync(url, { + headers: authHeaders, + }); + + if (!response.ok) { + throw new ResponseError(response); + } + + return umamiPageviewsSchema.parse(await response.json()); + } + + private async getAuthHeadersAsync(): Promise> { + if (this.hasSecretValue("apiKey")) { + return { "x-umami-api-key": this.getSecretValue("apiKey") }; + } + const token = await this.getJwtTokenAsync(); + return { Authorization: `Bearer ${token}` }; + } + + private async getJwtTokenAsync(): Promise { + const url = this.url("/auth/login"); + const response = await fetchWithTrustedCertificatesAsync(url, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + username: this.getSecretValue("username"), + password: this.getSecretValue("password"), + }), + }); + if (!response.ok) throw new ResponseError(response); + return umamiAuthResponseSchema.parse(await response.json()).token; + } +} diff --git a/packages/integrations/src/umami/umami-types.ts b/packages/integrations/src/umami/umami-types.ts new file mode 100644 index 000000000..4e38b2a2c --- /dev/null +++ b/packages/integrations/src/umami/umami-types.ts @@ -0,0 +1,84 @@ +import { z } from "zod/v4"; + +export const umamiWebsiteSchema = z.object({ + id: z.string(), + name: z.string(), + domain: z.string(), +}); + +export type UmamiWebsite = z.infer; + +export const umamiAuthResponseSchema = z.object({ + token: z.string(), +}); + +export type UmamiAuthResponse = z.infer; + +export const umamiStatsSchema = z.object({ + pageviews: z.number(), + visitors: z.number(), + visits: z.number(), + bounces: z.number(), + totaltime: z.number(), +}); + +export type UmamiStats = z.infer; + +export const umamiPageviewDataPointSchema = z.object({ + x: z.string(), + y: z.number(), +}); + +export type UmamiPageviewDataPoint = z.infer; + +export const umamiPageviewsSchema = z.object({ + pageviews: z.array(umamiPageviewDataPointSchema), + sessions: z.array(umamiPageviewDataPointSchema), +}); + +export type UmamiPageviews = z.infer; + +export const umamiMetricItemSchema = z.object({ + // x can be null for direct traffic (no referrer) in the referrers endpoint + x: z + .string() + .nullable() + .transform((value) => value ?? ""), + y: z.number(), +}); + +export type UmamiMetricItem = z.infer; + +export const umamiEventRecordSchema = z.object({ + id: z.string(), + eventName: z.string(), + createdAt: z.string(), +}); + +export type UmamiEventRecord = z.infer; + +export const umamiActiveVisitorsSchema = z.object({ + visitors: z.number(), +}); + +export type UmamiActiveVisitors = z.infer; + +// Internal aggregated type returned by the integration — not a direct API response +export interface UmamiEventSeries { + eventName: string; + dataPoints: UmamiPageviewDataPoint[]; +} + +export interface UmamiVisitorStats { + domain: string; + websiteId: string; + websiteName: string; + totalVisitors: number; + totalPageviews: number; + totalVisits: number; + bounceRate: number; + avgDuration: number; + dataPoints: { timestamp: string; visitors: number; events?: number }[]; + timeFrame: string; + eventCount?: number; +} diff --git a/packages/request-handler/src/umami.ts b/packages/request-handler/src/umami.ts new file mode 100644 index 000000000..e943c568a --- /dev/null +++ b/packages/request-handler/src/umami.ts @@ -0,0 +1,84 @@ +import dayjs from "dayjs"; + +import { createIntegrationAsync } from "@homarr/integrations"; +import type { UmamiEventSeries, UmamiMetricItem, UmamiVisitorStats } from "@homarr/integrations/types"; + +import { createCachedIntegrationRequestHandler } from "./lib/cached-integration-request-handler"; + +export const umamiRequestHandler = createCachedIntegrationRequestHandler< + UmamiVisitorStats, + "umami", + { websiteId: string; timeFrame: string; eventName?: string } +>({ + async requestAsync(integration, input) { + const integrationInstance = await createIntegrationAsync(integration); + return await integrationInstance.getVisitorStatsAsync(input.websiteId, input.timeFrame, input.eventName); + }, + cacheDuration: dayjs.duration(5, "minutes"), + queryKey: "umamiVisitorStats", +}); + +export const umamiEventNamesRequestHandler = createCachedIntegrationRequestHandler< + string[], + "umami", + { websiteId: string } +>({ + async requestAsync(integration, input) { + const integrationInstance = await createIntegrationAsync(integration); + return await integrationInstance.getEventNamesAsync(input.websiteId); + }, + cacheDuration: dayjs.duration(5, "minutes"), + queryKey: "umamiEventNames", +}); + +export const umamiTopPagesRequestHandler = createCachedIntegrationRequestHandler< + UmamiMetricItem[], + "umami", + { websiteId: string; timeFrame: string; limit: number } +>({ + async requestAsync(integration, input) { + const integrationInstance = await createIntegrationAsync(integration); + return await integrationInstance.getTopPagesAsync(input.websiteId, input.timeFrame, input.limit); + }, + cacheDuration: dayjs.duration(5, "minutes"), + queryKey: "umamiTopPages", +}); + +export const umamiTopReferrersRequestHandler = createCachedIntegrationRequestHandler< + UmamiMetricItem[], + "umami", + { websiteId: string; timeFrame: string; limit: number } +>({ + async requestAsync(integration, input) { + const integrationInstance = await createIntegrationAsync(integration); + return await integrationInstance.getTopReferrersAsync(input.websiteId, input.timeFrame, input.limit); + }, + cacheDuration: dayjs.duration(5, "minutes"), + queryKey: "umamiTopReferrers", +}); + +export const umamiMultiEventRequestHandler = createCachedIntegrationRequestHandler< + UmamiEventSeries[], + "umami", + { websiteId: string; timeFrame: string; eventNames: string[] } +>({ + async requestAsync(integration, input) { + const integrationInstance = await createIntegrationAsync(integration); + return await integrationInstance.getMultiEventTimeSeriesAsync(input.websiteId, input.timeFrame, input.eventNames); + }, + cacheDuration: dayjs.duration(5, "minutes"), + queryKey: "umamiMultiEvent", +}); + +export const umamiActiveVisitorsRequestHandler = createCachedIntegrationRequestHandler< + number, + "umami", + { websiteId: string } +>({ + async requestAsync(integration, input) { + const integrationInstance = await createIntegrationAsync(integration); + return await integrationInstance.getActiveVisitorsAsync(input.websiteId); + }, + cacheDuration: dayjs.duration(30, "seconds"), + queryKey: "umamiActiveVisitors", +}); diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 817abb3f8..cdde0511b 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -2096,6 +2096,104 @@ "internalServerError": "Failed to fetch Tracearr data" } }, + "umami": { + "name": "Umami Analytics", + "description": "Display visitor stats from your Umami analytics instance", + "visitors": "visitors", + "active": "active", + "pageviews": "pageviews", + "visits": "visits", + "bounceRate": "bounce", + "avgDuration": "avg", + "option": { + "websiteId": { + "label": "Website", + "description": "Select a website tracked by your Umami instance", + "placeholder": "Select a website", + "loading": "Loading websites...", + "noWebsites": "No websites found", + "configureIntegrationFirst": "Connect a Umami integration first" + }, + "timeFrame": { + "label": "Time frame", + "description": "The time period to display visitor data for", + "option": { + "today": "Today", + "24h": "Last 24 hours", + "7d": "Last 7 days", + "30d": "Last 30 days", + "month": "This month", + "lastMonth": "Last month" + } + }, + "eventName": { + "label": "Event", + "description": "Show total occurrences of a specific event", + "placeholder": "Select an event", + "loading": "Loading events...", + "noEvents": "No events found", + "none": "No event", + "configureWebsiteFirst": "Select a website first to load events" + }, + "chartType": { + "label": "Chart type", + "description": "Display style for the chart", + "option": { + "bar": "Bar chart", + "sparkline": "Sparkline" + } + }, + "chartStyle": { + "label": "Chart style", + "description": "How to display the event series in the chart", + "option": { + "grouped": "Side by side", + "overlay": "Overlay (subset)" + } + }, + "viewMode": { + "label": "View", + "description": "What to display in the widget body", + "option": { + "chart": "Chart", + "events": "Events chart", + "topPages": "Top pages", + "topReferrers": "Top referrers" + } + }, + "eventNames": { + "label": "Events", + "description": "Select one or more events to chart", + "placeholder": "Select events...", + "loading": "Loading events...", + "noEvents": "No events found", + "configureWebsiteFirst": "Select a website first to load events" + }, + "topCount": { + "label": "Items to show", + "description": "Number of top items to display (max 500)" + } + }, + "event": { + "occurrences": "events", + "label": "events" + }, + "topPages": { + "direct": "Direct" + }, + "topReferrers": { + "direct": "Direct" + }, + "events": { + "selectPrompt": "Select events to chart" + }, + "error": { + "noIntegration": "No Umami integration configured", + "noWebsite": "No website configured", + "noData": "No data available", + "internalServerError": "Failed to fetch Umami data" + } + }, "common": { "location": { "query": "City / Postal code", @@ -3668,6 +3766,9 @@ }, "tracearr": { "label": "Tracearr" + }, + "umamiActiveVisitors": { + "label": "Umami Active Visitors" } }, "interval": { diff --git a/packages/widgets/src/_inputs/index.ts b/packages/widgets/src/_inputs/index.ts index 8917664de..0c412b74e 100644 --- a/packages/widgets/src/_inputs/index.ts +++ b/packages/widgets/src/_inputs/index.ts @@ -12,6 +12,9 @@ import { WidgetSliderInput } from "./widget-slider-input"; import { WidgetSortedItemListInput } from "./widget-sortable-item-list-input"; import { WidgetSwitchInput } from "./widget-switch-input"; import { WidgetTextInput } from "./widget-text-input"; +import { WidgetUmamiEventInput } from "./widget-umami-event-input"; +import { WidgetUmamiEventNamesInput } from "./widget-umami-event-names-input"; +import { WidgetUmamiWebsiteInput } from "./widget-umami-website-input"; const mapping = { anchorNote: WidgetAnchorNoteInput, @@ -27,6 +30,9 @@ const mapping = { sortableItemList: WidgetSortedItemListInput, multiReleasesRepositories: WidgetMultiReleasesRepositoriesInput, dynamicSelect: WidgetDynamicSelectInput, + umamiEventName: WidgetUmamiEventInput, + umamiEventNames: WidgetUmamiEventNamesInput, + umamiWebsite: WidgetUmamiWebsiteInput, } satisfies Record; export const getInputForType = (type: TType) => { diff --git a/packages/widgets/src/_inputs/widget-umami-event-input.tsx b/packages/widgets/src/_inputs/widget-umami-event-input.tsx new file mode 100644 index 000000000..947822cef --- /dev/null +++ b/packages/widgets/src/_inputs/widget-umami-event-input.tsx @@ -0,0 +1,46 @@ +"use client"; + +import { Select, Text } from "@mantine/core"; + +import { clientApi } from "@homarr/api/client"; +import { useScopedI18n } from "@homarr/translation/client"; + +import type { CommonWidgetInputProps } from "./common"; +import { useWidgetInputTranslation } from "./common"; +import { useFormContext } from "./form"; + +export const WidgetUmamiEventInput = ({ property, kind }: CommonWidgetInputProps<"umamiEventName">) => { + const t = useScopedI18n("widget.umami.option.eventName"); + const tInput = useWidgetInputTranslation(kind, property); + const form = useFormContext(); + + const integrationIds = form.values.integrationIds; + const websiteId = form.values.options.websiteId as string | undefined; + + const { data: eventNames, isPending } = clientApi.widget.umami.getEventNames.useQuery( + { integrationId: integrationIds[0] ?? "", websiteId: websiteId ?? "" }, + { enabled: Boolean(integrationIds[0]) && Boolean(websiteId) }, + ); + + if (!websiteId || integrationIds.length === 0) { + return ( + + {t("configureWebsiteFirst")} + + ); + } + + const data = [{ value: "", label: t("none") }, ...(eventNames ?? [])]; + + return ( + ({ value: site.id, label: site.domain }))} + {...form.getInputProps(`options.${property}`)} + /> + ); +}; diff --git a/packages/widgets/src/index.tsx b/packages/widgets/src/index.tsx index a59f93f42..572f70aa4 100644 --- a/packages/widgets/src/index.tsx +++ b/packages/widgets/src/index.tsx @@ -46,6 +46,7 @@ import * as systemDisks from "./system-disks"; import * as systemResources from "./system-resources"; import * as timetable from "./timetable"; import * as tracearr from "./tracearr"; +import * as umami from "./umami"; import * as video from "./video"; import * as weather from "./weather"; @@ -91,6 +92,7 @@ export const widgetImports = { "immich-albumCarousel": immichAlbumCarousel, tracearr, speedtestTracker, + umami, } satisfies WidgetImportRecord; export type WidgetImports = typeof widgetImports; diff --git a/packages/widgets/src/options.ts b/packages/widgets/src/options.ts index bc207db83..75b758b3d 100644 --- a/packages/widgets/src/options.ts +++ b/packages/widgets/src/options.ts @@ -160,6 +160,21 @@ const optionsFactory = { defaultValue: "", withDescription: false, }), + umamiEventName: () => ({ + type: "umamiEventName" as const, + defaultValue: "", + withDescription: true, + }), + umamiEventNames: () => ({ + type: "umamiEventNames" as const, + defaultValue: [] as string[], + withDescription: true, + }), + umamiWebsite: () => ({ + type: "umamiWebsite" as const, + defaultValue: "", + withDescription: true, + }), sortableItemList: ( input: SortableItemListInput, ) => ({ diff --git a/packages/widgets/src/umami/component.tsx b/packages/widgets/src/umami/component.tsx new file mode 100644 index 000000000..2aec3b46e --- /dev/null +++ b/packages/widgets/src/umami/component.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { Stack, Text } from "@mantine/core"; + +import { useScopedI18n } from "@homarr/translation/client"; + +import type { WidgetComponentProps } from "../definition"; +import { UmamiContent } from "./umami-content"; + +export default function UmamiWidget({ options, integrationIds }: WidgetComponentProps<"umami">) { + if (!options.websiteId || options.websiteId.trim() === "") { + return ; + } + + return ( + + ); +} + +function NoWebsiteConfigured() { + const t = useScopedI18n("widget.umami"); + return ( + + + {t("error.noWebsite")} + + + ); +} diff --git a/packages/widgets/src/umami/index.ts b/packages/widgets/src/umami/index.ts new file mode 100644 index 000000000..c55ecd261 --- /dev/null +++ b/packages/widgets/src/umami/index.ts @@ -0,0 +1,88 @@ +import { IconChartBar, IconServerOff } from "@tabler/icons-react"; +import { z } from "zod/v4"; + +import { createWidgetDefinition } from "../definition"; +import { optionsBuilder } from "../options"; + +export const timeFrameValues = ["today", "24h", "7d", "30d", "month", "lastMonth"] as const; + +export const { definition, componentLoader } = createWidgetDefinition("umami", { + icon: IconChartBar, + supportedIntegrations: ["umami"], + createOptions() { + return optionsBuilder.from( + (factory) => ({ + websiteId: factory.umamiWebsite(), + timeFrame: factory.select({ + options: timeFrameValues.map((value) => ({ + value, + label: (t) => t(`widget.umami.option.timeFrame.option.${value}`), + })), + defaultValue: "24h", + withDescription: true, + }), + viewMode: factory.select({ + options: [ + { value: "chart", label: (t) => t("widget.umami.option.viewMode.option.chart") }, + { value: "events", label: (t) => t("widget.umami.option.viewMode.option.events") }, + { value: "topPages", label: (t) => t("widget.umami.option.viewMode.option.topPages") }, + { value: "topReferrers", label: (t) => t("widget.umami.option.viewMode.option.topReferrers") }, + ] as const, + defaultValue: "chart", + withDescription: true, + }), + chartType: factory.select({ + options: [ + { value: "bar", label: (t) => t("widget.umami.option.chartType.option.bar") }, + { value: "sparkline", label: (t) => t("widget.umami.option.chartType.option.sparkline") }, + ] as const, + defaultValue: "bar", + withDescription: true, + }), + chartStyle: factory.select({ + options: [ + { value: "grouped", label: (t) => t("widget.umami.option.chartStyle.option.grouped") }, + { value: "overlay", label: (t) => t("widget.umami.option.chartStyle.option.overlay") }, + ] as const, + defaultValue: "grouped", + withDescription: true, + }), + eventName: factory.umamiEventName(), + eventNames: factory.umamiEventNames(), + topCount: factory.number({ + validate: z.number().int().min(1).max(500), + defaultValue: 5, + step: 1, + withDescription: true, + }), + }), + { + viewMode: { + shouldHide: (options) => !options.websiteId, + }, + chartType: { + shouldHide: (options) => + !options.websiteId || (options.viewMode !== "chart" && options.viewMode !== "events"), + }, + chartStyle: { + shouldHide: (options) => options.viewMode !== "chart" || !options.eventName || options.chartType !== "bar", + }, + eventName: { + shouldHide: (options) => !options.websiteId || options.viewMode !== "chart", + }, + eventNames: { + shouldHide: (options) => !options.websiteId || options.viewMode !== "events", + }, + topCount: { + shouldHide: (options) => !options.websiteId || options.viewMode === "chart" || options.viewMode === "events", + }, + }, + ); + }, + errors: { + INTERNAL_SERVER_ERROR: { + icon: IconServerOff, + message: (t) => t("widget.umami.error.internalServerError"), + }, + }, +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/umami/umami-content.tsx b/packages/widgets/src/umami/umami-content.tsx new file mode 100644 index 000000000..da9494519 --- /dev/null +++ b/packages/widgets/src/umami/umami-content.tsx @@ -0,0 +1,220 @@ +"use client"; + +import { BarChart, LineChart } from "@mantine/charts"; +import { Box, Group, Stack, Text, useMantineColorScheme } from "@mantine/core"; + +import { clientApi } from "@homarr/api/client"; +import { formatDuration } from "@homarr/common"; +import type { UmamiVisitorStats } from "@homarr/integrations/types"; +import { useScopedI18n } from "@homarr/translation/client"; + +import { UmamiEventsContent } from "./umami-events-content"; +import { UmamiTopPagesContent, UmamiTopReferrersContent } from "./umami-top-list"; +import { formatTimeFrameLabel, formatXLabel } from "./umami-utils"; +import type { TimeFrame } from "./umami-utils"; + +interface UmamiContentProps { + integrationIds: string[]; + websiteId: string; + timeFrame: TimeFrame; + eventName?: string; + eventNames: string[]; + chartStyle: string; + chartType: string; + viewMode: string; + topCount: number; +} + +export function UmamiContent({ + integrationIds, + websiteId, + timeFrame, + eventName, + eventNames, + chartStyle, + chartType, + viewMode, + topCount, +}: UmamiContentProps) { + const t = useScopedI18n("widget.umami"); + const { colorScheme } = useMantineColorScheme(); + const tickColor = colorScheme === "dark" ? "#c1c2c5" : "#495057"; + + const [results] = clientApi.widget.umami.getVisitorStats.useSuspenseQuery({ + integrationIds, + websiteId, + timeFrame, + eventName, + }); + + const activeVisitorsInput = { integrationId: integrationIds[0] ?? "", websiteId }; + const [activeVisitors] = clientApi.widget.umami.getActiveVisitors.useSuspenseQuery(activeVisitorsInput); + const utils = clientApi.useUtils(); + clientApi.widget.umami.subscribeActiveVisitors.useSubscription(activeVisitorsInput, { + onData(count) { + utils.widget.umami.getActiveVisitors.setData(activeVisitorsInput, () => count); + }, + }); + + const { data: multiEventSeries } = clientApi.widget.umami.getMultiEventTimeSeries.useQuery( + { integrationId: integrationIds[0] ?? "", websiteId, timeFrame, eventNames: [...eventNames].sort() }, + { enabled: viewMode === "events" && eventNames.length > 0 }, + ); + + const multiEventTotal = multiEventSeries + ? multiEventSeries.flatMap(({ dataPoints }) => dataPoints).reduce((sum, { y }) => sum + y, 0) + : undefined; + + const firstResult = results[0]; + if (!firstResult) { + return ( + + + {t("error.noData")} + + + ); + } + + const { visitorStats } = firstResult; + + const chartData = visitorStats.dataPoints.map((point: UmamiVisitorStats["dataPoints"][number]) => ({ + label: formatXLabel(point.timestamp, timeFrame), + visitors: point.visitors, + ...(point.events !== undefined ? { events: point.events } : {}), + })); + + const hasEventSeries = visitorStats.dataPoints.some(({ events }) => events !== undefined); + const series = [ + { name: "visitors", color: "blue.5" }, + ...(hasEventSeries ? [{ name: "events", color: "orange.5" }] : []), + ]; + + const isOverlay = chartStyle === "overlay" && hasEventSeries; + const overlayBarSize = 16; + + return ( + + + + {visitorStats.domain} ({formatTimeFrameLabel(timeFrame, t)}) + + {(eventName && viewMode === "chart" && visitorStats.eventCount !== undefined) || + (viewMode === "events" && multiEventTotal !== undefined) ? ( + + + + {viewMode === "events" + ? (multiEventTotal ?? 0).toLocaleString() + : (visitorStats.eventCount ?? 0).toLocaleString()} + + + {t("event.label")} + + + + / + + + + {visitorStats.totalVisitors.toLocaleString()} + + + {t("visitors")} + + + + ) : ( + + + {visitorStats.totalVisitors.toLocaleString()} + + + {t("visitors")} + + + )} + + + + ● {activeVisitors.toLocaleString()} {t("active")} + + + {visitorStats.totalPageviews.toLocaleString()} {t("pageviews")} + + + {visitorStats.totalVisits.toLocaleString()} {t("visits")} + + + {visitorStats.bounceRate}% {t("bounceRate")} + + + {formatDuration(visitorStats.avgDuration * 1000)} {t("avgDuration")} + + + + {viewMode === "events" ? ( + + ) : viewMode === "topPages" ? ( + + ) : viewMode === "topReferrers" ? ( + + ) : chartType === "sparkline" ? ( + + ) : ( + + )} + + + ); +} diff --git a/packages/widgets/src/umami/umami-events-content.tsx b/packages/widgets/src/umami/umami-events-content.tsx new file mode 100644 index 000000000..0962d3681 --- /dev/null +++ b/packages/widgets/src/umami/umami-events-content.tsx @@ -0,0 +1,138 @@ +"use client"; + +import { BarChart, LineChart } from "@mantine/charts"; +import { Box, Group, Stack, Text, useMantineColorScheme } from "@mantine/core"; + +import { clientApi } from "@homarr/api/client"; +import type { UmamiEventSeries } from "@homarr/integrations/types"; +import { useScopedI18n } from "@homarr/translation/client"; + +import { EVENT_COLORS, formatXLabel } from "./umami-utils"; + +interface UmamiEventsContentProps { + integrationIds: string[]; + websiteId: string; + timeFrame: string; + eventNames: string[]; + chartType: string; +} + +export function UmamiEventsContent({ + integrationIds, + websiteId, + timeFrame, + eventNames, + chartType, +}: UmamiEventsContentProps) { + const t = useScopedI18n("widget.umami"); + const { colorScheme } = useMantineColorScheme(); + const tickColor = colorScheme === "dark" ? "#c1c2c5" : "#495057"; + + const [series] = clientApi.widget.umami.getMultiEventTimeSeries.useSuspenseQuery({ + integrationId: integrationIds[0] ?? "", + websiteId, + timeFrame, + eventNames: [...eventNames].sort(), + }); + + if (eventNames.length === 0) { + return ( + + + {t("events.selectPrompt")} + + + ); + } + + // Collect all unique timestamps across all series + const allTimestamps = Array.from( + new Set(series.flatMap(({ dataPoints }) => dataPoints.map(({ x: xPoint }) => xPoint))), + ).sort(); + + // Build per-event lookup by timestamp string + const byEvent = new Map( + series.map((serie: UmamiEventSeries) => [ + serie.eventName, + new Map(serie.dataPoints.map((point) => [point.x, point.y])), + ]), + ); + + const chartData = allTimestamps.map((timestamp) => { + const row: Record = { label: formatXLabel(timestamp, timeFrame) }; + for (const serie of series) { + row[serie.eventName] = byEvent.get(serie.eventName)?.get(timestamp) ?? 0; + } + return row; + }); + + const chartSeries = series.map((serie: UmamiEventSeries, index: number) => ({ + name: serie.eventName, + color: EVENT_COLORS[index % EVENT_COLORS.length] ?? "blue.5", + })); + + return ( + + {chartSeries.length > 1 && ( + + {chartSeries.map((serie) => ( + + + + {serie.name} + + + ))} + + )} + + {chartType === "sparkline" ? ( + + ) : ( + + )} + + + ); +} diff --git a/packages/widgets/src/umami/umami-top-list.tsx b/packages/widgets/src/umami/umami-top-list.tsx new file mode 100644 index 000000000..1d9a87988 --- /dev/null +++ b/packages/widgets/src/umami/umami-top-list.tsx @@ -0,0 +1,77 @@ +"use client"; + +import { Group, ScrollArea, Stack, Text } from "@mantine/core"; + +import { clientApi } from "@homarr/api/client"; +import type { UmamiMetricItem } from "@homarr/integrations/types"; +import { useScopedI18n } from "@homarr/translation/client"; + +interface UmamiTopListProps { + integrationIds: string[]; + websiteId: string; + timeFrame: string; + limit: number; +} + +export function UmamiTopPagesContent({ integrationIds, websiteId, timeFrame, limit }: UmamiTopListProps) { + const t = useScopedI18n("widget.umami"); + const [data] = clientApi.widget.umami.getTopPages.useSuspenseQuery({ + integrationId: integrationIds[0] ?? "", + websiteId, + timeFrame, + limit, + }); + return ; +} + +export function UmamiTopReferrersContent({ integrationIds, websiteId, timeFrame, limit }: UmamiTopListProps) { + const t = useScopedI18n("widget.umami"); + const [data] = clientApi.widget.umami.getTopReferrers.useSuspenseQuery({ + integrationId: integrationIds[0] ?? "", + websiteId, + timeFrame, + limit, + }); + return ( + + ); +} + +function UmamiTopList({ + items, + heading, + emptyLabel, +}: { + items: UmamiMetricItem[]; + heading: string; + emptyLabel: string; +}) { + return ( + + + {heading} + + + + {items.map((item, i) => ( + + + {i + 1}. + + + {item.x || emptyLabel} + + + {item.y.toLocaleString()} + + + ))} + + + + ); +} diff --git a/packages/widgets/src/umami/umami-utils.ts b/packages/widgets/src/umami/umami-utils.ts new file mode 100644 index 000000000..c88f28378 --- /dev/null +++ b/packages/widgets/src/umami/umami-utils.ts @@ -0,0 +1,33 @@ +import type { useScopedI18n } from "@homarr/translation/client"; + +import { timeFrameValues } from "./index"; + +export const EVENT_COLORS = ["blue.5", "orange.5", "green.5", "red.5", "violet.5", "teal.5", "yellow.5", "pink.5"]; + +export function formatXLabel(timestamp: string, timeFrame: string): string { + const date = new Date(timestamp); + switch (timeFrame) { + case "today": + case "24h": + return `${date.getHours().toString().padStart(2, "0")}:00`; + case "7d": + case "30d": + case "month": + case "lastMonth": + return date.toLocaleDateString(undefined, { month: "short", day: "numeric" }); + default: + return timestamp; + } +} + +export type TimeFrame = (typeof timeFrameValues)[number]; + +export function formatTimeFrameLabel( + timeFrame: TimeFrame, + t: ReturnType>, +): string { + if (timeFrameValues.includes(timeFrame)) { + return t(`option.timeFrame.option.${timeFrame}`); + } + return timeFrame; +} From 37edfb2de26372750e493a8fa35160998fe159ca Mon Sep 17 00:00:00 2001 From: "homarr-update-contributors[bot]" <210161987+homarr-update-contributors[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 16:11:16 +0000 Subject: [PATCH 049/116] chore: update integrations list readme (#5662) Co-authored-by: Homarr Update Contributors <210161987+homarr-update-contributors[bot]@users.noreply.github.com> --- docs/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/README.md b/docs/README.md index 999df9791..e7aeef585 100644 --- a/docs/README.md +++ b/docs/README.md @@ -372,6 +372,13 @@ + + Umami +
+

Umami

+
+ + Unifi Controller
From 831b6221fdf21fe4913b0f165ef551afeada4f33 Mon Sep 17 00:00:00 2001 From: Kyle Date: Thu, 7 May 2026 10:28:37 -0600 Subject: [PATCH 050/116] feat: add auto/system appearance mode + fix dark mode system resources charts (#5492) Co-authored-by: Thomas --- .../[locale]/_client-providers/mantine.tsx | 6 +- apps/nextjs/src/app/[locale]/layout.tsx | 3 +- .../_components/appearance-settings-form.tsx | 3 +- .../color-scheme/color-scheme-combobox.tsx | 94 +++++++++++++++++++ .../current-color-scheme-combobox.tsx | 40 +------- .../src/components/user-avatar-menu.tsx | 24 ++--- apps/nextjs/src/styles/color-scheme.scss | 12 +++ packages/auth/callbacks.ts | 2 +- packages/definitions/src/user.ts | 2 +- packages/old-import/src/mappers/map-user.ts | 2 +- packages/server-settings/src/index.ts | 2 +- .../src/modes/command/global-group.tsx | 11 ++- packages/translation/src/lang/en.json | 3 + .../system-resources/chart/common-chart.tsx | 7 +- 14 files changed, 140 insertions(+), 71 deletions(-) create mode 100644 apps/nextjs/src/components/color-scheme/color-scheme-combobox.tsx create mode 100644 apps/nextjs/src/styles/color-scheme.scss diff --git a/apps/nextjs/src/app/[locale]/_client-providers/mantine.tsx b/apps/nextjs/src/app/[locale]/_client-providers/mantine.tsx index e24c08b98..d81b828f3 100644 --- a/apps/nextjs/src/app/[locale]/_client-providers/mantine.tsx +++ b/apps/nextjs/src/app/[locale]/_client-providers/mantine.tsx @@ -8,13 +8,12 @@ import dayjs from "dayjs"; import { clientApi } from "@homarr/api/client"; import { useSession } from "@homarr/auth/client"; import { parseCookies, setClientCookie } from "@homarr/common"; -import type { ColorScheme } from "@homarr/definitions"; import { colorSchemeCookieKey } from "@homarr/definitions"; export const CustomMantineProvider = ({ children, defaultColorScheme, -}: PropsWithChildren<{ defaultColorScheme: ColorScheme }>) => { +}: PropsWithChildren<{ defaultColorScheme: MantineColorScheme }>) => { const manager = useColorSchemeManager(); return ( @@ -35,7 +34,7 @@ export const CustomMantineProvider = ({ export function useColorSchemeManager(): MantineColorSchemeManager { const { data: session } = useSession(); - const updateCookieValue = (value: Exclude) => { + const updateCookieValue = (value: MantineColorScheme) => { setClientCookie(colorSchemeCookieKey, value, { expires: dayjs().add(1, "year").toDate(), path: "/" }); }; @@ -60,7 +59,6 @@ export function useColorSchemeManager(): MantineColorSchemeManager { }, set: (value) => { - if (value === "auto") return; try { if (session) { mutateColorScheme({ colorScheme: value }); diff --git a/apps/nextjs/src/app/[locale]/layout.tsx b/apps/nextjs/src/app/[locale]/layout.tsx index 708699bf8..daab79726 100644 --- a/apps/nextjs/src/app/[locale]/layout.tsx +++ b/apps/nextjs/src/app/[locale]/layout.tsx @@ -4,6 +4,7 @@ import { Inter } from "next/font/google"; import "@homarr/notifications/styles.css"; import "@homarr/spotlight/styles.css"; import "@homarr/ui/styles.css"; +import "~/styles/color-scheme.scss"; import "~/styles/scroll-area.scss"; import { notFound } from "next/navigation"; @@ -129,7 +130,7 @@ export default async function Layout(props: { dir={direction} data-mantine-color-scheme={colorScheme} style={{ - backgroundColor: colorScheme === "dark" ? "#242424" : "#fff", + backgroundColor: colorScheme === "dark" ? "#242424" : colorScheme === "auto" ? undefined : "#fff", }} suppressHydrationWarning > diff --git a/apps/nextjs/src/app/[locale]/manage/settings/_components/appearance-settings-form.tsx b/apps/nextjs/src/app/[locale]/manage/settings/_components/appearance-settings-form.tsx index 2ca25ac4d..900caf0e4 100644 --- a/apps/nextjs/src/app/[locale]/manage/settings/_components/appearance-settings-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/settings/_components/appearance-settings-form.tsx @@ -1,7 +1,7 @@ "use client"; import { Group, Text } from "@mantine/core"; -import { IconMoon, IconSun } from "@tabler/icons-react"; +import { IconDeviceDesktop, IconMoon, IconSun } from "@tabler/icons-react"; import type { ColorScheme } from "@homarr/definitions"; import { colorSchemes } from "@homarr/definitions"; @@ -34,6 +34,7 @@ export const AppearanceSettingsForm = ({ defaultValues }: { defaultValues: Serve }; const appearanceIcons = { + auto: IconDeviceDesktop, light: IconSun, dark: IconMoon, }; diff --git a/apps/nextjs/src/components/color-scheme/color-scheme-combobox.tsx b/apps/nextjs/src/components/color-scheme/color-scheme-combobox.tsx new file mode 100644 index 000000000..207dcb913 --- /dev/null +++ b/apps/nextjs/src/components/color-scheme/color-scheme-combobox.tsx @@ -0,0 +1,94 @@ +"use client"; + +import React from "react"; +import { Combobox, Group, InputBase, Text, useCombobox } from "@mantine/core"; +import { IconCheck, IconDeviceDesktop, IconMoon, IconSun } from "@tabler/icons-react"; + +import type { ColorScheme } from "@homarr/definitions"; +import { colorSchemes } from "@homarr/definitions"; +import { useScopedI18n } from "@homarr/translation/client"; + +const schemeIcons: Record = { + auto: IconDeviceDesktop, + light: IconSun, + dark: IconMoon, +}; + +interface ColorSchemeComboboxProps { + value: ColorScheme; + onChange: (value: ColorScheme) => void; + width?: string; +} + +export const ColorSchemeCombobox = ({ value, onChange, width }: ColorSchemeComboboxProps) => { + const tOptions = useScopedI18n("common.colorScheme.options"); + + const combobox = useCombobox({ + onDropdownClose: () => combobox.resetSelectedOption(), + }); + + const handleOnOptionSubmit = React.useCallback( + (val: string) => { + if (!val) return; + onChange(val as ColorScheme); + combobox.closeDropdown(); + }, + [onChange, combobox], + ); + + const handleOnClick = React.useCallback(() => { + combobox.toggleDropdown(); + }, [combobox]); + + return ( + + + } + rightSectionPointerEvents="none" + onClick={handleOnClick} + variant="filled" + w={width} + > + + + + + + {colorSchemes.map((scheme) => ( + + + + ))} + + + + ); +}; + +const OptionItem = ({ + scheme, + currentScheme, + tOptions, + showCheck, +}: { + scheme: ColorScheme; + currentScheme: ColorScheme; + tOptions: (key: ColorScheme) => string; + showCheck?: boolean; +}) => { + const Icon = schemeIcons[scheme]; + + return ( + + + + {tOptions(scheme)} + + {showCheck && scheme === currentScheme && } + + ); +}; diff --git a/apps/nextjs/src/components/color-scheme/current-color-scheme-combobox.tsx b/apps/nextjs/src/components/color-scheme/current-color-scheme-combobox.tsx index b3534c3aa..232df979d 100644 --- a/apps/nextjs/src/components/color-scheme/current-color-scheme-combobox.tsx +++ b/apps/nextjs/src/components/color-scheme/current-color-scheme-combobox.tsx @@ -1,49 +1,17 @@ "use client"; -import { Group, Text, useMantineColorScheme } from "@mantine/core"; -import { IconMoon, IconSun } from "@tabler/icons-react"; +import { useMantineColorScheme } from "@mantine/core"; import type { ColorScheme } from "@homarr/definitions"; -import { colorSchemes } from "@homarr/definitions"; -import { useScopedI18n } from "@homarr/translation/client"; -import { SelectWithCustomItems } from "@homarr/ui"; + +import { ColorSchemeCombobox } from "./color-scheme-combobox"; interface CurrentColorSchemeComboboxProps { w?: string; } export const CurrentColorSchemeCombobox = ({ w }: CurrentColorSchemeComboboxProps) => { - const tOptions = useScopedI18n("common.colorScheme.options"); const { colorScheme, setColorScheme } = useMantineColorScheme(); - return ( - setColorScheme((value as ColorScheme | null) ?? "light")} - data={colorSchemes.map((scheme) => ({ - value: scheme, - label: tOptions(scheme), - }))} - SelectOption={ColorSchemeCustomOption} - w={w} - /> - ); -}; - -const appearanceIcons = { - light: IconSun, - dark: IconMoon, -}; - -const ColorSchemeCustomOption = ({ value, label }: { value: ColorScheme; label: string }) => { - const Icon = appearanceIcons[value]; - - return ( - - - - {label} - - - ); + return ; }; diff --git a/apps/nextjs/src/components/user-avatar-menu.tsx b/apps/nextjs/src/components/user-avatar-menu.tsx index 4a45a14d7..454ecca78 100644 --- a/apps/nextjs/src/components/user-avatar-menu.tsx +++ b/apps/nextjs/src/components/user-avatar-menu.tsx @@ -5,16 +5,7 @@ import { useCallback, useEffect } from "react"; import { useRouter } from "next/navigation"; import { Center, Menu, Stack, Text, useMantineColorScheme } from "@mantine/core"; import { useHotkeys, useTimeout } from "@mantine/hooks"; -import { - IconCheck, - IconHome, - IconLogin, - IconLogout, - IconMoon, - IconSettings, - IconSun, - IconTool, -} from "@tabler/icons-react"; +import { IconCheck, IconHome, IconLogin, IconLogout, IconSettings, IconTool } from "@tabler/icons-react"; import type { RouterOutputs } from "@homarr/api"; import { signOut, useSession } from "@homarr/auth/client"; @@ -24,6 +15,7 @@ import { useScopedI18n } from "@homarr/translation/client"; import { Link } from "@homarr/ui"; import { useAuthContext } from "~/app/[locale]/_client-providers/session"; +import { CurrentColorSchemeCombobox } from "./color-scheme/current-color-scheme-combobox"; import { CurrentLanguageCombobox } from "./language/current-language-combobox"; import { AvailableUpdatesMenuItem } from "./layout/header/update"; @@ -34,13 +26,9 @@ interface UserAvatarMenuProps { export const UserAvatarMenu = ({ children, availableUpdatesPromise }: UserAvatarMenuProps) => { const t = useScopedI18n("common.userAvatar.menu"); - const { colorScheme, toggleColorScheme } = useMantineColorScheme(); + const { toggleColorScheme } = useMantineColorScheme(); useHotkeys([[hotkeys.toggleColorScheme, toggleColorScheme]]); - const ColorSchemeIcon = colorScheme === "dark" ? IconSun : IconMoon; - - const colorSchemeText = colorScheme === "dark" ? t("switchToLightMode") : t("switchToDarkMode"); - const session = useSession(); const router = useRouter(); @@ -67,14 +55,14 @@ export const UserAvatarMenu = ({ children, availableUpdatesPromise }: UserAvatar - }> - {colorSchemeText} - }> {t("homeBoard")} + + + diff --git a/apps/nextjs/src/styles/color-scheme.scss b/apps/nextjs/src/styles/color-scheme.scss new file mode 100644 index 000000000..ecfb4c780 --- /dev/null +++ b/apps/nextjs/src/styles/color-scheme.scss @@ -0,0 +1,12 @@ +// Prevent flash of white background when color scheme is "auto" and OS prefers dark. +// CSS media queries are evaluated synchronously during the browser's initial paint, +// before any JavaScript executes, so this eliminates the white→dark flicker. +html[data-mantine-color-scheme="auto"] { + background-color: #fff; +} + +@media (prefers-color-scheme: dark) { + html[data-mantine-color-scheme="auto"] { + background-color: #242424; + } +} diff --git a/packages/auth/callbacks.ts b/packages/auth/callbacks.ts index 8f1168ad8..51c9c83e5 100644 --- a/packages/auth/callbacks.ts +++ b/packages/auth/callbacks.ts @@ -36,7 +36,7 @@ export const createSessionAsync = async ( ...user, email: user.email ?? "", permissions: await getCurrentUserPermissionsAsync(db, user.id), - colorScheme: "dark", + colorScheme: "auto", }, } as Session; }; diff --git a/packages/definitions/src/user.ts b/packages/definitions/src/user.ts index 77d8d4138..a25d44811 100644 --- a/packages/definitions/src/user.ts +++ b/packages/definitions/src/user.ts @@ -1,2 +1,2 @@ -export const colorSchemes = ["light", "dark"] as const; +export const colorSchemes = ["auto", "light", "dark"] as const; export type ColorScheme = (typeof colorSchemes)[number]; diff --git a/packages/old-import/src/mappers/map-user.ts b/packages/old-import/src/mappers/map-user.ts index 48ca701ee..240961b3d 100644 --- a/packages/old-import/src/mappers/map-user.ts +++ b/packages/old-import/src/mappers/map-user.ts @@ -24,7 +24,7 @@ export const mapAndDecryptUsers = (importUsers: OldmarrImportUser[], encryptionT oldId: id, id: createId(), name: user.name.toLowerCase(), - colorScheme: settings?.colorScheme === "environment" ? undefined : settings?.colorScheme, + colorScheme: settings?.colorScheme === "environment" ? "auto" : settings?.colorScheme, firstDayOfWeek: settings?.firstDayOfWeek === "sunday" ? 0 : settings?.firstDayOfWeek === "monday" ? 1 : 6, provider: "credentials", pingIconsEnabled: settings?.replacePingWithIcons, diff --git a/packages/server-settings/src/index.ts b/packages/server-settings/src/index.ts index 5c4470f6a..65b0cd354 100644 --- a/packages/server-settings/src/index.ts +++ b/packages/server-settings/src/index.ts @@ -36,7 +36,7 @@ export const defaultServerSettings = { enableGravatar: true, }, appearance: { - defaultColorScheme: "light" as ColorScheme, + defaultColorScheme: "auto" as ColorScheme, }, culture: { defaultLocale: "en" as SupportedLanguage, diff --git a/packages/spotlight/src/modes/command/global-group.tsx b/packages/spotlight/src/modes/command/global-group.tsx index 7aaaa6a2e..4d2f60d37 100644 --- a/packages/spotlight/src/modes/command/global-group.tsx +++ b/packages/spotlight/src/modes/command/global-group.tsx @@ -1,7 +1,8 @@ -import { Group, Text, useMantineColorScheme } from "@mantine/core"; +import { Group, Text, useComputedColorScheme, useMantineColorScheme } from "@mantine/core"; import { IconBox, IconCategoryPlus, + IconDeviceDesktop, IconFileImport, IconLanguage, IconMailForward, @@ -52,13 +53,17 @@ export const globalCommandGroup = createGroup({ useOptions() { const tOption = useScopedI18n("search.mode.command.group.globalCommand.option"); const { colorScheme } = useMantineColorScheme(); + const computedColorScheme = useComputedColorScheme("light"); const { data: session } = useSession(); const commands: (Command & { hidden?: boolean })[] = [ { commandKey: "colorScheme", - icon: colorScheme === "dark" ? IconSun : IconMoon, - name: tOption(`colorScheme.${colorScheme === "dark" ? "light" : "dark"}`), + icon: colorScheme === "auto" ? IconDeviceDesktop : computedColorScheme === "dark" ? IconSun : IconMoon, + name: + colorScheme === "auto" + ? tOption("colorScheme.auto") + : tOption(`colorScheme.${computedColorScheme === "dark" ? "light" : "dark"}`), useInteraction: () => { const { toggleColorScheme } = useMantineColorScheme(); diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index cdde0511b..3767382df 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -1080,6 +1080,7 @@ }, "colorScheme": { "options": { + "auto": "Auto", "light": "Light", "dark": "Dark" } @@ -3666,6 +3667,7 @@ "defaultColorScheme": { "label": "Default color scheme", "options": { + "auto": "Auto", "light": "Light", "dark": "Dark" } @@ -4481,6 +4483,7 @@ "title": "Global commands", "option": { "colorScheme": { + "auto": "Toggle appearance mode", "light": "Switch to light mode", "dark": "Switch to dark mode" }, diff --git a/packages/widgets/src/system-resources/chart/common-chart.tsx b/packages/widgets/src/system-resources/chart/common-chart.tsx index f7cc57c27..2c25c8218 100644 --- a/packages/widgets/src/system-resources/chart/common-chart.tsx +++ b/packages/widgets/src/system-resources/chart/common-chart.tsx @@ -2,7 +2,7 @@ import type { ReactNode } from "react"; import type { AreaChartSeries } from "@mantine/charts"; import { AreaChart, LineChart } from "@mantine/charts"; -import { Card, Center, Group, Loader, Stack, Text, useMantineColorScheme, useMantineTheme } from "@mantine/core"; +import { Card, Center, Group, Loader, Stack, Text, useComputedColorScheme, useMantineTheme } from "@mantine/core"; import { useElementSize, useHover, useMergedRef } from "@mantine/hooks"; import type { TooltipProps, YAxisProps } from "recharts"; @@ -36,14 +36,13 @@ export const CommonChart = ({ }) => { const { ref: elementSizeRef, height } = useElementSize(); const theme = useMantineTheme(); - const scheme = useMantineColorScheme(); + const colorScheme = useComputedColorScheme("light"); const board = useRequiredBoard(); const { hovered, ref: hoverRef } = useHover(); const ref = useMergedRef(elementSizeRef, hoverRef); const opacity = board.opacity / 100; - const backgroundColor = - scheme.colorScheme === "dark" ? `rgba(57, 57, 57, ${opacity})` : `rgba(246, 247, 248, ${opacity})`; + const backgroundColor = colorScheme === "dark" ? `rgba(57, 57, 57, ${opacity})` : `rgba(246, 247, 248, ${opacity})`; const ChartComponent = chartType === "line" ? LineChart : AreaChart; const showIcon = labelDisplayMode === "icon" || labelDisplayMode === "textWithIcon"; From b5c316b825bdffa267fd173a3c39a12269142665 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 7 May 2026 18:38:40 +0200 Subject: [PATCH 051/116] feat(spotlight): rework !bang search UX (#4813) Co-authored-by: Meier Lukas --- .cursor/rules/codebase-context.mdc | 191 ++ .../_change-search-preferences.tsx | 6 + packages/api/src/root.ts | 1 + packages/api/src/router/bangs/bangs-router.ts | 17 + packages/api/src/router/user.ts | 30 + .../router/user/change-search-preferences.ts | 8 +- packages/api/src/services/duckduckgo-bangs.ts | 55 + .../mysql/0038_add_user_ddg_bangs.sql | 1 + .../migrations/mysql/meta/0038_snapshot.json | 2104 +++++++++++++++++ .../db/migrations/mysql/meta/_journal.json | 7 + .../postgresql/0004_add_user_ddg_bangs.sql | 1 + .../postgresql/meta/0004_snapshot.json | 2002 ++++++++++++++++ .../migrations/postgresql/meta/_journal.json | 7 + .../sqlite/0036_add_user_ddg_bangs.sql | 1 + .../migrations/sqlite/meta/0036_snapshot.json | 2019 ++++++++++++++++ .../db/migrations/sqlite/meta/_journal.json | 7 + packages/db/schema/mysql.ts | 1 + packages/db/schema/postgresql.ts | 1 + packages/db/schema/sqlite.ts | 1 + .../request-handler/src/duckduckgo-bangs.ts | 79 + packages/settings/src/creator.ts | 3 + .../src/components/actions/group-actions.tsx | 4 + .../actions/groups/action-group.tsx | 6 +- .../actions/items/group-action-item.tsx | 16 +- .../spotlight/src/components/spotlight.tsx | 50 +- packages/spotlight/src/lib/interaction.ts | 1 + .../external/search-engines-search-group.tsx | 247 +- .../src/modes/help/home-empty-groups.tsx | 140 ++ .../modes/home/home-search-engine-group.tsx | 17 +- packages/spotlight/src/modes/index.tsx | 87 +- packages/translation/src/lang/en.json | 21 + packages/validation/src/user.ts | 5 + 32 files changed, 6985 insertions(+), 151 deletions(-) create mode 100644 .cursor/rules/codebase-context.mdc create mode 100644 packages/api/src/router/bangs/bangs-router.ts create mode 100644 packages/api/src/services/duckduckgo-bangs.ts create mode 100644 packages/db/migrations/mysql/0038_add_user_ddg_bangs.sql create mode 100644 packages/db/migrations/mysql/meta/0038_snapshot.json create mode 100644 packages/db/migrations/postgresql/0004_add_user_ddg_bangs.sql create mode 100644 packages/db/migrations/postgresql/meta/0004_snapshot.json create mode 100644 packages/db/migrations/sqlite/0036_add_user_ddg_bangs.sql create mode 100644 packages/db/migrations/sqlite/meta/0036_snapshot.json create mode 100644 packages/request-handler/src/duckduckgo-bangs.ts create mode 100644 packages/spotlight/src/modes/help/home-empty-groups.tsx diff --git a/.cursor/rules/codebase-context.mdc b/.cursor/rules/codebase-context.mdc new file mode 100644 index 000000000..9b1ef995d --- /dev/null +++ b/.cursor/rules/codebase-context.mdc @@ -0,0 +1,191 @@ +--- +description: Comprehensive Homarr codebase architecture and conventions reference +alwaysApply: true +--- + +# Homarr Codebase Context + +Homarr is an open-source, self-hosted dashboard for managing homelab services. It integrates with 50+ self-hosted apps (media servers, download clients, DNS, NAS, etc.) and provides a drag-and-drop widget-based UI. + +## Tech Stack + +- **Monorepo**: pnpm workspaces + Turborepo +- **Framework**: Next.js (App Router, `output: "standalone"`) — T3 Stack +- **Language**: TypeScript throughout +- **ORM**: Drizzle (supports SQLite via better-sqlite3, MySQL, PostgreSQL) +- **API**: tRPC (HTTP + WebSocket subscriptions) with superjson + OpenAPI bridge via `trpc-to-openapi` +- **Auth**: NextAuth v5 (database sessions, Credentials/LDAP/OIDC providers) +- **UI**: Mantine v7 (not Tailwind) + Tabler icons +- **State**: Jotai (atoms), TanStack Query (server state via tRPC) +- **Realtime**: WebSocket server (`ws`) for tRPC subscriptions, backed by Redis pub/sub +- **Cron**: `node-cron` in a standalone Fastify service (`apps/tasks`) +- **i18n**: next-intl with `[locale]` dynamic segment (prefix mode: `"never"`, locale from cookie) +- **Testing**: Vitest + jsdom, Playwright for E2E +- **Package manager**: pnpm 10.33.2, Node >= 24.15.0 + +## Repository Structure + +``` +homarr/ +├── apps/ +│ ├── nextjs/ # Main Next.js application (port 3000) +│ ├── tasks/ # Cron job runner + Fastify tRPC API (port 3002) +│ └── websocket/ # Standalone tRPC WebSocket server (port 3001) +├── packages/ +│ ├── api/ # tRPC appRouter, procedures, OpenAPI +│ ├── auth/ # NextAuth config, providers, session, API keys +│ ├── db/ # Drizzle schema (3 DB drivers), migrations, queries +│ ├── core/ # Env validation, DB/Redis driver factories, logging +│ ├── definitions/ # Domain enums: WidgetKind, IntegrationKind, permissions +│ ├── widgets/ # All 39 dashboard widgets (definitions + components) +│ ├── integrations/ # Integration classes (HTTP clients to external apps) +│ ├── redis/ # Redis pub/sub channels, caching abstractions +│ ├── translation/ # next-intl setup, locale configs, lang JSON files +│ ├── ui/ # Shared Mantine components, theme, hooks +│ ├── validation/ # Shared zod schemas for API/forms +│ ├── common/ # Shared utilities, IDs, errors +│ ├── cron-jobs/ # Cron job implementations (25+ jobs) +│ ├── cron-jobs-core/ # Cron scheduling primitives +│ ├── cron-job-api/ # tRPC router for job management (start/stop/trigger) +│ ├── cron-job-status/ # Cron status via Redis +│ ├── boards/ # Board context, edit mode, cache updater +│ ├── modals/ # Modal primitives on Mantine +│ ├── modals-collection/ # Feature modals (apps, boards, docker, etc.) +│ ├── form/ # useZodForm (Mantine + zod resolver) +│ ├── forms-collection/# Reusable form UIs (new app, icon picker, upload) +│ ├── spotlight/ # Command palette / search with multiple modes +│ ├── request-handler/ # Server request handlers (feeds, integrations) +│ ├── notifications/ # Mantine notifications wrapper +│ ├── docker/ # Dockerode-based Docker access +│ ├── icons/ # Icon DB/repo integration +│ ├── image-proxy/ # Image proxy + caching +│ ├── ping/ # Reachability / ping utilities +│ ├── analytics/ # Server-side analytics (Umami) +│ ├── server-settings/ # Server setting keys/types +│ ├── settings/ # User-facing settings UI context +│ ├── old-import/ # Legacy Homarr import +│ ├── old-schema/ # Legacy Homarr zod schemas +│ └── cli/ # Node CLI for ops (brocli) +├── tooling/ +│ ├── eslint/ # Shared ESLint configs +│ ├── prettier/ # Shared Prettier config +│ ├── typescript/ # Base tsconfig +│ └── github/ # CI setup action +├── development/ # Dev docker-compose (Redis, MySQL, PostgreSQL) +├── e2e/ # E2E test specs +└── Dockerfile # Multi-stage production build +``` + +## Three Runtime Services + +| Service | Port | Role | +|---------|------|------| +| Next.js | 3000 | Main web app (SSR + API routes) | +| WebSocket | 3001 | tRPC subscriptions via `ws` | +| Tasks | 3002 | Cron job runner + management API via Fastify | + +In Docker, nginx listens on **7575** and proxies to all three. The tasks service authenticates via `CRON_JOB_API_KEY` header. + +## Package Dependency Layers + +1. **Foundation**: `core` (env, DB drivers, Redis client, logging) → no `@homarr` deps +2. **Domain**: `definitions` → `common` → `core` +3. **Data**: `db` → `core`, `definitions`, `common` +4. **Auth**: `auth` → `db`, `definitions`, `core`, `validation` +5. **Cross-cutting**: `translation`, `validation`, `redis`, `server-settings` +6. **Feature backends**: `integrations`, `request-handler`, `cron-jobs`, `docker`, `ping` +7. **API surface**: `api` → pulls in auth, db, redis, integrations, etc. +8. **UI stack**: `ui`, `modals`, `form`, `notifications`, `boards`, `spotlight` +9. **Composed features**: `widgets`, `modals-collection`, `forms-collection` + +## Key Patterns + +### tRPC + +- **Server caller** (RSC): `import { api } from "@homarr/api/server"` → cached caller with auth context +- **Client hooks**: `import { clientApi } from "@homarr/api/client"` → React Query hooks +- **Router structure**: `packages/api/src/root.ts` defines top-level namespaces (`user`, `board`, `widget`, `integration`, `docker`, `kubernetes`, etc.) +- **Procedures**: `publicProcedure`, `protectedProcedure`, `permissionRequiredProcedure`, `onboardingProcedure` +- **WebSocket subscriptions**: Client uses `wsLink` when `type === "subscription"`, connects to port 3001 + +### Multi-Database Support + +Drizzle schemas exist in three parallel implementations: +- `packages/db/schema/sqlite.ts` +- `packages/db/schema/mysql.ts` +- `packages/db/schema/postgresql.ts` + +Selected at runtime via `DB_DRIVER` env (`better-sqlite3` | `mysql2` | `node-postgres`). Migrations are per-engine in `packages/db/migrations/{sqlite,mysql,postgresql}/`. + +### Widget System + +Widgets are registered in `packages/widgets/src/index.tsx` as `widgetImports` (must satisfy `Record`). Each widget: +- Has a `definition` created via `createWidgetDefinition(kind, { icon, createOptions, supportedIntegrations? })` +- Uses `optionsBuilder.from(factory => ({ ... }))` for typed options +- Loads dynamically via `next/dynamic` +- Fetches data via tRPC client hooks (backed by cron job caches) + +### Integration System + +Integrations are defined in `packages/definitions/src/integration.ts` (`integrationDefs`) and instantiated via `createIntegrationAsync` in `packages/integrations/src/base/creator.ts`. Each extends abstract `Integration` class with `testConnectionAsync` and typed methods. + +### Cron Job System + +Jobs defined in `packages/cron-jobs/src/jobs/`. Each job: +- Uses `createCronJob` with a cron expression +- Publishes results to Redis channels +- Widget subscriptions consume those channels via tRPC subscriptions +- Job management (start/stop/trigger) via `cronJobApi` HTTP client to port 3002 + +### Modals + +Created with `createModal(component).withOptions({ defaultTitle })` from `@homarr/modals`. Opened via `useModalAction(SomeModal)`. Feature modals live in `packages/modals-collection/`. + +### Forms + +`useZodForm` from `@homarr/form` wraps Mantine `useForm` with zod validation. Shared form UIs in `packages/forms-collection/`. + +### Routing (App Router) + +- `apps/nextjs/src/app/[locale]/` — all UI routes under locale segment +- Route groups: `(home)`, `(content)`, `(board)` — don't affect URLs +- Key routes: `boards/[name]`, `manage/...` (admin), `auth/login`, `init` (onboarding), `widgets/[kind]` +- Locale driven by cookie (no URL prefix) + +### Auth Providers + +Configured via `AUTH_PROVIDERS` env. Supports: `credentials` (local), `ldap`, `oidc`. Database sessions with httpOnly cookies. API key auth for programmatic access. + +## Environment Variables + +Key env vars (from `.env.example`): +- `DB_DRIVER`: `better-sqlite3` | `mysql2` | `node-postgres` +- `DB_URL`: Database connection string +- `AUTH_SECRET`: NextAuth secret +- `SECRET_ENCRYPTION_KEY`: AES-256-CBC for integration secrets +- `AUTH_PROVIDERS`: Comma-separated (`credentials`, `ldap`, `oidc`) +- `CRON_JOB_API_KEY`: Shared key between Next.js and tasks service +- `REDIS_*`: Redis connection (host, port, password) +- `ENABLE_KUBERNETES`: Optional Kubernetes integration + +## Development Commands + +- `pnpm dev` — runs all three services in parallel via Turborepo +- `pnpm docker:dev` — starts Redis + MySQL + PostgreSQL containers +- `pnpm db:push` — push schema to SQLite (dev) +- `pnpm db:studio` — Drizzle Studio +- `pnpm test` — Vitest unit tests +- `pnpm test:e2e` — Playwright E2E +- `pnpm lint` / `pnpm format` — ESLint + Prettier +- `pnpm typecheck` — tsc --noEmit across all packages + +## Conventions + +- Workspace packages use `@homarr/` scope +- All versions managed via pnpm `catalog:` in workspace +- Path alias `~/*` → `./src/*` in Next.js app +- Mantine for all UI (no Tailwind) — primary color is red, `autoContrast: true` +- Icons from `@tabler/icons-react` +- Drag-and-drop via `@dnd-kit/*` +- `typescript.ignoreBuildErrors: true` in next.config (types checked separately via `typecheck`) +- `serverExternalPackages`: `dockerode`, `isomorphic-dompurify`, `jsdom` diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-search-preferences.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-search-preferences.tsx index 5bf23a5fb..afae60dc1 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-search-preferences.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-search-preferences.tsx @@ -26,6 +26,7 @@ export const ChangeSearchPreferencesForm = ({ user, searchEnginesData }: ChangeS form.setInitialValues({ defaultSearchEngineId: variables.defaultSearchEngineId, openInNewTab: variables.openInNewTab, + ddgBangsEnabled: variables.ddgBangsEnabled, }); showSuccessNotification({ message: t("user.action.changeSearchPreferences.notification.success.message"), @@ -41,6 +42,7 @@ export const ChangeSearchPreferencesForm = ({ user, searchEnginesData }: ChangeS initialValues: { defaultSearchEngineId: user.defaultSearchEngineId, openInNewTab: user.openSearchInNewTab, + ddgBangsEnabled: user.ddgBangs, }, }); @@ -64,6 +66,10 @@ export const ChangeSearchPreferencesForm = ({ user, searchEnginesData }: ChangeS label={t("user.field.openSearchInNewTab.label")} {...form.getInputProps("openInNewTab", { type: "checkbox" })} /> +