Compare commits

...

330 Commits

Author SHA1 Message Date
Alejandro Celaya
389c988ef5
Merge pull request #1760 from shlinkio/dependabot/npm_and_yarn/react-router-7.10.1
Bump react-router from 7.9.6 to 7.10.1
2025-12-08 11:05:13 +01:00
Alejandro Celaya
7e878ece93 Add missing node types 2025-12-08 11:03:47 +01:00
Alejandro Celaya
10ca9bd457 Fix typechecks 2025-12-08 10:58:40 +01:00
Alejandro Celaya
3c057c770d
Merge pull request #1756 from shlinkio/dependabot/npm_and_yarn/eslint-742f57a656
Bump typescript-eslint from 8.48.0 to 8.48.1 in the eslint group
2025-12-06 09:50:03 +01:00
dependabot[bot]
d4fc56aa55
Bump typescript-eslint from 8.48.0 to 8.48.1 in the eslint group
Bumps the eslint group with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.48.0 to 8.48.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.48.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.48.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-06 08:47:02 +00:00
dependabot[bot]
4f2f3e3aea
Bump react-router from 7.9.6 to 7.10.1
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.9.6 to 7.10.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.10.1/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.10.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-06 08:46:58 +00:00
Alejandro Celaya
2ca84e798b
Merge pull request #1757 from shlinkio/dependabot/npm_and_yarn/react-05116bf2de
Bump the react group with 2 updates
2025-12-06 09:45:46 +01:00
Alejandro Celaya
6a84137aff
Merge pull request #1758 from shlinkio/dependabot/npm_and_yarn/vite-37df895856
Bump vite from 7.2.4 to 7.2.6 in the vite group
2025-12-06 09:45:37 +01:00
Alejandro Celaya
abafbe0b21
Merge pull request #1759 from shlinkio/dependabot/npm_and_yarn/vitest-631c7359cd
Bump the vitest group with 4 updates
2025-12-06 09:45:29 +01:00
dependabot[bot]
52298d38a1
Bump the vitest group with 4 updates
Bumps the vitest group with 4 updates: [@vitest/browser-playwright](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright), [@vitest/browser](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@vitest/browser-playwright` from 4.0.14 to 4.0.15
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.15/packages/browser-playwright)

Updates `@vitest/browser` from 4.0.14 to 4.0.15
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.15/packages/browser)

Updates `@vitest/coverage-v8` from 4.0.14 to 4.0.15
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.15/packages/coverage-v8)

Updates `vitest` from 4.0.14 to 4.0.15
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.15/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/browser-playwright"
  dependency-version: 4.0.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/browser"
  dependency-version: 4.0.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.0.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.0.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-06 08:02:35 +00:00
dependabot[bot]
f973dc6116
Bump vite from 7.2.4 to 7.2.6 in the vite group
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.2.4 to 7.2.6
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.2.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.2.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-06 08:02:11 +00:00
dependabot[bot]
1a022d4d06
Bump the react group with 2 updates
Bumps the react group with 2 updates: [react](https://github.com/facebook/react/tree/HEAD/packages/react) and [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom).


Updates `react` from 19.2.0 to 19.2.1
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.1/packages/react)

Updates `react-dom` from 19.2.0 to 19.2.1
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.1/packages/react-dom)

---
updated-dependencies:
- dependency-name: react
  dependency-version: 19.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: react-dom
  dependency-version: 19.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-06 08:01:57 +00:00
Alejandro Celaya
a6d0262440
Merge pull request #1750 from shlinkio/dependabot/npm_and_yarn/eslint-e747de9977
Bump typescript-eslint from 8.47.0 to 8.48.0 in the eslint group
2025-11-29 09:24:58 +01:00
Alejandro Celaya
161fa63e12
Merge pull request #1752 from shlinkio/dependabot/npm_and_yarn/vitest-ed4ef4ee8a
Bump the vitest group with 4 updates
2025-11-29 09:24:34 +01:00
dependabot[bot]
fc8e4aa5a9
Bump typescript-eslint from 8.47.0 to 8.48.0 in the eslint group
Bumps the eslint group with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.47.0 to 8.48.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.48.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.48.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 08:16:32 +00:00
dependabot[bot]
a653a9a1c6
Bump the vitest group with 4 updates
Bumps the vitest group with 4 updates: [@vitest/browser-playwright](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright), [@vitest/browser](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@vitest/browser-playwright` from 4.0.13 to 4.0.14
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.14/packages/browser-playwright)

Updates `@vitest/browser` from 4.0.13 to 4.0.14
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.14/packages/browser)

Updates `@vitest/coverage-v8` from 4.0.13 to 4.0.14
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.14/packages/coverage-v8)

Updates `vitest` from 4.0.13 to 4.0.14
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.14/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/browser-playwright"
  dependency-version: 4.0.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/browser"
  dependency-version: 4.0.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.0.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.0.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 08:16:15 +00:00
Alejandro Celaya
6aa4e6c34e
Merge pull request #1748 from shlinkio/dependabot/npm_and_yarn/fontawesome-b344dae3d8
Bump @fortawesome/react-fontawesome from 3.1.0 to 3.1.1 in the fontawesome group
2025-11-29 09:15:55 +01:00
Alejandro Celaya
b420c7b302
Merge pull request #1749 from shlinkio/dependabot/docker/playwright-v1.57.0-noble
Bump playwright from v1.56.1-noble to v1.57.0-noble
2025-11-29 09:15:45 +01:00
Alejandro Celaya
1c5c0f4809
Merge pull request #1751 from shlinkio/dependabot/npm_and_yarn/react-a784f0e53e
Bump @types/react from 19.2.6 to 19.2.7 in the react group
2025-11-29 09:15:21 +01:00
Alejandro Celaya
c99e3be2b1
Merge pull request #1753 from shlinkio/dependabot/npm_and_yarn/playwright-1.57.0
Bump playwright from 1.56.1 to 1.57.0
2025-11-29 09:15:08 +01:00
Alejandro Celaya
24be94dfae
Merge pull request #1754 from shlinkio/dependabot/npm_and_yarn/reduxjs/toolkit-2.11.0
Bump @reduxjs/toolkit from 2.10.1 to 2.11.0
2025-11-29 09:15:00 +01:00
Alejandro Celaya
bdbedc8539
Merge pull request #1755 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-1.2.0
Bump vite-plugin-pwa from 1.1.0 to 1.2.0
2025-11-29 09:14:51 +01:00
dependabot[bot]
d23449580c
Bump vite-plugin-pwa from 1.1.0 to 1.2.0
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 1.1.0 to 1.2.0.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v1.1.0...v1.2.0)

---
updated-dependencies:
- dependency-name: vite-plugin-pwa
  dependency-version: 1.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 08:03:34 +00:00
dependabot[bot]
3ee0957a21
Bump @reduxjs/toolkit from 2.10.1 to 2.11.0
Bumps [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) from 2.10.1 to 2.11.0.
- [Release notes](https://github.com/reduxjs/redux-toolkit/releases)
- [Commits](https://github.com/reduxjs/redux-toolkit/compare/v2.10.1...v2.11.0)

---
updated-dependencies:
- dependency-name: "@reduxjs/toolkit"
  dependency-version: 2.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 08:03:21 +00:00
dependabot[bot]
1077e220a8
Bump playwright from 1.56.1 to 1.57.0
Bumps [playwright](https://github.com/microsoft/playwright) from 1.56.1 to 1.57.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.56.1...v1.57.0)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.57.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 08:03:14 +00:00
dependabot[bot]
41794ee38c
Bump @types/react from 19.2.6 to 19.2.7 in the react group
Bumps the react group with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 19.2.6 to 19.2.7
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 08:02:22 +00:00
dependabot[bot]
4e22dba6a3
Bump playwright from v1.56.1-noble to v1.57.0-noble
Bumps playwright from v1.56.1-noble to v1.57.0-noble.

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: v1.57.0-noble
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 08:01:44 +00:00
dependabot[bot]
1341cfb31f
Bump @fortawesome/react-fontawesome in the fontawesome group
Bumps the fontawesome group with 1 update: [@fortawesome/react-fontawesome](https://github.com/FortAwesome/react-fontawesome).


Updates `@fortawesome/react-fontawesome` from 3.1.0 to 3.1.1
- [Release notes](https://github.com/FortAwesome/react-fontawesome/releases)
- [Changelog](https://github.com/FortAwesome/react-fontawesome/blob/main/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/react-fontawesome/compare/v3.1.0...v3.1.1)

---
updated-dependencies:
- dependency-name: "@fortawesome/react-fontawesome"
  dependency-version: 3.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: fontawesome
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-29 08:01:16 +00:00
Alejandro Celaya
4b9ac8441f
Merge pull request #1747 from acelaya-forks/simplify-render-with-store
Explicitly wrap in ContainerProvider when calling renderWithStore
2025-11-24 09:18:33 +01:00
Alejandro Celaya
d11358af59 Explicitly wrap in ContainerProvider when calling renderWithStore 2025-11-24 09:15:57 +01:00
Alejandro Celaya
514162964d
Merge pull request #1742 from shlinkio/dependabot/npm_and_yarn/eslint-8d9e9546dc
Bump the eslint group with 2 updates
2025-11-22 09:22:36 +01:00
dependabot[bot]
1f11b380b6
Bump the eslint group with 2 updates
Bumps the eslint group with 2 updates: [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@stylistic/eslint-plugin` from 5.5.0 to 5.6.1
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.6.1/packages/eslint-plugin)

Updates `typescript-eslint` from 8.46.4 to 8.47.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.47.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@stylistic/eslint-plugin"
  dependency-version: 5.6.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.47.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-22 08:19:38 +00:00
Alejandro Celaya
4fcb2ebb25
Merge pull request #1743 from shlinkio/dependabot/npm_and_yarn/react-ad1875d9fa
Bump @types/react from 19.2.5 to 19.2.6 in the react group
2025-11-22 09:17:25 +01:00
Alejandro Celaya
5f3914efd5
Merge pull request #1744 from shlinkio/dependabot/npm_and_yarn/vite-939f50a5f3
Bump vite from 7.2.2 to 7.2.4 in the vite group
2025-11-22 09:17:15 +01:00
Alejandro Celaya
aef736ecf7
Merge pull request #1745 from shlinkio/dependabot/npm_and_yarn/vitest-bf65707797
Bump the vitest group with 4 updates
2025-11-22 09:17:06 +01:00
Alejandro Celaya
bd1380f06c
Merge pull request #1746 from shlinkio/dependabot/npm_and_yarn/workbox-bbb55645de
Bump the workbox group with 5 updates
2025-11-22 09:16:56 +01:00
dependabot[bot]
fa00b5434f
Bump the workbox group with 5 updates
Bumps the workbox group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [workbox-core](https://github.com/googlechrome/workbox) | `7.3.0` | `7.4.0` |
| [workbox-expiration](https://github.com/googlechrome/workbox) | `7.3.0` | `7.4.0` |
| [workbox-precaching](https://github.com/googlechrome/workbox) | `7.3.0` | `7.4.0` |
| [workbox-routing](https://github.com/googlechrome/workbox) | `7.3.0` | `7.4.0` |
| [workbox-strategies](https://github.com/googlechrome/workbox) | `7.3.0` | `7.4.0` |


Updates `workbox-core` from 7.3.0 to 7.4.0
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v7.3.0...v7.4.0)

Updates `workbox-expiration` from 7.3.0 to 7.4.0
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v7.3.0...v7.4.0)

Updates `workbox-precaching` from 7.3.0 to 7.4.0
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v7.3.0...v7.4.0)

Updates `workbox-routing` from 7.3.0 to 7.4.0
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v7.3.0...v7.4.0)

Updates `workbox-strategies` from 7.3.0 to 7.4.0
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v7.3.0...v7.4.0)

---
updated-dependencies:
- dependency-name: workbox-core
  dependency-version: 7.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: workbox
- dependency-name: workbox-expiration
  dependency-version: 7.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: workbox
- dependency-name: workbox-precaching
  dependency-version: 7.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: workbox
- dependency-name: workbox-routing
  dependency-version: 7.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: workbox
- dependency-name: workbox-strategies
  dependency-version: 7.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: workbox
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-22 08:03:03 +00:00
dependabot[bot]
7ea2ccc791
Bump the vitest group with 4 updates
Bumps the vitest group with 4 updates: [@vitest/browser-playwright](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright), [@vitest/browser](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@vitest/browser-playwright` from 4.0.9 to 4.0.13
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.13/packages/browser-playwright)

Updates `@vitest/browser` from 4.0.9 to 4.0.13
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.13/packages/browser)

Updates `@vitest/coverage-v8` from 4.0.9 to 4.0.13
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.13/packages/coverage-v8)

Updates `vitest` from 4.0.9 to 4.0.13
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.13/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/browser-playwright"
  dependency-version: 4.0.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/browser"
  dependency-version: 4.0.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.0.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.0.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-22 08:02:34 +00:00
dependabot[bot]
ed79f3c230
Bump vite from 7.2.2 to 7.2.4 in the vite group
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.2.2 to 7.2.4
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.2.4/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.2.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-22 08:02:11 +00:00
dependabot[bot]
fb2efd8953
Bump @types/react from 19.2.5 to 19.2.6 in the react group
Bumps the react group with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 19.2.5 to 19.2.6
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.2.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-22 08:01:57 +00:00
Alejandro Celaya
9080dde565 Add v4.6.1 to changelog 2025-11-15 12:10:38 +01:00
Alejandro Celaya
119d909b6f
Merge pull request #1740 from acelaya-forks/remove-component-di
Do not inject components into other components
2025-11-15 12:08:40 +01:00
Alejandro Celaya
d10bea50bc Do not inject components into other components 2025-11-15 12:05:25 +01:00
Alejandro Celaya
dad3990c23
Merge pull request #1731 from acelaya-forks/redux-hooks
Set everything up to use hooks for redux actions and state
2025-11-15 11:03:56 +01:00
Alejandro Celaya
b6f1db57ee Add context test 2025-11-15 10:57:39 +01:00
Alejandro Celaya
4b655761c6 Consolidate all service definitions in one module 2025-11-15 10:33:42 +01:00
Alejandro Celaya
373f0dbbbb Do not inject appupdated state or actions 2025-11-15 10:28:33 +01:00
Alejandro Celaya
f301513f5b Expose container via provider 2025-11-15 10:20:53 +01:00
Alejandro Celaya
73a885534a
Merge pull request #1735 from shlinkio/dependabot/npm_and_yarn/react-95b043e827
Bump the react group with 2 updates
2025-11-15 09:43:18 +01:00
Alejandro Celaya
e7b18ed092
Merge pull request #1739 from shlinkio/dependabot/npm_and_yarn/js-yaml-4.1.1
Bump js-yaml from 4.1.0 to 4.1.1
2025-11-15 09:40:52 +01:00
dependabot[bot]
fced67d981
Bump the react group with 2 updates
Bumps the react group with 2 updates: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) and [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom).


Updates `@types/react` from 19.2.2 to 19.2.5
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react-dom` from 19.2.2 to 19.2.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.2.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: "@types/react-dom"
  dependency-version: 19.2.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-15 08:27:51 +00:00
dependabot[bot]
af23fa878c
Bump js-yaml from 4.1.0 to 4.1.1
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1.
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.1.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-15 08:26:48 +00:00
Alejandro Celaya
728b608247
Merge pull request #1733 from shlinkio/dependabot/npm_and_yarn/shlink-dc773e2e60
Bump @shlinkio/shlink-frontend-kit from 1.3.0 to 1.3.1 in the shlink group
2025-11-15 09:26:36 +01:00
Alejandro Celaya
491ebd378d
Merge pull request #1732 from shlinkio/dependabot/npm_and_yarn/eslint-79bca83ae2
Bump typescript-eslint from 8.46.3 to 8.46.4 in the eslint group
2025-11-15 09:26:22 +01:00
Alejandro Celaya
88092fc1df
Merge pull request #1734 from shlinkio/dependabot/docker/node-25.2-alpine
Bump node from 25.1-alpine to 25.2-alpine
2025-11-15 09:26:12 +01:00
Alejandro Celaya
fb25745426
Merge pull request #1736 from shlinkio/dependabot/npm_and_yarn/vite-d91ffd34ac
Bump @vitejs/plugin-react from 5.1.0 to 5.1.1 in the vite group
2025-11-15 09:25:52 +01:00
Alejandro Celaya
c379709850
Merge pull request #1737 from shlinkio/dependabot/npm_and_yarn/vitest-78236927c4
Bump the vitest group with 4 updates
2025-11-15 09:25:43 +01:00
Alejandro Celaya
79d8e3dfaf
Merge pull request #1738 from shlinkio/dependabot/npm_and_yarn/react-router-7.9.6
Bump react-router from 7.9.5 to 7.9.6
2025-11-15 09:25:32 +01:00
dependabot[bot]
8492d47274
Bump react-router from 7.9.5 to 7.9.6
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.9.5 to 7.9.6.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.9.6/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.9.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-15 08:03:12 +00:00
dependabot[bot]
4abaa5b7fb
Bump the vitest group with 4 updates
Bumps the vitest group with 4 updates: [@vitest/browser-playwright](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright), [@vitest/browser](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@vitest/browser-playwright` from 4.0.8 to 4.0.9
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.9/packages/browser-playwright)

Updates `@vitest/browser` from 4.0.8 to 4.0.9
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.9/packages/browser)

Updates `@vitest/coverage-v8` from 4.0.8 to 4.0.9
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.9/packages/coverage-v8)

Updates `vitest` from 4.0.8 to 4.0.9
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.9/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/browser-playwright"
  dependency-version: 4.0.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/browser"
  dependency-version: 4.0.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.0.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.0.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-15 08:02:53 +00:00
dependabot[bot]
b5f77de194
Bump @vitejs/plugin-react from 5.1.0 to 5.1.1 in the vite group
Bumps the vite group with 1 update: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react).


