chore: upgrade to eslint v9#2574
Conversation
📝 WalkthroughWalkthroughReplaces legacy ESLint config with a new flat config and upgrades lint tooling; applies widespread lint-driven edits including switching many Changes
Sequence Diagram(s)(omitted) Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. 📝 Coding Plan
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment Tip CodeRabbit can use TruffleHog to scan for secrets in your code with verification capabilities.Add a TruffleHog config file (e.g. trufflehog-config.yml, trufflehog.yml) to your project to customize detectors and scanning behavior. The tool runs only when a config file is present. |
c4de878 to
a7587b8
Compare
|
This pull request has merge conflicts. Please resolve the conflicts so the PR can be successfully reviewed and merged. |
a7587b8 to
c342899
Compare
c342899 to
2c9e6c4
Compare
There was a problem hiding this comment.
Actionable comments posted: 10
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (5)
src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsx (1)
91-111:⚠️ Potential issue | 🟠 MajorPersist the selected Pushover sound.
This form renders a
soundfield, but these initial values and the save payload never include it. Right now a user can change the sound, get a success toast, and then haverevalidate()snap the selector back because nothing was actually stored.Proposed fix
initialValues={{ pushoverApplicationToken: data?.pushoverApplicationToken, pushoverUserKey: data?.pushoverUserKey, + sound: data?.pushoverSound ?? '', types: data?.notificationTypes.pushover ?? 0, }} @@ await axios.post(`/api/v1/user/${user?.id}/settings/notifications`, { pgpKey: data?.pgpKey, discordId: data?.discordId, pushbulletAccessToken: data?.pushbulletAccessToken, pushoverApplicationToken: values.pushoverApplicationToken, + pushoverSound: values.sound, pushoverUserKey: values.pushoverUserKey, telegramChatId: data?.telegramChatId, telegramSendSilently: data?.telegramSendSilently, notificationTypes: { pushover: values.types,🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsx` around lines 91 - 111, The Pushover sound field isn't persisted: add the sound value to initialValues and include it in the save payload so changes are stored and survive revalidate. Specifically, set initialValues to include data?.pushoverSound (alongside pushoverApplicationToken, pushoverUserKey, types) and in the onSubmit axios.post body include the selected sound from the form (e.g., pushoverSound: values.sound or the actual field name used in the form). Update references in UserNotificationsPushover (initialValues and onSubmit) to use that field name so the backend receives and persists the selected sound.src/components/Settings/SettingsNetwork/index.tsx (1)
149-169:⚠️ Potential issue | 🟡 MinorUnconditionally coercing disabled numeric fields sends NaN to the backend.
When
dnsCacheForceMinTtl,dnsCacheForceMaxTtl, orproxyPortare disabled (via their feature flags), their form values remain undefined. Lines 156–157 and 162 still postNumber(values.dnsCacheForceMinTtl),Number(values.dnsCacheForceMaxTtl), andNumber(values.proxyPort)unconditionally, which coerces undefined to NaN.The backend's POST handler (
server/routes/settings/index.ts:91–98) performs no validation and merges the request body directly into settings. NaN persists in storage, and on app startup (server/utils/dnsCache.ts:22–23), the checktypeof NaN === 'number'incorrectly passes, allowing NaN to propagate into DnsCacheManager initialization.Guard these fields conditionally or omit them from the payload when disabled to prevent NaN from being saved.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/Settings/SettingsNetwork/index.tsx` around lines 149 - 169, The payload currently coerces undefined to NaN by unconditionally calling Number(...) for dnsCacheForceMinTtl, dnsCacheForceMaxTtl, and proxyPort in the axios POST inside the SettingsNetwork component; update the request construction so those numeric fields are only included (or converted) when their feature flags are enabled (e.g. values.dnsCacheEnabled for dnsCache.{forceMinTtl,forceMaxTtl} and values.proxyEnabled for proxy.port) and otherwise omit them from the dnsCache and proxy objects in the POST body to avoid sending NaN to the backend.src/components/Login/AddEmailModal.tsx (1)
64-75:⚠️ Potential issue | 🟠 MajorSurface submit failures instead of swallowing them.
This required first-login step still fails silently. If the POST rejects, the modal stays open with no field error, status message, or toast, which leaves the user without a recovery path.
I can wire this up with a Formik status/error message or a toast if you want me to sketch the patch.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/Login/AddEmailModal.tsx` around lines 64 - 75, The onSubmit handler in AddEmailModal currently swallows errors from the axios.post('/api/v1/auth/jellyfin') call; update the onSubmit implementation to catch the thrown error object, call formikHelpers.setSubmitting(false), and surface the failure to the user by either setting a Formik status (e.g., formikHelpers.setStatus({submitError: error.message})) or setting a field error with formikHelpers.setFieldError('email', '...'), and/or trigger a toast (e.g., toast.error(error.message)); keep the successful path calling onSave() unchanged.src/pages/_app.tsx (1)
296-305:⚠️ Potential issue | 🟠 MajorOnly redirect on expected auth failures.
This catch currently turns any failure from
/api/v1/auth/meinto a/loginredirect. A 5xx, timeout, or local API misconfiguration will look like an expired session and hide the real outage. Please only redirect for the unauthenticated case and let unexpected failures bubble or be logged.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/pages/_app.tsx` around lines 296 - 305, The catch block currently redirects on any error; change it to only redirect when the failure is an authentication error (e.g., HTTP 401/403 or a specific UnauthenticatedError) and rethrow or log other errors so they bubble up; specifically, in the code around the call that fetches /api/v1/auth/me (the try/catch that leads to the redirect using router.pathname and ctx.res.writeHead/ctx.res.end), inspect the response status or error type and perform the ctx.res.writeHead(307, { Location: '/login' }) only when status === 401 (or 403 depending on your auth semantics), otherwise rethrow or log the error instead of redirecting.server/api/servarr/radarr.ts (1)
108-115:⚠️ Potential issue | 🟡 MinorDon't rewrite every lookup failure as
"Movie not found".This catch collapses auth errors, timeouts, and Radarr 5xxs into the same error as an actual empty lookup result. That makes add/remove failures much harder to diagnose. Only map the explicit no-result case to
"Movie not found"and preserve other lookup failures as lookup errors.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@server/api/servarr/radarr.ts` around lines 108 - 115, The catch in the Radarr TMDB lookup (the catch block around the get-by-TMDB-ID lookup, e.g., getMovieByTmdbId) incorrectly maps all failures to a generic "Movie not found"; change it so only an explicit no-result/404 case is converted to a new Error('Movie not found') while all other errors are rethrown or preserved. Concretely, inspect the caught error (e) for a 404 status or an empty-response condition and only then log and throw the "Movie not found" error; otherwise log the original error details and rethrow (or throw a wrapped error that preserves e as the cause) so auth/timeouts/5xx retain their original diagnostics. Ensure logger.error keeps the original error message/stack for non-404 cases and do not swallow the original error information when rethrowing.
🧹 Nitpick comments (1)
src/components/UserList/BulkEditModal.tsx (1)
60-64: Preserve the error context before swallowing it.This now drops all failure details, which makes bulk-update issues much harder to diagnose from client telemetry. If you don't need branching, consider keeping the error binding and forwarding it to your logger/reporting path before showing the toast.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/UserList/BulkEditModal.tsx` around lines 60 - 64, The catch block in BulkEditModal.tsx swallows the thrown error; change the catch to capture the error (e.g., catch (error)) and forward it to your logging/reporting path (e.g., call the project logger or error reporter, or console.error) before calling addToast(intl.formatMessage(messages.userfail), ...); reference the catch block surrounding addToast and the addToast/int1.formatMessage(messages.userfail) usage so you preserve error context for telemetry while still showing the user-facing toast.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@server/api/themoviedb/index.ts`:
- Around line 364-366: The thrown Error messages are mislabelled — update each
rethrow so the message matches the surrounding method (e.g., replace “[TMDB]
Failed to fetch TV show details” inside the TV show method with the correct
label, and likewise fix the messages in the rethrows inside discoverMovies, the
trending aggregator, and the other wrappers). Locate the throw new Error({...})
calls inside the functions that wrap TMDB calls (e.g., the TV show details
handler, discoverMovies handler, trending/all-trending handler) and change the
string to accurately describe that function’s operation while preserving the
original e.message and cause: e.g., throw new Error(`[TMDB] Failed to <actual
operation>: ${e.message}`, { cause: e }). Ensure all occurrences noted in the
review are updated consistently.
In `@server/lib/imageproxy.ts`:
- Around line 257-259: The current catch in server/lib/imageproxy.ts swallows
all filesystem errors when reading the cache; change it to catch (err) and only
treat missing files (err.code === 'ENOENT') as an empty cache, while rethrowing
or logging and throwing any other errors so upstream failures are not silently
ignored. Locate the cache-read code path (the try surrounding the cache
read/fs.readFile call in imageproxy.ts) and update the catch to inspect
err.code, return the empty-cache behaviour for ENOENT, and propagate non-ENOENT
errors (e.g., throw err or processLogger.error(...) then throw) so real IO
problems surface.
In `@server/routes/discover.ts`:
- Around line 881-883: The page parsing currently trusts req.query.page
truthiness and can yield 0, negatives or NaN; update the logic that sets page
(used to compute offset) to parse the query value and only accept it if it's a
positive integer, otherwise default to 1 — e.g. parse Number(req.query.page) (or
parseInt), then check Number.isInteger(page) && page > 0 before assigning to
page and computing offset; keep itemsPerPage and offset calculations the same
but use the validated page value.
In `@server/routes/user/index.ts`:
- Around line 879-881: req.query.page can be non-numeric or <=0 causing page and
offset to be NaN/negative; parse and validate it before computing offset:
convert req.query.page to an integer (e.g. parseInt or Number), if the result is
not a finite positive integer default to 1, then clamp with Math.max(1,
parsedPage) and use that value for page and offset calculation (itemsPerPage and
offset variables reference) so skip/offset are always a non-negative integer.
- Around line 293-295: The catch block currently maps every exception to a 404;
change it to differentiate EntityNotFoundError from other DB errors by importing
EntityNotFoundError (from TypeORM or your ORM) and using catch (err) { if (err
instanceof EntityNotFoundError) next({ status: 404, message: 'User subscriptions
not found.' }); else next(err); } so only missing-entity errors become 404s
while other exceptions propagate to the centralized error handler; apply the
same pattern to the other catch sites mentioned (around the blocks at 317–319,
371–373, 516–518) and ensure callers using Repository.find() are not expecting
exceptions for empty results (use findOneOrFail where you intend a not-found
exception).
In `@src/components/BlocklistedTagsSelector/index.tsx`:
- Around line 279-280: The bare catch that always throws
intl.formatMessage(messages.invalidKeyword, { keywordId }) masks real errors; in
the function where you validate the TMDB keyword (the catch block that
references keywordId and messages.invalidKeyword), inspect the caught error
(e.g., use axios.isAxiosError(error)) and examine error.response/data to
determine if the backend indicates "unknown keyword" before mapping to
invalidKeyword; for any other/unexpected axios errors rethrow or throw a wrapped
error that preserves the original error object so service failures (500,
network, rate-limit) are not misreported as invalidKeyword.
In `@src/components/RequestModal/MovieRequestModal.tsx`:
- Around line 170-172: The catch block only clears isUpdating on error; update
the cancel flow in the function that performs the cancel (e.g., the cancel
handler where setIsUpdating is used, likely handleCancel or cancelRequest) to
always reset the updating state by moving setIsUpdating(false) into a finally
block or calling it after the awaited request succeeds and in catch; ensure you
still invoke onComplete() if present but do not rely on it to clear isUpdating.
In `@src/components/Settings/OverrideRule/OverrideRuleModal.tsx`:
- Around line 194-196: In OverrideRuleModal's submit catch block, don't swallow
errors — set a visible error state and surface a toast/form error before
resolving; specifically, in the catch inside the component's submit handler
(OverrideRuleModal -> onSubmit / save flow) call your error UI (e.g.,
setSaveError or form.setError for the form field and/or toast.error with the
caught error message), ensure isSaving/isLoading is reset (e.g.,
setIsSaving(false)), and either rethrow or return a rejected promise so the
caller knows the save failed instead of silently returning to idle.
In `@src/components/Settings/RadarrModal/index.tsx`:
- Around line 271-273: The catch block in the RadarrModal submit flow currently
swallows failures; update the catch to accept the error, call the modal/form
error handler (e.g. setFormError or setErrorState) or trigger a toast with the
error message, ensure any submitting flag (e.g. setSubmitting) is cleared, and
do not proceed to reset/close the modal or resolve the submit handler; instead
return or rethrow after surfacing the error so the user sees the failure. Use
the existing submit handler (handleSubmit/onSave) and modal close/reset
functions in this file to locate where to stop closure and where to set the
error.
In `@src/components/Settings/SonarrModal/index.tsx`:
- Around line 307-309: The catch block in the SonarrModal submit flow currently
swallows errors; change it to catch (err) and surface the failure by setting the
form/error state and stopping the spinner — e.g., call the existing toast/error
UI (toast.error) or set a form-level error (setError or setSubmitError) with a
descriptive message including err.message, and ensure isSubmitting or submitting
state is set to false; do not treat the request as successful. Locate the submit
handler in SonarrModal (the async submit/handleSubmit function) and update its
catch to set the error UI and reset submitting state instead of leaving it
empty.
---
Outside diff comments:
In `@server/api/servarr/radarr.ts`:
- Around line 108-115: The catch in the Radarr TMDB lookup (the catch block
around the get-by-TMDB-ID lookup, e.g., getMovieByTmdbId) incorrectly maps all
failures to a generic "Movie not found"; change it so only an explicit
no-result/404 case is converted to a new Error('Movie not found') while all
other errors are rethrown or preserved. Concretely, inspect the caught error (e)
for a 404 status or an empty-response condition and only then log and throw the
"Movie not found" error; otherwise log the original error details and rethrow
(or throw a wrapped error that preserves e as the cause) so auth/timeouts/5xx
retain their original diagnostics. Ensure logger.error keeps the original error
message/stack for non-404 cases and do not swallow the original error
information when rethrowing.
In `@src/components/Login/AddEmailModal.tsx`:
- Around line 64-75: The onSubmit handler in AddEmailModal currently swallows
errors from the axios.post('/api/v1/auth/jellyfin') call; update the onSubmit
implementation to catch the thrown error object, call
formikHelpers.setSubmitting(false), and surface the failure to the user by
either setting a Formik status (e.g., formikHelpers.setStatus({submitError:
error.message})) or setting a field error with
formikHelpers.setFieldError('email', '...'), and/or trigger a toast (e.g.,
toast.error(error.message)); keep the successful path calling onSave()
unchanged.
In `@src/components/Settings/SettingsNetwork/index.tsx`:
- Around line 149-169: The payload currently coerces undefined to NaN by
unconditionally calling Number(...) for dnsCacheForceMinTtl,
dnsCacheForceMaxTtl, and proxyPort in the axios POST inside the SettingsNetwork
component; update the request construction so those numeric fields are only
included (or converted) when their feature flags are enabled (e.g.
values.dnsCacheEnabled for dnsCache.{forceMinTtl,forceMaxTtl} and
values.proxyEnabled for proxy.port) and otherwise omit them from the dnsCache
and proxy objects in the POST body to avoid sending NaN to the backend.
In
`@src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsx`:
- Around line 91-111: The Pushover sound field isn't persisted: add the sound
value to initialValues and include it in the save payload so changes are stored
and survive revalidate. Specifically, set initialValues to include
data?.pushoverSound (alongside pushoverApplicationToken, pushoverUserKey, types)
and in the onSubmit axios.post body include the selected sound from the form
(e.g., pushoverSound: values.sound or the actual field name used in the form).
Update references in UserNotificationsPushover (initialValues and onSubmit) to
use that field name so the backend receives and persists the selected sound.
In `@src/pages/_app.tsx`:
- Around line 296-305: The catch block currently redirects on any error; change
it to only redirect when the failure is an authentication error (e.g., HTTP
401/403 or a specific UnauthenticatedError) and rethrow or log other errors so
they bubble up; specifically, in the code around the call that fetches
/api/v1/auth/me (the try/catch that leads to the redirect using router.pathname
and ctx.res.writeHead/ctx.res.end), inspect the response status or error type
and perform the ctx.res.writeHead(307, { Location: '/login' }) only when status
=== 401 (or 403 depending on your auth semantics), otherwise rethrow or log the
error instead of redirecting.
---
Nitpick comments:
In `@src/components/UserList/BulkEditModal.tsx`:
- Around line 60-64: The catch block in BulkEditModal.tsx swallows the thrown
error; change the catch to capture the error (e.g., catch (error)) and forward
it to your logging/reporting path (e.g., call the project logger or error
reporter, or console.error) before calling
addToast(intl.formatMessage(messages.userfail), ...); reference the catch block
surrounding addToast and the addToast/int1.formatMessage(messages.userfail)
usage so you preserve error context for telemetry while still showing the
user-facing toast.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 5c90f366-e312-44f4-acf2-af992c2e69f1
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (83)
.eslintrc.jseslint.config.mtspackage.jsonserver/api/animelist.tsserver/api/jellyfin.tsserver/api/plextv.tsserver/api/pushover.tsserver/api/rating/imdbRadarrProxy.tsserver/api/rating/rottentomatoes.tsserver/api/servarr/base.tsserver/api/servarr/radarr.tsserver/api/servarr/sonarr.tsserver/api/tautulli.tsserver/api/themoviedb/index.tsserver/api/tvdb/index.tsserver/interfaces/api/common.tsserver/lib/imageproxy.tsserver/lib/notifications/index.tsserver/lib/overseerrMerge.tsserver/routes/avatarproxy.tsserver/routes/discover.tsserver/routes/media.tsserver/routes/user/index.tsserver/types/custom.d.tsserver/utils/appDataVolume.tsserver/utils/appVersion.tssrc/components/BlocklistBlock/index.tsxsrc/components/BlocklistedTagsSelector/index.tsxsrc/components/Discover/CreateSlider/index.tsxsrc/components/Discover/DiscoverSliderEdit/index.tsxsrc/components/Discover/index.tsxsrc/components/IssueDetails/IssueComment/index.tsxsrc/components/IssueDetails/index.tsxsrc/components/IssueModal/CreateIssueModal/index.tsxsrc/components/Layout/UserDropdown/MiniQuotaDisplay/index.tsxsrc/components/Login/AddEmailModal.tsxsrc/components/Login/JellyfinLogin.tsxsrc/components/Login/LocalLogin.tsxsrc/components/MovieDetails/index.tsxsrc/components/NotificationTypeSelector/index.tsxsrc/components/RequestCard/index.tsxsrc/components/RequestList/RequestItem/index.tsxsrc/components/RequestModal/CollectionRequestModal.tsxsrc/components/RequestModal/MovieRequestModal.tsxsrc/components/RequestModal/TvRequestModal.tsxsrc/components/Settings/Notifications/NotificationsDiscord.tsxsrc/components/Settings/Notifications/NotificationsEmail.tsxsrc/components/Settings/Notifications/NotificationsGotify/index.tsxsrc/components/Settings/Notifications/NotificationsNtfy/index.tsxsrc/components/Settings/Notifications/NotificationsPushbullet/index.tsxsrc/components/Settings/Notifications/NotificationsPushover/index.tsxsrc/components/Settings/Notifications/NotificationsSlack/index.tsxsrc/components/Settings/Notifications/NotificationsTelegram.tsxsrc/components/Settings/Notifications/NotificationsWebPush/index.tsxsrc/components/Settings/Notifications/NotificationsWebhook/index.tsxsrc/components/Settings/OverrideRule/OverrideRuleModal.tsxsrc/components/Settings/RadarrModal/index.tsxsrc/components/Settings/SettingsJobsCache/index.tsxsrc/components/Settings/SettingsMain/index.tsxsrc/components/Settings/SettingsMetadata.tsxsrc/components/Settings/SettingsNetwork/index.tsxsrc/components/Settings/SettingsPlex.tsxsrc/components/Settings/SettingsUsers/index.tsxsrc/components/Settings/SonarrModal/index.tsxsrc/components/Setup/JellyfinSetup.tsxsrc/components/Setup/index.tsxsrc/components/TitleCard/index.tsxsrc/components/UserList/BulkEditModal.tsxsrc/components/UserList/JellyfinImportModal.tsxsrc/components/UserList/PlexImportModal.tsxsrc/components/UserList/index.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsDiscord.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsEmail.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushbullet.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsTelegram.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsWebPush/index.tsxsrc/components/UserProfile/UserSettings/UserPasswordChange/index.tsxsrc/components/UserProfile/UserSettings/UserPermissions/index.tsxsrc/i18n/extractMessages.tssrc/pages/_app.tsxsrc/utils/pushSubscriptionHelpers.tstailwind.config.js
💤 Files with no reviewable changes (2)
- .eslintrc.js
- server/routes/media.ts
There was a problem hiding this comment.
Pull request overview
This PR upgrades the repo’s linting toolchain to ESLint v9 and migrates configuration from legacy .eslintrc to the new flat config format, along with a set of code tweaks to satisfy updated lint rules.
Changes:
- Upgrade ESLint and related plugins/deps; add a new
eslint.config.mtsflat config and remove.eslintrc.js. - Update various
catchblocks and error construction (includingcause) to satisfy newer TypeScript ESLint rules. - Fix watchlist pagination page parsing logic (server-side) and apply minor refactors/renames prompted by new linting rules.
Reviewed changes
Copilot reviewed 81 out of 84 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
eslint.config.mts |
Introduces ESLint v9 flat config with TS/React/Next/a11y/FormatJS rules. |
package.json |
Bumps ESLint ecosystem deps and adds new config-related packages. |
pnpm-lock.yaml |
Locks updated dependency graph for ESLint v9 and plugins. |
.eslintrc.js |
Removed legacy ESLint config. |
server/routes/user/index.ts |
Updates watchlist pagination page parsing. |
server/routes/discover.ts |
Updates watchlist pagination page parsing. |
Various src/** and server/** files |
Lint-driven refactors (unused catch vars removed, optional chaining, error cause, etc.). |
Files not reviewed (1)
- pnpm-lock.yaml: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
571b46e to
733364b
Compare
|
This pull request has merge conflicts. Please resolve the conflicts so the PR can be successfully reviewed and merged. |
733364b to
a6cca63
Compare
There was a problem hiding this comment.
Actionable comments posted: 4
♻️ Duplicate comments (1)
src/components/Settings/OverrideRule/OverrideRuleModal.tsx (1)
194-196:⚠️ Potential issue | 🟠 MajorSurface submit failures instead of silently ignoring them.
Line 194–196 still swallows save errors, so users get no failure feedback when create/update fails.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/Settings/OverrideRule/OverrideRuleModal.tsx` around lines 194 - 196, In OverrideRuleModal's submit handler (the try/catch around the create/update call) replace the empty catch by capturing the thrown error, calling the component's error state setter (e.g., setSubmitError or setError) with a user-friendly message plus the error.message, ensure any loading flag is cleared (e.g., setIsSaving(false) or setLoading(false)), and surface the failure to the user via the existing error UI or by invoking an onError/onFailure callback or toast; do not silently swallow the error.
🧹 Nitpick comments (2)
src/components/Settings/Notifications/NotificationsWebPush/index.tsx (1)
73-77: Consider logging the error for debugging purposes.Switching to bare
catchsatisfies the lint rule for unused variables, but discarding the error entirely makes debugging failed API calls harder. If the codebase has a logger available, you could capture and log the error while still satisfying the lint rule.- } catch { + } catch (e) { + // eslint-disable-next-line no-console + console.error('Failed to save web push settings:', e); addToast(intl.formatMessage(messages.webpushsettingsfailed), {If the lint-driven bare catch approach is intentional across the codebase for consistency, this is fine as-is.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/Settings/Notifications/NotificationsWebPush/index.tsx` around lines 73 - 77, The catch block currently swallows the error; change it from a bare catch to catch (error) and log the error before showing the toast — e.g. call the existing logger (logger.error(error, 'webpush settings save failed')) or console.error(error) and then call addToast(intl.formatMessage(messages.webpushsettingsfailed), { appearance: 'error', autoDismiss: true }); keep the rest of the flow unchanged so debugging information is preserved while the user-facing toast remains the same.src/utils/pushSubscriptionHelpers.ts (1)
107-109: Normalize caught values before reading.messageproperty.Lines 107, 156, and 187 access
error.messagedirectly from caught values, which is brittle since JavaScript allows throwing any value, not justErrorinstances. Create a helper function to safely normalize caught values:♻️ Proposed refactor
+const getErrorMessage = (error: unknown): string => + error instanceof Error ? error.message : String(error); + ... - throw new Error(`[SW] Resubscribe failed: ${error.message}`, { + throw new Error(`[SW] Resubscribe failed: ${getErrorMessage(error)}`, { cause: error, }); ... - `Issue subscribing to push notifications: ${error.message}`, + `Issue subscribing to push notifications: ${getErrorMessage(error)}`, { cause: error } ); ... - `Issue unsubscribing to push notifications: ${error.message}`, + `Issue unsubscribing to push notifications: ${getErrorMessage(error)}`, { cause: error } );🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/utils/pushSubscriptionHelpers.ts` around lines 107 - 109, Create a small helper (e.g., normalizeCaughtError or getErrorMessage) that accepts any caught value and returns a safe Error-like object or at minimum a string message (use value instanceof Error ? value.message : String(value || 'Unknown error')); then replace direct reads of error.message in the failing throw at `[SW] Resubscribe failed: ${error.message}` and the other two occurrences (lines flagged 156 and 187) to use this helper so thrown Error messages and the cause are always safe and informative.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@server/api/animelist.ts`:
- Around line 177-181: The catch block that throws "Failed to download
Anime-List mapping" uses e.message unsafely; change the catch to accept unknown
and narrow the error before accessing message (e.g., check if e instanceof Error
to read e.message, otherwise use String(e) as a fallback) and pass the original
error as the cause (casting/typing appropriately) so the thrown Error uses a
safe, well-typed message and a valid cause; update the catch in the Anime-List
download block (the try/catch that currently throws `Failed to download
Anime-List mapping: ${e.message}`) accordingly.
- Around line 156-160: The catch block that throws `new Error("Failed to load
Anime-List mappings: ${e.message}", { cause: e })` uses the untyped `e`; change
it to narrow `e` before reading `message` and before setting `cause` (e.g. check
`e instanceof Error`), fall back to `String(e)` or a default message when it's
not an Error, and only pass `cause: e` if `e` is an Error (or leave cause
undefined otherwise) so TypeScript strict `useUnknownInCatchVariables` rules are
satisfied.
In `@server/api/pushover.ts`:
- Around line 50-54: The catch block in server/api/pushover.ts currently uses
e.message unsafely; change the error extraction in the catch where the Pushover
sounds are retrieved to a safe form (e.g., if (e instanceof Error) msg =
e.message; else msg = String(e)) and use that msg when constructing the new
Error(`[Pushover] Failed to retrieve sounds: ${msg}`, { cause: e }); keep the
original throw and cause but replace direct e.message access with the
narrowed/normalized message.
In `@server/api/rating/imdbRadarrProxy.ts`:
- Around line 193-198: In the catch block that throws the new Error in
server/api/rating/imdbRadarrProxy.ts (the one using catch (e) and referencing
e.message), narrow the error safely by treating e as unknown and extracting the
message with a guard (e.g. const msg = e instanceof Error ? e.message :
String(e)); then throw the Error using that msg and pass the original error as
the cause; replace direct e.message access with this safe extraction to avoid
unsafe property access on unknowns.
---
Duplicate comments:
In `@src/components/Settings/OverrideRule/OverrideRuleModal.tsx`:
- Around line 194-196: In OverrideRuleModal's submit handler (the try/catch
around the create/update call) replace the empty catch by capturing the thrown
error, calling the component's error state setter (e.g., setSubmitError or
setError) with a user-friendly message plus the error.message, ensure any
loading flag is cleared (e.g., setIsSaving(false) or setLoading(false)), and
surface the failure to the user via the existing error UI or by invoking an
onError/onFailure callback or toast; do not silently swallow the error.
---
Nitpick comments:
In `@src/components/Settings/Notifications/NotificationsWebPush/index.tsx`:
- Around line 73-77: The catch block currently swallows the error; change it
from a bare catch to catch (error) and log the error before showing the toast —
e.g. call the existing logger (logger.error(error, 'webpush settings save
failed')) or console.error(error) and then call
addToast(intl.formatMessage(messages.webpushsettingsfailed), { appearance:
'error', autoDismiss: true }); keep the rest of the flow unchanged so debugging
information is preserved while the user-facing toast remains the same.
In `@src/utils/pushSubscriptionHelpers.ts`:
- Around line 107-109: Create a small helper (e.g., normalizeCaughtError or
getErrorMessage) that accepts any caught value and returns a safe Error-like
object or at minimum a string message (use value instanceof Error ?
value.message : String(value || 'Unknown error')); then replace direct reads of
error.message in the failing throw at `[SW] Resubscribe failed:
${error.message}` and the other two occurrences (lines flagged 156 and 187) to
use this helper so thrown Error messages and the cause are always safe and
informative.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 8593618c-304c-49e2-b8ac-07fb07e97078
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (83)
.eslintrc.jseslint.config.mtspackage.jsonserver/api/animelist.tsserver/api/jellyfin.tsserver/api/plextv.tsserver/api/pushover.tsserver/api/rating/imdbRadarrProxy.tsserver/api/rating/rottentomatoes.tsserver/api/servarr/base.tsserver/api/servarr/radarr.tsserver/api/servarr/sonarr.tsserver/api/tautulli.tsserver/api/themoviedb/index.tsserver/api/tvdb/index.tsserver/interfaces/api/common.tsserver/lib/imageproxy.tsserver/lib/notifications/index.tsserver/lib/overseerrMerge.tsserver/routes/avatarproxy.tsserver/routes/discover.tsserver/routes/media.tsserver/routes/user/index.tsserver/types/custom.d.tsserver/utils/appDataVolume.tsserver/utils/appVersion.tssrc/components/BlocklistBlock/index.tsxsrc/components/BlocklistedTagsSelector/index.tsxsrc/components/Discover/CreateSlider/index.tsxsrc/components/Discover/DiscoverSliderEdit/index.tsxsrc/components/Discover/index.tsxsrc/components/IssueDetails/IssueComment/index.tsxsrc/components/IssueDetails/index.tsxsrc/components/IssueModal/CreateIssueModal/index.tsxsrc/components/Layout/UserDropdown/MiniQuotaDisplay/index.tsxsrc/components/Login/AddEmailModal.tsxsrc/components/Login/JellyfinLogin.tsxsrc/components/Login/LocalLogin.tsxsrc/components/MovieDetails/index.tsxsrc/components/NotificationTypeSelector/index.tsxsrc/components/RequestCard/index.tsxsrc/components/RequestList/RequestItem/index.tsxsrc/components/RequestModal/CollectionRequestModal.tsxsrc/components/RequestModal/MovieRequestModal.tsxsrc/components/RequestModal/TvRequestModal.tsxsrc/components/Settings/Notifications/NotificationsDiscord.tsxsrc/components/Settings/Notifications/NotificationsEmail.tsxsrc/components/Settings/Notifications/NotificationsGotify/index.tsxsrc/components/Settings/Notifications/NotificationsNtfy/index.tsxsrc/components/Settings/Notifications/NotificationsPushbullet/index.tsxsrc/components/Settings/Notifications/NotificationsPushover/index.tsxsrc/components/Settings/Notifications/NotificationsSlack/index.tsxsrc/components/Settings/Notifications/NotificationsTelegram.tsxsrc/components/Settings/Notifications/NotificationsWebPush/index.tsxsrc/components/Settings/Notifications/NotificationsWebhook/index.tsxsrc/components/Settings/OverrideRule/OverrideRuleModal.tsxsrc/components/Settings/RadarrModal/index.tsxsrc/components/Settings/SettingsJobsCache/index.tsxsrc/components/Settings/SettingsMain/index.tsxsrc/components/Settings/SettingsMetadata.tsxsrc/components/Settings/SettingsNetwork/index.tsxsrc/components/Settings/SettingsPlex.tsxsrc/components/Settings/SettingsUsers/index.tsxsrc/components/Settings/SonarrModal/index.tsxsrc/components/Setup/JellyfinSetup.tsxsrc/components/Setup/index.tsxsrc/components/TitleCard/index.tsxsrc/components/UserList/BulkEditModal.tsxsrc/components/UserList/JellyfinImportModal.tsxsrc/components/UserList/PlexImportModal.tsxsrc/components/UserList/index.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsDiscord.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsEmail.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushbullet.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsTelegram.tsxsrc/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsWebPush/index.tsxsrc/components/UserProfile/UserSettings/UserPasswordChange/index.tsxsrc/components/UserProfile/UserSettings/UserPermissions/index.tsxsrc/i18n/extractMessages.tssrc/pages/_app.tsxsrc/utils/pushSubscriptionHelpers.tstailwind.config.js
💤 Files with no reviewable changes (2)
- .eslintrc.js
- server/routes/media.ts
✅ Files skipped from review due to trivial changes (2)
- server/utils/appVersion.ts
- tailwind.config.js
🚧 Files skipped from review as they are similar to previous changes (42)
- src/components/Settings/SettingsUsers/index.tsx
- server/lib/overseerrMerge.ts
- src/components/Login/AddEmailModal.tsx
- src/components/Settings/Notifications/NotificationsNtfy/index.tsx
- src/components/Login/JellyfinLogin.tsx
- server/api/servarr/radarr.ts
- src/components/UserList/JellyfinImportModal.tsx
- src/components/Settings/SettingsPlex.tsx
- src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx
- src/components/Layout/UserDropdown/MiniQuotaDisplay/index.tsx
- src/components/BlocklistedTagsSelector/index.tsx
- src/components/Settings/RadarrModal/index.tsx
- src/components/Settings/Notifications/NotificationsGotify/index.tsx
- src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsWebPush/index.tsx
- eslint.config.mts
- server/routes/user/index.ts
- src/components/Discover/DiscoverSliderEdit/index.tsx
- src/components/Settings/SettingsMetadata.tsx
- src/components/UserList/index.tsx
- server/interfaces/api/common.ts
- src/components/TitleCard/index.tsx
- src/components/Discover/index.tsx
- src/components/RequestCard/index.tsx
- src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsEmail.tsx
- src/i18n/extractMessages.ts
- src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsDiscord.tsx
- src/components/Login/LocalLogin.tsx
- server/types/custom.d.ts
- src/components/Settings/Notifications/NotificationsPushover/index.tsx
- server/routes/discover.ts
- src/components/RequestList/RequestItem/index.tsx
- src/components/UserProfile/UserSettings/UserNotificationSettings/UserNotificationsPushover.tsx
- src/components/UserList/PlexImportModal.tsx
- src/components/Settings/SonarrModal/index.tsx
- src/components/MovieDetails/index.tsx
- src/components/IssueDetails/IssueComment/index.tsx
- src/components/Setup/JellyfinSetup.tsx
- server/lib/imageproxy.ts
- src/components/Settings/SettingsJobsCache/index.tsx
- src/components/RequestModal/MovieRequestModal.tsx
- src/components/Settings/Notifications/NotificationsPushbullet/index.tsx
- server/api/tvdb/index.ts
seerr
|
||||||||||||||||||||||||||||
| Project |
seerr
|
| Branch Review |
develop
|
| Run status |
|
| Run duration | 02m 26s |
| Commit |
|
| Committer | Michael Thomas |
| View all properties for this run ↗︎ | |
| Test results | |
|---|---|
|
|
0
|
|
|
0
|
|
|
0
|
|
|
0
|
|
|
31
|
| View all changes introduced in this branch ↗︎ | |
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [seerr/seerr](https://github.com/seerr-team/seerr) | minor | `v3.1.1` → `v3.2.0` | --- ### Release Notes <details> <summary>seerr-team/seerr (seerr/seerr)</summary> ### [`v3.2.0`](https://github.com/seerr-team/seerr/releases/tag/v3.2.0) [Compare Source](seerr-team/seerr@v3.1.1...v3.2.0) ##### [3.2.0](https://github.com/seerr-team/seerr/compare/v3.1.1..v3.2.0) - 2026-04-15 ##### 🚀 Features - *(blocklist)* Add support for collections ([#​1841](seerr-team/seerr#1841)) - ([993ae4c](seerr-team/seerr@993ae4c)) - *(discover)* Handle errors gracefully when content is available ([#​1542](seerr-team/seerr#1542)) - ([7920970](seerr-team/seerr@7920970)) - *(i18n)* Add Estonian language support ([#​2611](seerr-team/seerr#2611)) - ([56b79ff](seerr-team/seerr@56b79ff)) - *(i18n)* Add Luxembourgish language support ([#​2671](seerr-team/seerr#2671)) - ([dccdc95](seerr-team/seerr@dccdc95)) - *(i18n)* Add Vietnamese language support ([#​2670](seerr-team/seerr#2670)) - ([40edaea](seerr-team/seerr@40edaea)) - *(jellyfin)* Allow Jellyfin Guids with dashes for import-from-jellyfin endpoint ([#​2340](seerr-team/seerr#2340)) - ([3557745](seerr-team/seerr@3557745)) - *(notifications)* Add ntfy markdown formatting ([#​2602](seerr-team/seerr#2602)) - ([77f2c13](seerr-team/seerr@77f2c13)) - *(notifications)* Webhook custom headers ([#​2230](seerr-team/seerr#2230)) - ([3152f72](seerr-team/seerr@3152f72)) - *(notifications)* Add priority setting for ntfy agent ([#​2306](seerr-team/seerr#2306)) - ([61e0377](seerr-team/seerr@61e0377)) - *(person)* Add tmdb- and imdb link on person detail page ([#​2136](seerr-team/seerr#2136)) - ([fb2ee7c](seerr-team/seerr@fb2ee7c)) - *(quota)* Added support for unlimited quota days ([#​2797](seerr-team/seerr#2797)) - ([6d8b2b7](seerr-team/seerr@6d8b2b7)) - *(requests)* Mark requests as failed when Radarr/Sonarr unreachable ([#​2171](seerr-team/seerr#2171)) - ([c23117e](seerr-team/seerr@c23117e)) - *(settings)* Add blocklist region and language options ([#​1802](seerr-team/seerr#1802)) - ([ff469cb](seerr-team/seerr@ff469cb)) - *(settings)* Add help tooltips for services setup ([#​2662](seerr-team/seerr#2662)) - ([f5115da](seerr-team/seerr@f5115da)) - *(sonarr)* Add monitorNewItems option to sonarr settings & modal ([#​2071](seerr-team/seerr#2071)) - ([5c34c91](seerr-team/seerr@5c34c91)) - *(trending)* Add filter options ([#​2137](seerr-team/seerr#2137)) - ([4ce0db1](seerr-team/seerr@4ce0db1)) - *(ui)* Add loading state to request approve/decline buttons ([#​2815](seerr-team/seerr#2815)) - ([bd8f2d4](seerr-team/seerr@bd8f2d4)) - *(userlist)* Add sortable columns to User List ([#​1615](seerr-team/seerr#1615)) - ([eaf397a](seerr-team/seerr@eaf397a)) - *(webhook)* Add imdbid to webhook notification ([#​2658](seerr-team/seerr#2658)) - ([2432e8d](seerr-team/seerr@2432e8d)) - Sort quality profiles ASC in request and service configuration ([#​1805](seerr-team/seerr#1805)) - ([25e376c](seerr-team/seerr@25e376c)) - Add trailing whitespace warning on login username field ([#​2040](seerr-team/seerr#2040)) ([#​2177](seerr-team/seerr#2177)) - ([636dcb9](seerr-team/seerr@636dcb9)) ##### 🐛 Bug Fixes - *(auth)* Resolve Plex OAuth client ID mismatch ([#​2746](seerr-team/seerr#2746)) - ([15b3109](seerr-team/seerr@15b3109)) - *(email)* Correctly classify final MIME header in PGP email encryption ([#​2618](seerr-team/seerr#2618)) - ([9ec3d58](seerr-team/seerr@9ec3d58)) - *(email)* Preserve newlines in PGP key textarea fields ([#​2617](seerr-team/seerr#2617)) - ([835e917](seerr-team/seerr@835e917)) - *(emby)* Use static version in auth header for emby only ([#​2821](seerr-team/seerr#2821)) - ([fe2c041](seerr-team/seerr@fe2c041)) - *(entities)* Replace MySQL-only onUpdate with [@​UpdateDateColumn](https://github.com/UpdateDateColumn) ([#​2823](seerr-team/seerr#2823)) - ([0b8f872](seerr-team/seerr@0b8f872)) - *(generate-password)* Await setPassword to fix race condition ([#​2845](seerr-team/seerr#2845)) - ([061121c](seerr-team/seerr@061121c)) - *(issues)* Update issue timestamp when adding comments ([#​2616](seerr-team/seerr#2616)) - ([a16d046](seerr-team/seerr@a16d046)) - *(jellyfin-scanner)* Add TheMovieDb provider fallback for Jellyfin scanner ([#​2605](seerr-team/seerr#2605)) - ([10f23f0](seerr-team/seerr@10f23f0)) - *(login)* Resolve stuck transition when switching login forms ([#​2779](seerr-team/seerr#2779)) - ([735ec47](seerr-team/seerr@735ec47)) - *(media)* Exclude null mediaAddedAt entries ([#​2607](seerr-team/seerr#2607)) - ([001f6b1](seerr-team/seerr@001f6b1)) - *(migration)* Repair postgres blocklist id sequence ([#​2686](seerr-team/seerr#2686)) - ([f40323c](seerr-team/seerr@f40323c)) - *(movie,tv)* Respect display language for trailers ([#​2674](seerr-team/seerr#2674)) - ([90d407d](seerr-team/seerr@90d407d)) - *(open-api)* Add missing mediaType query parameter to blocklist and watchlist ([#​2722](seerr-team/seerr#2722)) - ([c7185d4](seerr-team/seerr@c7185d4)) - *(override-rules)* Remove users from `useEffect` dependency array ([#​2771](seerr-team/seerr#2771)) - ([be57997](seerr-team/seerr@be57997)) - *(overseerr-merge)* Sanitise corrupt quota values during overseerr migration ([#​2863](seerr-team/seerr#2863)) - ([43eff25](seerr-team/seerr@43eff25)) - *(plex)* Set 4K Plex URLs whenever ratingKey4k is set ([#​2635](seerr-team/seerr#2635)) - ([1548948](seerr-team/seerr@1548948)) - *(proxy)* Add path validation guardrail to imageproxy ([#​2531](seerr-team/seerr#2531)) - ([e086081](seerr-team/seerr@e086081)) - *(region-selector)* Prevent empty region reporting during sync ([#​2636](seerr-team/seerr#2636)) - ([fbfcb43](seerr-team/seerr@fbfcb43)) - *(request)* Record modifiedBy on retry and add route tests ([#​2824](seerr-team/seerr#2824)) - ([20ccd4b](seerr-team/seerr@20ccd4b)) - *(request)* Correct delete permission check and await movie save ([#​2742](seerr-team/seerr#2742)) - ([6aeab38](seerr-team/seerr@6aeab38)) - *(requests)* Mark requests as completed when media is already available ([#​2462](seerr-team/seerr#2462)) - ([d25d0ca](seerr-team/seerr@d25d0ca)) - *(settings)* Persist new settings defaults to disk on startup ([#​2884](seerr-team/seerr#2884)) - ([66130be](seerr-team/seerr@66130be)) - *(settings)* Serialize settings writes and prevent partial overwrites ([#​2696](seerr-team/seerr#2696)) - ([6c52a2f](seerr-team/seerr@6c52a2f)) - *(settings)* Remove beta info banner ([#​2615](seerr-team/seerr#2615)) - ([fece753](seerr-team/seerr@fece753)) - *(setup)* Fix Plex login not proceeding after authentication ([#​2596](seerr-team/seerr#2596)) - ([1dc5154](seerr-team/seerr@1dc5154)) - *(watchlist-sync)* Handle empty watchlists on PostgreSQL ([#​2718](seerr-team/seerr#2718)) - ([865396f](seerr-team/seerr@865396f)) - Improve local login UX ([#​2849](seerr-team/seerr#2849)) - ([aef2481](seerr-team/seerr@aef2481)) - Await missing repository saves ([#​2760](seerr-team/seerr#2760)) - ([1bb638e](seerr-team/seerr@1bb638e)) - Helm chart liveness and readiness probe ([#​2755](seerr-team/seerr#2755)) - ([4434c45](seerr-team/seerr@4434c45)) - Disambiguate tmdb ids by media type across lookups ([#​2577](seerr-team/seerr#2577)) - ([0be1896](seerr-team/seerr@0be1896)) - Anchor streaming service filter check icon to each provider card ([#​2634](seerr-team/seerr#2634)) - ([94ccd47](seerr-team/seerr@94ccd47)) ##### 📖 Documentation - *(contributing-guide)* Fix a typo ([#​2807](seerr-team/seerr#2807)) - ([6f9b743](seerr-team/seerr@6f9b743)) - *(docker)* Replace backslashes by backticks in windows docker run commands \[skip-ci] ([#​2557](seerr-team/seerr#2557)) - ([40e02bb](seerr-team/seerr@40e02bb)) - Clarify Docker volume creation instructions on fresh Windows install ([#​2861](seerr-team/seerr#2861)) - ([a133930](seerr-team/seerr@a133930)) - Move network-related docs to a dedicated tab ([#​2791](seerr-team/seerr#2791)) - ([5bbdc52](seerr-team/seerr@5bbdc52)) - Promote Nixpkgs as an official installation method ([#​2775](seerr-team/seerr#2775)) - ([05ad60c](seerr-team/seerr@05ad60c)) - Fix PM2 start command syntax ([#​2713](seerr-team/seerr#2713)) - ([5373da4](seerr-team/seerr@5373da4)) ##### 🚜 Refactor - *(imageproxy)* Reduce noisy image cache logging ([#​2789](seerr-team/seerr#2789)) - ([036d000](seerr-team/seerr@036d000)) - *(notifications)* Move event from author to title field in Discord Embed ([#​2119](seerr-team/seerr#2119)) - ([a2d1e1b](seerr-team/seerr@a2d1e1b)) - *(userlist)* Responsive columns and buttons ([#​2083](seerr-team/seerr#2083)) - ([dbe1fca](seerr-team/seerr@dbe1fca)) - *(watchlistsync)* Log media request creation after success instead of before ([#​2790](seerr-team/seerr#2790)) - ([685cb44](seerr-team/seerr@685cb44)) - Rename Error components to ErrorPage ([#​2668](seerr-team/seerr#2668)) - ([d5c5f1f](seerr-team/seerr@d5c5f1f)) ##### 🧪 Testing - *(user-list)* Deflake sorting assertions ([#​2766](seerr-team/seerr#2766)) - ([20c2ed8](seerr-team/seerr@20c2ed8)) - Support server-side unit testing ([#​2485](seerr-team/seerr#2485)) - ([8563362](seerr-team/seerr@8563362)) ##### ⚙️ Miscellaneous Tasks - *(actions)* Update github actions ([#​2683](seerr-team/seerr#2683)) - ([a2154f9](seerr-team/seerr@a2154f9)) - *(actions)* Update github actions ([#​2672](seerr-team/seerr#2672)) - ([f047cab](seerr-team/seerr@f047cab)) - *(actions)* Update github actions ([#​2632](seerr-team/seerr#2632)) - ([e25c1a5](seerr-team/seerr@e25c1a5)) - *(create-tag)* Correct quote style in commit message for tag preparation ([#​2593](seerr-team/seerr#2593)) - ([687f18b](seerr-team/seerr@687f18b)) - *(docker)* Release alias for major and minor version series ([#​2881](seerr-team/seerr#2881)) - ([1cc73a8](seerr-team/seerr@1cc73a8)) - *(i18n)* Update translations from Weblate - ([e85216a](seerr-team/seerr@e85216a)) - *(i18n)* Update translations from Weblate - ([b1adc79](seerr-team/seerr@b1adc79)) - *(i18n)* Update translations from Weblate ([#​2419](seerr-team/seerr#2419)) - ([4bd7c19](seerr-team/seerr@4bd7c19)) - *(pr-validation)* Make checklist box detection case-insensitive ([#​2802](seerr-team/seerr#2802)) - ([58514ec](seerr-team/seerr@58514ec)) - *(pr-validation)* Update pull request permissions to write for validation jobs ([#​2800](seerr-team/seerr#2800)) - ([986761f](seerr-team/seerr@986761f)) - *(pr-validation)* Disable package manager cache in nodejs setup ([#​2799](seerr-team/seerr#2799)) - ([67e27d5](seerr-team/seerr@67e27d5)) - *(release)* Prepare v3.2.0 - ([e0b2a1c](seerr-team/seerr@e0b2a1c)) - *(release)* Merge develop into main - ([c5800a0](seerr-team/seerr@c5800a0)) - Bump minimum required node version to 22.19.0 ([#​2873](seerr-team/seerr#2873)) - ([891265f](seerr-team/seerr@891265f)) - Add PR validation workflow and update contributing guidelines ([#​2777](seerr-team/seerr#2777)) - ([772e83d](seerr-team/seerr@772e83d)) - Upgrade to eslint v9 ([#​2574](seerr-team/seerr#2574)) - ([36243a0](seerr-team/seerr@36243a0)) - Ignore helm scope in git-cliff ([#​2638](seerr-team/seerr#2638)) - ([4d2b658](seerr-team/seerr@4d2b658)) ##### New Contributors ❤️ - [@​aslafy-z](https://github.com/aslafy-z) made their first contribution - [@​leereilly](https://github.com/leereilly) made their first contribution - [@​jisef](https://github.com/jisef) made their first contribution - [@​dougrathbone](https://github.com/dougrathbone) made their first contribution - [@​bobziroll](https://github.com/bobziroll) made their first contribution - [@​v3DJG6GL](https://github.com/v3DJG6GL) made their first contribution - [@​Roboroads](https://github.com/Roboroads) made their first contribution - [@​costajohnt](https://github.com/costajohnt) made their first contribution - [@​tiagodefendi](https://github.com/tiagodefendi) made their first contribution - [@​Jyasapara](https://github.com/Jyasapara) made their first contribution - [@​Sym-jay](https://github.com/Sym-jay) made their first contribution - [@​bibi0019](https://github.com/bibi0019) made their first contribution - [@​redondos](https://github.com/redondos) made their first contribution - [@​bogo22](https://github.com/bogo22) made their first contribution - [@​jabloink](https://github.com/jabloink) made their first contribution - [@​YakGravity](https://github.com/YakGravity) made their first contribution - [@​dj0024javia](https://github.com/dj0024javia) made their first contribution - [@​Jerra94](https://github.com/Jerra94) made their first contribution - [@​its-wizza](https://github.com/its-wizza) made their first contribution - [@​ventiph](https://github.com/ventiph) made their first contribution - [@​RinZ27](https://github.com/RinZ27) made their first contribution<!-- generated by git-cliff --> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19--> Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/180 Co-authored-by: bot-owl <bot@erwanleboucher.dev> Co-committed-by: bot-owl <bot@erwanleboucher.dev>
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [seerr/seerr](https://github.com/seerr-team/seerr) | minor | `v3.1.1` → `v3.2.0` | --- ### Release Notes <details> <summary>seerr-team/seerr (seerr/seerr)</summary> ### [`v3.2.0`](https://github.com/seerr-team/seerr/releases/tag/v3.2.0) [Compare Source](seerr-team/seerr@v3.1.1...v3.2.0) ##### [3.2.0](https://github.com/seerr-team/seerr/compare/v3.1.1..v3.2.0) - 2026-04-15 ##### 🚀 Features - *(blocklist)* Add support for collections ([#​1841](seerr-team/seerr#1841)) - ([993ae4c](seerr-team/seerr@993ae4c)) - *(discover)* Handle errors gracefully when content is available ([#​1542](seerr-team/seerr#1542)) - ([7920970](seerr-team/seerr@7920970)) - *(i18n)* Add Estonian language support ([#​2611](seerr-team/seerr#2611)) - ([56b79ff](seerr-team/seerr@56b79ff)) - *(i18n)* Add Luxembourgish language support ([#​2671](seerr-team/seerr#2671)) - ([dccdc95](seerr-team/seerr@dccdc95)) - *(i18n)* Add Vietnamese language support ([#​2670](seerr-team/seerr#2670)) - ([40edaea](seerr-team/seerr@40edaea)) - *(jellyfin)* Allow Jellyfin Guids with dashes for import-from-jellyfin endpoint ([#​2340](seerr-team/seerr#2340)) - ([3557745](seerr-team/seerr@3557745)) - *(notifications)* Add ntfy markdown formatting ([#​2602](seerr-team/seerr#2602)) - ([77f2c13](seerr-team/seerr@77f2c13)) - *(notifications)* Webhook custom headers ([#​2230](seerr-team/seerr#2230)) - ([3152f72](seerr-team/seerr@3152f72)) - *(notifications)* Add priority setting for ntfy agent ([#​2306](seerr-team/seerr#2306)) - ([61e0377](seerr-team/seerr@61e0377)) - *(person)* Add tmdb- and imdb link on person detail page ([#​2136](seerr-team/seerr#2136)) - ([fb2ee7c](seerr-team/seerr@fb2ee7c)) - *(quota)* Added support for unlimited quota days ([#​2797](seerr-team/seerr#2797)) - ([6d8b2b7](seerr-team/seerr@6d8b2b7)) - *(requests)* Mark requests as failed when Radarr/Sonarr unreachable ([#​2171](seerr-team/seerr#2171)) - ([c23117e](seerr-team/seerr@c23117e)) - *(settings)* Add blocklist region and language options ([#​1802](seerr-team/seerr#1802)) - ([ff469cb](seerr-team/seerr@ff469cb)) - *(settings)* Add help tooltips for services setup ([#​2662](seerr-team/seerr#2662)) - ([f5115da](seerr-team/seerr@f5115da)) - *(sonarr)* Add monitorNewItems option to sonarr settings & modal ([#​2071](seerr-team/seerr#2071)) - ([5c34c91](seerr-team/seerr@5c34c91)) - *(trending)* Add filter options ([#​2137](seerr-team/seerr#2137)) - ([4ce0db1](seerr-team/seerr@4ce0db1)) - *(ui)* Add loading state to request approve/decline buttons ([#​2815](seerr-team/seerr#2815)) - ([bd8f2d4](seerr-team/seerr@bd8f2d4)) - *(userlist)* Add sortable columns to User List ([#​1615](seerr-team/seerr#1615)) - ([eaf397a](seerr-team/seerr@eaf397a)) - *(webhook)* Add imdbid to webhook notification ([#​2658](seerr-team/seerr#2658)) - ([2432e8d](seerr-team/seerr@2432e8d)) - Sort quality profiles ASC in request and service configuration ([#​1805](seerr-team/seerr#1805)) - ([25e376c](seerr-team/seerr@25e376c)) - Add trailing whitespace warning on login username field ([#​2040](seerr-team/seerr#2040)) ([#​2177](seerr-team/seerr#2177)) - ([636dcb9](seerr-team/seerr@636dcb9)) ##### 🐛 Bug Fixes - *(auth)* Resolve Plex OAuth client ID mismatch ([#​2746](seerr-team/seerr#2746)) - ([15b3109](seerr-team/seerr@15b3109)) - *(email)* Correctly classify final MIME header in PGP email encryption ([#​2618](seerr-team/seerr#2618)) - ([9ec3d58](seerr-team/seerr@9ec3d58)) - *(email)* Preserve newlines in PGP key textarea fields ([#​2617](seerr-team/seerr#2617)) - ([835e917](seerr-team/seerr@835e917)) - *(emby)* Use static version in auth header for emby only ([#​2821](seerr-team/seerr#2821)) - ([fe2c041](seerr-team/seerr@fe2c041)) - *(entities)* Replace MySQL-only onUpdate with [@​UpdateDateColumn](https://github.com/UpdateDateColumn) ([#​2823](seerr-team/seerr#2823)) - ([0b8f872](seerr-team/seerr@0b8f872)) - *(generate-password)* Await setPassword to fix race condition ([#​2845](seerr-team/seerr#2845)) - ([061121c](seerr-team/seerr@061121c)) - *(issues)* Update issue timestamp when adding comments ([#​2616](seerr-team/seerr#2616)) - ([a16d046](seerr-team/seerr@a16d046)) - *(jellyfin-scanner)* Add TheMovieDb provider fallback for Jellyfin scanner ([#​2605](seerr-team/seerr#2605)) - ([10f23f0](seerr-team/seerr@10f23f0)) - *(login)* Resolve stuck transition when switching login forms ([#​2779](seerr-team/seerr#2779)) - ([735ec47](seerr-team/seerr@735ec47)) - *(media)* Exclude null mediaAddedAt entries ([#​2607](seerr-team/seerr#2607)) - ([001f6b1](seerr-team/seerr@001f6b1)) - *(migration)* Repair postgres blocklist id sequence ([#​2686](seerr-team/seerr#2686)) - ([f40323c](seerr-team/seerr@f40323c)) - *(movie,tv)* Respect display language for trailers ([#​2674](seerr-team/seerr#2674)) - ([90d407d](seerr-team/seerr@90d407d)) - *(open-api)* Add missing mediaType query parameter to blocklist and watchlist ([#​2722](seerr-team/seerr#2722)) - ([c7185d4](seerr-team/seerr@c7185d4)) - *(override-rules)* Remove users from `useEffect` dependency array ([#​2771](seerr-team/seerr#2771)) - ([be57997](seerr-team/seerr@be57997)) - *(overseerr-merge)* Sanitise corrupt quota values during overseerr migration ([#​2863](seerr-team/seerr#2863)) - ([43eff25](seerr-team/seerr@43eff25)) - *(plex)* Set 4K Plex URLs whenever ratingKey4k is set ([#​2635](seerr-team/seerr#2635)) - ([1548948](seerr-team/seerr@1548948)) - *(proxy)* Add path validation guardrail to imageproxy ([#​2531](seerr-team/seerr#2531)) - ([e086081](seerr-team/seerr@e086081)) - *(region-selector)* Prevent empty region reporting during sync ([#​2636](seerr-team/seerr#2636)) - ([fbfcb43](seerr-team/seerr@fbfcb43)) - *(request)* Record modifiedBy on retry and add route tests ([#​2824](seerr-team/seerr#2824)) - ([20ccd4b](seerr-team/seerr@20ccd4b)) - *(request)* Correct delete permission check and await movie save ([#​2742](seerr-team/seerr#2742)) - ([6aeab38](seerr-team/seerr@6aeab38)) - *(requests)* Mark requests as completed when media is already available ([#​2462](seerr-team/seerr#2462)) - ([d25d0ca](seerr-team/seerr@d25d0ca)) - *(settings)* Persist new settings defaults to disk on startup ([#​2884](seerr-team/seerr#2884)) - ([66130be](seerr-team/seerr@66130be)) - *(settings)* Serialize settings writes and prevent partial overwrites ([#​2696](seerr-team/seerr#2696)) - ([6c52a2f](seerr-team/seerr@6c52a2f)) - *(settings)* Remove beta info banner ([#​2615](seerr-team/seerr#2615)) - ([fece753](seerr-team/seerr@fece753)) - *(setup)* Fix Plex login not proceeding after authentication ([#​2596](seerr-team/seerr#2596)) - ([1dc5154](seerr-team/seerr@1dc5154)) - *(watchlist-sync)* Handle empty watchlists on PostgreSQL ([#​2718](seerr-team/seerr#2718)) - ([865396f](seerr-team/seerr@865396f)) - Improve local login UX ([#​2849](seerr-team/seerr#2849)) - ([aef2481](seerr-team/seerr@aef2481)) - Await missing repository saves ([#​2760](seerr-team/seerr#2760)) - ([1bb638e](seerr-team/seerr@1bb638e)) - Helm chart liveness and readiness probe ([#​2755](seerr-team/seerr#2755)) - ([4434c45](seerr-team/seerr@4434c45)) - Disambiguate tmdb ids by media type across lookups ([#​2577](seerr-team/seerr#2577)) - ([0be1896](seerr-team/seerr@0be1896)) - Anchor streaming service filter check icon to each provider card ([#​2634](seerr-team/seerr#2634)) - ([94ccd47](seerr-team/seerr@94ccd47)) ##### 📖 Documentation - *(contributing-guide)* Fix a typo ([#​2807](seerr-team/seerr#2807)) - ([6f9b743](seerr-team/seerr@6f9b743)) - *(docker)* Replace backslashes by backticks in windows docker run commands \[skip-ci] ([#​2557](seerr-team/seerr#2557)) - ([40e02bb](seerr-team/seerr@40e02bb)) - Clarify Docker volume creation instructions on fresh Windows install ([#​2861](seerr-team/seerr#2861)) - ([a133930](seerr-team/seerr@a133930)) - Move network-related docs to a dedicated tab ([#​2791](seerr-team/seerr#2791)) - ([5bbdc52](seerr-team/seerr@5bbdc52)) - Promote Nixpkgs as an official installation method ([#​2775](seerr-team/seerr#2775)) - ([05ad60c](seerr-team/seerr@05ad60c)) - Fix PM2 start command syntax ([#​2713](seerr-team/seerr#2713)) - ([5373da4](seerr-team/seerr@5373da4)) ##### 🚜 Refactor - *(imageproxy)* Reduce noisy image cache logging ([#​2789](seerr-team/seerr#2789)) - ([036d000](seerr-team/seerr@036d000)) - *(notifications)* Move event from author to title field in Discord Embed ([#​2119](seerr-team/seerr#2119)) - ([a2d1e1b](seerr-team/seerr@a2d1e1b)) - *(userlist)* Responsive columns and buttons ([#​2083](seerr-team/seerr#2083)) - ([dbe1fca](seerr-team/seerr@dbe1fca)) - *(watchlistsync)* Log media request creation after success instead of before ([#​2790](seerr-team/seerr#2790)) - ([685cb44](seerr-team/seerr@685cb44)) - Rename Error components to ErrorPage ([#​2668](seerr-team/seerr#2668)) - ([d5c5f1f](seerr-team/seerr@d5c5f1f)) ##### 🧪 Testing - *(user-list)* Deflake sorting assertions ([#​2766](seerr-team/seerr#2766)) - ([20c2ed8](seerr-team/seerr@20c2ed8)) - Support server-side unit testing ([#​2485](seerr-team/seerr#2485)) - ([8563362](seerr-team/seerr@8563362)) ##### ⚙️ Miscellaneous Tasks - *(actions)* Update github actions ([#​2683](seerr-team/seerr#2683)) - ([a2154f9](seerr-team/seerr@a2154f9)) - *(actions)* Update github actions ([#​2672](seerr-team/seerr#2672)) - ([f047cab](seerr-team/seerr@f047cab)) - *(actions)* Update github actions ([#​2632](seerr-team/seerr#2632)) - ([e25c1a5](seerr-team/seerr@e25c1a5)) - *(create-tag)* Correct quote style in commit message for tag preparation ([#​2593](seerr-team/seerr#2593)) - ([687f18b](seerr-team/seerr@687f18b)) - *(docker)* Release alias for major and minor version series ([#​2881](seerr-team/seerr#2881)) - ([1cc73a8](seerr-team/seerr@1cc73a8)) - *(i18n)* Update translations from Weblate - ([e85216a](seerr-team/seerr@e85216a)) - *(i18n)* Update translations from Weblate - ([b1adc79](seerr-team/seerr@b1adc79)) - *(i18n)* Update translations from Weblate ([#​2419](seerr-team/seerr#2419)) - ([4bd7c19](seerr-team/seerr@4bd7c19)) - *(pr-validation)* Make checklist box detection case-insensitive ([#​2802](seerr-team/seerr#2802)) - ([58514ec](seerr-team/seerr@58514ec)) - *(pr-validation)* Update pull request permissions to write for validation jobs ([#​2800](seerr-team/seerr#2800)) - ([986761f](seerr-team/seerr@986761f)) - *(pr-validation)* Disable package manager cache in nodejs setup ([#​2799](seerr-team/seerr#2799)) - ([67e27d5](seerr-team/seerr@67e27d5)) - *(release)* Prepare v3.2.0 - ([e0b2a1c](seerr-team/seerr@e0b2a1c)) - *(release)* Merge develop into main - ([c5800a0](seerr-team/seerr@c5800a0)) - Bump minimum required node version to 22.19.0 ([#​2873](seerr-team/seerr#2873)) - ([891265f](seerr-team/seerr@891265f)) - Add PR validation workflow and update contributing guidelines ([#​2777](seerr-team/seerr#2777)) - ([772e83d](seerr-team/seerr@772e83d)) - Upgrade to eslint v9 ([#​2574](seerr-team/seerr#2574)) - ([36243a0](seerr-team/seerr@36243a0)) - Ignore helm scope in git-cliff ([#​2638](seerr-team/seerr#2638)) - ([4d2b658](seerr-team/seerr@4d2b658)) ##### New Contributors ❤️ - [@​aslafy-z](https://github.com/aslafy-z) made their first contribution - [@​leereilly](https://github.com/leereilly) made their first contribution - [@​jisef](https://github.com/jisef) made their first contribution - [@​dougrathbone](https://github.com/dougrathbone) made their first contribution - [@​bobziroll](https://github.com/bobziroll) made their first contribution - [@​v3DJG6GL](https://github.com/v3DJG6GL) made their first contribution - [@​Roboroads](https://github.com/Roboroads) made their first contribution - [@​costajohnt](https://github.com/costajohnt) made their first contribution - [@​tiagodefendi](https://github.com/tiagodefendi) made their first contribution - [@​Jyasapara](https://github.com/Jyasapara) made their first contribution - [@​Sym-jay](https://github.com/Sym-jay) made their first contribution - [@​bibi0019](https://github.com/bibi0019) made their first contribution - [@​redondos](https://github.com/redondos) made their first contribution - [@​bogo22](https://github.com/bogo22) made their first contribution - [@​jabloink](https://github.com/jabloink) made their first contribution - [@​YakGravity](https://github.com/YakGravity) made their first contribution - [@​dj0024javia](https://github.com/dj0024javia) made their first contribution - [@​Jerra94](https://github.com/Jerra94) made their first contribution - [@​its-wizza](https://github.com/its-wizza) made their first contribution - [@​ventiph](https://github.com/ventiph) made their first contribution - [@​RinZ27](https://github.com/RinZ27) made their first contribution<!-- generated by git-cliff --> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19--> Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/187 Co-authored-by: bot-owl <bot@erwanleboucher.dev> Co-committed-by: bot-owl <bot@erwanleboucher.dev>
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [seerr/seerr](https://github.com/seerr-team/seerr) | minor | `v3.1.1` → `v3.2.0` | --- ### Release Notes <details> <summary>seerr-team/seerr (seerr/seerr)</summary> ### [`v3.2.0`](https://github.com/seerr-team/seerr/releases/tag/v3.2.0) [Compare Source](seerr-team/seerr@v3.1.1...v3.2.0) ##### [3.2.0](https://github.com/seerr-team/seerr/compare/v3.1.1..v3.2.0) - 2026-04-15 ##### 🚀 Features - *(blocklist)* Add support for collections ([#​1841](seerr-team/seerr#1841)) - ([993ae4c](seerr-team/seerr@993ae4c)) - *(discover)* Handle errors gracefully when content is available ([#​1542](seerr-team/seerr#1542)) - ([7920970](seerr-team/seerr@7920970)) - *(i18n)* Add Estonian language support ([#​2611](seerr-team/seerr#2611)) - ([56b79ff](seerr-team/seerr@56b79ff)) - *(i18n)* Add Luxembourgish language support ([#​2671](seerr-team/seerr#2671)) - ([dccdc95](seerr-team/seerr@dccdc95)) - *(i18n)* Add Vietnamese language support ([#​2670](seerr-team/seerr#2670)) - ([40edaea](seerr-team/seerr@40edaea)) - *(jellyfin)* Allow Jellyfin Guids with dashes for import-from-jellyfin endpoint ([#​2340](seerr-team/seerr#2340)) - ([3557745](seerr-team/seerr@3557745)) - *(notifications)* Add ntfy markdown formatting ([#​2602](seerr-team/seerr#2602)) - ([77f2c13](seerr-team/seerr@77f2c13)) - *(notifications)* Webhook custom headers ([#​2230](seerr-team/seerr#2230)) - ([3152f72](seerr-team/seerr@3152f72)) - *(notifications)* Add priority setting for ntfy agent ([#​2306](seerr-team/seerr#2306)) - ([61e0377](seerr-team/seerr@61e0377)) - *(person)* Add tmdb- and imdb link on person detail page ([#​2136](seerr-team/seerr#2136)) - ([fb2ee7c](seerr-team/seerr@fb2ee7c)) - *(quota)* Added support for unlimited quota days ([#​2797](seerr-team/seerr#2797)) - ([6d8b2b7](seerr-team/seerr@6d8b2b7)) - *(requests)* Mark requests as failed when Radarr/Sonarr unreachable ([#​2171](seerr-team/seerr#2171)) - ([c23117e](seerr-team/seerr@c23117e)) - *(settings)* Add blocklist region and language options ([#​1802](seerr-team/seerr#1802)) - ([ff469cb](seerr-team/seerr@ff469cb)) - *(settings)* Add help tooltips for services setup ([#​2662](seerr-team/seerr#2662)) - ([f5115da](seerr-team/seerr@f5115da)) - *(sonarr)* Add monitorNewItems option to sonarr settings & modal ([#​2071](seerr-team/seerr#2071)) - ([5c34c91](seerr-team/seerr@5c34c91)) - *(trending)* Add filter options ([#​2137](seerr-team/seerr#2137)) - ([4ce0db1](seerr-team/seerr@4ce0db1)) - *(ui)* Add loading state to request approve/decline buttons ([#​2815](seerr-team/seerr#2815)) - ([bd8f2d4](seerr-team/seerr@bd8f2d4)) - *(userlist)* Add sortable columns to User List ([#​1615](seerr-team/seerr#1615)) - ([eaf397a](seerr-team/seerr@eaf397a)) - *(webhook)* Add imdbid to webhook notification ([#​2658](seerr-team/seerr#2658)) - ([2432e8d](seerr-team/seerr@2432e8d)) - Sort quality profiles ASC in request and service configuration ([#​1805](seerr-team/seerr#1805)) - ([25e376c](seerr-team/seerr@25e376c)) - Add trailing whitespace warning on login username field ([#​2040](seerr-team/seerr#2040)) ([#​2177](seerr-team/seerr#2177)) - ([636dcb9](seerr-team/seerr@636dcb9)) ##### 🐛 Bug Fixes - *(auth)* Resolve Plex OAuth client ID mismatch ([#​2746](seerr-team/seerr#2746)) - ([15b3109](seerr-team/seerr@15b3109)) - *(email)* Correctly classify final MIME header in PGP email encryption ([#​2618](seerr-team/seerr#2618)) - ([9ec3d58](seerr-team/seerr@9ec3d58)) - *(email)* Preserve newlines in PGP key textarea fields ([#​2617](seerr-team/seerr#2617)) - ([835e917](seerr-team/seerr@835e917)) - *(emby)* Use static version in auth header for emby only ([#​2821](seerr-team/seerr#2821)) - ([fe2c041](seerr-team/seerr@fe2c041)) - *(entities)* Replace MySQL-only onUpdate with [@​UpdateDateColumn](https://github.com/UpdateDateColumn) ([#​2823](seerr-team/seerr#2823)) - ([0b8f872](seerr-team/seerr@0b8f872)) - *(generate-password)* Await setPassword to fix race condition ([#​2845](seerr-team/seerr#2845)) - ([061121c](seerr-team/seerr@061121c)) - *(issues)* Update issue timestamp when adding comments ([#​2616](seerr-team/seerr#2616)) - ([a16d046](seerr-team/seerr@a16d046)) - *(jellyfin-scanner)* Add TheMovieDb provider fallback for Jellyfin scanner ([#​2605](seerr-team/seerr#2605)) - ([10f23f0](seerr-team/seerr@10f23f0)) - *(login)* Resolve stuck transition when switching login forms ([#​2779](seerr-team/seerr#2779)) - ([735ec47](seerr-team/seerr@735ec47)) - *(media)* Exclude null mediaAddedAt entries ([#​2607](seerr-team/seerr#2607)) - ([001f6b1](seerr-team/seerr@001f6b1)) - *(migration)* Repair postgres blocklist id sequence ([#​2686](seerr-team/seerr#2686)) - ([f40323c](seerr-team/seerr@f40323c)) - *(movie,tv)* Respect display language for trailers ([#​2674](seerr-team/seerr#2674)) - ([90d407d](seerr-team/seerr@90d407d)) - *(open-api)* Add missing mediaType query parameter to blocklist and watchlist ([#​2722](seerr-team/seerr#2722)) - ([c7185d4](seerr-team/seerr@c7185d4)) - *(override-rules)* Remove users from `useEffect` dependency array ([#​2771](seerr-team/seerr#2771)) - ([be57997](seerr-team/seerr@be57997)) - *(overseerr-merge)* Sanitise corrupt quota values during overseerr migration ([#​2863](seerr-team/seerr#2863)) - ([43eff25](seerr-team/seerr@43eff25)) - *(plex)* Set 4K Plex URLs whenever ratingKey4k is set ([#​2635](seerr-team/seerr#2635)) - ([1548948](seerr-team/seerr@1548948)) - *(proxy)* Add path validation guardrail to imageproxy ([#​2531](seerr-team/seerr#2531)) - ([e086081](seerr-team/seerr@e086081)) - *(region-selector)* Prevent empty region reporting during sync ([#​2636](seerr-team/seerr#2636)) - ([fbfcb43](seerr-team/seerr@fbfcb43)) - *(request)* Record modifiedBy on retry and add route tests ([#​2824](seerr-team/seerr#2824)) - ([20ccd4b](seerr-team/seerr@20ccd4b)) - *(request)* Correct delete permission check and await movie save ([#​2742](seerr-team/seerr#2742)) - ([6aeab38](seerr-team/seerr@6aeab38)) - *(requests)* Mark requests as completed when media is already available ([#​2462](seerr-team/seerr#2462)) - ([d25d0ca](seerr-team/seerr@d25d0ca)) - *(settings)* Persist new settings defaults to disk on startup ([#​2884](seerr-team/seerr#2884)) - ([66130be](seerr-team/seerr@66130be)) - *(settings)* Serialize settings writes and prevent partial overwrites ([#​2696](seerr-team/seerr#2696)) - ([6c52a2f](seerr-team/seerr@6c52a2f)) - *(settings)* Remove beta info banner ([#​2615](seerr-team/seerr#2615)) - ([fece753](seerr-team/seerr@fece753)) - *(setup)* Fix Plex login not proceeding after authentication ([#​2596](seerr-team/seerr#2596)) - ([1dc5154](seerr-team/seerr@1dc5154)) - *(watchlist-sync)* Handle empty watchlists on PostgreSQL ([#​2718](seerr-team/seerr#2718)) - ([865396f](seerr-team/seerr@865396f)) - Improve local login UX ([#​2849](seerr-team/seerr#2849)) - ([aef2481](seerr-team/seerr@aef2481)) - Await missing repository saves ([#​2760](seerr-team/seerr#2760)) - ([1bb638e](seerr-team/seerr@1bb638e)) - Helm chart liveness and readiness probe ([#​2755](seerr-team/seerr#2755)) - ([4434c45](seerr-team/seerr@4434c45)) - Disambiguate tmdb ids by media type across lookups ([#​2577](seerr-team/seerr#2577)) - ([0be1896](seerr-team/seerr@0be1896)) - Anchor streaming service filter check icon to each provider card ([#​2634](seerr-team/seerr#2634)) - ([94ccd47](seerr-team/seerr@94ccd47)) ##### 📖 Documentation - *(contributing-guide)* Fix a typo ([#​2807](seerr-team/seerr#2807)) - ([6f9b743](seerr-team/seerr@6f9b743)) - *(docker)* Replace backslashes by backticks in windows docker run commands \[skip-ci] ([#​2557](seerr-team/seerr#2557)) - ([40e02bb](seerr-team/seerr@40e02bb)) - Clarify Docker volume creation instructions on fresh Windows install ([#​2861](seerr-team/seerr#2861)) - ([a133930](seerr-team/seerr@a133930)) - Move network-related docs to a dedicated tab ([#​2791](seerr-team/seerr#2791)) - ([5bbdc52](seerr-team/seerr@5bbdc52)) - Promote Nixpkgs as an official installation method ([#​2775](seerr-team/seerr#2775)) - ([05ad60c](seerr-team/seerr@05ad60c)) - Fix PM2 start command syntax ([#​2713](seerr-team/seerr#2713)) - ([5373da4](seerr-team/seerr@5373da4)) ##### 🚜 Refactor - *(imageproxy)* Reduce noisy image cache logging ([#​2789](seerr-team/seerr#2789)) - ([036d000](seerr-team/seerr@036d000)) - *(notifications)* Move event from author to title field in Discord Embed ([#​2119](seerr-team/seerr#2119)) - ([a2d1e1b](seerr-team/seerr@a2d1e1b)) - *(userlist)* Responsive columns and buttons ([#​2083](seerr-team/seerr#2083)) - ([dbe1fca](seerr-team/seerr@dbe1fca)) - *(watchlistsync)* Log media request creation after success instead of before ([#​2790](seerr-team/seerr#2790)) - ([685cb44](seerr-team/seerr@685cb44)) - Rename Error components to ErrorPage ([#​2668](seerr-team/seerr#2668)) - ([d5c5f1f](seerr-team/seerr@d5c5f1f)) ##### 🧪 Testing - *(user-list)* Deflake sorting assertions ([#​2766](seerr-team/seerr#2766)) - ([20c2ed8](seerr-team/seerr@20c2ed8)) - Support server-side unit testing ([#​2485](seerr-team/seerr#2485)) - ([8563362](seerr-team/seerr@8563362)) ##### ⚙️ Miscellaneous Tasks - *(actions)* Update github actions ([#​2683](seerr-team/seerr#2683)) - ([a2154f9](seerr-team/seerr@a2154f9)) - *(actions)* Update github actions ([#​2672](seerr-team/seerr#2672)) - ([f047cab](seerr-team/seerr@f047cab)) - *(actions)* Update github actions ([#​2632](seerr-team/seerr#2632)) - ([e25c1a5](seerr-team/seerr@e25c1a5)) - *(create-tag)* Correct quote style in commit message for tag preparation ([#​2593](seerr-team/seerr#2593)) - ([687f18b](seerr-team/seerr@687f18b)) - *(docker)* Release alias for major and minor version series ([#​2881](seerr-team/seerr#2881)) - ([1cc73a8](seerr-team/seerr@1cc73a8)) - *(i18n)* Update translations from Weblate - ([e85216a](seerr-team/seerr@e85216a)) - *(i18n)* Update translations from Weblate - ([b1adc79](seerr-team/seerr@b1adc79)) - *(i18n)* Update translations from Weblate ([#​2419](seerr-team/seerr#2419)) - ([4bd7c19](seerr-team/seerr@4bd7c19)) - *(pr-validation)* Make checklist box detection case-insensitive ([#​2802](seerr-team/seerr#2802)) - ([58514ec](seerr-team/seerr@58514ec)) - *(pr-validation)* Update pull request permissions to write for validation jobs ([#​2800](seerr-team/seerr#2800)) - ([986761f](seerr-team/seerr@986761f)) - *(pr-validation)* Disable package manager cache in nodejs setup ([#​2799](seerr-team/seerr#2799)) - ([67e27d5](seerr-team/seerr@67e27d5)) - *(release)* Prepare v3.2.0 - ([e0b2a1c](seerr-team/seerr@e0b2a1c)) - *(release)* Merge develop into main - ([c5800a0](seerr-team/seerr@c5800a0)) - Bump minimum required node version to 22.19.0 ([#​2873](seerr-team/seerr#2873)) - ([891265f](seerr-team/seerr@891265f)) - Add PR validation workflow and update contributing guidelines ([#​2777](seerr-team/seerr#2777)) - ([772e83d](seerr-team/seerr@772e83d)) - Upgrade to eslint v9 ([#​2574](seerr-team/seerr#2574)) - ([36243a0](seerr-team/seerr@36243a0)) - Ignore helm scope in git-cliff ([#​2638](seerr-team/seerr#2638)) - ([4d2b658](seerr-team/seerr@4d2b658)) ##### New Contributors ❤️ - [@​aslafy-z](https://github.com/aslafy-z) made their first contribution - [@​leereilly](https://github.com/leereilly) made their first contribution - [@​jisef](https://github.com/jisef) made their first contribution - [@​dougrathbone](https://github.com/dougrathbone) made their first contribution - [@​bobziroll](https://github.com/bobziroll) made their first contribution - [@​v3DJG6GL](https://github.com/v3DJG6GL) made their first contribution - [@​Roboroads](https://github.com/Roboroads) made their first contribution - [@​costajohnt](https://github.com/costajohnt) made their first contribution - [@​tiagodefendi](https://github.com/tiagodefendi) made their first contribution - [@​Jyasapara](https://github.com/Jyasapara) made their first contribution - [@​Sym-jay](https://github.com/Sym-jay) made their first contribution - [@​bibi0019](https://github.com/bibi0019) made their first contribution - [@​redondos](https://github.com/redondos) made their first contribution - [@​bogo22](https://github.com/bogo22) made their first contribution - [@​jabloink](https://github.com/jabloink) made their first contribution - [@​YakGravity](https://github.com/YakGravity) made their first contribution - [@​dj0024javia](https://github.com/dj0024javia) made their first contribution - [@​Jerra94](https://github.com/Jerra94) made their first contribution - [@​its-wizza](https://github.com/its-wizza) made their first contribution - [@​ventiph](https://github.com/ventiph) made their first contribution - [@​RinZ27](https://github.com/RinZ27) made their first contribution<!-- generated by git-cliff --> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19--> Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/187 Co-authored-by: bot-owl <bot@erwanleboucher.dev> Co-committed-by: bot-owl <bot@erwanleboucher.dev>
Description
It's always good to be on the newest versions of tools. While ESLint v10 is out now, some plugins aren't yet compatible. But getting off the deprecated ESLint v8 and upgrading to the new configuration format is desirable nonetheless.
The new versions of ESLint have a new config file format, so some manual migration is required. Also, newer versions of plugins have additional / fixed rules, so there are some fixes to conform with those new lints.
How Has This Been Tested?
Lint passes
Screenshots / Logs (if applicable)
Checklist:
pnpm buildpnpm i18n:extractFixes #2645
Summary by CodeRabbit
Bug Fixes
Refactors
Chores