Compare commits

..

784 Commits

Author SHA1 Message Date
Alejandro Celaya
8a7a51be2f Merge pull request #1045 from shlinkio/develop
Release 4.0.0
2024-01-29 19:11:22 +01:00
Alejandro Celaya
b12bb6cdc5 Merge pull request #1044 from acelaya-forks/feature/swc-0.5
Update to latest shlink-web-component
2024-01-29 17:57:37 +01:00
Alejandro Celaya
71735e059c Update to latest shlink-web-component 2024-01-29 17:55:16 +01:00
Alejandro Celaya
f8d2084f26 Merge pull request #1036 from shlinkio/dependabot/npm_and_yarn/types-1a92407d71
Bump the types group with 1 update
2024-01-28 09:37:46 +01:00
dependabot[bot]
3ad8cb21c8 Bump the types group with 1 update
Bumps the types group with 1 update: [@types/uuid](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uuid).


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

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-28 08:36:01 +00:00
Alejandro Celaya
b63496a45b Merge pull request #1035 from shlinkio/dependabot/npm_and_yarn/shlink-8e74f95853
Bump the shlink group with 2 updates
2024-01-28 09:35:37 +01:00
Alejandro Celaya
574e16f9cf Merge pull request #1038 from shlinkio/dependabot/npm_and_yarn/vitest-f0606e6a71
Bump the vitest group with 2 updates
2024-01-28 09:35:28 +01:00
Alejandro Celaya
a7243dfb7e Merge pull request #1041 from shlinkio/dependabot/npm_and_yarn/json2csv/plainjs-7.0.5
Bump @json2csv/plainjs from 7.0.4 to 7.0.5
2024-01-28 09:35:18 +01:00
dependabot[bot]
f38215bd8e Bump the vitest group with 2 updates
Bumps the vitest group with 2 updates: [@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/coverage-v8` from 1.2.1 to 1.2.2
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.2.2/packages/coverage-v8)

Updates `vitest` from 1.2.1 to 1.2.2
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.2.2/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-28 08:28:44 +00:00
dependabot[bot]
8bb039ca1d Bump the shlink group with 2 updates
Bumps the shlink group with 2 updates: [@shlinkio/shlink-frontend-kit](https://github.com/shlinkio/shlink-frontend-kit) and [@shlinkio/shlink-js-sdk](https://shlink.io).


Updates `@shlinkio/shlink-frontend-kit` from 0.4.1 to 0.4.2
- [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/v0.4.1...v0.4.2)

Updates `@shlinkio/shlink-js-sdk` from 0.2.0 to 0.2.2

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-28 08:28:17 +00:00
Alejandro Celaya
79e685741a Merge pull request #1037 from shlinkio/dependabot/npm_and_yarn/testing-61f0fb3b36
Bump the testing group with 1 update
2024-01-28 09:28:00 +01:00
dependabot[bot]
1a247d57a7 Bump @json2csv/plainjs from 7.0.4 to 7.0.5
Bumps [@json2csv/plainjs](https://github.com/juanjoDiaz/json2csv) from 7.0.4 to 7.0.5.
- [Release notes](https://github.com/juanjoDiaz/json2csv/releases)
- [Changelog](https://github.com/juanjoDiaz/json2csv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/juanjoDiaz/json2csv/compare/v7.0.4...v7.0.5)

---
updated-dependencies:
- dependency-name: "@json2csv/plainjs"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-28 08:27:48 +00:00
Alejandro Celaya
8640e85173 Merge pull request #1039 from shlinkio/dependabot/npm_and_yarn/date-fns-3.3.1
Bump date-fns from 3.3.0 to 3.3.1
2024-01-28 09:27:37 +01:00
Alejandro Celaya
33db2d26b3 Merge pull request #1040 from shlinkio/dependabot/npm_and_yarn/jsdom-24.0.0
Bump jsdom from 23.2.0 to 24.0.0
2024-01-28 09:27:12 +01:00
Alejandro Celaya
849115a461 Merge pull request #1042 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-0.17.5
Bump vite-plugin-pwa from 0.17.4 to 0.17.5
2024-01-28 09:26:52 +01:00
Alejandro Celaya
307ab61ca3 Merge pull request #1043 from shlinkio/dependabot/npm_and_yarn/reduxjs/toolkit-2.1.0
Bump @reduxjs/toolkit from 2.0.1 to 2.1.0
2024-01-28 09:26:35 +01:00
dependabot[bot]
cac7418ae9 Bump @reduxjs/toolkit from 2.0.1 to 2.1.0
Bumps [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) from 2.0.1 to 2.1.0.
- [Release notes](https://github.com/reduxjs/redux-toolkit/releases)
- [Commits](https://github.com/reduxjs/redux-toolkit/compare/v2.0.1...v2.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-27 08:57:17 +00:00
dependabot[bot]
d94f3d4d2e Bump vite-plugin-pwa from 0.17.4 to 0.17.5
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 0.17.4 to 0.17.5.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v0.17.4...v0.17.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-27 08:57:05 +00:00
dependabot[bot]
b6d01f8e60 Bump jsdom from 23.2.0 to 24.0.0
Bumps [jsdom](https://github.com/jsdom/jsdom) from 23.2.0 to 24.0.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/main/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/23.2.0...24.0.0)

---
updated-dependencies:
- dependency-name: jsdom
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-27 08:56:31 +00:00
dependabot[bot]
30d32ce793 Bump date-fns from 3.3.0 to 3.3.1
Bumps [date-fns](https://github.com/date-fns/date-fns) from 3.3.0 to 3.3.1.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/main/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v3.3.0...v3.3.1)

---
updated-dependencies:
- dependency-name: date-fns
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-27 08:56:20 +00:00
dependabot[bot]
4c93407ea2 Bump the testing group with 1 update
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.2.0 to 6.3.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.2.0...v6.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-27 08:55:43 +00:00
Alejandro Celaya
bfd0fd6f25 Merge pull request #1033 from shlinkio/dependabot/docker/node-21.6-alpine
Bump node from 21.5-alpine to 21.6-alpine
2024-01-20 09:31:55 +01:00
Alejandro Celaya
6ff036ab45 Merge pull request #1030 from shlinkio/dependabot/npm_and_yarn/react-router-dom-6.21.3
Bump react-router-dom from 6.21.2 to 6.21.3
2024-01-20 09:31:48 +01:00
Alejandro Celaya
e5bf2f9774 Merge pull request #1027 from shlinkio/dependabot/npm_and_yarn/types-7e5f9c36bb
Bump the types group with 1 update
2024-01-20 09:24:32 +01:00
Alejandro Celaya
e6f9c3ad83 Merge pull request #1028 from shlinkio/dependabot/npm_and_yarn/vitest-051f0a6758
Bump the vitest group with 2 updates
2024-01-20 09:24:24 +01:00
dependabot[bot]
e3e818323e Bump node from 21.5-alpine to 21.6-alpine
Bumps node from 21.5-alpine to 21.6-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-20 08:24:14 +00:00
Alejandro Celaya
e32a76745c Merge pull request #1029 from shlinkio/dependabot/npm_and_yarn/date-fns-3.3.0
Bump date-fns from 3.2.0 to 3.3.0
2024-01-20 09:24:02 +01:00
dependabot[bot]
969bfd237d Bump react-router-dom from 6.21.2 to 6.21.3
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.21.2 to 6.21.3.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.21.3/packages/react-router-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-20 08:23:22 +00:00
Alejandro Celaya
8b29161786 Merge pull request #1031 from shlinkio/dependabot/npm_and_yarn/sass-1.70.0
Bump sass from 1.69.7 to 1.70.0
2024-01-20 09:22:45 +01:00
Alejandro Celaya
46682d9be5 Merge pull request #1032 from shlinkio/dependabot/npm_and_yarn/reactstrap-9.2.2
Bump reactstrap from 9.2.1 to 9.2.2
2024-01-20 09:22:36 +01:00
dependabot[bot]
157edc471e Bump reactstrap from 9.2.1 to 9.2.2
Bumps [reactstrap](https://github.com/reactstrap/reactstrap) from 9.2.1 to 9.2.2.
- [Release notes](https://github.com/reactstrap/reactstrap/releases)
- [Changelog](https://github.com/reactstrap/reactstrap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/reactstrap/reactstrap/compare/v9.2.1...v9.2.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-20 08:11:31 +00:00
dependabot[bot]
d9c6659b36 Bump sass from 1.69.7 to 1.70.0
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.7 to 1.70.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.69.7...1.70.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-20 08:11:14 +00:00
dependabot[bot]
5a11926f13 Bump date-fns from 3.2.0 to 3.3.0
Bumps [date-fns](https://github.com/date-fns/date-fns) from 3.2.0 to 3.3.0.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/main/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v3.2.0...v3.3.0)

---
updated-dependencies:
- dependency-name: date-fns
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-20 08:10:50 +00:00
dependabot[bot]
3d3a910f8c Bump the vitest group with 2 updates
Bumps the vitest group with 2 updates: [@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/coverage-v8` from 1.2.0 to 1.2.1
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.2.1/packages/coverage-v8)