Updates `@vitejs/plugin-react` from 5.1.0 to 5.1.1
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@5.1.1/packages/plugin-react)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 5.1.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-15 08:02:26 +00:00
dependabot[bot]
e0e0b24a6b
Bump node from 25.1-alpine to 25.2-alpine
Bumps node from 25.1-alpine to 25.2-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 25.2-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-15 08:01:55 +00:00
dependabot[bot]
74e3b8fe0b
Bump @shlinkio/shlink-frontend-kit in the shlink group
Bumps the shlink group with 1 update: [@shlinkio/shlink-frontend-kit](https://github.com/shlinkio/shlink-frontend-kit).


Updates `@shlinkio/shlink-frontend-kit` from 1.3.0 to 1.3.1
- [Release notes](https://github.com/shlinkio/shlink-frontend-kit/releases)
- [Changelog](https://github.com/shlinkio/shlink-frontend-kit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/shlinkio/shlink-frontend-kit/compare/v1.3.0...v1.3.1)

---
updated-dependencies:
- dependency-name: "@shlinkio/shlink-frontend-kit"
  dependency-version: 1.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: shlink
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-15 08:01:52 +00:00
dependabot[bot]
d5669201f7
Bump typescript-eslint from 8.46.3 to 8.46.4 in the eslint group
Bumps the eslint group with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.46.3 to 8.46.4
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.46.4/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.46.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-15 08:01:37 +00:00
Alejandro Celaya
6094994cfa Do not inject settings state or actions 2025-11-14 23:29:59 +01:00
Alejandro Celaya
9e8498b16a Do not inject remoteServers state or actions 2025-11-14 23:20:42 +01:00
Alejandro Celaya
a7f2d3224b Do not inject servers state or actions 2025-11-14 19:23:48 +01:00
Alejandro Celaya
ae7aea0e2c Infer redux types when possible 2025-11-14 14:21:14 +01:00
Alejandro Celaya
145765e3fa Enable immutable and serializable redux checks 2025-11-14 10:51:26 +01:00
Alejandro Celaya
11bbef3aca Create dedicated store module 2025-11-14 10:34:34 +01:00
Alejandro Celaya
9c1052c10b Replace usage of injected selectedServer with useSelectedServer 2025-11-14 10:27:49 +01:00
Alejandro Celaya
7890d0084a Create useSelectedServer hook and use it where reset selected server is done 2025-11-14 09:54:03 +01:00
Alejandro Celaya
b295240d28 Stop injecting dependencies in selectServer action 2025-11-14 08:50:08 +01:00
Alejandro Celaya
e9951e95a9 Set everything up to use hooks for reduc actions and state 2025-11-14 08:24:58 +01:00
Alejandro Celaya
ffc8249c22
Merge pull request #1729 from acelaya-forks/shlink-4.6
Add support for Shlink 4.6
2025-11-12 14:51:01 +01:00
Alejandro Celaya
622fcd9db6 Fixed types after updating to latest shlink components 2025-11-12 14:49:23 +01:00
Alejandro Celaya
99d6eb5f7c Add support for Shlink 4.6 2025-11-12 14:35:59 +01:00
Alejandro Celaya
8b4388edc7
Merge pull request #1723 from shlinkio/dependabot/npm_and_yarn/eslint-5b0d500e3e
Bump the eslint group with 2 updates
2025-11-08 09:30:19 +01:00
dependabot[bot]
f176ef305f
Bump the eslint group with 2 updates
Bumps the eslint group with 2 updates: [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `eslint` from 9.39.0 to 9.39.1
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v9.39.0...v9.39.1)

Updates `typescript-eslint` from 8.46.2 to 8.46.3
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.46.3/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.39.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.46.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-08 08:24:19 +00:00
Alejandro Celaya
a0953304f1
Merge pull request #1725 from shlinkio/dependabot/npm_and_yarn/vite-15e00ad86c
Bump vite from 7.1.12 to 7.2.2 in the vite group
2025-11-08 09:23:08 +01:00
Alejandro Celaya
9d31c33cb8
Merge pull request #1726 from shlinkio/dependabot/npm_and_yarn/vitest-d9446cd8fc
Bump the vitest group with 4 updates
2025-11-08 09:22:51 +01:00
Alejandro Celaya
1c748128ce
Merge pull request #1727 from shlinkio/dependabot/npm_and_yarn/tailwindcss-5957accafc
Bump the tailwindcss group with 2 updates
2025-11-08 09:22:40 +01:00
Alejandro Celaya
440a25f8e3
Merge pull request #1728 from shlinkio/dependabot/npm_and_yarn/reduxjs/toolkit-2.10.1
Bump @reduxjs/toolkit from 2.9.2 to 2.10.1
2025-11-08 09:22:31 +01:00
dependabot[bot]
9ce3e48493
Bump @reduxjs/toolkit from 2.9.2 to 2.10.1
Bumps [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) from 2.9.2 to 2.10.1.
- [Release notes](https://github.com/reduxjs/redux-toolkit/releases)
- [Commits](https://github.com/reduxjs/redux-toolkit/compare/v2.9.2...v2.10.1)

---
updated-dependencies:
- dependency-name: "@reduxjs/toolkit"
  dependency-version: 2.10.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-08 08:03:21 +00:00
dependabot[bot]
288f68fa59
Bump the tailwindcss group with 2 updates
Bumps the tailwindcss group with 2 updates: [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) and [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss).


Updates `@tailwindcss/vite` from 4.1.16 to 4.1.17
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.17/packages/@tailwindcss-vite)

Updates `tailwindcss` from 4.1.16 to 4.1.17
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.17/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.1.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
- dependency-name: tailwindcss
  dependency-version: 4.1.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-08 08:03:06 +00:00
dependabot[bot]
0b63e24338
Bump the vitest group with 4 updates
Bumps the vitest group with 4 updates: [@vitest/browser-playwright](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright), [@vitest/browser](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@vitest/browser-playwright` from 4.0.6 to 4.0.8
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.8/packages/browser-playwright)

Updates `@vitest/browser` from 4.0.6 to 4.0.8
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.8/packages/browser)

Updates `@vitest/coverage-v8` from 4.0.6 to 4.0.8
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.8/packages/coverage-v8)

Updates `vitest` from 4.0.6 to 4.0.8
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.8/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/browser-playwright"
  dependency-version: 4.0.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/browser"
  dependency-version: 4.0.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.0.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.0.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-08 08:02:47 +00:00
dependabot[bot]
5468d2fe36
Bump vite from 7.1.12 to 7.2.2 in the vite group
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.1.12 to 7.2.2
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.2.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.2.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-08 08:02:21 +00:00
Alejandro Celaya
2fa5af70be
Merge pull request #1720 from shlinkio/dependabot/npm_and_yarn/vitest-dd1699bcbc
Bump the vitest group with 4 updates
2025-11-01 13:46:41 +01:00
Alejandro Celaya
8cbd18b4ab
Merge pull request #1718 from shlinkio/dependabot/npm_and_yarn/eslint-23de6579a7
Bump eslint from 9.38.0 to 9.39.0 in the eslint group
2025-11-01 13:46:30 +01:00
Alejandro Celaya
728519de5e
Merge pull request #1719 from shlinkio/dependabot/docker/node-25.1-alpine
Bump node from 25.0-alpine to 25.1-alpine
2025-11-01 13:46:21 +01:00
Alejandro Celaya
5f0bfdf298
Merge pull request #1721 from shlinkio/dependabot/npm_and_yarn/react-router-7.9.5
Bump react-router from 7.9.4 to 7.9.5
2025-11-01 13:46:06 +01:00
Alejandro Celaya
a50a75046b
Merge pull request #1722 from shlinkio/dependabot/npm_and_yarn/csvtojson-2.0.14
Bump csvtojson from 2.0.13 to 2.0.14
2025-11-01 13:45:58 +01:00
dependabot[bot]
8bf7c12ad6
Bump csvtojson from 2.0.13 to 2.0.14
Bumps [csvtojson](https://github.com/Keyang/node-csvtojson) from 2.0.13 to 2.0.14.
- [Release notes](https://github.com/Keyang/node-csvtojson/releases)
- [Commits](https://github.com/Keyang/node-csvtojson/compare/v2.0.13...v2.0.14)

---
updated-dependencies:
- dependency-name: csvtojson
  dependency-version: 2.0.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 08:02:38 +00:00
dependabot[bot]
79e70ea324
Bump react-router from 7.9.4 to 7.9.5
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.9.4 to 7.9.5.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.9.5/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.9.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 08:02:32 +00:00
dependabot[bot]
fdfe6a0470
Bump the vitest group with 4 updates
Bumps the vitest group with 4 updates: [@vitest/browser-playwright](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright), [@vitest/browser](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@vitest/browser-playwright` from 4.0.3 to 4.0.6
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.6/packages/browser-playwright)

Updates `@vitest/browser` from 4.0.3 to 4.0.6
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.6/packages/browser)

Updates `@vitest/coverage-v8` from 4.0.3 to 4.0.6
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.6/packages/coverage-v8)

Updates `vitest` from 4.0.3 to 4.0.6
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.6/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/browser-playwright"
  dependency-version: 4.0.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/browser"
  dependency-version: 4.0.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.0.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.0.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vitest
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 08:02:13 +00:00
dependabot[bot]
3d65ed654c
Bump node from 25.0-alpine to 25.1-alpine
Bumps node from 25.0-alpine to 25.1-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 25.1-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 08:02:07 +00:00
dependabot[bot]
deab26c244
Bump eslint from 9.38.0 to 9.39.0 in the eslint group
Bumps the eslint group with 1 update: [eslint](https://github.com/eslint/eslint).


Updates `eslint` from 9.38.0 to 9.39.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v9.38.0...v9.39.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.39.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 08:01:31 +00:00
Alejandro Celaya
a7456d599b Fix coding style in vite config file 2025-10-25 09:38:47 +02:00
Alejandro Celaya
5fc213789c
Merge pull request #1714 from shlinkio/dependabot/npm_and_yarn/vitest-e531eefaae
Bump the vitest group with 3 updates
2025-10-25 09:34:26 +02:00
Alejandro Celaya
a6c1820be2 Decrease required branch coverage to 89 2025-10-25 09:32:07 +02:00
Alejandro Celaya
d6b462f112 Add @vitest/browser-playwright 2025-10-25 09:29:00 +02:00
dependabot[bot]
18b4802e60
Bump the vitest group with 3 updates
Bumps the vitest group with 3 updates: [@vitest/browser](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@vitest/browser` from 3.2.4 to 4.0.3
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.3/packages/browser)

Updates `@vitest/coverage-v8` from 3.2.4 to 4.0.3
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.3/packages/coverage-v8)

Updates `vitest` from 3.2.4 to 4.0.3
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.0.3/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/browser"
  dependency-version: 4.0.3
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: vitest
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.0.3
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.0.3
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: vitest
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 07:23:55 +00:00
Alejandro Celaya
3ddd1e380f
Merge pull request #1712 from shlinkio/dependabot/npm_and_yarn/eslint-930653e90f
Bump the eslint group with 2 updates
2025-10-25 09:21:43 +02:00
dependabot[bot]
a7278e3728
Bump the eslint group with 2 updates
Bumps the eslint group with 2 updates: [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `eslint-plugin-react-hooks` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/HEAD/packages/eslint-plugin-react-hooks)

Updates `typescript-eslint` from 8.46.1 to 8.46.2
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.46.2/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: eslint-plugin-react-hooks
  dependency-version: 7.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.46.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 07:13:21 +00:00
Alejandro Celaya
48c8d23e7b
Merge pull request #1717 from shlinkio/dependabot/npm_and_yarn/reduxjs/toolkit-2.9.2
Bump @reduxjs/toolkit from 2.9.1 to 2.9.2
2025-10-25 09:11:31 +02:00
Alejandro Celaya
6f53f44bf8
Merge pull request #1713 from shlinkio/dependabot/npm_and_yarn/vite-4b7c11b8a7
Bump the vite group with 2 updates
2025-10-25 09:11:07 +02:00
Alejandro Celaya
06ea04e382
Merge pull request #1715 from shlinkio/dependabot/npm_and_yarn/tailwindcss-67961464c6
Bump the tailwindcss group with 2 updates
2025-10-25 09:10:58 +02:00
Alejandro Celaya
7c6f434e9c
Merge pull request #1716 from shlinkio/dependabot/npm_and_yarn/csvtojson-2.0.13
Bump csvtojson from 2.0.10 to 2.0.13
2025-10-25 09:10:46 +02:00
dependabot[bot]
d9843e6bbd
Bump @reduxjs/toolkit from 2.9.1 to 2.9.2
Bumps [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) from 2.9.1 to 2.9.2.
- [Release notes](https://github.com/reduxjs/redux-toolkit/releases)
- [Commits](https://github.com/reduxjs/redux-toolkit/compare/v2.9.1...v2.9.2)

---
updated-dependencies:
- dependency-name: "@reduxjs/toolkit"
  dependency-version: 2.9.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 07:03:45 +00:00
dependabot[bot]
9655bb8ccc
Bump csvtojson from 2.0.10 to 2.0.13
Bumps [csvtojson](https://github.com/Keyang/node-csvtojson) from 2.0.10 to 2.0.13.
- [Release notes](https://github.com/Keyang/node-csvtojson/releases)
- [Commits](https://github.com/Keyang/node-csvtojson/compare/v2.0.10...v2.0.13)

---
updated-dependencies:
- dependency-name: csvtojson
  dependency-version: 2.0.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 07:03:29 +00:00
dependabot[bot]
17f7ce395d
Bump the tailwindcss group with 2 updates
Bumps the tailwindcss group with 2 updates: [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) and [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss).


Updates `@tailwindcss/vite` from 4.1.14 to 4.1.16
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.16/packages/@tailwindcss-vite)

Updates `tailwindcss` from 4.1.14 to 4.1.16
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.16/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.1.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
- dependency-name: tailwindcss
  dependency-version: 4.1.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 07:03:18 +00:00
dependabot[bot]
2dab89f774
Bump the vite group with 2 updates
Bumps the vite group with 2 updates: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `@vitejs/plugin-react` from 5.0.4 to 5.1.0
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@5.1.0/packages/plugin-react)

Updates `vite` from 7.1.10 to 7.1.12
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.1.12/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.12/packages/vite)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 5.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vite
- dependency-name: vite
  dependency-version: 7.1.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 07:02:31 +00:00
Alejandro Celaya
f8967558d8
Merge pull request #1706 from shlinkio/dependabot/npm_and_yarn/react-78a4db6db4
Bump @types/react-dom from 19.2.1 to 19.2.2 in the react group
2025-10-18 09:24:20 +02:00
Alejandro Celaya
0843893f42
Merge pull request #1707 from shlinkio/dependabot/npm_and_yarn/vite-67728f9449
Bump vite from 7.1.9 to 7.1.10 in the vite group
2025-10-18 09:21:06 +02:00
dependabot[bot]
feb9476be7
Bump vite from 7.1.9 to 7.1.10 in the vite group
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.1.9 to 7.1.10
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.10/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-18 07:14:39 +00:00
Alejandro Celaya
27f7ffa13d
Merge pull request #1703 from shlinkio/dependabot/npm_and_yarn/eslint-a235eed4eb
Bump the eslint group with 3 updates
2025-10-18 09:13:48 +02:00
Alejandro Celaya
9108c1b9c7
Merge pull request #1704 from shlinkio/dependabot/docker/node-25.0-alpine
Bump node from 24.10-alpine to 25.0-alpine
2025-10-18 09:13:39 +02:00
Alejandro Celaya
13b289654f
Merge pull request #1705 from shlinkio/dependabot/docker/playwright-v1.56.1-noble
Bump playwright from v1.56.0-noble to v1.56.1-noble
2025-10-18 09:13:29 +02:00
Alejandro Celaya
5914effb1c
Merge pull request #1708 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-1.1.0
Bump vite-plugin-pwa from 1.0.3 to 1.1.0
2025-10-18 09:12:59 +02:00
Alejandro Celaya
b22d2e8621
Merge pull request #1709 from shlinkio/dependabot/npm_and_yarn/playwright-1.56.1
Bump playwright from 1.56.0 to 1.56.1
2025-10-18 09:12:51 +02:00
Alejandro Celaya
5a4743d4f5
Merge pull request #1710 from shlinkio/dependabot/npm_and_yarn/reduxjs/toolkit-2.9.1
Bump @reduxjs/toolkit from 2.9.0 to 2.9.1
2025-10-18 09:12:42 +02:00
dependabot[bot]
b70652f11d
Bump @reduxjs/toolkit from 2.9.0 to 2.9.1
Bumps [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) from 2.9.0 to 2.9.1.
- [Release notes](https://github.com/reduxjs/redux-toolkit/releases)
- [Commits](https://github.com/reduxjs/redux-toolkit/compare/v2.9.0...v2.9.1)

---
updated-dependencies:
- dependency-name: "@reduxjs/toolkit"
  dependency-version: 2.9.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-18 07:03:20 +00:00
dependabot[bot]
17166246d6
Bump playwright from 1.56.0 to 1.56.1
Bumps [playwright](https://github.com/microsoft/playwright) from 1.56.0 to 1.56.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.56.0...v1.56.1)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.56.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-18 07:03:12 +00:00
dependabot[bot]
79b3f34187
Bump vite-plugin-pwa from 1.0.3 to 1.1.0
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 1.0.3 to 1.1.0.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v1.0.3...v1.1.0)

---
updated-dependencies:
- dependency-name: vite-plugin-pwa
  dependency-version: 1.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-18 07:02:55 +00:00
dependabot[bot]
02df7a2819
Bump @types/react-dom from 19.2.1 to 19.2.2 in the react group
Bumps the react group with 1 update: [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom).


Updates `@types/react-dom` from 19.2.1 to 19.2.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

---
updated-dependencies:
- dependency-name: "@types/react-dom"
  dependency-version: 19.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-18 07:02:20 +00:00
dependabot[bot]
761886e17a
Bump playwright from v1.56.0-noble to v1.56.1-noble
Bumps playwright from v1.56.0-noble to v1.56.1-noble.

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: v1.56.1-noble
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-18 07:02:15 +00:00
dependabot[bot]
b75d5b3bd1
Bump node from 24.10-alpine to 25.0-alpine
Bumps node from 24.10-alpine to 25.0-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 25.0-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-18 07:02:06 +00:00
dependabot[bot]
00730d47bb
Bump the eslint group with 3 updates
Bumps the eslint group with 3 updates: [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin), [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@stylistic/eslint-plugin` from 5.4.0 to 5.5.0
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.5.0/packages/eslint-plugin)

Updates `eslint` from 9.37.0 to 9.38.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v9.37.0...v9.38.0)

Updates `typescript-eslint` from 8.46.0 to 8.46.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.46.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@stylistic/eslint-plugin"
  dependency-version: 5.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: eslint
  dependency-version: 9.38.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.46.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-18 07:02:00 +00:00
Alejandro Celaya
43e47fe5f0
Merge pull request #1694 from shlinkio/dependabot/npm_and_yarn/eslint-a70c5ab51b
Bump the eslint group with 3 updates
2025-10-14 09:57:27 +02:00
Alejandro Celaya
a0bcf6205c Update to @shlinkio/eslint-config-js-coding-standard v3.7 2025-10-14 09:55:44 +02:00
dependabot[bot]
e26d66b521
Bump the eslint group with 3 updates
Bumps the eslint group with 3 updates: [@shlinkio/eslint-config-js-coding-standard](https://github.com/shlinkio/js-coding-standard), [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@shlinkio/eslint-config-js-coding-standard` from 3.6.0 to 3.6.1
- [Release notes](https://github.com/shlinkio/js-coding-standard/releases)
- [Changelog](https://github.com/shlinkio/js-coding-standard/blob/main/CHANGELOG.md)
- [Commits](https://github.com/shlinkio/js-coding-standard/compare/v3.6.0...v3.6.1)

Updates `eslint-plugin-react-hooks` from 6.1.1 to 7.0.0
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/HEAD/packages/eslint-plugin-react-hooks)

Updates `typescript-eslint` from 8.45.0 to 8.46.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.46.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@shlinkio/eslint-config-js-coding-standard"
  dependency-version: 3.6.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: eslint-plugin-react-hooks
  dependency-version: 7.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.46.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-11 07:19:00 +00:00
Alejandro Celaya
fd601b7767
Merge pull request #1695 from shlinkio/dependabot/docker/playwright-v1.56.0-noble
Bump playwright from v1.55.1-noble to v1.56.0-noble
2025-10-11 09:18:12 +02:00
Alejandro Celaya
573a248114
Merge pull request #1696 from shlinkio/dependabot/docker/node-24.10-alpine
Bump node from 24.9-alpine to 24.10-alpine
2025-10-11 09:18:01 +02:00
Alejandro Celaya
c1f15ac635
Merge pull request #1697 from shlinkio/dependabot/npm_and_yarn/shlink-2a77b0991b
Bump the shlink group with 4 updates
2025-10-11 09:17:53 +02:00
Alejandro Celaya
87c5e28472
Merge pull request #1698 from shlinkio/dependabot/npm_and_yarn/react-9219e51c5f
Bump the react group with 2 updates
2025-10-11 09:17:43 +02:00
Alejandro Celaya
27c63f590c
Merge pull request #1699 from shlinkio/dependabot/npm_and_yarn/react-external-link-2.6.1
Bump react-external-link from 2.6.0 to 2.6.1
2025-10-11 09:17:34 +02:00
Alejandro Celaya
fb0ace7eb2
Merge pull request #1700 from shlinkio/dependabot/npm_and_yarn/axe-core-4.11.0
Bump axe-core from 4.10.3 to 4.11.0
2025-10-11 09:17:25 +02:00
Alejandro Celaya
7e0786177f
Merge pull request #1701 from shlinkio/dependabot/npm_and_yarn/playwright-1.56.0
Bump playwright from 1.55.1 to 1.56.0
2025-10-11 09:17:17 +02:00
Alejandro Celaya
0bf54a4afe
Merge pull request #1702 from shlinkio/dependabot/npm_and_yarn/react-router-7.9.4
Bump react-router from 7.9.3 to 7.9.4
2025-10-11 09:17:04 +02:00
dependabot[bot]
aef1b366db
Bump react-router from 7.9.3 to 7.9.4
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.9.3 to 7.9.4.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.9.4/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.9.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-11 07:03:43 +00:00
dependabot[bot]
81df706914
Bump playwright from 1.55.1 to 1.56.0
Bumps [playwright](https://github.com/microsoft/playwright) from 1.55.1 to 1.56.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.55.1...v1.56.0)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.56.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-11 07:03:31 +00:00
dependabot[bot]
f6cf0a7d91
Bump axe-core from 4.10.3 to 4.11.0
Bumps [axe-core](https://github.com/dequelabs/axe-core) from 4.10.3 to 4.11.0.
- [Release notes](https://github.com/dequelabs/axe-core/releases)
- [Changelog](https://github.com/dequelabs/axe-core/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/dequelabs/axe-core/compare/v4.10.3...v4.11.0)

---
updated-dependencies:
- dependency-name: axe-core
  dependency-version: 4.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-11 07:03:19 +00:00
dependabot[bot]
c4e9a50760
Bump react-external-link from 2.6.0 to 2.6.1
Bumps [react-external-link](https://github.com/acelaya/react-external-link) from 2.6.0 to 2.6.1.
- [Release notes](https://github.com/acelaya/react-external-link/releases)
- [Changelog](https://github.com/acelaya/react-external-link/blob/main/CHANGELOG.md)
- [Commits](https://github.com/acelaya/react-external-link/compare/v2.6.0...v2.6.1)

---
updated-dependencies:
- dependency-name: react-external-link
  dependency-version: 2.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-11 07:03:11 +00:00
dependabot[bot]
c720b977e4
Bump the react group with 2 updates
Bumps the react group with 2 updates: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) and [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom).


Updates `@types/react` from 19.2.0 to 19.2.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react-dom` from 19.2.0 to 19.2.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: "@types/react-dom"
  dependency-version: 19.2.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-11 07:02:46 +00:00
dependabot[bot]
7de250da16
Bump the shlink group with 4 updates
Bumps the shlink group with 4 updates: [@shlinkio/data-manipulation](https://github.com/shlinkio/data-manipulation), [@shlinkio/shlink-frontend-kit](https://github.com/shlinkio/shlink-frontend-kit), [@shlinkio/shlink-js-sdk](https://github.com/shlinkio/shlink-js-sdk) and [@shlinkio/shlink-web-component](https://github.com/shlinkio/shlink-web-component).


Updates `@shlinkio/data-manipulation` from 1.0.3 to 1.0.4
- [Release notes](https://github.com/shlinkio/data-manipulation/releases)
- [Changelog](https://github.com/shlinkio/data-manipulation/blob/main/CHANGELOG.md)
- [Commits](https://github.com/shlinkio/data-manipulation/compare/v1.0.3...v1.0.4)

Updates `@shlinkio/shlink-frontend-kit` from 1.2.0 to 1.2.1
- [Release notes](https://github.com/shlinkio/shlink-frontend-kit/releases)
- [Changelog](https://github.com/shlinkio/shlink-frontend-kit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/shlinkio/shlink-frontend-kit/compare/v1.2.0...v1.2.1)

Updates `@shlinkio/shlink-js-sdk` from 2.2.1 to 2.2.2
- [Release notes](https://github.com/shlinkio/shlink-js-sdk/releases)
- [Changelog](https://github.com/shlinkio/shlink-js-sdk/blob/main/CHANGELOG.md)
- [Commits](https://github.com/shlinkio/shlink-js-sdk/compare/v2.2.1...v2.2.2)

Updates `@shlinkio/shlink-web-component` from 0.16.2 to 0.16.3
- [Release notes](https://github.com/shlinkio/shlink-web-component/releases)
- [Changelog](https://github.com/shlinkio/shlink-web-component/blob/main/CHANGELOG.md)
- [Commits](https://github.com/shlinkio/shlink-web-component/compare/v0.16.2...v0.16.3)

---
updated-dependencies:
- dependency-name: "@shlinkio/data-manipulation"
  dependency-version: 1.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: shlink
- dependency-name: "@shlinkio/shlink-frontend-kit"
  dependency-version: 1.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: shlink
- dependency-name: "@shlinkio/shlink-js-sdk"
  dependency-version: 2.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: shlink
- dependency-name: "@shlinkio/shlink-web-component"
  dependency-version: 0.16.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: shlink
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-11 07:02:28 +00:00
dependabot[bot]
06a6da0e34
Bump node from 24.9-alpine to 24.10-alpine
Bumps node from 24.9-alpine to 24.10-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 24.10-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-11 07:02:13 +00:00
dependabot[bot]
25ee80ebf6
Bump playwright from v1.55.1-noble to v1.56.0-noble
Bumps playwright from v1.55.1-noble to v1.56.0-noble.

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: v1.56.0-noble
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-11 07:02:06 +00:00
Alejandro Celaya
0101ed0e0f
Merge pull request #1688 from shlinkio/dependabot/npm_and_yarn/eslint-86f618e58d
Bump the eslint group with 3 updates
2025-10-04 11:48:37 +02:00
Alejandro Celaya
7f9d01668d Update snapshots for new react 2025-10-04 11:47:19 +02:00
Alejandro Celaya
2d94753892 Update to @shlinkio/eslint-config-js-coding-standard v3.6.0 2025-10-04 11:42:42 +02:00
dependabot[bot]
1a70d90462
Bump the eslint group with 3 updates
Bumps the eslint group with 3 updates: [eslint](https://github.com/eslint/eslint), [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `eslint` from 9.36.0 to 9.37.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v9.36.0...v9.37.0)

Updates `eslint-plugin-react-hooks` from 5.2.0 to 6.1.1
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/HEAD/packages/eslint-plugin-react-hooks)

Updates `typescript-eslint` from 8.44.1 to 8.45.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.45.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.37.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: eslint-plugin-react-hooks
  dependency-version: 6.1.1
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.45.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-04 08:52:12 +00:00
Alejandro Celaya
f262187c1b
Merge pull request #1690 from shlinkio/dependabot/npm_and_yarn/testing-c8cdf3722b
Bump @testing-library/jest-dom from 6.8.0 to 6.9.1 in the testing group
2025-10-04 10:50:34 +02:00
Alejandro Celaya
7bec7d8bad
Merge pull request #1687 from shlinkio/dependabot/npm_and_yarn/fontawesome-c69ebffc36
Bump the fontawesome group with 6 updates
2025-10-04 10:33:56 +02:00
Alejandro Celaya
1fe70aaad9
Merge pull request #1689 from shlinkio/dependabot/npm_and_yarn/react-47b46a4058
Bump the react group with 4 updates
2025-10-04 10:23:45 +02:00
dependabot[bot]
02d93043b6
Bump the react group with 4 updates
Bumps the react group with 4 updates: [react](https://github.com/facebook/react/tree/HEAD/packages/react), [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react), [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) and [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom).


Updates `react` from 19.1.1 to 19.2.0
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.0/packages/react)

Updates `@types/react` from 19.1.14 to 19.2.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `react-dom` from 19.1.1 to 19.2.0
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.0/packages/react-dom)

Updates `@types/react-dom` from 19.1.9 to 19.2.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

Updates `@types/react` from 19.1.14 to 19.2.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react-dom` from 19.1.9 to 19.2.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

---
updated-dependencies:
- dependency-name: react
  dependency-version: 19.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: react
- dependency-name: "@types/react"
  dependency-version: 19.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: react
- dependency-name: react-dom
  dependency-version: 19.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: react
- dependency-name: "@types/react-dom"
  dependency-version: 19.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: react
- dependency-name: "@types/react"
  dependency-version: 19.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: react
- dependency-name: "@types/react-dom"
  dependency-version: 19.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-04 08:23:19 +00:00
dependabot[bot]
ba577b8b38
Bump @testing-library/jest-dom from 6.8.0 to 6.9.1 in the testing group
Bumps the testing group with 1 update: [@testing-library/jest-dom](https://github.com/testing-library/jest-dom).


Updates `@testing-library/jest-dom` from 6.8.0 to 6.9.1
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.8.0...v6.9.1)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-version: 6.9.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: testing
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-04 08:23:09 +00:00
Alejandro Celaya
3f8fc9c9b1
Merge pull request #1691 from shlinkio/dependabot/npm_and_yarn/vite-8f910c0207
Bump the vite group with 2 updates
2025-10-04 10:21:57 +02:00
Alejandro Celaya
e499c5f815
Merge pull request #1692 from shlinkio/dependabot/npm_and_yarn/tailwindcss-5f78d6ad05
Bump the tailwindcss group with 2 updates
2025-10-04 10:21:02 +02:00
Alejandro Celaya
15ed804b01
Merge pull request #1693 from shlinkio/dependabot/npm_and_yarn/typescript-5.9.3
Bump typescript from 5.9.2 to 5.9.3
2025-10-04 10:20:46 +02:00
dependabot[bot]
cd1cd9a2ba
Bump typescript from 5.9.2 to 5.9.3
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.9.2 to 5.9.3.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.9.2...v5.9.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 5.9.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-04 07:04:14 +00:00
dependabot[bot]
2cfb286084
Bump the tailwindcss group with 2 updates
Bumps the tailwindcss group with 2 updates: [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) and [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss).


Updates `@tailwindcss/vite` from 4.1.13 to 4.1.14
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.14/packages/@tailwindcss-vite)

Updates `tailwindcss` from 4.1.13 to 4.1.14
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.14/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.1.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
- dependency-name: tailwindcss
  dependency-version: 4.1.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-04 07:03:58 +00:00
dependabot[bot]
e7f9fb86d2
Bump the vite group with 2 updates
Bumps the vite group with 2 updates: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `@vitejs/plugin-react` from 5.0.3 to 5.0.4
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@5.0.4/packages/plugin-react)

Updates `vite` from 7.1.7 to 7.1.9
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.9/packages/vite)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 5.0.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
- dependency-name: vite
  dependency-version: 7.1.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-04 07:03:36 +00:00
dependabot[bot]
72f3f6018a
Bump the fontawesome group with 6 updates
Bumps the fontawesome group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) | `7.0.1` | `7.1.0` |
| [@fortawesome/fontawesome-svg-core](https://github.com/FortAwesome/Font-Awesome) | `7.0.1` | `7.1.0` |
| [@fortawesome/free-brands-svg-icons](https://github.com/FortAwesome/Font-Awesome) | `7.0.1` | `7.1.0` |
| [@fortawesome/free-regular-svg-icons](https://github.com/FortAwesome/Font-Awesome) | `7.0.1` | `7.1.0` |
| [@fortawesome/free-solid-svg-icons](https://github.com/FortAwesome/Font-Awesome) | `7.0.1` | `7.1.0` |
| [@fortawesome/react-fontawesome](https://github.com/FortAwesome/react-fontawesome) | `3.0.2` | `3.1.0` |


Updates `@fortawesome/fontawesome-free` from 7.0.1 to 7.1.0
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.0.1...7.1.0)

Updates `@fortawesome/fontawesome-svg-core` from 7.0.1 to 7.1.0
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.0.1...7.1.0)

Updates `@fortawesome/free-brands-svg-icons` from 7.0.1 to 7.1.0
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.0.1...7.1.0)

Updates `@fortawesome/free-regular-svg-icons` from 7.0.1 to 7.1.0
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.0.1...7.1.0)

Updates `@fortawesome/free-solid-svg-icons` from 7.0.1 to 7.1.0
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.0.1...7.1.0)

Updates `@fortawesome/react-fontawesome` from 3.0.2 to 3.1.0
- [Release notes](https://github.com/FortAwesome/react-fontawesome/releases)
- [Changelog](https://github.com/FortAwesome/react-fontawesome/blob/main/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/react-fontawesome/compare/v3.0.2...v3.1.0)

---
updated-dependencies:
- dependency-name: "@fortawesome/fontawesome-free"
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: fontawesome
- dependency-name: "@fortawesome/fontawesome-svg-core"
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: fontawesome
- dependency-name: "@fortawesome/free-brands-svg-icons"
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: fontawesome
- dependency-name: "@fortawesome/free-regular-svg-icons"
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: fontawesome
- dependency-name: "@fortawesome/free-solid-svg-icons"
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: fontawesome
- dependency-name: "@fortawesome/react-fontawesome"
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: fontawesome
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-04 07:02:00 +00:00
Alejandro Celaya
f7b0629567
Merge pull request #1678 from shlinkio/dependabot/npm_and_yarn/eslint-516bd6cf94
Bump typescript-eslint from 8.44.0 to 8.44.1 in the eslint group
2025-09-27 10:03:20 +02:00
dependabot[bot]
91c1330796
Bump typescript-eslint from 8.44.0 to 8.44.1 in the eslint group
Bumps the eslint group with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.44.0 to 8.44.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.44.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-27 07:58:27 +00:00
Alejandro Celaya
a3d477dd7c
Merge pull request #1679 from shlinkio/dependabot/docker/node-24.9-alpine
Bump node from 24.8-alpine to 24.9-alpine
2025-09-27 09:57:44 +02:00
Alejandro Celaya
1cfb2f934d
Merge pull request #1680 from shlinkio/dependabot/npm_and_yarn/react-72e988cae6
Bump @types/react from 19.1.13 to 19.1.14 in the react group
2025-09-27 09:57:36 +02:00
Alejandro Celaya
56ed13ad3a
Merge pull request #1681 from shlinkio/dependabot/docker/playwright-v1.55.1-noble
Bump playwright from v1.55.0-noble to v1.55.1-noble
2025-09-27 09:57:25 +02:00
Alejandro Celaya
2e11ebb888
Merge pull request #1682 from shlinkio/dependabot/npm_and_yarn/vite-e5300b18a1
Bump vite from 7.1.6 to 7.1.7 in the vite group
2025-09-27 09:57:14 +02:00
Alejandro Celaya
8c67612a51
Merge pull request #1683 from shlinkio/dependabot/npm_and_yarn/react-router-7.9.3
Bump react-router from 7.9.1 to 7.9.3
2025-09-27 09:57:02 +02:00
Alejandro Celaya
c8bf455bb0
Merge pull request #1684 from shlinkio/dependabot/npm_and_yarn/playwright-1.55.1
Bump playwright from 1.55.0 to 1.55.1
2025-09-27 09:56:52 +02:00
dependabot[bot]
53b31a3824
Bump playwright from 1.55.0 to 1.55.1
Bumps [playwright](https://github.com/microsoft/playwright) from 1.55.0 to 1.55.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.55.0...v1.55.1)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.55.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-27 07:02:47 +00:00
dependabot[bot]
69d9318160
Bump react-router from 7.9.1 to 7.9.3
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.9.1 to 7.9.3.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.9.3/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.9.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-27 07:02:37 +00:00
dependabot[bot]
30d1022046
Bump vite from 7.1.6 to 7.1.7 in the vite group
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.1.6 to 7.1.7
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.7/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-27 07:02:12 +00:00
dependabot[bot]
f1aa0675b1
Bump playwright from v1.55.0-noble to v1.55.1-noble
Bumps playwright from v1.55.0-noble to v1.55.1-noble.

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: v1.55.1-noble
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-27 07:02:03 +00:00
dependabot[bot]
22c6b53934
Bump @types/react from 19.1.13 to 19.1.14 in the react group
Bumps the react group with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 19.1.13 to 19.1.14
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-27 07:01:59 +00:00
dependabot[bot]
bc29e367ef
Bump node from 24.8-alpine to 24.9-alpine
Bumps node from 24.8-alpine to 24.9-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 24.9-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-27 07:01:54 +00:00
Alejandro Celaya
19261c0a95
Merge pull request #1676 from shlinkio/dependabot/npm_and_yarn/eslint-ab7b7efe17
Bump the eslint group with 3 updates
2025-09-20 10:58:09 +02:00
dependabot[bot]
6572b8e763 Bump the eslint group with 3 updates
Bumps the eslint group with 3 updates: [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin), [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).

Updates `@stylistic/eslint-plugin` from 5.3.1 to 5.4.0
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.4.0/packages/eslint-plugin)

Updates `eslint` from 9.35.0 to 9.36.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.35.0...v9.36.0)

Updates `typescript-eslint` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@stylistic/eslint-plugin"
  dependency-version: 5.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: eslint
  dependency-version: 9.36.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.44.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-20 10:56:51 +02:00
Alejandro Celaya
f66b61818c
Merge pull request #1677 from shlinkio/dependabot/npm_and_yarn/vite-de3a9871cb
Bump the vite group with 2 updates
2025-09-20 09:35:53 +02:00
dependabot[bot]
6dd44e66fd
Bump the vite group with 2 updates
Bumps the vite group with 2 updates: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `@vitejs/plugin-react` from 5.0.2 to 5.0.3
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@5.0.3/packages/plugin-react)

Updates `vite` from 7.1.5 to 7.1.6
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.6/packages/vite)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 5.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
- dependency-name: vite
  dependency-version: 7.1.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-20 07:02:36 +00:00
Alejandro Celaya
d87358daa6
Merge pull request #1670 from shlinkio/dependabot/npm_and_yarn/vite-7.1.5
Bump vite from 7.1.4 to 7.1.5
2025-09-13 09:57:36 +02:00
dependabot[bot]
8c7b431f3f
Bump vite from 7.1.4 to 7.1.5
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.4 to 7.1.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.5
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-13 07:45:46 +00:00
Alejandro Celaya
78e523dda1
Merge pull request #1672 from shlinkio/dependabot/npm_and_yarn/react-1dd96c3a6d
Bump @types/react from 19.1.12 to 19.1.13 in the react group
2025-09-13 09:44:50 +02:00
Alejandro Celaya
9a4c306ee7
Merge pull request #1671 from shlinkio/dependabot/npm_and_yarn/eslint-ce28eb4d76
Bump typescript-eslint from 8.42.0 to 8.43.0 in the eslint group
2025-09-13 09:44:19 +02:00
Alejandro Celaya
5134f9f29c
Merge pull request #1673 from shlinkio/dependabot/docker/node-24.8-alpine
Bump node from 24.7-alpine to 24.8-alpine
2025-09-13 09:44:07 +02:00
Alejandro Celaya
624d913b49
Merge pull request #1674 from shlinkio/dependabot/npm_and_yarn/react-router-7.9.1
Bump react-router from 7.8.2 to 7.9.1
2025-09-13 09:43:57 +02:00
Alejandro Celaya
8f41404b7d
Merge pull request #1675 from shlinkio/dependabot/npm_and_yarn/chalk-5.6.2
Bump chalk from 5.6.0 to 5.6.2
2025-09-13 09:42:16 +02:00
dependabot[bot]
323cff974e
Bump chalk from 5.6.0 to 5.6.2
Bumps [chalk](https://github.com/chalk/chalk) from 5.6.0 to 5.6.2.
- [Release notes](https://github.com/chalk/chalk/releases)
- [Commits](https://github.com/chalk/chalk/compare/v5.6.0...v5.6.2)

---
updated-dependencies:
- dependency-name: chalk
  dependency-version: 5.6.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-13 07:02:43 +00:00
dependabot[bot]
04114ee860
Bump react-router from 7.8.2 to 7.9.1
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.8.2 to 7.9.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.9.1/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.9.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-13 07:02:34 +00:00
dependabot[bot]
afd9fa7295
Bump node from 24.7-alpine to 24.8-alpine
Bumps node from 24.7-alpine to 24.8-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 24.8-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-13 07:02:07 +00:00
dependabot[bot]
75cf5bf4d9
Bump @types/react from 19.1.12 to 19.1.13 in the react group
Bumps the react group with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 19.1.12 to 19.1.13
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-13 07:01:59 +00:00
dependabot[bot]
d97c0a7110
Bump typescript-eslint from 8.42.0 to 8.43.0 in the eslint group
Bumps the eslint group with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.43.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-13 07:01:39 +00:00
Alejandro Celaya
d2c50e3cf6
Merge pull request #1666 from shlinkio/dependabot/npm_and_yarn/eslint-0867cf4517
Bump the eslint group with 3 updates
2025-09-06 09:44:01 +02:00
dependabot[bot]
1b09e11467
Bump the eslint group with 3 updates
Bumps the eslint group with 3 updates: [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin), [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@stylistic/eslint-plugin` from 5.2.3 to 5.3.1
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.3.1/packages/eslint-plugin)

Updates `eslint` from 9.34.0 to 9.35.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.34.0...v9.35.0)

Updates `typescript-eslint` from 8.41.0 to 8.42.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.42.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@stylistic/eslint-plugin"
  dependency-version: 5.3.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: eslint
  dependency-version: 9.35.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.42.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-06 07:38:30 +00:00
Alejandro Celaya
7c8a0bbf58
Merge pull request #1665 from shlinkio/dependabot/npm_and_yarn/fontawesome-19f785d969
Bump the fontawesome group with 6 updates
2025-09-06 09:37:39 +02:00
Alejandro Celaya
cc547b558f
Merge pull request #1667 from shlinkio/dependabot/npm_and_yarn/vite-da77792d36
Bump vite from 7.1.3 to 7.1.4 in the vite group
2025-09-06 09:37:12 +02:00
Alejandro Celaya
137bda7be1
Merge pull request #1668 from shlinkio/dependabot/npm_and_yarn/tailwindcss-8bb14790ce
Bump the tailwindcss group with 2 updates
2025-09-06 09:37:04 +02:00
Alejandro Celaya
5fcd9dadc7
Merge pull request #1669 from shlinkio/dependabot/npm_and_yarn/reduxjs/toolkit-2.9.0
Bump @reduxjs/toolkit from 2.8.2 to 2.9.0
2025-09-06 09:36:46 +02:00
dependabot[bot]
11cd6a992e
Bump @reduxjs/toolkit from 2.8.2 to 2.9.0
Bumps [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) from 2.8.2 to 2.9.0.
- [Release notes](https://github.com/reduxjs/redux-toolkit/releases)
- [Commits](https://github.com/reduxjs/redux-toolkit/compare/v2.8.2...v2.9.0)

---
updated-dependencies:
- dependency-name: "@reduxjs/toolkit"
  dependency-version: 2.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-06 07:03:18 +00:00
dependabot[bot]
52cfd5de47
Bump the tailwindcss group with 2 updates
Bumps the tailwindcss group with 2 updates: [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) and [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss).


Updates `@tailwindcss/vite` from 4.1.12 to 4.1.13
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.13/packages/@tailwindcss-vite)

Updates `tailwindcss` from 4.1.12 to 4.1.13
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.13/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.1.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
- dependency-name: tailwindcss
  dependency-version: 4.1.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-06 07:03:04 +00:00
dependabot[bot]
d7d7ce8253
Bump vite from 7.1.3 to 7.1.4 in the vite group
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.1.3 to 7.1.4
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.4/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-06 07:02:43 +00:00
dependabot[bot]
9555df48d7
Bump the fontawesome group with 6 updates
Bumps the fontawesome group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) | `7.0.0` | `7.0.1` |
| [@fortawesome/fontawesome-svg-core](https://github.com/FortAwesome/Font-Awesome) | `7.0.0` | `7.0.1` |
| [@fortawesome/free-brands-svg-icons](https://github.com/FortAwesome/Font-Awesome) | `7.0.0` | `7.0.1` |
| [@fortawesome/free-regular-svg-icons](https://github.com/FortAwesome/Font-Awesome) | `7.0.0` | `7.0.1` |
| [@fortawesome/free-solid-svg-icons](https://github.com/FortAwesome/Font-Awesome) | `7.0.0` | `7.0.1` |
| [@fortawesome/react-fontawesome](https://github.com/FortAwesome/react-fontawesome) | `3.0.1` | `3.0.2` |


Updates `@fortawesome/fontawesome-free` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.0.0...7.0.1)

Updates `@fortawesome/fontawesome-svg-core` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.0.0...7.0.1)

Updates `@fortawesome/free-brands-svg-icons` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.0.0...7.0.1)

Updates `@fortawesome/free-regular-svg-icons` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.0.0...7.0.1)

Updates `@fortawesome/free-solid-svg-icons` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.0.0...7.0.1)

Updates `@fortawesome/react-fontawesome` from 3.0.1 to 3.0.2
- [Release notes](https://github.com/FortAwesome/react-fontawesome/releases)
- [Changelog](https://github.com/FortAwesome/react-fontawesome/blob/main/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/react-fontawesome/compare/v3.0.1...v3.0.2)

---
updated-dependencies:
- dependency-name: "@fortawesome/fontawesome-free"
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: fontawesome
- dependency-name: "@fortawesome/fontawesome-svg-core"
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: fontawesome
- dependency-name: "@fortawesome/free-brands-svg-icons"
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: fontawesome
- dependency-name: "@fortawesome/free-regular-svg-icons"
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: fontawesome
- dependency-name: "@fortawesome/free-solid-svg-icons"
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: fontawesome
- dependency-name: "@fortawesome/react-fontawesome"
  dependency-version: 3.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: fontawesome
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-06 07:01:44 +00:00
Alejandro Celaya
d14ea80b1e
Merge pull request #1663 from shlinkio/dependabot/npm_and_yarn/react-f90e31e16c
Bump the react group with 2 updates
2025-08-30 09:48:18 +02:00
dependabot[bot]
39dc1d1fe2
Bump the react group with 2 updates
Bumps the react group with 2 updates: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) and [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom).


Updates `@types/react` from 19.1.11 to 19.1.12
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react-dom` from 19.1.7 to 19.1.9
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: "@types/react-dom"
  dependency-version: 19.1.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-30 07:25:33 +00:00
Alejandro Celaya
692ed051dd
Merge pull request #1661 from shlinkio/dependabot/npm_and_yarn/eslint-b90334415e
Bump typescript-eslint from 8.40.0 to 8.41.0 in the eslint group
2025-08-30 09:24:14 +02:00
Alejandro Celaya
0060dc4b1c
Merge pull request #1662 from shlinkio/dependabot/docker/node-24.7-alpine
Bump node from 24.6-alpine to 24.7-alpine
2025-08-30 09:24:06 +02:00
Alejandro Celaya
52ed6a8851
Merge pull request #1664 from shlinkio/dependabot/npm_and_yarn/vite-fc25142585
Bump @vitejs/plugin-react from 5.0.1 to 5.0.2 in the vite group
2025-08-30 09:23:55 +02:00
dependabot[bot]
b8405b07cc
Bump @vitejs/plugin-react from 5.0.1 to 5.0.2 in the vite group
Bumps the vite group with 1 update: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react).


Updates `@vitejs/plugin-react` from 5.0.1 to 5.0.2
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@5.0.2/packages/plugin-react)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 5.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-30 07:02:11 +00:00
dependabot[bot]
f2d2056158
Bump node from 24.6-alpine to 24.7-alpine
Bumps node from 24.6-alpine to 24.7-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 24.7-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-30 07:01:39 +00:00
dependabot[bot]
3ee8094dbb
Bump typescript-eslint from 8.40.0 to 8.41.0 in the eslint group
Bumps the eslint group with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.40.0 to 8.41.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.41.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.41.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-30 07:01:34 +00:00
Alejandro Celaya
42661a7203
Merge pull request #1651 from shlinkio/dependabot/npm_and_yarn/fontawesome-79359743c1
Bump @fortawesome/react-fontawesome from 0.2.3 to 3.0.0 in the fontawesome group
2025-08-27 08:36:44 +02:00
Alejandro Celaya
07466e6c7f Update to FontAwesome react component v3 2025-08-27 08:35:05 +02:00
dependabot[bot]
7f236810ff Bump @fortawesome/react-fontawesome in the fontawesome group
Bumps the fontawesome group with 1 update: [@fortawesome/react-fontawesome](https://github.com/FortAwesome/react-fontawesome).


Updates `@fortawesome/react-fontawesome` from 0.2.3 to 3.0.0
- [Release notes](https://github.com/FortAwesome/react-fontawesome/releases)
- [Changelog](https://github.com/FortAwesome/react-fontawesome/blob/main/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/react-fontawesome/compare/0.2.3...3.0.0)

---
updated-dependencies:
- dependency-name: "@fortawesome/react-fontawesome"
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: fontawesome
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-25 09:01:37 +02:00
Alejandro Celaya
a24dfd5b3d
Merge pull request #1655 from shlinkio/dependabot/docker/playwright-v1.55.0-noble
Bump playwright from v1.54.2-noble to v1.55.0-noble
2025-08-23 09:24:32 +02:00
Alejandro Celaya
710df321f8
Merge pull request #1654 from shlinkio/dependabot/npm_and_yarn/vite-252005b4b8
Bump the vite group with 2 updates
2025-08-23 09:24:18 +02:00
Alejandro Celaya
a72bec4ce2
Merge pull request #1657 from shlinkio/dependabot/npm_and_yarn/chalk-5.6.0
Bump chalk from 5.5.0 to 5.6.0
2025-08-23 09:24:06 +02:00
Alejandro Celaya
0c63329673
Merge pull request #1658 from shlinkio/dependabot/npm_and_yarn/playwright-1.55.0
Bump playwright from 1.54.2 to 1.55.0
2025-08-23 09:23:59 +02:00
dependabot[bot]
fbe3cda5b4
Bump playwright from 1.54.2 to 1.55.0
Bumps [playwright](https://github.com/microsoft/playwright) from 1.54.2 to 1.55.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.54.2...v1.55.0)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.55.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-23 07:21:34 +00:00
dependabot[bot]
85ebbcbb38
Bump chalk from 5.5.0 to 5.6.0
Bumps [chalk](https://github.com/chalk/chalk) from 5.5.0 to 5.6.0.
- [Release notes](https://github.com/chalk/chalk/releases)
- [Commits](https://github.com/chalk/chalk/compare/v5.5.0...v5.6.0)

---
updated-dependencies:
- dependency-name: chalk
  dependency-version: 5.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-23 07:21:25 +00:00
dependabot[bot]
0ba3b9b5b8
Bump the vite group with 2 updates
Bumps the vite group with 2 updates: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `@vitejs/plugin-react` from 5.0.0 to 5.0.1
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@5.0.1/packages/plugin-react)

Updates `vite` from 7.1.2 to 7.1.3
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.3/packages/vite)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 5.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
- dependency-name: vite
  dependency-version: 7.1.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-23 07:20:51 +00:00
Alejandro Celaya
f5babdcffd
Merge pull request #1642 from shlinkio/dependabot/npm_and_yarn/react-25c181275d
Bump @types/react from 19.1.9 to 19.1.10 in the react group
2025-08-23 09:20:20 +02:00
Alejandro Celaya
3b6f9f87e8
Merge pull request #1652 from shlinkio/dependabot/npm_and_yarn/eslint-2e4861ff78
Bump the eslint group with 2 updates
2025-08-23 09:20:05 +02:00
Alejandro Celaya
322f470bd3
Merge pull request #1653 from shlinkio/dependabot/npm_and_yarn/testing-b3179ae300
Bump @testing-library/jest-dom from 6.7.0 to 6.8.0 in the testing group
2025-08-23 09:19:56 +02:00
Alejandro Celaya
38a4d841d8
Merge pull request #1656 from shlinkio/dependabot/npm_and_yarn/react-router-7.8.2
Bump react-router from 7.8.1 to 7.8.2
2025-08-23 09:19:35 +02:00
Alejandro Celaya
847318e7de
Merge pull request #1659 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-1.0.3
Bump vite-plugin-pwa from 1.0.2 to 1.0.3
2025-08-23 09:19:25 +02:00
dependabot[bot]
2ea1d9af25
Bump vite-plugin-pwa from 1.0.2 to 1.0.3
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 1.0.2 to 1.0.3.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v1.0.2...v1.0.3)

---
updated-dependencies:
- dependency-name: vite-plugin-pwa
  dependency-version: 1.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-23 07:11:46 +00:00
dependabot[bot]
21c9336c1c
Bump react-router from 7.8.1 to 7.8.2
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.8.1 to 7.8.2.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.8.2/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.8.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-23 07:11:16 +00:00
dependabot[bot]
a0765c8046
Bump playwright from v1.54.2-noble to v1.55.0-noble
Bumps playwright from v1.54.2-noble to v1.55.0-noble.

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: v1.55.0-noble
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-23 07:11:09 +00:00
dependabot[bot]
a7d06abff3
Bump @testing-library/jest-dom from 6.7.0 to 6.8.0 in the testing group
Bumps the testing group with 1 update: [@testing-library/jest-dom](https://github.com/testing-library/jest-dom).


Updates `@testing-library/jest-dom` from 6.7.0 to 6.8.0
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.7.0...v6.8.0)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-version: 6.8.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: testing
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-23 07:10:36 +00:00
dependabot[bot]
13d46a4110
Bump the eslint group with 2 updates
Bumps the eslint group with 2 updates: [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `eslint` from 9.33.0 to 9.34.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.33.0...v9.34.0)

Updates `typescript-eslint` from 8.39.1 to 8.40.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.40.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.34.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.40.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-23 07:10:21 +00:00
dependabot[bot]
6da6b33cd9
Bump @types/react from 19.1.9 to 19.1.10 in the react group
Bumps the react group with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 19.1.9 to 19.1.10
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-23 07:09:57 +00:00
Alejandro Celaya
24f73421d4
Merge pull request #1644 from shlinkio/dependabot/npm_and_yarn/vite-2ce3f9559e
Bump vite from 7.1.1 to 7.1.2 in the vite group
2025-08-16 10:26:39 +02:00
Alejandro Celaya
4a4b95de29
Merge pull request #1645 from shlinkio/dependabot/npm_and_yarn/tailwindcss-4a69c34b8b
Bump the tailwindcss group with 2 updates
2025-08-16 10:26:31 +02:00
Alejandro Celaya
ecd92b911b
Merge pull request #1647 from shlinkio/dependabot/npm_and_yarn/typescript-5.9.2
Bump typescript from 5.8.3 to 5.9.2
2025-08-16 10:26:23 +02:00
dependabot[bot]
1b8333240f
Bump the tailwindcss group with 2 updates
Bumps the tailwindcss group with 2 updates: [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) and [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss).


Updates `@tailwindcss/vite` from 4.1.11 to 4.1.12
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.12/packages/@tailwindcss-vite)

Updates `tailwindcss` from 4.1.11 to 4.1.12
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.12/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.1.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
- dependency-name: tailwindcss
  dependency-version: 4.1.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 08:17:04 +00:00
dependabot[bot]
ae54eec8d7
Bump typescript from 5.8.3 to 5.9.2
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.8.3 to 5.9.2.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.8.3...v5.9.2)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 5.9.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 08:17:02 +00:00
dependabot[bot]
152e65f405
Bump vite from 7.1.1 to 7.1.2 in the vite group
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.1.1 to 7.1.2
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 08:16:31 +00:00
Alejandro Celaya
8007e76bb2
Merge pull request #1646 from shlinkio/dependabot/npm_and_yarn/react-router-7.8.1
Bump react-router from 7.8.0 to 7.8.1
2025-08-16 10:15:20 +02:00
Alejandro Celaya
9b9e64b669
Merge pull request #1643 from shlinkio/dependabot/npm_and_yarn/testing-50a87e27f4
Bump @testing-library/jest-dom from 6.6.4 to 6.7.0 in the testing group
2025-08-16 10:15:01 +02:00
Alejandro Celaya
98acac37c4
Merge pull request #1641 from shlinkio/dependabot/npm_and_yarn/eslint-29f2bb3ab6
Bump typescript-eslint from 8.39.0 to 8.39.1 in the eslint group
2025-08-16 10:14:45 +02:00
Alejandro Celaya
8f261587d4
Merge pull request #1648 from shlinkio/dependabot/npm_and_yarn/react-external-link-2.6.0
Bump react-external-link from 2.5.0 to 2.6.0
2025-08-16 10:14:19 +02:00
Alejandro Celaya
089aa826f8
Merge pull request #1649 from shlinkio/dependabot/docker/node-24.6-alpine
Bump node from 24.5-alpine to 24.6-alpine
2025-08-16 10:14:08 +02:00
dependabot[bot]
1b5a5efb01
Bump node from 24.5-alpine to 24.6-alpine
Bumps node from 24.5-alpine to 24.6-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 24.6-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 07:35:30 +00:00
dependabot[bot]
4d313da534
Bump react-external-link from 2.5.0 to 2.6.0
Bumps [react-external-link](https://github.com/acelaya/react-external-link) from 2.5.0 to 2.6.0.
- [Release notes](https://github.com/acelaya/react-external-link/releases)
- [Changelog](https://github.com/acelaya/react-external-link/blob/main/CHANGELOG.md)
- [Commits](https://github.com/acelaya/react-external-link/compare/v2.5.0...v2.6.0)

---
updated-dependencies:
- dependency-name: react-external-link
  dependency-version: 2.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 07:12:45 +00:00
dependabot[bot]
d31b3364f6
Bump react-router from 7.8.0 to 7.8.1
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.8.0 to 7.8.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.8.1/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.8.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 07:12:26 +00:00
dependabot[bot]
f03c338a33
Bump @testing-library/jest-dom from 6.6.4 to 6.7.0 in the testing group
Bumps the testing group with 1 update: [@testing-library/jest-dom](https://github.com/testing-library/jest-dom).


Updates `@testing-library/jest-dom` from 6.6.4 to 6.7.0
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.6.4...v6.7.0)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-version: 6.7.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: testing
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 07:11:39 +00:00
dependabot[bot]
7a27f7b601
Bump typescript-eslint from 8.39.0 to 8.39.1 in the eslint group
Bumps the eslint group with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.39.0 to 8.39.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.39.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.39.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 07:11:14 +00:00
Alejandro Celaya
655ded5d5e Update changelog 2025-08-13 10:14:11 +02:00
Alejandro Celaya
6d3189f587
Merge pull request #1639 from acelaya-forks/feature/sidebar-toggle-fix
Make sure sidebar toggle is rendered only when the sidebar exists
2025-08-13 10:13:39 +02:00
Alejandro Celaya
217d076e12
Merge pull request #1638 from acelaya-forks/feature/pwa-fixes
Use new brand color in PWA
2025-08-13 10:08:07 +02:00
Alejandro Celaya
d762ae1e39 Make sure sidebar toggle is rendered only when the sidebar exists 2025-08-13 10:06:45 +02:00
Alejandro Celaya
df3ee490a9 Update changelog 2025-08-13 09:52:25 +02:00
Alejandro Celaya
bf3caf64bc Match meta theme-color with the header color in every theme 2025-08-13 09:51:02 +02:00
Alejandro Celaya
aa818430b6 Use new brand color in PWA 2025-08-13 09:32:46 +02:00
Alejandro Celaya
4d7ed8ac00
Merge pull request #1633 from shlinkio/dependabot/npm_and_yarn/chalk-5.5.0
Bump chalk from 5.4.1 to 5.5.0
2025-08-10 09:27:06 +02:00
Alejandro Celaya
fb66465b9a
Merge pull request #1632 from shlinkio/dependabot/npm_and_yarn/vite-7ea3deb48f
Bump the vite group with 2 updates
2025-08-10 09:26:58 +02:00
dependabot[bot]
14de67dbb0
Bump the vite group with 2 updates
Bumps the vite group with 2 updates: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `@vitejs/plugin-react` from 4.7.0 to 5.0.0
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@5.0.0/packages/plugin-react)

Updates `vite` from 7.0.6 to 7.1.1
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.1/packages/vite)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 5.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: vite
- dependency-name: vite
  dependency-version: 7.1.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-10 07:09:47 +00:00
dependabot[bot]
510f215d78
Bump chalk from 5.4.1 to 5.5.0
Bumps [chalk](https://github.com/chalk/chalk) from 5.4.1 to 5.5.0.
- [Release notes](https://github.com/chalk/chalk/releases)
- [Commits](https://github.com/chalk/chalk/compare/v5.4.1...v5.5.0)

---
updated-dependencies:
- dependency-name: chalk
  dependency-version: 5.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-10 07:09:38 +00:00
Alejandro Celaya
f64272adf0
Merge pull request #1630 from shlinkio/dependabot/docker/node-24.5-alpine
Bump node from 24.4-alpine to 24.5-alpine
2025-08-10 09:08:54 +02:00
Alejandro Celaya
019835e190
Merge pull request #1631 from shlinkio/dependabot/npm_and_yarn/eslint-d7b79321fd
Bump the eslint group with 3 updates
2025-08-10 09:08:38 +02:00
Alejandro Celaya
307eee32f7
Merge pull request #1634 from shlinkio/dependabot/npm_and_yarn/react-router-7.8.0
Bump react-router from 7.7.1 to 7.8.0
2025-08-10 09:08:28 +02:00
dependabot[bot]
3904be09f4
Bump react-router from 7.7.1 to 7.8.0
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.7.1 to 7.8.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.8.0/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-09 07:30:44 +00:00
dependabot[bot]
ce52db96cb
Bump the eslint group with 3 updates
Bumps the eslint group with 3 updates: [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin), [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@stylistic/eslint-plugin` from 5.2.2 to 5.2.3
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.2.3/packages/eslint-plugin)

Updates `eslint` from 9.32.0 to 9.33.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.32.0...v9.33.0)

Updates `typescript-eslint` from 8.38.0 to 8.39.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.39.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@stylistic/eslint-plugin"
  dependency-version: 5.2.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: eslint
  dependency-version: 9.33.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.39.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-09 07:29:40 +00:00
dependabot[bot]
1018680572
Bump node from 24.4-alpine to 24.5-alpine
Bumps node from 24.4-alpine to 24.5-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 24.5-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-09 07:29:14 +00:00
Alejandro Celaya
fcdb72079d Add v4.5.0 to changelog 2025-08-08 09:21:36 +02:00
Alejandro Celaya
f71b399ab9
Merge pull request #1628 from acelaya-forks/feature/shlink-web-component-0.16.1
Update to shlink-web-component 0.16.1
2025-08-08 09:18:51 +02:00
Alejandro Celaya
2a606c614d Update to shlink-web-component 0.16.1 2025-08-08 09:17:43 +02:00
Alejandro Celaya
c850d2623c
Merge pull request #1623 from shlinkio/dependabot/docker/playwright-v1.54.2-noble
Bump playwright from v1.54.1-noble to v1.54.2-noble
2025-08-02 12:52:42 +02:00
Alejandro Celaya
c263d7a74b
Merge pull request #1624 from shlinkio/dependabot/npm_and_yarn/shlink-88cbe5ab24
Bump @shlinkio/shlink-js-sdk from 2.2.0 to 2.2.1 in the shlink group
2025-08-02 12:52:33 +02:00
Alejandro Celaya
c4515b8f74
Merge pull request #1625 from shlinkio/dependabot/npm_and_yarn/react-8560841430
Bump the react group with 4 updates
2025-08-02 12:52:22 +02:00
Alejandro Celaya
8cdf1c0f1d
Merge pull request #1626 from shlinkio/dependabot/npm_and_yarn/testing-13699b331e
Bump @testing-library/jest-dom from 6.6.3 to 6.6.4 in the testing group
2025-08-02 12:52:02 +02:00
Alejandro Celaya
8b17ffb3db
Merge pull request #1627 from shlinkio/dependabot/npm_and_yarn/playwright-1.54.2
Bump playwright from 1.54.1 to 1.54.2
2025-08-02 12:51:53 +02:00
dependabot[bot]
7705b012fe
Bump playwright from 1.54.1 to 1.54.2
Bumps [playwright](https://github.com/microsoft/playwright) from 1.54.1 to 1.54.2.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.54.1...v1.54.2)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.54.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-02 07:44:16 +00:00
dependabot[bot]
c3bffe9993
Bump @testing-library/jest-dom from 6.6.3 to 6.6.4 in the testing group
Bumps the testing group with 1 update: [@testing-library/jest-dom](https://github.com/testing-library/jest-dom).


Updates `@testing-library/jest-dom` from 6.6.3 to 6.6.4
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.6.3...v6.6.4)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-version: 6.6.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: testing
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-02 07:43:50 +00:00
dependabot[bot]
4e3d8bc666
Bump the react group with 4 updates
Bumps the react group with 4 updates: [react](https://github.com/facebook/react/tree/HEAD/packages/react), [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react), [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) and [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom).


Updates `react` from 19.1.0 to 19.1.1
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.1.1/packages/react)

Updates `@types/react` from 19.1.8 to 19.1.9
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `react-dom` from 19.1.0 to 19.1.1
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.1.1/packages/react-dom)

Updates `@types/react-dom` from 19.1.6 to 19.1.7
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

Updates `@types/react` from 19.1.8 to 19.1.9
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react-dom` from 19.1.6 to 19.1.7
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

---
updated-dependencies:
- dependency-name: react
  dependency-version: 19.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: "@types/react"
  dependency-version: 19.1.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: react-dom
  dependency-version: 19.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: "@types/react-dom"
  dependency-version: 19.1.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: "@types/react"
  dependency-version: 19.1.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: "@types/react-dom"
  dependency-version: 19.1.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-02 07:43:41 +00:00
dependabot[bot]
70f556ab7d
Bump @shlinkio/shlink-js-sdk from 2.2.0 to 2.2.1 in the shlink group
Bumps the shlink group with 1 update: [@shlinkio/shlink-js-sdk](https://shlink.io).


Updates `@shlinkio/shlink-js-sdk` from 2.2.0 to 2.2.1

---
updated-dependencies:
- dependency-name: "@shlinkio/shlink-js-sdk"
  dependency-version: 2.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: shlink
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-02 07:43:17 +00:00
dependabot[bot]
23b0a92539
Bump playwright from v1.54.1-noble to v1.54.2-noble
Bumps playwright from v1.54.1-noble to v1.54.2-noble.

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: v1.54.2-noble
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-02 07:35:38 +00:00
Alejandro Celaya
7d5b5c8ba1
Merge pull request #1622 from acelaya-forks/feature/fa-7
Update to FownAwesome 7
2025-07-28 08:35:44 +02:00
Alejandro Celaya
07b64a4dc0 Update to FownAwesome 7 2025-07-28 08:34:18 +02:00
Alejandro Celaya
29081877fb
Merge pull request #1621 from shlinkio/dependabot/npm_and_yarn/react-router-7.7.1
Bump react-router from 7.7.0 to 7.7.1
2025-07-26 18:29:30 +02:00
Alejandro Celaya
b996a2db04
Merge pull request #1619 from shlinkio/dependabot/npm_and_yarn/vite-1a1b7557a5
Bump vite from 7.0.5 to 7.0.6 in the vite group
2025-07-26 18:28:49 +02:00
dependabot[bot]
66ec08d278
Bump vite from 7.0.5 to 7.0.6 in the vite group
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.0.5 to 7.0.6
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.0.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.0.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-26 09:42:27 +00:00
Alejandro Celaya
4ba8e42352
Merge pull request #1615 from shlinkio/dependabot/npm_and_yarn/form-data-4.0.4
Bump form-data from 4.0.1 to 4.0.4
2025-07-26 11:42:06 +02:00
Alejandro Celaya
c4f2b6855b
Merge pull request #1617 from shlinkio/dependabot/npm_and_yarn/eslint-515d00212f
Bump the eslint group with 3 updates
2025-07-26 11:41:46 +02:00
Alejandro Celaya
a2e29f0379
Merge pull request #1618 from shlinkio/dependabot/npm_and_yarn/shlink-c33ff988a6
Bump @shlinkio/shlink-js-sdk from 2.1.0 to 2.2.0 in the shlink group
2025-07-26 11:41:30 +02:00
Alejandro Celaya
904f529c19
Merge pull request #1620 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-1.0.2
Bump vite-plugin-pwa from 1.0.1 to 1.0.2
2025-07-26 11:41:04 +02:00
dependabot[bot]
8a06f98f45
Bump react-router from 7.7.0 to 7.7.1
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.7.0 to 7.7.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.7.1/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-26 07:05:19 +00:00
dependabot[bot]
99fcb6db04
Bump vite-plugin-pwa from 1.0.1 to 1.0.2
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: vite-plugin-pwa
  dependency-version: 1.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-26 07:05:05 +00:00
dependabot[bot]
6928992f8b
Bump @shlinkio/shlink-js-sdk from 2.1.0 to 2.2.0 in the shlink group
Bumps the shlink group with 1 update: [@shlinkio/shlink-js-sdk](https://shlink.io).


Updates `@shlinkio/shlink-js-sdk` from 2.1.0 to 2.2.0

---
updated-dependencies:
- dependency-name: "@shlinkio/shlink-js-sdk"
  dependency-version: 2.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: shlink
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-26 07:04:29 +00:00
dependabot[bot]
32ab234adf
Bump the eslint group with 3 updates
Bumps the eslint group with 3 updates: [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin), [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@stylistic/eslint-plugin` from 5.2.0 to 5.2.2
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.2.2/packages/eslint-plugin)

Updates `eslint` from 9.31.0 to 9.32.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.31.0...v9.32.0)

Updates `typescript-eslint` from 8.37.0 to 8.38.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.38.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@stylistic/eslint-plugin"
  dependency-version: 5.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: eslint
  dependency-version: 9.32.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.38.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-26 07:04:17 +00:00
dependabot[bot]
9364655114
Bump form-data from 4.0.1 to 4.0.4
---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 4.0.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-22 09:39:22 +00:00
Alejandro Celaya
fb9de5cd64
Merge pull request #1612 from shlinkio/dependabot/npm_and_yarn/eslint-b8665d2163
Bump the eslint group with 2 updates
2025-07-19 11:44:15 +02:00
dependabot[bot]
1fe2e599a5
Bump the eslint group with 2 updates
Bumps the eslint group with 2 updates: [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@stylistic/eslint-plugin` from 5.1.0 to 5.2.0
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.2.0/packages/eslint-plugin)

Updates `typescript-eslint` from 8.36.0 to 8.37.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.37.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@stylistic/eslint-plugin"
  dependency-version: 5.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.37.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-19 09:41:09 +00:00
Alejandro Celaya
024a08ee76
Merge pull request #1613 from shlinkio/dependabot/npm_and_yarn/vite-4c12138422
Bump the vite group with 2 updates
2025-07-19 11:39:55 +02:00
Alejandro Celaya
0eb284ed9c
Merge pull request #1614 from shlinkio/dependabot/npm_and_yarn/react-router-7.7.0
Bump react-router from 7.6.3 to 7.7.0
2025-07-19 11:39:45 +02:00
dependabot[bot]
878686f469
Bump react-router from 7.6.3 to 7.7.0
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.6.3 to 7.7.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.7.0/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-19 07:19:41 +00:00
dependabot[bot]
db1dd7c07e
Bump the vite group with 2 updates
Bumps the vite group with 2 updates: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `@vitejs/plugin-react` from 4.6.0 to 4.7.0
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@4.7.0/packages/plugin-react)

Updates `vite` from 7.0.4 to 7.0.5
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.0.5/packages/vite)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 4.7.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vite
- dependency-name: vite
  dependency-version: 7.0.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-19 07:19:20 +00:00
Alejandro Celaya
8ac5bd97b4
Merge pull request #1609 from shlinkio/dependabot/npm_and_yarn/eslint-11e2cf4d9a
Bump the eslint group with 2 updates
2025-07-12 10:14:09 +02:00
dependabot[bot]
6f5c657264
Bump the eslint group with 2 updates
Bumps the eslint group with 2 updates: [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `eslint` from 9.30.1 to 9.31.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.30.1...v9.31.0)

Updates `typescript-eslint` from 8.35.1 to 8.36.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.36.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.31.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.36.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-12 08:11:10 +00:00
Alejandro Celaya
91f1df45b0
Merge pull request #1607 from shlinkio/dependabot/docker/playwright-v1.54.1-noble
Bump playwright from v1.53.2-noble to v1.54.1-noble
2025-07-12 10:10:00 +02:00
Alejandro Celaya
3ad884b661
Merge pull request #1608 from shlinkio/dependabot/docker/node-24.4-alpine
Bump node from 24.3-alpine to 24.4-alpine
2025-07-12 10:09:52 +02:00
Alejandro Celaya
7db65635c3
Merge pull request #1610 from shlinkio/dependabot/npm_and_yarn/vite-7be7fd480a
Bump vite from 7.0.2 to 7.0.4 in the vite group
2025-07-12 10:09:39 +02:00
Alejandro Celaya
9e03e8b837
Merge pull request #1611 from shlinkio/dependabot/npm_and_yarn/playwright-1.54.1
Bump playwright from 1.53.2 to 1.54.1
2025-07-12 10:09:31 +02:00
dependabot[bot]
9f8a3edcb3
Bump playwright from 1.53.2 to 1.54.1
Bumps [playwright](https://github.com/microsoft/playwright) from 1.53.2 to 1.54.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.53.2...v1.54.1)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.54.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-12 07:46:54 +00:00
dependabot[bot]
d049da3b20
Bump vite from 7.0.2 to 7.0.4 in the vite group
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 7.0.2 to 7.0.4
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.0.4/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.0.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-12 07:46:26 +00:00
dependabot[bot]
694748cda6
Bump node from 24.3-alpine to 24.4-alpine
Bumps node from 24.3-alpine to 24.4-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 24.4-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-12 07:43:47 +00:00
dependabot[bot]
ef88644e6e
Bump playwright from v1.53.2-noble to v1.54.1-noble
Bumps playwright from v1.53.2-noble to v1.54.1-noble.

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: v1.54.1-noble
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-12 07:43:38 +00:00
Alejandro Celaya
98b5640c2c
Merge pull request #1600 from shlinkio/dependabot/npm_and_yarn/vite-45536e7fa6
Bump the vite group with 2 updates
2025-07-05 18:30:35 +02:00
dependabot[bot]
e921bf5276
Bump the vite group with 2 updates
Bumps the vite group with 2 updates: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `@vitejs/plugin-react` from 4.5.2 to 4.6.0
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@4.6.0/packages/plugin-react)

Updates `vite` from 6.3.5 to 7.0.0
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@7.0.0/packages/vite)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 4.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vite
- dependency-name: vite
  dependency-version: 7.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-05 16:27:41 +00:00
Alejandro Celaya
8d1c39255f
Merge pull request #1603 from shlinkio/dependabot/docker/playwright-v1.53.2-noble
Bump playwright from v1.53.1-noble to v1.53.2-noble
2025-07-05 18:27:03 +02:00
Alejandro Celaya
9dfbec9b1a
Merge pull request #1604 from shlinkio/dependabot/npm_and_yarn/eslint-d82549b67e
Bump the eslint group with 3 updates
2025-07-05 18:26:50 +02:00
Alejandro Celaya
7a0f2f6300
Merge pull request #1605 from shlinkio/dependabot/npm_and_yarn/playwright-1.53.2
Bump playwright from 1.53.1 to 1.53.2
2025-07-05 18:26:42 +02:00
Alejandro Celaya
5d5c9e9c22
Merge pull request #1606 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-1.0.1
Bump vite-plugin-pwa from 1.0.0 to 1.0.1
2025-07-05 18:26:16 +02:00
dependabot[bot]
d9f5663ead
Bump vite-plugin-pwa from 1.0.0 to 1.0.1
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v1.0.0...v1.0.1)

---
updated-dependencies:
- dependency-name: vite-plugin-pwa
  dependency-version: 1.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-05 07:58:20 +00:00
dependabot[bot]
20c35af7e0
Bump playwright from 1.53.1 to 1.53.2
Bumps [playwright](https://github.com/microsoft/playwright) from 1.53.1 to 1.53.2.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.53.1...v1.53.2)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.53.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-05 07:58:09 +00:00
dependabot[bot]
b879db6447
Bump the eslint group with 3 updates
Bumps the eslint group with 3 updates: [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin), [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@stylistic/eslint-plugin` from 5.0.0 to 5.1.0
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.1.0/packages/eslint-plugin)

Updates `eslint` from 9.30.0 to 9.30.1
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.30.0...v9.30.1)

Updates `typescript-eslint` from 8.35.0 to 8.35.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.35.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@stylistic/eslint-plugin"
  dependency-version: 5.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: eslint
  dependency-version: 9.30.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.35.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-05 07:57:30 +00:00
dependabot[bot]
153d59bf27
Bump playwright from v1.53.1-noble to v1.53.2-noble
Bumps playwright from v1.53.1-noble to v1.53.2-noble.

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: v1.53.2-noble
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-05 07:27:05 +00:00
Alejandro Celaya
9e889465fb
Merge pull request #1601 from shlinkio/dependabot/npm_and_yarn/tailwindcss-a13b31f115
Bump the tailwindcss group with 2 updates
2025-06-28 10:27:17 +02:00
dependabot[bot]
31984791ab
Bump the tailwindcss group with 2 updates
Bumps the tailwindcss group with 2 updates: [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) and [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss).


Updates `@tailwindcss/vite` from 4.1.10 to 4.1.11
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.11/packages/@tailwindcss-vite)

Updates `tailwindcss` from 4.1.10 to 4.1.11
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.11/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
- dependency-name: tailwindcss
  dependency-version: 4.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tailwindcss
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-28 08:26:15 +00:00
Alejandro Celaya
892a7698eb
Merge pull request #1598 from shlinkio/dependabot/npm_and_yarn/eslint-6fb493da14
Bump the eslint group with 3 updates
2025-06-28 10:25:12 +02:00
Alejandro Celaya
7f4ff8adbb
Merge pull request #1599 from shlinkio/dependabot/npm_and_yarn/shlink-31980fd76b
Bump @shlinkio/shlink-frontend-kit from 1.0.0 to 1.0.1 in the shlink group
2025-06-28 10:25:03 +02:00
Alejandro Celaya
493d3d5dee
Merge pull request #1602 from shlinkio/dependabot/npm_and_yarn/react-router-7.6.3
Bump react-router from 7.6.2 to 7.6.3
2025-06-28 10:24:51 +02:00
dependabot[bot]
febd100f96
Bump react-router from 7.6.2 to 7.6.3
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.6.2 to 7.6.3.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.6.3/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.6.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-28 07:55:45 +00:00
dependabot[bot]
21a9c39f12
Bump @shlinkio/shlink-frontend-kit in the shlink group
Bumps the shlink group with 1 update: [@shlinkio/shlink-frontend-kit](https://github.com/shlinkio/shlink-frontend-kit).


Updates `@shlinkio/shlink-frontend-kit` from 1.0.0 to 1.0.1
- [Release notes](https://github.com/shlinkio/shlink-frontend-kit/releases)
- [Changelog](https://github.com/shlinkio/shlink-frontend-kit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/shlinkio/shlink-frontend-kit/compare/v1.0.0...v1.0.1)

---
updated-dependencies:
- dependency-name: "@shlinkio/shlink-frontend-kit"
  dependency-version: 1.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: shlink
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-28 07:54:39 +00:00
dependabot[bot]
5078129ac1
Bump the eslint group with 3 updates
Bumps the eslint group with 3 updates: [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin), [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@stylistic/eslint-plugin` from 4.4.1 to 5.0.0
- [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases)
- [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v5.0.0/packages/eslint-plugin)

Updates `eslint` from 9.29.0 to 9.30.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.29.0...v9.30.0)

Updates `typescript-eslint` from 8.34.1 to 8.35.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.35.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@stylistic/eslint-plugin"
  dependency-version: 5.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: eslint
- dependency-name: eslint
  dependency-version: 9.30.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.35.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-28 07:54:25 +00:00
Alejandro Celaya
9b6bacc0c2
Merge pull request #1596 from shlinkio/dependabot/docker/node-24.3-alpine
Bump node from 24.2-alpine to 24.3-alpine
2025-06-28 09:42:18 +02:00
Alejandro Celaya
93b22227ef
Merge pull request #1597 from shlinkio/dependabot/docker/nginxinc/nginx-unprivileged-1.29-alpine
Bump nginxinc/nginx-unprivileged from 1.27-alpine to 1.29-alpine
2025-06-28 09:42:04 +02:00
dependabot[bot]
402b10ca98
Bump nginxinc/nginx-unprivileged from 1.27-alpine to 1.29-alpine
Bumps nginxinc/nginx-unprivileged from 1.27-alpine to 1.29-alpine.

---
updated-dependencies:
- dependency-name: nginxinc/nginx-unprivileged
  dependency-version: 1.29-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-28 07:28:07 +00:00
dependabot[bot]
23541606ca
Bump node from 24.2-alpine to 24.3-alpine
Bumps node from 24.2-alpine to 24.3-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 24.3-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-28 07:27:56 +00:00
77 changed files with 4461 additions and 7193 deletions

View File

@ -4,6 +4,85 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org).
## [4.6.1] - 2025-11-15
### Added
* *Nothing*
### Changed
* [#802](https://github.com/shlinkio/shlink-web-client/issues/802) Improve dependency injection in components.
* Stop injecting redux state and actions.
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* Fix small UI issues.
## [4.6.0] - 2025-11-12
### Added
* [shlink-web-component#839](https://github.com/shlinkio/shlink-web-component/issues/839) Allow filtering short URLs by excluded tags when using Shlink >=4.6.0
* [shlink-web-component#838](https://github.com/shlinkio/shlink-web-component/issues/838) Allow filtering tag, orphan and non-orphan visits by domain, when using Shlink >=4.6.0
* [shlink-web-component#784](https://github.com/shlinkio/shlink-web-component/issues/784) Add optional `long-url` query parameter to short URL creation to prefill the long URL programmatically.
### Changed
* *Nothing*
### Deprecated
* *Nothing*
### Removed
* Drop support for Shlink older than 4.0.0
### Fixed
* *Nothing*
## [4.5.1] - 2025-08-13
### Added
* *Nothing*
### Changed
* *Nothing*
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [#1637](https://github.com/shlinkio/shlink-web-client/issues/1637) Fix brand color used in PWA
* [#1636](https://github.com/shlinkio/shlink-web-client/issues/1636) Make sure sidebar toggle is rendered only in sections where the sidebar exists.
## [4.5.0] - 2025-08-08
### Added
* [shlink-web-component#755](https://github.com/shlinkio/shlink-web-component/issues/755) Add support for `any-value-query-param` and `valueless-query-param` redirect conditions when using Shlink >=4.5.0.
* [shlink-web-component#756](https://github.com/shlinkio/shlink-web-component/issues/756) Add support for desktop device types on device redirect conditions, when using Shlink >=4.5.0.
* [shlink-web-component#713](https://github.com/shlinkio/shlink-web-component/issues/713) Expose a new `ShlinkSidebarToggleButton` component that can be used to customize the location of the sidebar toggle, rather than making it assume there's a header bar and position it there.
* [shlink-web-component#657](https://github.com/shlinkio/shlink-web-component/issues/657) Allow visits table columns to be customized via settings, and add a new optional "Region" column.
As a side effect, the "Show user agent" toggle has been removed from the list, as this can now be globally configured in the settings.
### Changed
* Update to FontAwesome 7
* Update to Recharts 3
* Update to `@shlinkio/shlink-web-component` 0.16.1
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [shlink-web-component#698](https://github.com/shlinkio/shlink-web-component/issues/698) Fix line chart selection triggering after clicking a dot in the chart. It now works only when dragging while the mouse is clicked.
## [4.4.1] - 2025-06-23
### Added
* *Nothing*

View File

@ -1,10 +1,10 @@
FROM node:24.2-alpine AS node
FROM node:25.2-alpine AS node
COPY . /shlink-web-client
ARG VERSION="latest"
ENV VERSION=${VERSION}
RUN cd /shlink-web-client && npm ci && node --run build
FROM nginxinc/nginx-unprivileged:1.27-alpine
FROM nginxinc/nginx-unprivileged:1.29-alpine
ARG UID=101
LABEL maintainer="Alejandro Celaya <alejandro@alejandrocelaya.com>"

View File

@ -1,4 +1,4 @@
FROM mcr.microsoft.com/playwright:v1.53.1-noble
FROM mcr.microsoft.com/playwright:v1.57.0-noble
ENV NODE_VERSION 22.14
ENV TINI_VERSION v0.19.0

View File

@ -3,7 +3,8 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="theme-color" content="#4696e5">
<meta name="theme-color" content="#2078CF" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#0B2D4E" media="(prefers-color-scheme: dark)">
<!--
manifest.json provides metadata used when your web app is added to the

View File

@ -1,12 +1,13 @@
import { BRAND_COLOR_LM } from '@shlinkio/shlink-frontend-kit';
import type { ManifestOptions } from 'vite-plugin-pwa';
export const manifest: Partial<ManifestOptions> = {
short_name: 'Shlink',
name: 'Shlink',
name: 'Shlink Web Client',
start_url: '/',
display: 'standalone',
theme_color: '#4696e5',
background_color: '#4696e5',
theme_color: BRAND_COLOR_LM, // Toolbar color
background_color: BRAND_COLOR_LM, // Splash screen background color
icons: [
{
src: './icons/icon-16x16.png',

9667
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@
"license": "MIT",
"type": "module",
"scripts": {
"lint": "eslint src test config/test",
"lint": "eslint src test config/test *.config.{js,ts}",
"lint:fix": "node --run lint -- --fix",
"types": "tsc",
"start": "vite serve --host=0.0.0.0",
@ -20,66 +20,68 @@
"test:verbose": "node --run test -- --verbose"
},
"dependencies": {
"@fortawesome/fontawesome-free": "^6.7.2",
"@fortawesome/fontawesome-svg-core": "^6.7.2",
"@fortawesome/free-brands-svg-icons": "^6.7.2",
"@fortawesome/free-regular-svg-icons": "^6.7.2",
"@fortawesome/free-solid-svg-icons": "^6.7.2",
"@fortawesome/react-fontawesome": "^0.2.2",
"@fortawesome/fontawesome-free": "^7.1.0",
"@fortawesome/fontawesome-svg-core": "^7.1.0",
"@fortawesome/free-brands-svg-icons": "^7.1.0",
"@fortawesome/free-regular-svg-icons": "^7.1.0",
"@fortawesome/free-solid-svg-icons": "^7.1.0",
"@fortawesome/react-fontawesome": "^3.1.1",
"@json2csv/plainjs": "^7.0.6",
"@reduxjs/toolkit": "^2.8.2",
"@shlinkio/data-manipulation": "^1.0.3",
"@shlinkio/shlink-frontend-kit": "^1.0.0",
"@shlinkio/shlink-js-sdk": "^2.1.0",
"@shlinkio/shlink-web-component": "^0.15.0",
"@reduxjs/toolkit": "^2.11.0",
"@shlinkio/data-manipulation": "^1.0.4",
"@shlinkio/shlink-frontend-kit": "^1.3.1",
"@shlinkio/shlink-js-sdk": "^3.0.1",
"@shlinkio/shlink-web-component": "^0.17.0",
"@vitest/browser-playwright": "^4.0.15",
"bottlejs": "^2.0.1",
"clsx": "^2.1.1",
"compare-versions": "^6.1.1",
"csvtojson": "^2.0.10",
"csvtojson": "^2.0.14",
"date-fns": "^4.1.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-external-link": "^2.5.0",
"react": "^19.2.1",
"react-dom": "^19.2.1",
"react-external-link": "^2.6.1",
"react-redux": "^9.2.0",
"react-router": "^7.6.2",
"react-router": "^7.10.1",
"redux-localstorage-simple": "^2.5.1",
"workbox-core": "^7.3.0",
"workbox-expiration": "^7.3.0",
"workbox-precaching": "^7.3.0",
"workbox-routing": "^7.3.0",
"workbox-strategies": "^7.3.0"
"workbox-core": "^7.4.0",
"workbox-expiration": "^7.4.0",
"workbox-precaching": "^7.4.0",
"workbox-routing": "^7.4.0",
"workbox-strategies": "^7.4.0"
},
"devDependencies": {
"@shlinkio/eslint-config-js-coding-standard": "~3.5.0",
"@stylistic/eslint-plugin": "^4.4.1",
"@tailwindcss/vite": "^4.1.10",
"@testing-library/jest-dom": "^6.6.3",
"@shlinkio/eslint-config-js-coding-standard": "~3.7.0",
"@stylistic/eslint-plugin": "^5.6.1",
"@tailwindcss/vite": "^4.1.17",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@total-typescript/shoehorn": "^0.1.2",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@vitejs/plugin-react": "^4.5.2",
"@vitest/browser": "^3.2.4",
"@vitest/coverage-v8": "^3.2.4",
"@types/node": "^24.10.1",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.1",
"@vitest/browser": "^4.0.3",
"@vitest/coverage-v8": "^4.0.15",
"adm-zip": "^0.5.16",
"axe-core": "^4.10.3",
"chalk": "^5.4.1",
"eslint": "^9.29.0",
"axe-core": "^4.11.0",
"chalk": "^5.6.2",
"eslint": "^9.39.1",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-compiler": "^19.0.0-beta-714736e-20250131",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-simple-import-sort": "^12.1.1",
"history": "^5.3.0",
"playwright": "^1.53.1",
"playwright": "^1.57.0",
"tailwindcss": "^4.1.3",
"typescript": "^5.8.3",
"typescript-eslint": "^8.34.1",
"vite": "^6.3.5",
"vite-plugin-pwa": "^1.0.0",
"vitest": "^3.0.5"
"typescript": "^5.9.3",
"typescript-eslint": "^8.48.1",
"vite": "^7.2.6",
"vite-plugin-pwa": "^1.2.0",
"vitest": "^4.0.3"
},
"browserslist": [
">0.2%",

View File

@ -1,13 +1,11 @@
import type { HttpClient } from '@shlinkio/shlink-js-sdk';
import { ShlinkApiClient } from '@shlinkio/shlink-js-sdk';
import type { GetState } from '../../container/types';
import type { ServerWithId } from '../../servers/data';
import { hasServerData } from '../../servers/data';
import type { GetState } from '../../store';
const apiClients: Map<string, ShlinkApiClient> = new Map();
const isGetState = (getStateOrSelectedServer: GetState | ServerWithId): getStateOrSelectedServer is GetState =>
typeof getStateOrSelectedServer === 'function';
const getSelectedServerFromState = (getState: GetState): ServerWithId => {
const { selectedServer } = getState();
if (!hasServerData(selectedServer)) {
@ -18,7 +16,7 @@ const getSelectedServerFromState = (getState: GetState): ServerWithId => {
};
export const buildShlinkApiClient = (httpClient: HttpClient) => (getStateOrSelectedServer: GetState | ServerWithId) => {
const { url: baseUrl, apiKey, forwardCredentials } = isGetState(getStateOrSelectedServer)
const { url: baseUrl, apiKey, forwardCredentials } = typeof getStateOrSelectedServer === 'function'
? getSelectedServerFromState(getStateOrSelectedServer)
: getStateOrSelectedServer;
const serverKey = `${apiKey}_${baseUrl}_${forwardCredentials ? 'forward' : 'no-forward'}`;
@ -34,6 +32,7 @@ export const buildShlinkApiClient = (httpClient: HttpClient) => (getStateOrSelec
{ requestCredentials: forwardCredentials ? 'include' : undefined },
);
apiClients.set(serverKey, apiClient);
return apiClient;
};

View File

@ -1,6 +0,0 @@
import type Bottle from 'bottlejs';
import { buildShlinkApiClient } from './ShlinkApiClientBuilder';
export const provideServices = (bottle: Bottle) => {
bottle.serviceFactory('buildShlinkApiClient', buildShlinkApiClient, 'HttpClient');
};

View File

@ -1,109 +1,71 @@
import { changeThemeInMarkup, getSystemPreferredTheme } from '@shlinkio/shlink-frontend-kit';
import type { Settings } from '@shlinkio/shlink-web-component/settings';
import { clsx } from 'clsx';
import type { FC } from 'react';
import { useEffect, useRef } from 'react';
import { useEffect } from 'react';
import { Route, Routes, useLocation } from 'react-router';
import { AppUpdateBanner } from '../common/AppUpdateBanner';
import { Home } from '../common/Home';
import { MainHeader } from '../common/MainHeader';
import { NotFound } from '../common/NotFound';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import type { ServersMap } from '../servers/data';
import { ShlinkVersionsContainer } from '../common/ShlinkVersionsContainer';
import { ShlinkWebComponentContainer } from '../common/ShlinkWebComponentContainer';
import { CreateServer } from '../servers/CreateServer';
import { EditServer } from '../servers/EditServer';
import { ManageServers } from '../servers/ManageServers';
import { useLoadRemoteServers } from '../servers/reducers/remoteServers';
import { useSettings } from '../settings/reducers/settings';
import { Settings } from '../settings/Settings';
import { forceUpdate } from '../utils/helpers/sw';
import { useAppUpdated } from './reducers/appUpdates';
type AppProps = {
fetchServers: () => void;
servers: ServersMap;
settings: Settings;
resetAppUpdate: () => void;
appUpdated: boolean;
};
export const App: FC = () => {
const { appUpdated, resetAppUpdate } = useAppUpdated();
type AppDeps = {
MainHeader: FC;
Home: FC;
ShlinkWebComponentContainer: FC;
CreateServer: FC;
EditServer: FC;
Settings: FC;
ManageServers: FC;
ShlinkVersionsContainer: FC;
};
const App: FCWithDeps<AppProps, AppDeps> = (
{ fetchServers, servers, settings, appUpdated, resetAppUpdate },
) => {
const {
MainHeader,
Home,
ShlinkWebComponentContainer,
CreateServer,
EditServer,
Settings,
ManageServers,
ShlinkVersionsContainer,
} = useDependencies(App);
useLoadRemoteServers();
const location = useLocation();
const initialServers = useRef(servers);
const isHome = location.pathname === '/';
useEffect(() => {
// Try to fetch the remote servers if the list is empty during first render.
// We use a ref because we don't care if the servers list becomes empty later.
if (Object.keys(initialServers.current).length === 0) {
fetchServers();
}
}, [fetchServers]);
const { settings } = useSettings();
useEffect(() => {
changeThemeInMarkup(settings.ui?.theme ?? getSystemPreferredTheme());
}, [settings.ui?.theme]);
return (
<div className="h-full">
<MainHeader />
<>
<MainHeader />
<div className="h-full pt-(--header-height)">
<div
data-testid="shlink-wrapper"
className={clsx(
'min-h-full pb-[calc(var(--footer-height)+var(--footer-margin))] -mb-[calc(var(--footer-height)+var(--footer-margin))]',
{ 'flex items-center pt-4': isHome },
)}
>
<Routes>
<Route index element={<Home />} />
<Route path="/settings">
{['', '*'].map((path) => <Route key={path} path={path} element={<Settings />} />)}
</Route>
<Route path="/manage-servers" element={<ManageServers />} />
<Route path="/server/create" element={<CreateServer />} />
<Route path="/server/:serverId/edit" element={<EditServer />} />
<Route path="/server/:serverId">
{['', '*'].map((path) => <Route key={path} path={path} element={<ShlinkWebComponentContainer />} />)}
</Route>
<Route path="*" element={<NotFound />} />
</Routes>
</div>
<div className="h-full pt-(--header-height)">
<div
data-testid="shlink-wrapper"
className={clsx(
'min-h-full pb-[calc(var(--footer-height)+var(--footer-margin))] -mb-[calc(var(--footer-height)+var(--footer-margin))]',
{ 'flex items-center pt-4': isHome },
)}
>
<Routes>
<Route index element={<Home />} />
<Route path="/settings">
{['', '*'].map((path) => <Route key={path} path={path} element={<Settings />} />)}
</Route>
<Route path="/manage-servers" element={<ManageServers />} />
<Route path="/server/create" element={<CreateServer />} />
<Route path="/server/:serverId/edit" element={<EditServer />} />
<Route path="/server/:serverId">
{['', '*'].map((path) => <Route key={path} path={path} element={<ShlinkWebComponentContainer />} />)}
</Route>
<Route path="*" element={<NotFound />} />
</Routes>
</div>
<div className="h-(--footer-height) mt-(--footer-margin) md:px-4">
<ShlinkVersionsContainer />
<div className="h-(--footer-height) mt-(--footer-margin) md:px-4">
<ShlinkVersionsContainer />
</div>
</div>
</div>
</>
<AppUpdateBanner isOpen={appUpdated} onClose={resetAppUpdate} forceUpdate={forceUpdate} />
</div>
);
};
export const AppFactory = componentFactory(App, [
'MainHeader',
'Home',
'ShlinkWebComponentContainer',
'CreateServer',
'EditServer',
'Settings',
'ManageServers',
'ShlinkVersionsContainer',
]);

View File

@ -1,4 +1,6 @@
import { createSlice } from '@reduxjs/toolkit';
import { useCallback } from 'react';
import { useAppDispatch, useAppSelector } from '../../store';
const { actions, reducer } = createSlice({
name: 'shlink/appUpdates',
@ -12,3 +14,12 @@ const { actions, reducer } = createSlice({
export const { appUpdateAvailable, resetAppUpdate } = actions;
export const appUpdatesReducer = reducer;
export const useAppUpdated = () => {
const dispatch = useAppDispatch();
const appUpdateAvailable = useCallback(() => dispatch(actions.appUpdateAvailable()), [dispatch]);
const resetAppUpdate = useCallback(() => dispatch(actions.resetAppUpdate()), [dispatch]);
const appUpdated = useAppSelector((state) => state.appUpdated);
return { appUpdated, appUpdateAvailable, resetAppUpdate };
};

View File

@ -1,14 +0,0 @@
import type Bottle from 'bottlejs';
import type { ConnectDecorator } from '../../container/types';
import { AppFactory } from '../App';
import { appUpdateAvailable, resetAppUpdate } from '../reducers/appUpdates';
export const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
// Components
bottle.factory('App', AppFactory);
bottle.decorator('App', connect(['servers', 'settings', 'appUpdated'], ['fetchServers', 'resetAppUpdate']));
// Actions
bottle.serviceFactory('appUpdateAvailable', () => appUpdateAvailable);
bottle.serviceFactory('resetAppUpdate', () => resetAppUpdate);
};

View File

@ -2,19 +2,18 @@ import { faExternalLinkAlt, faPlus } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Button, Card } from '@shlinkio/shlink-frontend-kit';
import { clsx } from 'clsx';
import type { FC } from 'react';
import { useEffect } from 'react';
import { ExternalLink } from 'react-external-link';
import { useNavigate } from 'react-router';
import type { ServersMap } from '../servers/data';
import { withoutSelectedServer } from '../servers/helpers/withoutSelectedServer';
import { useServers } from '../servers/reducers/servers';
import { ServersListGroup } from '../servers/ServersListGroup';
import { ShlinkLogo } from './img/ShlinkLogo';
export type HomeProps = {
servers: ServersMap;
};
export const Home = ({ servers }: HomeProps) => {
export const Home: FC = withoutSelectedServer(() => {
const navigate = useNavigate();
const { servers } = useServers();
const serversList = Object.values(servers);
const hasServers = serversList.length > 0;
@ -50,7 +49,7 @@ export const Home = ({ servers }: HomeProps) => {
<p>This application will help you manage your Shlink servers.</p>
<p>
<Button to="/server/create" size="lg" inline>
<FontAwesomeIcon icon={faPlus} /> Add a server
<FontAwesomeIcon icon={faPlus} widthAuto /> Add a server
</Button>
</p>
<p>
@ -68,4 +67,4 @@ export const Home = ({ servers }: HomeProps) => {
</Card>
</div>
);
};
});

View File

@ -3,16 +3,10 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { NavBar } from '@shlinkio/shlink-frontend-kit';
import type { FC } from 'react';
import { Link, useLocation } from 'react-router';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import { ServersDropdown } from '../servers/ServersDropdown';
import { ShlinkLogo } from './img/ShlinkLogo';
type MainHeaderDeps = {
ServersDropdown: FC;
};
const MainHeader: FCWithDeps<unknown, MainHeaderDeps> = () => {
const { ServersDropdown } = useDependencies(MainHeader);
export const MainHeader: FC = () => {
const { pathname } = useLocation();
const settingsPath = '/settings';
@ -37,5 +31,3 @@ const MainHeader: FCWithDeps<unknown, MainHeaderDeps> = () => {
</NavBar>
);
};
export const MainHeaderFactory = componentFactory(MainHeader, ['ServersDropdown']);

View File

@ -1,16 +1,15 @@
import { clsx } from 'clsx';
import type { SelectedServer } from '../servers/data';
import { isReachableServer } from '../servers/data';
import { useSelectedServer } from '../servers/reducers/selectedServer';
import { ShlinkVersions } from './ShlinkVersions';
export type ShlinkVersionsContainerProps = {
selectedServer: SelectedServer;
export const ShlinkVersionsContainer = () => {
const { selectedServer } = useSelectedServer();
return (
<div
className={clsx('text-center', { 'md:ml-(--aside-menu-width)': isReachableServer(selectedServer) })}
>
<ShlinkVersions selectedServer={selectedServer} />
</div>
);
};
export const ShlinkVersionsContainer = ({ selectedServer }: ShlinkVersionsContainerProps) => (
<div
className={clsx('text-center', { 'md:ml-(--aside-menu-width)': isReachableServer(selectedServer) })}
>
<ShlinkVersions selectedServer={selectedServer} />
</div>
);

View File

@ -1,40 +1,37 @@
import type { ShlinkWebComponentType, TagColorsStorage } from '@shlinkio/shlink-web-component';
import type { Settings } from '@shlinkio/shlink-web-component/settings';
import type { TagColorsStorage } from '@shlinkio/shlink-web-component';
import {
ShlinkSidebarToggleButton,
ShlinkSidebarVisibilityProvider,
ShlinkWebComponent,
} from '@shlinkio/shlink-web-component';
import type { FC } from 'react';
import { memo } from 'react';
import type { ShlinkApiClientBuilder } from '../api/services/ShlinkApiClientBuilder';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import { withDependencies } from '../container/context';
import { isReachableServer } from '../servers/data';
import type { WithSelectedServerProps } from '../servers/helpers/withSelectedServer';
import { ServerError } from '../servers/helpers/ServerError';
import { withSelectedServer } from '../servers/helpers/withSelectedServer';
import { useSelectedServer } from '../servers/reducers/selectedServer';
import { useSettings } from '../settings/reducers/settings';
import { NotFound } from './NotFound';
type ShlinkWebComponentContainerProps = WithSelectedServerProps & {
settings: Settings;
export type ShlinkWebComponentContainerProps = {
TagColorsStorage: TagColorsStorage;
buildShlinkApiClient: ShlinkApiClientBuilder;
};
type ShlinkWebComponentContainerDeps = {
buildShlinkApiClient: ShlinkApiClientBuilder,
TagColorsStorage: TagColorsStorage,
ShlinkWebComponent: ShlinkWebComponentType,
ServerError: FC,
};
const ShlinkWebComponentContainer: FCWithDeps<
ShlinkWebComponentContainerProps,
ShlinkWebComponentContainerDeps
const ShlinkWebComponentContainerBase: FC<
ShlinkWebComponentContainerProps
// FIXME Using `memo` here to solve a flickering effect in charts.
// memo is probably not the right solution. The root cause is the withSelectedServer HOC, but I couldn't fix the
// extra rendering there.
// This should be revisited at some point.
> = withSelectedServer(memo(({ selectedServer, settings }) => {
const {
buildShlinkApiClient,
TagColorsStorage: tagColorsStorage,
ShlinkWebComponent,
ServerError,
} = useDependencies(ShlinkWebComponentContainer);
> = withSelectedServer(memo(({
buildShlinkApiClient,
TagColorsStorage: tagColorsStorage,
}) => {
const { selectedServer } = useSelectedServer();
const { settings } = useSettings();
if (!isReachableServer(selectedServer)) {
return <ServerError />;
@ -42,22 +39,24 @@ const ShlinkWebComponentContainer: FCWithDeps<
const routesPrefix = `/server/${selectedServer.id}`;
return (
<ShlinkWebComponent
serverVersion={selectedServer.version}
apiClient={buildShlinkApiClient(selectedServer)}
settings={settings}
routesPrefix={routesPrefix}
tagColorsStorage={tagColorsStorage}
createNotFound={(nonPrefixedHomePath) => (
<NotFound to={`${routesPrefix}${nonPrefixedHomePath}`}>List short URLs</NotFound>
)}
/>
<ShlinkSidebarVisibilityProvider>
<ShlinkSidebarToggleButton className="fixed top-3.5 left-3 z-901" />
<ShlinkWebComponent
serverVersion={selectedServer.version}
apiClient={buildShlinkApiClient(selectedServer)}
settings={settings}
routesPrefix={routesPrefix}
tagColorsStorage={tagColorsStorage}
createNotFound={(nonPrefixedHomePath: string) => (
<NotFound to={`${routesPrefix}${nonPrefixedHomePath}`}>List short URLs</NotFound>
)}
autoSidebarToggle={false}
/>
</ShlinkSidebarVisibilityProvider>
);
}));
export const ShlinkWebComponentContainerFactory = componentFactory(ShlinkWebComponentContainer, [
export const ShlinkWebComponentContainer = withDependencies(ShlinkWebComponentContainerBase, [
'buildShlinkApiClient',
'TagColorsStorage',
'ShlinkWebComponent',
'ServerError',
]);

View File

@ -1,37 +0,0 @@
import { FetchHttpClient } from '@shlinkio/shlink-js-sdk/fetch';
import { ShlinkWebComponent } from '@shlinkio/shlink-web-component';
import type Bottle from 'bottlejs';
import type { ConnectDecorator } from '../../container/types';
import { withoutSelectedServer } from '../../servers/helpers/withoutSelectedServer';
import { ErrorHandler } from '../ErrorHandler';
import { Home } from '../Home';
import { MainHeaderFactory } from '../MainHeader';
import { ScrollToTop } from '../ScrollToTop';
import { ShlinkVersionsContainer } from '../ShlinkVersionsContainer';
import { ShlinkWebComponentContainerFactory } from '../ShlinkWebComponentContainer';
export const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
// Services
bottle.constant('window', window);
bottle.constant('console', console);
bottle.constant('fetch', window.fetch.bind(window));
bottle.service('HttpClient', FetchHttpClient, 'fetch');
// Components
bottle.serviceFactory('ScrollToTop', () => ScrollToTop);
bottle.factory('MainHeader', MainHeaderFactory);
bottle.serviceFactory('Home', () => Home);
bottle.decorator('Home', withoutSelectedServer);
bottle.decorator('Home', connect(['servers'], ['resetSelectedServer']));
bottle.serviceFactory('ShlinkWebComponent', () => ShlinkWebComponent);
bottle.factory('ShlinkWebComponentContainer', ShlinkWebComponentContainerFactory);
bottle.decorator('ShlinkWebComponentContainer', connect(['selectedServer', 'settings'], ['selectServer']));
bottle.serviceFactory('ShlinkVersionsContainer', () => ShlinkVersionsContainer);
bottle.decorator('ShlinkVersionsContainer', connect(['selectedServer']));
bottle.serviceFactory('ErrorHandler', () => ErrorHandler);
};

63
src/container/context.tsx Normal file
View File

@ -0,0 +1,63 @@
import type { IContainer } from 'bottlejs';
import { type ComponentType, createContext, useContext } from 'react';
const ContainerContext = createContext<IContainer | null>(null);
export const ContainerProvider = ContainerContext.Provider;
const useContainer = (wrapperName: string): IContainer => {
const container = useContext(ContainerContext);
if (!container) {
throw new Error(`You cannot use "${wrapperName}" outside of a ContainerProvider`);
}
return container;
};
/**
* Hook used to extract dependencies from the container in other hooks.
*/
export const useDependencies = <T extends unknown[]>(...names: string[]): T => {
const container = useContainer('useDependencies');
return names.map((name) => {
const dependency = container[name];
if (!dependency) {
throw new Error(`Dependency with name "${name}" not found in container`);
}
return dependency;
}) as T;
};
type Optionalize<P, K extends keyof P> = Omit<P, K> & Partial<Pick<P, K>>;
/**
* Higher Order Component used to inject services into components as props.
* All dependencies become optional props so that they can still be explicitly set in tests if desired.
*/
export function withDependencies<
Props extends Record<string, unknown>,
DependencyName extends string & keyof Props,
>(
Component: ComponentType<Props>,
dependencyNames: DependencyName[],
): ComponentType<Optionalize<Props, DependencyName>> {
function Wrapper(props: Omit<Props, DependencyName>) {
const container = useContext(ContainerContext);
// Inject services, unless they have been overridden by props passed from
// the parent component.
const dependencies: Partial<Record<DependencyName, unknown>> = {};
for (const dependency of dependencyNames) {
if (!(dependency in props)) {
dependencies[dependency] = container?.[dependency];
}
}
const propsWithServices = { ...dependencies, ...props } as Props;
return <Component {...propsWithServices} />;
}
return Wrapper;
}

View File

@ -1,42 +1,32 @@
import type { IContainer } from 'bottlejs';
import { useTimeoutToggle } from '@shlinkio/shlink-frontend-kit';
import { FetchHttpClient } from '@shlinkio/shlink-js-sdk/fetch';
import Bottle from 'bottlejs';
import { connect as reduxConnect } from 'react-redux';
import { provideServices as provideApiServices } from '../api/services/provideServices';
import { provideServices as provideAppServices } from '../app/services/provideServices';
import { provideServices as provideCommonServices } from '../common/services/provideServices';
import { provideServices as provideServersServices } from '../servers/services/provideServices';
import { provideServices as provideSettingsServices } from '../settings/services/provideServices';
import { provideServices as provideUtilsServices } from '../utils/services/provideServices';
import type { ConnectDecorator } from './types';
type LazyActionMap = Record<string, (...args: unknown[]) => unknown>;
import { buildShlinkApiClient } from '../api/services/ShlinkApiClientBuilder';
import { ServersExporter } from '../servers/services/ServersExporter';
import { ServersImporter } from '../servers/services/ServersImporter';
import { csvToJson, jsonToCsv } from '../utils/helpers/csvjson';
import { LocalStorage } from '../utils/services/LocalStorage';
import { TagColorsStorage } from '../utils/services/TagColorsStorage';
const bottle = new Bottle();
export const { container } = bottle;
const lazyService = <T extends (...args: unknown[]) => unknown, K>(cont: IContainer, serviceName: string) =>
(...args: any[]) => (cont[serviceName] as T)(...args) as K;
bottle.constant('window', window);
bottle.constant('console', console);
bottle.constant('fetch', window.fetch.bind(window));
bottle.service('HttpClient', FetchHttpClient, 'fetch');
const mapActionService = (map: LazyActionMap, actionName: string): LazyActionMap => ({
...map,
// Wrap actual action service in a function so that it is lazily created the first time it is called
[actionName]: lazyService(container, actionName),
});
bottle.constant('localStorage', window.localStorage);
bottle.service('Storage', LocalStorage, 'localStorage');
bottle.service('TagColorsStorage', TagColorsStorage, 'Storage');
const pickProps = (propsToPick: string[]) => (obj: any) => Object.fromEntries(
propsToPick.map((key) => [key, obj[key]]),
);
bottle.constant('csvToJson', csvToJson);
bottle.constant('jsonToCsv', jsonToCsv);
const connect: ConnectDecorator = (propsFromState: string[] | null, actionServiceNames: string[] = []) =>
reduxConnect(
propsFromState ? pickProps(propsFromState) : null,
actionServiceNames.reduce(mapActionService, {}),
);
bottle.serviceFactory('useTimeoutToggle', () => useTimeoutToggle);
provideAppServices(bottle, connect);
provideCommonServices(bottle, connect);
provideApiServices(bottle);
provideServersServices(bottle, connect);
provideUtilsServices(bottle);
provideSettingsServices(bottle, connect);
bottle.serviceFactory('buildShlinkApiClient', buildShlinkApiClient, 'HttpClient');
bottle.service('ServersImporter', ServersImporter, 'csvToJson');
bottle.service('ServersExporter', ServersExporter, 'Storage', 'window', 'jsonToCsv');

View File

@ -1,25 +0,0 @@
import { configureStore } from '@reduxjs/toolkit';
import type { IContainer } from 'bottlejs';
import type { RLSOptions } from 'redux-localstorage-simple';
import { load, save } from 'redux-localstorage-simple';
import { initReducers } from '../reducers';
import { migrateDeprecatedSettings } from '../settings/helpers';
import type { ShlinkState } from './types';
const isProduction = process.env.NODE_ENV === 'production';
const localStorageConfig: RLSOptions = {
states: ['settings', 'servers'],
namespace: 'shlink',
namespaceSeparator: '.',
debounce: 300,
};
const preloadedState = migrateDeprecatedSettings(load(localStorageConfig) as ShlinkState);
export const setUpStore = (container: IContainer) => configureStore({
devTools: !isProduction,
reducer: initReducers(container),
preloadedState,
middleware: (defaultMiddlewaresIncludingReduxThunk) =>
defaultMiddlewaresIncludingReduxThunk({ immutableCheck: false, serializableCheck: false }) // State is too big for these
.concat(save(localStorageConfig)),
});

View File

@ -1,13 +0,0 @@
import type { Settings } from '@shlinkio/shlink-web-component/settings';
import type { SelectedServer, ServersMap } from '../servers/data';
export interface ShlinkState {
servers: ServersMap;
selectedServer: SelectedServer;
settings: Settings;
appUpdated: boolean;
}
export type ConnectDecorator = (props: string[] | null, actions?: string[]) => any;
export type GetState = () => ShlinkState;

View File

@ -1,27 +0,0 @@
import type { IContainer } from 'bottlejs';
import type { FC } from 'react';
import { useMemo } from 'react';
export type FCWithDeps<Props, Deps> = FC<Props> & Partial<Deps>;
export function useDependencies<Deps>(obj: Deps): Omit<Required<Deps>, keyof FC> {
return useMemo(() => obj as Omit<Required<Deps>, keyof FC>, [obj]);
}
export function componentFactory<Deps, CompType = Omit<Partial<Deps>, keyof FC>>(
Component: CompType,
deps: ReadonlyArray<keyof CompType>,
) {
return (container: IContainer, console = globalThis.console) => {
deps.forEach((dep) => {
const resolvedDependency = container[dep as string];
if (!resolvedDependency && process.env.NODE_ENV !== 'production') {
console.error(`[Debug] Could not find "${dep as string}" dependency in container`);
}
Component[dep] = resolvedDependency;
});
return Component;
};
}

View File

@ -2,24 +2,30 @@ import { createRoot } from 'react-dom/client';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router';
import pack from '../package.json';
import { App } from './app/App';
import { appUpdateAvailable } from './app/reducers/appUpdates';
import { ErrorHandler } from './common/ErrorHandler';
import { ScrollToTop } from './common/ScrollToTop';
import { container } from './container';
import { setUpStore } from './container/store';
import { ContainerProvider } from './container/context';
import { register as registerServiceWorker } from './serviceWorkerRegistration';
import { setUpStore } from './store';
import './tailwind.css';
const store = setUpStore(container);
const { App, ScrollToTop, ErrorHandler, appUpdateAvailable } = container;
const store = setUpStore();
createRoot(document.getElementById('root')!).render(
<Provider store={store}>
<BrowserRouter basename={pack.homepage}>
<ErrorHandler>
<ScrollToTop>
<App />
</ScrollToTop>
</ErrorHandler>
</BrowserRouter>
</Provider>,
<ContainerProvider value={container}>
<Provider store={store}>
<BrowserRouter basename={pack.homepage}>
<ErrorHandler>
<ScrollToTop>
<App />
</ScrollToTop>
</ErrorHandler>
</BrowserRouter>
</Provider>
</ContainerProvider>,
);
// Learn more about service workers: https://cra.link/PWA

View File

@ -1,27 +1,22 @@
import type { ResultProps,TimeoutToggle } from '@shlinkio/shlink-frontend-kit';
import { Button, Result,useToggle } from '@shlinkio/shlink-frontend-kit';
import type { ResultProps, TimeoutToggle } from '@shlinkio/shlink-frontend-kit';
import { Button, Result, useToggle } from '@shlinkio/shlink-frontend-kit';
import type { FC } from 'react';
import { useCallback, useState } from 'react';
import { useNavigate } from 'react-router';
import { NoMenuLayout } from '../common/NoMenuLayout';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import { withDependencies } from '../container/context';
import { useGoBack } from '../utils/helpers/hooks';
import type { ServerData, ServersMap, ServerWithId } from './data';
import type { ServerData } from './data';
import { ensureUniqueIds } from './helpers';
import { DuplicatedServersModal } from './helpers/DuplicatedServersModal';
import type { ImportServersBtnProps } from './helpers/ImportServersBtn';
import { ImportServersBtn } from './helpers/ImportServersBtn';
import { ServerForm } from './helpers/ServerForm';
import { withoutSelectedServer } from './helpers/withoutSelectedServer';
import { useServers } from './reducers/servers';
const SHOW_IMPORT_MSG_TIME = 4000;
type CreateServerProps = {
createServers: (servers: ServerWithId[]) => void;
servers: ServersMap;
};
type CreateServerDeps = {
ImportServersBtn: FC<ImportServersBtnProps>;
export type CreateServerProps = {
useTimeoutToggle: TimeoutToggle;
};
@ -34,14 +29,12 @@ const ImportResult = ({ variant }: Pick<ResultProps, 'variant'>) => (
</div>
);
const CreateServer: FCWithDeps<CreateServerProps, CreateServerDeps> = ({ servers, createServers }) => {
const { ImportServersBtn, useTimeoutToggle } = useDependencies(CreateServer);
const CreateServerBase: FC<CreateServerProps> = withoutSelectedServer(({ useTimeoutToggle }) => {
const { servers, createServers } = useServers();
const navigate = useNavigate();
const goBack = useGoBack();
const hasServers = !!Object.keys(servers).length;
// eslint-disable-next-line react-compiler/react-compiler
const [serversImported, setServersImported] = useTimeoutToggle({ delay: SHOW_IMPORT_MSG_TIME });
// eslint-disable-next-line react-compiler/react-compiler
const [errorImporting, setErrorImporting] = useTimeoutToggle({ delay: SHOW_IMPORT_MSG_TIME });
const { flag: isConfirmModalOpen, toggle: toggleConfirmModal } = useToggle();
const [serverData, setServerData] = useState<ServerData>();
@ -86,6 +79,6 @@ const CreateServer: FCWithDeps<CreateServerProps, CreateServerDeps> = ({ servers
/>
</NoMenuLayout>
);
};
});
export const CreateServerFactory = componentFactory(CreateServer, ['ImportServersBtn', 'useTimeoutToggle']);
export const CreateServer = withDependencies(CreateServerBase, ['useTimeoutToggle']);

View File

@ -2,21 +2,14 @@ import { useToggle } from '@shlinkio/shlink-frontend-kit';
import type { FC, PropsWithChildren } from 'react';
import { useCallback } from 'react';
import { useNavigate } from 'react-router';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import type { ServerWithId } from './data';
import type { DeleteServerModalProps } from './DeleteServerModal';
import { DeleteServerModal } from './DeleteServerModal';
export type DeleteServerButtonProps = PropsWithChildren<{
server: ServerWithId;
}>;
type DeleteServerButtonDeps = {
DeleteServerModal: FC<DeleteServerModalProps>;
};
const DeleteServerButton: FCWithDeps<DeleteServerButtonProps, DeleteServerButtonDeps> = ({ server, children }) => {
const { DeleteServerModal } = useDependencies(DeleteServerButton);
export const DeleteServerButton: FC<DeleteServerButtonProps> = ({ server, children }) => {
const { flag: isModalOpen, setToTrue: showModal, setToFalse: hideModal } = useToggle();
const navigate = useNavigate();
const onClose = useCallback((confirmed: boolean) => {
@ -35,5 +28,3 @@ const DeleteServerButton: FCWithDeps<DeleteServerButtonProps, DeleteServerButton
</>
);
};
export const DeleteServerButtonFactory = componentFactory(DeleteServerButton, ['DeleteServerModal']);

View File

@ -3,6 +3,7 @@ import { CardModal } from '@shlinkio/shlink-frontend-kit';
import type { FC } from 'react';
import { useCallback } from 'react';
import type { ServerWithId } from './data';
import { useServers } from './reducers/servers';
export type DeleteServerModalProps = {
server: ServerWithId;
@ -10,11 +11,8 @@ export type DeleteServerModalProps = {
open: boolean;
};
type DeleteServerModalConnectProps = DeleteServerModalProps & {
deleteServer: (server: ServerWithId) => void;
};
export const DeleteServerModal: FC<DeleteServerModalConnectProps> = ({ server, onClose, open, deleteServer }) => {
export const DeleteServerModal: FC<DeleteServerModalProps> = ({ server, onClose, open }) => {
const { deleteServer } = useServers();
const onClosed = useCallback((exitAction: ExitAction) => {
if (exitAction === 'confirm') {
deleteServer(server);

View File

@ -1,26 +1,17 @@
import { Button,useParsedQuery } from '@shlinkio/shlink-frontend-kit';
import { Button, useParsedQuery } from '@shlinkio/shlink-frontend-kit';
import type { FC } from 'react';
import { NoMenuLayout } from '../common/NoMenuLayout';
import type { FCWithDeps } from '../container/utils';
import { componentFactory } from '../container/utils';
import { useGoBack } from '../utils/helpers/hooks';
import type { ServerData } from './data';
import { isServerWithId } from './data';
import { ServerForm } from './helpers/ServerForm';
import type { WithSelectedServerProps } from './helpers/withSelectedServer';
import { withSelectedServer } from './helpers/withSelectedServer';
import { useSelectedServer } from './reducers/selectedServer';
import { useServers } from './reducers/servers';
type EditServerProps = WithSelectedServerProps & {
editServer: (serverId: string, serverData: ServerData) => void;
};
type EditServerDeps = {
ServerError: FC;
};
const EditServer: FCWithDeps<EditServerProps, EditServerDeps> = withSelectedServer((
{ editServer, selectedServer, selectServer },
) => {
export const EditServer: FC = withSelectedServer(() => {
const { editServer } = useServers();
const { selectServer, selectedServer } = useSelectedServer();
const goBack = useGoBack();
const { reconnect } = useParsedQuery<{ reconnect?: 'true' }>();
@ -49,5 +40,3 @@ const EditServer: FCWithDeps<EditServerProps, EditServerDeps> = withSelectedServ
</NoMenuLayout>
);
});
export const EditServerFactory = componentFactory(EditServer, ['ServerError']);

View File

@ -5,33 +5,25 @@ import { Button, Result, SearchInput, SimpleCard, Table } from '@shlinkio/shlink
import type { FC } from 'react';
import { useMemo, useState } from 'react';
import { NoMenuLayout } from '../common/NoMenuLayout';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import type { ServersMap } from './data';
import type { ImportServersBtnProps } from './helpers/ImportServersBtn';
import type { ManageServersRowProps } from './ManageServersRow';
import { withDependencies } from '../container/context';
import { ImportServersBtn } from './helpers/ImportServersBtn';
import { withoutSelectedServer } from './helpers/withoutSelectedServer';
import { ManageServersRow } from './ManageServersRow';
import { useServers } from './reducers/servers';
import type { ServersExporter } from './services/ServersExporter';
type ManageServersProps = {
servers: ServersMap;
};
type ManageServersDeps = {
export type ManageServersProps = {
ServersExporter: ServersExporter;
ImportServersBtn: FC<ImportServersBtnProps>;
useTimeoutToggle: TimeoutToggle;
ManageServersRow: FC<ManageServersRowProps>;
};
const SHOW_IMPORT_MSG_TIME = 4000;
const ManageServers: FCWithDeps<ManageServersProps, ManageServersDeps> = ({ servers }) => {
const {
ServersExporter: serversExporter,
ImportServersBtn,
useTimeoutToggle,
ManageServersRow,
} = useDependencies(ManageServers);
const ManageServersBase: FC<ManageServersProps> = withoutSelectedServer(({
ServersExporter: serversExporter,
useTimeoutToggle,
}) => {
const { servers } = useServers();
const [searchTerm, setSearchTerm] = useState('');
const allServers = useMemo(() => Object.values(servers), [servers]);
const filteredServers = useMemo(
@ -39,7 +31,7 @@ const ManageServers: FCWithDeps<ManageServersProps, ManageServersDeps> = ({ serv
[allServers, searchTerm],
);
const hasAutoConnect = allServers.some(({ autoConnect }) => !!autoConnect);
// eslint-disable-next-line react-compiler/react-compiler
const [errorImporting, setErrorImporting] = useTimeoutToggle({ delay: SHOW_IMPORT_MSG_TIME });
return (
@ -51,12 +43,12 @@ const ManageServers: FCWithDeps<ManageServersProps, ManageServersDeps> = ({ serv
<ImportServersBtn className="flex-grow" onError={setErrorImporting}>Import servers</ImportServersBtn>
{filteredServers.length > 0 && (
<Button variant="secondary" className="flex-grow" onClick={async () => serversExporter.exportServers()}>
<FontAwesomeIcon icon={exportIcon} /> Export servers
<FontAwesomeIcon icon={exportIcon} widthAuto /> Export servers
</Button>
)}
</div>
<Button className="md:ml-auto" to="/server/create">
<FontAwesomeIcon icon={plusIcon} /> Add a server
<FontAwesomeIcon icon={plusIcon} widthAuto /> Add a server
</Button>
</div>
@ -87,11 +79,6 @@ const ManageServers: FCWithDeps<ManageServersProps, ManageServersDeps> = ({ serv
)}
</NoMenuLayout>
);
};
});
export const ManageServersFactory = componentFactory(ManageServers, [
'ServersExporter',
'ImportServersBtn',
'useTimeoutToggle',
'ManageServersRow',
]);
export const ManageServers = withDependencies(ManageServersBase, ['ServersExporter', 'useTimeoutToggle']);

View File

@ -3,22 +3,15 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Table, Tooltip, useTooltip } from '@shlinkio/shlink-frontend-kit';
import type { FC } from 'react';
import { Link } from 'react-router';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import type { ServerWithId } from './data';
import type { ManageServersRowDropdownProps } from './ManageServersRowDropdown';
import { ManageServersRowDropdown } from './ManageServersRowDropdown';
export type ManageServersRowProps = {
server: ServerWithId;
hasAutoConnect: boolean;
};
type ManageServersRowDeps = {
ManageServersRowDropdown: FC<ManageServersRowDropdownProps>;
};
const ManageServersRow: FCWithDeps<ManageServersRowProps, ManageServersRowDeps> = ({ server, hasAutoConnect }) => {
const { ManageServersRowDropdown } = useDependencies(ManageServersRow);
export const ManageServersRow: FC<ManageServersRowProps> = ({ server, hasAutoConnect }) => {
const { anchor, tooltip } = useTooltip();
return (
@ -31,6 +24,7 @@ const ManageServersRow: FCWithDeps<ManageServersRowProps, ManageServersRowDeps>
icon={checkIcon}
className="text-lm-brand dark:text-dm-brand"
{...anchor}
data-testid="auto-connect"
/>
<Tooltip {...tooltip}>Auto-connect to this server</Tooltip>
</>
@ -47,5 +41,3 @@ const ManageServersRow: FCWithDeps<ManageServersRowProps, ManageServersRowDeps>
</Table.Row>
);
};
export const ManageServersRowFactory = componentFactory(ManageServersRow, ['ManageServersRowDropdown']);

View File

@ -6,29 +6,18 @@ import {
faPlug as connectIcon,
} from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { RowDropdown,useToggle } from '@shlinkio/shlink-frontend-kit';
import { RowDropdown, useToggle } from '@shlinkio/shlink-frontend-kit';
import type { FC } from 'react';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import type { ServerWithId } from './data';
import type { DeleteServerModalProps } from './DeleteServerModal';
import { DeleteServerModal } from './DeleteServerModal';
import { useServers } from './reducers/servers';
export type ManageServersRowDropdownProps = {
server: ServerWithId;
};
type ManageServersRowDropdownConnectProps = ManageServersRowDropdownProps & {
setAutoConnect: (server: ServerWithId, autoConnect: boolean) => void;
};
type ManageServersRowDropdownDeps = {
DeleteServerModal: FC<DeleteServerModalProps>
};
const ManageServersRowDropdown: FCWithDeps<ManageServersRowDropdownConnectProps, ManageServersRowDropdownDeps> = (
{ server, setAutoConnect },
) => {
const { DeleteServerModal } = useDependencies(ManageServersRowDropdown);
export const ManageServersRowDropdown: FC<ManageServersRowDropdownProps> = ({ server }) => {
const { setAutoConnect } = useServers();
const { flag: isModalOpen, setToTrue: showModal, setToFalse: hideModal } = useToggle();
const serverUrl = `/server/${server.id}`;
const { autoConnect: isAutoConnect } = server;
@ -38,17 +27,17 @@ const ManageServersRowDropdown: FCWithDeps<ManageServersRowDropdownConnectProps,
<>
<RowDropdown menuAlignment="right">
<RowDropdown.Item to={serverUrl} className="gap-1.5">
<FontAwesomeIcon icon={connectIcon} fixedWidth /> Connect
<FontAwesomeIcon icon={connectIcon} /> Connect
</RowDropdown.Item>
<RowDropdown.Item to={`${serverUrl}/edit`} className="gap-1.5">
<FontAwesomeIcon icon={editIcon} fixedWidth /> Edit server
<FontAwesomeIcon icon={editIcon} /> Edit server
</RowDropdown.Item>
<RowDropdown.Item onClick={() => setAutoConnect(server, !isAutoConnect)} className="gap-1.5">
<FontAwesomeIcon icon={autoConnectIcon} fixedWidth /> {isAutoConnect ? 'Do not a' : 'A'}uto-connect
<FontAwesomeIcon icon={autoConnectIcon} /> {isAutoConnect ? 'Do not a' : 'A'}uto-connect
</RowDropdown.Item>
<RowDropdown.Separator />
<RowDropdown.Item className="[&]:text-danger gap-1.5" onClick={showModal}>
<FontAwesomeIcon icon={deleteIcon} fixedWidth /> Remove server
<FontAwesomeIcon icon={deleteIcon} /> Remove server
</RowDropdown.Item>
</RowDropdown>
@ -56,5 +45,3 @@ const ManageServersRowDropdown: FCWithDeps<ManageServersRowDropdownConnectProps,
</>
);
};
export const ManageServersRowDropdownFactory = componentFactory(ManageServersRowDropdown, ['DeleteServerModal']);

View File

@ -1,21 +1,20 @@
import { faPlus as plusIcon, faServer as serverIcon } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Dropdown, NavBar } from '@shlinkio/shlink-frontend-kit';
import type { SelectedServer, ServersMap } from './data';
import type { FC } from 'react';
import { getServerId } from './data';
import { useSelectedServer } from './reducers/selectedServer';
import { useServers } from './reducers/servers';
export interface ServersDropdownProps {
servers: ServersMap;
selectedServer: SelectedServer;
}
export const ServersDropdown = ({ servers, selectedServer }: ServersDropdownProps) => {
export const ServersDropdown: FC = () => {
const { servers } = useServers();
const serversList = Object.values(servers);
const { selectedServer } = useSelectedServer();
return (
<NavBar.Dropdown buttonContent={(
<span className="flex items-center gap-1.5">
<FontAwesomeIcon icon={serverIcon} fixedWidth /> Servers
<FontAwesomeIcon icon={serverIcon} /> Servers
</span>
)}>
{serversList.length === 0 ? (

View File

@ -26,18 +26,16 @@ const ServerListItem = ({ id, name }: { id: string; name: string }) => (
);
export const ServersListGroup: FC<ServersListGroupProps> = ({ servers, borderless }) => (
<>
{servers.length > 0 && (
<div
data-testid="list"
className={clsx(
'w-full border-lm-border dark:border-dm-border',
'md:max-h-56 md:overflow-y-auto -mb-1 scroll-thin',
{ 'border-y': !borderless },
)}
>
{servers.map(({ id, name }) => <ServerListItem key={id} id={id} name={name} />)}
</div>
)}
</>
servers.length > 0 && (
<div
data-testid="list"
className={clsx(
'w-full border-lm-border dark:border-dm-border',
'md:max-h-56 md:overflow-y-auto -mb-1 scroll-thin',
{ 'border-y': !borderless },
)}
>
{servers.map(({ id, name }) => <ServerListItem key={id} id={id} name={name} />)}
</div>
)
);

View File

@ -26,7 +26,7 @@ export const DuplicatedServersModal: FC<DuplicatedServersModalProps> = (
cancelText={hasMultipleServers ? 'Ignore duplicates' : 'Discard'}
>
<p>{hasMultipleServers ? 'The next servers already exist:' : 'There is already a server with:'}</p>
<ul className="list-disc mt-4">
<ul className="list-disc my-4 pl-5">
{duplicatedServers.map(({ url, apiKey }, index) => (!hasMultipleServers ? (
<Fragment key={index}>
<li>URL: <b>{url}</b></li>

View File

@ -1,11 +1,11 @@
import { faFileUpload as importIcon } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Button, Tooltip, useToggle , useTooltip } from '@shlinkio/shlink-frontend-kit';
import type { ChangeEvent, PropsWithChildren } from 'react';
import { Button, Tooltip, useToggle, useTooltip } from '@shlinkio/shlink-frontend-kit';
import type { ChangeEvent, FC, PropsWithChildren } from 'react';
import { useCallback, useRef, useState } from 'react';
import type { FCWithDeps } from '../../container/utils';
import { componentFactory, useDependencies } from '../../container/utils';
import type { ServerData, ServersMap, ServerWithId } from '../data';
import { withDependencies } from '../../container/context';
import type { ServerData } from '../data';
import { useServers } from '../reducers/servers';
import type { ServersImporter } from '../services/ServersImporter';
import { DuplicatedServersModal } from './DuplicatedServersModal';
import { dedupServers, ensureUniqueIds } from './index';
@ -15,27 +15,20 @@ export type ImportServersBtnProps = PropsWithChildren<{
onError?: (error: Error) => void;
tooltipPlacement?: 'top' | 'bottom';
className?: string;
// Injected
ServersImporter: ServersImporter
}>;
type ImportServersBtnConnectProps = ImportServersBtnProps & {
createServers: (servers: ServerWithId[]) => void;
servers: ServersMap;
};
type ImportServersBtnDeps = {
ServersImporter: ServersImporter
};
const ImportServersBtn: FCWithDeps<ImportServersBtnConnectProps, ImportServersBtnDeps> = ({
createServers,
servers,
const ImportServersBtnBase: FC<ImportServersBtnProps> = ({
children,
onImport,
onError = () => {},
tooltipPlacement = 'bottom',
className = '',
ServersImporter: serversImporter,
}) => {
const { ServersImporter: serversImporter } = useDependencies(ImportServersBtn);
const { createServers, servers } = useServers();
const fileInputRef = useRef<HTMLInputElement>(null);
const { anchor, tooltip } = useTooltip({ placement: tooltipPlacement });
const [duplicatedServers, setDuplicatedServers] = useState<ServerData[]>([]);
@ -84,7 +77,7 @@ const ImportServersBtn: FCWithDeps<ImportServersBtnConnectProps, ImportServersBt
return (
<>
<Button variant="secondary" className={className} onClick={() => fileInputRef.current?.click()} {...anchor}>
<FontAwesomeIcon icon={importIcon} fixedWidth /> {children ?? 'Import from file'}
<FontAwesomeIcon icon={importIcon} widthAuto /> {children ?? 'Import from file'}
</Button>
<Tooltip {...tooltip}>
You can create servers by importing a CSV file with <b>name</b>, <b>apiKey</b> and <b>url</b> columns.
@ -111,4 +104,4 @@ const ImportServersBtn: FCWithDeps<ImportServersBtnConnectProps, ImportServersBt
);
};
export const ImportServersBtnFactory = componentFactory(ImportServersBtn, ['ServersImporter']);
export const ImportServersBtn = withDependencies(ImportServersBtnBase, ['ServersImporter']);

View File

@ -2,24 +2,15 @@ import { Card, Message } from '@shlinkio/shlink-frontend-kit';
import type { FC } from 'react';
import { Link } from 'react-router';
import { NoMenuLayout } from '../../common/NoMenuLayout';
import type { FCWithDeps } from '../../container/utils';
import { componentFactory, useDependencies } from '../../container/utils';
import type { SelectedServer, ServersMap } from '../data';
import { isServerWithId } from '../data';
import type { DeleteServerButtonProps } from '../DeleteServerButton';
import { DeleteServerButton } from '../DeleteServerButton';
import { useSelectedServer } from '../reducers/selectedServer';
import { useServers } from '../reducers/servers';
import { ServersListGroup } from '../ServersListGroup';
type ServerErrorProps = {
servers: ServersMap;
selectedServer: SelectedServer;
};
type ServerErrorDeps = {
DeleteServerButton: FC<DeleteServerButtonProps>;
};
const ServerError: FCWithDeps<ServerErrorProps, ServerErrorDeps> = ({ servers, selectedServer }) => {
const { DeleteServerButton } = useDependencies(ServerError);
export const ServerError: FC = () => {
const { servers } = useServers();
const { selectedServer } = useSelectedServer();
return (
<NoMenuLayout>
@ -54,5 +45,3 @@ const ServerError: FCWithDeps<ServerErrorProps, ServerErrorDeps> = ({ servers, s
</NoMenuLayout>
);
};
export const ServerErrorFactory = componentFactory(ServerError, ['DeleteServerButton']);

View File

@ -3,27 +3,14 @@ import type { FC } from 'react';
import { useEffect } from 'react';
import { useParams } from 'react-router';
import { NoMenuLayout } from '../../common/NoMenuLayout';
import type { FCWithDeps } from '../../container/utils';
import { useDependencies } from '../../container/utils';
import type { SelectedServer } from '../data';
import { isNotFoundServer } from '../data';
import { useSelectedServer } from '../reducers/selectedServer';
import { ServerError } from './ServerError';
export type WithSelectedServerProps = {
selectServer: (serverId: string) => void;
selectedServer: SelectedServer;
};
type WithSelectedServerPropsDeps = {
ServerError: FC;
};
export function withSelectedServer<T extends object>(
WrappedComponent: FCWithDeps<WithSelectedServerProps & T, WithSelectedServerPropsDeps>,
) {
const ComponentWrapper: FCWithDeps<WithSelectedServerProps & T, WithSelectedServerPropsDeps> = (props) => {
const { ServerError } = useDependencies(ComponentWrapper);
export function withSelectedServer<T extends object>(WrappedComponent: FC<T>) {
const ComponentWrapper: FC<T> = (props) => {
const params = useParams<{ serverId: string }>();
const { selectServer, selectedServer } = props;
const { selectServer, selectedServer } = useSelectedServer();
useEffect(() => {
if (params.serverId) {

View File

@ -1,13 +1,10 @@
import type { FC } from 'react';
import { useEffect } from 'react';
import { useSelectedServer } from '../reducers/selectedServer';
interface WithoutSelectedServerProps {
resetSelectedServer: () => unknown;
}
export function withoutSelectedServer<T extends object>(WrappedComponent: FC<WithoutSelectedServerProps & T>) {
return (props: WithoutSelectedServerProps & T) => {
const { resetSelectedServer } = props;
export function withoutSelectedServer<T extends object>(WrappedComponent: FC<T>) {
return (props: T) => {
const { resetSelectedServer } = useSelectedServer();
useEffect(() => {
resetSelectedServer();
}, [resetSelectedServer]);

View File

@ -1,21 +1,46 @@
import type { HttpClient } from '@shlinkio/shlink-js-sdk';
import { useCallback, useEffect, useRef } from 'react';
import pack from '../../../package.json';
import { createAsyncThunk } from '../../utils/helpers/redux';
import { useDependencies } from '../../container/context';
import { useAppDispatch } from '../../store';
import { createAsyncThunk } from '../../store/helpers';
import { hasServerData } from '../data';
import { ensureUniqueIds } from '../helpers';
import { createServers } from './servers';
import { createServers, useServers } from './servers';
const responseToServersList = (data: any) => ensureUniqueIds(
{},
(Array.isArray(data) ? data.filter(hasServerData) : []),
);
export const fetchServers = (httpClient: HttpClient) => createAsyncThunk(
export const fetchServers = createAsyncThunk(
'shlink/remoteServers/fetchServers',
async (_: void, { dispatch }): Promise<void> => {
async (httpClient: HttpClient, { dispatch }): Promise<void> => {
const resp = await httpClient.jsonRequest<any>(`${pack.homepage}/servers.json`);
const result = responseToServersList(resp);
dispatch(createServers(result));
},
);
export const useRemoteServers = () => {
const dispatch = useAppDispatch();
const [httpClient] = useDependencies<[HttpClient]>('HttpClient');
const dispatchFetchServer = useCallback(() => dispatch(fetchServers(httpClient)), [dispatch, httpClient]);
return { fetchServers: dispatchFetchServer };
};
export const useLoadRemoteServers = () => {
const { fetchServers } = useRemoteServers();
const { servers } = useServers();
const initialServers = useRef(servers);
useEffect(() => {
// Try to fetch the remote servers if the list is empty during first render.
// We use a ref because we don't care if the servers list becomes empty later.
if (Object.keys(initialServers.current).length === 0) {
fetchServers();
}
}, [fetchServers]);
};

View File

@ -1,8 +1,11 @@
import { createAction, createSlice } from '@reduxjs/toolkit';
import { memoizeWith } from '@shlinkio/data-manipulation';
import type { ShlinkHealth } from '@shlinkio/shlink-web-component/api-contract';
import { useCallback } from 'react';
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
import { createAsyncThunk } from '../../utils/helpers/redux';
import { useDependencies } from '../../container/context';
import { useAppDispatch, useAppSelector } from '../../store';
import { createAsyncThunk } from '../../store/helpers';
import { versionToPrintable, versionToSemVer as toSemVer } from '../../utils/helpers/version';
import type { SelectedServer, ServerWithId } from '../data';
@ -29,9 +32,14 @@ const initialState: SelectedServer = null;
export const resetSelectedServer = createAction<void>(`${REDUCER_PREFIX}/resetSelectedServer`);
export const selectServer = (buildShlinkApiClient: ShlinkApiClientBuilder) => createAsyncThunk(
export type SelectServerOptions = {
serverId: string;
buildShlinkApiClient: ShlinkApiClientBuilder;
};
export const selectServer = createAsyncThunk(
`${REDUCER_PREFIX}/selectServer`,
async (serverId: string, { dispatch, getState }): Promise<SelectedServer> => {
async ({ serverId, buildShlinkApiClient }: SelectServerOptions, { dispatch, getState }): Promise<SelectedServer> => {
dispatch(resetSelectedServer());
const { servers } = getState();
@ -56,14 +64,29 @@ export const selectServer = (buildShlinkApiClient: ShlinkApiClientBuilder) => cr
},
);
type SelectServerThunk = ReturnType<typeof selectServer>;
export const selectedServerReducerCreator = (selectServerThunk: SelectServerThunk) => createSlice({
export const { reducer: selectedServerReducer } = createSlice({
name: REDUCER_PREFIX,
initialState,
initialState: initialState as SelectedServer,
reducers: {},
extraReducers: (builder) => {
builder.addCase(resetSelectedServer, () => initialState);
builder.addCase(selectServerThunk.fulfilled, (_, { payload }) => payload as any);
builder.addCase(selectServer.fulfilled, (_, { payload }) => payload);
},
});
export const useSelectedServer = () => {
const dispatch = useAppDispatch();
const [buildShlinkApiClient] = useDependencies<[ShlinkApiClientBuilder]>('buildShlinkApiClient');
const dispatchResetSelectedServer = useCallback(() => dispatch(resetSelectedServer()), [dispatch]);
const dispatchSelectServer = useCallback(
(serverId: string) => dispatch(selectServer({ serverId, buildShlinkApiClient })),
[buildShlinkApiClient, dispatch],
);
const selectedServer = useAppSelector(({ selectedServer }) => selectedServer);
return {
selectedServer,
resetSelectedServer: dispatchResetSelectedServer,
selectServer: dispatchSelectServer,
};
};

View File

@ -1,21 +1,23 @@
import type { PayloadAction } from '@reduxjs/toolkit';
import { createSlice } from '@reduxjs/toolkit';
import { useCallback } from 'react';
import { useAppDispatch, useAppSelector } from '../../store';
import type { ServerData, ServersMap, ServerWithId } from '../data';
import { serversListToMap } from '../helpers';
interface EditServer {
type EditServer = {
serverId: string;
serverData: Partial<ServerData>;
}
};
interface SetAutoConnect {
type SetAutoConnect = {
serverId: string;
autoConnect: boolean;
}
};
const initialState: ServersMap = {};
export const { actions, reducer } = createSlice({
export const { actions, reducer: serversReducer } = createSlice({
name: 'shlink/servers',
initialState,
reducers: {
@ -65,4 +67,19 @@ export const { actions, reducer } = createSlice({
export const { editServer, deleteServer, setAutoConnect, createServers } = actions;
export const serversReducer = reducer;
export const useServers = () => {
const dispatch = useAppDispatch();
const servers = useAppSelector((state) => state.servers);
const editServer = useCallback(
(serverId: string, serverData: Partial<ServerData>) => dispatch(actions.editServer(serverId, serverData)),
[dispatch],
);
const deleteServer = useCallback((server: ServerWithId) => dispatch(actions.deleteServer(server)), [dispatch]);
const setAutoConnect = useCallback(
(serverData: ServerWithId, autoConnect: boolean) => dispatch(actions.setAutoConnect(serverData, autoConnect)),
[dispatch],
);
const createServers = useCallback((servers: ServerWithId[]) => dispatch(actions.createServers(servers)), [dispatch]);
return { servers, editServer, deleteServer, setAutoConnect, createServers };
};

View File

@ -1,73 +0,0 @@
import type Bottle from 'bottlejs';
import type { ConnectDecorator } from '../../container/types';
import { CreateServerFactory } from '../CreateServer';
import { DeleteServerButtonFactory } from '../DeleteServerButton';
import { DeleteServerModal } from '../DeleteServerModal';
import { EditServerFactory } from '../EditServer';
import { ImportServersBtnFactory } from '../helpers/ImportServersBtn';
import { ServerErrorFactory } from '../helpers/ServerError';
import { withoutSelectedServer } from '../helpers/withoutSelectedServer';
import { ManageServersFactory } from '../ManageServers';
import { ManageServersRowFactory } from '../ManageServersRow';
import { ManageServersRowDropdownFactory } from '../ManageServersRowDropdown';
import { fetchServers } from '../reducers/remoteServers';
import {
resetSelectedServer,
selectedServerReducerCreator,
selectServer,
} from '../reducers/selectedServer';
import { createServers, deleteServer, editServer, setAutoConnect } from '../reducers/servers';
import { ServersDropdown } from '../ServersDropdown';
import { ServersExporter } from './ServersExporter';
import { ServersImporter } from './ServersImporter';
export const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
// Components
bottle.factory('ManageServers', ManageServersFactory);
bottle.decorator('ManageServers', withoutSelectedServer);
bottle.decorator('ManageServers', connect(['selectedServer', 'servers'], ['resetSelectedServer']));
bottle.factory('ManageServersRow', ManageServersRowFactory);
bottle.factory('ManageServersRowDropdown', ManageServersRowDropdownFactory);
bottle.decorator('ManageServersRowDropdown', connect(null, ['setAutoConnect']));
bottle.factory('CreateServer', CreateServerFactory);
bottle.decorator('CreateServer', withoutSelectedServer);
bottle.decorator('CreateServer', connect(['selectedServer', 'servers'], ['createServers', 'resetSelectedServer']));
bottle.factory('EditServer', EditServerFactory);
bottle.decorator('EditServer', connect(['selectedServer'], ['editServer', 'selectServer', 'resetSelectedServer']));
bottle.serviceFactory('ServersDropdown', () => ServersDropdown);
bottle.decorator('ServersDropdown', connect(['servers', 'selectedServer']));
bottle.serviceFactory('DeleteServerModal', () => DeleteServerModal);
bottle.decorator('DeleteServerModal', connect(null, ['deleteServer']));
bottle.factory('DeleteServerButton', DeleteServerButtonFactory);
bottle.factory('ImportServersBtn', ImportServersBtnFactory);
bottle.decorator('ImportServersBtn', connect(['servers'], ['createServers']));
bottle.factory('ServerError', ServerErrorFactory);
bottle.decorator('ServerError', connect(['servers', 'selectedServer']));
// Services
bottle.service('ServersImporter', ServersImporter, 'csvToJson');
bottle.service('ServersExporter', ServersExporter, 'Storage', 'window', 'jsonToCsv');
// Actions
bottle.serviceFactory('selectServer', selectServer, 'buildShlinkApiClient', 'loadMercureInfo');
bottle.serviceFactory('createServers', () => createServers);
bottle.serviceFactory('deleteServer', () => deleteServer);
bottle.serviceFactory('editServer', () => editServer);
bottle.serviceFactory('setAutoConnect', () => setAutoConnect);
bottle.serviceFactory('fetchServers', fetchServers, 'HttpClient');
bottle.serviceFactory('resetSelectedServer', () => resetSelectedServer);
// Reducers
bottle.serviceFactory('selectedServerReducerCreator', selectedServerReducerCreator, 'selectServer');
bottle.serviceFactory('selectedServerReducer', (obj) => obj.reducer, 'selectedServerReducerCreator');
};

View File

@ -1,20 +1,18 @@
import type { Settings as AppSettings } from '@shlinkio/shlink-web-component/settings';
import { ShlinkWebSettings } from '@shlinkio/shlink-web-component/settings';
import type { FC } from 'react';
import { NoMenuLayout } from '../common/NoMenuLayout';
import { DEFAULT_SHORT_URLS_ORDERING } from './reducers/settings';
import { DEFAULT_SHORT_URLS_ORDERING, useSettings } from './reducers/settings';
export type SettingsProps = {
settings: AppSettings;
setSettings: (newSettings: AppSettings) => void;
export const Settings: FC = () => {
const { settings, setSettings } = useSettings();
return (
<NoMenuLayout>
<ShlinkWebSettings
settings={settings}
onUpdateSettings={setSettings}
defaultShortUrlsListOrdering={DEFAULT_SHORT_URLS_ORDERING}
/>
</NoMenuLayout>
);
};
export const Settings: FC<SettingsProps> = ({ settings, setSettings }) => (
<NoMenuLayout>
<ShlinkWebSettings
settings={settings}
updateSettings={setSettings}
defaultShortUrlsListOrdering={DEFAULT_SHORT_URLS_ORDERING}
/>
</NoMenuLayout>
);

View File

@ -1,12 +1,6 @@
import type { ShlinkState } from '../../container/types';
export const migrateDeprecatedSettings = (state: Partial<ShlinkState>): Partial<ShlinkState> => {
if (!state.settings) {
return state;
}
export const migrateDeprecatedSettings = (state: any): any => {
// The "last180Days" interval had a typo, with a lowercase d
if (state.settings.visits && (state.settings.visits.defaultInterval as any) === 'last180days') {
if (state.settings?.visits?.defaultInterval === 'last180days') {
state.settings.visits.defaultInterval = 'last180Days';
}

View File

@ -3,6 +3,8 @@ import { createSlice } from '@reduxjs/toolkit';
import { mergeDeepRight } from '@shlinkio/data-manipulation';
import { getSystemPreferredTheme } from '@shlinkio/shlink-frontend-kit';
import type { Settings, ShortUrlsListSettings } from '@shlinkio/shlink-web-component/settings';
import { useCallback } from 'react';
import { useAppDispatch, useAppSelector } from '../../store';
import type { Defined } from '../../utils/types';
type ShortUrlsOrder = Defined<ShortUrlsListSettings['defaultOrdering']>;
@ -18,9 +20,7 @@ const initialState: Settings = {
realTimeUpdates: {
enabled: true,
},
shortUrlCreation: {
validateUrls: false,
},
shortUrlCreation: {},
ui: {
theme: getSystemPreferredTheme(),
},
@ -43,3 +43,11 @@ const { reducer, actions } = createSlice({
export const { setSettings } = actions;
export const settingsReducer = reducer;
export const useSettings = () => {
const dispatch = useAppDispatch();
const setSettings = useCallback((settings: Settings) => dispatch(actions.setSettings(settings)), [dispatch]);
const settings = useAppSelector((state) => state.settings);
return { settings, setSettings };
};

View File

@ -1,15 +0,0 @@
import type Bottle from 'bottlejs';
import type { ConnectDecorator } from '../../container/types';
import { withoutSelectedServer } from '../../servers/helpers/withoutSelectedServer';
import { setSettings } from '../reducers/settings';
import { Settings } from '../Settings';
export const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
// Components
bottle.serviceFactory('Settings', () => Settings);
bottle.decorator('Settings', withoutSelectedServer);
bottle.decorator('Settings', connect(['settings'], ['setSettings', 'resetSelectedServer']));
// Actions
bottle.serviceFactory('setSettings', () => setSettings);
};

View File

@ -1,10 +1,10 @@
import type { AsyncThunkPayloadCreator } from '@reduxjs/toolkit';
import { createAsyncThunk as baseCreateAsyncThunk } from '@reduxjs/toolkit';
import type { ShlinkState } from '../../container/types';
import type { RootState } from '.';
export const createAsyncThunk = <Returned, ThunkArg>(
typePrefix: string,
payloadCreator: AsyncThunkPayloadCreator<Returned, ThunkArg, { state: ShlinkState, serializedErrorType: any }>,
payloadCreator: AsyncThunkPayloadCreator<Returned, ThunkArg, { state: RootState, serializedErrorType: any }>,
) => baseCreateAsyncThunk(
typePrefix,
payloadCreator,

32
src/store/index.ts Normal file
View File

@ -0,0 +1,32 @@
import { configureStore } from '@reduxjs/toolkit';
import { useDispatch, useSelector } from 'react-redux';
import type { RLSOptions } from 'redux-localstorage-simple';
import { load, save } from 'redux-localstorage-simple';
import { migrateDeprecatedSettings } from '../settings/helpers';
import { initReducers } from './reducers';
const localStorageConfig: RLSOptions = {
states: ['settings', 'servers'],
namespace: 'shlink',
namespaceSeparator: '.',
debounce: 300,
};
const getStateFromLocalStorage = () => migrateDeprecatedSettings(load(localStorageConfig));
const isProduction = process.env.NODE_ENV === 'production';
export const setUpStore = (preloadedState = getStateFromLocalStorage()) => configureStore({
devTools: !isProduction,
reducer: initReducers(),
preloadedState,
middleware: (defaultMiddlewaresIncludingReduxThunk) =>
defaultMiddlewaresIncludingReduxThunk().concat(save(localStorageConfig)),
});
export type StoreType = ReturnType<typeof setUpStore>;
export type AppDispatch = StoreType['dispatch'];
export type GetState = StoreType['getState'];
export type RootState = ReturnType<GetState>;
// Typed versions of useDispatch() and useSelector()
export const useAppDispatch = useDispatch.withTypes<AppDispatch>();
export const useAppSelector = useSelector.withTypes<RootState>();

View File

@ -1,12 +1,12 @@
import { combineReducers } from '@reduxjs/toolkit';
import type { IContainer } from 'bottlejs';
import { appUpdatesReducer } from '../app/reducers/appUpdates';
import { selectedServerReducer } from '../servers/reducers/selectedServer';
import { serversReducer } from '../servers/reducers/servers';
import { settingsReducer } from '../settings/reducers/settings';
export const initReducers = (container: IContainer) => combineReducers({
export const initReducers = () => combineReducers({
appUpdated: appUpdatesReducer,
servers: serversReducer,
selectedServer: container.selectedServerReducer,
selectedServer: selectedServerReducer,
settings: settingsReducer,
});

View File

@ -8,7 +8,5 @@
:root {
--footer-height: 2.3rem;
--footer-margin: .8rem;
/* FIXME Remove this once updated to shlink-web-component 0.15.1 */
--header-height: 52px;
}
}

View File

@ -1,16 +0,0 @@
import { useTimeoutToggle } from '@shlinkio/shlink-frontend-kit';
import type Bottle from 'bottlejs';
import { csvToJson, jsonToCsv } from '../helpers/csvjson';
import { LocalStorage } from './LocalStorage';
import { TagColorsStorage } from './TagColorsStorage';
export const provideServices = (bottle: Bottle) => {
bottle.constant('localStorage', window.localStorage);
bottle.service('Storage', LocalStorage, 'localStorage');
bottle.service('TagColorsStorage', TagColorsStorage, 'Storage');
bottle.constant('csvToJson', csvToJson);
bottle.constant('jsonToCsv', jsonToCsv);
bottle.serviceFactory('useTimeoutToggle', () => useTimeoutToggle);
};

View File

@ -1,23 +0,0 @@
import type { FC, PropsWithChildren } from 'react';
import { useMemo } from 'react';
import { MemoryRouter, Route, Routes } from 'react-router';
export type MemoryRouterWithParamsProps = PropsWithChildren<{
params: Record<string, string>;
}>;
/**
* Wrap any component using useParams() with MemoryRouterWithParams, in order to determine wat the hook should return
*/
export const MemoryRouterWithParams: FC<MemoryRouterWithParamsProps> = ({ children, params }) => {
const pathname = useMemo(() => `/${Object.values(params).join('/')}`, [params]);
const pathPattern = useMemo(() => `/:${Object.keys(params).join('/:')}`, [params]);
return (
<MemoryRouter>
<Routes location={{ pathname }}>
<Route path={pathPattern} element={children} />
</Routes>
</MemoryRouter>
);
};

View File

@ -1,8 +0,0 @@
import { render } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import type { ReactElement } from 'react';
export const renderWithEvents = (element: ReactElement) => ({
user: userEvent.setup(),
...render(element),
});

View File

@ -0,0 +1,50 @@
import type { ShlinkApiClient } from '@shlinkio/shlink-js-sdk';
import type { RenderOptions } from '@testing-library/react';
import { render } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { fromPartial } from '@total-typescript/shoehorn';
import type { PropsWithChildren, ReactElement } from 'react';
import { Provider } from 'react-redux';
import { ContainerProvider } from '../../src/container/context';
import type { RootState } from '../../src/store';
import { setUpStore } from '../../src/store';
export const renderWithEvents = (element: ReactElement, options?: RenderOptions) => ({
user: userEvent.setup(),
...render(element, options),
});
export type RenderOptionsWithState = Omit<RenderOptions, 'wrapper'> & {
/** Initial state for the redux store */
initialState?: Partial<RootState>;
/**
* If provided, it will set this as the `buildShlinkApiClient` dependency in the `ContainerProvider`.
* If more dependencies are needed, then explicitly define your own `ContainerProvider` and make sure it includes a
* `buildShlinkApiClient` service.
*
* Defaults to vi.fn()
*/
buildShlinkApiClient?: () => ShlinkApiClient;
};
/**
* Render provided ReactElement wrapped in a redux `Provider` and a `ContainerProvider` with a single
* `buildShlinkApiClient` dependency.
*/
export const renderWithStore = (
element: ReactElement,
{ initialState = {}, buildShlinkApiClient = vi.fn(), ...options }: RenderOptionsWithState = {},
) => {
const store = setUpStore(initialState);
const Wrapper = ({ children }: PropsWithChildren) => (
<ContainerProvider value={fromPartial({ buildShlinkApiClient })}>
<Provider store={store}>{children}</Provider>
</ContainerProvider>
);
return {
store,
...renderWithEvents(element, { ...options, wrapper: Wrapper }),
};
};

View File

@ -1,50 +1,51 @@
import { act, render, screen } from '@testing-library/react';
import type { HttpClient } from '@shlinkio/shlink-js-sdk';
import { act, screen } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { MemoryRouter } from 'react-router';
import { AppFactory } from '../../src/app/App';
import { App } from '../../src/app/App';
import { ContainerProvider } from '../../src/container/context';
import type { ServerWithId } from '../../src/servers/data';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithStore } from '../__helpers__/setUpTest';
vi.mock(import('../../src/common/ShlinkWebComponentContainer'), () => ({
ShlinkWebComponentContainer: () => <span>ShlinkWebComponentContainer</span>,
}));
describe('<App />', () => {
const App = AppFactory(
fromPartial({
MainHeader: () => <>MainHeader</>,
Home: () => <>Home</>,
ShlinkWebComponentContainer: () => <>ShlinkWebComponentContainer</>,
CreateServer: () => <>CreateServer</>,
EditServer: () => <>EditServer</>,
Settings: () => <>SettingsComp</>,
ManageServers: () => <>ManageServers</>,
ShlinkVersionsContainer: () => <>ShlinkVersions</>,
}),
);
const setUp = async (activeRoute = '/') => act(() => render(
const setUp = async (activeRoute = '/') => act(() => renderWithStore(
<MemoryRouter initialEntries={[{ pathname: activeRoute }]}>
<App
fetchServers={() => {}}
servers={{}}
settings={fromPartial({})}
appUpdated={false}
resetAppUpdate={() => {}}
/>
<ContainerProvider
value={fromPartial({
HttpClient: fromPartial<HttpClient>({}),
buildShlinkApiClient: vi.fn(),
useTimeoutToggle: vi.fn().mockReturnValue([false, vi.fn()]),
})}
>
<App />
</ContainerProvider>
</MemoryRouter>,
{
initialState: {
servers: {
abc123: fromPartial<ServerWithId>({ id: 'abc123', name: 'abc123 server' }),
def456: fromPartial<ServerWithId>({ id: 'def456', name: 'def456 server' }),
},
settings: fromPartial({}),
appUpdated: false,
},
},
));
it('passes a11y checks', () => checkAccessibility(setUp()));
it('renders children components', async () => {
await setUp();
expect(screen.getByText('MainHeader')).toBeInTheDocument();
expect(screen.getByText('ShlinkVersions')).toBeInTheDocument();
});
it.each([
['/settings/foo', 'SettingsComp'],
['/settings/bar', 'SettingsComp'],
['/manage-servers', 'ManageServers'],
['/server/create', 'CreateServer'],
['/server/abc123/edit', 'EditServer'],
['/server/def456/edit', 'EditServer'],
['/settings/general', 'User interface'],
['/settings/short-urls', 'Short URLs form'],
['/manage-servers', 'Add a server'],
['/server/create', 'Add new server'],
['/server/abc123/edit', 'Edit "abc123 server"'],
['/server/def456/edit', 'Edit "def456 server"'],
['/server/abc123/foo', 'ShlinkWebComponentContainer'],
['/server/def456/bar', 'ShlinkWebComponentContainer'],
['/other', 'Oops! We could not find requested route.'],

View File

@ -1,15 +1,19 @@
import { render, screen } from '@testing-library/react';
import { screen } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { MemoryRouter } from 'react-router';
import { Home } from '../../src/common/Home';
import type { ServersMap, ServerWithId } from '../../src/servers/data';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithStore } from '../__helpers__/setUpTest';
describe('<Home />', () => {
const setUp = (servers: ServersMap = {}) => render(
const setUp = (servers: ServersMap = {}) => renderWithStore(
<MemoryRouter>
<Home servers={servers} />
<Home />
</MemoryRouter>,
{
initialState: { servers },
},
);
it('passes a11y checks', () => checkAccessibility(

View File

@ -1,22 +1,17 @@
import { screen } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { createMemoryHistory } from 'history';
import { Router } from 'react-router';
import { MainHeaderFactory } from '../../src/common/MainHeader';
import { MainHeader } from '../../src/common/MainHeader';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithEvents } from '../__helpers__/setUpTest';
import { renderWithStore } from '../__helpers__/setUpTest';
describe('<MainHeader />', () => {
const MainHeader = MainHeaderFactory(fromPartial({
// Fake this component as a li[role="menuitem"], as it gets rendered inside a ul[role="menu"]
ServersDropdown: () => <li role="menuitem">ServersDropdown</li>,
}));
const setUp = (pathname = '') => {
const history = createMemoryHistory();
history.push(pathname);
return renderWithEvents(
<Router location={history.location} navigator={history}>
return renderWithStore(
<Router location={history.location} navigator={history} unstable_useTransitions={false}>
<MainHeader />
</Router>,
);
@ -26,7 +21,7 @@ describe('<MainHeader />', () => {
it('renders ServersDropdown', () => {
setUp();
expect(screen.getByText('ServersDropdown')).toBeInTheDocument();
expect(screen.getByRole('button', { name: 'Servers' })).toBeInTheDocument();
});
it.each([

View File

@ -1,13 +1,13 @@
import { render } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { ShlinkVersionsContainer } from '../../src/common/ShlinkVersionsContainer';
import type { ReachableServer, SelectedServer } from '../../src/servers/data';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithStore } from '../__helpers__/setUpTest';
describe('<ShlinkVersionsContainer />', () => {
const setUp = (selectedServer: SelectedServer = null) => render(
<ShlinkVersionsContainer selectedServer={selectedServer} />,
);
const setUp = (selectedServer: SelectedServer = null) => renderWithStore(<ShlinkVersionsContainer />, {
initialState: { selectedServer },
});
it.each([
[null],

View File

@ -1,21 +1,25 @@
import { render, screen } from '@testing-library/react';
import { screen } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { ShlinkWebComponentContainerFactory } from '../../src/common/ShlinkWebComponentContainer';
import { MemoryRouter } from 'react-router';
import { ShlinkWebComponentContainer } from '../../src/common/ShlinkWebComponentContainer';
import type { NonReachableServer, NotFoundServer, SelectedServer } from '../../src/servers/data';
import { checkAccessibility } from '../__helpers__/accessibility';
import { MemoryRouterWithParams } from '../__helpers__/MemoryRouterWithParams';
import { renderWithStore } from '../__helpers__/setUpTest';
vi.mock('@shlinkio/shlink-web-component', () => ({
ShlinkSidebarVisibilityProvider: ({ children }: any) => children,
ShlinkSidebarToggleButton: ({ children }: any) => children,
ShlinkWebComponent: () => <>ShlinkWebComponent</>,
}));
describe('<ShlinkWebComponentContainer />', () => {
const ShlinkWebComponentContainer = ShlinkWebComponentContainerFactory(fromPartial({
buildShlinkApiClient: vi.fn().mockReturnValue(fromPartial({})),
TagColorsStorage: fromPartial({}),
ShlinkWebComponent: () => <>ShlinkWebComponent</>,
ServerError: () => <>ServerError</>,
}));
const setUp = (selectedServer: SelectedServer) => render(
<MemoryRouterWithParams params={{ serverId: 'abc123' }}>
<ShlinkWebComponentContainer selectServer={vi.fn()} selectedServer={selectedServer} settings={{}} />
</MemoryRouterWithParams>,
const setUp = (selectedServer: SelectedServer) => renderWithStore(
<MemoryRouter>
<ShlinkWebComponentContainer TagColorsStorage={fromPartial({})} />
</MemoryRouter>,
{
initialState: { selectedServer, servers: {}, settings: {} },
},
);
it('passes a11y checks', () => checkAccessibility(setUp(fromPartial({ version: '3.0.0' }))));
@ -24,18 +28,20 @@ describe('<ShlinkWebComponentContainer />', () => {
setUp(null);
expect(screen.getByText('Loading...')).toBeInTheDocument();
expect(screen.queryByText('ServerError')).not.toBeInTheDocument();
expect(screen.queryByText('ShlinkWebComponent')).not.toBeInTheDocument();
});
it.each([
[fromPartial<NotFoundServer>({ serverNotFound: true })],
[fromPartial<NonReachableServer>({ serverNotReachable: true })],
])('shows error for non reachable servers', (selectedServer) => {
[fromPartial<NotFoundServer>({ serverNotFound: true }), 'Could not find this Shlink server.'],
[
fromPartial<NonReachableServer>({ id: 'foo', serverNotReachable: true }),
/Could not connect to this Shlink server/,
],
])('shows error for non reachable servers', (selectedServer, expectedError) => {
setUp(selectedServer);
expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
expect(screen.getByText('ServerError')).toBeInTheDocument();
expect(screen.getByText(expectedError)).toBeInTheDocument();
expect(screen.queryByText('ShlinkWebComponent')).not.toBeInTheDocument();
});
@ -43,7 +49,6 @@ describe('<ShlinkWebComponentContainer />', () => {
setUp(fromPartial({ version: '3.0.0' }));
expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
expect(screen.queryByText('ServerError')).not.toBeInTheDocument();
expect(screen.getByText('ShlinkWebComponent')).toBeInTheDocument();
});
});

View File

@ -0,0 +1,39 @@
import { render } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { ContainerProvider, useDependencies } from '../../src/container/context';
describe('context', () => {
describe('useDependencies', () => {
let lastDependencies: unknown[];
function TestComponent({ name}: { name: string }) {
// eslint-disable-next-line react-compiler/react-compiler
lastDependencies = useDependencies(name);
return null;
}
it('throws when used outside of ContainerProvider', () => {
expect(() => render(<TestComponent name="foo" />)).toThrowError(
'You cannot use "useDependencies" outside of a ContainerProvider',
);
});
it('throws when requested dependency is not found in container', () => {
expect(() => render(
<ContainerProvider value={fromPartial({})}>
<TestComponent name="foo" />
</ContainerProvider>,
)).toThrowError('Dependency with name "foo" not found in container');
});
it('gets dependency from container', () => {
render(
<ContainerProvider value={fromPartial({ foo: 'the dependency' })}>
<TestComponent name="foo" />
</ContainerProvider>,
);
expect(lastDependencies).toEqual(['the dependency']);
});
});
});

View File

@ -2,10 +2,10 @@ import { fireEvent, screen, waitFor } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { createMemoryHistory } from 'history';
import { Router } from 'react-router';
import { CreateServerFactory } from '../../src/servers/CreateServer';
import { CreateServer } from '../../src/servers/CreateServer';
import type { ServersMap } from '../../src/servers/data';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithEvents } from '../__helpers__/setUpTest';
import { renderWithStore } from '../__helpers__/setUpTest';
type SetUpOptions = {
serversImported?: boolean;
@ -14,9 +14,8 @@ type SetUpOptions = {
};
describe('<CreateServer />', () => {
const createServersMock = vi.fn();
const defaultServers: ServersMap = {
foo: fromPartial({ url: 'https://existing_url.com', apiKey: 'existing_api_key' }),
foo: fromPartial({ url: 'https://existing_url.com', apiKey: 'existing_api_key', id: 'foo' }),
};
const setUp = ({ serversImported = false, importFailed = false, servers = defaultServers }: SetUpOptions = {}) => {
let callCount = 0;
@ -25,18 +24,17 @@ describe('<CreateServer />', () => {
callCount += 1;
return result;
});
const CreateServer = CreateServerFactory(fromPartial({
ImportServersBtn: () => <>ImportServersBtn</>,
useTimeoutToggle,
}));
const history = createMemoryHistory({ initialEntries: ['/foo', '/bar'] });
return {
history,
...renderWithEvents(
<Router location={history.location} navigator={history}>
<CreateServer createServers={createServersMock} servers={servers} />
...renderWithStore(
<Router location={history.location} navigator={history} unstable_useTransitions={false}>
<CreateServer useTimeoutToggle={useTimeoutToggle} />
</Router>,
{
initialState: { servers },
},
),
};
};
@ -62,27 +60,24 @@ describe('<CreateServer />', () => {
expect(screen.getByText('The servers could not be imported. Make sure the format is correct.')).toBeInTheDocument();
});
it('shows import button when no servers exist yet', () => {
setUp({ servers: {} });
expect(screen.queryByText('ImportServersBtn')).toBeInTheDocument();
});
it('creates server data when form is submitted', async () => {
const { user, history } = setUp();
expect(createServersMock).not.toHaveBeenCalled();
const { user, history, store } = setUp();
const expectedServerId = 'the_name-the_url.com';
await user.type(screen.getByLabelText(/^Name/), 'the_name');
await user.type(screen.getByLabelText(/^URL/), 'https://the_url.com');
await user.type(screen.getByLabelText(/^API key/), 'the_api_key');
fireEvent.submit(screen.getByRole('form'));
expect(createServersMock).toHaveBeenCalledWith([expect.objectContaining({
expect(store.getState().servers[expectedServerId]).not.toBeDefined();
fireEvent.submit(screen.getByRole('form'));
expect(store.getState().servers[expectedServerId]).toEqual(expect.objectContaining({
id: expectedServerId,
name: 'the_name',
url: 'https://the_url.com',
apiKey: 'the_api_key',
})]);
expect(history.location.pathname).toEqual(expect.stringMatching(/^\/server\//));
}));
expect(history.location.pathname).toEqual(`/server/${expectedServerId}`);
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
});
@ -92,12 +87,12 @@ describe('<CreateServer />', () => {
await user.type(screen.getByLabelText(/^Name/), 'the_name');
await user.type(screen.getByLabelText(/^URL/), 'https://existing_url.com');
await user.type(screen.getByLabelText(/^API key/), 'existing_api_key');
fireEvent.submit(screen.getByRole('form'));
await waitFor(() => expect(screen.getByRole('dialog')).toBeInTheDocument());
await user.click(screen.getByRole('button', { name: 'Discard' }));
expect(createServersMock).not.toHaveBeenCalled();
expect(history.location.pathname).toEqual('/foo'); // Goes back to first route from history's initialEntries
});
});

View File

@ -3,20 +3,15 @@ import { fromPartial } from '@total-typescript/shoehorn';
import { createMemoryHistory } from 'history';
import type { ReactNode } from 'react';
import { Router } from 'react-router';
import { DeleteServerButtonFactory } from '../../src/servers/DeleteServerButton';
import type { DeleteServerModalProps } from '../../src/servers/DeleteServerModal';
import { DeleteServerModal } from '../../src/servers/DeleteServerModal';
import { DeleteServerButton } from '../../src/servers/DeleteServerButton';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithEvents } from '../__helpers__/setUpTest';
import { renderWithStore } from '../__helpers__/setUpTest';
describe('<DeleteServerButton />', () => {
const DeleteServerButton = DeleteServerButtonFactory(fromPartial({
DeleteServerModal: (props: DeleteServerModalProps) => <DeleteServerModal {...props} deleteServer={vi.fn()} />,
}));
const setUp = (children: ReactNode = 'Remove this server') => {
const history = createMemoryHistory({ initialEntries: ['/foo'] });
const result = renderWithEvents(
<Router location={history.location} navigator={history}>
const result = renderWithStore(
<Router location={history.location} navigator={history} unstable_useTransitions={false}>
<DeleteServerButton server={fromPartial({})}>{children}</DeleteServerButton>
</Router>,
);

View File

@ -1,23 +1,23 @@
import { screen } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import type { ServerWithId } from '../../src/servers/data';
import { DeleteServerModal } from '../../src/servers/DeleteServerModal';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithEvents } from '../__helpers__/setUpTest';
import { renderWithStore } from '../__helpers__/setUpTest';
import { TestModalWrapper } from '../__helpers__/TestModalWrapper';
describe('<DeleteServerModal />', () => {
const deleteServerMock = vi.fn();
const serverName = 'the_server_name';
const setUp = () => renderWithEvents(
const server = fromPartial<ServerWithId>({ id: 'foo', name: serverName });
const setUp = () => renderWithStore(
<TestModalWrapper
renderModal={(args) => (
<DeleteServerModal
{...args}
server={fromPartial({ name: serverName })}
deleteServer={deleteServerMock}
/>
)}
renderModal={(args) => <DeleteServerModal {...args} server={server} />}
/>,
{
initialState: {
servers: { foo: server },
},
},
);
it('passes a11y checks', () => checkAccessibility(setUp()));
@ -40,19 +40,21 @@ describe('<DeleteServerModal />', () => {
[() => screen.getByRole('button', { name: 'Cancel' })],
[() => screen.getByLabelText('Close dialog')],
])('closes dialog when clicking cancel button', async (getButton) => {
const { user } = setUp();
const { user, store } = setUp();
expect(screen.getByRole('dialog')).toBeInTheDocument();
await user.click(getButton());
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
expect(deleteServerMock).not.toHaveBeenCalled();
// No server has been deleted
expect(Object.keys(store.getState().servers)).toHaveLength(1);
});
it('deletes server when clicking accept button', async () => {
const { user } = setUp();
const { user, store } = setUp();
expect(deleteServerMock).not.toHaveBeenCalled();
expect(Object.keys(store.getState().servers)).toHaveLength(1);
await user.click(screen.getByRole('button', { name: 'Delete' }));
expect(deleteServerMock).toHaveBeenCalledOnce();
expect(Object.keys(store.getState().servers)).toHaveLength(0);
});
});

View File

@ -1,30 +1,34 @@
import { fireEvent, screen } from '@testing-library/react';
import { fireEvent, screen, waitFor } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { createMemoryHistory } from 'history';
import { Router } from 'react-router';
import type { ReachableServer, SelectedServer } from '../../src/servers/data';
import { EditServerFactory } from '../../src/servers/EditServer';
import { isServerWithId } from '../../src/servers/data';
import { EditServer } from '../../src/servers/EditServer';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithEvents } from '../__helpers__/setUpTest';
import { renderWithStore } from '../__helpers__/setUpTest';
describe('<EditServer />', () => {
const ServerError = vi.fn();
const editServerMock = vi.fn();
const defaultSelectedServer = fromPartial<ReachableServer>({
id: 'abc123',
name: 'the_name',
url: 'the_url',
apiKey: 'the_api_key',
});
const EditServer = EditServerFactory(fromPartial({ ServerError }));
const setUp = (selectedServer: SelectedServer = defaultSelectedServer) => {
const history = createMemoryHistory({ initialEntries: ['/foo', '/bar'] });
return {
history,
...renderWithEvents(
<Router location={history.location} navigator={history}>
<EditServer editServer={editServerMock} selectedServer={selectedServer} selectServer={vi.fn()} />
...renderWithStore(
<Router location={history.location} navigator={history} unstable_useTransitions={false}>
<EditServer />
</Router>,
{
initialState: {
selectedServer,
servers: isServerWithId(selectedServer) ? { [selectedServer.id]: selectedServer } : {},
},
},
),
};
};
@ -53,7 +57,7 @@ describe('<EditServer />', () => {
});
it('edits server and redirects to it when form is submitted', async () => {
const { user, history } = setUp();
const { user, history, store } = setUp();
await user.type(screen.getByLabelText(/^Name/), ' edited');
await user.type(screen.getByLabelText(/^URL/), ' edited');
@ -61,12 +65,10 @@ describe('<EditServer />', () => {
// await user.click(screen.getByRole('button', { name: 'Save' }));
fireEvent.submit(screen.getByRole('form'));
expect(editServerMock).toHaveBeenCalledWith('abc123', {
expect(store.getState().servers[defaultSelectedServer.id]).toEqual(expect.objectContaining({
name: 'the_name edited',
url: 'the_url edited',
apiKey: 'the_api_key',
forwardCredentials: false,
});
}));
// After saving we go back, to the first route from history's initialEntries
expect(history.location.pathname).toEqual('/foo');
@ -75,16 +77,15 @@ describe('<EditServer />', () => {
it.each([
{ forwardCredentials: true },
{ forwardCredentials: false },
])('edits advanced options - forward credentials', async (serverPartial) => {
const { user } = setUp({ ...defaultSelectedServer, ...serverPartial });
])('edits advanced options - forward credentials', async ({ forwardCredentials }) => {
const { user, store } = setUp({ ...defaultSelectedServer, forwardCredentials });
await user.click(screen.getByText('Advanced options'));
await user.click(screen.getByLabelText('Forward credentials to this server on every request.'));
fireEvent.submit(screen.getByRole('form'));
expect(editServerMock).toHaveBeenCalledWith('abc123', expect.objectContaining({
forwardCredentials: !serverPartial.forwardCredentials,
}));
await waitFor(() => expect(store.getState().servers[defaultSelectedServer.id]).toEqual(expect.objectContaining({
forwardCredentials: !forwardCredentials,
})));
});
});

View File

@ -2,28 +2,25 @@ import { screen, waitFor } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { MemoryRouter } from 'react-router';
import type { ServersMap, ServerWithId } from '../../src/servers/data';
import { ManageServersFactory } from '../../src/servers/ManageServers';
import { ManageServers } from '../../src/servers/ManageServers';
import type { ServersExporter } from '../../src/servers/services/ServersExporter';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithEvents } from '../__helpers__/setUpTest';
import { renderWithStore } from '../__helpers__/setUpTest';
describe('<ManageServers />', () => {
const exportServers = vi.fn();
const serversExporter = fromPartial<ServersExporter>({ exportServers });
const useTimeoutToggle = vi.fn().mockReturnValue([false, vi.fn()]);
const ManageServers = ManageServersFactory(fromPartial({
ServersExporter: serversExporter,
ImportServersBtn: () => <span>ImportServersBtn</span>,
useTimeoutToggle,
ManageServersRow: ({ hasAutoConnect }: { hasAutoConnect: boolean }) => (
<tr><td>ManageServersRow {hasAutoConnect ? '[YES]' : '[NO]'}</td></tr>
),
}));
const createServerMock = (value: string, autoConnect = false) => fromPartial<ServerWithId>(
{ id: value, name: value, url: value, autoConnect },
);
const setUp = (servers: ServersMap = {}) => renderWithEvents(
<MemoryRouter><ManageServers servers={servers} /></MemoryRouter>,
const setUp = (servers: ServersMap = {}) => renderWithStore(
<MemoryRouter>
<ManageServers useTimeoutToggle={useTimeoutToggle} ServersExporter={serversExporter} />
</MemoryRouter>,
{
initialState: { servers },
},
);
it('passes a11y checks', () => checkAccessibility(setUp({
@ -42,20 +39,22 @@ describe('<ManageServers />', () => {
await user.clear(screen.getByPlaceholderText('Search...'));
await user.type(screen.getByPlaceholderText('Search...'), searchTerm);
};
// Add one for the header row
const expectRows = (amount: number) => expect(screen.getAllByRole('row')).toHaveLength(amount + 1);
expect(screen.getAllByText(/^ManageServersRow/)).toHaveLength(3);
expectRows(3);
expect(screen.queryByText('No servers found.')).not.toBeInTheDocument();
await search('foo');
await waitFor(() => expect(screen.getAllByText(/^ManageServersRow/)).toHaveLength(1));
await waitFor(() => expectRows(1));
expect(screen.queryByText('No servers found.')).not.toBeInTheDocument();
await search('Ba');
await waitFor(() => expect(screen.getAllByText(/^ManageServersRow/)).toHaveLength(2));
await waitFor(() => expectRows(2));
expect(screen.queryByText('No servers found.')).not.toBeInTheDocument();
await search('invalid');
await waitFor(() => expect(screen.queryByText(/^ManageServersRow/)).not.toBeInTheDocument());
await waitFor(() => expectRows(1));
expect(screen.getByText('No servers found.')).toBeInTheDocument();
});
@ -67,11 +66,9 @@ describe('<ManageServers />', () => {
expect(screen.getAllByRole('columnheader')).toHaveLength(expectedCols);
if (server.autoConnect) {
expect(screen.getByText(/\[YES]/)).toBeInTheDocument();
expect(screen.queryByText(/\[NO]/)).not.toBeInTheDocument();
expect(screen.getByTestId('auto-connect')).toBeInTheDocument();
} else {
expect(screen.queryByText(/\[YES]/)).not.toBeInTheDocument();
expect(screen.getByText(/\[NO]/)).toBeInTheDocument();
expect(screen.queryByTestId('auto-connect')).not.toBeInTheDocument();
}
});

View File

@ -1,22 +1,19 @@
import { Table } from '@shlinkio/shlink-frontend-kit';
import { render, screen } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { screen } from '@testing-library/react';
import { MemoryRouter } from 'react-router';
import type { ServerWithId } from '../../src/servers/data';
import { ManageServersRowFactory } from '../../src/servers/ManageServersRow';
import { ManageServersRow } from '../../src/servers/ManageServersRow';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithStore } from '../__helpers__/setUpTest';
describe('<ManageServersRow />', () => {
const ManageServersRow = ManageServersRowFactory(fromPartial({
ManageServersRowDropdown: () => <span>ManageServersRowDropdown</span>,
}));
const server: ServerWithId = {
name: 'My server',
url: 'https://example.com',
apiKey: '123',
id: 'abc',
};
const setUp = (hasAutoConnect = false, autoConnect = false) => render(
const setUp = (hasAutoConnect = false, autoConnect = false) => renderWithStore(
<MemoryRouter>
<Table header={<Table.Row />}>
<ManageServersRow server={{ ...server, autoConnect }} hasAutoConnect={hasAutoConnect} />
@ -34,9 +31,9 @@ describe('<ManageServersRow />', () => {
expect(screen.getAllByRole('cell')).toHaveLength(expectedCols);
});
it('renders a dropdown', () => {
it('renders an options dropdown', () => {
setUp();
expect(screen.getByText('ManageServersRowDropdown')).toBeInTheDocument();
expect(screen.getByRole('button', { name: 'Options' })).toBeInTheDocument();
});
it.each([

View File

@ -3,23 +3,22 @@ import type { UserEvent } from '@testing-library/user-event';
import { fromPartial } from '@total-typescript/shoehorn';
import { MemoryRouter } from 'react-router';
import type { ServerWithId } from '../../src/servers/data';
import { ManageServersRowDropdownFactory } from '../../src/servers/ManageServersRowDropdown';
import { ManageServersRowDropdown } from '../../src/servers/ManageServersRowDropdown';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithEvents } from '../__helpers__/setUpTest';
import { renderWithStore } from '../__helpers__/setUpTest';
describe('<ManageServersRowDropdown />', () => {
const ManageServersRowDropdown = ManageServersRowDropdownFactory(fromPartial({
DeleteServerModal: ({ open }: { open: boolean }) => (
<span>DeleteServerModal {open ? '[OPEN]' : '[CLOSED]'}</span>
),
}));
const setAutoConnect = vi.fn();
const setUp = (autoConnect = false) => {
const server = fromPartial<ServerWithId>({ id: 'abc123', autoConnect });
return renderWithEvents(
return renderWithStore(
<MemoryRouter>
<ManageServersRowDropdown setAutoConnect={setAutoConnect} server={server} />
<ManageServersRowDropdown server={server} />
</MemoryRouter>,
{
initialState: {
servers: { [server.id]: server },
},
},
);
};
const toggleDropdown = (user: UserEvent) => user.click(screen.getByRole('button'));
@ -44,26 +43,24 @@ describe('<ManageServersRowDropdown />', () => {
expect(screen.getByRole('menuitem', { name: 'Edit server' })).toHaveAttribute('href', '/server/abc123/edit');
});
it('allows toggling auto-connect', async () => {
const { user } = setUp();
it.each([true, false])('allows toggling auto-connect', async (autoConnect) => {
const { user, store } = setUp(autoConnect);
expect(setAutoConnect).not.toHaveBeenCalled();
await toggleDropdown(user);
await user.click(screen.getByRole('menuitem', { name: 'Auto-connect' }));
expect(setAutoConnect).toHaveBeenCalledWith(expect.objectContaining({ id: 'abc123' }), true);
await user.click(screen.getByRole('menuitem', { name: autoConnect ? 'Do not auto-connect' : 'Auto-connect' }));
expect(Object.values(store.getState().servers)[0].autoConnect).toEqual(!autoConnect);
});
it('renders deletion modal', async () => {
const { user } = setUp();
expect(screen.queryByText('DeleteServerModal [OPEN]')).not.toBeInTheDocument();
expect(screen.getByText('DeleteServerModal [CLOSED]')).toBeInTheDocument();
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
await toggleDropdown(user);
await user.click(screen.getByRole('menuitem', { name: 'Remove server' }));
expect(screen.getByText('DeleteServerModal [OPEN]')).toBeInTheDocument();
expect(screen.queryByText('DeleteServerModal [CLOSED]')).not.toBeInTheDocument();
expect(screen.getByRole('dialog')).toBeInTheDocument();
});
it.each([[true], [false]])('renders expected size and icon', (autoConnect) => {

View File

@ -4,7 +4,7 @@ import { MemoryRouter } from 'react-router';
import type { ServersMap } from '../../src/servers/data';
import { ServersDropdown } from '../../src/servers/ServersDropdown';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithEvents } from '../__helpers__/setUpTest';
import { renderWithStore } from '../__helpers__/setUpTest';
describe('<ServersDropdown />', () => {
const fallbackServers: ServersMap = {
@ -12,12 +12,15 @@ describe('<ServersDropdown />', () => {
'2b': fromPartial({ name: 'bar', id: '2b' }),
'3c': fromPartial({ name: 'baz', id: '3c' }),
};
const setUp = (servers: ServersMap = fallbackServers) => renderWithEvents(
const setUp = (servers: ServersMap = fallbackServers) => renderWithStore(
<MemoryRouter>
<ul role="menu">
<ServersDropdown servers={servers} selectedServer={null} />
<ServersDropdown />
</ul>
</MemoryRouter>,
{
initialState: { selectedServer: null, servers },
},
);
it('passes a11y checks', async () => {

View File

@ -27,13 +27,12 @@ exports[`<ManageServersRow /> > renders auto-connect icon only if server is auto
class="svg-inline--fa fa-check text-lm-brand dark:text-dm-brand"
data-icon="check"
data-prefix="fas"
focusable="false"
data-testid="auto-connect"
role="img"
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"
d="M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z"
fill="currentColor"
/>
</svg>
@ -58,9 +57,32 @@ exports[`<ManageServersRow /> > renders auto-connect icon only if server is auto
<td
class="border-lm-border dark:border-dm-border p-2 block lg:table-cell not-last:border-b-1 lg:border-b-1 before:lg:hidden before:content-[attr(data-column)] before:font-bold before:mr-1 text-right max-lg:absolute right-0 -top-1 mx-lg:pt-0"
>
<span>
ManageServersRowDropdown
</span>
<div
class="relative inline-block"
>
<button
aria-controls="_r_o_"
aria-expanded="false"
aria-haspopup="true"
aria-label="Options"
class="flex items-center rounded-md focus-ring cursor-pointer border border-lm-border dark:border-dm-border bg-lm-primary dark:bg-dm-primary group-[&]/card:bg-lm-input group-[&]/card:dark:bg-dm-input px-3 py-1.5 gap-x-2"
type="button"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-ellipsis-vertical fa-width-auto"
data-icon="ellipsis-vertical"
data-prefix="fas"
role="img"
viewBox="0 0 128 512"
>
<path
d="M64 144a56 56 0 1 1 0-112 56 56 0 1 1 0 112zm0 224c30.9 0 56 25.1 56 56s-25.1 56-56 56-56-25.1-56-56 25.1-56 56-56zm56-112c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z"
fill="currentColor"
/>
</svg>
</button>
</div>
</td>
</tr>
</tbody>
@ -110,9 +132,32 @@ exports[`<ManageServersRow /> > renders auto-connect icon only if server is auto
<td
class="border-lm-border dark:border-dm-border p-2 block lg:table-cell not-last:border-b-1 lg:border-b-1 before:lg:hidden before:content-[attr(data-column)] before:font-bold before:mr-1 text-right max-lg:absolute right-0 -top-1 mx-lg:pt-0"
>
<span>
ManageServersRowDropdown
</span>
<div
class="relative inline-block"
>
<button
aria-controls="_r_t_"
aria-expanded="false"
aria-haspopup="true"
aria-label="Options"
class="flex items-center rounded-md focus-ring cursor-pointer border border-lm-border dark:border-dm-border bg-lm-primary dark:bg-dm-primary group-[&]/card:bg-lm-input group-[&]/card:dark:bg-dm-input px-3 py-1.5 gap-x-2"
type="button"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-ellipsis-vertical fa-width-auto"
data-icon="ellipsis-vertical"
data-prefix="fas"
role="img"
viewBox="0 0 128 512"
>
<path
d="M64 144a56 56 0 1 1 0-112 56 56 0 1 1 0 112zm0 224c30.9 0 56 25.1 56 56s-25.1 56-56 56-56-25.1-56-56 25.1-56 56-56zm56-112c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z"
fill="currentColor"
/>
</svg>
</button>
</div>
</td>
</tr>
</tbody>

View File

@ -6,7 +6,7 @@ exports[`<ManageServersRowDropdown /> > renders expected size and icon 1`] = `
class="relative inline-block"
>
<button
aria-controls="«r9»"
aria-controls="_r_1v_"
aria-expanded="false"
aria-haspopup="true"
aria-label="Options"
@ -15,25 +15,19 @@ exports[`<ManageServersRowDropdown /> > renders expected size and icon 1`] = `
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-ellipsis-vertical "
class="svg-inline--fa fa-ellipsis-vertical fa-width-auto"
data-icon="ellipsis-vertical"
data-prefix="fas"
focusable="false"
role="img"
viewBox="0 0 128 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z"
d="M64 144a56 56 0 1 1 0-112 56 56 0 1 1 0 112zm0 224c30.9 0 56 25.1 56 56s-25.1 56-56 56-56-25.1-56-56 25.1-56 56-56zm56-112c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z"
fill="currentColor"
/>
</svg>
</button>
</div>
<span>
DeleteServerModal
[CLOSED]
</span>
</div>
`;
@ -43,7 +37,7 @@ exports[`<ManageServersRowDropdown /> > renders expected size and icon 2`] = `
class="relative inline-block"
>
<button
aria-controls="«rb»"
aria-controls="_r_23_"
aria-expanded="false"
aria-haspopup="true"
aria-label="Options"
@ -52,24 +46,18 @@ exports[`<ManageServersRowDropdown /> > renders expected size and icon 2`] = `
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-ellipsis-vertical "
class="svg-inline--fa fa-ellipsis-vertical fa-width-auto"
data-icon="ellipsis-vertical"
data-prefix="fas"
focusable="false"
role="img"
viewBox="0 0 128 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z"
d="M64 144a56 56 0 1 1 0-112 56 56 0 1 1 0 112zm0 224c30.9 0 56 25.1 56 56s-25.1 56-56 56-56-25.1-56-56 25.1-56 56-56zm56-112c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z"
fill="currentColor"
/>
</svg>
</button>
</div>
<span>
DeleteServerModal
[CLOSED]
</span>
</div>
`;

View File

@ -1,27 +1,22 @@
import { screen, waitFor } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import type { ServerData, ServersMap, ServerWithId } from '../../../src/servers/data';
import type {
ImportServersBtnProps } from '../../../src/servers/helpers/ImportServersBtn';
import { ImportServersBtnFactory } from '../../../src/servers/helpers/ImportServersBtn';
import type { ImportServersBtnProps } from '../../../src/servers/helpers/ImportServersBtn';
import { ImportServersBtn } from '../../../src/servers/helpers/ImportServersBtn';
import type { ServersImporter } from '../../../src/servers/services/ServersImporter';
import { checkAccessibility } from '../../__helpers__/accessibility';
import { renderWithEvents } from '../../__helpers__/setUpTest';
import { renderWithStore } from '../../__helpers__/setUpTest';
describe('<ImportServersBtn />', () => {
const csvFile = new File([''], 'servers.csv', { type: 'text/csv' });
const onImportMock = vi.fn();
const createServersMock = vi.fn();
const importServersFromFile = vi.fn().mockResolvedValue([]);
const serversImporterMock = fromPartial<ServersImporter>({ importServersFromFile });
const ImportServersBtn = ImportServersBtnFactory(fromPartial({ ServersImporter: serversImporterMock }));
const setUp = (props: Partial<ImportServersBtnProps> = {}, servers: ServersMap = {}) => renderWithEvents(
<ImportServersBtn
servers={servers}
{...props}
createServers={createServersMock}
onImport={onImportMock}
/>,
const setUp = (props: Partial<ImportServersBtnProps> = {}, servers: ServersMap = {}) => renderWithStore(
<ImportServersBtn {...props} onImport={onImportMock} ServersImporter={serversImporterMock} />,
{
initialState: { servers },
},
);
it('passes a11y checks', () => checkAccessibility(setUp()));
@ -57,11 +52,8 @@ describe('<ImportServersBtn />', () => {
it('imports servers when file input changes', async () => {
const { user } = setUp();
const input = screen.getByTestId('csv-file-input');
await user.upload(input, csvFile);
await user.upload(screen.getByTestId('csv-file-input'), csvFile);
expect(importServersFromFile).toHaveBeenCalledTimes(1);
expect(createServersMock).toHaveBeenCalledTimes(1);
});
it.each([
@ -78,26 +70,27 @@ describe('<ImportServersBtn />', () => {
id: 'existingserver-s.test',
};
const newServer: ServerData = { name: 'newServer', url: 'http://s.test/newUrl', apiKey: 'newApiKey' };
const { user } = setUp({}, { [existingServer.id]: existingServer });
const { user, store } = setUp({}, { [existingServer.id]: existingServer });
importServersFromFile.mockResolvedValue([existingServer, newServer]);
importServersFromFile.mockResolvedValue([existingServerData, newServer]);
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
await user.upload(screen.getByTestId('csv-file-input'), csvFile);
// Once the file is uploaded, non-duplicated servers are immediately created
expect(createServersMock).toHaveBeenCalledExactlyOnceWith([expect.objectContaining(newServer)]);
const { servers } = store.getState();
expect(Object.keys(servers)).toHaveLength(2);
expect(screen.getByRole('dialog')).toBeInTheDocument();
await user.click(screen.getByRole('button', { name: btnName }));
// If duplicated servers are saved, there's one extra call
// If duplicated servers are saved, there's one extra server creation
if (savesDuplicatedServers) {
expect(createServersMock).toHaveBeenLastCalledWith([expect.objectContaining(existingServerData)]);
const { servers } = store.getState();
expect(Object.keys(servers)).toHaveLength(3);
}
// On import is called only once, no matter what
expect(onImportMock).toHaveBeenCalledOnce();
expect(createServersMock).toHaveBeenCalledTimes(savesDuplicatedServers ? 2 : 1);
});
});

View File

@ -1,16 +1,19 @@
import { render, screen } from '@testing-library/react';
import { screen } from '@testing-library/react';
import { fromPartial } from '@total-typescript/shoehorn';
import { MemoryRouter } from 'react-router';
import type { NonReachableServer, NotFoundServer, SelectedServer } from '../../../src/servers/data';
import { ServerErrorFactory } from '../../../src/servers/helpers/ServerError';
import { ServerError } from '../../../src/servers/helpers/ServerError';
import { checkAccessibility } from '../../__helpers__/accessibility';
import { renderWithStore } from '../../__helpers__/setUpTest';
describe('<ServerError />', () => {
const ServerError = ServerErrorFactory(fromPartial({ DeleteServerButton: () => null }));
const setUp = (selectedServer: SelectedServer) => render(
const setUp = (selectedServer: SelectedServer) => renderWithStore(
<MemoryRouter>
<ServerError servers={{}} selectedServer={selectedServer} />
<ServerError />
</MemoryRouter>,
{
initialState: { selectedServer, servers: {} },
},
);
it.each([

View File

@ -79,9 +79,8 @@ describe('remoteServersReducer', () => {
},
])('tries to fetch servers from remote', async ({ serversArray, expectedNewServers }) => {
jsonRequest.mockResolvedValue(serversArray);
const doFetchServers = fetchServers(httpClient);
await doFetchServers()(dispatch, vi.fn(), {});
await fetchServers(httpClient)(dispatch, vi.fn(), {});
expect(dispatch).toHaveBeenCalledTimes(3);
expect(dispatch).toHaveBeenNthCalledWith(2, expect.objectContaining({ payload: expectedNewServers }));

View File

@ -1,21 +1,19 @@
import type { ShlinkApiClient } from '@shlinkio/shlink-js-sdk';
import { fromPartial } from '@total-typescript/shoehorn';
import type { ShlinkState } from '../../../src/container/types';
import type { NonReachableServer, NotFoundServer, RegularServer } from '../../../src/servers/data';
import {
MAX_FALLBACK_VERSION,
MIN_FALLBACK_VERSION,
resetSelectedServer,
selectedServerReducerCreator,
selectServer as selectServerCreator,
selectedServerReducer as reducer,
selectServer,
} from '../../../src/servers/reducers/selectedServer';
import type { RootState } from '../../../src/store';
describe('selectedServerReducer', () => {
const dispatch = vi.fn();
const health = vi.fn();
const buildApiClient = vi.fn().mockReturnValue(fromPartial<ShlinkApiClient>({ health }));
const selectServer = selectServerCreator(buildApiClient);
const { reducer } = selectedServerReducerCreator(selectServer);
const buildShlinkApiClient = vi.fn().mockReturnValue(fromPartial<ShlinkApiClient>({ health }));
describe('reducer', () => {
it('returns default when action is RESET_SELECTED_SERVER', () =>
@ -23,7 +21,7 @@ describe('selectedServerReducer', () => {
it('returns selected server when action is SELECT_SERVER', () => {
const payload = fromPartial<RegularServer>({ id: 'abc123' });
expect(reducer(null, selectServer.fulfilled(payload, '', ''))).toEqual(payload);
expect(reducer(null, selectServer.fulfilled(payload, '', { serverId: '', buildShlinkApiClient }))).toEqual(payload);
});
});
@ -50,10 +48,10 @@ describe('selectedServerReducer', () => {
health.mockResolvedValue({ version: serverVersion });
await selectServer(id)(dispatch, getState, {});
await selectServer({ serverId: id, buildShlinkApiClient })(dispatch, getState, {});
expect(getState).toHaveBeenCalledTimes(1);
expect(buildApiClient).toHaveBeenCalledTimes(1);
expect(buildShlinkApiClient).toHaveBeenCalledTimes(1);
expect(dispatch).toHaveBeenCalledTimes(3); // "Pending", "reset" and "fulfilled"
expect(dispatch).toHaveBeenLastCalledWith(expect.objectContaining({ payload: expectedSelectedServer }));
});
@ -65,7 +63,7 @@ describe('selectedServerReducer', () => {
health.mockRejectedValue({});
await selectServer(id)(dispatch, getState, {});
await selectServer({ serverId: id, buildShlinkApiClient })(dispatch, getState, {});
expect(health).toHaveBeenCalled();
expect(dispatch).toHaveBeenLastCalledWith(expect.objectContaining({ payload: expectedSelectedServer }));
@ -73,10 +71,10 @@ describe('selectedServerReducer', () => {
it('dispatches error when server is not found', async () => {
const id = crypto.randomUUID();
const getState = vi.fn(() => fromPartial<ShlinkState>({ servers: {} }));
const getState = vi.fn(() => fromPartial<RootState>({ servers: {} }));
const expectedSelectedServer: NotFoundServer = { serverNotFound: true };
await selectServer(id)(dispatch, getState, {});
await selectServer({ serverId: id, buildShlinkApiClient })(dispatch, getState, {});
expect(getState).toHaveBeenCalled();
expect(health).not.toHaveBeenCalled();

View File

@ -1,12 +1,12 @@
import { render } from '@testing-library/react';
import { MemoryRouter } from 'react-router';
import { Settings } from '../../src/settings/Settings';
import { checkAccessibility } from '../__helpers__/accessibility';
import { renderWithStore } from '../__helpers__/setUpTest';
describe('<Settings />', () => {
const setUp = () => render(
const setUp = () => renderWithStore(
<MemoryRouter>
<Settings settings={{}} setSettings={vi.fn()} />
<Settings />
</MemoryRouter>,
);

View File

@ -1,6 +1,6 @@
import { fromPartial } from '@total-typescript/shoehorn';
import type { ShlinkState } from '../../../src/container/types';
import { migrateDeprecatedSettings } from '../../../src/settings/helpers';
import type { RootState } from '../../../src/store';
describe('settings-helpers', () => {
describe('migrateDeprecatedSettings', () => {
@ -9,7 +9,7 @@ describe('settings-helpers', () => {
});
it('updates settings as expected', () => {
const state = fromPartial<ShlinkState>({
const state = fromPartial<RootState>({
settings: {
visits: {
defaultInterval: 'last180days' as any,

View File

@ -4,7 +4,7 @@ import { DEFAULT_SHORT_URLS_ORDERING, setSettings, settingsReducer } from '../..
describe('settingsReducer', () => {
const realTimeUpdates = { enabled: true };
const shortUrlCreation = { validateUrls: false };
const shortUrlCreation = {};
const ui = { theme: 'light' as const };
const visits = { defaultInterval: 'last30Days' as const };
const shortUrlsList = { defaultOrdering: DEFAULT_SHORT_URLS_ORDERING };

View File

@ -1,5 +1,6 @@
import tailwindcss from '@tailwindcss/vite';
import react from '@vitejs/plugin-react';
import { playwright } from '@vitest/browser-playwright';
import { resolve } from 'path';
import { VitePWA } from 'vite-plugin-pwa';
import { defineConfig } from 'vitest/config';
@ -40,7 +41,7 @@ export default defineConfig({
test: {
// Run tests in an actual browser
browser: {
provider: 'playwright',
provider: playwright(),
enabled: true,
headless: true,
screenshotFailures: false,
@ -63,8 +64,8 @@ export default defineConfig({
// Required code coverage. Lower than this will make the check fail
thresholds: {
statements: 95,
branches: 95,
functions: 95,
branches: 89, // FIXME Increase to 95 again. It dropped after updating to vitest 4
functions: 93,
lines: 95,
},
},