From ada4893c0ea6b663802d57c0a8294b1d306255cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 06:50:32 +0000 Subject: [PATCH 01/14] chore(deps-dev): bump @typescript-eslint/eslint-plugin in /src/frontend Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 8.58.2 to 8.59.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-version: 8.59.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- src/frontend/package-lock.json | 243 +++++---------------------------- src/frontend/package.json | 2 +- 2 files changed, 38 insertions(+), 207 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 407d6c9b..52b46776 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -35,7 +35,7 @@ "@types/dompurify": "^3.2.0", "@types/node": "^25.6.0", "@types/turndown": "^5.0.6", - "@typescript-eslint/eslint-plugin": "^8.58.2", + "@typescript-eslint/eslint-plugin": "^8.59.0", "@typescript-eslint/parser": "^8.59.0", "@vitejs/plugin-react": "^6.0.1", "autoprefixer": "^10.5.0", @@ -2228,17 +2228,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.2.tgz", - "integrity": "sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz", + "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.58.2", - "@typescript-eslint/type-utils": "8.58.2", - "@typescript-eslint/utils": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2", + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/type-utils": "8.59.0", + "@typescript-eslint/utils": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -2251,7 +2251,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.58.2", + "@typescript-eslint/parser": "^8.59.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -2281,7 +2281,7 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { + "node_modules/@typescript-eslint/project-service": { "version": "8.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", @@ -2303,7 +2303,7 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "8.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz", "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==", @@ -2321,7 +2321,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { + "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", @@ -2338,185 +2338,16 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", - "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", - "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.59.0", - "@typescript-eslint/tsconfig-utils": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/type-utils": { "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", - "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz", + "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.59.0", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.2.tgz", - "integrity": "sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.58.2", - "@typescript-eslint/types": "^8.58.2", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.2.tgz", - "integrity": "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.2.tgz", - "integrity": "sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.2.tgz", - "integrity": "sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2", - "@typescript-eslint/utils": "8.58.2", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/utils": "8.59.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -2533,9 +2364,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.2.tgz", - "integrity": "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", + "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", "dev": true, "license": "MIT", "engines": { @@ -2547,16 +2378,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.2.tgz", - "integrity": "sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", + "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.58.2", - "@typescript-eslint/tsconfig-utils": "8.58.2", - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2", + "@typescript-eslint/project-service": "8.59.0", + "@typescript-eslint/tsconfig-utils": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -2614,16 +2445,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.2.tgz", - "integrity": "sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz", + "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.58.2", - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2" + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2638,13 +2469,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.2.tgz", - "integrity": "sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", + "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { diff --git a/src/frontend/package.json b/src/frontend/package.json index 27b420d9..0f47e501 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -51,7 +51,7 @@ "@types/dompurify": "^3.2.0", "@types/node": "^25.6.0", "@types/turndown": "^5.0.6", - "@typescript-eslint/eslint-plugin": "^8.58.2", + "@typescript-eslint/eslint-plugin": "^8.59.0", "@typescript-eslint/parser": "^8.59.0", "@vitejs/plugin-react": "^6.0.1", "autoprefixer": "^10.5.0", From 433703f435233307c86b38c151c2ff3c2e9c440d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 06:50:48 +0000 Subject: [PATCH 02/14] chore(deps-dev): bump vitest from 4.1.4 to 4.1.5 in /src/frontend Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.4 to 4.1.5. - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.5/packages/vitest) --- updated-dependencies: - dependency-name: vitest dependency-version: 4.1.5 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- src/frontend/package-lock.json | 90 +++++++++++++++++----------------- src/frontend/package.json | 2 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 407d6c9b..f23329eb 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -47,7 +47,7 @@ "ts-prune": "^0.10.3", "typescript": "~6.0.3", "vite": "^8.0.9", - "vitest": "^4.1.4" + "vitest": "^4.1.5" }, "engines": { "node": ">=24" @@ -2695,16 +2695,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.4.tgz", - "integrity": "sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz", + "integrity": "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.4", - "@vitest/utils": "4.1.4", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -2713,13 +2713,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.4.tgz", - "integrity": "sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz", + "integrity": "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.4", + "@vitest/spy": "4.1.5", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -2740,9 +2740,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.4.tgz", - "integrity": "sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", + "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", "dev": true, "license": "MIT", "dependencies": { @@ -2753,13 +2753,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.4.tgz", - "integrity": "sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz", + "integrity": "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.4", + "@vitest/utils": "4.1.5", "pathe": "^2.0.3" }, "funding": { @@ -2767,14 +2767,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.4.tgz", - "integrity": "sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz", + "integrity": "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.4", - "@vitest/utils": "4.1.4", + "@vitest/pretty-format": "4.1.5", + "@vitest/utils": "4.1.5", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -2783,9 +2783,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.4.tgz", - "integrity": "sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz", + "integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==", "dev": true, "license": "MIT", "funding": { @@ -2793,13 +2793,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.4.tgz", - "integrity": "sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", + "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.4", + "@vitest/pretty-format": "4.1.5", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -7773,19 +7773,19 @@ } }, "node_modules/vitest": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.4.tgz", - "integrity": "sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz", + "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.4", - "@vitest/mocker": "4.1.4", - "@vitest/pretty-format": "4.1.4", - "@vitest/runner": "4.1.4", - "@vitest/snapshot": "4.1.4", - "@vitest/spy": "4.1.4", - "@vitest/utils": "4.1.4", + "@vitest/expect": "4.1.5", + "@vitest/mocker": "4.1.5", + "@vitest/pretty-format": "4.1.5", + "@vitest/runner": "4.1.5", + "@vitest/snapshot": "4.1.5", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -7813,12 +7813,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.4", - "@vitest/browser-preview": "4.1.4", - "@vitest/browser-webdriverio": "4.1.4", - "@vitest/coverage-istanbul": "4.1.4", - "@vitest/coverage-v8": "4.1.4", - "@vitest/ui": "4.1.4", + "@vitest/browser-playwright": "4.1.5", + "@vitest/browser-preview": "4.1.5", + "@vitest/browser-webdriverio": "4.1.5", + "@vitest/coverage-istanbul": "4.1.5", + "@vitest/coverage-v8": "4.1.5", + "@vitest/ui": "4.1.5", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" diff --git a/src/frontend/package.json b/src/frontend/package.json index 27b420d9..56b4393c 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -63,6 +63,6 @@ "ts-prune": "^0.10.3", "typescript": "~6.0.3", "vite": "^8.0.9", - "vitest": "^4.1.4" + "vitest": "^4.1.5" } } From c6610503922d44d1397b0dd4a22f9e0667875554 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 06:51:01 +0000 Subject: [PATCH 03/14] chore(deps-dev): bump @tailwindcss/postcss in /src/frontend Bumps [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) from 4.2.2 to 4.2.4. - [Release notes](https://github.com/tailwindlabs/tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.4/packages/@tailwindcss-postcss) --- updated-dependencies: - dependency-name: "@tailwindcss/postcss" dependency-version: 4.2.4 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- src/frontend/package-lock.json | 208 +++++++++++++++++++++------------ src/frontend/package.json | 2 +- 2 files changed, 137 insertions(+), 73 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 407d6c9b..599d8e3e 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -30,7 +30,7 @@ "zustand": "^5.0.3" }, "devDependencies": { - "@tailwindcss/postcss": "^4.2.2", + "@tailwindcss/postcss": "^4.2.4", "@testing-library/react": "^16.3.2", "@types/dompurify": "^3.2.0", "@types/node": "^25.6.0", @@ -1753,9 +1753,9 @@ "license": "MIT" }, "node_modules/@tailwindcss/node": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", - "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz", + "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==", "dev": true, "license": "MIT", "dependencies": { @@ -1765,37 +1765,37 @@ "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.2.2" + "tailwindcss": "4.2.4" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", - "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz", + "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-x64": "4.2.2", - "@tailwindcss/oxide-freebsd-x64": "4.2.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-x64-musl": "4.2.2", - "@tailwindcss/oxide-wasm32-wasi": "4.2.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + "@tailwindcss/oxide-android-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-x64": "4.2.4", + "@tailwindcss/oxide-freebsd-x64": "4.2.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-x64-musl": "4.2.4", + "@tailwindcss/oxide-wasm32-wasi": "4.2.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.4" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", - "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz", + "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==", "cpu": [ "arm64" ], @@ -1810,9 +1810,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", - "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz", + "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==", "cpu": [ "arm64" ], @@ -1827,9 +1827,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", - "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz", + "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==", "cpu": [ "x64" ], @@ -1844,9 +1844,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", - "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz", + "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==", "cpu": [ "x64" ], @@ -1861,9 +1861,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", - "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz", + "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==", "cpu": [ "arm" ], @@ -1878,9 +1878,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", - "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz", + "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==", "cpu": [ "arm64" ], @@ -1895,9 +1895,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", - "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz", + "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==", "cpu": [ "arm64" ], @@ -1912,9 +1912,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", - "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz", + "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==", "cpu": [ "x64" ], @@ -1929,9 +1929,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", - "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz", + "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==", "cpu": [ "x64" ], @@ -1946,9 +1946,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", - "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz", + "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -1975,10 +1975,74 @@ "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", - "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz", + "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==", "cpu": [ "arm64" ], @@ -1993,9 +2057,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", - "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz", + "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==", "cpu": [ "x64" ], @@ -2010,17 +2074,17 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz", - "integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.4.tgz", + "integrity": "sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==", "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.2.2", - "@tailwindcss/oxide": "4.2.2", + "@tailwindcss/node": "4.2.4", + "@tailwindcss/oxide": "4.2.4", "postcss": "^8.5.6", - "tailwindcss": "4.2.2" + "tailwindcss": "4.2.4" } }, "node_modules/@testing-library/dom": { @@ -3706,14 +3770,14 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -7295,16 +7359,16 @@ "license": "MIT" }, "node_modules/tailwindcss": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", - "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz", + "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==", "dev": true, "license": "MIT" }, "node_modules/tapable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", - "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { diff --git a/src/frontend/package.json b/src/frontend/package.json index 27b420d9..4377d975 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -46,7 +46,7 @@ "protobufjs": "^7.5.5" }, "devDependencies": { - "@tailwindcss/postcss": "^4.2.2", + "@tailwindcss/postcss": "^4.2.4", "@testing-library/react": "^16.3.2", "@types/dompurify": "^3.2.0", "@types/node": "^25.6.0", From b0b2eb134b25c5bd29098d07587946bdb172bd89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 06:51:38 +0000 Subject: [PATCH 04/14] chore(deps): bump react-i18next from 17.0.2 to 17.0.4 in /src/frontend Bumps [react-i18next](https://github.com/i18next/react-i18next) from 17.0.2 to 17.0.4. - [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/react-i18next/compare/v17.0.2...v17.0.4) --- updated-dependencies: - dependency-name: react-i18next dependency-version: 17.0.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- src/frontend/package-lock.json | 8 ++++---- src/frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 407d6c9b..0ce1ef9e 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -24,7 +24,7 @@ "marked": "18.0.2", "react": "^19.2.5", "react-dom": "^19.2.5", - "react-i18next": "^17.0.2", + "react-i18next": "^17.0.4", "turndown": "7.2.4", "uuid": "^14.0.0", "zustand": "^5.0.3" @@ -6579,9 +6579,9 @@ } }, "node_modules/react-i18next": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.2.tgz", - "integrity": "sha512-shBftH2vaTWK2Bsp7FiL+cevx3xFJlvFxmsDFQSrJc+6twHkP0tv/bGa01VVWzpreUVVwU+3Hev5iFqRg65RwA==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.4.tgz", + "integrity": "sha512-hQipmK4EF0y6RO6tt6WuqnmWpWYEXmQUUzecmMBuNsIgYd3smXcG4GtYPWhvgxn0pqMOItKlEO8H24HCs5hc3g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.2", diff --git a/src/frontend/package.json b/src/frontend/package.json index 27b420d9..175365b8 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -37,7 +37,7 @@ "marked": "18.0.2", "react": "^19.2.5", "react-dom": "^19.2.5", - "react-i18next": "^17.0.2", + "react-i18next": "^17.0.4", "turndown": "7.2.4", "uuid": "^14.0.0", "zustand": "^5.0.3" From 69efc8e375b79f38241e3187b89be41624cd4858 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 06:51:45 +0000 Subject: [PATCH 05/14] chore(deps): bump @google/genai from 1.48.0 to 1.50.1 in /src/frontend Bumps [@google/genai](https://github.com/googleapis/js-genai) from 1.48.0 to 1.50.1. - [Release notes](https://github.com/googleapis/js-genai/releases) - [Changelog](https://github.com/googleapis/js-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/js-genai/compare/v1.48.0...v1.50.1) --- updated-dependencies: - dependency-name: "@google/genai" dependency-version: 1.50.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- src/frontend/package-lock.json | 8 ++++---- src/frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 407d6c9b..5da9b67b 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "dependencies": { "@codemirror/lang-markdown": "^6.5.0", - "@google/genai": "^1.48.0", + "@google/genai": "^1.50.1", "@lezer/highlight": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.8", "@testing-library/dom": "^10.4.1", @@ -711,9 +711,9 @@ "license": "MIT" }, "node_modules/@google/genai": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.48.0.tgz", - "integrity": "sha512-plonYK4ML2PrxsRD9SeqmFt76eREWkQdPCglOA6aYDzL1AAbE+7PUnT54SvpWGfws13L0AZEqGSpL7+1IPnTxQ==", + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.50.1.tgz", + "integrity": "sha512-YbkX7H9+1Pt8wOt7DDREy8XSoiL6fRDzZQRyaVBarFf8MR3zHGqVdvM4cLbDXqPhxqvegZShgfxb8kw9C7YhAQ==", "license": "Apache-2.0", "dependencies": { "google-auth-library": "^10.3.0", diff --git a/src/frontend/package.json b/src/frontend/package.json index 27b420d9..740dadde 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -22,7 +22,7 @@ }, "dependencies": { "@codemirror/lang-markdown": "^6.5.0", - "@google/genai": "^1.48.0", + "@google/genai": "^1.50.1", "@lezer/highlight": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.8", "@testing-library/dom": "^10.4.1", From 327b562adc3e28ba46af6caf74fd894d94bd2c5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 17:03:17 +0000 Subject: [PATCH 06/14] chore(deps-dev): bump vite from 8.0.9 to 8.0.10 in /src/frontend Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.9 to 8.0.10. - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v8.0.10/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 8.0.10 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- src/frontend/package-lock.json | 168 ++++++++++++++++----------------- src/frontend/package.json | 2 +- 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 88d5a437..31c697bc 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -46,7 +46,7 @@ "tailwindcss": "^4.2.2", "ts-prune": "^0.10.3", "typescript": "~6.0.3", - "vite": "^8.0.9", + "vite": "^8.0.10", "vitest": "^4.1.5" }, "engines": { @@ -432,9 +432,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", - "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "dev": true, "license": "MIT", "optional": true, @@ -444,9 +444,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, "license": "MIT", "optional": true, @@ -989,9 +989,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.126.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.126.0.tgz", - "integrity": "sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==", + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", "dev": true, "license": "MIT", "funding": { @@ -1482,9 +1482,9 @@ "license": "MIT" }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.16.tgz", - "integrity": "sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==", "cpu": [ "arm64" ], @@ -1499,9 +1499,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.16.tgz", - "integrity": "sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==", "cpu": [ "arm64" ], @@ -1516,9 +1516,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.16.tgz", - "integrity": "sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz", + "integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==", "cpu": [ "x64" ], @@ -1533,9 +1533,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.16.tgz", - "integrity": "sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz", + "integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==", "cpu": [ "x64" ], @@ -1550,9 +1550,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.16.tgz", - "integrity": "sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz", + "integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==", "cpu": [ "arm" ], @@ -1567,9 +1567,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.16.tgz", - "integrity": "sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==", "cpu": [ "arm64" ], @@ -1584,9 +1584,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.16.tgz", - "integrity": "sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz", + "integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==", "cpu": [ "arm64" ], @@ -1601,9 +1601,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.16.tgz", - "integrity": "sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==", "cpu": [ "ppc64" ], @@ -1618,9 +1618,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.16.tgz", - "integrity": "sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==", "cpu": [ "s390x" ], @@ -1635,9 +1635,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.16.tgz", - "integrity": "sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==", "cpu": [ "x64" ], @@ -1652,9 +1652,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.16.tgz", - "integrity": "sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz", + "integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==", "cpu": [ "x64" ], @@ -1669,9 +1669,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.16.tgz", - "integrity": "sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==", "cpu": [ "arm64" ], @@ -1686,9 +1686,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.16.tgz", - "integrity": "sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz", + "integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==", "cpu": [ "wasm32" ], @@ -1696,8 +1696,8 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "1.9.2", - "@emnapi/runtime": "1.9.2", + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "engines": { @@ -1705,9 +1705,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.16.tgz", - "integrity": "sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz", + "integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==", "cpu": [ "arm64" ], @@ -1722,9 +1722,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.16.tgz", - "integrity": "sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz", + "integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==", "cpu": [ "x64" ], @@ -6542,14 +6542,14 @@ } }, "node_modules/rolldown": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.16.tgz", - "integrity": "sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz", + "integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.126.0", - "@rolldown/pluginutils": "1.0.0-rc.16" + "@oxc-project/types": "=0.127.0", + "@rolldown/pluginutils": "1.0.0-rc.17" }, "bin": { "rolldown": "bin/cli.mjs" @@ -6558,27 +6558,27 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.16", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.16", - "@rolldown/binding-darwin-x64": "1.0.0-rc.16", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.16", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.16", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.16", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.16", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.16", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.16", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.16", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.16", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.16", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.16", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.16", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.16" + "@rolldown/binding-android-arm64": "1.0.0-rc.17", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", + "@rolldown/binding-darwin-x64": "1.0.0-rc.17", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" } }, "node_modules/rolldown/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.16", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.16.tgz", - "integrity": "sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA==", + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz", + "integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==", "dev": true, "license": "MIT" }, @@ -7526,16 +7526,16 @@ } }, "node_modules/vite": { - "version": "8.0.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.9.tgz", - "integrity": "sha512-t7g7GVRpMXjNpa67HaVWI/8BWtdVIQPCL2WoozXXA7LBGEFK4AkkKkHx2hAQf5x1GZSlcmEDPkVLSGahxnEEZw==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz", + "integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.10", - "rolldown": "1.0.0-rc.16", + "rolldown": "1.0.0-rc.17", "tinyglobby": "^0.2.16" }, "bin": { diff --git a/src/frontend/package.json b/src/frontend/package.json index 72b4ed48..bd971316 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -62,7 +62,7 @@ "tailwindcss": "^4.2.2", "ts-prune": "^0.10.3", "typescript": "~6.0.3", - "vite": "^8.0.9", + "vite": "^8.0.10", "vitest": "^4.1.5" } } From 335b8680254fd239c76285faec3a697ea29d447a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 17:03:59 +0000 Subject: [PATCH 07/14] chore(deps-dev): bump jsdom from 29.0.2 to 29.1.0 in /src/frontend Bumps [jsdom](https://github.com/jsdom/jsdom) from 29.0.2 to 29.1.0. - [Commits](https://github.com/jsdom/jsdom/compare/v29.0.2...v29.1.0) --- updated-dependencies: - dependency-name: jsdom dependency-version: 29.1.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- src/frontend/package-lock.json | 96 +++++++++++++++++++--------------- src/frontend/package.json | 2 +- 2 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 88d5a437..f34f9772 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -41,7 +41,7 @@ "autoprefixer": "^10.5.0", "eslint": "^9.39.4", "eslint-plugin-jsx-a11y": "^6.8.0", - "jsdom": "^29.0.2", + "jsdom": "^29.1.0", "prettier": "^3.8.2", "tailwindcss": "^4.2.2", "ts-prune": "^0.10.3", @@ -67,14 +67,15 @@ } }, "node_modules/@asamuzakjp/css-color": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.10.tgz", - "integrity": "sha512-02OhhkKtgNRuicQ/nF3TRnGsxL9wp0r3Y7VlKWyOHHGmGyvXv03y+PnymU8FKFJMTjIr1Bk8U2g1HWSLrpAHww==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", "dev": true, "license": "MIT", "dependencies": { - "@csstools/css-calc": "^3.1.1", - "@csstools/css-color-parser": "^4.0.2", + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" }, @@ -83,12 +84,13 @@ } }, "node_modules/@asamuzakjp/dom-selector": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.9.tgz", - "integrity": "sha512-r3ElRr7y8ucyN2KdICwGsmj19RoN13CLCa/pvGydghWK6ZzeKQ+TcDjVdtEZz2ElpndM5jXw//B9CEee0mWnVg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", "dev": true, "license": "MIT", "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", "css-tree": "^3.2.1", @@ -98,6 +100,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/@asamuzakjp/nwsapi": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", @@ -387,9 +399,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.1.tgz", - "integrity": "sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.3.tgz", + "integrity": "sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==", "dev": true, "funding": [ { @@ -3551,13 +3563,13 @@ } }, "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">=20.19.0" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -5224,28 +5236,28 @@ } }, "node_modules/jsdom": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.2.tgz", - "integrity": "sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==", + "version": "29.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.0.tgz", + "integrity": "sha512-YNUc7fB9QuvSSQWfrH0xF+TyABkxUwx8sswgIDaCrw4Hol8BghdZDkITtZheRJeMtzWlnTfsM3bBBusRvpO1wg==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^5.1.5", - "@asamuzakjp/dom-selector": "^7.0.6", + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", "@bramus/specificity": "^2.4.2", - "@csstools/css-syntax-patches-for-csstree": "^1.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", "@exodus/bytes": "^1.15.0", "css-tree": "^3.2.1", "data-urls": "^7.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^6.0.0", "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.7", - "parse5": "^8.0.0", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^6.0.1", - "undici": "^7.24.5", + "undici": "^7.25.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", @@ -5264,16 +5276,6 @@ } } }, - "node_modules/jsdom/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/json-bigint": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", @@ -5709,6 +5711,16 @@ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, + "node_modules/lru-cache": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/lucide-react": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.8.0.tgz", @@ -6130,13 +6142,13 @@ } }, "node_modules/parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", - "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^6.0.0" + "entities": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -7447,9 +7459,9 @@ } }, "node_modules/undici": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz", - "integrity": "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", "dev": true, "license": "MIT", "engines": { diff --git a/src/frontend/package.json b/src/frontend/package.json index 72b4ed48..a62225df 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -57,7 +57,7 @@ "autoprefixer": "^10.5.0", "eslint": "^9.39.4", "eslint-plugin-jsx-a11y": "^6.8.0", - "jsdom": "^29.0.2", + "jsdom": "^29.1.0", "prettier": "^3.8.2", "tailwindcss": "^4.2.2", "ts-prune": "^0.10.3", From 7adfd17edf44d8d00b53225d1be1d7ba6010111f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 17:07:19 +0000 Subject: [PATCH 08/14] chore(deps-dev): bump prettier from 3.8.2 to 3.8.3 in /src/frontend Bumps [prettier](https://github.com/prettier/prettier) from 3.8.2 to 3.8.3. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.8.2...3.8.3) --- updated-dependencies: - dependency-name: prettier dependency-version: 3.8.3 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- src/frontend/package-lock.json | 8 ++++---- src/frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 02af179f..b06c46c3 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -42,7 +42,7 @@ "eslint": "^9.39.4", "eslint-plugin-jsx-a11y": "^6.8.0", "jsdom": "^29.1.0", - "prettier": "^3.8.2", + "prettier": "^3.8.3", "tailwindcss": "^4.2.2", "ts-prune": "^0.10.3", "typescript": "~6.0.3", @@ -6359,9 +6359,9 @@ } }, "node_modules/prettier": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.2.tgz", - "integrity": "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", "bin": { diff --git a/src/frontend/package.json b/src/frontend/package.json index a22e0a76..139a6912 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -58,7 +58,7 @@ "eslint": "^9.39.4", "eslint-plugin-jsx-a11y": "^6.8.0", "jsdom": "^29.1.0", - "prettier": "^3.8.2", + "prettier": "^3.8.3", "tailwindcss": "^4.2.2", "ts-prune": "^0.10.3", "typescript": "~6.0.3", From 6eb1280330a6f26de92b5565102465982d63f276 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 17:07:35 +0000 Subject: [PATCH 09/14] chore(deps): bump lucide-react from 1.8.0 to 1.11.0 in /src/frontend Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.8.0 to 1.11.0. - [Commits](https://github.com/lucide-icons/lucide/commits/1.11.0/packages/lucide-react) --- updated-dependencies: - dependency-name: lucide-react dependency-version: 1.11.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- src/frontend/package-lock.json | 8 ++++---- src/frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 02af179f..a9d9e1bf 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -20,7 +20,7 @@ "diff-match-patch": "^1.0.5", "dompurify": "^3.4.0", "i18next": "^26.0.6", - "lucide-react": "^1.8.0", + "lucide-react": "^1.11.0", "marked": "18.0.2", "react": "^19.2.5", "react-dom": "^19.2.5", @@ -5786,9 +5786,9 @@ } }, "node_modules/lucide-react": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.8.0.tgz", - "integrity": "sha512-WuvlsjngSk7TnTBJ1hsCy3ql9V9VOdcPkd3PKcSmM34vJD8KG6molxz7m7zbYFgICwsanQWmJ13JlYs4Zp7Arw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.11.0.tgz", + "integrity": "sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" diff --git a/src/frontend/package.json b/src/frontend/package.json index a22e0a76..42d185b1 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -33,7 +33,7 @@ "diff-match-patch": "^1.0.5", "dompurify": "^3.4.0", "i18next": "^26.0.6", - "lucide-react": "^1.8.0", + "lucide-react": "^1.11.0", "marked": "18.0.2", "react": "^19.2.5", "react-dom": "^19.2.5", From a08f471641c03ddcf309bb3a807bae02ec2078cb Mon Sep 17 00:00:00 2001 From: StableLlama Date: Mon, 27 Apr 2026 19:17:08 +0200 Subject: [PATCH 10/14] Prevent highlighting when loading --- .../features/editor/Editor.sync.test.tsx | 27 ++++++++ src/frontend/features/editor/Editor.tsx | 17 ++++- src/frontend/features/story/useStory.test.ts | 12 ++++ src/frontend/features/story/useStory.ts | 64 +++++++++++++------ src/frontend/package-lock.json | 2 +- 5 files changed, 101 insertions(+), 21 deletions(-) diff --git a/src/frontend/features/editor/Editor.sync.test.tsx b/src/frontend/features/editor/Editor.sync.test.tsx index 2b2f6b9a..f7db36f8 100644 --- a/src/frontend/features/editor/Editor.sync.test.tsx +++ b/src/frontend/features/editor/Editor.sync.test.tsx @@ -117,6 +117,33 @@ describe('Editor diff highlighting', () => { expect(cmContent?.innerHTML).not.toContain('diff-inserted'); }); + it('resets diff baseline when switching to a new chapter with no baseline', async () => { + const firstChapter = { ...mockChapter, content: 'Original content with AI' }; + const secondChapter = { + ...mockChapter, + id: '2', + title: 'Chapter 2', + content: 'Second chapter text', + }; + + const { rerender } = render( + + ); + + await act(async () => { + rerender( + + ); + }); + + const cmContent = document.querySelector('.cm-content'); + expect(cmContent?.innerHTML).not.toContain('diff-inserted'); + }); + it('shows streaming content from store slot with correct diff during streaming', async () => { const { rerender } = render(); diff --git a/src/frontend/features/editor/Editor.tsx b/src/frontend/features/editor/Editor.tsx index c7407489..f5ca17aa 100644 --- a/src/frontend/features/editor/Editor.tsx +++ b/src/frontend/features/editor/Editor.tsx @@ -153,6 +153,22 @@ export const Editor = React.memo( const prevBaselineRef = useRef(baselineContent); // Keep the last non-undefined baseline so undo can restore the diff view. const savedBaselineRef = useRef(baselineContent); + const lastChapterIdRef = useRef(chapter.id); + + useEffect(() => { + const isChapterSwitch = chapter.id !== lastChapterIdRef.current; + if (!isChapterSwitch) return; + + lastChapterIdRef.current = chapter.id; + prevBaselineRef.current = baselineContent; + setLocalBaseline(baselineContent); + if (baselineContent !== undefined && baselineContent !== chapter.content) { + savedBaselineRef.current = baselineContent; + } else if (baselineContent === undefined) { + savedBaselineRef.current = undefined; + } + }, [chapter.id, baselineContent, chapter.content]); + if (baselineContent !== prevBaselineRef.current) { prevBaselineRef.current = baselineContent; setLocalBaseline(baselineContent); @@ -181,7 +197,6 @@ export const Editor = React.memo( // switch, AI update, undo/redo). Use chapter.id as the primary trigger // for chapter switches; also watch chapter.content so AI insertions and // undo/redo (which can change content without changing id) are reflected. - const lastChapterIdRef = useRef(chapter.id); useEffect(() => { const isChapterSwitch = chapter.id !== lastChapterIdRef.current; lastChapterIdRef.current = chapter.id; diff --git a/src/frontend/features/story/useStory.test.ts b/src/frontend/features/story/useStory.test.ts index bb1bba4f..f5e39cdf 100644 --- a/src/frontend/features/story/useStory.test.ts +++ b/src/frontend/features/story/useStory.test.ts @@ -377,6 +377,18 @@ describe('buildInitialStoryState', () => { expect(result.current.baselineState.chapters[0]?.content).toBe('Original content'); }); + it('syncs baselineState when the current chapter content is loaded lazily', async () => { + const chapter = buildChapter('1', 'Loaded content'); + const { result } = await hookWithStory('initial', [chapter]); + + await act(async () => { + await Promise.resolve(); + }); + + expect(result.current.story.chapters[0]?.content).toBe('Loaded content'); + expect(result.current.baselineState.chapters[0]?.content).toBe('Loaded content'); + }); + it('merges undo/redo handlers into current history entry if state is unchanged', async () => { const { result } = renderHook(() => useStory({ diff --git a/src/frontend/features/story/useStory.ts b/src/frontend/features/story/useStory.ts index 50651655..dfd85753 100644 --- a/src/frontend/features/story/useStory.ts +++ b/src/frontend/features/story/useStory.ts @@ -357,25 +357,51 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { const res = await api.chapters.get(Number(currentChapterId)); lastLoadedChapterId.current = currentChapterId; startTransition(() => { - useStoryStore.setState((state: StoryStoreState) => ({ - story: { - ...state.story, - chapters: state.story.chapters.map((c: Chapter) => - c.id === currentChapterId - ? { - ...c, - content: res.content, - notes: res.notes ?? undefined, - private_notes: res.private_notes ?? undefined, - conflicts: (res.conflicts ?? []) as Conflict[], - title: res.title ?? undefined, - summary: res.summary ?? undefined, - } - : c - ), - }, - isChapterLoading: false, - })); + useStoryStore.setState((state: StoryStoreState) => { + const baselineChapter = state.baselineState.chapters.find( + (chapter: Chapter) => chapter.id === currentChapterId + ); + const shouldSyncBaseline = + baselineChapter !== undefined && (baselineChapter.content ?? '') === ''; + + return { + story: { + ...state.story, + chapters: state.story.chapters.map((c: Chapter) => + c.id === currentChapterId + ? { + ...c, + content: res.content, + notes: res.notes ?? undefined, + private_notes: res.private_notes ?? undefined, + conflicts: (res.conflicts ?? []) as Conflict[], + title: res.title ?? undefined, + summary: res.summary ?? undefined, + } + : c + ), + }, + baselineState: shouldSyncBaseline + ? { + ...state.baselineState, + chapters: state.baselineState.chapters.map((chapter: Chapter) => + chapter.id === currentChapterId + ? { + ...chapter, + content: res.content, + notes: res.notes ?? undefined, + private_notes: res.private_notes ?? undefined, + conflicts: (res.conflicts ?? []) as Conflict[], + title: res.title ?? undefined, + summary: res.summary ?? undefined, + } + : chapter + ), + } + : state.baselineState, + isChapterLoading: false, + }; + }); }); } catch (e) { console.error('Failed to load chapter content', e); diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 407d6c9b..fc82df28 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -7586,7 +7586,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", From 965150be449126e78981af82d13051dcb24e019c Mon Sep 17 00:00:00 2001 From: StableLlama Date: Mon, 27 Apr 2026 19:20:29 +0200 Subject: [PATCH 11/14] Bump release date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f672b77d..31f5ef6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [0.9.0] - 2026-04-26 +## [0.9.0] - 2026-04-27 ### Added From e72070da2653a38b5f703e6b1da7e98f8e7f97cb Mon Sep 17 00:00:00 2001 From: StableLlama Date: Mon, 27 Apr 2026 19:59:12 +0200 Subject: [PATCH 12/14] Fix undo after (re)load --- .../features/app/useAppControlProps.ts | 20 ++- src/frontend/features/editor/Editor.tsx | 7 +- .../features/layout/layoutControlTypes.ts | 16 +- src/frontend/features/story/useStory.test.ts | 140 +++++++++++++++++- src/frontend/features/story/useStory.ts | 115 ++++++++++---- src/frontend/stores/storyStore.ts | 20 ++- 6 files changed, 272 insertions(+), 46 deletions(-) diff --git a/src/frontend/features/app/useAppControlProps.ts b/src/frontend/features/app/useAppControlProps.ts index 611448d8..d93cc28d 100644 --- a/src/frontend/features/app/useAppControlProps.ts +++ b/src/frontend/features/app/useAppControlProps.ts @@ -84,7 +84,13 @@ type UseAppMainLayoutPropsParams = { currentChapterId: string | null; handleChapterSelect: (chapterId: string | null) => void; deleteChapter: (chapterId: string) => Promise; - updateChapter: (id: string, partial: Record) => Promise; + updateChapter: ( + id: string, + partial: Record, + sync?: boolean, + pushHistory?: boolean, + isUserEdit?: boolean + ) => Promise; updateBook: (id: string, partial: Record) => Promise; addChapter: (title?: string, content?: string, bookId?: string) => Promise; handleBookCreate: (title: string) => Promise; @@ -336,6 +342,7 @@ export function useAppHeaderProps(params: UseAppHeaderPropsParams): AppHeaderPro ); } +// eslint-disable-next-line max-lines-per-function export function useAppMainLayoutProps(params: UseAppMainLayoutPropsParams): { sidebarControls: AppMainLayoutProps['sidebarControls']; editorControls: AppMainLayoutProps['editorControls']; @@ -373,8 +380,8 @@ export function useAppMainLayoutProps(params: UseAppMainLayoutPropsParams): { refreshStory, undo, redo, - canUndo, - canRedo, + _canUndo, + _canRedo, searchState, currentChapter, isChapterLoading, @@ -464,11 +471,14 @@ export function useAppMainLayoutProps(params: UseAppMainLayoutPropsParams): { ] ); const editorUpdateChapter = useCallback( - (id: string, partial: Record) => { + (id: string, partial: Record, isUndoRedo?: boolean) => { if ('content' in partial) { searchStateRef.current.notifyContentChanged(Number.parseInt(id, 10)); } - return updateChapter(id, partial); + if (isUndoRedo) { + return updateChapter(id, partial, true, false, false); + } + return updateChapter(id, partial, true, true, true); }, [updateChapter] ); diff --git a/src/frontend/features/editor/Editor.tsx b/src/frontend/features/editor/Editor.tsx index f5ca17aa..8c379420 100644 --- a/src/frontend/features/editor/Editor.tsx +++ b/src/frontend/features/editor/Editor.tsx @@ -55,7 +55,7 @@ interface EditorProps { viewMode: ViewMode; showWhitespace?: boolean; onToggleShowWhitespace?: () => void; - onChange: (id: string, updates: Partial) => void; + onChange: (id: string, updates: Partial, isUndoRedo?: boolean) => void; baselineContent?: string; language?: string; spellCheck?: boolean; @@ -779,10 +779,11 @@ export const Editor = React.memo( setLocalBaseline(undefined); } scheduleCheckContext(); - if (contentDebounceRef.current) + if (contentDebounceRef.current) { clearTimeout(contentDebounceRef.current); + } contentDebounceRef.current = setTimeout(() => { - onChange(chapter.id, { content: val }); + onChange(chapter.id, { content: val }, isUndoRedo); }, DEBOUNCE_MS); }} onSelectionChange={scheduleCheckContext} diff --git a/src/frontend/features/layout/layoutControlTypes.ts b/src/frontend/features/layout/layoutControlTypes.ts index f1a0e306..dfa5f6ea 100644 --- a/src/frontend/features/layout/layoutControlTypes.ts +++ b/src/frontend/features/layout/layoutControlTypes.ts @@ -124,7 +124,13 @@ export type MainSidebarControls = { currentChapterId: string | null; handleChapterSelect: (id: string | null) => void; deleteChapter: (id: string) => Promise; - updateChapter: (id: string, partial: Partial) => Promise; + updateChapter: ( + id: string, + partial: Partial, + sync?: boolean, + pushHistory?: boolean, + isUserEdit?: boolean + ) => Promise; updateBook: ( id: string, partial: { title?: string; summary?: string } @@ -223,7 +229,13 @@ export type MainEditorControls = { v: EditorSettings | ((prev: EditorSettings) => EditorSettings) ) => void; viewMode: ViewMode; - updateChapter: (id: string, partial: Partial) => Promise; + updateChapter: ( + id: string, + partial: Partial, + sync?: boolean, + pushHistory?: boolean, + isUserEdit?: boolean + ) => Promise; suggestionControls: MainEditorSuggestionControls; aiControls: MainEditorAiControls; setActiveFormats: (v: string[]) => void; diff --git a/src/frontend/features/story/useStory.test.ts b/src/frontend/features/story/useStory.test.ts index f5e39cdf..ae9a1e85 100644 --- a/src/frontend/features/story/useStory.test.ts +++ b/src/frontend/features/story/useStory.test.ts @@ -14,7 +14,7 @@ import { act, renderHook } from '@testing-library/react'; import { StoryState } from '../../types'; import { api } from '../../services/api'; -import { resetStoryStore } from '../../stores/storyStore'; +import { resetStoryStore, useStoryStore } from '../../stores/storyStore'; import { buildInitialStoryState, resolveExternalHistorySourceState, @@ -56,25 +56,38 @@ const buildStory = (summary: string): StoryState => ({ draft: null, }); -const buildChapter = (id: string, content: string) => ({ +type StoryTestChapter = { + id: string; + title: string; + summary: string; + content: string; + filename: string; + book_id: string | undefined; + notes: string; + private_notes: string; + conflicts: Array<{ id: string; description: string; resolution: string }>; +}; + +const buildChapter = (id: string, content: string): StoryTestChapter => ({ id, title: `Chapter ${id}`, summary: '', content, filename: `ch${id}.md`, - book_id: undefined as string | undefined, + book_id: undefined, notes: '', private_notes: '', - conflicts: [] as { id: string; description: string; resolution: string }[], + conflicts: [], }); -const baseHook = () => useStory({ confirm: async () => true, alert: () => {} }); +const baseHook = (): ReturnType => + useStory({ confirm: async () => true, alert: () => {} }); /** Render the hook and perform the initial loadStory so history starts clean. */ const hookWithStory = async ( summary: string = 'initial', chapters: ReturnType[] = [] -) => { +): Promise> => { // The lazy-load useEffect inside useStory calls api.chapters.get whenever // currentChapterId changes. A previous test in this file may have left a // mock that returns {content: ''}, which would silently overwrite the @@ -149,6 +162,7 @@ describe('resolveExternalHistorySourceState', () => { }); }); +// eslint-disable-next-line max-lines-per-function describe('buildInitialStoryState', () => { it('hydrates story-level notes fields from selected project payload', () => { const state = buildInitialStoryState( @@ -357,6 +371,55 @@ describe('buildInitialStoryState', () => { expect(result.current.historySize).toBe(2); // no-op duplicate suppressed }); + it('preserves selected chapter when undoing after editing a later chapter', async () => { + const first = buildChapter('1', 'First chapter'); + const second = buildChapter('2', 'Second chapter'); + const { result } = await hookWithStory('initial', [first, second]); + + act(() => { + result.current.selectChapter('2'); + }); + + await act(async () => { + await result.current.updateChapter( + '2', + { content: 'Second chapter edited' }, + false, + true, + true + ); + }); + + expect(result.current.currentChapterId).toBe('2'); + + await act(async () => { + await result.current.undo(); + }); + + expect(result.current.currentChapterId).toBe('2'); + expect( + result.current.story.chapters.find((ch: { id: string }) => ch.id === '2')?.content + ).toBe('Second chapter'); + }); + + it('restores original chapter content when undoing a deletion', async () => { + const chapter = buildChapter('1', 'Hello world'); + const { result } = await hookWithStory('initial', [chapter]); + + await act(async () => { + await result.current.updateChapter('1', { content: 'Hello ' }, false, true, true); + }); + + expect(result.current.story.chapters[0]?.content).toBe('Hello '); + + await act(async () => { + await result.current.undo(); + }); + + expect(result.current.story.chapters[0]?.content).toBe('Hello world'); + expect(result.current.baselineState.chapters[0]?.content).toBe('Hello '); + }); + it('preserves the pre-update baseline when pushing external history entries', async () => { const ch = buildChapter('1', 'Original content'); const { result } = await hookWithStory('initial', [ch]); @@ -389,6 +452,70 @@ describe('buildInitialStoryState', () => { expect(result.current.baselineState.chapters[0]?.content).toBe('Loaded content'); }); + it('preserves the lazily loaded original chapter state in the undo stack', async () => { + const chapter = { + id: '1', + title: 'Chapter 1', + summary: '', + content: '', + filename: 'ch1.md', + book_id: undefined as string | undefined, + notes: '', + private_notes: '', + conflicts: [], + }; + const hook = renderHook(() => baseHook()); + + vi.mocked(api.chapters.get).mockResolvedValue({ + content: 'Hello world', + notes: '', + private_notes: '', + conflicts: [], + title: 'Chapter 1', + summary: '', + } as unknown as Awaited>); + + await act(async () => { + hook.result.current.loadStory({ + ...buildStory('initial'), + id: 'demo', + title: 'Demo', + chapters: [chapter], + currentChapterId: '1', + }); + }); + + await act(async () => { + await Promise.resolve(); + }); + + expect(hook.result.current.story.chapters[0]?.content).toBe('Hello world'); + expect(useStoryStore.getState().history[0].state.chapters[0]?.content).toBe( + 'Hello world' + ); + + await act(async () => { + await hook.result.current.updateChapter( + '1', + { content: 'Hello ' }, + false, + true, + true + ); + }); + + expect(hook.result.current.story.chapters[0]?.content).toBe('Hello '); + + await act(async () => { + await hook.result.current.undo(); + }); + + expect(hook.result.current.story.chapters[0]?.content).toBe('Hello world'); + expect(useStoryStore.getState().history[0].state.chapters[0]?.content).toBe( + 'Hello world' + ); + }); + it('merges undo/redo handlers into current history entry if state is unchanged', async () => { const { result } = renderHook(() => useStory({ @@ -532,6 +659,7 @@ describe('buildInitialStoryState', () => { // - redo → baseline = state we left (shows re-inserted text) // - loadStory → baseline = the loaded state (no highlight) +// eslint-disable-next-line max-lines-per-function describe('baselineState diff highlighting', () => { it('starts with baseline equal to current state (no highlight on load)', async () => { const ch = buildChapter('1', 'Hello world'); diff --git a/src/frontend/features/story/useStory.ts b/src/frontend/features/story/useStory.ts index dfd85753..3b481c86 100644 --- a/src/frontend/features/story/useStory.ts +++ b/src/frontend/features/story/useStory.ts @@ -119,6 +119,7 @@ export const buildInitialStoryState = ( lastUpdated: Date.now(), }); +// eslint-disable-next-line max-lines-per-function, @typescript-eslint/explicit-function-return-type export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { // --- State now lives in the Zustand storyStore -------------------------------- // Components that subscribe to the store with granular selectors only re-render @@ -148,8 +149,19 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { const pushState = useCallback( (newState: StoryState, label: string, isUserEdit: boolean = true) => { - const { history, currentIndex } = useStoryStore.getState(); - const updatedState = { ...newState, lastUpdated: Date.now() }; + const { + history, + currentIndex, + currentChapterId: selectedChapterId, + } = useStoryStore.getState(); + const updatedState = { + ...newState, + lastUpdated: Date.now(), + currentChapterId: + newState.currentChapterId !== undefined + ? newState.currentChapterId + : selectedChapterId, + }; const currentEntry = history[currentIndex]; if ( !isUserEdit && @@ -176,6 +188,9 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { currentIndex: bounded.length - 1, baselineState: newBaseline, }); + useStoryStore + .getState() + .setCurrentChapterId(updatedState.currentChapterId ?? null); latestStoryRef.current = updatedState; }, [] // empty – all state accessed via useStoryStore.getState() @@ -216,7 +231,15 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { latestStoryRef.current, latestStoryRef.current ); - const updatedState = { ...sourceState, lastUpdated: Date.now() }; + const selectedChapterId = useStoryStore.getState().currentChapterId; + const updatedState = { + ...sourceState, + lastUpdated: Date.now(), + currentChapterId: + sourceState.currentChapterId !== undefined + ? sourceState.currentChapterId + : selectedChapterId, + }; const currentEntry = history[currentIndex]; if ( @@ -342,9 +365,12 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { ); const selectChapter = useCallback((id: string | null) => { - if (id !== useStoryStore.getState().currentChapterId) { + const state = useStoryStore.getState(); + if (id !== state.currentChapterId) { lastLoadedChapterId.current = null; - useStoryStore.getState().setCurrentChapterId(id); + state.setCurrentChapterId(id); + state.setStory((prev: StoryState) => ({ ...prev, currentChapterId: id })); + latestStoryRef.current = { ...latestStoryRef.current, currentChapterId: id }; } }, []); @@ -352,7 +378,7 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { useEffect(() => { if (currentChapterId && currentChapterId !== lastLoadedChapterId.current) { useStoryStore.setState({ isChapterLoading: true }); - const loadContent = async () => { + const loadContent = async (): Promise => { try { const res = await api.chapters.get(Number(currentChapterId)); lastLoadedChapterId.current = currentChapterId; @@ -363,23 +389,51 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { ); const shouldSyncBaseline = baselineChapter !== undefined && (baselineChapter.content ?? '') === ''; + const updatedChapters = state.story.chapters.map((c: Chapter) => + c.id === currentChapterId + ? { + ...c, + content: res.content, + notes: res.notes ?? undefined, + private_notes: res.private_notes ?? undefined, + conflicts: (res.conflicts ?? []) as Conflict[], + title: res.title ?? undefined, + summary: res.summary ?? undefined, + } + : c + ); + + const nextHistory = + state.currentIndex === 0 && state.history.length === 1 + ? state.history.map((entry: StoryHistoryEntry, idx: number) => + idx !== 0 + ? entry + : { + ...entry, + state: { + ...entry.state, + chapters: entry.state.chapters.map((chapter: Chapter) => + chapter.id === currentChapterId + ? { + ...chapter, + content: res.content, + notes: res.notes ?? undefined, + private_notes: res.private_notes ?? undefined, + conflicts: (res.conflicts ?? []) as Conflict[], + title: res.title ?? undefined, + summary: res.summary ?? undefined, + } + : chapter + ), + }, + } + ) + : state.history; return { story: { ...state.story, - chapters: state.story.chapters.map((c: Chapter) => - c.id === currentChapterId - ? { - ...c, - content: res.content, - notes: res.notes ?? undefined, - private_notes: res.private_notes ?? undefined, - conflicts: (res.conflicts ?? []) as Conflict[], - title: res.title ?? undefined, - summary: res.summary ?? undefined, - } - : c - ), + chapters: updatedChapters, }, baselineState: shouldSyncBaseline ? { @@ -399,6 +453,7 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { ), } : state.baselineState, + history: nextHistory, isChapterLoading: false, }; }); @@ -516,6 +571,7 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { [] ); + /* eslint-disable complexity */ const updateStoryDraft = useCallback( async ( partial: Partial, @@ -577,6 +633,7 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { }, [] ); + /* eslint-enable complexity */ const updateStoryImageSettings = useCallback(async (style: string, info: string) => { const story = latestStoryRef.current; @@ -678,7 +735,7 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { }, []); const addChapter = useCallback( - async (title: string = 'New Chapter', summary: string = '', bookId?: string) => { + async (title: string = 'New Chapter', _summary: string = '', bookId?: string) => { try { const res = await api.chapters.create(title, '', bookId); const chaptersRes = await api.chapters.list(); @@ -751,29 +808,31 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { }, []); const loadStory = useCallback( - (newStory: StoryState) => { + (storyToLoad: StoryState) => { // Keep backend active-project context aligned before local state updates. - if (newStory.id) { + if (storyToLoad.id) { api.projects - .select(newStory.id) + .select(storyToLoad.id) .then(() => fetchStory()) .catch((e: unknown) => console.error('Failed to select project', e)); } + const loadedChapterId = + storyToLoad.currentChapterId ?? + (storyToLoad.chapters.length > 0 ? storyToLoad.chapters[0].id : null); + const newStory = { ...storyToLoad, currentChapterId: loadedChapterId }; + useStoryStore.setState({ story: newStory, history: [createHistoryEntry(newStory, 'Load story')], currentIndex: 0, baselineState: newStory, isChapterLoading: false, + currentChapterId: loadedChapterId, }); latestStoryRef.current = newStory; lastLoadedChapterId.current = null; useStoryStore.getState().incrementLoadChapterSignal(); - const newChapterId = - newStory.currentChapterId ?? - (newStory.chapters.length > 0 ? newStory.chapters[0].id : null); - useStoryStore.setState({ currentChapterId: newChapterId }); }, [story.id, fetchStory] ); @@ -907,7 +966,7 @@ export const useStory = (dialogs: StoryDialogs = defaultDialogs) => { if (idx >= 0) { // Compare only user-editable fields; keywords are auto-generated and // must not cause a spurious content-changed detection. - const sig = (e: SourcebookEntry) => + const sig = (e: SourcebookEntry): string => JSON.stringify({ name: e.name, description: e.description, diff --git a/src/frontend/stores/storyStore.ts b/src/frontend/stores/storyStore.ts index 05220d59..e7ae91f4 100644 --- a/src/frontend/stores/storyStore.ts +++ b/src/frontend/stores/storyStore.ts @@ -187,7 +187,7 @@ export const useStoryStore = create()( } else { const idx = prev.findIndex((e: SourcebookEntry) => e.id === entry.id); if (idx >= 0) { - const sig = (e: SourcebookEntry) => + const sig = (e: SourcebookEntry): string => JSON.stringify({ name: e.name, description: e.description, @@ -231,7 +231,23 @@ export const useStoryStore = create()( currentChapterId: string | null; currentIndex: number; baselineState: StoryState; - }) => set({ story, currentChapterId, currentIndex, baselineState }), + }) => + set((state: StoryStoreState) => { + const preservedCurrentChapterId = state.currentChapterId + ? story.chapters.some( + (chapter: Chapter) => chapter.id === state.currentChapterId + ) + ? state.currentChapterId + : currentChapterId + : currentChapterId; + + return { + story, + currentChapterId: preservedCurrentChapterId, + currentIndex, + baselineState, + }; + }), }) ); From 80705c418e54b4a6b58ac69a25497bf506ba158b Mon Sep 17 00:00:00 2001 From: StableLlama Date: Mon, 27 Apr 2026 20:03:59 +0200 Subject: [PATCH 13/14] try to fix GH complaint --- src/frontend/features/app/useAppControlProps.ts | 2 -- src/frontend/features/story/useStory.ts | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/frontend/features/app/useAppControlProps.ts b/src/frontend/features/app/useAppControlProps.ts index d93cc28d..ad5448bf 100644 --- a/src/frontend/features/app/useAppControlProps.ts +++ b/src/frontend/features/app/useAppControlProps.ts @@ -380,8 +380,6 @@ export function useAppMainLayoutProps(params: UseAppMainLayoutPropsParams): { refreshStory, undo, redo, - _canUndo, - _canRedo, searchState, currentChapter, isChapterLoading, diff --git a/src/frontend/features/story/useStory.ts b/src/frontend/features/story/useStory.ts index 3b481c86..55328810 100644 --- a/src/frontend/features/story/useStory.ts +++ b/src/frontend/features/story/useStory.ts @@ -34,6 +34,7 @@ import { buildDraftUpdateLabel, createHistoryEntry, } from './historyUtils'; +import type { StoryHistoryEntry } from './historyUtils'; import { useStoryStore, StoryStoreState } from '../../stores/storyStore'; /** Maximum number of undo/redo states retained in memory. */ From 8c57248e017810189a2cf5e9675bb2815dc269c9 Mon Sep 17 00:00:00 2001 From: StableLlama Date: Mon, 27 Apr 2026 20:56:11 +0200 Subject: [PATCH 14/14] fix cursor shape at chapters --- src/frontend/features/chapters/ChapterList.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/frontend/features/chapters/ChapterList.tsx b/src/frontend/features/chapters/ChapterList.tsx index e997925c..1733fdbc 100644 --- a/src/frontend/features/chapters/ChapterList.tsx +++ b/src/frontend/features/chapters/ChapterList.tsx @@ -433,8 +433,8 @@ export const ChapterList: React.FC = React.memo( }`} >
-

- {renderSummary()} -

); };