Updates `vitest` from 1.2.0 to 1.2.1
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.2.1/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-20 08:10:33 +00:00
dependabot[bot]
249bcd58ff Bump the types group with 1 update
Bumps the types group with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 18.2.47 to 18.2.48
- [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-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-20 08:10:04 +00:00
Alejandro Celaya
e136eb0744 Merge pull request #1026 from shlinkio/dependabot/npm_and_yarn/vite-5.0.12
Bump vite from 5.0.11 to 5.0.12
2024-01-20 00:11:05 +01:00
dependabot[bot]
31e1347864 Bump vite from 5.0.11 to 5.0.12
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.11 to 5.0.12.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.0.12/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.0.12/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-19 22:30:17 +00:00
Alejandro Celaya
75ee597203 Merge pull request #1022 from shlinkio/dependabot/npm_and_yarn/react-router-dom-6.21.2
Bump react-router-dom from 6.21.1 to 6.21.2
2024-01-13 17:39:10 +01:00
dependabot[bot]
f492300d3a Bump react-router-dom from 6.21.1 to 6.21.2
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.21.1 to 6.21.2.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.21.2/packages/react-router-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-13 16:33:39 +00:00
Alejandro Celaya
98f933ceb1 Merge pull request #1020 from shlinkio/dependabot/npm_and_yarn/types-ab1c64272b
Bump the types group with 1 update
2024-01-13 17:32:08 +01:00
Alejandro Celaya
204f76aaaf Merge pull request #1021 from shlinkio/dependabot/npm_and_yarn/vitest-5ee0591cfb
Bump the vitest group with 2 updates
2024-01-13 17:31:59 +01:00
Alejandro Celaya
251c8bdc07 Merge pull request #1023 from shlinkio/dependabot/npm_and_yarn/jsdom-23.2.0
Bump jsdom from 23.1.0 to 23.2.0
2024-01-13 17:31:28 +01:00
Alejandro Celaya
b51587be0e Merge pull request #1024 from shlinkio/dependabot/npm_and_yarn/react-redux-9.1.0
Bump react-redux from 9.0.4 to 9.1.0
2024-01-13 17:31:14 +01:00
Alejandro Celaya
96207cc49f Merge pull request #1025 from shlinkio/dependabot/npm_and_yarn/date-fns-3.2.0
Bump date-fns from 3.0.6 to 3.2.0
2024-01-13 17:30:59 +01:00
dependabot[bot]
ace7696e46 Bump date-fns from 3.0.6 to 3.2.0
Bumps [date-fns](https://github.com/date-fns/date-fns) from 3.0.6 to 3.2.0.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/main/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v3.0.6...v3.2.0)

---
updated-dependencies:
- dependency-name: date-fns
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-13 08:17:56 +00:00
dependabot[bot]
e0d9e29f73 Bump react-redux from 9.0.4 to 9.1.0
Bumps [react-redux](https://github.com/reduxjs/react-redux) from 9.0.4 to 9.1.0.
- [Release notes](https://github.com/reduxjs/react-redux/releases)
- [Changelog](https://github.com/reduxjs/react-redux/blob/master/CHANGELOG.md)
- [Commits](https://github.com/reduxjs/react-redux/compare/v9.0.4...v9.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-13 08:17:35 +00:00
dependabot[bot]
a2260014f5 Bump jsdom from 23.1.0 to 23.2.0
Bumps [jsdom](https://github.com/jsdom/jsdom) from 23.1.0 to 23.2.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/main/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/23.1.0...23.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-13 08:17:16 +00:00
dependabot[bot]
85cc8a3c87 Bump the vitest group with 2 updates
Bumps the vitest group with 2 updates: [@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/coverage-v8` from 1.1.3 to 1.2.0
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.2.0/packages/coverage-v8)

Updates `vitest` from 1.1.3 to 1.2.0
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.2.0/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-13 08:16:18 +00:00
dependabot[bot]
590b39ce44 Bump the types group with 1 update
Bumps the types group with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 18.2.46 to 18.2.47
- [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-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-13 08:15:27 +00:00
Alejandro Celaya
63dd386604 Merge pull request #1018 from shlinkio/dependabot/npm_and_yarn/sass-1.69.7
Bump sass from 1.69.6 to 1.69.7
2024-01-06 10:09:46 +01:00
dependabot[bot]
925ba6171b Bump sass from 1.69.6 to 1.69.7
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.6 to 1.69.7.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.69.6...1.69.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-06 09:04:40 +00:00
Alejandro Celaya
271a777d25 Merge pull request #1015 from shlinkio/dependabot/npm_and_yarn/testing-a5c340e0a7
Bump the testing group with 1 update
2024-01-06 10:04:22 +01:00
Alejandro Celaya
96aa9a3de8 Merge pull request #1016 from shlinkio/dependabot/npm_and_yarn/vite-3d5546b37c
Bump the vite group with 1 update
2024-01-06 10:04:15 +01:00
Alejandro Celaya
14bf3d9c68 Merge pull request #1017 from shlinkio/dependabot/npm_and_yarn/vitest-c751e35bf9
Bump the vitest group with 2 updates
2024-01-06 10:04:05 +01:00
Alejandro Celaya
1feffb33ab Merge pull request #1019 from shlinkio/dependabot/npm_and_yarn/jsdom-23.1.0
Bump jsdom from 23.0.1 to 23.1.0
2024-01-06 10:03:48 +01:00
dependabot[bot]
4065af8d15 Bump jsdom from 23.0.1 to 23.1.0
Bumps [jsdom](https://github.com/jsdom/jsdom) from 23.0.1 to 23.1.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/main/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/23.0.1...23.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-06 08:25:15 +00:00
dependabot[bot]
50f2bcf1ca Bump the vitest group with 2 updates
Bumps the vitest group with 2 updates: [@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/coverage-v8` from 1.1.0 to 1.1.3
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.1.3/packages/coverage-v8)

Updates `vitest` from 1.1.0 to 1.1.3
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.1.3/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-06 08:24:30 +00:00
dependabot[bot]
d55b113e65 Bump the vite group with 1 update
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 5.0.10 to 5.0.11
- [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/v5.0.11/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-06 08:23:56 +00:00
dependabot[bot]
64cbb47385 Bump the testing group with 1 update
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.1.6 to 6.2.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.1.6...v6.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-06 08:23:31 +00:00
Alejandro Celaya
31a14ed7fc Update changelog 2023-12-31 20:20:47 +01:00
Alejandro Celaya
a702635294 Merge pull request #1014 from acelaya-forks/feature/ref-warning-fix
Fix warning in AppUpdateBanner
2023-12-31 20:18:53 +01:00
Alejandro Celaya
e7fab8c2d6 Fix remaining act-related warningsin tests 2023-12-31 20:16:06 +01:00
Alejandro Celaya
2ad0daaed5 Fix warning in AppUpdateBanner 2023-12-31 20:01:28 +01:00
Alejandro Celaya
fc9532690d Merge pull request #1010 from shlinkio/dependabot/npm_and_yarn/types-edf63beefa
Bump the types group with 1 update
2023-12-30 17:05:11 +01:00
Alejandro Celaya
3228e9fd90 Merge pull request #1011 from shlinkio/dependabot/npm_and_yarn/testing-fb25a776cf
Bump the testing group with 2 updates
2023-12-30 17:05:04 +01:00
Alejandro Celaya
8ef301f640 Merge pull request #1012 from shlinkio/dependabot/npm_and_yarn/sass-1.69.6
Bump sass from 1.69.5 to 1.69.6
2023-12-30 17:04:56 +01:00
Alejandro Celaya
240abfaeba Merge pull request #1013 from shlinkio/dependabot/npm_and_yarn/clsx-2.1.0
Bump clsx from 2.0.0 to 2.1.0
2023-12-30 17:04:44 +01:00
dependabot[bot]
daf128eac7 Bump clsx from 2.0.0 to 2.1.0
Bumps [clsx](https://github.com/lukeed/clsx) from 2.0.0 to 2.1.0.
- [Release notes](https://github.com/lukeed/clsx/releases)
- [Commits](https://github.com/lukeed/clsx/compare/v2.0.0...v2.1.0)

---
updated-dependencies:
- dependency-name: clsx
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-30 08:55:25 +00:00
dependabot[bot]
e9e030d789 Bump sass from 1.69.5 to 1.69.6
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.5 to 1.69.6.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.69.5...1.69.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-30 08:55:08 +00:00
dependabot[bot]
fcbc4b57c7 Bump the testing group with 2 updates
Bumps the testing group with 2 updates: [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) and [@testing-library/user-event](https://github.com/testing-library/user-event).


Updates `@testing-library/jest-dom` from 6.1.5 to 6.1.6
- [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.1.5...v6.1.6)

Updates `@testing-library/user-event` from 14.5.1 to 14.5.2
- [Release notes](https://github.com/testing-library/user-event/releases)
- [Changelog](https://github.com/testing-library/user-event/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/user-event/compare/v14.5.1...v14.5.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-30 08:54:31 +00:00
dependabot[bot]
bbd88f081d Bump the types group with 1 update
Bumps the types group with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 18.2.45 to 18.2.46
- [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-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-30 08:53:58 +00:00
Alejandro Celaya
2d5ec2c5dc Merge pull request #1006 from shlinkio/dependabot/npm_and_yarn/date-fns-3.0.6
Bump date-fns from 2.30.0 to 3.0.6
2023-12-25 14:54:05 +01:00
Alejandro Celaya
12b6d76a61 Merge pull request #1009 from acelaya-forks/feature/fix-chart-flickering
Memoize ShlinkWebComponentContainer to fix flickering charts on re-renders
2023-12-25 14:13:40 +01:00
Alejandro Celaya
6226930bd9 Memoize ShlinkWebComponentContainer to fix flickering charts on re-renders 2023-12-25 14:08:49 +01:00
Alejandro Celaya
4973a143a6 Update Twitter badge 2023-12-23 11:15:30 +01:00
Alejandro Celaya
2fd6cc15a1 Merge pull request #1004 from shlinkio/dependabot/npm_and_yarn/vitest-ed4181dbbd
Bump the vitest group with 2 updates
2023-12-23 09:52:05 +01:00
Alejandro Celaya
7c21a6858f Merge pull request #1008 from shlinkio/dependabot/docker/node-21.5-alpine
Bump node from 21.4-alpine to 21.5-alpine
2023-12-23 09:51:57 +01:00
dependabot[bot]
1db389bc95 Bump date-fns from 2.30.0 to 3.0.6
Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.30.0 to 3.0.6.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/main/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v2.30.0...v3.0.6)

---
updated-dependencies:
- dependency-name: date-fns
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-23 08:42:45 +00:00
dependabot[bot]
cd70bb39f9 Bump the vitest group with 2 updates
Bumps the vitest group with 2 updates: [@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/coverage-v8` from 1.0.4 to 1.1.0
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.1.0/packages/coverage-v8)

Updates `vitest` from 1.0.4 to 1.1.0
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.1.0/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-23 08:41:57 +00:00
Alejandro Celaya
8cf2406136 Merge pull request #1005 from shlinkio/dependabot/npm_and_yarn/axe-core-4.8.3
Bump axe-core from 4.8.2 to 4.8.3
2023-12-23 09:41:15 +01:00
dependabot[bot]
899223f0f5 Bump node from 21.4-alpine to 21.5-alpine
Bumps node from 21.4-alpine to 21.5-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-23 08:41:07 +00:00
Alejandro Celaya
058557b4e3 Merge pull request #1007 from shlinkio/dependabot/npm_and_yarn/react-router-dom-6.21.1
Bump react-router-dom from 6.21.0 to 6.21.1
2023-12-23 09:41:03 +01:00
dependabot[bot]
ce6e4c43cc Bump react-router-dom from 6.21.0 to 6.21.1
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.21.0 to 6.21.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.21.1/packages/react-router-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-23 08:13:12 +00:00
dependabot[bot]
d2ccc1a95b Bump axe-core from 4.8.2 to 4.8.3
Bumps [axe-core](https://github.com/dequelabs/axe-core) from 4.8.2 to 4.8.3.
- [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.8.2...v4.8.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-23 08:12:37 +00:00
Alejandro Celaya
2194d04ab1 Merge pull request #1002 from acelaya-forks/feature/improve-router-tests
Remove usages of vi.mock
2023-12-18 23:40:15 +01:00
Alejandro Celaya
f50d033551 Remove usages of vi.mock 2023-12-18 23:38:34 +01:00
Alejandro Celaya
598540aaac Merge pull request #1001 from acelaya-forks/feature/preferred-theme
Set default theme based on system preferences
2023-12-18 23:15:31 +01:00
Alejandro Celaya
683c049a23 Make sure set-homepage script is treated as a commonjs script 2023-12-18 23:12:51 +01:00
Alejandro Celaya
8907ea5310 Set default theme based on system preferences 2023-12-18 23:10:03 +01:00
Alejandro Celaya
ddc466b797 Merge pull request #1000 from shlinkio/dependabot/npm_and_yarn/react-redux-9.0.4
Bump react-redux from 9.0.2 to 9.0.4
2023-12-16 17:39:47 +01:00
dependabot[bot]
0e2c4a54b7 Bump react-redux from 9.0.2 to 9.0.4
Bumps [react-redux](https://github.com/reduxjs/react-redux) from 9.0.2 to 9.0.4.
- [Release notes](https://github.com/reduxjs/react-redux/releases)
- [Changelog](https://github.com/reduxjs/react-redux/blob/master/CHANGELOG.md)
- [Commits](https://github.com/reduxjs/react-redux/compare/v9.0.2...v9.0.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-16 16:38:04 +00:00
Alejandro Celaya
3347b7ba25 Merge pull request #999 from shlinkio/dependabot/npm_and_yarn/react-router-dom-6.21.0
Bump react-router-dom from 6.20.1 to 6.21.0
2023-12-16 17:37:28 +01:00
Alejandro Celaya
fe24d15882 Merge pull request #998 from shlinkio/dependabot/npm_and_yarn/eslint-8.56.0
Bump eslint from 8.55.0 to 8.56.0
2023-12-16 17:37:17 +01:00
Alejandro Celaya
066d5c58fb Merge pull request #997 from shlinkio/dependabot/npm_and_yarn/vite-8453943e51
Bump the vite group with 1 update
2023-12-16 17:36:49 +01:00
Alejandro Celaya
01ff76339e Merge pull request #996 from shlinkio/dependabot/npm_and_yarn/types-46784ce81a
Bump the types group with 2 updates
2023-12-16 17:36:38 +01:00
Alejandro Celaya
0505204ed9 Merge pull request #995 from shlinkio/dependabot/npm_and_yarn/shlink-ad52743a18
Bump the shlink group with 1 update
2023-12-16 17:36:25 +01:00
dependabot[bot]
22adb0c6fb Bump react-router-dom from 6.20.1 to 6.21.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.20.1 to 6.21.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.21.0/packages/react-router-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-16 08:52:01 +00:00
dependabot[bot]
95985a2b3c Bump eslint from 8.55.0 to 8.56.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.55.0 to 8.56.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/v8.55.0...v8.56.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-16 08:51:30 +00:00
dependabot[bot]
142d8daf78 Bump the vite group with 1 update
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).

- [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/v5.0.10/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-16 08:51:09 +00:00
dependabot[bot]
4f435a82e4 Bump the types group with 2 updates
Bumps the types 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 18.2.43 to 18.2.45
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react-dom` from 18.2.17 to 18.2.18
- [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-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
- dependency-name: "@types/react-dom"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-16 08:50:41 +00:00
dependabot[bot]
a3910329ab Bump the shlink group with 1 update
Bumps the shlink group with 1 update: [@shlinkio/shlink-frontend-kit](https://github.com/shlinkio/shlink-frontend-kit).

- [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/v0.4.0...v0.4.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-16 08:50:11 +00:00
Alejandro Celaya
d154820b28 Remove unnecessary double type check 2023-12-13 09:35:48 +01:00
Alejandro Celaya
adb50a91e7 Merge pull request #990 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-0.17.4
Bump vite-plugin-pwa from 0.17.2 to 0.17.4
2023-12-10 19:42:41 +01:00
dependabot[bot]
b02ca9b894 Bump vite-plugin-pwa from 0.17.2 to 0.17.4
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 0.17.2 to 0.17.4.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v0.17.2...v0.17.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-10 18:41:10 +00:00
Alejandro Celaya
5a583b3c1a Merge pull request #993 from shlinkio/dependabot/npm_and_yarn/types-f48f88a02e
Bump the types group with 1 update
2023-12-10 19:40:41 +01:00
Alejandro Celaya
f1061a7406 Merge pull request #984 from shlinkio/dependabot/npm_and_yarn/vite-7ba56b321a
Bump the vite group with 2 updates
2023-12-10 19:40:22 +01:00
dependabot[bot]
086b8c5579 Bump the types group with 1 update
Bumps the types group with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).

- [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-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-10 18:38:44 +00:00
Alejandro Celaya
945ac6b5a7 Merge pull request #981 from shlinkio/dependabot/docker/node-21.4-alpine
Bump node from 21.3-alpine to 21.4-alpine
2023-12-10 19:38:30 +01:00
dependabot[bot]
ac9ddb3575 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.2.0 to 4.2.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/v4.2.1/packages/plugin-react)

Updates `vite` from 5.0.5 to 5.0.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/v5.0.7/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-10 18:38:19 +00:00
Alejandro Celaya
3ac3df1802 Merge pull request #983 from shlinkio/dependabot/npm_and_yarn/testing-53ebf9615f
Bump the testing group with 1 update
2023-12-10 19:38:13 +01:00
Alejandro Celaya
25da851879 Merge pull request #987 from shlinkio/dependabot/npm_and_yarn/eslint-8.55.0
Bump eslint from 8.54.0 to 8.55.0
2023-12-10 19:37:57 +01:00
Alejandro Celaya
8ab2c34d81 Merge pull request #988 from shlinkio/dependabot/npm_and_yarn/jsdom-23.0.1
Bump jsdom from 22.1.0 to 23.0.1
2023-12-10 19:37:47 +01:00
Alejandro Celaya
b42dfd6e39 Merge pull request #991 from shlinkio/dependabot/npm_and_yarn/typescript-5.3.3
Bump typescript from 5.3.2 to 5.3.3
2023-12-10 19:37:15 +01:00
Alejandro Celaya
6c248168ad Merge pull request #994 from shlinkio/dependabot/npm_and_yarn/vitest-9fd6a95770
Bump the vitest group with 2 updates
2023-12-10 19:36:59 +01:00
dependabot[bot]
8d879a8182 Bump the vitest group with 2 updates
Bumps the vitest group with 2 updates: [@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/coverage-v8` from 1.0.2 to 1.0.4
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.0.4/packages/coverage-v8)

Updates `vitest` from 1.0.2 to 1.0.4
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v1.0.4/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-10 09:48:41 +00:00
dependabot[bot]
8597a6ff54 Bump typescript from 5.3.2 to 5.3.3
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.3.2 to 5.3.3.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.3.2...v5.3.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-10 09:48:36 +00:00
dependabot[bot]
1c54ab8299 Bump jsdom from 22.1.0 to 23.0.1
Bumps [jsdom](https://github.com/jsdom/jsdom) from 22.1.0 to 23.0.1.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/main/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/22.1.0...23.0.1)

---
updated-dependencies:
- dependency-name: jsdom
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-10 09:48:32 +00:00
dependabot[bot]
bade990e6c Bump the testing group with 1 update
Bumps the testing group with 1 update: [@testing-library/jest-dom](https://github.com/testing-library/jest-dom).

- [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.1.4...v6.1.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-10 09:48:17 +00:00
Alejandro Celaya
70629cb34f Merge pull request #992 from acelaya-forks/feature/rtk-2
Update dependencies
2023-12-10 10:47:35 +01:00
Alejandro Celaya
db23fcc552 Update typescript-eslint 2023-12-10 10:46:19 +01:00
Alejandro Celaya
faf2afdcf3 Fix coverage thresholds definition 2023-12-10 10:45:22 +01:00
Alejandro Celaya
482b65e130 Update dependencies 2023-12-09 11:23:22 +01:00
dependabot[bot]
2cdc905d10 Bump eslint from 8.54.0 to 8.55.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.54.0 to 8.55.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/v8.54.0...v8.55.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-09 08:42:02 +00:00
dependabot[bot]
f218e0f8ae Bump node from 21.3-alpine to 21.4-alpine
Bumps node from 21.3-alpine to 21.4-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-09 08:14:08 +00:00
Alejandro Celaya
44dc61ee91 Merge pull request #980 from shlinkio/dependabot/npm_and_yarn/vite-5.0.5
Bump vite from 5.0.2 to 5.0.5
2023-12-06 07:06:37 +01:00
dependabot[bot]
b90df25c68 Bump vite from 5.0.2 to 5.0.5
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.2 to 5.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/v5.0.5/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-05 23:49:13 +00:00
Alejandro Celaya
2f3b4104b9 Merge pull request #977 from shlinkio/dependabot/docker/node-21.3-alpine
Bump node from 21.2-alpine to 21.3-alpine
2023-12-03 11:47:36 +01:00
dependabot[bot]
56de4cf118 Bump node from 21.2-alpine to 21.3-alpine
Bumps node from 21.2-alpine to 21.3-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-02 08:59:36 +00:00
Alejandro Celaya
42c140068f Merge pull request #975 from shlinkio/dependabot/npm_and_yarn/fontawesome-aa0de545a9
Bump the fontawesome group with 5 updates
2023-12-02 09:37:08 +01:00
Alejandro Celaya
f5a307a30c Merge pull request #976 from shlinkio/dependabot/npm_and_yarn/types-14a4bef4e1
Bump the types group with 1 update
2023-12-02 09:34:52 +01:00
dependabot[bot]
e77161d1fd Bump the types group with 1 update
Bumps the types group with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).

- [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-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-02 08:28:28 +00:00
dependabot[bot]
0574633db6 Bump the fontawesome group with 5 updates
Bumps the fontawesome group with 5 updates:

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


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

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

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

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

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-02 08:27:59 +00:00
Alejandro Celaya
c5e245589c Merge pull request #974 from shlinkio/dependabot/npm_and_yarn/adobe/css-tools-4.3.2
Bump @adobe/css-tools from 4.3.1 to 4.3.2
2023-12-01 07:33:39 +01:00
dependabot[bot]
3061300a54 Bump @adobe/css-tools from 4.3.1 to 4.3.2
Bumps [@adobe/css-tools](https://github.com/adobe/css-tools) from 4.3.1 to 4.3.2.
- [Changelog](https://github.com/adobe/css-tools/blob/main/History.md)
- [Commits](https://github.com/adobe/css-tools/commits)

---
updated-dependencies:
- dependency-name: "@adobe/css-tools"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 05:07:58 +00:00
Alejandro Celaya
80673e1166 Update dependencies 2023-11-26 10:31:06 +01:00
Alejandro Celaya
39cb236563 Merge pull request #969 from shlinkio/dependabot/npm_and_yarn/vite-2b5f0a7cc8
Bump the vite group with 1 update
2023-11-26 10:27:04 +01:00
dependabot[bot]
1ef0527ec3 Bump the vite group with 1 update
Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).

- [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/v5.0.2/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-26 07:35:16 +00:00
Alejandro Celaya
f1b7617f13 Merge pull request #973 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-0.17.2
Bump vite-plugin-pwa from 0.17.0 to 0.17.2
2023-11-26 08:34:22 +01:00
Alejandro Celaya
a0ccbd5795 Merge pull request #968 from shlinkio/dependabot/npm_and_yarn/types-a419357f28
Bump the types group with 2 updates
2023-11-26 08:29:30 +01:00
dependabot[bot]
1c10f91a22 Bump vite-plugin-pwa from 0.17.0 to 0.17.2
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 0.17.0 to 0.17.2.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v0.17.0...v0.17.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-26 07:29:28 +00:00
Alejandro Celaya
8e65cb520c Merge pull request #970 from shlinkio/dependabot/npm_and_yarn/react-router-dom-6.20.0
Bump react-router-dom from 6.19.0 to 6.20.0
2023-11-26 08:29:14 +01:00
Alejandro Celaya
26ddb263c4 Merge pull request #971 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-0.17.0
Bump vite-plugin-pwa from 0.16.7 to 0.17.0
2023-11-26 08:29:05 +01:00
Alejandro Celaya
839c6470e7 Merge pull request #972 from shlinkio/dependabot/npm_and_yarn/typescript-5.3.2
Bump typescript from 5.2.2 to 5.3.2
2023-11-26 08:28:56 +01:00
dependabot[bot]
49ebcc2f44 Bump typescript from 5.2.2 to 5.3.2
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.2.2 to 5.3.2.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.2.2...v5.3.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-25 08:38:56 +00:00
dependabot[bot]
ec312fa731 Bump vite-plugin-pwa from 0.16.7 to 0.17.0
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 0.16.7 to 0.17.0.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v0.16.7...v0.17.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-25 08:38:35 +00:00
dependabot[bot]
964967eb3a Bump react-router-dom from 6.19.0 to 6.20.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.19.0 to 6.20.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.20.0/packages/react-router-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-25 08:38:11 +00:00
dependabot[bot]
c274b13030 Bump the types group with 2 updates
Bumps the types 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 18.2.37 to 18.2.38
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react-dom` from 18.2.15 to 18.2.17
- [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-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
- dependency-name: "@types/react-dom"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: types
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-25 08:37:23 +00:00
Alejandro Celaya
439c37298f Merge pull request #963 from shlinkio/dependabot/docker/node-21.2-alpine
Bump node from 21.1-alpine to 21.2-alpine
2023-11-18 09:58:08 +01:00
Alejandro Celaya
3886adf71b Merge pull request #964 from shlinkio/dependabot/npm_and_yarn/testing-20c8a1aab3
Bump the testing group with 1 update
2023-11-18 09:57:58 +01:00
Alejandro Celaya
192d346832 Merge pull request #967 from shlinkio/dependabot/npm_and_yarn/eslint-8.54.0
Bump eslint from 8.53.0 to 8.54.0
2023-11-18 09:57:41 +01:00
Alejandro Celaya
37a7c4a644 Merge pull request #966 from shlinkio/dependabot/npm_and_yarn/react-router-dom-6.19.0
Bump react-router-dom from 6.18.0 to 6.19.0
2023-11-18 09:57:31 +01:00
Alejandro Celaya
fe48ade7fc Merge pull request #965 from shlinkio/dependabot/npm_and_yarn/vite-1d8b6aba63
Bump the vite group with 2 updates
2023-11-18 09:57:22 +01:00
dependabot[bot]
16978cb34d Bump eslint from 8.53.0 to 8.54.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.53.0 to 8.54.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/v8.53.0...v8.54.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-18 08:33:21 +00:00
dependabot[bot]
2b030ba3ff Bump react-router-dom from 6.18.0 to 6.19.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.18.0 to 6.19.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.19.0/packages/react-router-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-18 08:33:07 +00:00
dependabot[bot]
55a1fd5b6e 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.1.1 to 4.2.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/v4.2.0/packages/plugin-react)

Updates `vite` from 4.5.0 to 5.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@5.0.0/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-18 08:32:44 +00:00
dependabot[bot]
a4a142a258 Bump the testing group with 1 update
Bumps the testing group with 1 update: [@testing-library/react](https://github.com/testing-library/react-testing-library).

- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v14.1.0...v14.1.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-18 08:32:04 +00:00
dependabot[bot]
3b669cd536 Bump node from 21.1-alpine to 21.2-alpine
Bumps node from 21.1-alpine to 21.2-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-18 08:10:20 +00:00
Alejandro Celaya
c3ce742ba9 Add dependabot groups 2023-11-15 19:37:11 +01:00
Alejandro Celaya
bddeeb03d8 Merge pull request #960 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-0.16.7
Bump vite-plugin-pwa from 0.16.6 to 0.16.7
2023-11-12 08:48:33 +01:00
dependabot[bot]
264d0b4e0d Bump vite-plugin-pwa from 0.16.6 to 0.16.7
Bumps [vite-plugin-pwa](https://github.com/antfu/vite-plugin-pwa) from 0.16.6 to 0.16.7.
- [Release notes](https://github.com/antfu/vite-plugin-pwa/releases)
- [Commits](https://github.com/antfu/vite-plugin-pwa/compare/v0.16.6...v0.16.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-11 09:54:08 +00:00
Alejandro Celaya
b07786ce95 Merge pull request #962 from shlinkio/dependabot/npm_and_yarn/types/react-dom-18.2.15
Bump @types/react-dom from 18.2.14 to 18.2.15
2023-11-11 10:53:24 +01:00
dependabot[bot]
dde6e322f5 Bump @types/react-dom from 18.2.14 to 18.2.15
Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 18.2.14 to 18.2.15.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-11 09:48:30 +00:00
Alejandro Celaya
cfaff118a2 Merge pull request #961 from shlinkio/dependabot/npm_and_yarn/types/uuid-9.0.7
Bump @types/uuid from 9.0.6 to 9.0.7
2023-11-11 10:48:13 +01:00
Alejandro Celaya
89c97bbf0c Merge pull request #957 from shlinkio/dependabot/npm_and_yarn/types/react-18.2.37
Bump @types/react from 18.2.34 to 18.2.37
2023-11-11 10:48:03 +01:00
Alejandro Celaya
7d165e616d Merge pull request #958 from shlinkio/dependabot/npm_and_yarn/reactstrap-9.2.1
Bump reactstrap from 9.2.0 to 9.2.1
2023-11-11 10:47:54 +01:00
Alejandro Celaya
a10f0cacdf Merge pull request #959 from shlinkio/dependabot/npm_and_yarn/testing-library/react-14.1.0
Bump @testing-library/react from 14.0.0 to 14.1.0
2023-11-11 10:47:43 +01:00
dependabot[bot]
08d06b16bd Bump @types/uuid from 9.0.6 to 9.0.7
Bumps [@types/uuid](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uuid) from 9.0.6 to 9.0.7.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/uuid)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-11 08:34:04 +00:00
dependabot[bot]
d16bdabc01 Bump @testing-library/react from 14.0.0 to 14.1.0
Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 14.0.0 to 14.1.0.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v14.0.0...v14.1.0)

---
updated-dependencies:
- dependency-name: "@testing-library/react"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-11 08:33:38 +00:00
dependabot[bot]
86a92e33f8 Bump reactstrap from 9.2.0 to 9.2.1
Bumps [reactstrap](https://github.com/reactstrap/reactstrap) from 9.2.0 to 9.2.1.
- [Release notes](https://github.com/reactstrap/reactstrap/releases)
- [Changelog](https://github.com/reactstrap/reactstrap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/reactstrap/reactstrap/compare/v9.2.0...v9.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-11 08:33:27 +00:00
dependabot[bot]
d9b51b27c8 Bump @types/react from 18.2.34 to 18.2.37
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.34 to 18.2.37.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-11 08:33:17 +00:00
Alejandro Celaya
19ba0b5a9f Merge pull request #953 from shlinkio/dependabot/npm_and_yarn/types/react-18.2.34
Bump @types/react from 18.2.33 to 18.2.34
2023-11-05 10:42:46 +01:00
Alejandro Celaya
9077d744e9 Merge pull request #954 from shlinkio/dependabot/npm_and_yarn/vitejs/plugin-react-4.1.1
Bump @vitejs/plugin-react from 4.1.0 to 4.1.1
2023-11-05 10:42:39 +01:00
Alejandro Celaya
62c29694c8 Merge pull request #955 from shlinkio/dependabot/npm_and_yarn/eslint-8.53.0
Bump eslint from 8.52.0 to 8.53.0
2023-11-05 10:42:30 +01:00
dependabot[bot]
8ac946dcc3 Bump eslint from 8.52.0 to 8.53.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.52.0 to 8.53.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/v8.52.0...v8.53.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-04 08:29:48 +00:00
dependabot[bot]
31ea6d474c Bump @vitejs/plugin-react from 4.1.0 to 4.1.1
Bumps [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) from 4.1.0 to 4.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/v4.1.1/packages/plugin-react)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-04 08:29:28 +00:00
dependabot[bot]
a08b3d2f62 Bump @types/react from 18.2.33 to 18.2.34
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.33 to 18.2.34.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-04 08:29:18 +00:00
Alejandro Celaya
d68e1b3439 Merge pull request #948 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-0.16.6
Bump vite-plugin-pwa from 0.16.5 to 0.16.6
2023-11-02 10:22:27 +01:00
Alejandro Celaya
18882375c6 Add explicit manifest type 2023-11-02 10:20:45 +01:00
dependabot[bot]
2d6722826a Bump vite-plugin-pwa from 0.16.5 to 0.16.6
Bumps [vite-plugin-pwa](https://github.com/antfu/vite-plugin-pwa) from 0.16.5 to 0.16.6.
- [Release notes](https://github.com/antfu/vite-plugin-pwa/releases)
- [Commits](https://github.com/antfu/vite-plugin-pwa/compare/v0.16.5...v0.16.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-02 08:41:05 +00:00
Alejandro Celaya
e12914606f Merge pull request #952 from shlinkio/dependabot/npm_and_yarn/react-router-dom-6.18.0
Bump react-router-dom from 6.17.0 to 6.18.0
2023-11-01 19:30:52 +01:00
dependabot[bot]
96c54b0b9c Bump react-router-dom from 6.17.0 to 6.18.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.17.0 to 6.18.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.18.0/packages/react-router-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 15:25:17 +00:00
Alejandro Celaya
788026f2d1 Merge pull request #950 from acelaya-forks/feature/remove-ramda
Feature/remove ramda
2023-11-01 16:24:08 +01:00
Alejandro Celaya
8ad1e7e0d9 Replace remaining ramda references with shlinkio/data-manipulation 2023-11-01 16:19:51 +01:00
Alejandro Celaya
0bc5996ffc Use slnk.to domain for donate link 2023-11-01 13:46:42 +01:00
Alejandro Celaya
7ba78fd919 Remove more ovbious ramda helper usages 2023-11-01 10:13:41 +01:00
Alejandro Celaya
8699eaca32 First batch of ramda removals 2023-11-01 10:03:09 +01:00
Alejandro Celaya
98b2db99b3 Replace classnames package with clsx 2023-11-01 09:41:21 +01:00
Alejandro Celaya
060dcc8500 Merge pull request #949 from shlinkio/dependabot/npm_and_yarn/sass-1.69.5
Bump sass from 1.69.4 to 1.69.5
2023-10-29 11:02:01 +01:00
Alejandro Celaya
c5e3bc6867 Merge pull request #947 from shlinkio/dependabot/npm_and_yarn/types/react-18.2.33
Bump @types/react from 18.2.31 to 18.2.33
2023-10-29 11:01:51 +01:00
Alejandro Celaya
17160168a6 Merge pull request #946 from shlinkio/dependabot/docker/node-21.1-alpine
Bump node from 20.8-alpine to 21.1-alpine
2023-10-29 11:01:38 +01:00
dependabot[bot]
0744ecb4da Bump sass from 1.69.4 to 1.69.5
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.4 to 1.69.5.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.69.4...1.69.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-28 07:37:12 +00:00
dependabot[bot]
e2afe97157 Bump @types/react from 18.2.31 to 18.2.33
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.31 to 18.2.33.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-28 07:36:21 +00:00
dependabot[bot]
906902dbcc Bump node from 20.8-alpine to 21.1-alpine
Bumps node from 20.8-alpine to 21.1-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-28 07:36:03 +00:00
Alejandro Celaya
2879eb8f4e Merge pull request #941 from shlinkio/dependabot/npm_and_yarn/eslint-8.52.0
Bump eslint from 8.51.0 to 8.52.0
2023-10-21 14:08:44 +02:00
Alejandro Celaya
f3d3f61598 Merge pull request #944 from shlinkio/dependabot/npm_and_yarn/types/react-18.2.31
Bump @types/react from 18.2.28 to 18.2.31
2023-10-21 14:08:35 +02:00
Alejandro Celaya
0e873c929a Merge pull request #943 from shlinkio/dependabot/npm_and_yarn/vite-4.5.0
Bump vite from 4.4.11 to 4.5.0
2023-10-21 14:08:26 +02:00
dependabot[bot]
93883dad9e Bump @types/react from 18.2.28 to 18.2.31
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.28 to 18.2.31.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-21 09:55:07 +00:00
dependabot[bot]
b7a6d76edf Bump eslint from 8.51.0 to 8.52.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.51.0 to 8.52.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/v8.51.0...v8.52.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-21 09:54:59 +00:00
dependabot[bot]
b40dcfd941 Bump vite from 4.4.11 to 4.5.0
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.4.11 to 4.5.0.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.0/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.0/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-21 09:54:46 +00:00
Alejandro Celaya
e3bb49e5d8 Merge pull request #940 from shlinkio/dependabot/npm_and_yarn/types/react-dom-18.2.14
Bump @types/react-dom from 18.2.13 to 18.2.14
2023-10-21 11:54:26 +02:00
Alejandro Celaya
ef0f226878 Merge pull request #938 from shlinkio/dependabot/npm_and_yarn/sass-1.69.4
Bump sass from 1.69.3 to 1.69.4
2023-10-21 11:54:16 +02:00
Alejandro Celaya
0723861b50 Merge pull request #942 from shlinkio/dependabot/npm_and_yarn/testing-library/jest-dom-6.1.4
Bump @testing-library/jest-dom from 6.1.3 to 6.1.4
2023-10-21 11:51:58 +02:00
dependabot[bot]
606d9a0d0d Bump @types/react-dom from 18.2.13 to 18.2.14
Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 18.2.13 to 18.2.14.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-21 09:51:28 +00:00
dependabot[bot]
d3d858f506 Bump sass from 1.69.3 to 1.69.4
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.3 to 1.69.4.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.69.3...1.69.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-21 09:51:26 +00:00
Alejandro Celaya
2f4c331d8c Merge pull request #939 from shlinkio/dependabot/npm_and_yarn/react-router-dom-6.17.0
Bump react-router-dom from 6.16.0 to 6.17.0
2023-10-21 11:51:12 +02:00
Alejandro Celaya
3d046d72da Merge pull request #937 from shlinkio/dependabot/npm_and_yarn/types/uuid-9.0.6
Bump @types/uuid from 9.0.5 to 9.0.6
2023-10-21 11:50:59 +02:00
Alejandro Celaya
a655528825 Merge pull request #936 from shlinkio/dependabot/npm_and_yarn/stylelint-15.11.0
Bump stylelint from 15.10.3 to 15.11.0
2023-10-21 11:50:47 +02:00
dependabot[bot]
3e940b9c27 Bump @testing-library/jest-dom from 6.1.3 to 6.1.4
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.1.3 to 6.1.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.1.3...v6.1.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-21 07:29:43 +00:00
dependabot[bot]
26d3d49664 Bump react-router-dom from 6.16.0 to 6.17.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-21 07:29:01 +00:00
dependabot[bot]
ce6606ea30 Bump @types/uuid from 9.0.5 to 9.0.6
Bumps [@types/uuid](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uuid) from 9.0.5 to 9.0.6.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/uuid)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-21 07:28:36 +00:00
dependabot[bot]
58b972d54f Bump stylelint from 15.10.3 to 15.11.0
Bumps [stylelint](https://github.com/stylelint/stylelint) from 15.10.3 to 15.11.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/15.10.3...15.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-21 07:28:25 +00:00
Alejandro Celaya
988ed0378f Merge pull request #934 from shlinkio/dependabot/npm_and_yarn/babel/traverse-7.23.2
Bump @babel/traverse from 7.23.0 to 7.23.2
2023-10-20 14:31:58 +02:00
dependabot[bot]
a68036cbf4 Bump @babel/traverse from 7.23.0 to 7.23.2
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.23.0 to 7.23.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-19 13:15:35 +00:00
Alejandro Celaya
469db0fd2f Merge pull request #925 from shlinkio/dependabot/npm_and_yarn/types/uuid-9.0.5
Bump @types/uuid from 9.0.4 to 9.0.5
2023-10-14 10:37:25 +02:00
Alejandro Celaya
440683f496 Merge pull request #929 from shlinkio/dependabot/npm_and_yarn/postcss-8.4.31
Bump postcss from 8.4.27 to 8.4.31
2023-10-14 10:37:09 +02:00
Alejandro Celaya
ba0943d34b Merge pull request #931 from shlinkio/dependabot/npm_and_yarn/types/react-18.2.28
Bump @types/react from 18.2.23 to 18.2.28
2023-10-14 10:36:55 +02:00
dependabot[bot]
5cad7a6347 Bump postcss from 8.4.27 to 8.4.31
Bumps [postcss](https://github.com/postcss/postcss) from 8.4.27 to 8.4.31.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.27...8.4.31)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-14 08:22:51 +00:00
dependabot[bot]
99c5859b1c Bump @types/react from 18.2.23 to 18.2.28
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.23 to 18.2.28.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-14 08:22:36 +00:00
dependabot[bot]
676b0e74a8 Bump @types/uuid from 9.0.4 to 9.0.5
Bumps [@types/uuid](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uuid) from 9.0.4 to 9.0.5.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/uuid)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-14 08:22:30 +00:00
Alejandro Celaya
80c452a434 Merge pull request #932 from shlinkio/dependabot/npm_and_yarn/sass-1.69.3
Bump sass from 1.68.0 to 1.69.3
2023-10-14 10:22:06 +02:00
dependabot[bot]
fd93265e5e Bump sass from 1.68.0 to 1.69.3
Bumps [sass](https://github.com/sass/dart-sass) from 1.68.0 to 1.69.3.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.68.0...1.69.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-14 08:21:59 +00:00
Alejandro Celaya
ec9d8b31ce Merge pull request #930 from shlinkio/dependabot/npm_and_yarn/types/react-dom-18.2.13
Bump @types/react-dom from 18.2.8 to 18.2.13
2023-10-14 10:21:51 +02:00
Alejandro Celaya
d032864610 Merge pull request #926 from shlinkio/dependabot/npm_and_yarn/vite-4.4.11
Bump vite from 4.4.9 to 4.4.11
2023-10-14 10:21:32 +02:00
Alejandro Celaya
ea126c2391 Merge pull request #923 from shlinkio/dependabot/npm_and_yarn/eslint-8.51.0
Bump eslint from 8.50.0 to 8.51.0
2023-10-14 10:21:12 +02:00
Alejandro Celaya
aac5203023 Merge pull request #921 from shlinkio/dependabot/npm_and_yarn/react-redux-8.1.3
Bump react-redux from 8.1.2 to 8.1.3
2023-10-14 10:21:03 +02:00
Alejandro Celaya
2759f28257 Merge pull request #920 from shlinkio/dependabot/npm_and_yarn/reduxjs/toolkit-1.9.7
Bump @reduxjs/toolkit from 1.9.6 to 1.9.7
2023-10-14 10:20:51 +02:00
Alejandro Celaya
1e1a134287 Merge pull request #911 from shlinkio/dependabot/docker/node-20.8-alpine
Bump node from 20.7-alpine to 20.8-alpine
2023-10-14 10:20:40 +02:00
dependabot[bot]
1f39520c27 Bump @types/react-dom from 18.2.8 to 18.2.13
Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 18.2.8 to 18.2.13.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-14 07:32:23 +00:00
dependabot[bot]
111a41a783 Bump vite from 4.4.9 to 4.4.11
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.4.9 to 4.4.11.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.4.11/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.4.11/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-07 07:56:15 +00:00
dependabot[bot]
72e7dfcad6 Bump eslint from 8.50.0 to 8.51.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.50.0 to 8.51.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/v8.50.0...v8.51.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-07 07:55:25 +00:00
dependabot[bot]
1eaf03b712 Bump react-redux from 8.1.2 to 8.1.3
Bumps [react-redux](https://github.com/reduxjs/react-redux) from 8.1.2 to 8.1.3.
- [Release notes](https://github.com/reduxjs/react-redux/releases)
- [Changelog](https://github.com/reduxjs/react-redux/blob/master/CHANGELOG.md)
- [Commits](https://github.com/reduxjs/react-redux/compare/v8.1.2...v8.1.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-07 07:54:42 +00:00
dependabot[bot]
222c77d989 Bump @reduxjs/toolkit from 1.9.6 to 1.9.7
Bumps [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) from 1.9.6 to 1.9.7.
- [Release notes](https://github.com/reduxjs/redux-toolkit/releases)
- [Commits](https://github.com/reduxjs/redux-toolkit/compare/v1.9.6...v1.9.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-07 07:54:25 +00:00
Alejandro Celaya
c668f4fa2f Merge pull request #918 from acelaya-forks/feature/a11y
Feature/a11y
2023-09-30 20:31:01 +02:00
Alejandro Celaya
86c8aa7b9b Update shlink-web-component to v0.3.5 2023-09-30 20:26:28 +02:00
Alejandro Celaya
e33a2a74bc Fix merge conflicts 2023-09-30 20:24:45 +02:00
Alejandro Celaya
2f858bc73d Merge pull request #917 from shlinkio/dependabot/npm_and_yarn/vitest/coverage-v8-0.34.6
Bump @vitest/coverage-v8 from 0.34.5 to 0.34.6
2023-09-30 17:41:03 +02:00
Alejandro Celaya
6e90c0bec5 Merge pull request #912 from shlinkio/dependabot/npm_and_yarn/types/react-dom-18.2.8
Bump @types/react-dom from 18.2.7 to 18.2.8
2023-09-30 17:40:48 +02:00
dependabot[bot]
26244d5682 Bump @vitest/coverage-v8 from 0.34.5 to 0.34.6
Bumps [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) from 0.34.5 to 0.34.6.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.6/packages/coverage-v8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-30 15:21:08 +00:00
dependabot[bot]
940cf4ba55 Bump @types/react-dom from 18.2.7 to 18.2.8
Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 18.2.7 to 18.2.8.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-30 15:21:01 +00:00
Alejandro Celaya
b1206fec3f Merge pull request #913 from shlinkio/dependabot/npm_and_yarn/types/react-18.2.23
Bump @types/react from 18.2.22 to 18.2.23
2023-09-30 17:20:45 +02:00
Alejandro Celaya
72f792230b Merge pull request #914 from shlinkio/dependabot/npm_and_yarn/vitejs/plugin-react-4.1.0
Bump @vitejs/plugin-react from 4.0.4 to 4.1.0
2023-09-30 17:20:36 +02:00
Alejandro Celaya
2f615e23ae Merge pull request #915 from shlinkio/dependabot/npm_and_yarn/vitest-0.34.6
Bump vitest from 0.34.5 to 0.34.6
2023-09-30 17:20:24 +02:00
Alejandro Celaya
4c9e5605d9 Merge pull request #916 from shlinkio/dependabot/npm_and_yarn/reduxjs/toolkit-1.9.6
Bump @reduxjs/toolkit from 1.9.5 to 1.9.6
2023-09-30 17:20:09 +02:00
Alejandro Celaya
7a216a195a Add more accessibility tests 2023-09-30 10:48:39 +02:00
Alejandro Celaya
6d1d3c021a Add first accessibility tests 2023-09-30 10:20:28 +02:00
dependabot[bot]
2a46f0911a Bump @reduxjs/toolkit from 1.9.5 to 1.9.6
Bumps [@reduxjs/toolkit](https://github.com/reduxjs/redux-toolkit) from 1.9.5 to 1.9.6.
- [Release notes](https://github.com/reduxjs/redux-toolkit/releases)
- [Commits](https://github.com/reduxjs/redux-toolkit/compare/v1.9.5...v1.9.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-30 07:09:07 +00:00
dependabot[bot]
58257f7b38 Bump vitest from 0.34.5 to 0.34.6
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.34.5 to 0.34.6.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.6/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-30 07:08:56 +00:00
dependabot[bot]
79e4444170 Bump @vitejs/plugin-react from 4.0.4 to 4.1.0
Bumps [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) from 4.0.4 to 4.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/v4.1.0/packages/plugin-react)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-30 07:08:23 +00:00
dependabot[bot]
72d7d643d4 Bump @types/react from 18.2.22 to 18.2.23
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.22 to 18.2.23.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-30 07:08:13 +00:00
dependabot[bot]
d6dec560d0 Bump node from 20.7-alpine to 20.8-alpine
Bumps node from 20.7-alpine to 20.8-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-30 07:01:55 +00:00
Alejandro Celaya
ed83d4e842 Fix typo in CHANGELOG 2023-09-25 09:00:54 +02:00
Alejandro Celaya
72941ebfd4 Update changelog 2023-09-25 08:59:43 +02:00
Alejandro Celaya
ec10a4a77e Merge pull request #902 from aschaber1/unpriv-container
build: switch nginx docker base image to unprivileged version
2023-09-25 08:57:19 +02:00
Alexander Schaber
7eae695a78 build!: switch nginx docker base image to unprivileged version 2023-09-24 23:28:32 +02:00
Alejandro Celaya
3c4fa33b72 Merge pull request #907 from shlinkio/dependabot/npm_and_yarn/eslint-8.50.0
Bump eslint from 8.49.0 to 8.50.0
2023-09-23 12:06:06 +02:00
Alejandro Celaya
52a536a1ee Merge pull request #904 from shlinkio/dependabot/npm_and_yarn/types/react-18.2.22
Bump @types/react from 18.2.21 to 18.2.22
2023-09-23 12:05:46 +02:00
Alejandro Celaya
a0fc3685fc Merge pull request #901 from shlinkio/dependabot/npm_and_yarn/testing-library/user-event-14.5.1
Bump @testing-library/user-event from 14.4.3 to 14.5.1
2023-09-23 12:05:25 +02:00
Alejandro Celaya
0efd4818df Update to node 20.7 2023-09-23 12:04:58 +02:00
dependabot[bot]
5dcc38785d Bump eslint from 8.49.0 to 8.50.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.49.0 to 8.50.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/v8.49.0...v8.50.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-23 10:02:36 +00:00
dependabot[bot]
4a35938c6a Bump @types/react from 18.2.21 to 18.2.22
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.21 to 18.2.22.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-23 10:02:35 +00:00
dependabot[bot]
37c4b2104f Bump @testing-library/user-event from 14.4.3 to 14.5.1
Bumps [@testing-library/user-event](https://github.com/testing-library/user-event) from 14.4.3 to 14.5.1.
- [Release notes](https://github.com/testing-library/user-event/releases)
- [Changelog](https://github.com/testing-library/user-event/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/user-event/compare/v14.4.3...v14.5.1)

---
updated-dependencies:
- dependency-name: "@testing-library/user-event"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-23 10:02:17 +00:00
Alejandro Celaya
313c12113c Merge pull request #906 from shlinkio/dependabot/npm_and_yarn/vitest/coverage-v8-0.34.5
Bump @vitest/coverage-v8 from 0.34.4 to 0.34.5
2023-09-23 12:01:59 +02:00
Alejandro Celaya
9abb0c985b Merge pull request #898 from shlinkio/dependabot/npm_and_yarn/uuid-and-types/uuid-9.0.1
Bump uuid and @types/uuid
2023-09-23 12:01:52 +02:00
Alejandro Celaya
64a40e5f67 Merge pull request #899 from shlinkio/dependabot/npm_and_yarn/react-router-dom-6.16.0
Bump react-router-dom from 6.15.0 to 6.16.0
2023-09-23 12:01:45 +02:00
Alejandro Celaya
649abbbc58 Merge pull request #905 from shlinkio/dependabot/npm_and_yarn/vitest-0.34.5
Bump vitest from 0.34.4 to 0.34.5
2023-09-23 12:01:35 +02:00
Alejandro Celaya
599a618992 Merge pull request #909 from shlinkio/dependabot/npm_and_yarn/sass-1.68.0
Bump sass from 1.66.1 to 1.68.0
2023-09-23 12:01:02 +02:00
Alejandro Celaya
7623405c6f Remove unecessary dev dependency 2023-09-23 12:00:39 +02:00
dependabot[bot]
1d4bb5ba28 Bump sass from 1.66.1 to 1.68.0
Bumps [sass](https://github.com/sass/dart-sass) from 1.66.1 to 1.68.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.66.1...1.68.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-23 07:08:08 +00:00
dependabot[bot]
6fb62bddff Bump @vitest/coverage-v8 from 0.34.4 to 0.34.5
Bumps [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) from 0.34.4 to 0.34.5.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.5/packages/coverage-v8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-23 07:07:10 +00:00
dependabot[bot]
b39f5ee9e9 Bump vitest from 0.34.4 to 0.34.5
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.34.4 to 0.34.5.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.5/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-23 07:06:58 +00:00
dependabot[bot]
2bcadc6576 Bump react-router-dom from 6.15.0 to 6.16.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.15.0 to 6.16.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.16.0/packages/react-router-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-16 07:09:12 +00:00
dependabot[bot]
ef7e9797f5 Bump uuid and @types/uuid
Bumps [uuid](https://github.com/uuidjs/uuid) and [@types/uuid](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uuid). These dependencies needed to be updated together.

Updates `uuid` from 9.0.0 to 9.0.1
- [Changelog](https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/uuidjs/uuid/compare/v9.0.0...v9.0.1)

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

---
updated-dependencies:
- dependency-name: uuid
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: "@types/uuid"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-16 07:08:52 +00:00
Alejandro Celaya
cd188df212 Merge pull request #895 from shlinkio/dependabot/npm_and_yarn/eslint-8.49.0
Bump eslint from 8.48.0 to 8.49.0
2023-09-09 13:01:28 +02:00
Alejandro Celaya
8e670a6e6f Merge pull request #896 from shlinkio/dependabot/npm_and_yarn/vite-plugin-pwa-0.16.5
Bump vite-plugin-pwa from 0.16.4 to 0.16.5
2023-09-09 13:01:18 +02:00
dependabot[bot]
627a2e4635 Bump eslint from 8.48.0 to 8.49.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.48.0 to 8.49.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/v8.48.0...v8.49.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-09 10:59:06 +00:00
Alejandro Celaya
49261e0ef0 Merge pull request #893 from shlinkio/dependabot/npm_and_yarn/testing-library/jest-dom-6.1.3
Bump @testing-library/jest-dom from 6.1.2 to 6.1.3
2023-09-09 12:58:39 +02:00
dependabot[bot]
fdc3b5a7ef Bump vite-plugin-pwa from 0.16.4 to 0.16.5
Bumps [vite-plugin-pwa](https://github.com/antfu/vite-plugin-pwa) from 0.16.4 to 0.16.5.
- [Release notes](https://github.com/antfu/vite-plugin-pwa/releases)
- [Commits](https://github.com/antfu/vite-plugin-pwa/compare/v0.16.4...v0.16.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-09 10:58:28 +00:00
Alejandro Celaya
050c1ba024 Merge pull request #894 from shlinkio/dependabot/npm_and_yarn/vitest/coverage-v8-0.34.4
Bump @vitest/coverage-v8 from 0.34.3 to 0.34.4
2023-09-09 12:58:26 +02:00
Alejandro Celaya
1103739aee Merge pull request #897 from shlinkio/dependabot/npm_and_yarn/vitest-0.34.4
Bump vitest from 0.34.3 to 0.34.4
2023-09-09 12:57:46 +02:00
dependabot[bot]
6a91e83436 Bump vitest from 0.34.3 to 0.34.4
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.34.3 to 0.34.4.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.4/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-09 07:54:01 +00:00
dependabot[bot]
3895de9174 Bump @vitest/coverage-v8 from 0.34.3 to 0.34.4
Bumps [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) from 0.34.3 to 0.34.4.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.4/packages/coverage-v8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-09 07:52:56 +00:00
dependabot[bot]
d75473a90c Bump @testing-library/jest-dom from 6.1.2 to 6.1.3
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.1.2 to 6.1.3.
- [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.1.2...v6.1.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-09 07:52:41 +00:00
Alejandro Celaya
0a77df9d40 Fix wrong definition of custom hooks 2023-09-05 22:56:11 +02:00
Alejandro Celaya
cd167f4078 Merge pull request #891 from acelaya-forks/feature/update-shlink-deps
Update shlink-frontend-kit and shlink-web-component
2023-09-05 20:42:31 +02:00
Alejandro Celaya
abe1d78ee0 Update shlink-frontend-kit and shlink-web-component 2023-09-05 20:38:51 +02:00
Alejandro Celaya
b71b14a4fd Merge pull request #890 from acelaya-forks/feature/improve-component-di
Feature/improve component di
2023-09-05 09:42:56 +02:00
Alejandro Celaya
be1b474f41 Remove TimeoutToggle callback's dependency on initial value 2023-09-05 09:33:45 +02:00
Alejandro Celaya
7a7884f38d Use test seams instead of DI in useTimeoutToggle 2023-09-05 09:18:03 +02:00
Alejandro Celaya
6926afbac1 Refactor DI approach for components 2023-09-05 09:08:42 +02:00
Alejandro Celaya
046f79270a Change how components get dependencies injected to avoid callback nesting 2023-09-03 11:06:35 +02:00
Alejandro Celaya
4677c24242 Merge pull request #889 from acelaya-forks/feature/improve-hooks
Feature/improve hooks
2023-09-03 09:48:10 +02:00
Alejandro Celaya
65d3a19530 Add missing useCallback wrapping inside ImportServerBtn 2023-09-02 20:44:03 +02:00
Alejandro Celaya
a23d441dd3 Enable react-hooks/exhaustive-deps linting rule 2023-09-02 19:48:23 +02:00
Alejandro Celaya
973f3e3c8b Simplify ServersImporter using file.text() instead of a FileReader 2023-09-02 19:44:29 +02:00
Alejandro Celaya
a11a2c84fe Fix react-hooks/exhaustive-deps in ImportServersBtn 2023-09-02 19:43:41 +02:00
Alejandro Celaya
fbc47846e3 Fix some instances of react-hooks/exhaustive-deps 2023-09-02 19:08:12 +02:00
Alejandro Celaya
4298893960 Improve useEffect usage in App component, to have the right dependencies 2023-09-02 11:33:57 +02:00
Alejandro Celaya
1ef96662a3 Make DeleteServerButton more accessible 2023-09-02 10:48:02 +02:00
Alejandro Celaya
b20698ecb2 Re-enable a11y linting rules 2023-09-02 10:38:20 +02:00
Alejandro Celaya
a40b67f65f Merge pull request #887 from shlinkio/dependabot/npm_and_yarn/types/uuid-9.0.3
Bump @types/uuid from 9.0.2 to 9.0.3
2023-09-02 09:42:33 +02:00
Alejandro Celaya
6b32bf8ca9 Merge pull request #888 from shlinkio/dependabot/npm_and_yarn/types/leaflet-1.9.4
Bump @types/leaflet from 1.9.3 to 1.9.4
2023-09-02 09:42:26 +02:00
dependabot[bot]
79e9ced183 Bump @types/leaflet from 1.9.3 to 1.9.4
Bumps [@types/leaflet](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/leaflet) from 1.9.3 to 1.9.4.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/leaflet)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-02 07:03:09 +00:00
dependabot[bot]
396902cfa1 Bump @types/uuid from 9.0.2 to 9.0.3
Bumps [@types/uuid](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uuid) from 9.0.2 to 9.0.3.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/uuid)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-02 07:02:49 +00:00
Alejandro Celaya
92a660cc0b Merge pull request #876 from shlinkio/dependabot/npm_and_yarn/typescript-5.2.2
Bump typescript from 5.1.6 to 5.2.2
2023-08-29 23:30:56 +02:00
Alejandro Celaya
13d44b0bb9 Update to @typescript-eslint/eslint-plugin with support for TypeScript 5.2 2023-08-29 23:27:50 +02:00
dependabot[bot]
cf2081713b Bump typescript from 5.1.6 to 5.2.2
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.1.6 to 5.2.2.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.1.6...v5.2.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-29 23:27:50 +02:00
Alejandro Celaya
06ea3362b6 Merge pull request #886 from acelaya-forks/feature/js-sdk
Replace local ShlinkApiClient with the one from shlink-js-sdk
2023-08-29 23:22:47 +02:00
Alejandro Celaya
30307de37a Adjust required code coverage 2023-08-29 23:15:20 +02:00
Alejandro Celaya
9f7ac09fb0 Replace local ShlinkApiClient with the one from shlink-js-sdk 2023-08-29 23:12:25 +02:00
Alejandro Celaya
ccfedc20e9 Merge pull request #885 from acelaya-forks/feature/decouple-api-client
Update to shlink-web-client 0.3.1
2023-08-27 18:43:27 +02:00
Alejandro Celaya
1e31444c67 Update to shlink-web-client 0.3.1 2023-08-27 18:24:13 +02:00
Alejandro Celaya
30318faf23 Merge pull request #884 from shlinkio/dependabot/npm_and_yarn/workbox-core-7.0.0
Bump workbox-core from 6.5.4 to 7.0.0
2023-08-27 08:48:09 +02:00
dependabot[bot]
1e2938bd91 Bump workbox-core from 6.5.4 to 7.0.0
Bumps [workbox-core](https://github.com/googlechrome/workbox) from 6.5.4 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v6.5.4...v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-core
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-27 06:38:57 +00:00
Alejandro Celaya
f3db353bb4 Group fontawesome deps in dependabot 2023-08-27 08:37:54 +02:00
Alejandro Celaya
c538795052 Merge pull request #875 from shlinkio/dependabot/npm_and_yarn/shlinkio/eslint-config-js-coding-standard-2.3.0
Bump @shlinkio/eslint-config-js-coding-standard from 2.2.0 to 2.3.0
2023-08-26 10:35:42 +02:00
Alejandro Celaya
08a5014b5e Temp disable react-hooks linting rules 2023-08-26 10:30:25 +02:00
Alejandro Celaya
58b4f0a915 Merge pull request #879 from shlinkio/dependabot/npm_and_yarn/eslint-8.48.0
Bump eslint from 8.47.0 to 8.48.0
2023-08-26 10:28:08 +02:00
dependabot[bot]
e22618b1df Bump eslint from 8.47.0 to 8.48.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.47.0 to 8.48.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/v8.47.0...v8.48.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-26 08:24:44 +00:00
dependabot[bot]
3a88695122 Bump @shlinkio/eslint-config-js-coding-standard from 2.2.0 to 2.3.0
Bumps [@shlinkio/eslint-config-js-coding-standard](https://github.com/shlinkio/js-coding-standard) from 2.2.0 to 2.3.0.
- [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/v2.2.0...v2.3.0)

---
updated-dependencies:
- dependency-name: "@shlinkio/eslint-config-js-coding-standard"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-26 08:24:29 +00:00
Alejandro Celaya
c0f20fde96 Merge pull request #882 from shlinkio/dependabot/npm_and_yarn/types/react-18.2.21
Bump @types/react from 18.2.20 to 18.2.21
2023-08-26 10:24:12 +02:00
Alejandro Celaya
cab89cc417 Merge pull request #881 from shlinkio/dependabot/npm_and_yarn/vitest/coverage-v8-0.34.3
Bump @vitest/coverage-v8 from 0.34.1 to 0.34.3
2023-08-26 10:24:02 +02:00
Alejandro Celaya
a1042bc87d Merge pull request #880 from shlinkio/dependabot/npm_and_yarn/testing-library/jest-dom-6.1.2
Bump @testing-library/jest-dom from 6.0.1 to 6.1.2
2023-08-26 10:23:51 +02:00
Alejandro Celaya
92cc8470c1 Merge pull request #877 from shlinkio/dependabot/npm_and_yarn/vitest-0.34.3
Bump vitest from 0.34.1 to 0.34.3
2023-08-26 10:23:26 +02:00
Alejandro Celaya
b2b18fc00b Merge pull request #874 from shlinkio/dependabot/npm_and_yarn/json2csv/plainjs-7.0.3
Bump @json2csv/plainjs from 7.0.2 to 7.0.3
2023-08-26 10:23:05 +02:00
Alejandro Celaya
fa97d8a827 Merge pull request #873 from shlinkio/dependabot/npm_and_yarn/stylelint-15.10.3
Bump stylelint from 15.10.2 to 15.10.3
2023-08-26 10:22:21 +02:00
dependabot[bot]
067b2a96f8 Bump @types/react from 18.2.20 to 18.2.21
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.20 to 18.2.21.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-26 07:59:53 +00:00
dependabot[bot]
886cf7ab2a Bump @vitest/coverage-v8 from 0.34.1 to 0.34.3
Bumps [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) from 0.34.1 to 0.34.3.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.3/packages/coverage-v8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-26 07:59:42 +00:00
dependabot[bot]
04fce4faa1 Bump @testing-library/jest-dom from 6.0.1 to 6.1.2
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.0.1 to 6.1.2.
- [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.0.1...v6.1.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-26 07:59:23 +00:00
dependabot[bot]
039bf35c29 Bump vitest from 0.34.1 to 0.34.3
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.34.1 to 0.34.3.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.3/packages/vitest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-26 07:58:53 +00:00
dependabot[bot]
eee9732d6d Bump @json2csv/plainjs from 7.0.2 to 7.0.3
Bumps [@json2csv/plainjs](https://github.com/juanjoDiaz/json2csv) from 7.0.2 to 7.0.3.
- [Release notes](https://github.com/juanjoDiaz/json2csv/releases)
- [Changelog](https://github.com/juanjoDiaz/json2csv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/juanjoDiaz/json2csv/compare/v7.0.2...v7.0.3)

---
updated-dependencies:
- dependency-name: "@json2csv/plainjs"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-26 07:58:14 +00:00
dependabot[bot]
6823baa791 Bump stylelint from 15.10.2 to 15.10.3
Bumps [stylelint](https://github.com/stylelint/stylelint) from 15.10.2 to 15.10.3.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/15.10.2...15.10.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-26 07:57:55 +00:00
Alejandro Celaya
d02a261e1b Merge pull request #869 from shlinkio/dependabot/npm_and_yarn/workbox-precaching-7.0.0
Bump workbox-precaching from 6.5.4 to 7.0.0
2023-08-19 17:38:29 +02:00
dependabot[bot]
0253e1baf3 Bump workbox-precaching from 6.5.4 to 7.0.0
Bumps [workbox-precaching](https://github.com/googlechrome/workbox) from 6.5.4 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v6.5.4...v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-precaching
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:35:58 +00:00
Alejandro Celaya
3a98e21406 Merge pull request #868 from shlinkio/dependabot/npm_and_yarn/workbox-strategies-7.0.0
Bump workbox-strategies from 6.5.4 to 7.0.0
2023-08-19 17:35:22 +02:00
Alejandro Celaya
dfb3e42c89 Merge pull request #872 from shlinkio/dependabot/npm_and_yarn/sass-1.66.1
Bump sass from 1.64.2 to 1.66.1
2023-08-19 17:33:55 +02:00
dependabot[bot]
536265696b Bump workbox-strategies from 6.5.4 to 7.0.0
Bumps [workbox-strategies](https://github.com/googlechrome/workbox) from 6.5.4 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v6.5.4...v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-strategies
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:33:03 +00:00
Alejandro Celaya
78e2683467 Merge pull request #865 from shlinkio/dependabot/npm_and_yarn/workbox-expiration-7.0.0
Bump workbox-expiration from 6.5.4 to 7.0.0
2023-08-19 17:32:35 +02:00
Alejandro Celaya
3471f48560 Merge pull request #871 from shlinkio/dependabot/npm_and_yarn/workbox-routing-7.0.0
Bump workbox-routing from 6.5.4 to 7.0.0
2023-08-19 17:32:27 +02:00
dependabot[bot]
d7553bbc66 Bump sass from 1.64.2 to 1.66.1
Bumps [sass](https://github.com/sass/dart-sass) from 1.64.2 to 1.66.1.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.64.2...1.66.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:31:01 +00:00
Alejandro Celaya
6935ea5a7c Merge pull request #864 from shlinkio/dependabot/npm_and_yarn/react-router-dom-6.15.0
Bump react-router-dom from 6.14.2 to 6.15.0
2023-08-19 17:30:55 +02:00
Alejandro Celaya
479c00925c Merge pull request #867 from shlinkio/dependabot/npm_and_yarn/types/react-18.2.20
Bump @types/react from 18.2.19 to 18.2.20
2023-08-19 17:30:29 +02:00
Alejandro Celaya
9268cd2a33 Merge pull request #866 from shlinkio/dependabot/npm_and_yarn/eslint-8.47.0
Bump eslint from 8.46.0 to 8.47.0
2023-08-19 17:30:14 +02:00
Alejandro Celaya
af3b088629 Merge pull request #870 from shlinkio/dependabot/npm_and_yarn/testing-library/jest-dom-6.0.1
Bump @testing-library/jest-dom from 6.0.0 to 6.0.1
2023-08-19 17:29:53 +02:00
Alejandro Celaya
76816c5f4f Merge pull request #862 from shlinkio/dependabot/docker/nginx-1.25-alpine
Bump nginx from 1.23-alpine to 1.25-alpine
2023-08-19 17:28:38 +02:00
Alejandro Celaya
879b0565fa Merge pull request #863 from shlinkio/dependabot/npm_and_yarn/json2csv/plainjs-7.0.2
Bump @json2csv/plainjs from 7.0.1 to 7.0.2
2023-08-19 17:28:26 +02:00
dependabot[bot]
4553feff42 Bump workbox-routing from 6.5.4 to 7.0.0
Bumps [workbox-routing](https://github.com/googlechrome/workbox) from 6.5.4 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v6.5.4...v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-routing
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:26:54 +00:00
dependabot[bot]
b0750b599a Bump @testing-library/jest-dom from 6.0.0 to 6.0.1
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.0.0 to 6.0.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.0.0...v6.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:26:44 +00:00
dependabot[bot]
91d142a5e6 Bump @types/react from 18.2.19 to 18.2.20
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.19 to 18.2.20.
- [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-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:26:11 +00:00
dependabot[bot]
0f5941ea67 Bump eslint from 8.46.0 to 8.47.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.46.0 to 8.47.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/v8.46.0...v8.47.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:26:01 +00:00
dependabot[bot]
2d29d7f543 Bump workbox-expiration from 6.5.4 to 7.0.0
Bumps [workbox-expiration](https://github.com/googlechrome/workbox) from 6.5.4 to 7.0.0.
- [Release notes](https://github.com/googlechrome/workbox/releases)
- [Commits](https://github.com/googlechrome/workbox/compare/v6.5.4...v7.0.0)

---
updated-dependencies:
- dependency-name: workbox-expiration
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:25:51 +00:00
dependabot[bot]
0d8bbe8d0c Bump react-router-dom from 6.14.2 to 6.15.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.14.2 to 6.15.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.15.0/packages/react-router-dom)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:25:37 +00:00
dependabot[bot]
ec15dfa1ad Bump @json2csv/plainjs from 7.0.1 to 7.0.2
Bumps [@json2csv/plainjs](https://github.com/juanjoDiaz/json2csv) from 7.0.1 to 7.0.2.
- [Release notes](https://github.com/juanjoDiaz/json2csv/releases)
- [Changelog](https://github.com/juanjoDiaz/json2csv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/juanjoDiaz/json2csv/compare/v7.0.1...v7.0.2)

---
updated-dependencies:
- dependency-name: "@json2csv/plainjs"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:25:25 +00:00
dependabot[bot]
b77be0232b Bump nginx from 1.23-alpine to 1.25-alpine
Bumps nginx from 1.23-alpine to 1.25-alpine.

---
updated-dependencies:
- dependency-name: nginx
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-19 15:25:20 +00:00
Alejandro Celaya
4ab9bfab01 Merge pull request #861 from acelaya-forks/feature/update-web-component
Feature/update web component
2023-08-19 17:25:01 +02:00
Alejandro Celaya
b2e6e7db61 Define UiSettings which are no longer part of shlink-web-component 2023-08-19 17:21:34 +02:00
Alejandro Celaya
de0b735eab Update shlink-web-component to v0.3.0 2023-08-19 13:13:42 +02:00
Alejandro Celaya
e81588616e Update to shlink-web-component 0.2 2023-08-19 13:13:23 +02:00
Alejandro Celaya
6b73fe336b Update dependabot.yml 2023-08-19 09:49:17 +02:00
Alejandro Celaya
6f078413aa Add day of the week for dependabot docker 2023-08-17 09:09:54 +02:00
Alejandro Celaya
089d2e4dd1 Add dependabot config 2023-08-17 09:05:50 +02:00
Alejandro Celaya
7d3b0e4db7 Merge pull request #860 from acelaya-forks/feature/update-testing-lib
Update to @testing-library/jest-dom:6.0.0
2023-08-15 09:56:18 +02:00
Alejandro Celaya
9758e7ed8c Update to @testing-library/jest-dom:6.0.0 2023-08-15 09:53:28 +02:00
Alejandro Celaya
30c07c6790 Merge pull request #859 from acelaya-forks/feature/external-web-component
Feature/external web component
2023-08-14 13:09:28 +02:00
Alejandro Celaya
f7cddf8fc5 Update to shlink-web-component 0.1.1 2023-08-14 13:06:11 +02:00
Alejandro Celaya
0622288990 Update changelog 2023-08-14 12:17:09 +02:00
Alejandro Celaya
6d910519bc Use external shlink-web-component and remove local one 2023-08-14 12:15:57 +02:00
Alejandro Celaya
8aa149cac4 Merge pull request #858 from acelaya-forks/feature/react-tag-autocomplete-7
Update to react-tag-autocomplete 7
2023-08-13 17:02:53 +02:00
Alejandro Celaya
ee62d9a5f0 Increase coverage in TagSelector 2023-08-13 13:53:08 +02:00
Alejandro Celaya
5b15c184eb Make sure suggestions are selectable in TagsSelector 2023-08-12 19:51:18 +02:00
Alejandro Celaya
e4aec16ba5 Define react-tag-autocomplete styles for v7 2023-08-12 19:32:29 +02:00
Alejandro Celaya
3436b52c06 Use ReactTags.suggestionsTransform to enforce at least 1 char 2023-08-12 13:50:10 +02:00
Alejandro Celaya
94ba244ae1 Update to react-tag-autocomplete 7 2023-08-12 13:04:39 +02:00
Alejandro Celaya
5e2dce8f3f Update to shlink-frontend-kit 0.2.0 2023-08-11 23:21:34 +02:00
Alejandro Celaya
ef8778181d Remove old shlink-frontend-kit from coverage folders 2023-08-11 13:40:58 +02:00
Alejandro Celaya
5c45a7e83d Remove direct dependency on qs, as only @shlinkio/shlink-frontend-kit is using it 2023-08-10 20:43:09 +02:00
Alejandro Celaya
c94901ba02 Merge pull request #857 from acelaya-forks/feature/frontend-kit-dep
Feature/frontend kit dep
2023-08-10 20:40:51 +02:00
Alejandro Celaya
62d7f524a8 Update changelog 2023-08-10 20:33:13 +02:00
Alejandro Celaya
036c2b28d0 Install @shlinkio/shlink-frontend-kit as external lib and downgrade bootstrap 2023-08-10 20:32:18 +02:00
Alejandro Celaya
dfe2cdadbc Fix vitest config 2023-08-10 09:18:22 +02:00
Alejandro Celaya
ca6a7ff079 Merge pull request #856 from acelaya-forks/feature/update-deps
Feature/update deps
2023-08-08 15:31:05 +02:00
Alejandro Celaya
66bece60b5 Update remaining deps 2023-08-08 13:26:45 +02:00
Alejandro Celaya
221eb7605f Update bootstrap and chart.js 2023-08-08 13:01:27 +02:00
Alejandro Celaya
f420c7f767 Update fontawesome and test snapshots 2023-08-08 12:43:09 +02:00
Alejandro Celaya
5bce7b91f1 Update testing library 2023-08-08 11:24:19 +02:00
Alejandro Celaya
2da0043e0a Update main dev deps 2023-08-08 11:15:16 +02:00
Alejandro Celaya
a6134c6b42 Merge pull request #853 from acelaya-forks/feature/shlink-web-component
Split reusable content into separated components
2023-08-07 23:41:40 +02:00
Alejandro Celaya
a2f367357a Mute CSS style rule 2023-08-07 23:34:09 +02:00
Alejandro Celaya
6db60f0aa3 Create ShlinkWebComponent test 2023-08-07 23:29:27 +02:00
Alejandro Celaya
74aaed65b6 Fix styles import order 2023-08-07 23:06:29 +02:00
Alejandro Celaya
8decceaa38 Move bootstrap overrides to shlink-frontend-kit 2023-08-07 22:37:19 +02:00
Alejandro Celaya
914efc6a64 Relocate stylesheets to their proper component 2023-08-07 20:43:05 +02:00
Alejandro Celaya
30455864fa Fix ShortUrlForm test 2023-08-07 17:47:26 +02:00
Alejandro Celaya
f16f51a2b3 Move all relevant API types to api-contract 2023-08-07 14:02:36 +02:00
Alejandro Celaya
d97db9e17c Moved some types from short-url/data to api-contract 2023-08-07 10:51:08 +02:00
Alejandro Celaya
23daa2de72 Add Shlink prefix to api-contract models 2023-08-06 21:27:57 +02:00
Alejandro Celaya
47dd105cd6 Make sure props are not passed to Fragment 2023-08-06 18:09:46 +02:00
Alejandro Celaya
5a9640bd57 Remove sidebar reducer, which couple web-client with web-component 2023-08-06 18:07:03 +02:00
Alejandro Celaya
c3b6ce34ba Fix remaining dependencies from shlink-web-component into main app 2023-08-06 17:19:59 +02:00
Alejandro Celaya
75fed53ba4 Add test for TagColorsStorage 2023-08-06 17:11:27 +02:00
Alejandro Celaya
89e75653d7 Delegate tag color storage to ShlinkWebComponent consuming app 2023-08-06 13:54:57 +02:00
Alejandro Celaya
9f9f3b6402 Fix imports 2023-08-06 13:15:32 +02:00
Alejandro Celaya
007d79dd03 Fix coding styles 2023-08-05 11:15:06 +02:00
Alejandro Celaya
d9939f5c3a Move theme helpers and some stylesheets to proper locations 2023-08-05 11:14:03 +02:00
Alejandro Celaya
93048e3327 Add aliases for shlink-web-component and shlink-frontend-kit packages 2023-08-04 22:59:33 +02:00
Alejandro Celaya
9f2b0f7c6b Fix some CSS coding styles 2023-08-04 11:17:24 +02:00
Alejandro Celaya
4d8477a32c Fix shlink-web-component tests 2023-08-04 11:16:01 +02:00
Alejandro Celaya
bdcfcee60e Fix incorrect import in shlink-frontend-kit test 2023-08-04 09:24:21 +02:00
Alejandro Celaya
c4d7ac272b Refactor and fix main app tests 2023-08-04 08:59:16 +02:00
Alejandro Celaya
c794ff8b58 Move shlink-web-component tests to their own folder 2023-08-03 09:13:11 +02:00
Alejandro Celaya
c48facc863 Create src folder for shlink-web-component 2023-08-03 09:13:11 +02:00
Alejandro Celaya
b7d57a53f2 Move shlink-frontend-kit tests to its own dir 2023-08-03 09:13:10 +02:00
Alejandro Celaya
99ce8c9f74 First shlink-frontend-kit iteration 2023-08-03 09:13:10 +02:00
Alejandro Celaya
5ec5396da6 Decouple shlink-web-component from NotFound component 2023-08-03 09:13:10 +02:00
Alejandro Celaya
c73a592fd1 Move more non-shared components to shlink-web-component 2023-08-03 09:13:10 +02:00
Alejandro Celaya
bc11e568b9 Move date components and helpers to shlink-web-component 2023-08-03 09:13:10 +02:00
Alejandro Celaya
8d24116859 Move more components to shlink-web-component when applicable 2023-08-03 09:13:10 +02:00
Alejandro Celaya
275745fd3a Move some modules from src to shlink-web-component 2023-08-03 09:13:10 +02:00
Alejandro Celaya
0169060de7 Fix mercure info loading in shlink-web-component 2023-08-03 09:13:10 +02:00
Alejandro Celaya
d49da185d3 Use apiClient factory to dynamically resolved different values at runtime 2023-08-03 09:13:10 +02:00
Alejandro Celaya
3a0cea1268 Extract shlink-web-component outside of src folder 2023-08-03 09:13:10 +02:00
Alejandro Celaya
768fb1992f Remove feature flags for features introduced on Shlink <3.0 2023-08-03 09:13:10 +02:00
Alejandro Celaya
21525ef945 Decouple shlink-web-component from the concept of servers 2023-08-03 09:13:10 +02:00
Alejandro Celaya
5f6dc186e3 Define Shlink API contract 2023-08-03 09:13:10 +02:00
Alejandro Celaya
3fe48779be Allow heallth request to be performed for a different domain 2023-08-03 09:13:10 +02:00
Alejandro Celaya
2ac5236cc7 Provide API client to shlink-web-component 2023-08-03 09:13:10 +02:00
Alejandro Celaya
b3122219be Move settings from store to another context 2023-08-03 09:13:09 +02:00
Alejandro Celaya
dddbc232c2 Move mercure module to shlink-web-component 2023-08-03 09:13:09 +02:00
Alejandro Celaya
4b2a9ea158 Create redux store for shlink-web-component 2023-08-03 09:13:09 +02:00
Alejandro Celaya
682de08204 Extract initial Shlink logic to ShlinkWebComponent 2023-08-03 09:13:09 +02:00
Alejandro Celaya
d82c0dc75e Move stuff belonging to the component to shlink-web-component 2023-08-03 09:13:09 +02:00
Alejandro Celaya
cbbb679dfc Remove server-related items from side menu 2023-08-03 09:13:09 +02:00
Alejandro Celaya
deca5b31e1 Add form config for Feature Request issues 2023-08-03 09:12:47 +02:00
Alejandro Celaya
6fe5c4dc54 Fix typo in Bug issue template 2023-07-25 08:55:12 +02:00
Alejandro Celaya
49cf81c18b Add forms for question reporting as discussion and bug issues 2023-07-25 08:53:14 +02:00
Alejandro Celaya
37ba90e6bd Merge pull request #850 from shlinkio/dependabot/npm_and_yarn/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4
2023-07-19 08:40:15 +02:00
dependabot[bot]
47a6e16ce1 Bump word-wrap from 1.2.3 to 1.2.4
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-19 06:23:52 +00:00
Alejandro Celaya
f5e92c6897 Merge pull request #848 from shlinkio/develop
Release 3.10.2
2023-07-09 10:17:23 +02:00
Alejandro Celaya
f1014a4810 Build docker image for linux/arm64/v8 and linux/amd64 only 2023-07-09 10:09:35 +02:00
Alejandro Celaya
1793424658 Merge pull request #847 from acelaya-forks/feature/docker-build-on-tag
Build docker image only on tags
2023-07-09 09:58:55 +02:00
Alejandro Celaya
c94a5b948e Build docker image only on tags 2023-07-09 09:48:54 +02:00
Alejandro Celaya
107cabcd8b Merge pull request #845 from shlinkio/dependabot/npm_and_yarn/tough-cookie-4.1.3
Bump tough-cookie from 4.1.2 to 4.1.3
2023-07-08 07:50:43 +02:00
Alejandro Celaya
99bc769894 Merge pull request #844 from shlinkio/dependabot/npm_and_yarn/stylelint-15.10.1
Bump stylelint from 14.16.0 to 15.10.1
2023-07-08 07:50:18 +02:00
dependabot[bot]
e8f1964941 Bump tough-cookie from 4.1.2 to 4.1.3
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.3)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-08 00:17:47 +00:00
dependabot[bot]
1a491bec1c Bump stylelint from 14.16.0 to 15.10.1
Bumps [stylelint](https://github.com/stylelint/stylelint) from 14.16.0 to 15.10.1.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/14.16.0...15.10.1)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-07 22:00:52 +00:00
Alejandro Celaya
4ba63cdbf8 Merge pull request #837 from acelaya-forks/feature/vitest-0.32
Feature/vitest 0.32
2023-06-12 09:47:20 +02:00
Alejandro Celaya
b2c2af3ebb Exclude sw helper from code coverage 2023-06-12 08:59:38 +02:00
Alejandro Celaya
9dca19fcb5 Replace coverage-c8 with coverage-v8 2023-06-12 08:51:37 +02:00
Alejandro Celaya
7c2dab43e1 Update to vitest 0.32 2023-06-09 09:07:20 +02:00
Alejandro Celaya
a8c6d9b034 Merge pull request #836 from shlinkio/dependabot/npm_and_yarn/vite-4.3.9
Bump vite from 4.3.1 to 4.3.9
2023-06-06 05:38:06 +02:00
dependabot[bot]
be0cb20fa2 Bump vite from 4.3.1 to 4.3.9
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.3.1 to 4.3.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/v4.3.9/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-06 02:03:33 +00:00
Alejandro Celaya
2ac1025e9f Merge pull request #834 from acelaya-forks/feature/vitest-migration
Feature/vitest migration
2023-05-27 14:21:33 +02:00
Alejandro Celaya
27d79b574e Correct test:watch command so that it actually watches 2023-05-27 14:15:38 +02:00
Alejandro Celaya
1b82f42a33 Remove direct dependency on redux and redux-thunk, as those are now required by @reduxjs/toolkit 2023-05-27 14:10:37 +02:00
Alejandro Celaya
f3f9eac67b Fix comments 2023-05-27 13:12:38 +02:00
Alejandro Celaya
2a86a0e540 Fix remaining type errors in tests 2023-05-27 12:45:12 +02:00
Alejandro Celaya
d14aea708e Fix incorrect types between testing library and vitest 2023-05-27 12:29:03 +02:00
Alejandro Celaya
12a05b422d Fix merge conflicts 2023-05-27 12:04:01 +02:00
Alejandro Celaya
a5abe9dbf2 Update test snapshots 2023-05-27 12:02:13 +02:00
Alejandro Celaya
07fcb4e016 Update tests to use vi instead of jest 2023-05-27 11:57:26 +02:00
Alejandro Celaya
e2cbb2713a Replace jest config with vitest config 2023-05-27 11:36:18 +02:00
Alejandro Celaya
706e00ace0 Merge pull request #833 from acelaya-forks/feature/menus
Feature/menus
2023-05-27 10:57:14 +02:00
Alejandro Celaya
655fbf94c1 Normalize and consolidate dropdown menus 2023-05-27 10:40:07 +02:00
Alejandro Celaya
afc574aceb Fixed block and inline dropdown buttons 2023-05-27 09:40:49 +02:00
Alejandro Celaya
3da2b56426 Update actions dependencies and node 2023-05-27 09:40:10 +02:00
Alejandro Celaya
5f91ad8819 Merge pull request #829 from shlinkio/develop
Release 3.10.1
2023-04-23 15:56:15 +02:00
Alejandro Celaya
131a745514 Add v3.10.1 to changelog 2023-04-23 15:24:48 +02:00
Alejandro Celaya
86349f1ad3 Merge pull request #828 from acelaya-forks/feature/short-url-export
Feature/short url export
2023-04-22 12:28:12 +02:00
Alejandro Celaya
72e4a7b062 Fix incorrect type 2023-04-22 12:09:15 +02:00
Alejandro Celaya
0a0165df45 Update changelog 2023-04-22 12:05:31 +02:00
Alejandro Celaya
992b22fd24 Refactor short URL export so that it is compatible with what Shlink expects 2023-04-21 09:36:51 +02:00
Alejandro Celaya
6fbe6c673b Merge pull request #827 from acelaya-forks/feature/vite-latest
Update vite deps
2023-04-21 08:20:42 +02:00
Alejandro Celaya
ff22e54b59 Update vite deps 2023-04-20 22:57:49 +02:00
Alejandro Celaya
578365ab68 Delete outdated stryker config file 2023-04-20 09:28:39 +02:00
Alejandro Celaya
22905a2efc Merge pull request #825 from acelaya-forks/feature/shoehorn
Introduce shoehorn as a possible replacement for ts-mockery
2023-04-14 09:34:45 +02:00
Alejandro Celaya
26bad75a1a Finish replacing ts-mockery with shoehorn 2023-04-14 09:28:53 +02:00
Alejandro Celaya
04e1950591 Migrate more tests to shoehorn 2023-04-13 22:47:13 +02:00
Alejandro Celaya
340f4b8fb5 Introduce shoehorn as a possible replacement for ts-mockery 2023-04-13 21:48:29 +02:00
Alejandro Celaya
457458a894 Merge pull request #820 from shlinkio/develop
Release 3.10.0
2023-03-19 12:00:45 +01:00
Alejandro Celaya
f6334c3618 Merge pull request #819 from acelaya-forks/feature/tags-non-bot-visits
Feature/tags non bot visits
2023-03-19 11:54:54 +01:00
Alejandro Celaya
cf27de965e Remove redundant type 2023-03-19 11:50:06 +01:00
Alejandro Celaya
43b2926063 Update changelog 2023-03-19 11:47:02 +01:00
Alejandro Celaya
1d6464fefb Take into consideration types of visits when increasing tags visits 2023-03-19 11:44:40 +01:00
Alejandro Celaya
927ab76dbd Increase required coverage 2023-03-19 10:46:52 +01:00
Alejandro Celaya
34cfe2077b Test proper amount of visits is displayed in TagsList 2023-03-19 10:44:09 +01:00
Alejandro Celaya
4ebe23e89f Add logic to dynamically exclude bots visits in tags table 2023-03-19 10:32:11 +01:00
Alejandro Celaya
8fa61a6301 Merge pull request #817 from acelaya-forks/feature/tags-stats
Feature/tags stats
2023-03-18 16:36:06 +01:00
Alejandro Celaya
96c20b36a5 Split tagsList and tagsStats methods in ShlinkApiClient for clarity 2023-03-18 16:32:04 +01:00
Alejandro Celaya
a9af5163c1 Update changelog 2023-03-18 16:27:52 +01:00
Alejandro Celaya
b87b108e53 Use /tags/stats endpoint when the server supports it 2023-03-18 16:26:28 +01:00
Alejandro Celaya
ddaec7c6ac Merge pull request #816 from acelaya-forks/feature/decouple-actions
Feature/decouple actions
2023-03-18 16:07:15 +01:00
Alejandro Celaya
4e8e16f16d Refactor of redux tests to avoid covering RTK implementation details 2023-03-18 16:02:06 +01:00
Alejandro Celaya
9cefdb7977 First refactor of redux tests to avoid covering RTK implementation details 2023-03-18 12:09:38 +01:00
Alejandro Celaya
a6d000714b Merge pull request #815 from acelaya-forks/feature/overview-bots
Feature/overview bots
2023-03-18 11:15:01 +01:00
Alejandro Celaya
54758272be Update changelog 2023-03-18 11:10:50 +01:00
Alejandro Celaya
8e9e2c5b61 Create test for VisitsHighlightCard 2023-03-18 11:10:03 +01:00
Alejandro Celaya
934bf495a0 Extend overview to exclude/include bot visits based on config 2023-03-18 10:55:07 +01:00
Alejandro Celaya
1d8189369c Enhance visits overview reducer to handle bot and non-bots visits amounts 2023-03-18 10:54:14 +01:00
Alejandro Celaya
25aa9b9bd7 Enhance types including potential bots on visits summary endpoint 2023-03-18 10:29:49 +01:00
Alejandro Celaya
a1b879a5b4 Add support for a tooltip on HighlightCard component 2023-03-18 10:17:17 +01:00
Alejandro Celaya
b70724f7d6 Update babel-typescript plugin 2023-03-18 10:08:44 +01:00
Alejandro Celaya
a52f96f8e5 Merge pull request #814 from acelaya-forks/feature/update-ts-vite
Update to latest TypeScript and Vite versions
2023-03-17 08:57:11 +01:00
Alejandro Celaya
970c573a12 Update to latest TypeScript and Vite versions 2023-03-17 08:49:47 +01:00
Alejandro Celaya
46749044e2 Merge pull request #813 from acelaya-forks/feature/device-long-urls
Feature/device long urls
2023-03-14 09:11:54 +01:00
Alejandro Celaya
16d748800c Update copy-to-clipboard icons 2023-03-14 09:06:57 +01:00
Alejandro Celaya
3e698b045a Add IconInput test 2023-03-14 09:02:12 +01:00
Alejandro Celaya
999b21577a Removed duplicated CSS from DateInput 2023-03-14 08:50:53 +01:00
Alejandro Celaya
3be5126e2d Add missing ref to IconInput 2023-03-13 18:18:35 +01:00
Alejandro Celaya
2b14c49c80 Update snapshots 2023-03-13 18:04:09 +01:00
Alejandro Celaya
bace2a10e8 Create component to display input with an icon 2023-03-13 18:02:29 +01:00
Alejandro Celaya
006e6b30b7 Update changelog 2023-03-13 09:06:49 +01:00
Alejandro Celaya
4c5d0321d2 Add support for device-specific long URLs when using Shlink 3.5.0 or newer 2023-03-13 09:05:54 +01:00
Alejandro Celaya
fa69c21fa2 Merge pull request #811 from acelaya-forks/feature/feature-flag-hooks
Convert feature flags into hooks
2023-03-11 10:38:26 +01:00
Alejandro Celaya
95439e5602 Convert feature flags into hooks 2023-03-11 10:33:03 +01:00
Alejandro Celaya
bbd8d8ef4e Fix border radius on tags input 2023-03-10 09:17:07 +01:00
Alejandro Celaya
ef269d565c Merge pull request #810 from acelaya-forks/feature/fallback-bots
Make sure the request to get the latest fallback visit respects bots config
2023-03-10 08:58:56 +01:00
Alejandro Celaya
8acf6dda6e Make sure the request to get the latest fallback visit respects bots config 2023-03-10 08:53:05 +01:00
Alejandro Celaya
d18219dc14 Merge pull request #806 from acelaya-forks/feature/preview
Feature/preview
2023-03-08 09:27:57 +01:00
Alejandro Celaya
3f1718f4c5 Fix merge conflicts 2023-03-08 09:21:05 +01:00
Alejandro Celaya
825a749b45 Replace serve with vite preview to check generated build 2023-03-08 09:18:32 +01:00
Alejandro Celaya
c2eb09e664 Merge pull request #804 from acelaya-forks/feature/update-coding-standard
Feature/update coding standard
2023-02-18 11:44:05 +01:00
Alejandro Celaya
adb670dd0c Update coding standard 2023-02-18 11:40:04 +01:00
Alejandro Celaya
5e9ec071dc Remove default exports 2023-02-18 11:37:49 +01:00
Alejandro Celaya
1f41f8da23 Ordered imports alphabetically 2023-02-18 11:15:35 +01:00
Alejandro Celaya
2a5480da79 Add import type whenever possible 2023-02-18 10:40:37 +01:00
Alejandro Celaya
7add854b40 Merge pull request #803 from acelaya-forks/feature/remove-stryker
Remove stryker and mutation testing
2023-02-17 20:31:39 +01:00
Alejandro Celaya
e639cd0bd2 Update changelog 2023-02-17 20:27:48 +01:00
Alejandro Celaya
3503f1f580 Remove stryker and mutation testing 2023-02-17 20:09:31 +01:00
Alejandro Celaya
853dcbd69a Merge pull request #801 from acelaya-forks/feature/vite-4.1
Update to vite 4.1
2023-02-11 13:22:56 +01:00
Alejandro Celaya
c54fff5472 Update to vite 4.1 2023-02-11 13:16:41 +01:00
Alejandro Celaya
699d3d3eaa Fix twitter badge 2023-01-28 11:18:08 +01:00
Alejandro Celaya
0c91f488f0 Merge pull request #794 from acelaya-forks/feature/domain
Replace references to doma.in with s.test
2023-01-18 08:12:25 +01:00
Alejandro Celaya
d3a644877e Replace references to doma.in with s.test 2023-01-17 22:53:49 +01:00
Alejandro Celaya
aac2832eb7 Merge pull request #791 from acelaya-forks/feature/fix-ref-types
Improved types on element ref objects and their usage
2023-01-10 20:11:36 +01:00
Alejandro Celaya
487c832f5b Improved types on element ref objects and their usage 2023-01-10 20:04:47 +01:00
Alejandro Celaya
98e2e57bb2 Merge pull request #790 from shlinkio/dependabot/npm_and_yarn/json5-1.0.2
Bump json5 from 1.0.1 to 1.0.2
2023-01-08 09:04:30 +01:00
dependabot[bot]
c5170df402 Bump json5 from 1.0.1 to 1.0.2
Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: json5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-08 06:27:50 +00:00
Alejandro Celaya
4be38dfd0c Merge pull request #789 from shlinkio/develop
Release 3.9.1
2022-12-31 18:22:38 +01:00
Alejandro Celaya
597f2b69e9 Merge pull request #788 from acelaya-forks/feature/fix-base-path
Fixed wrong base path being used in vite config
2022-12-31 18:21:26 +01:00
Alejandro Celaya
c078a5fb55 Fixed wrong base path being used in vite config 2022-12-31 18:15:47 +01:00
Alejandro Celaya
5db0326350 Merge pull request #786 from shlinkio/develop
Release 3.9.0
2022-12-31 17:07:56 +01:00
Alejandro Celaya
7f6c678eaa Merge pull request #785 from acelaya-forks/feature/server-error-fix
Feature/server error fix
2022-12-31 17:02:12 +01:00
Alejandro Celaya
37ac6cebc1 Fixed selectedServer reucer test 2022-12-31 16:56:22 +01:00
Alejandro Celaya
27099aa7fb Updated changelog 2022-12-31 16:43:34 +01:00
Alejandro Celaya
91f4d09608 Ensured a recconnection happens to selected server when its params are edited 2022-12-31 16:42:04 +01:00
Alejandro Celaya
d34b9b1233 Merge pull request #783 from acelaya-forks/feature/visits-async-thunk
Feature/visits async thunk
2022-12-31 10:47:30 +01:00
Alejandro Celaya
2badd2b743 Fixed warning in tests 2022-12-31 10:47:15 +01:00
Alejandro Celaya
4517f38680 Fixed injection of visits loaders 2022-12-31 10:43:03 +01:00
Alejandro Celaya
84f9727836 Updated changelog 2022-12-31 10:35:58 +01:00
Alejandro Celaya
85452cde23 Enhanced visits async thunk so that it wraps both standard async thunk actions and extra ones 2022-12-31 10:34:29 +01:00
Alejandro Celaya
9b19113262 Merge pull request #780 from acelaya-forks/feature/short-urls-filtering
Feature/short urls filtering
2022-12-29 19:26:44 +01:00
Alejandro Celaya
e1bb091363 Updated changelog 2022-12-29 19:21:11 +01:00
Alejandro Celaya
732d664715 Fixed coding styles 2022-12-29 19:19:46 +01:00
Alejandro Celaya
33498ce903 Added support to filter out disabled short URLs 2022-12-29 19:03:17 +01:00
Alejandro Celaya
c25b74de84 Added test for ShortUrlsFilterDropdown 2022-12-29 10:35:50 +01:00
Alejandro Celaya
1c39e3402b Added function to parse optional boolean to string 2022-12-28 23:00:55 +01:00
Alejandro Celaya
a3bd10bc82 Updated ShlinkApiClient to support more filtering options for short URLs list 2022-12-28 22:59:11 +01:00
Alejandro Celaya
d6d237fc52 Merge pull request #779 from shlinkio/feature/tweak-ts
Added --noEmit to tsc as part of production build
2022-12-26 10:31:31 +01:00
Alejandro Celaya
9b7a169110 Added --noEmit to tsc as part of production build 2022-12-26 10:24:53 +01:00
Alejandro Celaya
2b17a24206 Merge pull request #778 from acelaya-forks/feature/chartjs-4
Feature/chartjs 4
2022-12-25 22:52:49 +01:00
Alejandro Celaya
a0d9bd6f09 Fixed type error in AsideMenu 2022-12-25 22:48:47 +01:00
Alejandro Celaya
cd33abd92d Updated changelog 2022-12-25 22:45:21 +01:00
Alejandro Celaya
c83563c0ea Fixed subpath and tests for chartjs 2022-12-25 22:44:43 +01:00
Alejandro Celaya
79515ac960 Updated production deps 2022-12-25 22:31:28 +01:00
Alejandro Celaya
8e8a5f3fd6 Updated to chartjs 4 2022-12-25 09:53:50 +01:00
Alejandro Celaya
51283cc130 Merge pull request #777 from acelaya-forks/feature/fix-visits-filters
Fixed bots filter getting reset when changing date
2022-12-25 09:49:57 +01:00
Alejandro Celaya
4023c077b3 Fixed bots filter getting reset when changing date 2022-12-25 09:44:47 +01:00
Alejandro Celaya
f3cf21ba08 Merge pull request #776 from acelaya-forks/feature/vite
Feature/vite
2022-12-25 09:30:14 +01:00
Alejandro Celaya
bec7b59abf Updated changelog 2022-12-25 09:20:45 +01:00
Alejandro Celaya
3e0abe329f Fixed preview generation, including service worker 2022-12-25 09:19:26 +01:00
Alejandro Celaya
822fe3db9e Small fixes 2022-12-25 09:13:45 +01:00
Alejandro Celaya
408ec82a10 Migrated serice worker generation to vite-plugin-pwa 2022-12-24 19:17:33 +01:00
Alejandro Celaya
ced3fa00ef Ensured service-worker is bundled separately 2022-12-24 18:20:01 +01:00
Alejandro Celaya
595b3c0450 Updated to node 18 and fixed replace-version script for vite structure 2022-12-24 11:34:39 +01:00
Alejandro Celaya
1d1c8153e7 Updated babel plugins for jest 2022-12-24 10:48:03 +01:00
Alejandro Celaya
52f556eb2e Migrated from react-scripts and webpack to vite 2022-12-24 10:18:26 +01:00
Alejandro Celaya
35fcd20123 Merge pull request #775 from acelaya-forks/feature/shlink-updates
Feature/shlink updates
2022-12-23 21:21:06 +01:00
Alejandro Celaya
e518b94fba Fixed tests 2022-12-23 21:16:17 +01:00
Alejandro Celaya
05553ba18a Updated changelog 2022-12-23 21:09:35 +01:00
Alejandro Celaya
4a9e05cf17 Updated prop to make it required as in Shlink v2.8.0 or newer 2022-12-23 21:08:41 +01:00
Alejandro Celaya
60fc351344 Removed references to feature checks for version 2.7 2022-12-23 21:06:59 +01:00
Alejandro Celaya
815e06809a Removed references to feature checks for version 2.8 2022-12-23 20:42:47 +01:00
Alejandro Celaya
bfcdf703e8 Merge pull request #772 from acelaya-forks/feature/exclude-bots
Feature/exclude bots
2022-12-23 20:29:24 +01:00
Alejandro Celaya
ddb2c1e641 Updated changelog 2022-12-23 20:24:55 +01:00
Alejandro Celaya
e790360de9 Added filtering dropdown to short URLs filtering bar 2022-12-23 20:15:52 +01:00
Alejandro Celaya
b00f6fadf8 Added test for parseBooleanToString 2022-12-23 20:03:27 +01:00
Alejandro Celaya
1d6f4bf5db Take into consideration exclñudeBots from query on short URLs row 2022-12-23 20:00:59 +01:00
Alejandro Celaya
80cea91339 Ensured bots exclusion is selected by default in visits filter dropdown, if it was selected in settings 2022-12-23 10:07:23 +01:00
Alejandro Celaya
5942cd6fcf Ensured proper amount of visits is displayed on short URLs based on config 2022-12-22 18:39:09 +01:00
Alejandro Celaya
2859ba6cd2 Simplified reducer logic to update short URLs when new visits come 2022-12-22 18:30:02 +01:00
Alejandro Celaya
b9285fd600 Enrues proper ordering is sent to shlink when ordering by visits 2022-12-22 18:07:44 +01:00
Alejandro Celaya
901df2b90d Added new setting to exclude bots from visits, wherever possible 2022-12-22 12:25:25 +01:00
Alejandro Celaya
662573d940 Merge pull request #771 from acelaya-forks/feature/highlight-disabled
Feature/highlight disabled
2022-12-19 20:49:46 +01:00
Alejandro Celaya
a8dcd3cac7 Updated changelog 2022-12-19 20:45:02 +01:00
Alejandro Celaya
0ac16a1626 Added test for ShortUrlStatus component 2022-12-19 20:43:55 +01:00
Alejandro Celaya
5162fa2a13 Created Tags test 2022-12-19 20:27:33 +01:00
Alejandro Celaya
73a3d1d50f Extended ShortUrlVisitsCount test to cover different contents of the tooltip 2022-12-19 20:18:50 +01:00
Alejandro Celaya
afc272c4d9 Improved ShortUrlsRow test covering new status icon 2022-12-19 20:00:52 +01:00
Alejandro Celaya
f8bcaed3ad Moved short URL status to the last column in the table 2022-12-19 19:40:04 +01:00
Alejandro Celaya
d1a1b7426e Added ShortUrlStatus concept 2022-12-18 19:26:30 +01:00
Alejandro Celaya
99485cc6d8 Removed conept on short URL tags 2022-12-18 13:29:39 +01:00
Alejandro Celaya
187fee46f4 Added extra info and new label to highlight disabled short URLs 2022-12-18 13:17:49 +01:00
Alejandro Celaya
90837546ab Exported some specific component types and improved spacing in short URLs list 2022-12-18 10:12:34 +01:00
Alejandro Celaya
f4cf4850a3 Merge pull request #769 from acelaya-forks/feature/drop-tags-cards
Feature/drop tags cards
2022-12-17 20:07:51 +01:00
Alejandro Celaya
4ef1e491bc Updated changelog 2022-12-17 20:01:31 +01:00
Alejandro Celaya
170f45d46b Removed references to tagsMode setting 2022-12-17 19:59:55 +01:00
Alejandro Celaya
37caa1ad19 Removed references to tags cards 2022-12-17 19:56:58 +01:00
Alejandro Celaya
0312a0911c Fixed build badge in README 2022-12-17 10:54:18 +01:00
Alejandro Celaya
cc88f7678c Merge pull request #768 from shlinkio/develop
Release 3.8.2
2022-12-17 10:07:37 +01:00
Alejandro Celaya
653b470fec Merge pull request #767 from acelaya-forks/feature/fixes
Feature/fixes
2022-12-17 10:03:19 +01:00
Alejandro Celaya
2603f2f987 Added missing application/json content-type when calling Shlink with payload 2022-12-17 09:57:40 +01:00
Alejandro Celaya
b106b3cd0a Updated changelog 2022-12-17 09:29:34 +01:00
Alejandro Celaya
b2b6b3af18 Fixed visits query being lost when switching between sub-sections 2022-12-17 09:28:42 +01:00
Alejandro Celaya
f911f78c95 Merge pull request #763 from shlinkio/dependabot/npm_and_yarn/express-4.18.2
Bump express from 4.17.1 to 4.18.2
2022-12-14 19:06:22 +01:00
dependabot[bot]
a7560443f3 Bump express from 4.17.1 to 4.18.2
Bumps [express](https://github.com/expressjs/express) from 4.17.1 to 4.18.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.17.1...4.18.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-14 17:59:03 +00:00
Alejandro Celaya
ab757b2f67 Merge pull request #759 from shlinkio/develop
Release 3.8.1
2022-12-06 20:21:39 +01:00
Alejandro Celaya
261cc68624 Merge pull request #758 from acelaya-forks/feature/fix-visits-interval
Feature/fix visits interval
2022-12-06 20:20:22 +01:00
Alejandro Celaya
dc2db3a463 Updated changelog 2022-12-06 20:15:44 +01:00
Alejandro Celaya
ae625e4c8a Fixed all visits interval not working after loading the default configured interval unless switching to another one first 2022-12-06 20:13:43 +01:00
Alejandro Celaya
6f5c5b122f Fixed fallback interval not working on visits pages 2022-12-06 18:09:50 +01:00
Alejandro Celaya
5d712d7d78 Created helper curried function to compare two values 2022-12-05 17:29:59 +01:00
Alejandro Celaya
1654784471 Created now function and refactored intervalToDateRange 2022-12-05 17:18:00 +01:00
Alejandro Celaya
7d83e434e6 Merge pull request #755 from shlinkio/develop
Release 3.8.0
2022-12-03 13:34:37 +01:00
Alejandro Celaya
97a54d44c7 Merge pull request #754 from acelaya-forks/feature/visits-filters
Feature/visits filters
2022-12-03 13:29:05 +01:00
Alejandro Celaya
6694ca6918 Updated changelog 2022-12-03 13:24:16 +01:00
Alejandro Celaya
8e61e94fba Added test to check how visits stats persist filters in query string 2022-12-03 13:22:31 +01:00
Alejandro Celaya
69b1c8039e Ensured stryker-tmp folder is ignored by jest 2022-12-03 12:56:25 +01:00
Alejandro Celaya
5bd89efc09 Added test for toDateRange helper function 2022-12-03 12:45:25 +01:00
Alejandro Celaya
e5185f2099 Renamed file containing date range and date interval utils 2022-12-03 12:20:18 +01:00
Alejandro Celaya
d2ebc880a0 Created new hook to handle visits filtering via query string 2022-12-03 12:15:36 +01:00
Alejandro Celaya
165afa436d Minor refactorings and function extractions 2022-11-26 09:11:46 +01:00
Alejandro Celaya
a3f5095dce Merge pull request #751 from acelaya-forks/feature/fix-max-length
Feature/fix max length
2022-11-25 20:14:53 +01:00
Alejandro Celaya
7bda5769fb Updated changelog 2022-11-25 19:20:52 +01:00
Alejandro Celaya
0bf859d485 Simplified DeleteShortUrlModal so that it only requires writing 'delete' 2022-11-25 19:08:40 +01:00
Alejandro Celaya
b79dced185 Fixed broken short URLs table when creating short URL with too long slug 2022-11-25 18:34:27 +01:00
Alejandro Celaya
e368e618f3 Updated changelog 2022-11-22 20:29:01 +01:00
Alejandro Celaya
bc4c69f207 Merge pull request #747 from acelaya-forks/feature/modal-async-delays
Feature/modal async delays
2022-11-22 20:28:30 +01:00
Alejandro Celaya
32f29a84f7 Used TestModalWrapper in DeleteShortUrlModal test 2022-11-22 20:22:03 +01:00
Alejandro Celaya
f0a6420ba9 Extracted helper to test modals 2022-11-22 20:18:11 +01:00
Alejandro Celaya
cf91637848 Updated changelog 2022-11-22 20:09:00 +01:00
Alejandro Celaya
9bdf55374c Ensured DeleteServerModal is not removed from the DOM before close transition has finished 2022-11-22 20:08:08 +01:00
Alejandro Celaya
d21758c410 Fixed DeleteShortUrlModal being removed from the DOM before CSS transition finished 2022-11-22 19:39:07 +01:00
Alejandro Celaya
bc2c945fee Updated changelog 2022-11-20 13:01:03 +01:00
Alejandro Celaya
db2853880d Merge pull request #746 from acelaya-forks/feature/rename-tag-fix
Feature/rename tag fix
2022-11-20 12:59:10 +01:00
Alejandro Celaya
cb76c89a08 Improved HttpClientTest 2022-11-20 12:54:06 +01:00
Alejandro Celaya
059fa37ca7 Updates ShlinkApiClint to use different methods to fetch, and fixed tests 2022-11-20 12:51:07 +01:00
Alejandro Celaya
54cc99448b Merge pull request #742 from shlinkio/dependabot/npm_and_yarn/minimatch-and-recursive-readdir-and-serve-3.1.2
Bump minimatch, recursive-readdir and serve
2022-11-20 09:46:06 +01:00
Alejandro Celaya
a5dd96805d Merge pull request #743 from shlinkio/dependabot/npm_and_yarn/loader-utils-1.4.2
Bump loader-utils from 1.4.1 to 1.4.2
2022-11-20 09:46:00 +01:00
Alejandro Celaya
1e155af948 Ensured stats for renamed tagged are propagated to new name 2022-11-19 09:31:48 +01:00
Alejandro Celaya
dd9ee044eb Ensured JSON decodedoes not happen for endpoints returning empty body 2022-11-19 09:29:29 +01:00
Alejandro Celaya
bd8ea17c84 Ensured bg-warning elements always use dark text 2022-11-19 09:21:51 +01:00
Alejandro Celaya
0236f5132d Merge pull request #745 from acelaya-forks/feature/http-client
Feature/http client
2022-11-17 21:38:28 +01:00
Alejandro Celaya
b8adf5f274 Created test for HttpClient 2022-11-17 21:30:42 +01:00
Alejandro Celaya
c4bce5ec0a Added badge for Mastodon follow 2022-11-17 19:59:26 +01:00
dependabot[bot]
5bfe7dd128 Bump loader-utils from 1.4.1 to 1.4.2
Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.1 to 1.4.2.
- [Release notes](https://github.com/webpack/loader-utils/releases)
- [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.2/CHANGELOG.md)
- [Commits](https://github.com/webpack/loader-utils/compare/v1.4.1...v1.4.2)

---
updated-dependencies:
- dependency-name: loader-utils
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-16 02:51:35 +00:00
Alejandro Celaya
9b3bdebb28 Wrapped logic to perform HTTP requests with fetch into an HttpClient class 2022-11-15 20:31:35 +01:00
Alejandro Celaya
7575387236 Updated changelog 2022-11-15 17:17:55 +01:00
dependabot[bot]
984a99b24e Bump minimatch, recursive-readdir and serve
Bumps [minimatch](https://github.com/isaacs/minimatch) to 3.1.2 and updates ancestor dependencies [minimatch](https://github.com/isaacs/minimatch), [recursive-readdir](https://github.com/jergason/recursive-readdir) and [serve](https://github.com/vercel/serve). These dependencies need to be updated together.


Updates `minimatch` from 3.0.4 to 3.1.2
- [Release notes](https://github.com/isaacs/minimatch/releases)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2)

Updates `recursive-readdir` from 2.2.2 to 2.2.3
- [Release notes](https://github.com/jergason/recursive-readdir/releases)
- [Changelog](https://github.com/jergason/recursive-readdir/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jergason/recursive-readdir/commits/v2.2.3)

Updates `serve` from 14.0.1 to 14.1.1
- [Release notes](https://github.com/vercel/serve/releases)
- [Commits](https://github.com/vercel/serve/compare/14.0.1...14.1.1)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-type: indirect
- dependency-name: recursive-readdir
  dependency-type: indirect
- dependency-name: serve
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-15 16:16:52 +00:00
Alejandro Celaya
a0767417b3 Merge pull request #740 from acelaya-forks/feature/fetch
Feature/fetch
2022-11-15 17:15:43 +01:00
Alejandro Celaya
790c69ba80 Fixed ShlinkApiClient test 2022-11-15 12:19:21 +01:00
Alejandro Celaya
f7ba974d97 Fixed logic to determine if an error is a ProblemDetailError 2022-11-15 12:15:04 +01:00
Alejandro Celaya
1eab5af5c7 Fixed shortUrlDeletion test 2022-11-15 11:50:04 +01:00
Alejandro Celaya
3df0bf79f8 Removed axios from the project 2022-11-15 11:45:28 +01:00
Alejandro Celaya
34aa156d5f Migrated ImageDownloader from axios to fetch 2022-11-15 11:41:05 +01:00
Alejandro Celaya
a88ebc26a9 Merge branch 'develop' into feature/fetch 2022-11-15 11:27:53 +01:00
Alejandro Celaya
d800062159 Extracted helper fetch function and migrated remoteServers redux action from axios to fetch 2022-11-14 23:25:39 +01:00
Alejandro Celaya
e5afe4f767 Migrated ShlinkApiClient from axios to fetch 2022-11-14 23:06:06 +01:00
Alejandro Celaya
ee7a091586 Merge pull request #739 from acelaya-forks/feature/rtk-errors
Changed how errors are serialized by async thunks
2022-11-13 18:36:10 +01:00
Alejandro Celaya
7add83f985 Changed how errors are serialized by async thunks 2022-11-13 18:26:35 +01:00
Alejandro Celaya
16bee43f12 Migrated ShlinkApiClient from axios to fetch 2022-11-13 16:57:16 +01:00
Alejandro Celaya
ba48104c5c Refactored createVisitsReducer so that it expects an object param 2022-11-13 09:59:49 +01:00
Alejandro Celaya
cc620ddf79 Merge pull request #735 from acelaya-forks/feature/visits-rtk
Feature/visits rtk
2022-11-12 20:46:50 +01:00
Alejandro Celaya
6103f6a89b Separated param definition and unpacking for readibility 2022-11-12 20:41:55 +01:00
Alejandro Celaya
4b2c3d2db7 Extracted duplicated code on creating visits reducers to a common helper function 2022-11-12 20:37:04 +01:00
Alejandro Celaya
dac69daf03 Migrated tagVisits reducer to RTK 2022-11-12 20:02:58 +01:00
Alejandro Celaya
3e474a3f2d Migrated shortUrlVisits reducer to RTK 2022-11-12 19:36:12 +01:00
Alejandro Celaya
f81999a4fe Migrated orphanVisits reducer to RTK 2022-11-12 19:15:41 +01:00
Alejandro Celaya
fd80fd65c9 Migrated nonOrphanVisits reducer to RTK 2022-11-12 18:18:16 +01:00
Alejandro Celaya
ab7c52d049 Migrated domainVisits reducer to RTK 2022-11-12 17:51:37 +01:00
Alejandro Celaya
a3cc3d5fc2 Migrated visits-loading actions to payload actions 2022-11-12 10:34:44 +01:00
Alejandro Celaya
a6ed0c811d Updated getShortUrlVisits action so that it expects a signle DTO param 2022-11-12 09:38:24 +01:00
Alejandro Celaya
8e6b9c5afb Updated getOrphanVisits action so that it expects a signle DTO param 2022-11-12 09:32:52 +01:00
Alejandro Celaya
b9efdd69f1 Updated getNonOrphanVisits action so that it expects a signle DTO param 2022-11-12 09:21:23 +01:00
Alejandro Celaya
3b96b89492 Updated getDomainVisits action so that it expects a signle DTO param 2022-11-12 09:18:41 +01:00
Alejandro Celaya
32f7374d92 Migrated progress and fallback visits actions to payload actions 2022-11-12 09:01:43 +01:00
Alejandro Celaya
c6eec8b266 Changed getVisitsWithLoader reducer helper so that it expects an action prefix instead of an action map 2022-11-12 08:49:14 +01:00
Alejandro Celaya
634ae94542 Merge pull request #734 from acelaya-forks/feature/more-rtk
Feature/more rtk
2022-11-11 20:33:05 +01:00
Alejandro Celaya
5095a2c59e Migrated visitsOverview reducer to RTK 2022-11-11 20:23:19 +01:00
Alejandro Celaya
002d2ba8e6 Added tests for selectedServerReducerCreator 2022-11-11 20:01:45 +01:00
Alejandro Celaya
d44fe945d8 Migrated selectedServer reducer to RTK 2022-11-11 19:31:05 +01:00
Alejandro Celaya
6221f9ed05 Migrated selectServer action to RTK and moved loadMercureInfo to an action listener 2022-11-11 19:21:17 +01:00
Alejandro Celaya
2e0e24d87b Migrated fetchServers to RTK 2022-11-11 19:21:17 +01:00
Alejandro Celaya
a1d869900b Merge pull request #733 from acelaya-forks/feature/fix-mercure-integration
Fixed mercure integration
2022-11-11 16:57:40 +01:00
Alejandro Celaya
d90f6c2019 Fixed mercure integration 2022-11-11 16:51:21 +01:00
Alejandro Celaya
ed4c03f154 Merge pull request #732 from acelaya-forks/feature/more-rtk
Feature/more rtk
2022-11-09 19:36:49 +01:00
Alejandro Celaya
7bfccafca8 Migrated shortUrlsList reducer to RTK 2022-11-09 19:13:44 +01:00
Alejandro Celaya
ae49090bad Split short URL edition reducer and async thunk 2022-11-09 18:40:51 +01:00
Alejandro Celaya
979c16eb9c Updated listShortUrls action to use payload 2022-11-09 18:27:05 +01:00
Alejandro Celaya
fe85291772 Changed format on action types and reducer names for those already migrated to RTK 2022-11-09 18:19:07 +01:00
Alejandro Celaya
893c5ace6f Merge pull request #731 from shlinkio/dependabot/npm_and_yarn/loader-utils-1.4.1
Bump loader-utils from 1.4.0 to 1.4.1
2022-11-09 08:31:56 +01:00
Alejandro Celaya
89423737e8 Removed hardcoded action references by improving dependency injection 2022-11-08 22:59:41 +01:00
Alejandro Celaya
f9bfb742da Migrated tagsList reducer to RTK 2022-11-08 22:48:53 +01:00
Alejandro Celaya
b7622b2b38 Migrated filterTags action to use payload 2022-11-08 21:59:17 +01:00
dependabot[bot]
8cfb4cf1e1 Bump loader-utils from 1.4.0 to 1.4.1
Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/webpack/loader-utils/releases)
- [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.1/CHANGELOG.md)
- [Commits](https://github.com/webpack/loader-utils/compare/v1.4.0...v1.4.1)

---
updated-dependencies:
- dependency-name: loader-utils
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-08 09:26:38 +00:00
Alejandro Celaya
b9e02cf344 Merge pull request #730 from acelaya-forks/feature/more-rtk
Feature/more rtk
2022-11-07 22:49:33 +01:00
Alejandro Celaya
033df3c3d6 Migrated tagDelete reducer to RTK 2022-11-07 22:41:02 +01:00
Alejandro Celaya
692eaf7dc9 Referenced createNewVisits action directly, instead of its action type 2022-11-07 22:29:15 +01:00
Alejandro Celaya
22b3794154 Migrated tagDeleted action to payload 2022-11-07 22:22:44 +01:00
Alejandro Celaya
dbb08a6ce0 Ensured tags deleted are not removed from list until modal has been hidden 2022-11-07 22:19:44 +01:00
Alejandro Celaya
0571a4a88f Migrated tagEdit reducer to RTK 2022-11-07 22:12:48 +01:00
Alejandro Celaya
648744f440 Migrated tag actions to have a single DTO param 2022-11-07 21:57:01 +01:00
Alejandro Celaya
f8fc1245ca Migrated editTag and tagEdited actions to use payload 2022-11-07 21:45:33 +01:00
Alejandro Celaya
5ecc791b38 Ensured tags list is not updated until the edit modal is closed 2022-11-07 21:32:19 +01:00
Alejandro Celaya
2183b09ffe Merge pull request #728 from acelaya-forks/feature/state-machine-poc
Feature/state machine poc
2022-11-07 19:03:51 +01:00
Alejandro Celaya
085ab521c3 Implemented state machine for short URL creation 2022-11-07 18:55:12 +01:00
Alejandro Celaya
61b274bab9 Replaced inheritance by composition on short URL creation interface 2022-11-07 18:27:41 +01:00
Alejandro Celaya
4ca31fc162 Added flag on short URL creation which tells if the short URL was already saved 2022-11-07 18:24:26 +01:00
Alejandro Celaya
ae1d39bede Merge pull request #725 from acelaya-forks/feature/more-rtk
Feature/more rtk
2022-11-06 19:39:03 +01:00
Alejandro Celaya
f803941fe4 Migrated short URL detail reducer to RTK 2022-11-06 19:32:02 +01:00
Alejandro Celaya
f93bb88d35 Refactored getShortUrlDetail action to have a single DTO param 2022-11-06 19:16:51 +01:00
Alejandro Celaya
ea199dbf8f Removed redundant types 2022-11-06 19:12:41 +01:00
Alejandro Celaya
526d7195bc Updated getShortUrlDetail action to use payload action 2022-11-06 19:06:39 +01:00
Alejandro Celaya
cf4143e4e2 Removed unnecesarry promise references in delete short URL modal 2022-11-06 18:48:47 +01:00
Alejandro Celaya
0f552ae6f4 Removed unnecessary castings to any 2022-11-06 13:21:46 +01:00
Alejandro Celaya
830071278e Migrated shortUrlDeletion reducer to RTK 2022-11-06 13:06:55 +01:00
Alejandro Celaya
d468fb1efe Migrated deleteShortUrl action creator to use PayloadAction and have a single param 2022-11-06 12:46:29 +01:00
Alejandro Celaya
2a268de2cb Migrated editShortUrl reducer to RTK 2022-11-06 12:33:23 +01:00
Alejandro Celaya
77cbb8ebc4 Refactored editShortUrl action to require just one param 2022-11-06 11:59:39 +01:00
Alejandro Celaya
bf84e4a2ed Migrated editShortUrl payload action 2022-11-06 11:53:23 +01:00
Alejandro Celaya
a316366ae9 Migrated shortUrlCreation reducer to RTK 2022-11-06 10:11:44 +01:00
Alejandro Celaya
50823003b4 Migrated settings reducer to RTK 2022-11-06 09:40:23 +01:00
Alejandro Celaya
7c61033bdf Migrated createNewVisits action creator to RTK 2022-11-05 13:05:44 +01:00
Alejandro Celaya
d588d8d9ef Migrated create visit action to use payload 2022-11-05 13:01:00 +01:00
Alejandro Celaya
cd90d3e581 Merge pull request #724 from acelaya-forks/feature/more-rtk
Feature/more rtk
2022-11-05 10:53:12 +01:00
Alejandro Celaya
54407af980 Fixed tests 2022-11-05 10:49:28 +01:00
Alejandro Celaya
a31cdcc9f0 Migrated selectedServer reducer to use payload actions 2022-11-05 10:36:57 +01:00
Alejandro Celaya
10d4419387 Migrated servers reducer to RTK 2022-11-05 10:08:24 +01:00
Alejandro Celaya
6f67f7bbf0 Removed redundant createServer action, leaving just createServers 2022-11-05 09:40:12 +01:00
Alejandro Celaya
90ef41b419 Migrated server list actions to use payload prop 2022-11-05 09:24:12 +01:00
Alejandro Celaya
62ab86aefa Created custom and better typed version of createAsyncThunk 2022-11-05 09:10:30 +01:00
Alejandro Celaya
1dd26fb76f Merge pull request #723 from acelaya-forks/feature/more-rtk
Feature/more rtk
2022-11-04 20:56:30 +01:00
Alejandro Celaya
4a95724425 Migrated mercureInfo reducer to RTK 2022-11-04 20:52:06 +01:00
Alejandro Celaya
f209fa2d58 Migrated sidebar reducer to RTK 2022-11-04 19:45:03 +01:00
Alejandro Celaya
85e2aab4df Migrated appUpdated reducer to RTK 2022-11-04 19:39:15 +01:00
Alejandro Celaya
26c3ea19f4 Merge pull request #722 from acelaya-forks/feature/redux-toolkit-poc
Feature/redux toolkit poc
2022-11-04 19:07:32 +01:00
Alejandro Celaya
a1e2cd7274 Fixed changelog 2022-11-04 18:59:08 +01:00
Alejandro Celaya
6363822ffd Updated to redux/toolkit 1.9 2022-11-04 18:58:21 +01:00
Alejandro Celaya
34f4411aa1 Migrated domainRedirects reducer to redux/toolkit 2022-11-04 18:56:34 +01:00
Alejandro Celaya
b6d08e2203 Updated editDomainRedirects action, to expect a payload DTO instead of multiple args 2022-11-04 17:10:02 +01:00
Alejandro Celaya
4fa6ae493d Removed unnecesary type castings and improved type inference for actions in demainsListReducer 2022-11-04 16:50:03 +01:00
Alejandro Celaya
79645099ba Added explicit import 2022-11-03 20:53:59 +01:00
Alejandro Celaya
18d478e16e Removed unneeded type castings and eslint suppressions in domainsList reducer 2022-11-03 20:51:20 +01:00
Alejandro Celaya
da97b76563 Migrated rest of domainslistreducer-related elements on test to the new ones 2022-11-03 20:29:22 +01:00
Alejandro Celaya
d25dbd5ae6 Replaced domainsList old reducer with new reducer in test 2022-11-03 20:15:28 +01:00
Alejandro Celaya
88e8f3363b Fixed domainsListReducer test so that it works with new payload prop in actions 2022-11-03 19:52:57 +01:00
Alejandro Celaya
24483ec330 Added first redux toolkit based reducer for domains 2022-11-02 20:40:14 +01:00
Alejandro Celaya
15a9fba091 Migrated redux store creation to redux toolkit 2022-11-01 12:52:27 +01:00
Alejandro Celaya
73e2485e09 Merge pull request #720 from acelaya-forks/feature/limit-time
Feature/limit time
2022-10-23 10:58:16 +02:00
Alejandro Celaya
0d94879e49 Updated changelog 2022-10-23 10:51:28 +02:00
Alejandro Celaya
6df12ce194 Moved date-time related utils to the proper folder 2022-10-23 10:49:35 +02:00
Alejandro Celaya
c3b60367f3 Added test covering custom formatting in DateInput 2022-10-23 10:43:01 +02:00
Alejandro Celaya
10d3deff37 Formatted scrollbar in date picker for time component 2022-10-23 10:22:31 +02:00
Alejandro Celaya
3cb79c167e Fixed date picker time styles 2022-10-23 10:13:53 +02:00
Alejandro Celaya
57a17d7e92 Created component for DateTimeInputs 2022-10-18 22:02:09 +02:00
Alejandro Celaya
894934fd08 Merge pull request #716 from acelaya-forks/feature/api3-support
Feature/api3 support
2022-10-12 10:55:16 +02:00
Alejandro Celaya
5a8aae3614 Updated changelog 2022-10-12 10:45:43 +02:00
Alejandro Celaya
3dde1a5b05 Covered short URL deletion when threshold error occurs 2022-10-12 10:43:30 +02:00
Alejandro Celaya
e6c79c19c2 Added support for API v3 error types on different error handlers 2022-10-12 10:35:16 +02:00
Alejandro Celaya
d64abeecdc Use APi v3 by default, and fall back to v2 in case of not found errors 2022-10-12 10:19:54 +02:00
Alejandro Celaya
da6d45a72c Updated to axios 1.1.2 2022-10-11 08:22:20 +02:00
Alejandro Celaya
497a735d80 Merge pull request #714 from acelaya-forks/feature/fix-datepicker-triangle
Feature/fix datepicker triangle
2022-10-08 10:23:06 +02:00
Alejandro Celaya
89f031b338 Updated changelog 2022-10-08 10:18:52 +02:00
Alejandro Celaya
47630dbcd2 Fixed date time picker arrow getting placed on the very edge of the popper 2022-10-08 10:18:08 +02:00
Alejandro Celaya
0d57684565 Merge pull request #712 from acelaya-forks/feature/update-deps
Updated deps
2022-10-05 18:25:20 +02:00
Alejandro Celaya
5880767ac3 Fixed incorrect import 2022-10-05 17:23:41 +02:00
Alejandro Celaya
14c4c29af3 Updated changelog 2022-10-05 17:19:16 +02:00
Alejandro Celaya
9f5614446e Updated bootstrap 2022-10-05 17:17:03 +02:00
Alejandro Celaya
d755e8ffc4 Updated to axios 1.0 2022-10-05 17:12:10 +02:00
Alejandro Celaya
a7a968ab6e Added dependency to history module as react-router-dom no longer depnds on it 2022-10-05 16:35:44 +02:00
Alejandro Celaya
f5757c6081 Fixed incorrectly inferred types 2022-10-04 23:27:11 +02:00
Alejandro Celaya
29fa4fa34d Fixed incorrectly inferred types 2022-10-04 23:24:07 +02:00
Alejandro Celaya
d2de9fb669 Updated dev deps 2022-10-04 23:17:12 +02:00
Alejandro Celaya
e124cd2490 Updated prod deps 2022-10-04 23:09:30 +02:00
Alejandro Celaya
e76c9041b5 Updated @fortawesome/fontawesome-svg-core to v6.2 2022-10-04 23:02:27 +02:00
Alejandro Celaya
755ae23fdb Updated fontawesome deps 2022-10-03 20:06:57 +02:00
481 changed files with 10971 additions and 58753 deletions

View File

@@ -1,5 +1,4 @@
./.github
./.stryker-tmp
./build
./coverage
./node_modules

View File

@@ -6,11 +6,5 @@
"parserOptions": {
"project": "./tsconfig.json"
},
"ignorePatterns": ["src/service*.ts"],
"rules": {
"jsx-a11y/control-has-associated-label": "off",
"jsx-a11y/label-has-associated-control": "off",
"jsx-a11y/click-events-have-key-events": "off",
"jsx-a11y/no-static-element-interactions": "off"
}
"ignorePatterns": ["src/service*.ts"]
}

24
.github/DISCUSSION_TEMPLATE/q-a.yml vendored Normal file
View File

@@ -0,0 +1,24 @@
title: 'Q&A'
body:
- type: input
validations:
required: true
attributes:
label: shlink-web-client version
placeholder: x.y.z
- type: dropdown
validations:
required: true
attributes:
label: How do you use shlink-web-client
options:
- https://app.shlink.io
- Docker image
- Self-hosted
- Other (explain in summary)
- type: textarea
validations:
required: true
attributes:
label: Summary
value: '<!-- Describe your issue, question or request here. -->'

2
.github/FUNDING.yml vendored
View File

@@ -1,2 +1,2 @@
github: ['acelaya']
custom: ['https://acel.me/donate']
custom: ['https://slnk.to/donate']

View File

@@ -1,36 +0,0 @@
---
name: Bug report
about: Something on shlink is broken or not working as documented?
labels: bug
---
<!--
Before opening an issue, just take into account that this is a completely free of charge and open source project.
I'm always happy to help and provide support, but some understanding will be expected.
I do this in my own free time, so expect some delays when implementing new features and fixing bugs, and don't take it personal if an issue gets eventually closed.
You may also be asked to provide tests or ways to reproduce reported bugs.
Try to be polite, and understand it is impossible for an OSS project to cover all use cases.
With that said, please fill in the information requested next. More information might be requested once the issue is open.
-->
#### Shlink web client version
* Version: x.y.z
* How do you use shlink-web-client: app.shlink.io|Docker image|self-hosted
#### Summary
<!-- Provide a summary describing the problem you are experiencing. -->
#### Current behavior
<!-- How is it actually behaving (and it shouldn't)? -->
#### Expected behavior
<!-- How did you expected to behave? -->
#### How to reproduce
<!-- Provide steps to reproduce the bug. -->

38
.github/ISSUE_TEMPLATE/Bug.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
name: 'Bug'
description: Something on shlink is broken or not working as documented?
labels: ['bug']
body:
- type: input
validations:
required: true
attributes:
label: shlink-web-client version
placeholder: x.y.z
- type: dropdown
validations:
required: true
attributes:
label: How do you use shlink-web-client
options:
- https://app.shlink.io
- Docker image
- Self-hosted
- Other (explain in summary)
- type: textarea
validations:
required: true
attributes:
label: Current behavior
value: '<!-- How is it actually behaving (and it should not)? -->'
- type: textarea
validations:
required: true
attributes:
label: Expected behavior
value: '<!-- How did you expect it to behave? -->'
- type: textarea
validations:
required: true
attributes:
label: How to reproduce
value: '<!-- Provide steps to reproduce the bug. -->'

View File

@@ -1,19 +0,0 @@
---
name: Feature request
about: Do you find shlink is missing some important feature that would make it more useful?
labels: feature
---
<!--
Before opening an issue, just take into account that this is a completely free of charge and open source project.
I'm always happy to help and provide support, but some understanding will be expected.
I do this in my own free time, so expect some delays when implementing new features and fixing bugs, and don't take it personal if an issue gets eventually closed.
You may also be asked to provide tests or ways to reproduce reported bugs.
Try to be polite, and understand it is impossible for an OSS project to cover all use cases.
With that said, please fill in the information requested next. More information might be requested once the issue is open.
-->
#### Summary
<!-- Describe the new feature you would like to request. -->

View File

@@ -0,0 +1,16 @@
name: Feature request
description: Do you find shlink-web-client is missing some important feature that would make it more useful?
labels: ['feature']
body:
- type: textarea
validations:
required: true
attributes:
label: Summary
value: '<!-- Describe the new feature you would like to request. -->'
- type: textarea
validations:
required: true
attributes:
label: Use case
value: '<!-- Explain why do you think this feature would be useful, and what problems would it help to solve. -->'

View File

@@ -1,24 +0,0 @@
---
name: Question - Support
about: Do you have a problem setting up or using shlink?
labels: question
---
<!--
Before opening an issue, just take into account that this is a completely free of charge and open source project.
I'm always happy to help and provide support, but some understanding will be expected.
I do this in my own free time, so expect some delays when implementing new features and fixing bugs, and don't take it personal if an issue gets eventually closed.
You may also be asked to provide tests or ways to reproduce reported bugs.
Try to be polite, and understand it is impossible for an OSS project to cover all use cases.
With that said, please fill in the information requested next. More information might be requested once the issue is open.
-->
#### Shlink web client version
* Version: x.y.z
* How do you use shlink-web-client: app.shlink.io|Docker image|self-hosted
#### Summary
<!-- Describe the issue you are facing here. -->

5
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Question - Support
about: Do you need help setting up or using shlink-web-client?
url: https://github.com/shlinkio/shlink-web-client/discussions/new?category=q-a

42
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,42 @@
version: 2
updates:
- package-ecosystem: npm
directory: '/'
schedule:
interval: weekly
day: saturday
time: '09:00'
timezone: 'Europe/Madrid'
open-pull-requests-limit: 10
groups:
fontawesome:
patterns:
- '@fortawesome/*'
shlink:
patterns:
- '@shlinkio/*'
types:
patterns:
- '@types/*'
testing:
patterns:
- '@testing-library/*'
vite:
patterns:
- 'vite'
- '@vitejs/*'
vitest:
patterns:
- 'vitest'
- '@vitest/*'
ignore:
# Bootstrap can introduce visual breaking changes on styles
# Ignore it, since the plan is to remove it anyway
- dependency-name: 'bootstrap'
- package-ecosystem: docker
directory: '/'
schedule:
interval: weekly
day: saturday
time: '09:00'
timezone: 'Europe/Madrid'

View File

@@ -11,7 +11,5 @@ jobs:
ci:
uses: shlinkio/github-actions/.github/workflows/web-app-ci.yml@main
with:
node-version: 16.15
with-mutation-tests: true
node-version: 20.7
publish-coverage: true
force-install: true

View File

@@ -5,23 +5,22 @@ on:
jobs:
deploy:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
continue-on-error: true
steps:
- name: Checkout code
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
ref: ${{ github.event.pull_request.head.ref }}
- name: Use node.js
uses: actions/setup-node@v1
uses: actions/setup-node@v3
with:
node-version: 16.15
node-version: 20.7
- name: Build
run: |
npm ci --force && \
node ./scripts/set-homepage.js /shlink-web-client/${GITHUB_HEAD_REF#refs/heads/} && \
rm src/service-worker.ts && \
npm ci && \
node ./scripts/set-homepage.cjs /shlink-web-client/${GITHUB_HEAD_REF#refs/heads/} && \
npm run build
- name: Deploy preview
uses: shlinkio/deploy-preview-action@v1.0.1

View File

@@ -2,8 +2,6 @@ name: Build and publish docker image
on:
push:
branches:
- develop
tags:
- 'v*'
@@ -14,3 +12,4 @@ jobs:
with:
image-name: shlinkio/shlink-web-client
version-arg-name: VERSION
platforms: 'linux/arm64/v8,linux/amd64'

View File

@@ -7,16 +7,16 @@ on:
jobs:
build:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- name: Checkout code
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Use node.js
uses: actions/setup-node@v1
uses: actions/setup-node@v3
with:
node-version: 16.15
node-version: 20.7
- name: Generate release assets
run: npm ci --force && VERSION=${GITHUB_REF#refs/tags/v} npm run build:dist
run: npm ci && VERSION=${GITHUB_REF#refs/tags/v} npm run build:dist
- name: Publish release with assets
uses: docker://antonyurchenko/git-release:latest
env:

1
.gitignore vendored
View File

@@ -3,7 +3,6 @@
# testing
/coverage
/.stryker-tmp
/reports
# production

View File

@@ -4,6 +4,198 @@ 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.0.0] - 2024-01-29
### Added
* [shlink-web-component #7](https://github.com/shlinkio/shlink-web-component/issues/7) Allow comparing visits for multiple short URLs, tags or domains.
When in the tags, domains or short URLs tables, you can now pick up to 5 items to compare their visits. Once selected, you are taken to a section displaying a comparative line chart, which supports all regular visits filtering capabilities.
* [shlink-web-component #9](https://github.com/shlinkio/shlink-web-component/issues/9) Allow comparing visits with the previous period.
* [shlink-web-component #12](https://github.com/shlinkio/shlink-web-component/issues/12) and [#13](https://github.com/shlinkio/shlink-web-component/issues/13) Add new "Visits options" section for arbitrary visit stats options. Add section to delete short URL and orphan visits there.
This section is only visible if short URL visits deletion or orphan visits deletion are supported by connected Shlink server.
* [shlink-web-component #10](https://github.com/shlinkio/shlink-web-component/issues/10) Improve general accessibility: Add accessibility tests, fix accessibility issues and enable accessibility linting rules.
### Changed
* [#338](https://github.com/shlinkio/shlink-web-client/issues/338) Extract `@shlinkio/shlink-web-component` and `@shlinkio/shlink-frontend-kit` as external libs.
* [#978](https://github.com/shlinkio/shlink-web-client/issues/978) Use system preferred theme as default theme.
* Use API client from `@shlinkio/shlink-js-sdk` to consume Shlink servers.
* [#902](https://github.com/shlinkio/shlink-web-client/pull/902) Docker image is no longer running as root. As a side effect, exposed port is `8080`, not `80` anymore.
* [shlink-web-component #117](https://github.com/shlinkio/shlink-web-component/issues/117) Migrate charts from Chart.JS to Recharts.
### Deprecated
* *Nothing*
### Removed
* Drop support for Shlink older than v3.0.0
### Fixed
* [#910](https://github.com/shlinkio/shlink-web-client/issues/910) Fix warnings related with missing `act` in tests and refs in `AppUpdateBanner`.
## [3.10.2] - 2023-07-09
### Added
* *Nothing*
### Changed
* [#781](https://github.com/shlinkio/shlink-web-client/issues/781) Migrate tests from jest to vitest.
* [#843](https://github.com/shlinkio/shlink-web-client/issues/843) Build docker image only for new tags, making sure it always includes an actual version number.
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* *Nothing*
## [3.10.1] - 2023-04-23
### Added
* *Nothing*
### Changed
* *Nothing*
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [#826](https://github.com/shlinkio/shlink-web-client/issues/826) Fix generated short URLs CSV so that it can be used to import on Shlink.
## [3.10.0] - 2023-03-19
### Added
* [#807](https://github.com/shlinkio/shlink-web-client/issues/807) Add support for device-specific long-URLs when creating or editing short URLs.
* [#808](https://github.com/shlinkio/shlink-web-client/issues/808) Respect settings on excluding bots in the overview section, for visits cards.
* [#809](https://github.com/shlinkio/shlink-web-client/issues/809) Respect settings on excluding bots in the tags list.
### Changed
* [#798](https://github.com/shlinkio/shlink-web-client/issues/798) Remove stryker and mutation testing.
* [#800](https://github.com/shlinkio/shlink-web-client/issues/800) Use `/tags/stats` endpoint to load tags stats, when the server supports it.
* Update to Vite 4.2
* Update to TypeScript 5
* Update to coding standard v2.1.0
* Decouple tests from RTK internals.
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [#799](https://github.com/shlinkio/shlink-web-client/issues/799) Fix fallback visits not taking into account configuration regarding excluding bots.
## [3.9.1] - 2022-12-31
### Added
* *Nothing*
### Changed
* *Nothing*
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [#787](https://github.com/shlinkio/shlink-web-client/issues/787) Fixed wrong base path set in vite config when homepage is set as empty string.
## [3.9.0] - 2022-12-31
### Added
* [#750](https://github.com/shlinkio/shlink-web-client/issues/750) Added new icon indicators telling if a short URL can be normally visited, it received the max amount of visits, is still not enabled, etc.
* [#764](https://github.com/shlinkio/shlink-web-client/issues/764) Added support to exclude visits from visits on short URLs list when consuming Shlink 3.4.0.
This feature also comes with a new setting to disable visits from bots by default, both on short URLs lists and visits sections.
* [#760](https://github.com/shlinkio/shlink-web-client/issues/760) Added support to exclude short URLs which have reached the maximum amount of visits, or are valid until a date in the past.
### Changed
* [#753](https://github.com/shlinkio/shlink-web-client/issues/753) Migrated from react-scripts/webpack to vite.
* [#770](https://github.com/shlinkio/shlink-web-client/issues/770) Updated to latest dependencies.
* [#741](https://github.com/shlinkio/shlink-web-client/issues/741) Improved `visitsAsyncThunk`, making it wrap pending/fulfilled/rejected actions, as well as custom ones, in a type-safe way.
### Deprecated
* *Nothing*
### Removed
* [#736](https://github.com/shlinkio/shlink-web-client/issues/736) Removed cards mode in tags. Only table mode is supported now.
* [#774](https://github.com/shlinkio/shlink-web-client/issues/774) Dropped support for Shlink older than 2.8.0.
### Fixed
* [#715](https://github.com/shlinkio/shlink-web-client/issues/715) Fixed connection still failing on miss-configured servers, after editing their params to set proper values.
## [3.8.2] - 2022-12-17
### Added
* *Nothing*
### Changed
* *Nothing*
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [#766](https://github.com/shlinkio/shlink-web-client/issues/766) Fixed visits query being lost when switching between sub-sections.
* [#765](https://github.com/shlinkio/shlink-web-client/issues/765) Added missing `"Content-Type": "application/json"` to requests with payload, making older Shlink versions fail.
## [3.8.1] - 2022-12-06
### Added
* *Nothing*
### Changed
* *Nothing*
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [#756](https://github.com/shlinkio/shlink-web-client/issues/756) Fixed all visits interval not working unless switching to a different interval first.
* [#757](https://github.com/shlinkio/shlink-web-client/issues/757) Fixed visits fallback interval not working until the visits view has been loaded at least twice.
## [3.8.0] - 2022-12-03
### Added
* [#708](https://github.com/shlinkio/shlink-web-client/issues/708) Added support for API v3.
* [#717](https://github.com/shlinkio/shlink-web-client/issues/717) Allowed to select time in 10 minute intervals when configuring "enabled since" and "enabled until" on short URLs.
* [#748](https://github.com/shlinkio/shlink-web-client/issues/748) Improved visits section to add filters to the query string, allowing to navigate to a specific state or bookmarking filters.
### Changed
* [#713](https://github.com/shlinkio/shlink-web-client/issues/713) Updated dependencies.
* [#620](https://github.com/shlinkio/shlink-web-client/issues/620) Migrated all reducers to redux toolkit.
* [#721](https://github.com/shlinkio/shlink-web-client/issues/721) Migrated from axios to fetch.
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [#590](https://github.com/shlinkio/shlink-web-client/issues/590) Fixed position of the datepicker triangle.
* [#729](https://github.com/shlinkio/shlink-web-client/issues/729) Fixed wrong stats displayed in tags after renaming.
* [#737](https://github.com/shlinkio/shlink-web-client/issues/737) Fixed incorrect contrast in warning messages when using dark theme.
* [#726](https://github.com/shlinkio/shlink-web-client/issues/726) Fixed delete server and delete short URL modals getting removed from the DOM before finishing close transition.
* [#749](https://github.com/shlinkio/shlink-web-client/issues/749) Fixed broken short URLs table when some short URL has a too long custom slug.
## [3.7.3] - 2022-09-13
### Added
* [#703](https://github.com/shlinkio/shlink-web-client/issues/703) Added support to publish docker image in GHCR.

View File

@@ -6,7 +6,7 @@ You will also see how to ensure the code fulfills the expected code checks, and
## System dependencies
The project can be run inside a docker container through provided docker-compose configuration.
The project can be run inside a docker container through provided `docker compose` configuration.
Because of this, the only actual dependencies are [docker](https://docs.docker.com/get-docker/) and [docker-compose](https://docs.docker.com/compose/install/).
@@ -17,7 +17,7 @@ The first thing you need to do is fork the repository, and clone it in your loca
Then you will have to follow these steps:
* Copy the file `docker-compose.override.yml.dist` by also removing the `dist` extension.
* Start-up the project by running `docker-compose up`.
* Start-up the project by running `docker compose up`.
Once this is finished, you will have the project exposed in port `3000` (http://localhost:3000).

View File

@@ -1,12 +1,15 @@
FROM node:16.15-alpine as node
FROM node:21.6-alpine as node
COPY . /shlink-web-client
ARG VERSION="latest"
ENV VERSION ${VERSION}
RUN cd /shlink-web-client && npm ci --force && NODE_ENV=production npm run build
RUN cd /shlink-web-client && npm ci && npm run build
FROM nginx:1.21-alpine
FROM nginxinc/nginx-unprivileged:1.25-alpine
ARG UID=101
LABEL maintainer="Alejandro Celaya <alejandro@alejandrocelaya.com>"
USER root
RUN rm -r /usr/share/nginx/html && rm /etc/nginx/conf.d/default.conf
USER $UID
COPY config/docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY scripts/docker/servers_from_env.sh /docker-entrypoint.d/30-shlink-servers-json.sh
COPY --from=node /shlink-web-client/build /usr/share/nginx/html

View File

@@ -1,11 +1,12 @@
# shlink-web-client
[![Build Status](https://img.shields.io/github/workflow/status/shlinkio/shlink-web-client/Continuous%20integration/develop?logo=github&style=flat-square)](https://github.com/shlinkio/shlink-web-client/actions?query=workflow%3A%22Continuous+integration%22)
[![Build Status](https://img.shields.io/github/actions/workflow/status/shlinkio/shlink-web-client/ci.yml?branch=develop&logo=github&style=flat-square)](https://github.com/shlinkio/shlink-web-client/actions/workflows/ci.yml?query=workflow%3A%22Continuous+integration%22)
[![Code Coverage](https://img.shields.io/codecov/c/gh/shlinkio/shlink-web-client/develop?style=flat-square)](https://app.codecov.io/gh/shlinkio/shlink-web-client)
[![GitHub release](https://img.shields.io/github/release/shlinkio/shlink-web-client.svg?style=flat-square)](https://github.com/shlinkio/shlink-web-client/releases/latest)
[![Docker pulls](https://img.shields.io/docker/pulls/shlinkio/shlink-web-client.svg?logo=docker&style=flat-square)](https://hub.docker.com/r/shlinkio/shlink-web-client/)
[![GitHub license](https://img.shields.io/github/license/shlinkio/shlink-web-client.svg?style=flat-square)](https://github.com/shlinkio/shlink-web-client/blob/main/LICENSE)
[![Twitter](https://img.shields.io/twitter/follow/shlinkio?color=blue&label=follow&logo=twitter&style=flat-square)](https://twitter.com/shlinkio)
[![Twitter](https://img.shields.io/badge/follow-shlinkio-blue.svg?style=flat-square&logo=x&color=black)](https://twitter.com/shlinkio)
[![Mastodon](https://img.shields.io/mastodon/follow/109329425426175098?color=%236364ff&domain=https%3A%2F%2Ffosstodon.org&label=follow&logo=mastodon&logoColor=white&style=flat-square)](https://fosstodon.org/@shlinkio)
[![Paypal Donate](https://img.shields.io/badge/Donate-paypal-blue.svg?style=flat-square&logo=paypal&colorA=cccccc)](https://slnk.to/donate)
A ReactJS-based progressive web application for [Shlink](https://shlink.io).
@@ -53,7 +54,7 @@ Those servers can be exported and imported in other browsers, but if for some re
[
{
"name": "Main server",
"url": "https://doma.in",
"url": "https://s.test",
"apiKey": "09c972b7-506b-49f1-a19a-d729e22e599c"
},
{
@@ -68,7 +69,7 @@ Those servers can be exported and imported in other browsers, but if for some re
If you are using the shlink-web-client docker image, you can mount the `servers.json` file in a volume inside `/usr/share/nginx/html`, which is the app's document root inside the container.
docker run --name shlink-web-client -p 8000:80 -v ${PWD}/servers.json:/usr/share/nginx/html/servers.json shlinkio/shlink-web-client
docker run --name shlink-web-client -p 8000:8080 -v ${PWD}/servers.json:/usr/share/nginx/html/servers.json shlinkio/shlink-web-client
Alternatively, you can mount a `conf.d` directory, which in turn contains the `servers.json` file, in a volume inside `/usr/share/nginx/html`. *(since shlink-web-client 3.2.0)*.
@@ -84,7 +85,7 @@ If you want to pre-configure a single server, you can provide its config via env
docker run \
--name shlink-web-client \
-p 8000:80 \
-e SHLINK_SERVER_URL=https://doma.in \
-e SHLINK_SERVER_URL=https://s.test \
-e SHLINK_SERVER_API_KEY=6aeb82c6-e275-4538-a747-31f9abfba63c \
shlinkio/shlink-web-client
```

View File

@@ -1,11 +0,0 @@
module.exports = {
presets: [
[
'react-app',
{
runtime: 'automatic',
typescript: true,
},
],
],
};

View File

@@ -1,5 +1,5 @@
server {
listen 80 default_server;
listen 8080 default_server;
charset utf-8;
root /usr/share/nginx/html;
index index.html;

View File

@@ -1,12 +0,0 @@
// This is a custom Jest transformer turning style imports into empty objects.
// http://facebook.github.io/jest/docs/en/webpack.html
module.exports = {
process() {
return { code: 'module.exports = {};' };
},
getCacheKey() {
// The output is always the same.
return 'cssTransform';
},
};

View File

@@ -1,31 +0,0 @@
const path = require('path');
// This is a custom Jest transformer turning file imports into filenames.
// http://facebook.github.io/jest/docs/en/webpack.html
module.exports = {
process(src, filename) {
const assetFilename = JSON.stringify(path.basename(filename));
if (filename.match(/\.svg$/)) {
return `module.exports = {
__esModule: true,
default: ${assetFilename},
ReactComponent: (props) => ({
$$typeof: Symbol.for('react.element'),
type: 'svg',
ref: null,
key: null,
props: Object.assign({}, props, {
children: ${assetFilename}
})
}),
};`;
}
return {
code: `module.exports = ${assetFilename};`
};
},
};

View File

@@ -1,8 +0,0 @@
import '@testing-library/jest-dom';
import 'jest-canvas-mock';
import ResizeObserver from 'resize-observer-polyfill';
(global as any).ResizeObserver = ResizeObserver;
(global as any).scrollTo = () => {};
(global as any).prompt = () => {};
(global as any).matchMedia = (media: string) => ({ matches: false, media });

24
config/test/setupTests.ts Normal file
View File

@@ -0,0 +1,24 @@
import '@testing-library/jest-dom/vitest';
import { cleanup } from '@testing-library/react';
import axe from 'axe-core';
import { afterEach } from 'vitest';
axe.configure({
checks: [
{
// Disable color contrast checking, as it doesn't work in jsdom
id: 'color-contrast',
enabled: false,
},
],
});
// Clear all mocks and cleanup DOM after every test
afterEach(() => {
vi.clearAllMocks();
cleanup();
});
HTMLCanvasElement.prototype.getContext = (() => {}) as any;
(global as any).scrollTo = () => {};
(global as any).matchMedia = () => ({ matches: false });

View File

@@ -3,11 +3,11 @@ version: '3'
services:
shlink_web_client_node:
container_name: shlink_web_client_node
image: node:16.15-alpine
image: node:20.7-alpine
command: /bin/sh -c "cd /home/shlink/www && npm install && npm run start"
volumes:
- ./:/home/shlink/www
ports:
- "3000:3000"
- "56745:56745"
- "5000:5000"
- "4173:4173"

90
index.html Normal file
View File

@@ -0,0 +1,90 @@
<!DOCTYPE html>
<html lang="en">
<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">
<!--
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
-->
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
<!-- FavIcon itself -->
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/svg+xml" href="/favicon.svg" sizes="any">
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="icon" type="image/gif" href="/favicon.gif">
<!-- Apple Touch -->
<link rel="apple-touch-icon" sizes="16x16" href="/icons/icon-16x16.png">
<link rel="apple-touch-icon" sizes="24x24" href="/icons/icon-24x24.png">
<link rel="apple-touch-icon" sizes="32x32" href="/icons/icon-32x32.png">
<link rel="apple-touch-icon" sizes="40x40" href="/icons/icon-40x40.png">
<link rel="apple-touch-icon" sizes="48x48" href="/icons/icon-48x48.png">
<link rel="apple-touch-icon" sizes="60x60" href="/icons/icon-60x60.png">
<link rel="apple-touch-icon" sizes="64x64" href="/icons/icon-64x64.png">
<link rel="apple-touch-icon" sizes="72x72" href="/icons/icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/icons/icon-76x76.png">
<link rel="apple-touch-icon" sizes="96x96" href="/icons/icon-96x96.png">
<link rel="apple-touch-icon" sizes="114x114" href="/icons/icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/icons/icon-120x120.png">
<link rel="apple-touch-icon" sizes="128x128" href="/icons/icon-128x128.png">
<link rel="apple-touch-icon" sizes="144x144" href="/icons/icon-144x144.png">
<link rel="apple-touch-icon" sizes="150x150" href="/icons/icon-150x150.png">
<link rel="apple-touch-icon" sizes="152x152" href="/icons/icon-152x152.png">
<link rel="apple-touch-icon" sizes="160x160" href="/icons/icon-160x160.png">
<link rel="apple-touch-icon" sizes="167x167" href="/icons/icon-167x167.png">
<link rel="apple-touch-icon" sizes="180x180" href="/icons/icon-180x180.png">
<link rel="apple-touch-icon" sizes="192x192" href="/icons/icon-192x192.png">
<link rel="apple-touch-icon" sizes="196x196" href="/icons/icon-196x196.png">
<link rel="apple-touch-icon" sizes="228x228" href="/icons/icon-228x228.png">
<link rel="apple-touch-icon" sizes="256x256" href="/icons/icon-256x256.png">
<link rel="apple-touch-icon" sizes="310x310" href="/icons/icon-310x310.png">
<link rel="apple-touch-icon" sizes="384x384" href="/icons/icon-384x384.png">
<link rel="apple-touch-icon" sizes="512x512" href="/icons/icon-512x512.png">
<link rel="apple-touch-icon" sizes="1024x1024" href="/icons/icon-1024x1024.png">
<!-- Normal -->
<link rel="icon" type="image/png" sizes="1024x1024" href="/icons/icon-1024x1024.png">
<link rel="icon" type="image/png" sizes="512x512" href="/icons/icon-512x512.png">
<link rel="icon" type="image/png" sizes="384x384" href="/icons/icon-384x384.png">
<link rel="icon" type="image/png" sizes="310x310" href="/icons/icon-310x310.png">
<link rel="icon" type="image/png" sizes="256x256" href="/icons/icon-256x256.png">
<link rel="icon" type="image/png" sizes="228x228" href="/icons/icon-228x228.png">
<link rel="icon" type="image/png" sizes="196x196" href="/icons/icon-196x196.png">
<link rel="icon" type="image/png" sizes="192x192" href="/icons/icon-192x192.png">
<link rel="icon" type="image/png" sizes="180x180" href="/icons/icon-180x180.png">
<link rel="icon" type="image/png" sizes="167x167" href="/icons/icon-167x167.png">
<link rel="icon" type="image/png" sizes="160x160" href="/icons/icon-160x160.png">
<link rel="icon" type="image/png" sizes="152x152" href="/icons/icon-152x152.png">
<link rel="icon" type="image/png" sizes="150x150" href="/icons/icon-150x150.png">
<link rel="icon" type="image/png" sizes="144x144" href="/icons/icon-144x144.png">
<link rel="icon" type="image/png" sizes="128x128" href="/icons/icon-128x128.png">
<link rel="icon" type="image/png" sizes="120x120" href="/icons/icon-120x120.png">
<link rel="icon" type="image/png" sizes="114x114" href="/icons/icon-114x114.png">
<link rel="icon" type="image/png" sizes="96x96" href="/icons/icon-96x96.png">
<link rel="icon" type="image/png" sizes="76x76" href="/icons/icon-76x76.png">
<link rel="icon" type="image/png" sizes="72x72" href="/icons/icon-72x72.png">
<link rel="icon" type="image/png" sizes="64x64" href="/icons/icon-64x64.png">
<link rel="icon" type="image/png" sizes="60x60" href="/icons/icon-60x60.png">
<link rel="icon" type="image/png" sizes="48x48" href="/icons/icon-48x48.png">
<link rel="icon" type="image/png" sizes="40x40" href="/icons/icon-40x40.png">
<link rel="icon" type="image/png" sizes="32x32" href="/icons/icon-32x32.png">
<link rel="icon" type="image/png" sizes="24x24" href="/icons/icon-24x24.png">
<link rel="icon" type="image/png" sizes="16x16" href="/icons/icon-16x16.png">
<!-- MS -->
<meta name="msapplication-TileImage" content="/icons/icon-144x144.png">
<meta name="msapplication-square70x70logo" content="/icons/icon-70x70.png">
<meta name="msapplication-square144x144logo" content="/icons/icon-144x144.png">
<meta name="msapplication-square150x150logo" content="/icons/icon-150x150.png">
<meta name="msapplication-square310x310logo" content="/icons/icon-310x310.png">
<title>Shlink — The URL shortener</title>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
<script type="module" src="/src/index.tsx"></script>
</body>
</html>

View File

@@ -2,7 +2,7 @@
# Run docker container if it's not up yet
if ! [[ $(docker ps | grep shlink_web_client_node) ]]; then
docker-compose up -d
docker compose up -d
fi
docker exec -it shlink_web_client_node /bin/sh -c "cd /home/shlink/www && $*"

View File

@@ -1,40 +0,0 @@
module.exports = {
coverageDirectory: '<rootDir>/coverage',
collectCoverageFrom: [
'src/**/*.{ts,tsx}',
'!src/*.{ts,tsx}',
'!src/reducers/index.ts',
'!src/**/provideServices.ts',
'!src/container/*.ts',
],
coverageThreshold: {
global: {
statements: 90,
branches: 80,
functions: 85,
lines: 90,
},
},
setupFilesAfterEnv: ['<rootDir>/config/jest/setupTests.ts'],
testMatch: ['<rootDir>/test/**/*.test.{ts,tsx}'],
testEnvironment: 'jsdom',
testEnvironmentOptions: {
url: 'http://localhost',
},
transform: {
'^.+\\.(ts|tsx|js)$': '<rootDir>/node_modules/babel-jest',
'^.+\\.scss$': '<rootDir>/config/jest/cssTransform.js',
'^(?!.*\\.(ts|tsx|js|json|scss)$)': '<rootDir>/config/jest/fileTransform.js',
},
transformIgnorePatterns: [
'<rootDir>/.stryker-tmp',
'node_modules\/(?!(\@react-leaflet|react-leaflet|leaflet|react-chartjs-2|react-colorful)\/)',
'^.+\\.module\\.scss$',
],
moduleNameMapper: {
'^.+\\.module\\.scss$': 'identity-obj-proxy',
'react-chartjs-2': '<rootDir>/node_modules/react-chartjs-2/dist/index.js',
'uuid': '<rootDir>/node_modules/uuid/dist/index.js',
},
moduleFileExtensions: ['js', 'ts', 'tsx', 'json'],
};

147
manifest.ts Normal file
View File

@@ -0,0 +1,147 @@
import type { ManifestOptions } from 'vite-plugin-pwa';
export const manifest: Partial<ManifestOptions> = {
short_name: 'Shlink',
name: 'Shlink',
start_url: '/',
display: 'standalone',
theme_color: '#4696e5',
background_color: '#4696e5',
icons: [
{
src: './icons/icon-16x16.png',
type: 'image/png',
sizes: '16x16',
},
{
src: './icons/icon-24x24.png',
type: 'image/png',
sizes: '24x24',
},
{
src: './icons/icon-32x32.png',
type: 'image/png',
sizes: '32x32',
},
{
src: './icons/icon-40x40.png',
type: 'image/png',
sizes: '40x40',
},
{
src: './icons/icon-48x48.png',
type: 'image/png',
sizes: '48x48',
},
{
src: './icons/icon-60x60.png',
type: 'image/png',
sizes: '60x60',
},
{
src: './icons/icon-64x64.png',
type: 'image/png',
sizes: '64x64',
},
{
src: './icons/icon-72x72.png',
type: 'image/png',
sizes: '72x72',
},
{
src: './icons/icon-76x76.png',
type: 'image/png',
sizes: '76x76',
},
{
src: './icons/icon-96x96.png',
type: 'image/png',
sizes: '96x96',
},
{
src: './icons/icon-114x114.png',
type: 'image/png',
sizes: '114x114',
},
{
src: './icons/icon-120x120.png',
type: 'image/png',
sizes: '120x120',
},
{
src: './icons/icon-128x128.png',
type: 'image/png',
sizes: '128x128',
},
{
src: './icons/icon-144x144.png',
type: 'image/png',
sizes: '144x144',
},
{
src: './icons/icon-150x150.png',
type: 'image/png',
sizes: '150x150',
},
{
src: './icons/icon-152x152.png',
type: 'image/png',
sizes: '152x152',
},
{
src: './icons/icon-160x160.png',
type: 'image/png',
sizes: '160x160',
},
{
src: './icons/icon-167x167.png',
type: 'image/png',
sizes: '167x167',
},
{
src: './icons/icon-180x180.png',
type: 'image/png',
sizes: '180x180',
},
{
src: './icons/icon-192x192.png',
type: 'image/png',
sizes: '192x192',
},
{
src: './icons/icon-196x196.png',
type: 'image/png',
sizes: '196x196',
},
{
src: './icons/icon-228x228.png',
type: 'image/png',
sizes: '228x228',
},
{
src: './icons/icon-256x256.png',
type: 'image/png',
sizes: '256x256',
},
{
src: './icons/icon-310x310.png',
type: 'image/png',
sizes: '310x310',
},
{
src: './icons/icon-384x384.png',
type: 'image/png',
sizes: '384x384',
},
{
src: './icons/icon-512x512.png',
type: 'image/png',
sizes: '512x512',
},
{
src: './icons/icon-1024x1024.png',
type: 'image/png',
sizes: '1024x1024',
},
],
};

43423
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -5,6 +5,7 @@
"homepage": "",
"repository": "https://github.com/shlinkio/shlink-web-client",
"license": "MIT",
"type": "module",
"scripts": {
"lint": "npm run lint:css && npm run lint:js",
"lint:css": "stylelint src/*.scss src/**/*.scss",
@@ -12,99 +13,73 @@
"lint:fix": "npm run lint:css:fix && npm run lint:js:fix",
"lint:css:fix": "npm run lint:css -- --fix",
"lint:js:fix": "npm run lint:js -- --fix",
"start": "DISABLE_ESLINT_PLUGIN=true react-scripts start",
"build": "DISABLE_ESLINT_PLUGIN=true react-scripts build && node scripts/replace-version.mjs",
"types": "tsc",
"start": "vite serve --host=0.0.0.0",
"preview": "vite preview --host=0.0.0.0",
"build": "npm run types && vite build && node scripts/replace-version.mjs",
"build:dist": "npm run build && node scripts/create-dist-file.mjs",
"build:serve": "serve -p 5000 ./build",
"test": "jest --env=jsdom --colors",
"test:coverage": "npm run test -- --coverage --coverageReporters=text --coverageReporters=text-summary",
"test:ci": "npm run test:coverage -- --coverageReporters=clover --ci",
"test:pretty": "npm run test:coverage -- --coverageReporters=html",
"test:verbose": "npm run test -- --verbose",
"mutate": "./node_modules/.bin/stryker run --concurrency 4 --ignoreStatic"
"test": "vitest run --run",
"test:watch": "vitest --watch",
"test:ci": "npm run test -- --coverage",
"test:verbose": "npm run test -- --verbose"
},
"dependencies": {
"@fortawesome/fontawesome-free": "^6.0.0",
"@fortawesome/fontawesome-svg-core": "^1.3.0",
"@fortawesome/free-regular-svg-icons": "^6.0.0",
"@fortawesome/free-solid-svg-icons": "^6.0.0",
"@fortawesome/react-fontawesome": "^0.1.17",
"axios": "^0.26.0",
"bootstrap": "^5.1.3",
"bottlejs": "^2.0.0",
"bowser": "^2.11.0",
"chart.js": "^3.7.1",
"classnames": "^2.3.1",
"compare-versions": "^4.1.3",
"@fortawesome/fontawesome-free": "^6.5.1",
"@fortawesome/fontawesome-svg-core": "^6.5.1",
"@fortawesome/free-brands-svg-icons": "^6.5.1",
"@fortawesome/free-regular-svg-icons": "^6.5.1",
"@fortawesome/free-solid-svg-icons": "^6.5.1",
"@fortawesome/react-fontawesome": "^0.2.0",
"@json2csv/plainjs": "^7.0.5",
"@reduxjs/toolkit": "^2.1.0",
"@shlinkio/data-manipulation": "^1.0.3",
"@shlinkio/shlink-frontend-kit": "^0.4.2",
"@shlinkio/shlink-js-sdk": "^0.2.2",
"@shlinkio/shlink-web-component": "^0.5.0",
"bootstrap": "5.2.3",
"bottlejs": "^2.0.1",
"clsx": "^2.1.0",
"compare-versions": "^6.1.0",
"csvtojson": "^2.0.10",
"date-fns": "^2.28.0",
"event-source-polyfill": "^1.0.25",
"json2csv": "^5.0.7",
"leaflet": "^1.7.1",
"qs": "^6.9.6",
"ramda": "^0.27.2",
"react": "^18.1.0",
"react-chartjs-2": "^4.1.0",
"react-colorful": "^5.5.1",
"react-copy-to-clipboard": "^5.1.0",
"react-datepicker": "^4.8.0",
"react-dom": "^18.1.0",
"react-external-link": "^2.0.0",
"react-leaflet": "^4.0.0",
"react-redux": "^8.0.0",
"react-router-dom": "^6.3.0",
"react-swipeable": "^7.0.0",
"react-tag-autocomplete": "^6.3.0",
"reactstrap": "^9.0.1",
"redux": "^4.2.0",
"redux-localstorage-simple": "^2.4.1",
"redux-thunk": "^2.4.1",
"stream": "^0.0.2",
"uuid": "^8.3.2",
"workbox-core": "^6.5.1",
"workbox-expiration": "^6.5.1",
"workbox-precaching": "^6.5.1",
"workbox-routing": "^6.5.1",
"workbox-strategies": "^6.5.1"
"date-fns": "^3.3.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-external-link": "^2.2.0",
"react-redux": "^9.1.0",
"react-router-dom": "^6.21.3",
"reactstrap": "^9.2.2",
"redux-localstorage-simple": "^2.5.1",
"uuid": "^9.0.1",
"workbox-core": "^7.0.0",
"workbox-expiration": "^7.0.0",
"workbox-precaching": "^7.0.0",
"workbox-routing": "^7.0.0",
"workbox-strategies": "^7.0.0"
},
"devDependencies": {
"@shlinkio/eslint-config-js-coding-standard": "~2.0.2",
"@shlinkio/stylelint-config-css-coding-standard": "~1.0.1",
"@stryker-mutator/core": "^6.0.2",
"@stryker-mutator/jest-runner": "^6.0.2",
"@stryker-mutator/typescript-checker": "^6.0.2",
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^13.1.1",
"@testing-library/user-event": "^14.1.1",
"@types/jest": "^27.4.1",
"@types/json2csv": "^5.0.3",
"@types/leaflet": "^1.7.9",
"@types/qs": "^6.9.7",
"@types/ramda": "0.27.38",
"@types/react": "^18.0.8",
"@types/react-color": "^3.0.6",
"@types/react-copy-to-clipboard": "^5.0.2",
"@types/react-datepicker": "^4.3.4",
"@types/react-dom": "^18.0.3",
"@types/react-tag-autocomplete": "^6.1.1",
"@types/uuid": "^8.3.4",
"adm-zip": "^0.5.9",
"babel-jest": "^28.0.3",
"chalk": "^5.0.1",
"eslint": "^8.12.0",
"identity-obj-proxy": "^3.0.0",
"jest": "^28.0.3",
"jest-canvas-mock": "^2.4.0",
"jest-environment-jsdom": "^28.0.2",
"react-scripts": "^5.0.1",
"resize-observer-polyfill": "^1.5.1",
"sass": "^1.49.9",
"serve": "^13.0.2",
"stryker-cli": "^1.0.2",
"stylelint": "^14.8.2",
"ts-mockery": "^1.2.0",
"typescript": "^4.6.2",
"webpack": "^5.70.0"
"@shlinkio/eslint-config-js-coding-standard": "~2.3.0",
"@shlinkio/stylelint-config-css-coding-standard": "~1.1.1",
"@testing-library/jest-dom": "^6.3.0",
"@testing-library/react": "^14.1.2",
"@testing-library/user-event": "^14.5.2",
"@total-typescript/shoehorn": "^0.1.1",
"@types/react": "^18.2.48",
"@types/react-dom": "^18.2.18",
"@types/uuid": "^9.0.8",
"@vitejs/plugin-react": "^4.2.1",
"@vitest/coverage-v8": "^1.2.2",
"adm-zip": "^0.5.10",
"axe-core": "^4.8.3",
"chalk": "^5.3.0",
"eslint": "^8.56.0",
"history": "^5.3.0",
"jsdom": "^24.0.0",
"sass": "^1.70.0",
"stylelint": "^15.11.0",
"typescript": "^5.3.3",
"vite": "^5.0.12",
"vite-plugin-pwa": "^0.17.5",
"vitest": "^1.2.2"
},
"browserslist": [
">0.2%",

View File

@@ -1,109 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<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">
<!--
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" crossorigin="use-credentials">
<!-- FavIcon itself -->
<link rel="icon" type="image/x-icon" href="%PUBLIC_URL%/favicon.ico">
<link rel="icon" type="image/svg+xml" href="%PUBLIC_URL%/favicon.svg" sizes="any">
<link rel="icon" type="image/png" href="%PUBLIC_URL%/favicon.png">
<link rel="icon" type="image/gif" href="%PUBLIC_URL%/favicon.gif">
<!-- Apple Touch -->
<link rel="apple-touch-icon" sizes="16x16" href="%PUBLIC_URL%/icons/icon-16x16.png">
<link rel="apple-touch-icon" sizes="24x24" href="%PUBLIC_URL%/icons/icon-24x24.png">
<link rel="apple-touch-icon" sizes="32x32" href="%PUBLIC_URL%/icons/icon-32x32.png">
<link rel="apple-touch-icon" sizes="40x40" href="%PUBLIC_URL%/icons/icon-40x40.png">
<link rel="apple-touch-icon" sizes="48x48" href="%PUBLIC_URL%/icons/icon-48x48.png">
<link rel="apple-touch-icon" sizes="60x60" href="%PUBLIC_URL%/icons/icon-60x60.png">
<link rel="apple-touch-icon" sizes="64x64" href="%PUBLIC_URL%/icons/icon-64x64.png">
<link rel="apple-touch-icon" sizes="72x72" href="%PUBLIC_URL%/icons/icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="%PUBLIC_URL%/icons/icon-76x76.png">
<link rel="apple-touch-icon" sizes="96x96" href="%PUBLIC_URL%/icons/icon-96x96.png">
<link rel="apple-touch-icon" sizes="114x114" href="%PUBLIC_URL%/icons/icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="%PUBLIC_URL%/icons/icon-120x120.png">
<link rel="apple-touch-icon" sizes="128x128" href="%PUBLIC_URL%/icons/icon-128x128.png">
<link rel="apple-touch-icon" sizes="144x144" href="%PUBLIC_URL%/icons/icon-144x144.png">
<link rel="apple-touch-icon" sizes="150x150" href="%PUBLIC_URL%/icons/icon-150x150.png">
<link rel="apple-touch-icon" sizes="152x152" href="%PUBLIC_URL%/icons/icon-152x152.png">
<link rel="apple-touch-icon" sizes="160x160" href="%PUBLIC_URL%/icons/icon-160x160.png">
<link rel="apple-touch-icon" sizes="167x167" href="%PUBLIC_URL%/icons/icon-167x167.png">
<link rel="apple-touch-icon" sizes="180x180" href="%PUBLIC_URL%/icons/icon-180x180.png">
<link rel="apple-touch-icon" sizes="192x192" href="%PUBLIC_URL%/icons/icon-192x192.png">
<link rel="apple-touch-icon" sizes="196x196" href="%PUBLIC_URL%/icons/icon-196x196.png">
<link rel="apple-touch-icon" sizes="228x228" href="%PUBLIC_URL%/icons/icon-228x228.png">
<link rel="apple-touch-icon" sizes="256x256" href="%PUBLIC_URL%/icons/icon-256x256.png">
<link rel="apple-touch-icon" sizes="310x310" href="%PUBLIC_URL%/icons/icon-310x310.png">
<link rel="apple-touch-icon" sizes="384x384" href="%PUBLIC_URL%/icons/icon-384x384.png">
<link rel="apple-touch-icon" sizes="512x512" href="%PUBLIC_URL%/icons/icon-512x512.png">
<link rel="apple-touch-icon" sizes="1024x1024" href="%PUBLIC_URL%/icons/icon-1024x1024.png">
<!-- Normal -->
<link rel="icon" type="image/png" sizes="1024x1024" href="%PUBLIC_URL%/icons/icon-1024x1024.png">
<link rel="icon" type="image/png" sizes="512x512" href="%PUBLIC_URL%/icons/icon-512x512.png">
<link rel="icon" type="image/png" sizes="384x384" href="%PUBLIC_URL%/icons/icon-384x384.png">
<link rel="icon" type="image/png" sizes="310x310" href="%PUBLIC_URL%/icons/icon-310x310.png">
<link rel="icon" type="image/png" sizes="256x256" href="%PUBLIC_URL%/icons/icon-256x256.png">
<link rel="icon" type="image/png" sizes="228x228" href="%PUBLIC_URL%/icons/icon-228x228.png">
<link rel="icon" type="image/png" sizes="196x196" href="%PUBLIC_URL%/icons/icon-196x196.png">
<link rel="icon" type="image/png" sizes="192x192" href="%PUBLIC_URL%/icons/icon-192x192.png">
<link rel="icon" type="image/png" sizes="180x180" href="%PUBLIC_URL%/icons/icon-180x180.png">
<link rel="icon" type="image/png" sizes="167x167" href="%PUBLIC_URL%/icons/icon-167x167.png">
<link rel="icon" type="image/png" sizes="160x160" href="%PUBLIC_URL%/icons/icon-160x160.png">
<link rel="icon" type="image/png" sizes="152x152" href="%PUBLIC_URL%/icons/icon-152x152.png">
<link rel="icon" type="image/png" sizes="150x150" href="%PUBLIC_URL%/icons/icon-150x150.png">
<link rel="icon" type="image/png" sizes="144x144" href="%PUBLIC_URL%/icons/icon-144x144.png">
<link rel="icon" type="image/png" sizes="128x128" href="%PUBLIC_URL%/icons/icon-128x128.png">
<link rel="icon" type="image/png" sizes="120x120" href="%PUBLIC_URL%/icons/icon-120x120.png">
<link rel="icon" type="image/png" sizes="114x114" href="%PUBLIC_URL%/icons/icon-114x114.png">
<link rel="icon" type="image/png" sizes="96x96" href="%PUBLIC_URL%/icons/icon-96x96.png">
<link rel="icon" type="image/png" sizes="76x76" href="%PUBLIC_URL%/icons/icon-76x76.png">
<link rel="icon" type="image/png" sizes="72x72" href="%PUBLIC_URL%/icons/icon-72x72.png">
<link rel="icon" type="image/png" sizes="64x64" href="%PUBLIC_URL%/icons/icon-64x64.png">
<link rel="icon" type="image/png" sizes="60x60" href="%PUBLIC_URL%/icons/icon-60x60.png">
<link rel="icon" type="image/png" sizes="48x48" href="%PUBLIC_URL%/icons/icon-48x48.png">
<link rel="icon" type="image/png" sizes="40x40" href="%PUBLIC_URL%/icons/icon-40x40.png">
<link rel="icon" type="image/png" sizes="32x32" href="%PUBLIC_URL%/icons/icon-32x32.png">
<link rel="icon" type="image/png" sizes="24x24" href="%PUBLIC_URL%/icons/icon-24x24.png">
<link rel="icon" type="image/png" sizes="16x16" href="%PUBLIC_URL%/icons/icon-16x16.png">
<!-- MS -->
<meta name="msapplication-TileImage" content="%PUBLIC_URL%/icons/icon-144x144.png">
<meta name="msapplication-square70x70logo" content="%PUBLIC_URL%/icons/icon-70x70.png">
<meta name="msapplication-square144x144logo" content="%PUBLIC_URL%/icons/icon-144x144.png">
<meta name="msapplication-square150x150logo" content="%PUBLIC_URL%/icons/icon-150x150.png">
<meta name="msapplication-square310x310logo" content="%PUBLIC_URL%/icons/icon-310x310.png">
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>Shlink — The URL shortener</title>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>

View File

@@ -1,145 +0,0 @@
{
"short_name": "Shlink",
"name": "Shlink",
"start_url": "/",
"display": "standalone",
"theme_color": "#4696e5",
"background_color": "#4696e5",
"icons": [
{
"src": "./icons/icon-16x16.png",
"type": "image/png",
"sizes": "16x16"
},
{
"src": "./icons/icon-24x24.png",
"type": "image/png",
"sizes": "24x24"
},
{
"src": "./icons/icon-32x32.png",
"type": "image/png",
"sizes": "32x32"
},
{
"src": "./icons/icon-40x40.png",
"type": "image/png",
"sizes": "40x40"
},
{
"src": "./icons/icon-48x48.png",
"type": "image/png",
"sizes": "48x48"
},
{
"src": "./icons/icon-60x60.png",
"type": "image/png",
"sizes": "60x60"
},
{
"src": "./icons/icon-64x64.png",
"type": "image/png",
"sizes": "64x64"
},
{
"src": "./icons/icon-72x72.png",
"type": "image/png",
"sizes": "72x72"
},
{
"src": "./icons/icon-76x76.png",
"type": "image/png",
"sizes": "76x76"
},
{
"src": "./icons/icon-96x96.png",
"type": "image/png",
"sizes": "96x96"
},
{
"src": "./icons/icon-114x114.png",
"type": "image/png",
"sizes": "114x114"
},
{
"src": "./icons/icon-120x120.png",
"type": "image/png",
"sizes": "120x120"
},
{
"src": "./icons/icon-128x128.png",
"type": "image/png",
"sizes": "128x128"
},
{
"src": "./icons/icon-144x144.png",
"type": "image/png",
"sizes": "144x144"
},
{
"src": "./icons/icon-150x150.png",
"type": "image/png",
"sizes": "150x150"
},
{
"src": "./icons/icon-152x152.png",
"type": "image/png",
"sizes": "152x152"
},
{
"src": "./icons/icon-160x160.png",
"type": "image/png",
"sizes": "160x160"
},
{
"src": "./icons/icon-167x167.png",
"type": "image/png",
"sizes": "167x167"
},
{
"src": "./icons/icon-180x180.png",
"type": "image/png",
"sizes": "180x180"
},
{
"src": "./icons/icon-192x192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "./icons/icon-196x196.png",
"type": "image/png",
"sizes": "196x196"
},
{
"src": "./icons/icon-228x228.png",
"type": "image/png",
"sizes": "228x228"
},
{
"src": "./icons/icon-256x256.png",
"type": "image/png",
"sizes": "256x256"
},
{
"src": "./icons/icon-310x310.png",
"type": "image/png",
"sizes": "310x310"
},
{
"src": "./icons/icon-384x384.png",
"type": "image/png",
"sizes": "384x384"
},
{
"src": "./icons/icon-512x512.png",
"type": "image/png",
"sizes": "512x512"
},
{
"src": "./icons/icon-1024x1024.png",
"type": "image/png",
"sizes": "1024x1024"
}
]
}

View File

@@ -1,11 +1,11 @@
import fs from 'fs';
function replaceVersionPlaceholder(version) {
const staticJsFilesPath = './build/static/js';
const staticJsFilesPath = './build/assets';
const versionPlaceholder = '%_VERSION_%';
const isMainFile = (file) => file.startsWith('main.') && file.endsWith('.js');
const [ mainJsFile ] = fs.readdirSync(staticJsFilesPath).filter(isMainFile);
const isMainFile = (file) => file.startsWith('index-') && file.endsWith('.js');
const [mainJsFile] = fs.readdirSync(staticJsFilesPath).filter(isMainFile);
const filePath = `${staticJsFilesPath}/${mainJsFile}`;
const fileContent = fs.readFileSync(filePath, 'utf-8');
const replaced = fileContent.replace(versionPlaceholder, version);

View File

@@ -1,9 +1,6 @@
declare module 'event-source-polyfill' {
declare class EventSourcePolyfill {
public onmessage?: ({ data }: { data: string }) => void;
public onerror?: ({ status }: { status: number }) => void;
public close: () => void;
public constructor(hubUrl: URL, options?: any);
declare module '@json2csv/plainjs' {
export class Parser {
parse: <T>(data: T[]) => string;
}
}

View File

@@ -1,18 +0,0 @@
import { ProblemDetailsError } from './types';
import { isInvalidArgumentError } from './utils';
export interface ShlinkApiErrorProps {
errorData?: ProblemDetailsError;
fallbackMessage?: string;
}
export const ShlinkApiError = ({ errorData, fallbackMessage }: ShlinkApiErrorProps) => (
<>
{errorData?.detail ?? fallbackMessage}
{isInvalidArgumentError(errorData) && (
<p className="mb-0">
Invalid elements: [{errorData.invalidElements.join(', ')}]
</p>
)}
</>
);

View File

@@ -1,128 +0,0 @@
import { isEmpty, isNil, reject } from 'ramda';
import { AxiosInstance, AxiosResponse, Method } from 'axios';
import { ShortUrl, ShortUrlData } from '../../short-urls/data';
import { OptionalString } from '../../utils/utils';
import {
ShlinkHealth,
ShlinkMercureInfo,
ShlinkShortUrlsResponse,
ShlinkTags,
ShlinkTagsResponse,
ShlinkVisits,
ShlinkVisitsParams,
ShlinkShortUrlData,
ShlinkDomainsResponse,
ShlinkVisitsOverview,
ShlinkEditDomainRedirects,
ShlinkDomainRedirects,
ShlinkShortUrlsListParams,
ShlinkShortUrlsListNormalizedParams,
} from '../types';
import { stringifyQuery } from '../../utils/helpers/query';
import { orderToString } from '../../utils/helpers/ordering';
const buildShlinkBaseUrl = (url: string) => (url ? `${url}/rest/v2` : '');
const rejectNilProps = reject(isNil);
const normalizeOrderByInParams = (params: ShlinkShortUrlsListParams): ShlinkShortUrlsListNormalizedParams => {
const { orderBy = {}, ...rest } = params;
return { ...rest, orderBy: orderToString(orderBy) };
};
export class ShlinkApiClient {
public constructor(
private readonly axios: AxiosInstance,
private readonly baseUrl: string,
private readonly apiKey: string,
) {
}
public readonly listShortUrls = async (params: ShlinkShortUrlsListParams = {}): Promise<ShlinkShortUrlsResponse> =>
this.performRequest<{ shortUrls: ShlinkShortUrlsResponse }>('/short-urls', 'GET', normalizeOrderByInParams(params))
.then(({ data }) => data.shortUrls);
public readonly createShortUrl = async (options: ShortUrlData): Promise<ShortUrl> => {
const filteredOptions = reject((value) => isEmpty(value) || isNil(value), options as any);
return this.performRequest<ShortUrl>('/short-urls', 'POST', {}, filteredOptions)
.then((resp) => resp.data);
};
public readonly getShortUrlVisits = async (shortCode: string, query?: ShlinkVisitsParams): Promise<ShlinkVisits> =>
this.performRequest<{ visits: ShlinkVisits }>(`/short-urls/${shortCode}/visits`, 'GET', query)
.then(({ data }) => data.visits);
public readonly getTagVisits = async (tag: string, query?: Omit<ShlinkVisitsParams, 'domain'>): Promise<ShlinkVisits> =>
this.performRequest<{ visits: ShlinkVisits }>(`/tags/${tag}/visits`, 'GET', query)
.then(({ data }) => data.visits);
public readonly getDomainVisits = async (domain: string, query?: Omit<ShlinkVisitsParams, 'domain'>): Promise<ShlinkVisits> =>
this.performRequest<{ visits: ShlinkVisits }>(`/domains/${domain}/visits`, 'GET', query)
.then(({ data }) => data.visits);
public readonly getOrphanVisits = async (query?: Omit<ShlinkVisitsParams, 'domain'>): Promise<ShlinkVisits> =>
this.performRequest<{ visits: ShlinkVisits }>('/visits/orphan', 'GET', query)
.then(({ data }) => data.visits);
public readonly getNonOrphanVisits = async (query?: Omit<ShlinkVisitsParams, 'domain'>): Promise<ShlinkVisits> =>
this.performRequest<{ visits: ShlinkVisits }>('/visits/non-orphan', 'GET', query)
.then(({ data }) => data.visits);
public readonly getVisitsOverview = async (): Promise<ShlinkVisitsOverview> =>
this.performRequest<{ visits: ShlinkVisitsOverview }>('/visits', 'GET')
.then(({ data }) => data.visits);
public readonly getShortUrl = async (shortCode: string, domain?: OptionalString): Promise<ShortUrl> =>
this.performRequest<ShortUrl>(`/short-urls/${shortCode}`, 'GET', { domain })
.then(({ data }) => data);
public readonly deleteShortUrl = async (shortCode: string, domain?: OptionalString): Promise<void> =>
this.performRequest(`/short-urls/${shortCode}`, 'DELETE', { domain })
.then(() => {});
public readonly updateShortUrl = async (
shortCode: string,
domain: OptionalString,
edit: ShlinkShortUrlData,
): Promise<ShortUrl> =>
this.performRequest<ShortUrl>(`/short-urls/${shortCode}`, 'PATCH', { domain }, edit).then(({ data }) => data);
public readonly listTags = async (): Promise<ShlinkTags> =>
this.performRequest<{ tags: ShlinkTagsResponse }>('/tags', 'GET', { withStats: 'true' })
.then((resp) => resp.data.tags)
.then(({ data, stats }) => ({ tags: data, stats }));
public readonly deleteTags = async (tags: string[]): Promise<{ tags: string[] }> =>
this.performRequest('/tags', 'DELETE', { tags })
.then(() => ({ tags }));
public readonly editTag = async (oldName: string, newName: string): Promise<{ oldName: string; newName: string }> =>
this.performRequest('/tags', 'PUT', {}, { oldName, newName })
.then(() => ({ oldName, newName }));
public readonly health = async (): Promise<ShlinkHealth> =>
this.performRequest<ShlinkHealth>('/health', 'GET')
.then((resp) => resp.data);
public readonly mercureInfo = async (): Promise<ShlinkMercureInfo> =>
this.performRequest<ShlinkMercureInfo>('/mercure-info', 'GET')
.then((resp) => resp.data);
public readonly listDomains = async (): Promise<ShlinkDomainsResponse> =>
this.performRequest<{ domains: ShlinkDomainsResponse }>('/domains', 'GET').then(({ data }) => data.domains);
public readonly editDomainRedirects = async (
domainRedirects: ShlinkEditDomainRedirects,
): Promise<ShlinkDomainRedirects> =>
this.performRequest<ShlinkDomainRedirects>('/domains/redirects', 'PATCH', {}, domainRedirects).then(({ data }) => data);
private readonly performRequest = async <T>(url: string, method: Method = 'GET', query = {}, body = {}): Promise<AxiosResponse<T>> =>
this.axios({
method,
url: `${buildShlinkBaseUrl(this.baseUrl)}${url}`,
headers: { 'X-Api-Key': this.apiKey },
params: rejectNilProps(query),
data: body,
paramsSerializer: stringifyQuery,
});
}

View File

@@ -1,34 +1,32 @@
import { AxiosInstance } from 'axios';
import { prop } from 'ramda';
import { hasServerData, SelectedServer, ServerWithId } from '../../servers/data';
import { GetState } from '../../container/types';
import { ShlinkApiClient } from './ShlinkApiClient';
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';
const apiClients: Record<string, ShlinkApiClient> = {};
const isGetState = (getStateOrSelectedServer: GetState | ServerWithId): getStateOrSelectedServer is GetState =>
typeof getStateOrSelectedServer === 'function';
const getSelectedServerFromState = (getState: GetState): SelectedServer => prop('selectedServer', getState());
export type ShlinkApiClientBuilder = (getStateOrSelectedServer: GetState | ServerWithId) => ShlinkApiClient;
export const buildShlinkApiClient = (axios: AxiosInstance): ShlinkApiClientBuilder => (
getStateOrSelectedServer: GetState | ServerWithId,
) => {
const server = isGetState(getStateOrSelectedServer)
? getSelectedServerFromState(getStateOrSelectedServer)
: getStateOrSelectedServer;
if (!hasServerData(server)) {
const getSelectedServerFromState = (getState: GetState): ServerWithId => {
const { selectedServer } = getState();
if (!hasServerData(selectedServer)) {
throw new Error('There\'s no selected server or it is not found');
}
const { url, apiKey } = server;
const clientKey = `${url}_${apiKey}`;
if (!apiClients[clientKey]) {
apiClients[clientKey] = new ShlinkApiClient(axios, url, apiKey);
}
return apiClients[clientKey];
return selectedServer;
};
export const buildShlinkApiClient = (httpClient: HttpClient) => (getStateOrSelectedServer: GetState | ServerWithId) => {
const { url: baseUrl, apiKey } = isGetState(getStateOrSelectedServer)
? getSelectedServerFromState(getStateOrSelectedServer)
: getStateOrSelectedServer;
const serverKey = `${apiKey}_${baseUrl}`;
const apiClient = apiClients[serverKey] ?? new ShlinkApiClient(httpClient, { apiKey, baseUrl });
apiClients[serverKey] = apiClient;
return apiClient;
};
export type ShlinkApiClientBuilder = ReturnType<typeof buildShlinkApiClient>;

View File

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

View File

@@ -1,6 +0,0 @@
import { Action } from 'redux';
import { ProblemDetailsError } from './index';
export interface ApiErrorAction extends Action<string> {
errorData?: ProblemDetailsError;
}

View File

@@ -1,122 +0,0 @@
import { Visit } from '../../visits/types';
import { OptionalString } from '../../utils/utils';
import { ShortUrl, ShortUrlMeta, ShortUrlsOrder } from '../../short-urls/data';
export interface ShlinkShortUrlsResponse {
data: ShortUrl[];
pagination: ShlinkPaginator;
}
export interface ShlinkMercureInfo {
token: string;
mercureHubUrl: string;
}
export interface ShlinkHealth {
status: 'pass' | 'fail';
version: string;
}
interface ShlinkTagsStats {
tag: string;
shortUrlsCount: number;
visitsCount: number;
}
export interface ShlinkTags {
tags: string[];
stats: ShlinkTagsStats[];
}
export interface ShlinkTagsResponse {
data: string[];
stats: ShlinkTagsStats[];
}
export interface ShlinkPaginator {
currentPage: number;
pagesCount: number;
totalItems: number;
}
export interface ShlinkVisits {
data: Visit[];
pagination: ShlinkPaginator;
}
export interface ShlinkVisitsOverview {
visitsCount: number;
orphanVisitsCount: number;
}
export interface ShlinkVisitsParams {
domain?: OptionalString;
page?: number;
itemsPerPage?: number;
startDate?: string;
endDate?: string;
excludeBots?: boolean;
}
export interface ShlinkShortUrlData extends ShortUrlMeta {
longUrl?: string;
title?: string;
validateUrl?: boolean;
tags?: string[];
}
export interface ShlinkDomainRedirects {
baseUrlRedirect: string | null;
regular404Redirect: string | null;
invalidShortUrlRedirect: string | null;
}
export interface ShlinkEditDomainRedirects extends Partial<ShlinkDomainRedirects> {
domain: string;
}
export interface ShlinkDomain {
domain: string;
isDefault: boolean;
redirects?: ShlinkDomainRedirects; // Optional only for Shlink older than 2.8
}
export interface ShlinkDomainsResponse {
data: ShlinkDomain[];
defaultRedirects?: ShlinkDomainRedirects; // Optional only for Shlink older than 2.10
}
export type TagsFilteringMode = 'all' | 'any';
export interface ShlinkShortUrlsListParams {
page?: string;
itemsPerPage?: number;
tags?: string[];
searchTerm?: string;
startDate?: string;
endDate?: string;
orderBy?: ShortUrlsOrder;
tagsMode?: TagsFilteringMode;
}
export interface ShlinkShortUrlsListNormalizedParams extends Omit<ShlinkShortUrlsListParams, 'orderBy'> {
orderBy?: string;
}
export interface ProblemDetailsError {
type: string;
detail: string;
title: string;
status: number;
[extraProps: string]: any;
}
export interface InvalidArgumentError extends ProblemDetailsError {
type: 'INVALID_ARGUMENT';
invalidElements: string[];
}
export interface InvalidShortUrlDeletion extends ProblemDetailsError {
type: 'INVALID_SHORTCODE_DELETION' | 'INVALID_SHORT_URL_DELETION';
threshold: number;
}

View File

@@ -1,10 +0,0 @@
import { AxiosError } from 'axios';
import { InvalidArgumentError, InvalidShortUrlDeletion, ProblemDetailsError } from '../types';
export const parseApiError = (e: AxiosError<ProblemDetailsError>) => e.response?.data;
export const isInvalidArgumentError = (error?: ProblemDetailsError): error is InvalidArgumentError =>
error?.type === 'INVALID_ARGUMENT';
export const isInvalidDeletionError = (error?: ProblemDetailsError): error is InvalidShortUrlDeletion =>
error?.type === 'INVALID_SHORTCODE_DELETION' || error?.type === 'INVALID_SHORT_URL_DELETION';

View File

@@ -1,4 +1,4 @@
@import '../utils/base';
@import 'node_modules/@shlinkio/shlink-frontend-kit/dist/base';
.app-container {
height: 100%;

View File

@@ -1,57 +1,79 @@
import { useEffect, FC } from 'react';
import { changeThemeInMarkup, getSystemPreferredTheme } from '@shlinkio/shlink-frontend-kit';
import { clsx } from 'clsx';
import type { FC } from 'react';
import { useEffect, useRef } from 'react';
import { Route, Routes, useLocation } from 'react-router-dom';
import classNames from 'classnames';
import { NotFound } from '../common/NotFound';
import { ServersMap } from '../servers/data';
import { Settings } from '../settings/reducers/settings';
import { changeThemeInMarkup } from '../utils/theme';
import { AppUpdateBanner } from '../common/AppUpdateBanner';
import { NotFound } from '../common/NotFound';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import type { ServersMap } from '../servers/data';
import type { AppSettings } from '../settings/reducers/settings';
import { forceUpdate } from '../utils/helpers/sw';
import './App.scss';
interface AppProps {
type AppProps = {
fetchServers: () => void;
servers: ServersMap;
settings: Settings;
settings: AppSettings;
resetAppUpdate: () => void;
appUpdated: boolean;
}
};
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);
export const App = (
MainHeader: FC,
Home: FC,
MenuLayout: FC,
CreateServer: FC,
EditServer: FC,
SettingsComp: FC,
ManageServers: FC,
ShlinkVersionsContainer: FC,
) => ({ fetchServers, servers, settings, appUpdated, resetAppUpdate }: AppProps) => {
const location = useLocation();
const initialServers = useRef(servers);
const isHome = location.pathname === '/';
useEffect(() => {
// On first load, try to fetch the remote servers if the list is empty
if (Object.keys(servers).length === 0) {
// Try to fetch the remote servers if the list is empty at first
// 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]);
changeThemeInMarkup(settings.ui?.theme ?? 'light');
}, []);
useEffect(() => {
changeThemeInMarkup(settings.ui?.theme ?? getSystemPreferredTheme());
}, [settings.ui?.theme]);
return (
<div className="container-fluid app-container">
<MainHeader />
<div className="app">
<div className={classNames('shlink-wrapper', { 'd-flex d-md-block align-items-center': isHome })}>
<div className={clsx('shlink-wrapper', { 'd-flex d-md-block align-items-center': isHome })}>
<Routes>
<Route index element={<Home />} />
<Route path="/settings/*" element={<SettingsComp />} />
<Route path="/settings/*" element={<Settings />} />
<Route path="/manage-servers" element={<ManageServers />} />
<Route path="/server/create" element={<CreateServer />} />
<Route path="/server/:serverId/edit" element={<EditServer />} />
<Route path="/server/:serverId/*" element={<MenuLayout />} />
<Route path="/server/:serverId/*" element={<ShlinkWebComponentContainer />} />
<Route path="*" element={<NotFound />} />
</Routes>
</div>
@@ -65,3 +87,14 @@ export const App = (
</div>
);
};
export const AppFactory = componentFactory(App, [
'MainHeader',
'Home',
'ShlinkWebComponentContainer',
'CreateServer',
'EditServer',
'Settings',
'ManageServers',
'ShlinkVersionsContainer',
]);

View File

@@ -1,16 +1,14 @@
import { Action } from 'redux';
import { buildActionCreator, buildReducer } from '../../utils/helpers/redux';
import { createSlice } from '@reduxjs/toolkit';
export const APP_UPDATE_AVAILABLE = 'shlink/appUpdates/APP_UPDATE_AVAILABLE';
export const RESET_APP_UPDATE = 'shlink/appUpdates/RESET_APP_UPDATE';
const { actions, reducer } = createSlice({
name: 'shlink/appUpdates',
initialState: false,
reducers: {
appUpdateAvailable: () => true,
resetAppUpdate: () => false,
},
});
const initialState = false;
export const { appUpdateAvailable, resetAppUpdate } = actions;
export default buildReducer<boolean, Action<string>>({
[APP_UPDATE_AVAILABLE]: () => true,
[RESET_APP_UPDATE]: () => false,
}, initialState);
export const appUpdateAvailable = buildActionCreator(APP_UPDATE_AVAILABLE);
export const resetAppUpdate = buildActionCreator(RESET_APP_UPDATE);
export const appUpdatesReducer = reducer;

View File

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

View File

@@ -1,4 +1,4 @@
@import '../utils/base';
@import 'node_modules/@shlinkio/shlink-frontend-kit/dist/base';
@import '../utils/mixins/horizontal-align';
.app-update-banner.app-update-banner {

View File

@@ -1,9 +1,9 @@
import { FC, MouseEventHandler } from 'react';
import { Alert, Button } from 'reactstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faSyncAlt as reloadIcon } from '@fortawesome/free-solid-svg-icons';
import { SimpleCard } from '../utils/SimpleCard';
import { useToggle } from '../utils/helpers/hooks';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { SimpleCard, useToggle } from '@shlinkio/shlink-frontend-kit';
import type { MouseEventHandler } from 'react';
import { forwardRef, useCallback } from 'react';
import { Alert, Button } from 'reactstrap';
import './AppUpdateBanner.scss';
interface AppUpdateBannerProps {
@@ -12,15 +12,15 @@ interface AppUpdateBannerProps {
forceUpdate: Function;
}
export const AppUpdateBanner: FC<AppUpdateBannerProps> = ({ isOpen, toggle, forceUpdate }) => {
export const AppUpdateBanner = forwardRef<HTMLElement, AppUpdateBannerProps>(({ isOpen, toggle, forceUpdate }, ref) => {
const [isUpdating,, setUpdating] = useToggle();
const update = () => {
const update = useCallback(() => {
setUpdating();
forceUpdate();
};
}, [forceUpdate, setUpdating]);
return (
<Alert className="app-update-banner" isOpen={isOpen} toggle={toggle} tag={SimpleCard} color="secondary">
<Alert className="app-update-banner" isOpen={isOpen} toggle={toggle} tag={SimpleCard} color="secondary" innerRef={ref}>
<h4 className="mb-4">This app has just been updated!</h4>
<p className="mb-0">
Restart it to enjoy the new features.
@@ -31,4 +31,4 @@ export const AppUpdateBanner: FC<AppUpdateBannerProps> = ({ isOpen, toggle, forc
</p>
</Alert>
);
};
});

View File

@@ -1,81 +0,0 @@
@import '../utils/base';
@import '../utils/mixins/vertical-align';
.aside-menu {
width: $asideMenuWidth;
background-color: var(--primary-color);
box-shadow: rgb(0 0 0 / .05) 0 8px 15px;
position: fixed !important;
padding-top: 13px;
padding-bottom: 10px;
top: $headerHeight;
bottom: 0;
left: 0;
display: block;
z-index: 1010;
overflow-x: hidden;
overflow-y: auto;
@media (min-width: $mdMin) {
padding: 30px 15px 15px;
}
@media (max-width: $smMax) {
transition: left 300ms;
top: $headerHeight - 3px;
box-shadow: -10px 0 50px 11px rgb(0 0 0 / .55);
}
}
.aside-menu--hidden {
@media (max-width: $smMax) {
left: -($asideMenuWidth + 35px);
}
}
.aside-menu__nav {
height: 100%;
}
.aside-menu__item {
padding: 10px 20px;
margin: 0 -15px;
text-decoration: none !important;
cursor: pointer;
@media (max-width: $smMax) {
margin: 0;
}
}
.aside-menu__item:hover {
background-color: var(--secondary-color);
}
.aside-menu__item--selected,
.aside-menu__item--selected:hover {
color: #ffffff;
background-color: var(--brand-color);
}
.aside-menu__item--divider {
border-bottom: 1px solid #eeeeee;
margin: 20px 0;
}
.aside-menu__item--danger {
color: $dangerColor;
}
.aside-menu__item--push {
margin-top: auto;
}
.aside-menu__item--danger:hover {
color: #ffffff;
background-color: $dangerColor;
}
.aside-menu__item-text {
margin-left: 8px;
}

View File

@@ -1,91 +0,0 @@
import {
faList as listIcon,
faLink as createIcon,
faTags as tagsIcon,
faPen as editIcon,
faHome as overviewIcon,
faGlobe as domainsIcon,
} from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { FC } from 'react';
import { NavLink, NavLinkProps, useLocation } from 'react-router-dom';
import classNames from 'classnames';
import { DeleteServerButtonProps } from '../servers/DeleteServerButton';
import { isServerWithId, SelectedServer } from '../servers/data';
import { supportsDomainRedirects } from '../utils/helpers/features';
import './AsideMenu.scss';
export interface AsideMenuProps {
selectedServer: SelectedServer;
showOnMobile?: boolean;
}
interface AsideMenuItemProps extends NavLinkProps {
to: string;
}
const AsideMenuItem: FC<AsideMenuItemProps> = ({ children, to, className, ...rest }) => (
<NavLink
className={({ isActive }) => classNames('aside-menu__item', className, { 'aside-menu__item--selected': isActive })}
to={to}
{...rest}
>
{children}
</NavLink>
);
export const AsideMenu = (DeleteServerButton: FC<DeleteServerButtonProps>) => (
{ selectedServer, showOnMobile = false }: AsideMenuProps,
) => {
const hasId = isServerWithId(selectedServer);
const serverId = hasId ? selectedServer.id : '';
const { pathname } = useLocation();
const addManageDomainsLink = supportsDomainRedirects(selectedServer);
const asideClass = classNames('aside-menu', {
'aside-menu--hidden': !showOnMobile,
});
const buildPath = (suffix: string) => `/server/${serverId}${suffix}`;
return (
<aside className={asideClass}>
<nav className="nav flex-column aside-menu__nav">
<AsideMenuItem to={buildPath('/overview')}>
<FontAwesomeIcon fixedWidth icon={overviewIcon} />
<span className="aside-menu__item-text">Overview</span>
</AsideMenuItem>
<AsideMenuItem
to={buildPath('/list-short-urls/1')}
className={classNames({ 'aside-menu__item--selected': pathname.match('/list-short-urls') !== null })}
>
<FontAwesomeIcon fixedWidth icon={listIcon} />
<span className="aside-menu__item-text">List short URLs</span>
</AsideMenuItem>
<AsideMenuItem to={buildPath('/create-short-url')}>
<FontAwesomeIcon fixedWidth icon={createIcon} flip="horizontal" />
<span className="aside-menu__item-text">Create short URL</span>
</AsideMenuItem>
<AsideMenuItem to={buildPath('/manage-tags')}>
<FontAwesomeIcon fixedWidth icon={tagsIcon} />
<span className="aside-menu__item-text">Manage tags</span>
</AsideMenuItem>
{addManageDomainsLink && (
<AsideMenuItem to={buildPath('/manage-domains')}>
<FontAwesomeIcon fixedWidth icon={domainsIcon} />
<span className="aside-menu__item-text">Manage domains</span>
</AsideMenuItem>
)}
<AsideMenuItem to={buildPath('/edit')} className="aside-menu__item--push">
<FontAwesomeIcon fixedWidth icon={editIcon} />
<span className="aside-menu__item-text">Edit this server</span>
</AsideMenuItem>
{hasId && (
<DeleteServerButton
className="aside-menu__item aside-menu__item--danger"
textClassName="aside-menu__item-text"
server={selectedServer}
/>
)}
</nav>
</aside>
);
};

View File

@@ -1,16 +1,19 @@
import { Component, ReactNode } from 'react';
import { SimpleCard } from '@shlinkio/shlink-frontend-kit';
import type { PropsWithChildren, ReactNode } from 'react';
import { Component } from 'react';
import { Button } from 'reactstrap';
import { SimpleCard } from '../utils/SimpleCard';
interface ErrorHandlerState {
type ErrorHandlerProps = PropsWithChildren<{
location?: typeof window.location;
console?: typeof window.console;
}>;
type ErrorHandlerState = {
hasError: boolean;
}
};
export const ErrorHandler = (
{ location }: Window,
{ error }: Console,
) => class extends Component<any, ErrorHandlerState> {
public constructor(props: object) {
export class ErrorHandler extends Component<ErrorHandlerProps, ErrorHandlerState> {
public constructor(props: ErrorHandlerProps) {
super(props);
this.state = { hasError: false };
}
@@ -20,13 +23,14 @@ export const ErrorHandler = (
}
public componentDidCatch(e: Error): void {
if (process.env.NODE_ENV !== 'development') {
error(e);
}
const { console = globalThis.console } = this.props;
console.error(e);
}
public render(): ReactNode {
const { hasError } = this.state;
const { location = globalThis.location } = this.props;
if (hasError) {
return (
<div className="home">
@@ -43,4 +47,4 @@ export const ErrorHandler = (
const { children } = this.props;
return children;
}
};
}

View File

@@ -1,4 +1,4 @@
@import '../utils/base';
@import 'node_modules/@shlinkio/shlink-frontend-kit/dist/base';
@import '../utils/mixins/vertical-align';
$mainCardWidth: 720px;

View File

@@ -1,12 +1,11 @@
import { faExternalLinkAlt, faPlus } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { useEffect } from 'react';
import { isEmpty, values } from 'ramda';
import { ExternalLink } from 'react-external-link';
import { Link, useNavigate } from 'react-router-dom';
import { Card, Row } from 'reactstrap';
import { ExternalLink } from 'react-external-link';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faExternalLinkAlt, faPlus } from '@fortawesome/free-solid-svg-icons';
import type { ServersMap } from '../servers/data';
import { ServersListGroup } from '../servers/ServersListGroup';
import { ServersMap } from '../servers/data';
import { ShlinkLogo } from './img/ShlinkLogo';
import './Home.scss';
@@ -16,14 +15,14 @@ interface HomeProps {
export const Home = ({ servers }: HomeProps) => {
const navigate = useNavigate();
const serversList = values(servers);
const hasServers = !isEmpty(serversList);
const serversList = Object.values(servers);
const hasServers = serversList.length > 0;
useEffect(() => {
// Try to redirect to the first server marked as auto-connect
const autoConnectServer = serversList.find(({ autoConnect }) => autoConnect);
autoConnectServer && navigate(`/server/${autoConnectServer.id}`);
}, []);
}, [serversList, navigate]);
return (
<div className="home">

View File

@@ -1,4 +1,4 @@
@import '../utils/base';
@import 'node_modules/@shlinkio/shlink-frontend-kit/dist/base';
.main-header.main-header {
color: white;

View File

@@ -1,22 +1,31 @@
import { faChevronDown as arrowIcon, faCogs as cogsIcon } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { FC, useEffect } from 'react';
import { useToggle } from '@shlinkio/shlink-frontend-kit';
import { clsx } from 'clsx';
import type { FC } from 'react';
import { useEffect } from 'react';
import { Link, useLocation } from 'react-router-dom';
import { Collapse, Nav, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap';
import classNames from 'classnames';
import { useToggle } from '../utils/helpers/hooks';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import { ShlinkLogo } from './img/ShlinkLogo';
import './MainHeader.scss';
export const MainHeader = (ServersDropdown: FC) => () => {
const [isOpen, toggleOpen, , close] = useToggle();
type MainHeaderDeps = {
ServersDropdown: FC;
};
const MainHeader: FCWithDeps<{}, MainHeaderDeps> = () => {
const { ServersDropdown } = useDependencies(MainHeader);
const [isNotCollapsed, toggleCollapse, , collapse] = useToggle();
const location = useLocation();
const { pathname } = location;
useEffect(close, [location]);
// In mobile devices, collapse the navbar when location changes
useEffect(collapse, [location, collapse]);
const settingsPath = '/settings';
const toggleClass = classNames('main-header__toggle-icon', { 'main-header__toggle-icon--opened': isOpen });
const toggleClass = clsx('main-header__toggle-icon', { 'main-header__toggle-icon--opened': isNotCollapsed });
return (
<Navbar color="primary" dark fixed="top" className="main-header" expand="md">
@@ -24,11 +33,11 @@ export const MainHeader = (ServersDropdown: FC) => () => {
<ShlinkLogo className="main-header__brand-logo" color="white" /> Shlink
</NavbarBrand>
<NavbarToggler onClick={toggleOpen}>
<NavbarToggler onClick={toggleCollapse}>
<FontAwesomeIcon icon={arrowIcon} className={toggleClass} />
</NavbarToggler>
<Collapse navbar isOpen={isOpen}>
<Collapse navbar isOpen={isNotCollapsed}>
<Nav navbar className="ms-auto">
<NavItem>
<NavLink tag={Link} to={settingsPath} active={pathname.startsWith(settingsPath)}>
@@ -41,3 +50,5 @@ export const MainHeader = (ServersDropdown: FC) => () => {
</Navbar>
);
};
export const MainHeaderFactory = componentFactory(MainHeader, ['ServersDropdown']);

View File

@@ -1,37 +0,0 @@
@import '../utils/base';
.menu-layout__swipeable {
height: 100%;
}
.menu-layout__swipeable-inner {
height: 100%;
}
.menu-layout__burger-icon {
display: none;
transition: color 300ms;
position: fixed;
top: 18px;
z-index: 1035;
font-size: 1.5rem;
cursor: pointer;
color: rgb(255 255 255 / .5);
@media (max-width: $smMax) {
display: inline-block;
}
}
.menu-layout__burger-icon--active {
color: white;
}
.menu-layout__container.menu-layout__container {
padding: 20px 0 0;
min-height: 100%;
@media (min-width: $mdMin) {
padding: 30px 0 0 $asideMenuWidth;
}
}

View File

@@ -1,88 +0,0 @@
import { FC, useEffect } from 'react';
import { Navigate, Route, Routes, useLocation } from 'react-router-dom';
import { faBars as burgerIcon } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import classNames from 'classnames';
import { withSelectedServer } from '../servers/helpers/withSelectedServer';
import { useSwipeable, useToggle } from '../utils/helpers/hooks';
import { supportsDomainRedirects, supportsDomainVisits, supportsNonOrphanVisits } from '../utils/helpers/features';
import { isReachableServer } from '../servers/data';
import { NotFound } from './NotFound';
import { AsideMenuProps } from './AsideMenu';
import './MenuLayout.scss';
interface MenuLayoutProps {
sidebarPresent: Function;
sidebarNotPresent: Function;
}
export const MenuLayout = (
TagsList: FC,
ShortUrlsList: FC,
AsideMenu: FC<AsideMenuProps>,
CreateShortUrl: FC,
ShortUrlVisits: FC,
TagVisits: FC,
DomainVisits: FC,
OrphanVisits: FC,
NonOrphanVisits: FC,
ServerError: FC,
Overview: FC,
EditShortUrl: FC,
ManageDomains: FC,
) => withSelectedServer<MenuLayoutProps>(({ selectedServer, sidebarNotPresent, sidebarPresent }) => {
const location = useLocation();
const [sidebarVisible, toggleSidebar, showSidebar, hideSidebar] = useToggle();
const showContent = isReachableServer(selectedServer);
useEffect(() => hideSidebar(), [location]);
useEffect(() => {
showContent && sidebarPresent();
return () => sidebarNotPresent();
}, []);
if (!showContent) {
return <ServerError />;
}
const addNonOrphanVisitsRoute = supportsNonOrphanVisits(selectedServer);
const addManageDomainsRoute = supportsDomainRedirects(selectedServer);
const addDomainVisitsRoute = supportsDomainVisits(selectedServer);
const burgerClasses = classNames('menu-layout__burger-icon', { 'menu-layout__burger-icon--active': sidebarVisible });
const swipeableProps = useSwipeable(showSidebar, hideSidebar);
return (
<>
<FontAwesomeIcon icon={burgerIcon} className={burgerClasses} onClick={toggleSidebar} />
<div {...swipeableProps} className="menu-layout__swipeable">
<div className="menu-layout__swipeable-inner">
<AsideMenu selectedServer={selectedServer} showOnMobile={sidebarVisible} />
<div className="menu-layout__container" onClick={() => hideSidebar()}>
<div className="container-xl">
<Routes>
<Route index element={<Navigate replace to="overview" />} />
<Route path="/overview" element={<Overview />} />
<Route path="/list-short-urls/:page" element={<ShortUrlsList />} />
<Route path="/create-short-url" element={<CreateShortUrl />} />
<Route path="/short-code/:shortCode/visits/*" element={<ShortUrlVisits />} />
<Route path="/short-code/:shortCode/edit" element={<EditShortUrl />} />
<Route path="/tag/:tag/visits/*" element={<TagVisits />} />
{addDomainVisitsRoute && <Route path="/domain/:domain/visits/*" element={<DomainVisits />} />}
<Route path="/orphan-visits/*" element={<OrphanVisits />} />
{addNonOrphanVisitsRoute && <Route path="/non-orphan-visits/*" element={<NonOrphanVisits />} />}
<Route path="/manage-tags" element={<TagsList />} />
{addManageDomainsRoute && <Route path="/manage-domains" element={<ManageDomains />} />}
<Route
path="*"
element={<NotFound to={`/server/${selectedServer.id}/list-short-urls/1`}>List short URLs</NotFound>}
/>
</Routes>
</div>
</div>
</div>
</div>
</>
);
}, ServerError);

View File

@@ -1,4 +1,4 @@
@import '../utils/base';
@import 'node_modules/@shlinkio/shlink-frontend-kit/dist/base';
.no-menu-wrapper {
padding: 15px 0 0;

View File

@@ -1,4 +1,4 @@
import { FC, PropsWithChildren } from 'react';
import type { FC, PropsWithChildren } from 'react';
import './NoMenuLayout.scss';
export const NoMenuLayout: FC<PropsWithChildren<unknown>> = ({ children }) => (

View File

@@ -1,6 +1,6 @@
import { FC, PropsWithChildren } from 'react';
import { SimpleCard } from '@shlinkio/shlink-frontend-kit';
import type { FC, PropsWithChildren } from 'react';
import { Link } from 'react-router-dom';
import { SimpleCard } from '../utils/SimpleCard';
type NotFoundProps = PropsWithChildren<{ to?: string }>;

View File

@@ -1,7 +1,8 @@
import { FC, PropsWithChildren, useEffect } from 'react';
import type { FC, PropsWithChildren } from 'react';
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
export const ScrollToTop: FC<PropsWithChildren<unknown>> = ({ children }) => {
export const ScrollToTop: FC<PropsWithChildren> = ({ children }) => {
const location = useLocation();
useEffect(() => {

View File

@@ -1,10 +1,10 @@
import { pipe } from 'ramda';
import { ExternalLink } from 'react-external-link';
import type { SelectedServer } from '../servers/data';
import { isReachableServer } from '../servers/data';
import { versionToPrintable, versionToSemVer } from '../utils/helpers/version';
import { isReachableServer, SelectedServer } from '../servers/data';
const SHLINK_WEB_CLIENT_VERSION = '%_VERSION_%';
const normalizeVersion = pipe(versionToSemVer(), versionToPrintable);
const normalizeVersion = (version: string) => versionToPrintable(versionToSemVer(version));
export interface ShlinkVersionsProps {
selectedServer: SelectedServer;

View File

@@ -1,4 +1,4 @@
@import '../utils/base';
@import 'node_modules/@shlinkio/shlink-frontend-kit/dist/base';
.shlink-versions-container--with-sidebar {
margin-left: 0;

View File

@@ -1,17 +1,22 @@
import classNames from 'classnames';
import { SelectedServer } from '../servers/data';
import { clsx } from 'clsx';
import { useMemo } from 'react';
import { useLocation } from 'react-router-dom';
import type { SelectedServer } from '../servers/data';
import { ShlinkVersions } from './ShlinkVersions';
import { Sidebar } from './reducers/sidebar';
import './ShlinkVersionsContainer.scss';
export interface ShlinkVersionsContainerProps {
export type ShlinkVersionsContainerProps = {
selectedServer: SelectedServer;
sidebar: Sidebar;
}
};
export const ShlinkVersionsContainer = ({ selectedServer, sidebar }: ShlinkVersionsContainerProps) => {
const classes = classNames('text-center', {
'shlink-versions-container--with-sidebar': sidebar.sidebarPresent,
const SHLINK_CONTAINER_PATH_PATTERN = /^\/server\/[a-zA-Z0-9-]*\/(?!edit)/;
export const ShlinkVersionsContainer = ({ selectedServer }: ShlinkVersionsContainerProps) => {
const { pathname } = useLocation();
const withPadding = useMemo(() => SHLINK_CONTAINER_PATH_PATTERN.test(pathname), [pathname]);
const classes = clsx('text-center', {
'shlink-versions-container--with-sidebar': withPadding,
});
return (

View File

@@ -0,0 +1,62 @@
import type { Settings, ShlinkWebComponentType, TagColorsStorage } 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 { isReachableServer } from '../servers/data';
import type { WithSelectedServerProps } from '../servers/helpers/withSelectedServer';
import { withSelectedServer } from '../servers/helpers/withSelectedServer';
import { NotFound } from './NotFound';
type ShlinkWebComponentContainerProps = WithSelectedServerProps & {
settings: Settings;
};
type ShlinkWebComponentContainerDeps = {
buildShlinkApiClient: ShlinkApiClientBuilder,
TagColorsStorage: TagColorsStorage,
ShlinkWebComponent: ShlinkWebComponentType,
ServerError: FC,
};
const ShlinkWebComponentContainer: FCWithDeps<
ShlinkWebComponentContainerProps,
ShlinkWebComponentContainerDeps
// 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);
if (!isReachableServer(selectedServer)) {
return <ServerError />;
}
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>
)}
/>
);
}));
export const ShlinkWebComponentContainerFactory = componentFactory(ShlinkWebComponentContainer, [
'buildShlinkApiClient',
'TagColorsStorage',
'ShlinkWebComponent',
'ServerError',
]);

View File

@@ -1,3 +0,0 @@
.simple-paginator {
user-select: none;
}

View File

@@ -1,50 +0,0 @@
import { FC } from 'react';
import classNames from 'classnames';
import { Pagination, PaginationItem, PaginationLink } from 'reactstrap';
import {
pageIsEllipsis,
keyForPage,
NumberOrEllipsis,
progressivePagination,
prettifyPageNumber,
} from '../utils/helpers/pagination';
import './SimplePaginator.scss';
interface SimplePaginatorProps {
pagesCount: number;
currentPage: number;
setCurrentPage: (currentPage: number) => void;
centered?: boolean;
}
export const SimplePaginator: FC<SimplePaginatorProps> = (
{ pagesCount, currentPage, setCurrentPage, centered = true },
) => {
if (pagesCount < 2) {
return null;
}
const onClick = (page: NumberOrEllipsis) => () => !pageIsEllipsis(page) && setCurrentPage(page);
return (
<Pagination listClassName={classNames('flex-wrap mb-0 simple-paginator', { 'justify-content-center': centered })}>
<PaginationItem disabled={currentPage <= 1}>
<PaginationLink previous tag="span" onClick={onClick(currentPage - 1)} />
</PaginationItem>
{progressivePagination(currentPage, pagesCount).map((pageNumber, index) => (
<PaginationItem
key={keyForPage(pageNumber, index)}
disabled={pageIsEllipsis(pageNumber)}
active={currentPage === pageNumber}
>
<PaginationLink role="link" tag="span" onClick={onClick(pageNumber)}>
{prettifyPageNumber(pageNumber)}
</PaginationLink>
</PaginationItem>
))}
<PaginationItem disabled={currentPage >= pagesCount}>
<PaginationLink next tag="span" onClick={onClick(currentPage + 1)} />
</PaginationItem>
</Pagination>
);
};

View File

@@ -1,4 +1,4 @@
import { MAIN_COLOR } from '../../utils/theme';
import { MAIN_COLOR } from '@shlinkio/shlink-frontend-kit';
export interface ShlinkLogoProps {
color?: string;

View File

@@ -1,159 +0,0 @@
@import '../utils/base';
.react-tags {
position: relative;
padding: 5px 0 0 6px;
border-radius: .3rem;
background-color: var(--primary-color);
border: 1px solid var(--input-border-color);
transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;
/* shared font styles */
font-size: 1em;
line-height: 1.2;
/* clicking anywhere will focus the input */
cursor: text;
}
.input-group > .react-tags {
flex: 1 1 auto;
width: 1%;
min-width: 0;
}
.card .react-tags {
background-color: var(--input-color);
}
.react-tags.is-focused {
box-shadow: 0 0 0 .2rem rgb(70 150 229 / 25%);
}
.react-tags__tag {
font-size: 100%;
}
.react-tags__selected {
display: inline;
vertical-align: 2px;
}
.react-tags__selected-tag {
display: inline-block;
box-sizing: border-box;
margin: 0 6px 6px 0;
padding: 6px 8px;
border: 1px solid var(--input-border-color);
border-radius: .25rem;
background: #f1f1f1;
/* match the font styles */
font-size: inherit;
line-height: inherit;
}
.react-tags__selected-tag:after {
content: '\2715';
color: #aaaaaa;
margin-left: 8px;
}
.react-tags__selected-tag:hover,
.react-tags__selected-tag:focus {
border-color: var(--input-border-color);
}
.react-tags__search {
display: inline-block;
/* match tag layout */
padding: 6px 2px;
margin-bottom: 5px;
/* prevent autoresize overflowing the container */
max-width: 100%;
}
@media screen and (min-width: $smMin) {
.react-tags__search {
/* this will become the offsetParent for suggestions */
position: relative;
}
}
.react-tags__search-input {
font-size: 1.25rem;
line-height: inherit;
color: var(--input-text-color);
background-color: inherit;
/* prevent autoresize overflowing the container */
max-width: 100%;
/* remove styles and layout from this element */
margin: 0 0 0 7px;
padding: 0;
border: 0;
outline: none;
}
.react-tags__search-input::placeholder {
color: #6c757d;
}
.react-tags__search-input::-ms-clear {
display: none;
}
.react-tags__suggestions {
position: absolute;
top: 100%;
left: 0;
width: 100%;
z-index: 10;
}
@media screen and (min-width: $smMin) {
.react-tags__suggestions {
width: 240px;
}
}
.react-tags__suggestions ul {
margin: 4px -1px;
padding: 0;
list-style: none;
background: var(--primary-color);
border: 1px solid var(--border-color);
border-radius: .25rem;
box-shadow: 0 2px 6px rgb(0 0 0 / .2);
}
.react-tags__suggestions li {
padding: 8px 10px;
}
.react-tags__suggestions li:not(:last-child) {
border-bottom: 1px solid var(--border-color);
}
.react-tags__suggestions li mark {
text-decoration: underline;
background: none;
font-weight: 600;
}
.react-tags__suggestions li:hover {
cursor: pointer;
background-color: var(--active-color);
}
.react-tags__suggestions li.is-active {
background-color: var(--active-color);
}
.react-tags__suggestions li.is-disabled {
opacity: .5;
cursor: auto;
}

View File

@@ -1,25 +0,0 @@
import { Action } from 'redux';
import { buildActionCreator, buildReducer } from '../../utils/helpers/redux';
export const SIDEBAR_PRESENT = 'shlink/common/SIDEBAR_PRESENT';
export const SIDEBAR_NOT_PRESENT = 'shlink/common/SIDEBAR_NOT_PRESENT';
export interface Sidebar {
sidebarPresent: boolean;
}
type SidebarRenderedAction = Action<string>;
type SidebarNotRenderedAction = Action<string>;
const initialState: Sidebar = {
sidebarPresent: false,
};
export default buildReducer<Sidebar, SidebarRenderedAction & SidebarNotRenderedAction>({
[SIDEBAR_PRESENT]: () => ({ sidebarPresent: true }),
[SIDEBAR_NOT_PRESENT]: () => ({ sidebarPresent: false }),
}, initialState);
export const sidebarPresent = buildActionCreator(SIDEBAR_PRESENT);
export const sidebarNotPresent = buildActionCreator(SIDEBAR_NOT_PRESENT);

View File

@@ -1,13 +0,0 @@
import { AxiosInstance } from 'axios';
import { saveUrl } from '../../utils/helpers/files';
export class ImageDownloader {
public constructor(private readonly axios: AxiosInstance, private readonly window: Window) {}
public async saveImage(imgUrl: string, filename: string): Promise<void> {
const { data } = await this.axios.get(imgUrl, { responseType: 'blob' });
const url = URL.createObjectURL(data);
saveUrl(this.window, url, filename);
}
}

View File

@@ -1,30 +0,0 @@
import { NormalizedVisit } from '../../visits/types';
import { ExportableShortUrl } from '../../short-urls/data';
import { saveCsv } from '../../utils/helpers/files';
import { JsonToCsv } from '../../utils/helpers/csvjson';
export class ReportExporter {
public constructor(private readonly window: Window, private readonly jsonToCsv: JsonToCsv) {}
public readonly exportVisits = (filename: string, visits: NormalizedVisit[]) => {
if (!visits.length) {
return;
}
this.exportCsv(filename, visits);
};
public readonly exportShortUrls = (shortUrls: ExportableShortUrl[]) => {
if (!shortUrls.length) {
return;
}
this.exportCsv('short_urls.csv', shortUrls);
};
private readonly exportCsv = (filename: string, rows: object[]) => {
const csv = this.jsonToCsv(rows);
saveCsv(this.window, csv, filename);
};
}

View File

@@ -1,65 +1,37 @@
import axios from 'axios';
import Bottle from 'bottlejs';
import { ScrollToTop } from '../ScrollToTop';
import { MainHeader } from '../MainHeader';
import { Home } from '../Home';
import { MenuLayout } from '../MenuLayout';
import { AsideMenu } from '../AsideMenu';
import { ErrorHandler } from '../ErrorHandler';
import { ShlinkVersionsContainer } from '../ShlinkVersionsContainer';
import { ConnectDecorator } from '../../container/types';
import { FetchHttpClient } from '@shlinkio/shlink-js-sdk/browser';
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 { sidebarNotPresent, sidebarPresent } from '../reducers/sidebar';
import { ImageDownloader } from './ImageDownloader';
import { ReportExporter } from './ReportExporter';
import { ErrorHandler } from '../ErrorHandler';
import { Home } from '../Home';
import { MainHeaderFactory } from '../MainHeader';
import { ScrollToTop } from '../ScrollToTop';
import { ShlinkVersionsContainer } from '../ShlinkVersionsContainer';
import { ShlinkWebComponentContainerFactory } from '../ShlinkWebComponentContainer';
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
export const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
// Services
bottle.constant('window', (global as any).window);
bottle.constant('console', global.console);
bottle.constant('axios', axios);
bottle.service('ImageDownloader', ImageDownloader, 'axios', 'window');
bottle.service('ReportExporter', ReportExporter, 'window', 'jsonToCsv');
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.serviceFactory('MainHeader', MainHeader, 'ServersDropdown');
bottle.factory('MainHeader', MainHeaderFactory);
bottle.serviceFactory('Home', () => Home);
bottle.decorator('Home', withoutSelectedServer);
bottle.decorator('Home', connect(['servers'], ['resetSelectedServer']));
bottle.serviceFactory(
'MenuLayout',
MenuLayout,
'TagsList',
'ShortUrlsList',
'AsideMenu',
'CreateShortUrl',
'ShortUrlVisits',
'TagVisits',
'DomainVisits',
'OrphanVisits',
'NonOrphanVisits',
'ServerError',
'Overview',
'EditShortUrl',
'ManageDomains',
);
bottle.decorator('MenuLayout', connect(['selectedServer'], ['selectServer', 'sidebarPresent', 'sidebarNotPresent']));
bottle.serviceFactory('AsideMenu', AsideMenu, 'DeleteServerButton');
bottle.serviceFactory('ShlinkWebComponent', () => ShlinkWebComponent);
bottle.factory('ShlinkWebComponentContainer', ShlinkWebComponentContainerFactory);
bottle.decorator('ShlinkWebComponentContainer', connect(['selectedServer', 'settings'], ['selectServer']));
bottle.serviceFactory('ShlinkVersionsContainer', () => ShlinkVersionsContainer);
bottle.decorator('ShlinkVersionsContainer', connect(['selectedServer', 'sidebar']));
bottle.decorator('ShlinkVersionsContainer', connect(['selectedServer']));
bottle.serviceFactory('ErrorHandler', ErrorHandler, 'window', 'console');
// Actions
bottle.serviceFactory('sidebarPresent', () => sidebarPresent);
bottle.serviceFactory('sidebarNotPresent', () => sidebarNotPresent);
bottle.serviceFactory('ErrorHandler', () => ErrorHandler);
};
export default provideServices;

View File

@@ -1,18 +1,13 @@
import Bottle, { IContainer } from 'bottlejs';
import type { IContainer } from 'bottlejs';
import Bottle from 'bottlejs';
import { connect as reduxConnect } from 'react-redux';
import { pick } from 'ramda';
import provideApiServices from '../api/services/provideServices';
import provideCommonServices from '../common/services/provideServices';
import provideShortUrlsServices from '../short-urls/services/provideServices';
import provideServersServices from '../servers/services/provideServices';
import provideVisitsServices from '../visits/services/provideServices';
import provideTagsServices from '../tags/services/provideServices';
import provideUtilsServices from '../utils/services/provideServices';
import provideMercureServices from '../mercure/services/provideServices';
import provideSettingsServices from '../settings/services/provideServices';
import provideDomainsServices from '../domains/services/provideServices';
import provideAppServices from '../app/services/provideServices';
import { ConnectDecorator } from './types';
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, Function>;
@@ -22,25 +17,26 @@ export const { container } = bottle;
const lazyService = <T extends Function, K>(cont: IContainer, serviceName: string) =>
(...args: any[]) => (cont[serviceName] as T)(...args) as K;
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),
});
const pickProps = (propsToPick: string[]) => (obj: any) => Object.fromEntries(
propsToPick.map((key) => [key, obj[key]]),
);
const connect: ConnectDecorator = (propsFromState: string[] | null, actionServiceNames: string[] = []) =>
reduxConnect(
propsFromState ? pick(propsFromState) : null,
propsFromState ? pickProps(propsFromState) : null,
actionServiceNames.reduce(mapActionService, {}),
);
provideAppServices(bottle, connect);
provideCommonServices(bottle, connect);
provideApiServices(bottle);
provideShortUrlsServices(bottle, connect);
provideServersServices(bottle, connect);
provideTagsServices(bottle, connect);
provideVisitsServices(bottle, connect);
provideUtilsServices(bottle);
provideMercureServices(bottle);
provideSettingsServices(bottle, connect);
provideDomainsServices(bottle, connect);

View File

@@ -1,14 +1,12 @@
import ReduxThunk from 'redux-thunk';
import { applyMiddleware, compose, createStore } from 'redux';
import { save, load, RLSOptions } from 'redux-localstorage-simple';
import reducers from '../reducers';
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 { ShlinkState } from './types';
import type { ShlinkState } from './types';
const isProduction = process.env.NODE_ENV === 'production';
// eslint-disable-next-line no-mixed-operators
const composeEnhancers: Function = !isProduction && (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const localStorageConfig: RLSOptions = {
states: ['settings', 'servers'],
namespace: 'shlink',
@@ -17,6 +15,11 @@ const localStorageConfig: RLSOptions = {
};
const preloadedState = migrateDeprecatedSettings(load(localStorageConfig) as ShlinkState);
export const store = createStore(reducers, preloadedState, composeEnhancers(
applyMiddleware(save(localStorageConfig), ReduxThunk),
));
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,44 +1,11 @@
import { MercureInfo } from '../mercure/reducers/mercureInfo';
import { SelectedServer, ServersMap } from '../servers/data';
import { Settings } from '../settings/reducers/settings';
import { ShortUrlCreation } from '../short-urls/reducers/shortUrlCreation';
import { ShortUrlDeletion } from '../short-urls/reducers/shortUrlDeletion';
import { ShortUrlEdition } from '../short-urls/reducers/shortUrlEdition';
import { ShortUrlsList } from '../short-urls/reducers/shortUrlsList';
import { TagDeletion } from '../tags/reducers/tagDelete';
import { TagEdition } from '../tags/reducers/tagEdit';
import { TagsList } from '../tags/reducers/tagsList';
import { ShortUrlDetail } from '../short-urls/reducers/shortUrlDetail';
import { ShortUrlVisits } from '../visits/reducers/shortUrlVisits';
import { TagVisits } from '../visits/reducers/tagVisits';
import { DomainsList } from '../domains/reducers/domainsList';
import { VisitsOverview } from '../visits/reducers/visitsOverview';
import { VisitsInfo } from '../visits/types';
import { Sidebar } from '../common/reducers/sidebar';
import { DomainVisits } from '../visits/reducers/domainVisits';
import type { Settings } from '@shlinkio/shlink-web-component';
import type { SelectedServer, ServersMap } from '../servers/data';
export interface ShlinkState {
servers: ServersMap;
selectedServer: SelectedServer;
shortUrlsList: ShortUrlsList;
shortUrlCreationResult: ShortUrlCreation;
shortUrlDeletion: ShortUrlDeletion;
shortUrlEdition: ShortUrlEdition;
shortUrlVisits: ShortUrlVisits;
tagVisits: TagVisits;
domainVisits: DomainVisits;
orphanVisits: VisitsInfo;
nonOrphanVisits: VisitsInfo;
shortUrlDetail: ShortUrlDetail;
tagsList: TagsList;
tagDelete: TagDeletion;
tagEdit: TagEdition;
mercureInfo: MercureInfo;
settings: Settings;
domainsList: DomainsList;
visitsOverview: VisitsOverview;
appUpdated: boolean;
sidebar: Sidebar;
}
export type ConnectDecorator = (props: string[] | null, actions?: string[]) => any;

29
src/container/utils.ts Normal file
View File

@@ -0,0 +1,29 @@
import type { IContainer } from 'bottlejs';
import type { FC } from 'react';
import { useRef } from 'react';
export type FCWithDeps<Props, Deps> = FC<Props> & Partial<Deps>;
export function useDependencies<Deps>(obj: Deps): Omit<Required<Deps>, keyof FC> {
const depsRef = useRef(obj as Omit<Required<Deps>, keyof FC>);
return depsRef.current;
}
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`);
}
// eslint-disable-next-line no-param-reassign
Component[dep] = resolvedDependency;
});
return Component;
};
}

View File

@@ -1,63 +0,0 @@
import { FC, useEffect } from 'react';
import { UncontrolledTooltip } from 'reactstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faDotCircle as defaultDomainIcon } from '@fortawesome/free-solid-svg-icons';
import { ShlinkDomainRedirects } from '../api/types';
import { OptionalString } from '../utils/utils';
import { SelectedServer } from '../servers/data';
import { Domain } from './data';
import { DomainStatusIcon } from './helpers/DomainStatusIcon';
import { DomainDropdown } from './helpers/DomainDropdown';
interface DomainRowProps {
domain: Domain;
defaultRedirects?: ShlinkDomainRedirects;
editDomainRedirects: (domain: string, redirects: Partial<ShlinkDomainRedirects>) => Promise<void>;
checkDomainHealth: (domain: string) => void;
selectedServer: SelectedServer;
}
const Nr: FC<{ fallback: OptionalString }> = ({ fallback }) => (
<span className="text-muted">
{!fallback && <small>No redirect</small>}
{fallback && <>{fallback} <small>(as fallback)</small></>}
</span>
);
const DefaultDomain: FC = () => (
<>
<FontAwesomeIcon fixedWidth icon={defaultDomainIcon} className="text-primary" id="defaultDomainIcon" />
<UncontrolledTooltip target="defaultDomainIcon" placement="right">Default domain</UncontrolledTooltip>
</>
);
export const DomainRow: FC<DomainRowProps> = (
{ domain, editDomainRedirects, checkDomainHealth, defaultRedirects, selectedServer },
) => {
const { domain: authority, isDefault, redirects, status } = domain;
useEffect(() => {
checkDomainHealth(domain.domain);
}, []);
return (
<tr className="responsive-table__row">
<td className="responsive-table__cell" data-th="Is default domain">{isDefault && <DefaultDomain />}</td>
<th className="responsive-table__cell" data-th="Domain">{authority}</th>
<td className="responsive-table__cell" data-th="Base path redirect">
{redirects?.baseUrlRedirect ?? <Nr fallback={defaultRedirects?.baseUrlRedirect} />}
</td>
<td className="responsive-table__cell" data-th="Regular 404 redirect">
{redirects?.regular404Redirect ?? <Nr fallback={defaultRedirects?.regular404Redirect} />}
</td>
<td className="responsive-table__cell" data-th="Invalid short URL redirect">
{redirects?.invalidShortUrlRedirect ?? <Nr fallback={defaultRedirects?.invalidShortUrlRedirect} />}
</td>
<td className="responsive-table__cell text-lg-center" data-th="Status">
<DomainStatusIcon status={status} />
</td>
<td className="responsive-table__cell text-end">
<DomainDropdown domain={domain} editDomainRedirects={editDomainRedirects} selectedServer={selectedServer} />
</td>
</tr>
);
};

View File

@@ -1,19 +0,0 @@
@import '../utils/base';
@import '../utils/mixins/vertical-align';
.domains-dropdown__toggle-btn.domains-dropdown__toggle-btn,
.domains-dropdown__toggle-btn.domains-dropdown__toggle-btn:hover,
.domains-dropdown__toggle-btn.domains-dropdown__toggle-btn:active {
color: $textPlaceholder !important;
}
.domains-dropdown__toggle-btn--active.domains-dropdown__toggle-btn--active,
.domains-dropdown__toggle-btn--active.domains-dropdown__toggle-btn--active:hover,
.domains-dropdown__toggle-btn--active.domains-dropdown__toggle-btn--active:active {
color: var(--input-text-color) !important;
}
.domains-dropdown__back-btn.domains-dropdown__back-btn,
.domains-dropdown__back-btn.domains-dropdown__back-btn:hover {
border-color: var(--border-color);
}

View File

@@ -1,73 +0,0 @@
import { useEffect } from 'react';
import { Button, DropdownItem, Input, InputGroup, UncontrolledTooltip, InputProps } from 'reactstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faUndo } from '@fortawesome/free-solid-svg-icons';
import { isEmpty, pipe } from 'ramda';
import { DropdownBtn } from '../utils/DropdownBtn';
import { useToggle } from '../utils/helpers/hooks';
import { DomainsList } from './reducers/domainsList';
import './DomainSelector.scss';
export interface DomainSelectorProps extends Omit<InputProps, 'onChange'> {
value?: string;
onChange: (domain: string) => void;
}
interface DomainSelectorConnectProps extends DomainSelectorProps {
listDomains: Function;
domainsList: DomainsList;
}
export const DomainSelector = ({ listDomains, value, domainsList, onChange }: DomainSelectorConnectProps) => {
const [inputDisplayed,, showInput, hideInput] = useToggle();
const { domains } = domainsList;
const valueIsEmpty = isEmpty(value);
const unselectDomain = () => onChange('');
useEffect(() => {
listDomains();
}, []);
return inputDisplayed ? (
<InputGroup>
<Input
value={value ?? ''}
placeholder="Domain"
onChange={(e) => onChange(e.target.value)}
/>
<Button
id="backToDropdown"
outline
type="button"
className="domains-dropdown__back-btn"
aria-label="Back to domains list"
onClick={pipe(unselectDomain, hideInput)}
>
<FontAwesomeIcon icon={faUndo} />
</Button>
<UncontrolledTooltip target="backToDropdown" placement="left" trigger="hover">
Existing domains
</UncontrolledTooltip>
</InputGroup>
) : (
<DropdownBtn
text={valueIsEmpty ? 'Domain' : `Domain: ${value}`}
className={!valueIsEmpty ? 'domains-dropdown__toggle-btn--active' : 'domains-dropdown__toggle-btn'}
>
{domains.map(({ domain, isDefault }) => (
<DropdownItem
key={domain}
active={(value === domain || isDefault) && valueIsEmpty}
onClick={() => onChange(domain)}
>
{domain}
{isDefault && <span className="float-end text-muted">default</span>}
</DropdownItem>
))}
<DropdownItem divider />
<DropdownItem onClick={pipe(unselectDomain, showInput)}>
<i>New domain</i>
</DropdownItem>
</DropdownBtn>
);
};

View File

@@ -1,76 +0,0 @@
import { FC, useEffect } from 'react';
import { Message } from '../utils/Message';
import { Result } from '../utils/Result';
import { ShlinkApiError } from '../api/ShlinkApiError';
import { SimpleCard } from '../utils/SimpleCard';
import { SearchField } from '../utils/SearchField';
import { ShlinkDomainRedirects } from '../api/types';
import { SelectedServer } from '../servers/data';
import { DomainsList } from './reducers/domainsList';
import { DomainRow } from './DomainRow';
interface ManageDomainsProps {
listDomains: Function;
filterDomains: (searchTerm: string) => void;
editDomainRedirects: (domain: string, redirects: Partial<ShlinkDomainRedirects>) => Promise<void>;
checkDomainHealth: (domain: string) => void;
domainsList: DomainsList;
selectedServer: SelectedServer;
}
const headers = ['', 'Domain', 'Base path redirect', 'Regular 404 redirect', 'Invalid short URL redirect', '', ''];
export const ManageDomains: FC<ManageDomainsProps> = (
{ listDomains, domainsList, filterDomains, editDomainRedirects, checkDomainHealth, selectedServer },
) => {
const { filteredDomains: domains, defaultRedirects, loading, error, errorData } = domainsList;
const resolvedDefaultRedirects = defaultRedirects ?? domains.find(({ isDefault }) => isDefault)?.redirects;
useEffect(() => {
listDomains();
}, []);
if (loading) {
return <Message loading />;
}
const renderContent = () => {
if (error) {
return (
<Result type="error">
<ShlinkApiError errorData={errorData} fallbackMessage="Error loading domains :(" />
</Result>
);
}
return (
<SimpleCard>
<table className="table table-hover responsive-table mb-0">
<thead className="responsive-table__header">
<tr>{headers.map((column, index) => <th key={index}>{column}</th>)}</tr>
</thead>
<tbody>
{domains.length < 1 && <tr><td colSpan={headers.length} className="text-center">No results found</td></tr>}
{domains.map((domain) => (
<DomainRow
key={domain.domain}
domain={domain}
editDomainRedirects={editDomainRedirects}
checkDomainHealth={checkDomainHealth}
defaultRedirects={resolvedDefaultRedirects}
selectedServer={selectedServer}
/>
))}
</tbody>
</table>
</SimpleCard>
);
};
return (
<>
<SearchField className="mb-3" onChange={filterDomains} />
{renderContent()}
</>
);
};

View File

@@ -1,7 +0,0 @@
import { ShlinkDomain } from '../../api/types';
export type DomainStatus = 'validating' | 'valid' | 'invalid';
export interface Domain extends ShlinkDomain {
status: DomainStatus;
}

View File

@@ -1,51 +0,0 @@
import { FC } from 'react';
import { DropdownItem } from 'reactstrap';
import { Link } from 'react-router-dom';
import { faChartPie as pieChartIcon, faEdit as editIcon } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { useToggle } from '../../utils/helpers/hooks';
import { DropdownBtnMenu } from '../../utils/DropdownBtnMenu';
import { EditDomainRedirectsModal } from './EditDomainRedirectsModal';
import { Domain } from '../data';
import { ShlinkDomainRedirects } from '../../api/types';
import { supportsDefaultDomainRedirectsEdition, supportsDomainVisits } from '../../utils/helpers/features';
import { getServerId, SelectedServer } from '../../servers/data';
import { DEFAULT_DOMAIN } from '../../visits/reducers/domainVisits';
interface DomainDropdownProps {
domain: Domain;
editDomainRedirects: (domain: string, redirects: Partial<ShlinkDomainRedirects>) => Promise<void>;
selectedServer: SelectedServer;
}
export const DomainDropdown: FC<DomainDropdownProps> = ({ domain, editDomainRedirects, selectedServer }) => {
const [isOpen, toggle] = useToggle();
const [isModalOpen, toggleModal] = useToggle();
const { isDefault } = domain;
const canBeEdited = !isDefault || supportsDefaultDomainRedirectsEdition(selectedServer);
const withVisits = supportsDomainVisits(selectedServer);
const serverId = getServerId(selectedServer);
return (
<DropdownBtnMenu isOpen={isOpen} toggle={toggle}>
{withVisits && (
<DropdownItem
tag={Link}
to={`/server/${serverId}/domain/${domain.domain}${domain.isDefault ? `_${DEFAULT_DOMAIN}` : ''}/visits`}
>
<FontAwesomeIcon icon={pieChartIcon} fixedWidth /> Visit stats
</DropdownItem>
)}
<DropdownItem disabled={!canBeEdited} onClick={!canBeEdited ? undefined : toggleModal}>
<FontAwesomeIcon fixedWidth icon={editIcon} /> Edit redirects
</DropdownItem>
<EditDomainRedirectsModal
domain={domain}
isOpen={isModalOpen}
toggle={toggleModal}
editDomainRedirects={editDomainRedirects}
/>
</DropdownBtnMenu>
);
};

View File

@@ -1,59 +0,0 @@
import { FC, useEffect, useRef, useState } from 'react';
import { UncontrolledTooltip } from 'reactstrap';
import { ExternalLink } from 'react-external-link';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import {
faTimes as invalidIcon,
faCheck as checkIcon,
faCircleNotch as loadingStatusIcon,
} from '@fortawesome/free-solid-svg-icons';
import { MediaMatcher } from '../../utils/types';
import { mutableRefToElementRef } from '../../utils/helpers/components';
import { DomainStatus } from '../data';
interface DomainStatusIconProps {
status: DomainStatus;
matchMedia?: MediaMatcher;
}
export const DomainStatusIcon: FC<DomainStatusIconProps> = ({ status, matchMedia = window.matchMedia }) => {
const ref = useRef<HTMLSpanElement>();
const matchesMobile = () => matchMedia('(max-width: 991px)').matches;
const [isMobile, setIsMobile] = useState<boolean>(matchesMobile());
useEffect(() => {
const listener = () => setIsMobile(matchesMobile());
window.addEventListener('resize', listener);
return () => window.removeEventListener('resize', listener);
}, []);
if (status === 'validating') {
return <FontAwesomeIcon fixedWidth icon={loadingStatusIcon} spin />;
}
return (
<>
<span ref={mutableRefToElementRef(ref)}>
{status === 'valid'
? <FontAwesomeIcon fixedWidth icon={checkIcon} className="text-muted" />
: <FontAwesomeIcon fixedWidth icon={invalidIcon} className="text-danger" />}
</span>
<UncontrolledTooltip
target={(() => ref.current) as any}
placement={isMobile ? 'top-start' : 'left'}
autohide={status === 'valid'}
>
{status === 'valid' ? 'Congratulations! This domain is properly configured.' : (
<span>
Oops! There is some missing configuration, and short URLs shared with this domain will not work.
<br />
Check the <ExternalLink href="https://slnk.to/multi-domain-docs">documentation</ExternalLink> in order to
find out what is missing.
</span>
)}
</UncontrolledTooltip>
</>
);
};

View File

@@ -1,72 +0,0 @@
import { FC, useState } from 'react';
import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
import { ShlinkDomain, ShlinkDomainRedirects } from '../../api/types';
import { InputFormGroup, InputFormGroupProps } from '../../utils/forms/InputFormGroup';
import { handleEventPreventingDefault, nonEmptyValueOrNull } from '../../utils/utils';
import { InfoTooltip } from '../../utils/InfoTooltip';
interface EditDomainRedirectsModalProps {
domain: ShlinkDomain;
isOpen: boolean;
toggle: () => void;
editDomainRedirects: (domain: string, redirects: Partial<ShlinkDomainRedirects>) => Promise<void>;
}
const FormGroup: FC<InputFormGroupProps & { isLast?: boolean }> = ({ isLast, ...rest }) => (
<InputFormGroup
{...rest}
required={false}
type="url"
placeholder="No redirect"
className={isLast ? 'mb-0' : ''}
/>
);
export const EditDomainRedirectsModal: FC<EditDomainRedirectsModalProps> = (
{ isOpen, toggle, domain, editDomainRedirects },
) => {
const [baseUrlRedirect, setBaseUrlRedirect] = useState(domain.redirects?.baseUrlRedirect ?? '');
const [regular404Redirect, setRegular404Redirect] = useState(domain.redirects?.regular404Redirect ?? '');
const [invalidShortUrlRedirect, setInvalidShortUrlRedirect] = useState(
domain.redirects?.invalidShortUrlRedirect ?? '',
);
const handleSubmit = handleEventPreventingDefault(async () => editDomainRedirects(domain.domain, {
baseUrlRedirect: nonEmptyValueOrNull(baseUrlRedirect),
regular404Redirect: nonEmptyValueOrNull(regular404Redirect),
invalidShortUrlRedirect: nonEmptyValueOrNull(invalidShortUrlRedirect),
}).then(toggle));
return (
<Modal isOpen={isOpen} toggle={toggle} centered>
<form name="domainRedirectsModal" onSubmit={handleSubmit}>
<ModalHeader toggle={toggle}>Edit redirects for <b>{domain.domain}</b></ModalHeader>
<ModalBody>
<FormGroup value={baseUrlRedirect} onChange={setBaseUrlRedirect}>
<InfoTooltip className="me-2" placement="bottom">
Visitors accessing the base url, as in <b>https://{domain.domain}/</b>, will be redirected to this URL.
</InfoTooltip>
Base URL
</FormGroup>
<FormGroup value={regular404Redirect} onChange={setRegular404Redirect}>
<InfoTooltip className="me-2" placement="bottom">
Visitors accessing a url not matching a short URL pattern, as in <b>https://{domain.domain}/???/[...]</b>,
will be redirected to this URL.
</InfoTooltip>
Regular 404
</FormGroup>
<FormGroup value={invalidShortUrlRedirect} isLast onChange={setInvalidShortUrlRedirect}>
<InfoTooltip className="me-2" placement="bottom">
Visitors accessing a url matching a short URL pattern, but not matching an existing short code, will be
redirected to this URL.
</InfoTooltip>
Invalid short URL
</FormGroup>
</ModalBody>
<ModalFooter>
<Button color="link" type="button" onClick={toggle}>Cancel</Button>
<Button color="primary">Save</Button>
</ModalFooter>
</form>
</Modal>
);
};

View File

@@ -1,31 +0,0 @@
import { Action, Dispatch } from 'redux';
import { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
import { ShlinkDomainRedirects } from '../../api/types';
import { GetState } from '../../container/types';
import { ApiErrorAction } from '../../api/types/actions';
import { parseApiError } from '../../api/utils';
export const EDIT_DOMAIN_REDIRECTS_START = 'shlink/domainRedirects/EDIT_DOMAIN_REDIRECTS_START';
export const EDIT_DOMAIN_REDIRECTS_ERROR = 'shlink/domainRedirects/EDIT_DOMAIN_REDIRECTS_ERROR';
export const EDIT_DOMAIN_REDIRECTS = 'shlink/domainRedirects/EDIT_DOMAIN_REDIRECTS';
export interface EditDomainRedirectsAction extends Action<string> {
domain: string;
redirects: ShlinkDomainRedirects;
}
export const editDomainRedirects = (buildShlinkApiClient: ShlinkApiClientBuilder) => (
domain: string,
domainRedirects: Partial<ShlinkDomainRedirects>,
) => async (dispatch: Dispatch, getState: GetState) => {
dispatch({ type: EDIT_DOMAIN_REDIRECTS_START });
const { editDomainRedirects: shlinkEditDomainRedirects } = buildShlinkApiClient(getState);
try {
const redirects = await shlinkEditDomainRedirects({ domain, ...domainRedirects });
dispatch<EditDomainRedirectsAction>({ type: EDIT_DOMAIN_REDIRECTS, domain, redirects });
} catch (e: any) {
dispatch<ApiErrorAction>({ type: EDIT_DOMAIN_REDIRECTS_ERROR, errorData: parseApiError(e) });
}
};

View File

@@ -1,128 +0,0 @@
import { Action, Dispatch } from 'redux';
import { ProblemDetailsError, ShlinkDomainRedirects } from '../../api/types';
import { buildReducer } from '../../utils/helpers/redux';
import { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
import { GetState } from '../../container/types';
import { parseApiError } from '../../api/utils';
import { ApiErrorAction } from '../../api/types/actions';
import { Domain, DomainStatus } from '../data';
import { hasServerData } from '../../servers/data';
import { replaceAuthorityFromUri } from '../../utils/helpers/uri';
import { EDIT_DOMAIN_REDIRECTS, EditDomainRedirectsAction } from './domainRedirects';
export const LIST_DOMAINS_START = 'shlink/domainsList/LIST_DOMAINS_START';
export const LIST_DOMAINS_ERROR = 'shlink/domainsList/LIST_DOMAINS_ERROR';
export const LIST_DOMAINS = 'shlink/domainsList/LIST_DOMAINS';
export const FILTER_DOMAINS = 'shlink/domainsList/FILTER_DOMAINS';
export const VALIDATE_DOMAIN = 'shlink/domainsList/VALIDATE_DOMAIN';
export interface DomainsList {
domains: Domain[];
filteredDomains: Domain[];
defaultRedirects?: ShlinkDomainRedirects;
loading: boolean;
error: boolean;
errorData?: ProblemDetailsError;
}
export interface ListDomainsAction extends Action<string> {
domains: Domain[];
defaultRedirects?: ShlinkDomainRedirects;
}
interface FilterDomainsAction extends Action<string> {
searchTerm: string;
}
interface ValidateDomain extends Action<string> {
domain: string;
status: DomainStatus;
}
const initialState: DomainsList = {
domains: [],
filteredDomains: [],
loading: false,
error: false,
};
export type DomainsCombinedAction = ListDomainsAction
& ApiErrorAction
& FilterDomainsAction
& EditDomainRedirectsAction
& ValidateDomain;
export const replaceRedirectsOnDomain = (domain: string, redirects: ShlinkDomainRedirects) =>
(d: Domain): Domain => (d.domain !== domain ? d : { ...d, redirects });
export const replaceStatusOnDomain = (domain: string, status: DomainStatus) =>
(d: Domain): Domain => (d.domain !== domain ? d : { ...d, status });
export default buildReducer<DomainsList, DomainsCombinedAction>({
[LIST_DOMAINS_START]: () => ({ ...initialState, loading: true }),
[LIST_DOMAINS_ERROR]: ({ errorData }) => ({ ...initialState, error: true, errorData }),
[LIST_DOMAINS]: (_, { domains, defaultRedirects }) =>
({ ...initialState, domains, filteredDomains: domains, defaultRedirects }),
[FILTER_DOMAINS]: (state, { searchTerm }) => ({
...state,
filteredDomains: state.domains.filter(({ domain }) => domain.toLowerCase().match(searchTerm.toLowerCase())),
}),
[EDIT_DOMAIN_REDIRECTS]: (state, { domain, redirects }) => ({
...state,
domains: state.domains.map(replaceRedirectsOnDomain(domain, redirects)),
filteredDomains: state.filteredDomains.map(replaceRedirectsOnDomain(domain, redirects)),
}),
[VALIDATE_DOMAIN]: (state, { domain, status }) => ({
...state,
domains: state.domains.map(replaceStatusOnDomain(domain, status)),
filteredDomains: state.filteredDomains.map(replaceStatusOnDomain(domain, status)),
}),
}, initialState);
export const listDomains = (buildShlinkApiClient: ShlinkApiClientBuilder) => () => async (
dispatch: Dispatch,
getState: GetState,
) => {
dispatch({ type: LIST_DOMAINS_START });
const { listDomains: shlinkListDomains } = buildShlinkApiClient(getState);
try {
const resp = await shlinkListDomains().then(({ data, defaultRedirects }) => ({
domains: data.map((domain): Domain => ({ ...domain, status: 'validating' })),
defaultRedirects,
}));
dispatch<ListDomainsAction>({ type: LIST_DOMAINS, ...resp });
} catch (e: any) {
dispatch<ApiErrorAction>({ type: LIST_DOMAINS_ERROR, errorData: parseApiError(e) });
}
};
export const filterDomains = (searchTerm: string): FilterDomainsAction => ({ type: FILTER_DOMAINS, searchTerm });
export const checkDomainHealth = (buildShlinkApiClient: ShlinkApiClientBuilder) => (domain: string) => async (
dispatch: Dispatch,
getState: GetState,
) => {
const { selectedServer } = getState();
if (!hasServerData(selectedServer)) {
dispatch<ValidateDomain>({ type: VALIDATE_DOMAIN, domain, status: 'invalid' });
return;
}
try {
const { url, ...rest } = selectedServer;
const { health } = buildShlinkApiClient({
...rest,
url: replaceAuthorityFromUri(url, domain),
});
const { status } = await health();
dispatch<ValidateDomain>({ type: VALIDATE_DOMAIN, domain, status: status === 'pass' ? 'valid' : 'invalid' });
} catch (e) {
dispatch<ValidateDomain>({ type: VALIDATE_DOMAIN, domain, status: 'invalid' });
}
};

View File

@@ -1,26 +0,0 @@
import Bottle from 'bottlejs';
import { ConnectDecorator } from '../../container/types';
import { checkDomainHealth, filterDomains, listDomains } from '../reducers/domainsList';
import { DomainSelector } from '../DomainSelector';
import { ManageDomains } from '../ManageDomains';
import { editDomainRedirects } from '../reducers/domainRedirects';
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
// Components
bottle.serviceFactory('DomainSelector', () => DomainSelector);
bottle.decorator('DomainSelector', connect(['domainsList'], ['listDomains']));
bottle.serviceFactory('ManageDomains', () => ManageDomains);
bottle.decorator('ManageDomains', connect(
['domainsList', 'selectedServer'],
['listDomains', 'filterDomains', 'editDomainRedirects', 'checkDomainHealth'],
));
// Actions
bottle.serviceFactory('listDomains', listDomains, 'buildShlinkApiClient');
bottle.serviceFactory('filterDomains', () => filterDomains);
bottle.serviceFactory('editDomainRedirects', editDomainRedirects, 'buildShlinkApiClient');
bottle.serviceFactory('checkDomainHealth', checkDomainHealth, 'buildShlinkApiClient');
};
export default provideServices;

View File

@@ -1,242 +1,4 @@
/* stylelint-disable no-descending-specificity */
@import './utils/base';
@import 'node_modules/@shlinkio/shlink-frontend-kit/dist/base'; // Before bootstrap stylesheet. Includes SASS var overrides
@import 'node_modules/bootstrap/scss/bootstrap.scss';
@import './common/react-tag-autocomplete.scss';
@import './theme/theme';
@import './utils/table/ResponsiveTable';
@import './utils/StickyCardPaginator';
* {
outline: none !important;
}
:root {
scroll-behavior: auto;
color-scheme: var(--color-scheme);
}
html,
body,
#root {
height: 100%;
background: var(--secondary-color);
color: var(--text-color);
}
a,
.btn-link {
text-decoration: none;
}
/* stylelint-disable-next-line selector-max-pseudo-class */
a:not(.nav-link):not(.navbar-brand):not(.page-link):not(.highlight-card):not(.btn):not(.dropdown-item):hover,
.btn-link:hover {
text-decoration: underline;
}
.bg-main {
background-color: $mainColor !important;
}
.card-body,
.card-header,
.list-group-item {
background-color: transparent;
}
.card-footer {
background-color: var(--primary-color-alfa);
}
.card {
box-shadow: 0 .125rem .25rem rgb(0 0 0 / .075);
background-color: var(--primary-color);
border-color: var(--border-color);
}
.list-group {
background-color: var(--primary-color);
}
.modal-content,
.page-link,
.page-item.disabled .page-link,
.dropdown-menu {
background-color: var(--primary-color);
}
.modal-header,
.modal-footer,
.card-header,
.card-footer,
.table thead th,
.table th,
.table td,
.page-link,
.page-link:hover,
.page-item.disabled .page-link,
.dropdown-divider,
.dropdown-menu,
.list-group-item,
.modal-content,
hr {
border-color: var(--border-color);
}
.table-bordered,
.table-bordered thead th,
.table-bordered thead td {
border-color: var(--table-border-color);
}
.page-link:hover,
.page-link:focus {
background-color: var(--secondary-color);
}
.page-item.active .page-link {
background-color: var(--brand-color);
border-color: var(--brand-color);
}
.pagination .page-link {
cursor: pointer;
}
.container-xl {
@media (min-width: $xlgMin) {
max-width: 1320px;
}
@media (max-width: $smMax) {
padding-right: 0;
padding-left: 0;
}
}
/* Deprecated. Brought from bootstrap 4 */
.btn-block {
display: block;
width: 100%;
}
.btn-primary,
.btn-primary:hover,
.btn-primary:active,
.btn-primary.active,
.btn-outline-primary:hover,
.btn-outline-primary:active,
.btn-outline-primary.active, {
color: #ffffff;
}
.dropdown-item,
.dropdown-item-text {
color: var(--text-color);
}
.dropdown-item:not(:disabled) {
cursor: pointer;
}
.dropdown-item:focus:not(:disabled),
.dropdown-item:hover:not(:disabled),
.dropdown-item.active:not(:disabled),
.dropdown-item:active:not(:disabled) {
background-color: var(--active-color) !important;
color: var(--text-color) !important;
}
.dropdown-item--danger.dropdown-item--danger {
color: $dangerColor;
&:hover,
&:active,
&.active {
color: $dangerColor !important;
}
}
.badge-main {
color: #ffffff;
background-color: var(--brand-color);
}
.close,
.close:hover,
.table,
.table-hover > tbody > tr:hover > *,
.table-hover > tbody > tr > * {
color: var(--text-color);
}
.btn-close {
filter: var(--btn-close-filter);
}
.table-hover tbody tr:hover {
background-color: var(--secondary-color);
}
.form-control,
.form-control:focus {
background-color: var(--primary-color);
border-color: var(--input-border-color);
color: var(--input-text-color);
}
.form-control.disabled,
.form-control:disabled {
background-color: var(--input-disabled-color);
cursor: not-allowed;
}
.card .form-control:not(:disabled),
.card .form-control:not(:disabled):hover {
background-color: var(--input-color);
}
.table-active,
.table-active > th,
.table-active > td {
background-color: var(--table-highlight-color) !important;
}
.navbar-brand {
@media (max-width: $smMax) {
margin: 0 auto !important;
}
}
.indivisible {
white-space: nowrap;
}
.pointer {
cursor: pointer;
}
.text-ellipsis {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.progress-bar {
background-color: $mainColor;
}
.btn-xs-block {
@media (max-width: $xsMax) {
width: 100%;
display: block;
}
}
.btn-md-block {
@media (max-width: $mdMax) {
width: 100%;
display: block;
}
}
@import 'node_modules/@shlinkio/shlink-frontend-kit/dist/index'; // After bootstrap. Includes CSS overwrites
@import 'node_modules/@shlinkio/shlink-web-component/dist/index';

View File

@@ -3,17 +3,11 @@ import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
import pack from '../package.json';
import { container } from './container';
import { store } from './container/store';
import { fixLeafletIcons } from './utils/helpers/leaflet';
import { setUpStore } from './container/store';
import { register as registerServiceWorker } from './serviceWorkerRegistration';
import 'chart.js/auto'; // TODO Import specific ones to reduce bundle size https://react-chartjs-2.js.org/docs/migration-to-v4/#tree-shaking
import 'react-datepicker/dist/react-datepicker.css';
import 'leaflet/dist/leaflet.css';
import './index.scss';
// This overwrites icons used for leaflet maps, fixing some issues caused by webpack while processing the CSS
fixLeafletIcons();
const store = setUpStore(container);
const { App, ScrollToTop, ErrorHandler, appUpdateAvailable } = container;
createRoot(document.getElementById('root')!).render( // eslint-disable-line @typescript-eslint/no-non-null-assertion

View File

@@ -1,7 +0,0 @@
export class Topics {
public static readonly visits = 'https://shlink.io/new-visit';
public static readonly orphanVisits = 'https://shlink.io/new-orphan-visit';
public static readonly shortUrlVisits = (shortCode: string) => `https://shlink.io/new-visit/${shortCode}`;
}

View File

@@ -1,44 +0,0 @@
import { FC, useEffect } from 'react';
import { pipe } from 'ramda';
import { useParams } from 'react-router-dom';
import { CreateVisit } from '../../visits/types';
import { MercureInfo } from '../reducers/mercureInfo';
import { bindToMercureTopic } from './index';
export interface MercureBoundProps {
createNewVisits: (createdVisits: CreateVisit[]) => void;
loadMercureInfo: () => void;
mercureInfo: MercureInfo;
}
export function boundToMercureHub<T = {}>(
WrappedComponent: FC<MercureBoundProps & T>,
getTopicsForProps: (props: T, routeParams: any) => string[],
) {
const pendingUpdates = new Set<CreateVisit>();
return (props: MercureBoundProps & T) => {
const { createNewVisits, loadMercureInfo, mercureInfo } = props;
const { interval } = mercureInfo;
const params = useParams();
useEffect(() => {
const onMessage = (visit: CreateVisit) => (interval ? pendingUpdates.add(visit) : createNewVisits([visit]));
const topics = getTopicsForProps(props, params);
const closeEventSource = bindToMercureTopic(mercureInfo, topics, onMessage, loadMercureInfo);
if (!interval) {
return closeEventSource;
}
const timer = setInterval(() => {
createNewVisits([...pendingUpdates]);
pendingUpdates.clear();
}, interval * 1000 * 60);
return pipe(() => clearInterval(timer), () => closeEventSource?.());
}, [mercureInfo]);
return <WrappedComponent {...props} />;
};
}

View File

@@ -1,31 +0,0 @@
import { EventSourcePolyfill as EventSource } from 'event-source-polyfill';
import { MercureInfo } from '../reducers/mercureInfo';
export const bindToMercureTopic = <T>(mercureInfo: MercureInfo, topics: string[], onMessage: (message: T) => void, onTokenExpired: () => void) => { // eslint-disable-line max-len
const { mercureHubUrl, token, loading, error } = mercureInfo;
if (loading || error || !mercureHubUrl) {
return undefined;
}
const onEventSourceMessage = ({ data }: { data: string }) => onMessage(JSON.parse(data) as T);
const onEventSourceError = ({ status }: { status: number }) => status === 401 && onTokenExpired();
const subscriptions = topics.map((topic) => {
const hubUrl = new URL(mercureHubUrl);
hubUrl.searchParams.append('topic', topic);
const es = new EventSource(hubUrl, {
headers: {
Authorization: `Bearer ${token}`,
},
});
es.onmessage = onEventSourceMessage;
es.onerror = onEventSourceError;
return es;
});
return () => subscriptions.forEach((es) => es.close());
};

View File

@@ -1,52 +0,0 @@
import { Action, Dispatch } from 'redux';
import { ShlinkMercureInfo } from '../../api/types';
import { GetState } from '../../container/types';
import { buildReducer } from '../../utils/helpers/redux';
import { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
export const GET_MERCURE_INFO_START = 'shlink/mercure/GET_MERCURE_INFO_START';
export const GET_MERCURE_INFO_ERROR = 'shlink/mercure/GET_MERCURE_INFO_ERROR';
export const GET_MERCURE_INFO = 'shlink/mercure/GET_MERCURE_INFO';
export interface MercureInfo {
token?: string;
mercureHubUrl?: string;
interval?: number;
loading: boolean;
error: boolean;
}
export type GetMercureInfoAction = Action<string> & ShlinkMercureInfo & { interval?: number };
const initialState: MercureInfo = {
loading: true,
error: false,
};
export default buildReducer<MercureInfo, GetMercureInfoAction>({
[GET_MERCURE_INFO_START]: (state) => ({ ...state, loading: true, error: false }),
[GET_MERCURE_INFO_ERROR]: (state) => ({ ...state, loading: false, error: true }),
[GET_MERCURE_INFO]: (_, action) => ({ ...action, loading: false, error: false }),
}, initialState);
export const loadMercureInfo = (buildShlinkApiClient: ShlinkApiClientBuilder) =>
() => async (dispatch: Dispatch, getState: GetState) => {
dispatch({ type: GET_MERCURE_INFO_START });
const { settings } = getState();
const { mercureInfo } = buildShlinkApiClient(getState);
if (!settings.realTimeUpdates.enabled) {
dispatch({ type: GET_MERCURE_INFO_ERROR });
return;
}
try {
const info = await mercureInfo();
dispatch<GetMercureInfoAction>({ type: GET_MERCURE_INFO, interval: settings.realTimeUpdates.interval, ...info });
} catch (e) {
dispatch({ type: GET_MERCURE_INFO_ERROR });
}
};

View File

@@ -1,9 +0,0 @@
import Bottle from 'bottlejs';
import { loadMercureInfo } from '../reducers/mercureInfo';
const provideServices = (bottle: Bottle) => {
// Actions
bottle.serviceFactory('loadMercureInfo', loadMercureInfo, 'buildShlinkApiClient');
};
export default provideServices;

View File

@@ -1,47 +1,12 @@
import { combineReducers } from 'redux';
import serversReducer from '../servers/reducers/servers';
import selectedServerReducer from '../servers/reducers/selectedServer';
import shortUrlsListReducer from '../short-urls/reducers/shortUrlsList';
import shortUrlCreationReducer from '../short-urls/reducers/shortUrlCreation';
import shortUrlDeletionReducer from '../short-urls/reducers/shortUrlDeletion';
import shortUrlEditionReducer from '../short-urls/reducers/shortUrlEdition';
import shortUrlVisitsReducer from '../visits/reducers/shortUrlVisits';
import tagVisitsReducer from '../visits/reducers/tagVisits';
import domainVisitsReducer from '../visits/reducers/domainVisits';
import orphanVisitsReducer from '../visits/reducers/orphanVisits';
import nonOrphanVisitsReducer from '../visits/reducers/nonOrphanVisits';
import shortUrlDetailReducer from '../short-urls/reducers/shortUrlDetail';
import tagsListReducer from '../tags/reducers/tagsList';
import tagDeleteReducer from '../tags/reducers/tagDelete';
import tagEditReducer from '../tags/reducers/tagEdit';
import mercureInfoReducer from '../mercure/reducers/mercureInfo';
import settingsReducer from '../settings/reducers/settings';
import domainsListReducer from '../domains/reducers/domainsList';
import visitsOverviewReducer from '../visits/reducers/visitsOverview';
import appUpdatesReducer from '../app/reducers/appUpdates';
import sidebarReducer from '../common/reducers/sidebar';
import { ShlinkState } from '../container/types';
import { combineReducers } from '@reduxjs/toolkit';
import type { IContainer } from 'bottlejs';
import { appUpdatesReducer } from '../app/reducers/appUpdates';
import { serversReducer } from '../servers/reducers/servers';
import { settingsReducer } from '../settings/reducers/settings';
export default combineReducers<ShlinkState>({
servers: serversReducer,
selectedServer: selectedServerReducer,
shortUrlsList: shortUrlsListReducer,
shortUrlCreationResult: shortUrlCreationReducer,
shortUrlDeletion: shortUrlDeletionReducer,
shortUrlEdition: shortUrlEditionReducer,
shortUrlVisits: shortUrlVisitsReducer,
tagVisits: tagVisitsReducer,
domainVisits: domainVisitsReducer,
orphanVisits: orphanVisitsReducer,
nonOrphanVisits: nonOrphanVisitsReducer,
shortUrlDetail: shortUrlDetailReducer,
tagsList: tagsListReducer,
tagDelete: tagDeleteReducer,
tagEdit: tagEditReducer,
mercureInfo: mercureInfoReducer,
settings: settingsReducer,
domainsList: domainsListReducer,
visitsOverview: visitsOverviewReducer,
export const initReducers = (container: IContainer) => combineReducers({
appUpdated: appUpdatesReducer,
sidebar: sidebarReducer,
servers: serversReducer,
selectedServer: container.selectedServerReducer,
settings: settingsReducer,
});

View File

@@ -1,21 +1,30 @@
import { FC, useEffect, useState } from 'react';
import { v4 as uuid } from 'uuid';
import { Button } from 'reactstrap';
import type { TimeoutToggle } from '@shlinkio/shlink-frontend-kit';
import { Result, useToggle } from '@shlinkio/shlink-frontend-kit';
import type { FC } from 'react';
import { useCallback, useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { Result } from '../utils/Result';
import { Button } from 'reactstrap';
import { v4 as uuid } from 'uuid';
import { NoMenuLayout } from '../common/NoMenuLayout';
import { TimeoutToggle, useGoBack, useToggle } from '../utils/helpers/hooks';
import { ServerForm } from './helpers/ServerForm';
import { ImportServersBtnProps } from './helpers/ImportServersBtn';
import { ServerData, ServersMap, ServerWithId } from './data';
import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils';
import { useGoBack } from '../utils/helpers/hooks';
import type { ServerData, ServersMap, ServerWithId } from './data';
import { DuplicatedServersModal } from './helpers/DuplicatedServersModal';
import type { ImportServersBtnProps } from './helpers/ImportServersBtn';
import { ServerForm } from './helpers/ServerForm';
const SHOW_IMPORT_MSG_TIME = 4000;
interface CreateServerProps {
createServer: (server: ServerWithId) => void;
type CreateServerProps = {
createServers: (servers: ServerWithId[]) => void;
servers: ServersMap;
}
};
type CreateServerDeps = {
ImportServersBtn: FC<ImportServersBtnProps>;
useTimeoutToggle: TimeoutToggle;
};
const ImportResult = ({ type }: { type: 'error' | 'success' }) => (
<div className="mt-3">
@@ -26,34 +35,33 @@ const ImportResult = ({ type }: { type: 'error' | 'success' }) => (
</div>
);
export const CreateServer = (ImportServersBtn: FC<ImportServersBtnProps>, useTimeoutToggle: TimeoutToggle) => (
{ servers, createServer }: CreateServerProps,
) => {
const CreateServer: FCWithDeps<CreateServerProps, CreateServerDeps> = ({ servers, createServers }) => {
const { ImportServersBtn, useTimeoutToggle } = useDependencies(CreateServer);
const navigate = useNavigate();
const goBack = useGoBack();
const hasServers = !!Object.keys(servers).length;
const [serversImported, setServersImported] = useTimeoutToggle(false, SHOW_IMPORT_MSG_TIME);
const [errorImporting, setErrorImporting] = useTimeoutToggle(false, SHOW_IMPORT_MSG_TIME);
const [isConfirmModalOpen, toggleConfirmModal] = useToggle();
const [serverData, setServerData] = useState<ServerData | undefined>();
const save = () => {
const [serverData, setServerData] = useState<ServerData>();
const saveNewServer = useCallback((theServerData: ServerData) => {
const id = uuid();
createServers([{ ...theServerData, id }]);
navigate(`/server/${id}`);
}, [createServers, navigate]);
useEffect(() => {
if (!serverData) {
return;
}
const id = uuid();
createServer({ ...serverData, id });
navigate(`/server/${id}`);
};
useEffect(() => {
const serverExists = Object.values(servers).some(
({ url, apiKey }) => serverData?.url === url && serverData?.apiKey === apiKey,
);
serverExists ? toggleConfirmModal() : save();
}, [serverData]);
serverExists ? toggleConfirmModal() : saveNewServer(serverData);
}, [saveNewServer, serverData, servers, toggleConfirmModal]);
return (
<NoMenuLayout>
@@ -72,8 +80,10 @@ export const CreateServer = (ImportServersBtn: FC<ImportServersBtnProps>, useTim
isOpen={isConfirmModalOpen}
duplicatedServers={serverData ? [serverData] : []}
onDiscard={goBack}
onSave={save}
onSave={() => serverData && saveNewServer(serverData)}
/>
</NoMenuLayout>
);
};
export const CreateServerFactory = componentFactory(CreateServer, ['ImportServersBtn', 'useTimeoutToggle']);

Some files were not shown because too many files have changed in this diff Show More