Merge pull request #1878 from shlinkio/develop

Release 4.7.1
This commit is contained in:
Alejandro Celaya
2026-05-15 08:35:55 +02:00
committed by GitHub
12 changed files with 2881 additions and 3525 deletions

View File

@@ -11,6 +11,6 @@ jobs:
ci: ci:
uses: shlinkio/github-actions/.github/workflows/web-app-ci.yml@main uses: shlinkio/github-actions/.github/workflows/web-app-ci.yml@main
with: with:
node-version: 22.x node-version: 24.x
publish-coverage: true publish-coverage: true
install-playwright: true install-playwright: true

View File

@@ -9,14 +9,14 @@ jobs:
continue-on-error: true continue-on-error: true
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v6
with: with:
repository: ${{ github.event.pull_request.head.repo.full_name }} repository: ${{ github.event.pull_request.head.repo.full_name }}
ref: ${{ github.event.pull_request.head.ref }} ref: ${{ github.event.pull_request.head.ref }}
- name: Use node.js - name: Use node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: 22.10 node-version: 24.14
- name: Build - name: Build
run: | run: |
npm ci && \ npm ci && \

View File

@@ -10,11 +10,11 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v6
- name: Use node.js - name: Use node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: 22.10 node-version: 24.14
- name: Generate release assets - name: Generate release assets
run: npm ci && 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 - name: Publish release with assets

View File

