diff --git a/.github/workflows/automatic-approval.yml b/.github/workflows/automatic-approval.yml index 7a38b6e02..7f212e23b 100644 --- a/.github/workflows/automatic-approval.yml +++ b/.github/workflows/automatic-approval.yml @@ -11,7 +11,7 @@ jobs: if: github.actor_id == 158783068 || github.actor_id == 190541745 || github.actor_id == 210161987 # Id of renovate bot and crowdin bot see https://api.github.com/users/homarr-renovate%5Bbot%5D and https://api.github.com/users/homarr-crowdin%5Bbot%5D and https://api.github.com/users/homarr-update-contributors%5Bbot%5D steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Obtain token id: obtainToken uses: actions/create-github-app-token@v2 diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 4159cdb6b..2b5e8a3d7 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -24,7 +24,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup uses: ./tooling/github/setup @@ -39,7 +39,7 @@ jobs: format: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup uses: ./tooling/github/setup @@ -50,7 +50,7 @@ jobs: typecheck: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup uses: ./tooling/github/setup @@ -61,7 +61,7 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup uses: ./tooling/github/setup @@ -79,7 +79,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup uses: ./tooling/github/setup - name: Build docker image @@ -102,7 +102,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup uses: ./tooling/github/setup - name: Copy env diff --git a/.github/workflows/crowdin-schedule-download.yml b/.github/workflows/crowdin-schedule-download.yml index c4fead5ad..a62f9e31d 100644 --- a/.github/workflows/crowdin-schedule-download.yml +++ b/.github/workflows/crowdin-schedule-download.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Obtain token id: obtainToken diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/crowdin-upload.yml index 5b46a7bf9..4cdf60b66 100644 --- a/.github/workflows/crowdin-upload.yml +++ b/.github/workflows/crowdin-upload.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Upload Crowdin translations uses: crowdin/github-action@v2 diff --git a/.github/workflows/deployment-docker-image.yml b/.github/workflows/deployment-docker-image.yml index 3b608f8df..d0479ae21 100644 --- a/.github/workflows/deployment-docker-image.yml +++ b/.github/workflows/deployment-docker-image.yml @@ -55,7 +55,7 @@ jobs: 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 - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 if: env.SKIP_RELEASE == 'false' with: persist-credentials: false @@ -115,7 +115,7 @@ jobs: outputs: digest: ${{ steps.build.outputs.digest }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{ needs.release.outputs.git_ref }} @@ -154,7 +154,7 @@ jobs: outputs: digest: ${{ steps.build.outputs.digest }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{ needs.release.outputs.git_ref }} diff --git a/.github/workflows/deployment-weekly-release.yml b/.github/workflows/deployment-weekly-release.yml index e96cf4eec..8eae236c4 100644 --- a/.github/workflows/deployment-weekly-release.yml +++ b/.github/workflows/deployment-weekly-release.yml @@ -27,7 +27,7 @@ jobs: with: args: "Automatic release has been triggered: [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Get Next Version diff --git a/.github/workflows/on-pr-renovate-validate.yml b/.github/workflows/on-pr-renovate-validate.yml index a6096c033..ebfb57ed2 100644 --- a/.github/workflows/on-pr-renovate-validate.yml +++ b/.github/workflows/on-pr-renovate-validate.yml @@ -12,7 +12,7 @@ jobs: renovate-validate: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - run: | npx --yes --package renovate -- \ renovate-config-validator --strict .github/renovate.json5 diff --git a/.github/workflows/on-release.yml b/.github/workflows/on-release.yml index 9aac94c45..ac4277cde 100644 --- a/.github/workflows/on-release.yml +++ b/.github/workflows/on-release.yml @@ -49,7 +49,7 @@ jobs: permission-contents: write # required to commit to branch permission-pull-requests: write # required to create pr & enable automerge - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: token: ${{ steps.obtainToken.outputs.token }} - name: Setup diff --git a/.github/workflows/update-contributors.yml b/.github/workflows/update-contributors.yml index df879b334..91f087d9c 100644 --- a/.github/workflows/update-contributors.yml +++ b/.github/workflows/update-contributors.yml @@ -28,7 +28,7 @@ jobs: permission-pull-requests: write # required to create pr & enable automerge - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 env: GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }} diff --git a/.github/workflows/update-integration-list.yml b/.github/workflows/update-integration-list.yml index ff7ad9ae8..5be197084 100644 --- a/.github/workflows/update-integration-list.yml +++ b/.github/workflows/update-integration-list.yml @@ -27,7 +27,7 @@ jobs: permission-contents: write # required to commit to branch permission-pull-requests: write # required to create pr & enable automerge - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 env: GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }} - name: Setup diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 60f9800e6..7737e7d64 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -74,9 +74,9 @@ "dayjs": "^1.11.19", "dotenv": "^17.2.3", "flag-icons": "^7.5.0", - "glob": "^12.0.0", + "glob": "^13.0.0", "isomorphic-dompurify": "^2.33.0", - "jotai": "^2.15.1", + "jotai": "^2.15.2", "mantine-react-table": "2.0.0-beta.9", "next": "16.0.7", "postcss-preset-mantine": "^1.18.0", @@ -104,7 +104,7 @@ "concurrently": "^9.2.1", "eslint": "^9.39.1", "node-loader": "^2.1.0", - "prettier": "^3.6.2", + "prettier": "^3.7.4", "typescript": "^5.9.3" } } diff --git a/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx b/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx index d423c2fce..0a91d4ced 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx @@ -12,7 +12,11 @@ import { groupCreateSchema } from "@homarr/validation/group"; export const InitGroup = () => { const t = useI18n(); - const { mutateAsync } = clientApi.group.createInitialExternalGroup.useMutation(); + const { mutateAsync } = clientApi.group.createInitialExternalGroup.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/init"); + }, + }); const form = useZodForm(groupCreateSchema, { initialValues: { name: "", @@ -21,9 +25,6 @@ export const InitGroup = () => { const handleSubmitAsync = async (values: z.infer) => { await mutateAsync(values, { - async onSuccess() { - await revalidatePathActionAsync("/init"); - }, onError(error) { if (error.data?.code === "CONFLICT") { form.setErrors({ name: t("common.zod.errors.custom.groupNameTaken") }); diff --git a/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx b/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx index b5839b743..08e3e0c2d 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx @@ -17,7 +17,11 @@ import { settingsInitSchema } from "@homarr/validation/settings"; export const InitSettings = () => { const tSection = useScopedI18n("management.page.settings.section"); const t = useI18n(); - const { mutateAsync } = clientApi.serverSettings.initSettings.useMutation(); + const { mutateAsync } = clientApi.serverSettings.initSettings.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/init"); + }, + }); const form = useZodForm(settingsInitSchema, { initialValues: defaultServerSettings }); form.watch("analytics.enableGeneral", ({ value }) => { @@ -31,11 +35,7 @@ export const InitSettings = () => { }); const handleSubmitAsync = async (values: z.infer) => { - await mutateAsync(values, { - async onSuccess() { - await revalidatePathActionAsync("/init"); - }, - }); + await mutateAsync(values); }; return ( diff --git a/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx b/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx index daf73f7b3..3a659032f 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx @@ -26,19 +26,19 @@ export const InitUserForm = () => { const handleSubmitAsync = async (values: FormType) => { await mutateAsync(values, { - async onSuccess() { + onSuccess() { showSuccessNotification({ title: tUser("notification.success.title"), message: tUser("notification.success.message"), }); - await signIn("credentials", { + void signIn("credentials", { name: values.username, password: values.password, redirect: false, + }).then(async () => { + await revalidatePathActionAsync("/init"); }); - - await revalidatePathActionAsync("/init"); }, onError: (error) => { showErrorNotification({ diff --git a/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx b/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx index 4c918f9ef..e5ae194af 100644 --- a/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx +++ b/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx @@ -84,9 +84,6 @@ export const BoardCardMenuDropdown = ({ board }: BoardCardMenuDropdownProps) => id: board.id, name: board.name, }, - onSuccess: async () => { - await revalidatePathActionAsync("/manage/boards"); - }, }); }, [board.id, board.name, openDuplicateModal]); diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx index 1152174a4..016b9336c 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx @@ -86,7 +86,11 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => }, }); - const { mutateAsync: createIntegrationAsync, isPending } = clientApi.integration.create.useMutation(); + const { mutateAsync: createIntegrationAsync, isPending } = clientApi.integration.create.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/integrations"); + }, + }); const [error, setError] = useState(null); const handleSubmitAsync = async ({ appId, appHref, hasApp, ...values }: FormType) => { @@ -116,7 +120,7 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => app, }, { - async onSuccess(data) { + onSuccess(data) { // We do it this way as we are unable to send a typesafe error through onError if (data?.error) { setError(data.error); @@ -132,7 +136,7 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => message: t("integration.page.create.notification.success.message"), }); - await revalidatePathActionAsync("/manage/integrations").then(() => router.push("/manage/integrations")); + router.push("/manage/integrations"); }, onError: () => { showErrorNotification({ diff --git a/apps/nextjs/src/app/[locale]/manage/tools/certificates/_components/remove-certificate.tsx b/apps/nextjs/src/app/[locale]/manage/tools/certificates/_components/remove-certificate.tsx index 04e1c7613..ca45aefb3 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/certificates/_components/remove-certificate.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/certificates/_components/remove-certificate.tsx @@ -15,7 +15,11 @@ interface RemoveCertificateProps { export const RemoveCertificate = ({ fileName }: RemoveCertificateProps) => { const { openConfirmModal } = useConfirmModal(); - const { mutateAsync } = clientApi.certificates.removeCertificate.useMutation(); + const { mutateAsync } = clientApi.certificates.removeCertificate.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/tools/certificates"); + }, + }); const t = useI18n(); const handleClick = () => { @@ -27,12 +31,11 @@ export const RemoveCertificate = ({ fileName }: RemoveCertificateProps) => { await mutateAsync( { fileName }, { - async onSuccess() { + onSuccess() { showSuccessNotification({ title: t("certificate.action.remove.notification.success.title"), message: t("certificate.action.remove.notification.success.message"), }); - await revalidatePathActionAsync("/manage/tools/certificates"); }, onError() { showErrorNotification({ diff --git a/apps/nextjs/src/app/[locale]/manage/tools/certificates/hostnames/_components/remove-hostname.tsx b/apps/nextjs/src/app/[locale]/manage/tools/certificates/hostnames/_components/remove-hostname.tsx index d0004c849..445a301b2 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/certificates/hostnames/_components/remove-hostname.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/certificates/hostnames/_components/remove-hostname.tsx @@ -15,7 +15,11 @@ interface RemoveHostnameActionIconProps { } export const RemoveHostnameActionIcon = (input: RemoveHostnameActionIconProps) => { - const { mutateAsync } = clientApi.certificates.removeTrustedHostname.useMutation(); + const { mutateAsync } = clientApi.certificates.removeTrustedHostname.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/tools/certificates/hostnames"); + }, + }); const { openConfirmModal } = useConfirmModal(); const t = useI18n(); @@ -26,8 +30,7 @@ export const RemoveHostnameActionIcon = (input: RemoveHostnameActionIconProps) = // eslint-disable-next-line no-restricted-syntax async onConfirm() { await mutateAsync(input, { - async onSuccess() { - await revalidatePathActionAsync("/manage/tools/certificates/hostnames"); + onSuccess() { showSuccessNotification({ title: t("certificate.action.removeHostname.notification.success.title"), message: t("certificate.action.removeHostname.notification.success.message"), diff --git a/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx b/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx index 0db5d2116..ce087bf7d 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx @@ -206,15 +206,16 @@ const ContainerActionBarButton = (props: ContainerActionBarButtonProps) => { const t = useScopedI18n("docker.action"); const utils = clientApi.useUtils(); - const { mutateAsync, isPending } = clientApi.docker[`${props.action}All`].useMutation(); + const { mutateAsync, isPending } = clientApi.docker[`${props.action}All`].useMutation({ + async onSettled() { + await utils.docker.getContainers.invalidate(); + }, + }); const handleClickAsync = async () => { await mutateAsync( { ids: props.selectedIds }, { - async onSettled() { - await utils.docker.getContainers.invalidate(); - }, onSuccess() { showSuccessNotification({ title: t(`${props.action}.notification.success.title`), diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-avatar-form.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-avatar-form.tsx index 485bffdf5..e4ee64583 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-avatar-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-avatar-form.tsx @@ -18,7 +18,12 @@ interface UserProfileAvatarForm { } export const UserProfileAvatarForm = ({ user }: UserProfileAvatarForm) => { - const { mutate } = clientApi.user.setProfileImage.useMutation(); + const { mutate } = clientApi.user.setProfileImage.useMutation({ + async onSuccess() { + // Revalidate all as the avatar is used in multiple places + await revalidatePathActionAsync("/"); + }, + }); const [opened, { toggle }] = useDisclosure(false); const { openConfirmModal } = useConfirmModal(); const t = useI18n(); @@ -38,9 +43,7 @@ export const UserProfileAvatarForm = ({ user }: UserProfileAvatarForm) => { image: base64Url, }, { - async onSuccess() { - // Revalidate all as the avatar is used in multiple places - await revalidatePathActionAsync("/"); + onSuccess() { showSuccessNotification({ message: tManageAvatar("changeImage.notification.success.message"), }); @@ -74,9 +77,7 @@ export const UserProfileAvatarForm = ({ user }: UserProfileAvatarForm) => { image: null, }, { - async onSuccess() { - // Revalidate all as the avatar is used in multiple places - await revalidatePathActionAsync("/"); + onSuccess() { showSuccessNotification({ message: tManageAvatar("removeImage.notification.success.message"), }); diff --git a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/_transfer-group-ownership.tsx b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/_transfer-group-ownership.tsx index 9074c9ecf..a9fd0bd4f 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/_transfer-group-ownership.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/_transfer-group-ownership.tsx @@ -25,7 +25,11 @@ export const TransferGroupOwnership = ({ group }: TransferGroupOwnershipProps) = const [innerOwnerId, setInnerOwnerId] = useState(group.ownerId); const { openModal } = useModalAction(UserSelectModal); const { openConfirmModal } = useConfirmModal(); - const { mutateAsync } = clientApi.group.transferOwnership.useMutation(); + const { mutateAsync } = clientApi.group.transferOwnership.useMutation({ + async onSuccess() { + await revalidatePathActionAsync(`/manage/users/groups/${group.id}`); + }, + }); const handleTransfer = useCallback(() => { openModal( @@ -47,7 +51,7 @@ export const TransferGroupOwnership = ({ group }: TransferGroupOwnershipProps) = userId: id, }, { - async onSuccess() { + onSuccess() { setInnerOwnerId(id); showSuccessNotification({ title: tRoot("common.notification.transfer.success"), @@ -56,7 +60,6 @@ export const TransferGroupOwnership = ({ group }: TransferGroupOwnershipProps) = user: name, }), }); - await revalidatePathActionAsync(`/manage/users/groups/${group.id}`); }, onError() { showErrorNotification({ diff --git a/apps/nextjs/src/app/[locale]/manage/users/groups/_groups-table.tsx b/apps/nextjs/src/app/[locale]/manage/users/groups/_groups-table.tsx index 2dcfb21a2..c03c8cddc 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/groups/_groups-table.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/groups/_groups-table.tsx @@ -56,16 +56,19 @@ export const GroupsTable = ({ groups, initialGroupIds, hasFilter }: GroupsTableP () => initialGroupIds.some((groupId, index) => groupIds.indexOf(groupId) !== index), [groupIds, initialGroupIds], ); - const { mutateAsync, isPending } = clientApi.group.savePositions.useMutation(); + const { mutateAsync, isPending } = clientApi.group.savePositions.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/users/groups"); + }, + }); const handleSavePositionsAsync = async () => { await mutateAsync( { positions: groupIds }, { - async onSuccess() { + onSuccess() { showSuccessNotification({ message: t("group.action.changePosition.notification.success.message"), }); - await revalidatePathActionAsync("/manage/users/groups"); }, onError() { showSuccessNotification({ diff --git a/apps/tasks/package.json b/apps/tasks/package.json index 1fac1e9b6..2cc5f798d 100644 --- a/apps/tasks/package.json +++ b/apps/tasks/package.json @@ -51,7 +51,7 @@ "dotenv-cli": "^11.0.0", "esbuild": "^0.27.0", "eslint": "^9.39.1", - "prettier": "^3.6.2", + "prettier": "^3.7.4", "tsx": "4.20.4", "typescript": "^5.9.3" } diff --git a/apps/websocket/package.json b/apps/websocket/package.json index e4a29aa47..c54e63e75 100644 --- a/apps/websocket/package.json +++ b/apps/websocket/package.json @@ -36,7 +36,7 @@ "@types/ws": "^8.18.1", "esbuild": "^0.27.0", "eslint": "^9.39.1", - "prettier": "^3.6.2", + "prettier": "^3.7.4", "typescript": "^5.9.3" } } diff --git a/package.json b/package.json index afabec73c..0671ea447 100644 --- a/package.json +++ b/package.json @@ -45,19 +45,19 @@ "@testcontainers/redis": "^11.9.0", "@turbo/gen": "^2.6.1", "@vitejs/plugin-react": "^5.1.1", - "@vitest/coverage-v8": "^4.0.14", - "@vitest/ui": "^4.0.14", + "@vitest/coverage-v8": "^4.0.15", + "@vitest/ui": "^4.0.15", "conventional-changelog-conventionalcommits": "^9.1.0", "cross-env": "^10.1.0", "jsdom": "^27.2.0", "json5": "^2.2.3", - "prettier": "^3.6.2", + "prettier": "^3.7.4", "semantic-release": "^25.0.2", "testcontainers": "^11.9.0", "turbo": "^2.6.1", "typescript": "^5.9.3", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^4.0.14" + "vitest": "^4.0.15" }, "packageManager": "pnpm@10.24.0", "engines": { @@ -95,7 +95,7 @@ "tar-fs@>=3.0.0 <3.0.9": ">=3.1.1", "tar-fs@>=2.0.0 <2.1.3": ">=3.1.1", "tmp@<=0.2.3": ">=0.2.5", - "vite@>=5.0.0 <=5.4.18": ">=7.2.4" + "vite@>=5.0.0 <=5.4.18": ">=7.2.6" }, "patchedDependencies": { "@types/node-unifi": "patches/@types__node-unifi.patch", diff --git a/packages/api/package.json b/packages/api/package.json index d80d5b833..5cf8ea735 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -61,7 +61,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "eslint": "^9.39.1", - "prettier": "^3.6.2", + "prettier": "^3.7.4", "typescript": "^5.9.3" } } diff --git a/packages/auth/package.json b/packages/auth/package.json index c0cf7b3b5..b254cd921 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -48,7 +48,7 @@ "@types/bcrypt": "6.0.0", "@types/cookies": "0.9.2", "eslint": "^9.39.1", - "prettier": "^3.6.2", + "prettier": "^3.7.4", "typescript": "^5.9.3" } } diff --git a/packages/auth/providers/credentials/authorization/ldap-authorization.ts b/packages/auth/providers/credentials/authorization/ldap-authorization.ts index 9f441aa9a..22dd15181 100644 --- a/packages/auth/providers/credentials/authorization/ldap-authorization.ts +++ b/packages/auth/providers/credentials/authorization/ldap-authorization.ts @@ -6,14 +6,14 @@ import type { Database, InferInsertModel } from "@homarr/db"; import { and, eq } from "@homarr/db"; import { users } from "@homarr/db/schema"; import { logger } from "@homarr/log"; -import type { userSignInSchema } from "@homarr/validation/user"; +import type { ldapSignInSchema } from "@homarr/validation/user"; import { env } from "../../../env"; import { LdapClient } from "../ldap-client"; export const authorizeWithLdapCredentialsAsync = async ( db: Database, - credentials: z.infer, + credentials: z.infer, ) => { logger.info(`user ${credentials.name} is trying to log in using LDAP. Connecting to LDAP server...`); const client = new LdapClient(); @@ -38,7 +38,14 @@ export const authorizeWithLdapCredentialsAsync = async ( attributes: [env.AUTH_LDAP_USERNAME_ATTRIBUTE, env.AUTH_LDAP_USER_MAIL_ATTRIBUTE], }, }) - .then((entries) => entries.at(0)); + .then((entries) => { + if (entries.length > 1) { + logger.warn(`Multiple LDAP users found for ${credentials.name}, expected only one.`); + throw new CredentialsSignin(); + } + + return entries.at(0); + }); if (!ldapUser) { logger.warn(`User ${credentials.name} not found in LDAP`); diff --git a/packages/auth/providers/credentials/credentials-provider.ts b/packages/auth/providers/credentials/credentials-provider.ts index 79e5eddf6..9de08da14 100644 --- a/packages/auth/providers/credentials/credentials-provider.ts +++ b/packages/auth/providers/credentials/credentials-provider.ts @@ -1,7 +1,7 @@ import type Credentials from "@auth/core/providers/credentials"; import type { Database } from "@homarr/db"; -import { userSignInSchema } from "@homarr/validation/user"; +import { ldapSignInSchema, userSignInSchema } from "@homarr/validation/user"; import { authorizeWithBasicCredentialsAsync } from "./authorization/basic-authorization"; import { authorizeWithLdapCredentialsAsync } from "./authorization/ldap-authorization"; @@ -28,7 +28,7 @@ export const createLdapConfiguration = (db: Database) => name: "Ldap", // eslint-disable-next-line no-restricted-syntax async authorize(credentials) { - const data = await userSignInSchema.parseAsync(credentials); + const data = await ldapSignInSchema.parseAsync(credentials); return await authorizeWithLdapCredentialsAsync(db, data).catch(() => null); }, }) satisfies CredentialsConfiguration; diff --git a/packages/db/package.json b/packages/db/package.json index dd5aaa6af..af2e3b69a 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -71,7 +71,7 @@ "dotenv-cli": "^11.0.0", "esbuild": "^0.27.0", "eslint": "^9.39.1", - "prettier": "^3.6.2", + "prettier": "^3.7.4", "tsx": "4.20.4", "typescript": "^5.9.3" } diff --git a/packages/form/src/types.ts b/packages/form/src/types.ts index 4c6c1363a..78e3cdeb4 100644 --- a/packages/form/src/types.ts +++ b/packages/form/src/types.ts @@ -1,7 +1,9 @@ import type { ChangeEvent, FocusEvent } from "react"; -export interface InputPropsFor - extends BasePropsFor { +export interface InputPropsFor extends BasePropsFor< + TOnChangeArg, + TComponent +> { value?: T; defaultValue?: T; } diff --git a/packages/forms-collection/src/upload-media/upload-media.tsx b/packages/forms-collection/src/upload-media/upload-media.tsx index 1a0779259..9da7a52d1 100644 --- a/packages/forms-collection/src/upload-media/upload-media.tsx +++ b/packages/forms-collection/src/upload-media/upload-media.tsx @@ -16,7 +16,19 @@ interface UploadMediaProps { export const UploadMedia = ({ children, onSettled, onSuccess, multiple = false }: UploadMediaProps) => { const t = useI18n(); - const { mutateAsync, isPending } = clientApi.media.uploadMedia.useMutation(); + const { mutateAsync, isPending } = clientApi.media.uploadMedia.useMutation({ + async onSuccess(mediaIds) { + await onSuccess?.( + mediaIds.map((id) => ({ + id, + url: `/api/user-medias/${id}`, + })), + ); + }, + async onSettled() { + await onSettled?.(); + }, + }); const handleFileUploadAsync = async (files: File[] | File | null) => { if (!files || (Array.isArray(files) && files.length === 0)) return; @@ -24,25 +36,16 @@ export const UploadMedia = ({ children, onSettled, onSuccess, multiple = false } const formData = new FormData(); filesArray.forEach((file) => formData.append("files", file)); await mutateAsync(formData, { - async onSuccess(mediaIds) { + onSuccess() { showSuccessNotification({ message: t("media.action.upload.notification.success.message"), }); - await onSuccess?.( - mediaIds.map((id) => ({ - id, - url: `/api/user-medias/${id}`, - })), - ); }, onError() { showErrorNotification({ message: t("media.action.upload.notification.error.message"), }); }, - async onSettled() { - await onSettled?.(); - }, }); }; diff --git a/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx b/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx index 500e8540b..617bf6403 100644 --- a/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx +++ b/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx @@ -2,7 +2,6 @@ import type { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; -import type { MaybePromise } from "@homarr/common/types"; import { AppForm } from "@homarr/forms-collection"; import { createModal } from "@homarr/modals"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; @@ -10,7 +9,7 @@ import { useI18n, useScopedI18n } from "@homarr/translation/client"; import type { appManageSchema } from "@homarr/validation/app"; interface QuickAddAppModalProps { - onClose: (createdApp: Omit) => MaybePromise; + onClose: (createdApp: Omit) => void; } export const QuickAddAppModal = createModal(({ actions, innerProps }) => { @@ -28,13 +27,13 @@ export const QuickAddAppModal = createModal(({ actions, i const handleSubmit = (values: z.infer) => { mutate(values, { - async onSuccess(app) { + onSuccess(app) { showSuccessNotification({ title: tScoped("success.title"), message: tScoped("success.message"), }); - await innerProps.onClose(app); + innerProps.onClose(app); actions.closeModal(); }, }); diff --git a/packages/modals-collection/src/boards/duplicate-board-modal.tsx b/packages/modals-collection/src/boards/duplicate-board-modal.tsx index 441e16edf..85cfaed17 100644 --- a/packages/modals-collection/src/boards/duplicate-board-modal.tsx +++ b/packages/modals-collection/src/boards/duplicate-board-modal.tsx @@ -1,7 +1,7 @@ import { Button, Group, Stack, Text, TextInput } from "@mantine/core"; import { clientApi } from "@homarr/api/client"; -import type { MaybePromise } from "@homarr/common/types"; +import { revalidatePathActionAsync } from "@homarr/common/client"; import { useZodForm } from "@homarr/form"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; import { useI18n } from "@homarr/translation/client"; @@ -15,7 +15,6 @@ interface InnerProps { id: string; name: string; }; - onSuccess: () => MaybePromise; } export const DuplicateBoardModal = createModal(({ actions, innerProps }) => { @@ -27,7 +26,11 @@ export const DuplicateBoardModal = createModal(({ actions, innerProp }, }); const boardNameStatus = useBoardNameStatus(form.values.name); - const { mutateAsync, isPending } = clientApi.board.duplicateBoard.useMutation(); + const { mutateAsync, isPending } = clientApi.board.duplicateBoard.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/boards"); + }, + }); return (
(({ actions, innerProp id: innerProps.board.id, }, { - async onSuccess() { + onSuccess() { actions.closeModal(); showSuccessNotification({ title: t("board.action.duplicate.notification.success.title"), message: t("board.action.duplicate.notification.success.message"), }); - await innerProps.onSuccess(); }, onError() { showErrorNotification({ diff --git a/packages/modals-collection/src/boards/import-board-modal.tsx b/packages/modals-collection/src/boards/import-board-modal.tsx index 1fd5cbfdf..3ddbd8324 100644 --- a/packages/modals-collection/src/boards/import-board-modal.tsx +++ b/packages/modals-collection/src/boards/import-board-modal.tsx @@ -65,7 +65,11 @@ export const ImportBoardModal = createModal(({ actions }) => { }, ); - const { mutateAsync, isPending } = clientApi.board.importOldmarrConfig.useMutation(); + const { mutateAsync, isPending } = clientApi.board.importOldmarrConfig.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/boards"); + }, + }); const boardNameStatus = useBoardNameStatus(form.values.configuration.name); const handleSubmitAsync = async (values: { file: File; configuration: OldmarrImportConfiguration }) => { @@ -74,9 +78,8 @@ export const ImportBoardModal = createModal(({ actions }) => { formData.set("configuration", JSON.stringify(values.configuration)); await mutateAsync(formData, { - async onSuccess() { + onSuccess() { actions.closeModal(); - await revalidatePathActionAsync("/manage/boards"); showSuccessNotification({ title: tOldImport("notification.success.title"), message: tOldImport("notification.success.message"), diff --git a/packages/modals-collection/src/certificates/add-certificate-modal.tsx b/packages/modals-collection/src/certificates/add-certificate-modal.tsx index 100ee13cd..b414d0c6a 100644 --- a/packages/modals-collection/src/certificates/add-certificate-modal.tsx +++ b/packages/modals-collection/src/certificates/add-certificate-modal.tsx @@ -27,7 +27,11 @@ export const AddCertificateModal = createModal(({ actions, innerProp }, }, ); - const { mutateAsync } = clientApi.certificates.addCertificate.useMutation(); + const { mutateAsync } = clientApi.certificates.addCertificate.useMutation({ + async onSuccess() { + await innerProps.onSuccess?.(); + }, + }); return ( (({ actions, innerProp const formData = new FormData(); formData.set("file", values.file); await mutateAsync(formData, { - async onSuccess() { + onSuccess() { showSuccessNotification({ title: t("certificate.action.create.notification.success.title"), message: t("certificate.action.create.notification.success.message"), }); - await innerProps.onSuccess?.(); actions.closeModal(); }, onError() { diff --git a/packages/old-import/src/components/initial/token-modal.tsx b/packages/old-import/src/components/initial/token-modal.tsx index d519d312f..0bc5920f5 100644 --- a/packages/old-import/src/components/initial/token-modal.tsx +++ b/packages/old-import/src/components/initial/token-modal.tsx @@ -29,10 +29,10 @@ export const ImportTokenModal = createModal(({ actions, innerProps } mutate( { checksum: innerProps.checksum, token: values.token }, { - async onSuccess(isValid) { + onSuccess(isValid) { if (isValid) { actions.closeModal(); - await innerProps.onSuccessAsync(values.token); + void innerProps.onSuccessAsync(values.token); } else { showErrorNotification({ title: tTokenModal("notification.error.title"), diff --git a/packages/spotlight/package.json b/packages/spotlight/package.json index 4d71626a5..b161a72c9 100644 --- a/packages/spotlight/package.json +++ b/packages/spotlight/package.json @@ -37,7 +37,7 @@ "@mantine/hooks": "^8.3.9", "@mantine/spotlight": "^8.3.9", "@tabler/icons-react": "^3.35.0", - "jotai": "^2.15.1", + "jotai": "^2.15.2", "next": "16.0.7", "react": "19.2.0", "react-dom": "19.2.0", diff --git a/packages/translation/package.json b/packages/translation/package.json index 26011518e..d6fb022ce 100644 --- a/packages/translation/package.json +++ b/packages/translation/package.json @@ -33,7 +33,7 @@ "deepmerge": "4.3.1", "mantine-react-table": "2.0.0-beta.9", "next": "16.0.7", - "next-intl": "4.5.6", + "next-intl": "4.5.8", "react": "19.2.0", "react-dom": "19.2.0" }, diff --git a/packages/translation/src/lang/da.json b/packages/translation/src/lang/da.json index 7821d59bd..dc7da9370 100644 --- a/packages/translation/src/lang/da.json +++ b/packages/translation/src/lang/da.json @@ -2232,7 +2232,7 @@ "unknown": "Ukendt", "pending": "Afventende", "processing": "Behandler", - "requested": "", + "requested": "Anmodet", "partiallyAvailable": "Delvis", "available": "Tilgængelig", "blacklisted": "Blacklistet", diff --git a/packages/translation/src/lang/nl.json b/packages/translation/src/lang/nl.json index 53586967e..da8036109 100644 --- a/packages/translation/src/lang/nl.json +++ b/packages/translation/src/lang/nl.json @@ -747,7 +747,7 @@ }, "statusCode": { "title": "Antwoord fout", - "description": "", + "description": "Onverwachte {statusCode} ({reason}) reactie van . Controleer of de URL wijst naar de basis-URL van de integratie.", "otherDescription": "", "reason": { "badRequest": "Onjuist verzoek", @@ -2232,7 +2232,7 @@ "unknown": "Onbekend", "pending": "In afwachting", "processing": "Verwerken", - "requested": "", + "requested": "Aangevraagd", "partiallyAvailable": "Gedeeltelijk", "available": "Beschikbaar", "blacklisted": "Geblacklist", diff --git a/packages/ui/src/components/select-with-custom-items.tsx b/packages/ui/src/components/select-with-custom-items.tsx index d3ff3dff8..b1fe554e4 100644 --- a/packages/ui/src/components/select-with-custom-items.tsx +++ b/packages/ui/src/components/select-with-custom-items.tsx @@ -10,8 +10,10 @@ interface BaseSelectItem { label: string; } -export interface SelectWithCustomItemsProps - extends Pick { +export interface SelectWithCustomItemsProps extends Pick< + SelectProps, + "label" | "error" | "defaultValue" | "value" | "onChange" | "placeholder" | "clearable" +> { data: TSelectItem[]; description?: string; withAsterisk?: boolean; diff --git a/packages/validation/src/user.ts b/packages/validation/src/user.ts index 788eb2750..c00d9226d 100644 --- a/packages/validation/src/user.ts +++ b/packages/validation/src/user.ts @@ -69,6 +69,17 @@ export const userSignInSchema = z.object({ password: z.string().min(1), }); +export const ldapSignInSchema = z.object({ + name: z + .string() + .min(1) + // Prevent special characters that could lead to LDAP injection attacks + .regex(/^[^\\,+<>;"=)(*|!&]+$/, { + message: "Invalid characters in ldap username", + }), + password: z.string().min(1), +}); + export const userRegistrationSchema = addConfirmPasswordRefinement( z.object({ username: usernameSchema, diff --git a/packages/widgets/src/_inputs/widget-app-input.tsx b/packages/widgets/src/_inputs/widget-app-input.tsx index 2138258c2..4640a7889 100644 --- a/packages/widgets/src/_inputs/widget-app-input.tsx +++ b/packages/widgets/src/_inputs/widget-app-input.tsx @@ -69,10 +69,10 @@ export const WidgetAppInput = ({ property, kind }: CommonWidgetInputProps<"app"> variant="default" onClick={() => openModal({ - // eslint-disable-next-line no-restricted-syntax - async onClose(createdAppId) { - await refetch(); - form.setFieldValue(`options.${property}`, createdAppId); + onClose(createdAppId) { + void refetch().then(() => { + form.setFieldValue(`options.${property}`, createdAppId); + }); }, }) } diff --git a/packages/widgets/src/docker/component.tsx b/packages/widgets/src/docker/component.tsx index a17d365ee..0687b7f18 100644 --- a/packages/widgets/src/docker/component.tsx +++ b/packages/widgets/src/docker/component.tsx @@ -111,9 +111,13 @@ const createColumns = ( header: t("action.title"), Cell({ row }) { const utils = clientApi.useUtils(); - const { mutateAsync: startContainer } = clientApi.docker.startAll.useMutation(); - const { mutateAsync: stopContainer } = clientApi.docker.stopAll.useMutation(); - const { mutateAsync: restartContainer } = clientApi.docker.restartAll.useMutation(); + // eslint-disable-next-line no-restricted-syntax + const onSettled = async () => { + await utils.docker.getContainers.invalidate(); + }; + const { mutateAsync: startContainer } = clientApi.docker.startAll.useMutation({ onSettled }); + const { mutateAsync: stopContainer } = clientApi.docker.stopAll.useMutation({ onSettled }); + const { mutateAsync: restartContainer } = clientApi.docker.restartAll.useMutation({ onSettled }); const handleActionAsync = async (action: "start" | "stop" | "restart") => { const mutation = action === "start" ? startContainer : action === "stop" ? stopContainer : restartContainer; @@ -121,9 +125,6 @@ const createColumns = ( await mutation( { ids: [row.original.id] }, { - async onSettled() { - await utils.docker.getContainers.invalidate(); - }, onSuccess() { showSuccessNotification({ title: t(`action.${action}.notification.success.title`), diff --git a/packages/widgets/src/options.ts b/packages/widgets/src/options.ts index d0fe2cdfb..2aa93b2cf 100644 --- a/packages/widgets/src/options.ts +++ b/packages/widgets/src/options.ts @@ -18,14 +18,17 @@ interface TextInput extends CommonInput { validate?: z.ZodType; } -interface MultiSelectInput - extends CommonInput[]> { +interface MultiSelectInput extends CommonInput< + inferSelectOptionValue[] +> { options: TOptions; searchable?: boolean; } -export interface SortableItemListInput - extends Omit, "withDescription"> { +export interface SortableItemListInput extends Omit< + CommonInput, + "withDescription" +> { AddButton: (props: { addItem: (item: TItem) => void; values: TOptionValue[] }) => React.ReactNode; ItemComponent: (props: { item: TItem; @@ -37,8 +40,9 @@ export interface SortableItemListInput { data: TItem[] | undefined; isLoading: boolean; error: unknown }; } -interface SelectInput - extends CommonInput> { +interface SelectInput extends CommonInput< + inferSelectOptionValue +> { options: TOptions; searchable?: boolean; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 232fbc460..d52d13771 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,7 +23,7 @@ overrides: tar-fs@>=3.0.0 <3.0.9: '>=3.1.1' tar-fs@>=2.0.0 <2.1.3: '>=3.1.1' tmp@<=0.2.3: '>=0.2.5' - vite@>=5.0.0 <=5.4.18: '>=7.2.4' + vite@>=5.0.0 <=5.4.18: '>=7.2.6' patchedDependencies: '@types/node-unifi': @@ -68,11 +68,11 @@ importers: specifier: ^5.1.1 version: 5.1.1(vite@7.1.12(@types/node@24.10.1)(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1)) '@vitest/coverage-v8': - specifier: ^4.0.14 - version: 4.0.14(vitest@4.0.14) + specifier: ^4.0.15 + version: 4.0.15(vitest@4.0.15) '@vitest/ui': - specifier: ^4.0.14 - version: 4.0.14(vitest@4.0.14) + specifier: ^4.0.15 + version: 4.0.15(vitest@4.0.15) conventional-changelog-conventionalcommits: specifier: ^9.1.0 version: 9.1.0 @@ -86,8 +86,8 @@ importers: specifier: ^2.2.3 version: 2.2.3 prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.7.4 + version: 3.7.4 semantic-release: specifier: ^25.0.2 version: 25.0.2(typescript@5.9.3) @@ -104,8 +104,8 @@ importers: specifier: ^5.1.4 version: 5.1.4(typescript@5.9.3)(vite@7.1.12(@types/node@24.10.1)(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1)) vitest: - specifier: ^4.0.14 - version: 4.0.14(@types/node@24.10.1)(@vitest/ui@4.0.14)(jsdom@27.2.0(postcss@8.5.6))(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1) + specifier: ^4.0.15 + version: 4.0.15(@types/node@24.10.1)(@vitest/ui@4.0.15)(jsdom@27.2.0(postcss@8.5.6))(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1) apps/nextjs: dependencies: @@ -287,14 +287,14 @@ importers: specifier: ^7.5.0 version: 7.5.0 glob: - specifier: ^12.0.0 - version: 12.0.0 + specifier: ^13.0.0 + version: 13.0.0 isomorphic-dompurify: specifier: ^2.33.0 version: 2.33.0(postcss@8.5.6) jotai: - specifier: ^2.15.1 - version: 2.15.1(@babel/core@7.26.0)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.0) + specifier: ^2.15.2 + version: 2.15.2(@babel/core@7.26.0)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.0) mantine-react-table: specifier: 2.0.0-beta.9 version: 2.0.0-beta.9(@mantine/core@8.3.9(@mantine/hooks@8.3.9(react@19.2.0))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@mantine/dates@8.3.9(@mantine/core@8.3.9(@mantine/hooks@8.3.9(react@19.2.0))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@mantine/hooks@8.3.9(react@19.2.0))(dayjs@1.11.19)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@mantine/hooks@8.3.9(react@19.2.0))(@tabler/icons-react@3.35.0(react@19.2.0))(clsx@2.1.1)(dayjs@1.11.19)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -372,8 +372,8 @@ importers: specifier: ^2.1.0 version: 2.1.0(webpack@5.94.0(@swc/core@1.15.3)) prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.7.4 + version: 3.7.4 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -469,8 +469,8 @@ importers: specifier: ^9.39.1 version: 9.39.1 prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.7.4 + version: 3.7.4 tsx: specifier: 4.20.4 version: 4.20.4 @@ -533,8 +533,8 @@ importers: specifier: ^9.39.1 version: 9.39.1 prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.7.4 + version: 3.7.4 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -691,8 +691,8 @@ importers: specifier: ^9.39.1 version: 9.39.1 prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.7.4 + version: 3.7.4 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -770,8 +770,8 @@ importers: specifier: ^9.39.1 version: 9.39.1 prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.7.4 + version: 3.7.4 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -1218,8 +1218,8 @@ importers: specifier: ^9.39.1 version: 9.39.1 prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.7.4 + version: 3.7.4 tsx: specifier: 4.20.4 version: 4.20.4 @@ -2052,8 +2052,8 @@ importers: specifier: ^3.35.0 version: 3.35.0(react@19.2.0) jotai: - specifier: ^2.15.1 - version: 2.15.1(@babel/core@7.28.5)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.0) + specifier: ^2.15.2 + version: 2.15.2(@babel/core@7.28.5)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.0) next: specifier: 16.0.7 version: 16.0.7(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.2) @@ -2104,8 +2104,8 @@ importers: specifier: 16.0.7 version: 16.0.7(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.2) next-intl: - specifier: 4.5.6 - version: 4.5.6(next@16.0.7(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.2))(react@19.2.0)(typescript@5.9.3) + specifier: 4.5.8 + version: 4.5.8(next@16.0.7(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.2))(react@19.2.0)(typescript@5.9.3) react: specifier: 19.2.0 version: 19.2.0 @@ -2421,7 +2421,7 @@ importers: version: 2.6.1(eslint@9.39.1)(turbo@2.6.1) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) + version: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) eslint-plugin-jsx-a11y: specifier: ^6.10.2 version: 6.10.2(eslint@9.39.1) @@ -2432,8 +2432,8 @@ importers: specifier: ^6.1.1 version: 6.1.1(eslint@9.39.1) typescript-eslint: - specifier: ^8.46.2 - version: 8.46.2(eslint@9.39.1)(typescript@5.9.3) + specifier: ^8.48.1 + version: 8.48.1(eslint@9.39.1)(typescript@5.9.3) devDependencies: '@homarr/prettier-config': specifier: workspace:^0.1.0 @@ -2454,17 +2454,17 @@ importers: dependencies: '@ianvs/prettier-plugin-sort-imports': specifier: ^4.7.0 - version: 4.7.0(prettier@3.6.2) + version: 4.7.0(prettier@3.7.4) prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.7.4 + version: 3.7.4 devDependencies: '@homarr/tsconfig': specifier: workspace:^0.1.0 version: link:../typescript prettier-plugin-packagejson: specifier: ^2.5.20 - version: 2.5.20(prettier@3.6.2) + version: 2.5.20(prettier@3.7.4) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -3402,78 +3402,92 @@ packages: resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.3': resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.3': resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.3': resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.3': resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.3': resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.3': resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.4': resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.4': resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.4': resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.4': resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.4': resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.4': resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.4': resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.4': resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} @@ -3711,24 +3725,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@16.0.7': resolution: {integrity: sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@16.0.7': resolution: {integrity: sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@16.0.7': resolution: {integrity: sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@16.0.7': resolution: {integrity: sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==} @@ -3911,30 +3929,35 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-glibc@2.4.1': resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.4.1': resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.4.1': resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.4.1': resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-win32-arm64@2.4.1': resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} @@ -4069,61 +4092,73 @@ packages: resolution: {integrity: sha512-3zEuZsXfKaw8n/yF7t8N6NNdhyFw3s8xJTqjbTDXlipwrEHo4GtIKcMJr5Ed29leLpB9AugtAQpAHW0jvtKKaQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.48.1': resolution: {integrity: sha512-leo9tOIlKrcBmmEypzunV/2w946JeLbTdDlwEZ7OnnsUyelZ72NMnT4B2vsikSgwQifjnJUbdXzuW4ToN1wV+Q==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.48.1': resolution: {integrity: sha512-Vy/WS4z4jEyvnJm+CnPfExIv5sSKqZrUr98h03hpAMbE2aI0aD2wvK6GiSe8Gx2wGp3eD81cYDpLLBqNb2ydwQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.48.1': resolution: {integrity: sha512-x5Kzn7XTwIssU9UYqWDB9VpLpfHYuXw5c6bJr4Mzv9kIv242vmJHbI5PJJEnmBYitUIfoMCODDhR7KoZLot2VQ==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.48.1': resolution: {integrity: sha512-yzCaBbwkkWt/EcgJOKDUdUpMHjhiZT/eDktOPWvSRpqrVE04p0Nd6EGV4/g7MARXXeOqstflqsKuXVM3H9wOIQ==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.48.1': resolution: {integrity: sha512-UK0WzWUjMAJccHIeOpPhPcKBqax7QFg47hwZTp6kiMhQHeOYJeaMwzeRZe1q5IiTKsaLnHu9s6toSYVUlZ2QtQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.48.1': resolution: {integrity: sha512-3NADEIlt+aCdCbWVZ7D3tBjBX1lHpXxcvrLt/kdXTiBrOds8APTdtk2yRL2GgmnSVeX4YS1JIf0imFujg78vpw==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.48.1': resolution: {integrity: sha512-euuwm/QTXAMOcyiFCcrx0/S2jGvFlKJ2Iro8rsmYL53dlblp3LkUQVFzEidHhvIPPvcIsxDhl2wkBE+I6YVGzA==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.48.1': resolution: {integrity: sha512-w8mULUjmPdWLJgmTYJx/W6Qhln1a+yqvgwmGXcQl2vFBkWsKGUBRbtLRuKJUln8Uaimf07zgJNxOhHOvjSQmBQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.48.1': resolution: {integrity: sha512-90taWXCWxTbClWuMZD0DKYohY1EovA+W5iytpE89oUPmT5O1HFdf8cuuVIylE6vCbrGdIGv85lVRzTcpTRZ+kA==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.6.1': resolution: {integrity: sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.48.1': resolution: {integrity: sha512-2Gu29SkFh1FfTRuN1GR1afMuND2GKzlORQUP3mNMJbqdndOg7gNsa81JnORctazHRokiDzQ5+MLE5XYmZW5VWg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.48.1': resolution: {integrity: sha512-6kQFR1WuAO50bxkIlAVeIYsz3RUx+xymwhTo9j94dJ+kmHe9ly7muH23sdfWduD0BA8pD9/yhonUvAjxGh34jQ==} @@ -4340,24 +4375,28 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] '@swc/core-linux-arm64-musl@1.15.3': resolution: {integrity: sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] '@swc/core-linux-x64-gnu@1.15.3': resolution: {integrity: sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] '@swc/core-linux-x64-musl@1.15.3': resolution: {integrity: sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] '@swc/core-win32-arm64-msvc@1.15.3': resolution: {integrity: sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==} @@ -5022,63 +5061,63 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.46.2': - resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} + '@typescript-eslint/eslint-plugin@8.48.1': + resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.2 + '@typescript-eslint/parser': ^8.48.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.2': - resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + '@typescript-eslint/parser@8.48.1': + resolution: {integrity: sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.2': - resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + '@typescript-eslint/project-service@8.48.1': + resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.46.2': - resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + '@typescript-eslint/scope-manager@8.48.1': + resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.2': - resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + '@typescript-eslint/tsconfig-utils@8.48.1': + resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.2': - resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + '@typescript-eslint/type-utils@8.48.1': + resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.46.2': - resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + '@typescript-eslint/types@8.48.1': + resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.46.2': - resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + '@typescript-eslint/typescript-estree@8.48.1': + resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.2': - resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} + '@typescript-eslint/utils@8.48.1': + resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.46.2': - resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + '@typescript-eslint/visitor-keys@8.48.1': + resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@umami/node@0.4.0': @@ -5108,22 +5147,22 @@ packages: resolution: {integrity: sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: '>=7.2.4' + vite: '>=7.2.6' - '@vitest/coverage-v8@4.0.14': - resolution: {integrity: sha512-EYHLqN/BY6b47qHH7gtMxAg++saoGmsjWmAq9MlXxAz4M0NcHh9iOyKhBZyU4yxZqOd8Xnqp80/5saeitz4Cng==} + '@vitest/coverage-v8@4.0.15': + resolution: {integrity: sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==} peerDependencies: - '@vitest/browser': 4.0.14 - vitest: 4.0.14 + '@vitest/browser': 4.0.15 + vitest: 4.0.15 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.14': - resolution: {integrity: sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==} + '@vitest/expect@4.0.15': + resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} - '@vitest/mocker@4.0.14': - resolution: {integrity: sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==} + '@vitest/mocker@4.0.15': + resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -5133,25 +5172,25 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.14': - resolution: {integrity: sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==} + '@vitest/pretty-format@4.0.15': + resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} - '@vitest/runner@4.0.14': - resolution: {integrity: sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==} + '@vitest/runner@4.0.15': + resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} - '@vitest/snapshot@4.0.14': - resolution: {integrity: sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==} + '@vitest/snapshot@4.0.15': + resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} - '@vitest/spy@4.0.14': - resolution: {integrity: sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==} + '@vitest/spy@4.0.15': + resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} - '@vitest/ui@4.0.14': - resolution: {integrity: sha512-fvDz8o7SQpFLoSBo6Cudv+fE85/fPCkwTnLAN85M+Jv7k59w2mSIjT9Q5px7XwGrmYqqKBEYxh/09IBGd1E7AQ==} + '@vitest/ui@4.0.15': + resolution: {integrity: sha512-sxSyJMaKp45zI0u+lHrPuZM1ZJQ8FaVD35k+UxVrha1yyvQ+TZuUYllUixwvQXlB7ixoDc7skf3lQPopZIvaQw==} peerDependencies: - vitest: 4.0.14 + vitest: 4.0.15 - '@vitest/utils@4.0.14': - resolution: {integrity: sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==} + '@vitest/utils@4.0.15': + resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -7136,10 +7175,9 @@ packages: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} hasBin: true - glob@12.0.0: - resolution: {integrity: sha512-5Qcll1z7IKgHr5g485ePDdHcNQY0k2dtv/bjYy0iuyGxQw2qSOiiXUXJ+AYQpg3HNoUMHqAruX478Jeev7UULw==} + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} engines: {node: 20 || >=22} - hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -7778,10 +7816,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - java-properties@1.0.2: resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} engines: {node: '>= 0.6.0'} @@ -7793,8 +7827,8 @@ packages: jose@6.0.8: resolution: {integrity: sha512-EyUPtOKyTYq+iMOszO42eobQllaIjJnwkZ2U93aJzNyPibCy7CEvT9UQnaCVB51IAd49gbNdCew1c0LcLTCB2g==} - jotai@2.15.1: - resolution: {integrity: sha512-yHT1HAZ3ba2Q8wgaUQ+xfBzEtcS8ie687I8XVCBinfg4bNniyqLIN+utPXWKQE93LMF5fPbQSVRZqgpcN5yd6Q==} + jotai@2.15.2: + resolution: {integrity: sha512-El86CCfXNMEOytp20NPfppqGGmcp6H6kIA+tJHdmASEUURJCYW4fh8nTHEnB8rUXEFAY1pm8PdHPwnrcPGwdEg==} engines: {node: '>=12.20.0'} peerDependencies: '@babel/core': '>=7.0.0' @@ -8403,11 +8437,11 @@ packages: nodemailer: optional: true - next-intl-swc-plugin-extractor@4.5.6: - resolution: {integrity: sha512-ApB3wGYqni8lks90UuaslnCK4a+q8I6ajEafSpknN6RDrs2hUwNuWVrjKhOuhLqNLn4kBKl+Zi5c0WKpL968ag==} + next-intl-swc-plugin-extractor@4.5.8: + resolution: {integrity: sha512-hscCKUv+5GQ0CCNbvqZ8gaxnAGToCgDTbL++jgCq8SCk/ljtZDEeQZcMk46Nm6Ynn49Q/JKF4Npo/Sq1mpbusA==} - next-intl@4.5.6: - resolution: {integrity: sha512-LD1mM9HL44NGqDus3cpIE8wqRU87GWf7rdy1g7UHceT9KJvvjER/jlmIRt3GHaoOiln16K4IbHpO2ZI6jiqiDQ==} + next-intl@4.5.8: + resolution: {integrity: sha512-BdN6494nvt09WtmW5gbWdwRhDDHC/Sg7tBMhN7xfYds3vcRCngSDXat81gmJkblw9jYOv8zXzzFJyu5VYXnJzg==} 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 @@ -9072,8 +9106,8 @@ packages: prettier: optional: true - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} engines: {node: '>=14'} hasBin: true @@ -10226,8 +10260,9 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} @@ -10530,8 +10565,8 @@ packages: types-ramda@0.30.1: resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} - typescript-eslint@8.46.2: - resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} + typescript-eslint@8.48.1: + resolution: {integrity: sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -10710,8 +10745,8 @@ packages: peerDependencies: react: '>=16.13' - use-intl@4.5.6: - resolution: {integrity: sha512-SzxrUH/X3LatVcgWVqz8ifoBK01LC3fzc8Y29Vj0QfrjLIXfGwxvJ3aapyWumBIIHsZmCR0Rx5FpKDWCc9JiOg==} + use-intl@4.5.8: + resolution: {integrity: sha512-rWPV2Sirw55BQbA/7ndUBtsikh8WXwBrUkZJ1mD35+emj/ogPPqgCZdv1DdrEFK42AjF1g5w8d3x8govhqPH6Q==} peerDependencies: react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -10804,7 +10839,7 @@ packages: vite-tsconfig-paths@5.1.4: resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: - vite: '>=7.2.4' + vite: '>=7.2.6' peerDependenciesMeta: vite: optional: true @@ -10849,18 +10884,18 @@ packages: yaml: optional: true - vitest@4.0.14: - resolution: {integrity: sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==} + vitest@4.0.15: + resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.14 - '@vitest/browser-preview': 4.0.14 - '@vitest/browser-webdriverio': 4.0.14 - '@vitest/ui': 4.0.14 + '@vitest/browser-playwright': 4.0.15 + '@vitest/browser-preview': 4.0.15 + '@vitest/browser-webdriverio': 4.0.15 + '@vitest/ui': 4.0.15 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -12085,13 +12120,13 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} - '@ianvs/prettier-plugin-sort-imports@4.7.0(prettier@3.6.2)': + '@ianvs/prettier-plugin-sort-imports@4.7.0(prettier@3.7.4)': dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.3 '@babel/traverse': 7.28.3 '@babel/types': 7.28.2 - prettier: 3.6.2 + prettier: 3.7.4 semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -14055,14 +14090,14 @@ snapshots: dependencies: '@types/node': 24.10.1 - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.2(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.48.1 eslint: 9.39.1 graphemer: 1.4.0 ignore: 7.0.4 @@ -14072,41 +14107,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.4.3 eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': + '@typescript-eslint/project-service@8.48.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3) + '@typescript-eslint/types': 8.48.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.46.2': + '@typescript-eslint/scope-manager@8.48.1': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/visitor-keys': 8.48.1 - '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.2(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.1 ts-api-utils: 2.1.0(typescript@5.9.3) @@ -14114,38 +14149,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.2': {} + '@typescript-eslint/types@8.48.1': {} - '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.48.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/project-service': 8.48.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3) + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.4.3 - fast-glob: 3.3.2 - is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.3 + tinyglobby: 0.2.15 ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.2(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.48.1(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.46.2': + '@typescript-eslint/visitor-keys@8.48.1': dependencies: - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/types': 8.48.1 eslint-visitor-keys: 4.2.1 '@umami/node@0.4.0': {} @@ -14192,10 +14226,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.14(vitest@4.0.14)': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.14 + '@vitest/utils': 4.0.15 ast-v8-to-istanbul: 0.3.8 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -14205,58 +14239,58 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.14(@types/node@24.10.1)(@vitest/ui@4.0.14)(jsdom@27.2.0(postcss@8.5.6))(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1) + vitest: 4.0.15(@types/node@24.10.1)(@vitest/ui@4.0.15)(jsdom@27.2.0(postcss@8.5.6))(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1) transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.14': + '@vitest/expect@4.0.15': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.2 - '@vitest/spy': 4.0.14 - '@vitest/utils': 4.0.14 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.14(vite@7.1.12(@types/node@24.10.1)(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1))': + '@vitest/mocker@4.0.15(vite@7.1.12(@types/node@24.10.1)(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1))': dependencies: - '@vitest/spy': 4.0.14 + '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 7.1.12(@types/node@24.10.1)(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1) - '@vitest/pretty-format@4.0.14': + '@vitest/pretty-format@4.0.15': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.14': + '@vitest/runner@4.0.15': dependencies: - '@vitest/utils': 4.0.14 + '@vitest/utils': 4.0.15 pathe: 2.0.3 - '@vitest/snapshot@4.0.14': + '@vitest/snapshot@4.0.15': dependencies: - '@vitest/pretty-format': 4.0.14 + '@vitest/pretty-format': 4.0.15 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.14': {} + '@vitest/spy@4.0.15': {} - '@vitest/ui@4.0.14(vitest@4.0.14)': + '@vitest/ui@4.0.15(vitest@4.0.15)': dependencies: - '@vitest/utils': 4.0.14 + '@vitest/utils': 4.0.15 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.14(@types/node@24.10.1)(@vitest/ui@4.0.14)(jsdom@27.2.0(postcss@8.5.6))(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1) + vitest: 4.0.15(@types/node@24.10.1)(@vitest/ui@4.0.15)(jsdom@27.2.0(postcss@8.5.6))(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1) - '@vitest/utils@4.0.14': + '@vitest/utils@4.0.15': dependencies: - '@vitest/pretty-format': 4.0.14 + '@vitest/pretty-format': 4.0.15 tinyrainbow: 3.0.3 '@webassemblyjs/ast@1.14.1': @@ -15953,17 +15987,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1)(typescript@5.9.3) eslint: 9.39.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -15974,7 +16008,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15986,7 +16020,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -16567,13 +16601,10 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@12.0.0: + glob@13.0.0: dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 minimatch: 10.1.1 minipass: 7.1.2 - package-json-from-dist: 1.0.1 path-scurry: 2.0.1 glob@7.2.3: @@ -17250,10 +17281,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - java-properties@1.0.2: {} jest-worker@27.5.1: @@ -17264,14 +17291,14 @@ snapshots: jose@6.0.8: {} - jotai@2.15.1(@babel/core@7.26.0)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.0): + jotai@2.15.2(@babel/core@7.26.0)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.0): optionalDependencies: '@babel/core': 7.26.0 '@babel/template': 7.27.2 '@types/react': 19.2.7 react: 19.2.0 - jotai@2.15.1(@babel/core@7.28.5)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.0): + jotai@2.15.2(@babel/core@7.28.5)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.0): optionalDependencies: '@babel/core': 7.28.5 '@babel/template': 7.27.2 @@ -17968,18 +17995,18 @@ snapshots: next: 16.0.7(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.2) react: 19.2.0 - next-intl-swc-plugin-extractor@4.5.6: {} + next-intl-swc-plugin-extractor@4.5.8: {} - next-intl@4.5.6(next@16.0.7(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.2))(react@19.2.0)(typescript@5.9.3): + next-intl@4.5.8(next@16.0.7(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.2))(react@19.2.0)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.5.5 '@swc/core': 1.15.3 negotiator: 1.0.0 next: 16.0.7(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.2) - next-intl-swc-plugin-extractor: 4.5.6 + next-intl-swc-plugin-extractor: 4.5.8 po-parser: 1.0.2 react: 19.2.0 - use-intl: 4.5.6(react@19.2.0) + use-intl: 4.5.8(react@19.2.0) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -18639,14 +18666,14 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.20(prettier@3.6.2): + prettier-plugin-packagejson@2.5.20(prettier@3.7.4): dependencies: sort-package-json: 3.5.0 synckit: 0.11.11 optionalDependencies: - prettier: 3.6.2 + prettier: 3.7.4 - prettier@3.6.2: {} + prettier@3.7.4: {} pretty-ms@8.0.0: dependencies: @@ -20156,7 +20183,7 @@ snapshots: tinycolor2@1.6.0: {} - tinyexec@0.3.2: {} + tinyexec@1.0.2: {} tinyglobby@0.2.14: dependencies: @@ -20480,12 +20507,12 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript-eslint@8.46.2(eslint@9.39.1)(typescript@5.9.3): + typescript-eslint@8.48.1(eslint@9.39.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.2(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: @@ -20672,7 +20699,7 @@ snapshots: dequal: 2.0.3 react: 19.2.0 - use-intl@4.5.6(react@19.2.0): + use-intl@4.5.8(react@19.2.0): dependencies: '@formatjs/fast-memoize': 2.2.1 '@schummar/icu-type-parser': 1.21.5 @@ -20804,15 +20831,15 @@ snapshots: tsx: 4.20.5 yaml: 2.5.1 - vitest@4.0.14(@types/node@24.10.1)(@vitest/ui@4.0.14)(jsdom@27.2.0(postcss@8.5.6))(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1): + vitest@4.0.15(@types/node@24.10.1)(@vitest/ui@4.0.15)(jsdom@27.2.0(postcss@8.5.6))(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1): dependencies: - '@vitest/expect': 4.0.14 - '@vitest/mocker': 4.0.14(vite@7.1.12(@types/node@24.10.1)(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1)) - '@vitest/pretty-format': 4.0.14 - '@vitest/runner': 4.0.14 - '@vitest/snapshot': 4.0.14 - '@vitest/spy': 4.0.14 - '@vitest/utils': 4.0.14 + '@vitest/expect': 4.0.15 + '@vitest/mocker': 4.0.15(vite@7.1.12(@types/node@24.10.1)(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1)) + '@vitest/pretty-format': 4.0.15 + '@vitest/runner': 4.0.15 + '@vitest/snapshot': 4.0.15 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 es-module-lexer: 1.7.0 expect-type: 1.2.2 magic-string: 0.30.21 @@ -20821,14 +20848,14 @@ snapshots: picomatch: 4.0.3 std-env: 3.10.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 vite: 7.1.12(@types/node@24.10.1)(sass@1.94.2)(sugarss@5.0.0(postcss@8.5.6))(terser@5.44.1)(tsx@4.20.5)(yaml@2.5.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.10.1 - '@vitest/ui': 4.0.14(vitest@4.0.14) + '@vitest/ui': 4.0.15(vitest@4.0.15) jsdom: 27.2.0(postcss@8.5.6) transitivePeerDependencies: - jiti diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index 4840848ab..90c31940b 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -24,7 +24,7 @@ "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^6.1.1", - "typescript-eslint": "^8.46.2" + "typescript-eslint": "^8.48.1" }, "devDependencies": { "@homarr/prettier-config": "workspace:^0.1.0", diff --git a/tooling/prettier/package.json b/tooling/prettier/package.json index 845b10ad8..d91d3eb62 100644 --- a/tooling/prettier/package.json +++ b/tooling/prettier/package.json @@ -11,7 +11,7 @@ "prettier": "@homarr/prettier-config", "dependencies": { "@ianvs/prettier-plugin-sort-imports": "^4.7.0", - "prettier": "^3.6.2" + "prettier": "^3.7.4" }, "devDependencies": { "@homarr/tsconfig": "workspace:^0.1.0",