@@ -4,6 +4,23 @@ 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). 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.7.1] - 2026-05-15
### Added
* *Nothing*
### Changed
* Update dependencies
### Deprecated
* *Nothing*
### Removed
* *Nothing*
### Fixed
* [#1876](https://github.com/shlinkio/shlink-web-client/issues/1876) Upgrade docker image to nginx 1.30.1 to address [CVE-2026-42945](https://www.cve.org/CVERecord?id=CVE-2026-42945).
## [4.7.0] - 2026-02-04 ## [4.7.0] - 2026-02-04
### Added ### Added
* [shlink-web-component] Add support for Shlink 5.0.0, by supporting date-based redirect conditions. * [shlink-web-component] Add support for Shlink 5.0.0, by supporting date-based redirect conditions.

View File

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

View File

@@ -1,6 +1,6 @@
FROM mcr.microsoft.com/playwright:v1.58.1-noble FROM mcr.microsoft.com/playwright:v1.59.1-noble
ENV NODE_VERSION 22.14 ENV NODE_VERSION 24.14
ENV TINI_VERSION v0.19.0 ENV TINI_VERSION v0.19.0
# Install Node.js # Install Node.js

6319
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -20,29 +20,29 @@
"test:verbose": "node --run test -- --verbose" "test:verbose": "node --run test -- --verbose"
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^7.1.0", "@fortawesome/fontawesome-free": "^7.2.0",
"@fortawesome/fontawesome-svg-core": "^7.1.0", "@fortawesome/fontawesome-svg-core": "^7.2.0",
"@fortawesome/free-brands-svg-icons": "^7.1.0", "@fortawesome/free-brands-svg-icons": "^7.2.0",
"@fortawesome/free-regular-svg-icons": "^7.1.0", "@fortawesome/free-regular-svg-icons": "^7.2.0",
"@fortawesome/free-solid-svg-icons": "^7.1.0", "@fortawesome/free-solid-svg-icons": "^7.2.0",
"@fortawesome/react-fontawesome": "^3.1.1", "@fortawesome/react-fontawesome": "^3.3.1",
"@json2csv/plainjs": "^7.0.6", "@json2csv/plainjs": "^7.0.6",
"@reduxjs/toolkit": "^2.11.2", "@reduxjs/toolkit": "^2.11.2",
"@shlinkio/data-manipulation": "^1.0.4", "@shlinkio/data-manipulation": "^1.0.4",
"@shlinkio/shlink-frontend-kit": "^1.4.0", "@shlinkio/shlink-frontend-kit": "^1.4.0",
"@shlinkio/shlink-js-sdk": "^3.1.0", "@shlinkio/shlink-js-sdk": "^3.1.0",
"@shlinkio/shlink-web-component": "^0.18.0", "@shlinkio/shlink-web-component": "^0.18.0",
"@vitest/browser-playwright": "^4.0.18", "@vitest/browser-playwright": "^4.1.5",
"bottlejs": "^2.0.1", "bottlejs": "^2.0.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"compare-versions": "^6.1.1", "compare-versions": "^6.1.1",
"csvtojson": "^2.0.14", "csvtojson": "^2.0.14",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"react": "^19.2.4", "react": "^19.2.6",
"react-dom": "^19.2.4", "react-dom": "^19.2.6",
"react-external-link": "^2.6.1", "react-external-link": "^2.6.1",
"react-redux": "^9.2.0", "react-redux": "^9.2.0",
"react-router": "^7.13.0", "react-router": "^7.15.0",
"redux-localstorage-simple": "^2.5.1", "redux-localstorage-simple": "^2.5.1",
"workbox-core": "^7.4.0", "workbox-core": "^7.4.0",
"workbox-expiration": "^7.4.0", "workbox-expiration": "^7.4.0",
@@ -53,19 +53,19 @@
"devDependencies": { "devDependencies": {
"@shlinkio/eslint-config-js-coding-standard": "~3.7.0", "@shlinkio/eslint-config-js-coding-standard": "~3.7.0",
"@stylistic/eslint-plugin": "^5.7.1", "@stylistic/eslint-plugin": "^5.7.1",
"@tailwindcss/vite": "^4.1.18", "@tailwindcss/vite": "^4.3.0",
"@testing-library/jest-dom": "^6.9.1", "@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2", "@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.1", "@testing-library/user-event": "^14.6.1",
"@total-typescript/shoehorn": "^0.1.2", "@total-typescript/shoehorn": "^0.1.2",
"@types/node": "^25.1.0", "@types/node": "^25.6.2",
"@types/react": "^19.2.10", "@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.2", "@vitejs/plugin-react": "^6.0.1",
"@vitest/browser": "^4.0.3", "@vitest/browser": "^4.0.3",
"@vitest/coverage-v8": "^4.0.18", "@vitest/coverage-v8": "^4.1.2",
"adm-zip": "^0.5.16", "adm-zip": "^0.5.17",
"axe-core": "^4.11.1", "axe-core": "^4.11.4",
"chalk": "^5.6.2", "chalk": "^5.6.2",
"eslint": "^9.39.2", "eslint": "^9.39.2",
"eslint-plugin-import": "^2.32.0", "eslint-plugin-import": "^2.32.0",
@@ -75,12 +75,12 @@
"eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-simple-import-sort": "^12.1.1",
"history": "^5.3.0", "history": "^5.3.0",
"playwright": "^1.58.1", "playwright": "^1.59.1",
"tailwindcss": "^4.1.3", "tailwindcss": "^4.1.3",
"typescript": "^5.9.3", "typescript": "^5.9.3",
"typescript-eslint": "^8.54.0", "typescript-eslint": "^8.54.0",
"vite": "^7.3.1", "vite": "^8.0.11",
"vite-plugin-pwa": "^1.2.0", "vite-plugin-pwa": "^1.3.0",
"vitest": "^4.0.3" "vitest": "^4.0.3"
}, },
"browserslist": [ "browserslist": [

View File

@@ -11,7 +11,7 @@ describe('<MainHeader />', () => {
history.push(pathname); history.push(pathname);
return renderWithStore( return renderWithStore(
<Router location={history.location} navigator={history} unstable_useTransitions={false}> <Router location={history.location} navigator={history}>
<MainHeader /> <MainHeader />
</Router>, </Router>,
); );

View File

@@ -29,7 +29,7 @@ describe('<CreateServer />', () => {
return { return {
history, history,
...renderWithStore( ...renderWithStore(
<Router location={history.location} navigator={history} unstable_useTransitions={false}> <Router location={history.location} navigator={history}>
<CreateServer useTimeoutToggle={useTimeoutToggle} /> <CreateServer useTimeoutToggle={useTimeoutToggle} />
</Router>, </Router>,
{ {

View File

@@ -11,7 +11,7 @@ describe('<DeleteServerButton />', () => {
const setUp = (children: ReactNode = 'Remove this server') => { const setUp = (children: ReactNode = 'Remove this server') => {
const history = createMemoryHistory({ initialEntries: ['/foo'] }); const history = createMemoryHistory({ initialEntries: ['/foo'] });
const result = renderWithStore( const result = renderWithStore(
<Router location={history.location} navigator={history} unstable_useTransitions={false}> <Router location={history.location} navigator={history}>
<DeleteServerButton server={fromPartial({})}>{children}</DeleteServerButton> <DeleteServerButton server={fromPartial({})}>{children}</DeleteServerButton>
</Router>, </Router>,
); );

View File

@@ -20,7 +20,7 @@ describe('<EditServer />', () => {
return { return {
history, history,
...renderWithStore( ...renderWithStore(
<Router location={history.location} navigator={history} unstable_useTransitions={false}> <Router location={history.location} navigator={history}>
<EditServer /> <EditServer />
</Router>, </Router>,
{ {