From 4d8559976c462f47cbc301df9f1553affc065dde Mon Sep 17 00:00:00 2001 From: 4gray <4gray@users.noreply.github.com> Date: Sat, 5 Sep 2026 10:22:37 +0200 Subject: [PATCH 1/6] fix(dashboard): read cached EPG timestamps as unix seconds (#1532) `epgTimestampMs` in the dashboard live-EPG helpers returned `EpgProgram.startTimestamp`/`stopTimestamp` as-is, but those fields are unix SECONDS everywhere else (`getProgramTimeMs` in `@iptvnator/ui/epg` multiplies by 1000). The bug was latent: the backend `GET_CURRENT_PROGRAMS_BATCH` rows never set the fields, so the ISO fallback always ran. Scale a positive finite timestamp by 1000 and treat zero/non-finite values as absent, mirroring `getProgramTimeMs`. Add a dedicated spec that feeds seconds-based timestamps and asserts the formatted range and progress, and fix the rails component spec fixture, which stored millisecond values in the seconds fields and so encoded the old bug. Co-authored-by: Claude Fable 5.1 --- .../dashboard-live-epg-timestamp-units.md | 9 + .../rails/dashboard-live-epg.utils.spec.ts | 162 ++++++++++++++---- .../src/lib/rails/dashboard-live-epg.utils.ts | 9 +- ...orkspace-dashboard-rails.component.spec.ts | 20 ++- 4 files changed, 159 insertions(+), 41 deletions(-) create mode 100644 .changes/dashboard-live-epg-timestamp-units.md diff --git a/.changes/dashboard-live-epg-timestamp-units.md b/.changes/dashboard-live-epg-timestamp-units.md new file mode 100644 index 000000000..a5b267810 --- /dev/null +++ b/.changes/dashboard-live-epg-timestamp-units.md @@ -0,0 +1,9 @@ +--- +type: internal +area: dashboard +--- + +The dashboard's live "now playing" time range and progress bar now read +pre-computed EPG timestamps as unix seconds, matching the rest of the EPG +code. Today's dashboard lookups never carry those fields, so nothing changes +on screen; this closes the gap before a future data path supplies them. diff --git a/libs/workspace/dashboard/feature/src/lib/rails/dashboard-live-epg.utils.spec.ts b/libs/workspace/dashboard/feature/src/lib/rails/dashboard-live-epg.utils.spec.ts index 27a8c9b43..04e9d039b 100644 --- a/libs/workspace/dashboard/feature/src/lib/rails/dashboard-live-epg.utils.spec.ts +++ b/libs/workspace/dashboard/feature/src/lib/rails/dashboard-live-epg.utils.spec.ts @@ -1,44 +1,146 @@ import type { EpgProgram } from '@iptvnator/shared/interfaces'; import { buildDashboardLiveEpgDetails, + calcEpgProgress, formatEpgTimeRange, } from './dashboard-live-epg.utils'; -const HOUR_MS = 60 * 60_000; -// Local 12:00 so the HH:mm expectations below are timezone-independent. -const START = new Date(2026, 5, 28, 12, 0, 0, 0).getTime(); -const NOW = START + HOUR_MS / 2; // 12:30 -const program: EpgProgram = { - start: new Date(START).toISOString(), - stop: new Date(START + HOUR_MS).toISOString(), - channel: 'ch', - title: 'Noon Show', - desc: null, - category: null, -}; +// Local-time wall clock so the formatted range is stable in every timezone +// the suite runs in. +const START = new Date(2026, 0, 15, 20, 0, 0, 0); +const STOP = new Date(2026, 0, 15, 21, 0, 0, 0); +const MIDPOINT_MS = START.getTime() + (STOP.getTime() - START.getTime()) / 2; + +function program(overrides: Partial = {}): EpgProgram { + return { + start: START.toISOString(), + stop: STOP.toISOString(), + channel: 'channel-1', + title: 'Evening News', + desc: null, + category: null, + ...overrides, + }; +} describe('dashboard-live-epg.utils', () => { - it('formats the range and progress in wall-clock terms by default', () => { - expect(formatEpgTimeRange(program)).toBe('12:00 – 13:00'); - expect(buildDashboardLiveEpgDetails(program, NOW)).toEqual({ - nowPlayingTitle: 'Noon Show', - nowPlayingTimeRange: '12:00 – 13:00', - nowPlayingProgress: 50, + describe('timestamps in unix seconds', () => { + // `EpgProgram.startTimestamp`/`stopTimestamp` are unix SECONDS + // everywhere else in the app; treating them as milliseconds put + // every programme in January 1970 and broke the progress bar. + it('scales startTimestamp/stopTimestamp to milliseconds', () => { + const row = program({ + // Deliberately different ISO strings prove the cached + // timestamps win over the strings when both are present. + start: '2000-01-01T00:00:00.000Z', + stop: '2000-01-01T01:00:00.000Z', + startTimestamp: Math.floor(START.getTime() / 1000), + stopTimestamp: Math.floor(STOP.getTime() / 1000), + }); + + expect(formatEpgTimeRange(row)).toBe('20:00 – 21:00'); + expect(calcEpgProgress(row, MIDPOINT_MS)).toBe(50); + expect(buildDashboardLiveEpgDetails(row, MIDPOINT_MS)).toEqual({ + nowPlayingTitle: 'Evening News', + nowPlayingTimeRange: '20:00 – 21:00', + nowPlayingProgress: 50, + }); + }); + + it('falls back to the ISO strings for zero or non-finite timestamps', () => { + const row = program({ + startTimestamp: 0, + stopTimestamp: Number.NaN, + }); + + expect(formatEpgTimeRange(row)).toBe('20:00 – 21:00'); + expect(calcEpgProgress(row, MIDPOINT_MS)).toBe(50); }); }); - it('shifts the label and measures progress in the provider clock with a display offset', () => { - // Offset +60: the guide runs an hour ahead, so the 12:00 row really - // airs 13:00–14:00 and at 12:30 has not started yet. - expect(formatEpgTimeRange(program, 60)).toBe('13:00 – 14:00'); - expect(buildDashboardLiveEpgDetails(program, NOW, 60)).toEqual({ - nowPlayingTitle: 'Noon Show', - nowPlayingTimeRange: '13:00 – 14:00', - nowPlayingProgress: 0, + describe('ISO fallback', () => { + it('reads the ISO strings when no timestamps are present', () => { + const row = program(); + + expect(formatEpgTimeRange(row)).toBe('20:00 – 21:00'); + expect(calcEpgProgress(row, MIDPOINT_MS)).toBe(50); + }); + + it('clamps progress to the 0–100 range', () => { + const row = program(); + + expect(calcEpgProgress(row, START.getTime() - 60_000)).toBe(0); + expect(calcEpgProgress(row, STOP.getTime() + 60_000)).toBe(100); + }); + + it('returns null when the range cannot be resolved', () => { + const unparseable = program({ start: 'not-a-date' }); + const inverted = program({ + start: STOP.toISOString(), + stop: START.toISOString(), + }); + + expect(formatEpgTimeRange(unparseable)).toBeNull(); + expect(calcEpgProgress(unparseable, MIDPOINT_MS)).toBeNull(); + expect(calcEpgProgress(inverted, MIDPOINT_MS)).toBeNull(); + }); + }); + + describe('EPG display offset', () => { + it('formats the range and progress in wall-clock terms by default', () => { + expect(formatEpgTimeRange(program())).toBe('20:00 – 21:00'); + expect( + buildDashboardLiveEpgDetails(program(), MIDPOINT_MS) + ).toEqual({ + nowPlayingTitle: 'Evening News', + nowPlayingTimeRange: '20:00 – 21:00', + nowPlayingProgress: 50, + }); + }); + + it('shifts the label and measures progress in the provider clock with a display offset', () => { + // Offset +60: the guide runs an hour ahead, so the 20:00 row + // really airs 21:00–22:00 and at 20:30 has not started yet. + expect(formatEpgTimeRange(program(), 60)).toBe('21:00 – 22:00'); + expect( + buildDashboardLiveEpgDetails(program(), MIDPOINT_MS, 60) + ).toEqual({ + nowPlayingTitle: 'Evening News', + nowPlayingTimeRange: '21:00 – 22:00', + nowPlayingProgress: 0, + }); + // Offset -30: it really started at 19:30 and has finished. + expect( + buildDashboardLiveEpgDetails(program(), MIDPOINT_MS, -30) + ?.nowPlayingProgress + ).toBe(100); + }); + + it('applies the offset to seconds-based timestamps as well', () => { + const row = program({ + start: '2000-01-01T00:00:00.000Z', + stop: '2000-01-01T01:00:00.000Z', + startTimestamp: Math.floor(START.getTime() / 1000), + stopTimestamp: Math.floor(STOP.getTime() / 1000), + }); + + expect(formatEpgTimeRange(row, 60)).toBe('21:00 – 22:00'); + expect( + buildDashboardLiveEpgDetails(row, MIDPOINT_MS, 60) + ?.nowPlayingProgress + ).toBe(0); + }); + }); + + describe('buildDashboardLiveEpgDetails', () => { + it('returns null for a missing programme', () => { + expect(buildDashboardLiveEpgDetails(null, MIDPOINT_MS)).toBeNull(); + }); + + it('returns null when nothing is displayable', () => { + const row = program({ title: ' ', start: '', stop: '' }); + + expect(buildDashboardLiveEpgDetails(row, MIDPOINT_MS)).toBeNull(); }); - // Offset -30: it really started at 11:30 and is two thirds through. - expect( - buildDashboardLiveEpgDetails(program, NOW, -30)?.nowPlayingProgress - ).toBe(100); }); }); diff --git a/libs/workspace/dashboard/feature/src/lib/rails/dashboard-live-epg.utils.ts b/libs/workspace/dashboard/feature/src/lib/rails/dashboard-live-epg.utils.ts index 548e46e9e..99d22d4aa 100644 --- a/libs/workspace/dashboard/feature/src/lib/rails/dashboard-live-epg.utils.ts +++ b/libs/workspace/dashboard/feature/src/lib/rails/dashboard-live-epg.utils.ts @@ -13,15 +13,18 @@ export const LIVE_EPG_TICK_MS = 30_000; // Reads either an ISO `start`/`stop` or the pre-computed `startTimestamp` // when present. The parsed XMLTV pipeline populates both, but legacy rows -// only carry the strings. +// only carry the strings. `startTimestamp`/`stopTimestamp` are unix SECONDS +// (the same contract `getProgramTimeMs` in `@iptvnator/ui/epg` reads), so a +// usable value is scaled to milliseconds; zero, negative or non-finite +// values are treated as absent and fall back to the ISO string. function epgTimestampMs( program: EpgProgram, side: 'start' | 'stop' ): number | null { const cached = side === 'start' ? program.startTimestamp : program.stopTimestamp; - if (cached != null) { - return cached; + if (Number.isFinite(cached) && Number(cached) > 0) { + return Number(cached) * 1000; } const iso = side === 'start' ? program.start : program.stop; const ms = iso ? new Date(iso).getTime() : NaN; diff --git a/libs/workspace/dashboard/feature/src/lib/rails/workspace-dashboard-rails.component.spec.ts b/libs/workspace/dashboard/feature/src/lib/rails/workspace-dashboard-rails.component.spec.ts index 0b34f85ac..3d9d265b5 100644 --- a/libs/workspace/dashboard/feature/src/lib/rails/workspace-dashboard-rails.component.spec.ts +++ b/libs/workspace/dashboard/feature/src/lib/rails/workspace-dashboard-rails.component.spec.ts @@ -189,14 +189,18 @@ describe('resolveDashboardHeroArtwork', () => { }); describe('EPG enrichment helpers', () => { + // `startTimestamp`/`stopTimestamp` are unix SECONDS, as everywhere else + // in the app; the helpers scale them to the millisecond clock they get. + const START_S = Math.floor(Date.UTC(2026, 4, 19, 12, 0, 0) / 1000); + const STOP_S = Math.floor(Date.UTC(2026, 4, 19, 12, 30, 0) / 1000); const baseProgram = (overrides: Partial = {}): EpgProgram => ({ title: 'Tagesschau', desc: null, start: '2026-05-19T12:00:00.000Z', stop: '2026-05-19T12:30:00.000Z', - startTimestamp: Date.UTC(2026, 4, 19, 12, 0, 0), - stopTimestamp: Date.UTC(2026, 4, 19, 12, 30, 0), + startTimestamp: START_S, + stopTimestamp: STOP_S, ...overrides, }) as EpgProgram; @@ -231,8 +235,8 @@ describe('EPG enrichment helpers', () => { describe('calcEpgProgress', () => { const program = baseProgram(); - const start = program.startTimestamp as number; - const stop = program.stopTimestamp as number; + const start = START_S * 1000; + const stop = STOP_S * 1000; it('returns 0 at the start of the window', () => { expect(calcEpgProgress(program, start)).toBe(0); @@ -255,13 +259,13 @@ describe('EPG enrichment helpers', () => { it('returns null when the window is zero-length or inverted', () => { expect( calcEpgProgress( - baseProgram({ stopTimestamp: start }), + baseProgram({ stopTimestamp: START_S }), start + 10 ) ).toBeNull(); expect( calcEpgProgress( - baseProgram({ stopTimestamp: start - 1 }), + baseProgram({ stopTimestamp: START_S - 1 }), start ) ).toBeNull(); @@ -271,8 +275,8 @@ describe('EPG enrichment helpers', () => { describe('buildDashboardLiveEpgDetails', () => { it('builds the current programme details used by the live hero banner', () => { const program = baseProgram({ title: 'Market Open' }); - const start = program.startTimestamp as number; - const stop = program.stopTimestamp as number; + const start = START_S * 1000; + const stop = STOP_S * 1000; const now = start + (stop - start) / 4; expect(buildDashboardLiveEpgDetails(program, now)).toMatchObject({ From de81e3b2385f27ef597dd7a5e95cc3679178885a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 5 Sep 2026 10:23:42 +0200 Subject: [PATCH 2/6] chore(deps): bump the npm-minor-patch group across 1 directory with 19 updates (#1528) Bumps the npm-minor-patch group with 19 updates in the / directory: | Package | From | To | | --- | --- | --- | | [axios](https://github.com/axios/axios) | `1.19.0` | `1.20.0` | | [hls.js](https://github.com/video-dev/hls.js) | `1.7.0` | `1.7.1` | | [marked](https://github.com/markedjs/marked) | `18.0.9` | `18.0.11` | | [@astrojs/sitemap](https://github.com/withastro/astro/tree/HEAD/packages/integrations/sitemap) | `3.7.3` | `3.7.4` | | [@eslint/eslintrc](https://github.com/eslint/eslintrc) | `3.3.6` | `3.3.7` | | [@faker-js/faker](https://github.com/faker-js/faker) | `10.5.0` | `10.6.0` | | [@swc/core](https://github.com/swc-project/swc/tree/HEAD/packages/core) | `1.15.47` | `1.16.1` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.67.0` | `8.69.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.67.0` | `8.69.0` | | [@typescript-eslint/utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/utils) | `8.67.0` | `8.69.0` | | [jest](https://github.com/jestjs/jest/tree/HEAD/packages/jest) | `30.4.2` | `30.5.1` | | [jest-environment-jsdom](https://github.com/jestjs/jest/tree/HEAD/packages/jest-environment-jsdom) | `30.4.1` | `30.5.1` | | [jest-environment-node](https://github.com/jestjs/jest/tree/HEAD/packages/jest-environment-node) | `30.4.1` | `30.5.1` | | [jest-util](https://github.com/jestjs/jest/tree/HEAD/packages/jest-util) | `30.4.1` | `30.5.1` | | [ng-mocks](https://github.com/help-me-mom/ng-mocks) | `14.17.1` | `14.17.3` | | [sharp](https://github.com/lovell/sharp) | `0.35.3` | `0.35.4` | | [tsx](https://github.com/privatenumber/tsx) | `4.23.12` | `4.23.13` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.67.0` | `8.69.0` | | [zod](https://github.com/colinhacks/zod) | `4.3.6` | `4.5.4` | Updates `axios` from 1.19.0 to 1.20.0 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.19.0...v1.20.0) Updates `hls.js` from 1.7.0 to 1.7.1 - [Release notes](https://github.com/video-dev/hls.js/releases) - [Changelog](https://github.com/video-dev/hls.js/blob/master/docs/release-process.md) - [Commits](https://github.com/video-dev/hls.js/compare/v1.7.0...v1.7.1) Updates `marked` from 18.0.9 to 18.0.11 - [Release notes](https://github.com/markedjs/marked/releases) - [Commits](https://github.com/markedjs/marked/compare/v18.0.9...v18.0.11) Updates `@astrojs/sitemap` from 3.7.3 to 3.7.4 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/sitemap/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/@astrojs/sitemap@3.7.4/packages/integrations/sitemap) Updates `@eslint/eslintrc` from 3.3.6 to 3.3.7 - [Release notes](https://github.com/eslint/eslintrc/releases) - [Changelog](https://github.com/eslint/eslintrc/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslintrc/compare/eslintrc-v3.3.6...eslintrc-v3.3.7) Updates `@faker-js/faker` from 10.5.0 to 10.6.0 - [Release notes](https://github.com/faker-js/faker/releases) - [Changelog](https://github.com/faker-js/faker/blob/next/CHANGELOG.md) - [Commits](https://github.com/faker-js/faker/compare/v10.5.0...v10.6.0) Updates `@swc/core` from 1.15.47 to 1.16.1 - [Release notes](https://github.com/swc-project/swc/releases) - [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md) - [Commits](https://github.com/swc-project/swc/commits/v1.16.1/packages/core) Updates `@typescript-eslint/eslint-plugin` from 8.67.0 to 8.69.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.69.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 8.67.0 to 8.69.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.69.0/packages/parser) Updates `@typescript-eslint/utils` from 8.67.0 to 8.69.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/utils/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.69.0/packages/utils) Updates `jest` from 30.4.2 to 30.5.1 - [Release notes](https://github.com/jestjs/jest/releases) - [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jestjs/jest/commits/v30.5.1/packages/jest) Updates `jest-environment-jsdom` from 30.4.1 to 30.5.1 - [Release notes](https://github.com/jestjs/jest/releases) - [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jestjs/jest/commits/v30.5.1/packages/jest-environment-jsdom) Updates `jest-environment-node` from 30.4.1 to 30.5.1 - [Release notes](https://github.com/jestjs/jest/releases) - [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jestjs/jest/commits/v30.5.1/packages/jest-environment-node) Updates `jest-util` from 30.4.1 to 30.5.1 - [Release notes](https://github.com/jestjs/jest/releases) - [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jestjs/jest/commits/v30.5.1/packages/jest-util) Updates `ng-mocks` from 14.17.1 to 14.17.3 - [Release notes](https://github.com/help-me-mom/ng-mocks/releases) - [Changelog](https://github.com/help-me-mom/ng-mocks/blob/main/CHANGELOG.md) - [Commits](https://github.com/help-me-mom/ng-mocks/compare/v14.17.1...v14.17.3) Updates `sharp` from 0.35.3 to 0.35.4 - [Release notes](https://github.com/lovell/sharp/releases) - [Commits](https://github.com/lovell/sharp/compare/v0.35.3...v0.35.4) Updates `tsx` from 4.23.12 to 4.23.13 - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs) - [Commits](https://github.com/privatenumber/tsx/compare/v4.23.12...v4.23.13) Updates `typescript-eslint` from 8.67.0 to 8.69.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.69.0/packages/typescript-eslint) Updates `zod` from 4.3.6 to 4.5.4 - [Release notes](https://github.com/colinhacks/zod/releases) - [Commits](https://github.com/colinhacks/zod/compare/v4.3.6...v4.5.4) --- updated-dependencies: - dependency-name: axios dependency-version: 1.20.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: hls.js dependency-version: 1.7.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: npm-minor-patch - dependency-name: marked dependency-version: 18.0.11 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: npm-minor-patch - dependency-name: "@astrojs/sitemap" dependency-version: 3.7.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-minor-patch - dependency-name: "@eslint/eslintrc" dependency-version: 3.3.7 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-minor-patch - dependency-name: "@faker-js/faker" dependency-version: 10.6.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: "@swc/core" dependency-version: 1.16.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: "@typescript-eslint/eslint-plugin" dependency-version: 8.69.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: "@typescript-eslint/parser" dependency-version: 8.69.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: "@typescript-eslint/utils" dependency-version: 8.69.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: jest dependency-version: 30.5.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: jest-environment-jsdom dependency-version: 30.5.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: jest-environment-node dependency-version: 30.5.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: jest-util dependency-version: 30.5.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: ng-mocks dependency-version: 14.17.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-minor-patch - dependency-name: sharp dependency-version: 0.35.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-minor-patch - dependency-name: tsx dependency-version: 4.23.13 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-minor-patch - dependency-name: typescript-eslint dependency-version: 8.69.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch - dependency-name: zod dependency-version: 4.5.4 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 38 +- pnpm-lock.yaml | 2083 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 1419 insertions(+), 702 deletions(-) diff --git a/package.json b/package.json index d1ada528a..12e252250 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "@yangkghjh/videojs-aspect-ratio-panel": "0.0.1", "angularx-qrcode": "21.0.5", "artplayer": "5.4.0", - "axios": "1.19.0", + "axios": "1.20.0", "better-sqlite3": "13.0.3", "date-fns": "4.4.0", "drizzle-orm": "0.45.2", @@ -120,9 +120,9 @@ "electron-updater": "6.8.9", "epg-parser": "^0.5.0", "fix-path": "5.0.0", - "hls.js": "1.7.0", + "hls.js": "1.7.1", "iptv-playlist-parser": "github:4gray/iptv-playlist-parser#v0.15.2-iptvnator.2", - "marked": "18.0.9", + "marked": "18.0.11", "mpegts.js": "1.8.1", "ms": "2.1.3", "ngx-indexed-db": "22.0.0", @@ -156,11 +156,11 @@ "@angular/router": "21.2.19", "@angular/service-worker": "21.2.19", "@astrojs/mdx": "7.0.7", - "@astrojs/sitemap": "3.7.3", + "@astrojs/sitemap": "3.7.4", "@electron/asar": "3.4.1", - "@eslint/eslintrc": "3.3.6", + "@eslint/eslintrc": "3.3.7", "@eslint/js": "^9.38.0", - "@faker-js/faker": "10.5.0", + "@faker-js/faker": "10.6.0", "@fontsource/crimson-pro": "5.3.0", "@fontsource/dm-sans": "5.3.0", "@fontsource/jetbrains-mono": "5.3.0", @@ -181,7 +181,7 @@ "@playwright/test": "^1.62.1", "@schematics/angular": "21.2.19", "@swc-node/register": "1.12.1", - "@swc/core": "1.15.47", + "@swc/core": "1.16.1", "@swc/helpers": "0.5.23", "@tailwindcss/typography": "0.5.20", "@types/better-sqlite3": "^7.6.12", @@ -191,9 +191,9 @@ "@types/mocha": "9.0.0", "@types/node": "20.19.9", "@types/video.js": "7.3.58", - "@typescript-eslint/eslint-plugin": "^8.67.0", - "@typescript-eslint/parser": "^8.67.0", - "@typescript-eslint/utils": "^8.67.0", + "@typescript-eslint/eslint-plugin": "^8.69.0", + "@typescript-eslint/parser": "^8.69.0", + "@typescript-eslint/utils": "^8.69.0", "angular-eslint": "21.4.0", "astro": "7.2.4", "autoprefixer": "10.5.4", @@ -214,28 +214,28 @@ "istanbul-lib-coverage": "3.2.2", "istanbul-lib-report": "3.0.1", "istanbul-reports": "3.2.0", - "jest": "^30.4.2", - "jest-environment-jsdom": "^30.4.1", - "jest-environment-node": "^30.4.1", + "jest": "^30.5.1", + "jest-environment-jsdom": "^30.5.1", + "jest-environment-node": "^30.5.1", "jest-preset-angular": "~15.0.0", - "jest-util": "^30.4.1", + "jest-util": "^30.5.1", "jsonc-eslint-parser": "^2.1.0", "material-design-icons-iconfont": "6.7.0", "mrmime": "2.0.1", - "ng-mocks": "14.17.1", + "ng-mocks": "14.17.3", "nx": "22.7.8", "nx-electron": "22.0.0", "prettier": "^3.9.6", - "sharp": "0.35.3", + "sharp": "0.35.4", "tailwindcss": "^3.4.19", "ts-jest": "^29.4.12", "ts-node": "10.9.2", "tslib": "^2.8.1", - "tsx": "4.23.12", + "tsx": "4.23.13", "typescript": "5.9.3", - "typescript-eslint": "^8.67.0", + "typescript-eslint": "^8.69.0", "yaml": "2.9.0", - "zod": "4.3.6" + "zod": "4.5.4" }, "pnpm": { "overrides": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4522499d..d5f465ac5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,8 +121,8 @@ importers: specifier: 5.4.0 version: 5.4.0 axios: - specifier: 1.19.0 - version: 1.19.0 + specifier: 1.20.0 + version: 1.20.0 better-sqlite3: specifier: 13.0.3 version: 13.0.3 @@ -145,14 +145,14 @@ importers: specifier: 5.0.0 version: 5.0.0 hls.js: - specifier: 1.7.0 - version: 1.7.0 + specifier: 1.7.1 + version: 1.7.1 iptv-playlist-parser: specifier: github:4gray/iptv-playlist-parser#v0.15.2-iptvnator.2 version: https://codeload.github.com/4gray/iptv-playlist-parser/tar.gz/d547b6be8a44431c85fbcbcdefb41f28c0dadf6d marked: - specifier: 18.0.9 - version: 18.0.9 + specifier: 18.0.11 + version: 18.0.11 mpegts.js: specifier: 1.8.1 version: 1.8.1 @@ -198,19 +198,19 @@ importers: version: 21.3.1(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@angular-eslint/eslint-plugin': specifier: 21.3.1 - version: 21.3.1(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + version: 21.3.1(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@angular-eslint/eslint-plugin-template': specifier: 21.3.1 - version: 21.3.1(@angular-eslint/template-parser@21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.67.0)(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + version: 21.3.1(@angular-eslint/template-parser@21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.69.0)(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@angular-eslint/schematics': specifier: 21.3.1 - version: 21.3.1(@angular-eslint/template-parser@21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(@typescript-eslint/types@8.67.0)(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + version: 21.3.1(@angular-eslint/template-parser@21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(@typescript-eslint/types@8.69.0)(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@angular-eslint/template-parser': specifier: 21.3.1 version: 21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@angular/build': specifier: 21.2.19 - version: 21.2.19(@angular/compiler-cli@21.2.19(@angular/compiler@21.2.19)(typescript@5.9.3))(@angular/compiler@21.2.19)(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.19(@angular/animations@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/service-worker@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(chokidar@5.0.0)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(postcss@8.5.26)(sass-embedded@1.100.0)(tailwindcss@3.4.19(tsx@4.23.12)(yaml@2.9.0))(terser@5.49.2)(tslib@2.8.1)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) + version: 21.2.19(@angular/compiler-cli@21.2.19(@angular/compiler@21.2.19)(typescript@5.9.3))(@angular/compiler@21.2.19)(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.19(@angular/animations@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/service-worker@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(chokidar@5.0.0)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(postcss@8.5.26)(sass-embedded@1.100.0)(tailwindcss@3.4.19(tsx@4.23.13)(yaml@2.9.0))(terser@5.49.2)(tslib@2.8.1)(tsx@4.23.13)(typescript@5.9.3)(yaml@2.9.0) '@angular/cli': specifier: 21.2.21 version: 21.2.21(@types/node@20.19.9)(chokidar@5.0.0) @@ -225,22 +225,22 @@ importers: version: 21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) '@astrojs/mdx': specifier: 7.0.7 - version: 7.0.7(@astrojs/markdown-satteri@0.3.7)(astro@7.2.4(@astrojs/markdown-remark@7.2.4)(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0)) + version: 7.0.7(@astrojs/markdown-satteri@0.3.7)(astro@7.2.4(@astrojs/markdown-remark@7.2.4)(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0)) '@astrojs/sitemap': - specifier: 3.7.3 - version: 3.7.3 + specifier: 3.7.4 + version: 3.7.4 '@electron/asar': specifier: 3.4.1 version: 3.4.1 '@eslint/eslintrc': - specifier: 3.3.6 - version: 3.3.6 + specifier: 3.3.7 + version: 3.3.7 '@eslint/js': specifier: ^9.38.0 version: 9.39.2 '@faker-js/faker': - specifier: 10.5.0 - version: 10.5.0 + specifier: 10.6.0 + version: 10.6.0 '@fontsource/crimson-pro': specifier: 5.3.0 version: 5.3.0 @@ -255,7 +255,7 @@ importers: version: 5.3.0 '@ngrx/eslint-plugin': specifier: ^21.1.1 - version: 21.1.1(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript-eslint@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(typescript@5.9.3) + version: 21.1.1(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript-eslint@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(typescript@5.9.3) '@ngx-translate/core': specifier: 16.0.4 version: 16.0.4(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)) @@ -264,34 +264,34 @@ importers: version: 16.0.1(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)) '@nx/angular': specifier: 22.7.8 - version: 22.7.8(a7389d00e46db7588c00ae81852ff238) + version: 22.7.8(9da22baaa942ea628a4531574667d706) '@nx/devkit': specifier: 22.7.8 - version: 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + version: 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) '@nx/esbuild': specifier: 22.7.8 - version: 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + version: 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) '@nx/eslint': specifier: 22.7.8 - version: 22.7.8(5d8e116ecf28960b728f05bee433010d) + version: 22.7.8(c6268304c3e993c057e90202eca80e3c) '@nx/eslint-plugin': specifier: 22.7.8 - version: 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(@typescript-eslint/parser@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@1.21.7)))(eslint@9.39.2(jiti@1.21.7))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(typescript@5.9.3) + version: 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(@typescript-eslint/parser@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@1.21.7)))(eslint@9.39.2(jiti@1.21.7))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(typescript@5.9.3) '@nx/jest': specifier: 22.7.8 - version: 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3))(typescript@5.9.3) + version: 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3))(typescript@5.9.3) '@nx/js': specifier: 22.7.8 - version: 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + version: 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) '@nx/playwright': specifier: 22.7.8 - version: 22.7.8(fd8f618a9324a70c524ebeba2216a705) + version: 22.7.8(b0b327483e86e3b4312dfd51a3eacfc2) '@nx/web': specifier: 22.7.8 - version: 22.7.8(ddd6b5dbda84baddadf906abc88c5890) + version: 22.7.8(e36557eae963c5bd5b3bad2c1c9ad54a) '@nx/workspace': specifier: 22.7.8 - version: 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)) + version: 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)) '@playwright/test': specifier: ^1.62.1 version: 1.62.1 @@ -300,16 +300,16 @@ importers: version: 21.2.19(chokidar@5.0.0) '@swc-node/register': specifier: 1.12.1 - version: 1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3) + version: 1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3) '@swc/core': - specifier: 1.15.47 - version: 1.15.47(@swc/helpers@0.5.23) + specifier: 1.16.1 + version: 1.16.1(@swc/helpers@0.5.23) '@swc/helpers': specifier: 0.5.23 version: 0.5.23 '@tailwindcss/typography': specifier: 0.5.20 - version: 0.5.20(tailwindcss@3.4.19(tsx@4.23.12)(yaml@2.9.0)) + version: 0.5.20(tailwindcss@3.4.19(tsx@4.23.13)(yaml@2.9.0)) '@types/better-sqlite3': specifier: ^7.6.12 version: 7.6.13 @@ -332,20 +332,20 @@ importers: specifier: 7.3.58 version: 7.3.58 '@typescript-eslint/eslint-plugin': - specifier: ^8.67.0 - version: 8.67.0(@typescript-eslint/parser@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + specifier: ^8.69.0 + version: 8.69.0(@typescript-eslint/parser@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.67.0 - version: 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + specifier: ^8.69.0 + version: 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@typescript-eslint/utils': - specifier: ^8.67.0 - version: 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + specifier: ^8.69.0 + version: 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) angular-eslint: specifier: 21.4.0 - version: 21.4.0(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript-eslint@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(typescript@5.9.3) + version: 21.4.0(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript-eslint@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(typescript@5.9.3) astro: specifier: 7.2.4 - version: 7.2.4(@astrojs/markdown-remark@7.2.4)(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0) + version: 7.2.4(@astrojs/markdown-remark@7.2.4)(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0) autoprefixer: specifier: 10.5.4 version: 10.5.4(postcss@8.5.26) @@ -378,7 +378,7 @@ importers: version: 10.1.8(eslint@9.39.2(jiti@1.21.7)) eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7)) + version: 2.32.0(@typescript-eslint/parser@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7)) eslint-plugin-playwright: specifier: ^1.6.2 version: 1.8.3(eslint@9.39.2(jiti@1.21.7)) @@ -401,20 +401,20 @@ importers: specifier: 3.2.0 version: 3.2.0 jest: - specifier: ^30.4.2 - version: 30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) + specifier: ^30.5.1 + version: 30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) jest-environment-jsdom: - specifier: ^30.4.1 - version: 30.4.1 + specifier: ^30.5.1 + version: 30.5.1 jest-environment-node: - specifier: ^30.4.1 - version: 30.4.1 + specifier: ^30.5.1 + version: 30.5.1 jest-preset-angular: specifier: ~15.0.0 - version: 15.0.3(e3b998715f9ba0e14eb4dd646f182898) + version: 15.0.3(49d964010ff732709c8b8b9285288d9d) jest-util: - specifier: ^30.4.1 - version: 30.4.1 + specifier: ^30.5.1 + version: 30.5.1 jsonc-eslint-parser: specifier: ^2.1.0 version: 2.4.2 @@ -425,47 +425,47 @@ importers: specifier: 2.0.1 version: 2.0.1 ng-mocks: - specifier: 14.17.1 - version: 14.17.1(b285834fe0000b6ade3305b52068a4d2) + specifier: 14.17.3 + version: 14.17.3(b285834fe0000b6ade3305b52068a4d2) nx: specifier: 22.7.8 - version: 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)) + version: 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)) nx-electron: specifier: 22.0.0 - version: 22.0.0(patch_hash=f4bbde1778360c4c462b255bec47a337c0465d59cdcab14ecb601161f3467002)(@nx/devkit@22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))))(@nx/workspace@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(@swc/core@1.15.47(@swc/helpers@0.5.23))(electron-builder-squirrel-windows@26.15.7)(electron@43.3.0)(esbuild@0.28.2)(rxjs@7.8.2)(typescript@5.9.3) + version: 22.0.0(patch_hash=f4bbde1778360c4c462b255bec47a337c0465d59cdcab14ecb601161f3467002)(@nx/devkit@22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))))(@nx/workspace@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(@swc/core@1.16.1(@swc/helpers@0.5.23))(electron-builder-squirrel-windows@26.15.7)(electron@43.3.0)(esbuild@0.28.2)(rxjs@7.8.2)(typescript@5.9.3) prettier: specifier: ^3.9.6 version: 3.9.6 sharp: - specifier: 0.35.3 - version: 0.35.3(@types/node@20.19.9) + specifier: 0.35.4 + version: 0.35.4(@types/node@20.19.9) tailwindcss: specifier: ^3.4.19 - version: 3.4.19(tsx@4.23.12)(yaml@2.9.0) + version: 3.4.19(tsx@4.23.13)(yaml@2.9.0) ts-jest: specifier: ^29.4.12 - version: 29.4.12(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(esbuild@0.28.2)(jest-util@30.4.1)(jest@30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.12(@babel/core@7.29.7)(@jest/transform@30.5.1)(@jest/types@30.5.1)(babel-jest@30.5.1(@babel/core@7.29.7))(esbuild@0.28.2)(jest-util@30.5.1)(jest@30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)))(typescript@5.9.3) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3) tslib: specifier: ^2.8.1 version: 2.8.1 tsx: - specifier: 4.23.12 - version: 4.23.12 + specifier: 4.23.13 + version: 4.23.13 typescript: specifier: 5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.67.0 - version: 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + specifier: ^8.69.0 + version: 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) yaml: specifier: 2.9.0 version: 2.9.0 zod: - specifier: 4.3.6 - version: 4.3.6 + specifier: 4.5.4 + version: 4.5.4 packages: @@ -924,8 +924,8 @@ packages: resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} engines: {node: '>=22.12.0'} - '@astrojs/sitemap@3.7.3': - resolution: {integrity: sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA==} + '@astrojs/sitemap@3.7.4': + resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==} '@astrojs/telemetry@3.3.3': resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==} @@ -2252,8 +2252,8 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.6': - resolution: {integrity: sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==} + '@eslint/eslintrc@3.3.7': + resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.39.2': @@ -2268,8 +2268,8 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@faker-js/faker@10.5.0': - resolution: {integrity: sha512-bsxD8WLS5lIj7aaoCx1YJkktqYj5vlBUE6HWzu2Q51ksrGJ0H737ECCKlFU7Yf8Br45z9t99frBp/J7kzbMPAg==} + '@faker-js/faker@10.6.0': + resolution: {integrity: sha512-3RQHgEtvL1Frl/d1cSreo7qhJ3Gk1OdNUai/CtZ8G+wYeRQnJih3s9xJ9/kgYekPQRdwgh0HXRPqMlzWGwivIQ==} engines: {node: ^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0, npm: '>=10'} '@fontsource/crimson-pro@5.3.0': @@ -2321,160 +2321,160 @@ packages: resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.35.3': - resolution: {integrity: sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==} + '@img/sharp-darwin-arm64@0.35.4': + resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.35.3': - resolution: {integrity: sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==} + '@img/sharp-darwin-x64@0.35.4': + resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==} engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-freebsd-wasm32@0.35.3': - resolution: {integrity: sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==} + '@img/sharp-freebsd-wasm32@0.35.4': + resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==} engines: {node: '>=20.9.0'} os: [freebsd] - '@img/sharp-libvips-darwin-arm64@1.3.2': - resolution: {integrity: sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==} + '@img/sharp-libvips-darwin-arm64@1.3.3': + resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.3.2': - resolution: {integrity: sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==} + '@img/sharp-libvips-darwin-x64@1.3.3': + resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.3.2': - resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==} + '@img/sharp-libvips-linux-arm64@1.3.3': + resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.3.2': - resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==} + '@img/sharp-libvips-linux-arm@1.3.3': + resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.3.2': - resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==} + '@img/sharp-libvips-linux-ppc64@1.3.3': + resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.3.2': - resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==} + '@img/sharp-libvips-linux-riscv64@1.3.3': + resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.3.2': - resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==} + '@img/sharp-libvips-linux-s390x@1.3.3': + resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.3.2': - resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==} + '@img/sharp-libvips-linux-x64@1.3.3': + resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.3.2': - resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==} + '@img/sharp-libvips-linuxmusl-arm64@1.3.3': + resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.3.2': - resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==} + '@img/sharp-libvips-linuxmusl-x64@1.3.3': + resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.35.3': - resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==} + '@img/sharp-linux-arm64@0.35.4': + resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.35.3': - resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==} + '@img/sharp-linux-arm@0.35.4': + resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==} engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.35.3': - resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==} + '@img/sharp-linux-ppc64@0.35.4': + resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==} engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.35.3': - resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==} + '@img/sharp-linux-riscv64@0.35.4': + resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==} engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.35.3': - resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==} + '@img/sharp-linux-s390x@0.35.4': + resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==} engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.35.3': - resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==} + '@img/sharp-linux-x64@0.35.4': + resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==} engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.35.3': - resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==} + '@img/sharp-linuxmusl-arm64@0.35.4': + resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.35.3': - resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==} + '@img/sharp-linuxmusl-x64@0.35.4': + resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==} engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-wasm32@0.35.3': - resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==} + '@img/sharp-wasm32@0.35.4': + resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==} engines: {node: '>=20.9.0'} - '@img/sharp-webcontainers-wasm32@0.35.3': - resolution: {integrity: sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==} + '@img/sharp-webcontainers-wasm32@0.35.4': + resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==} engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.35.3': - resolution: {integrity: sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==} + '@img/sharp-win32-arm64@0.35.4': + resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.35.3': - resolution: {integrity: sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==} + '@img/sharp-win32-ia32@0.35.4': + resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==} engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.35.3': - resolution: {integrity: sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==} + '@img/sharp-win32-x64@0.35.4': + resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==} engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] @@ -2633,8 +2633,12 @@ packages: resolution: {integrity: sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@30.4.2': - resolution: {integrity: sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==} + '@jest/console@30.5.1': + resolution: {integrity: sha512-u5Ncuc+gXVUwjNMFQOnphHo2Qx2DxyC8Dvpmf4HCx4y0kvSkRRNiQYRixrvOP4V7y52JcSuNxqochCt0PpdHVg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.5.1': + resolution: {integrity: sha512-BL9g6CJUUhIbdoAflz/Va658erSSXUIvU8XUYiWNTbZljJjZ5yaC9EJ9/dQ19rpbYV3ZOK4sBACqhPaTyhoUIA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -2650,6 +2654,10 @@ packages: resolution: {integrity: sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.5.0': + resolution: {integrity: sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment-jsdom-abstract@30.2.0': resolution: {integrity: sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2660,10 +2668,11 @@ packages: canvas: optional: true - '@jest/environment-jsdom-abstract@30.4.1': - resolution: {integrity: sha512-dSlKrqug3siYNHVnjwIldShY12wAH3spwRltO/+8VOjg0X+xEq7vOs3DbBs4LRKsu7OH+NUb9kuZUNBF9Ho3TA==} + '@jest/environment-jsdom-abstract@30.5.1': + resolution: {integrity: sha512-J395vmP3Fb2Te0JmF7pe4si4jpfbXef1YsY4UpHYL6OOxS2molu9Dsie1VmIiUalXdtmz1P5QRgc+5hBD+ssBg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: + '@types/jsdom': '*' canvas: ^3.0.0 jsdom: '*' peerDependenciesMeta: @@ -2678,6 +2687,10 @@ packages: resolution: {integrity: sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment@30.5.1': + resolution: {integrity: sha512-eYJAkOsrpwDXPcoLNEG6lN9Zo3Cy35pxnVQD74vyIfsi/Q8wB/lZFsEjU4wrecOgT4ZviQDZaX/cFIJyMdMxTw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.2.0': resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2686,10 +2699,18 @@ packages: resolution: {integrity: sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.5.1': + resolution: {integrity: sha512-WcRWhHQdTMRDpyWKZ/6MINBmovI7zeD+bL8wFjCncRV3NQOwKy1X45IfyblfHR4k/XciIlNEdFL9QjFO+HNKOg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect@30.4.1': resolution: {integrity: sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect@30.5.1': + resolution: {integrity: sha512-uOGd40P/COyUp9xHf5jeGiGJC2/ANg+2+Tk9/xN5/LxmlY/r/gxsPrx3DTEtaRZsLAX4wgNSLEDELZ5bmVs2bA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@30.2.0': resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2698,14 +2719,26 @@ packages: resolution: {integrity: sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@30.5.1': + resolution: {integrity: sha512-rEkV6YzpBXo/L9cnj2ibyuYZuyGiNWaPUsyCu3HYJbqCV4jnEiKmf7hId20z8eKjZ0JQ9jtIYKxRSmYB/OYSsA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.1.0': resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.5.0': + resolution: {integrity: sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/globals@30.4.1': resolution: {integrity: sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/globals@30.5.1': + resolution: {integrity: sha512-VhqvQ251XIC7pk46YymI3HCeBLOdvriDw9zibekodAHEwoVvbVVgpU5H13GvmyOAzxtZCfsm1uvzqkaqJf2I+g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/pattern@30.0.1': resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2714,6 +2747,10 @@ packages: resolution: {integrity: sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/pattern@30.5.0': + resolution: {integrity: sha512-HdNQYSdRTEBNrginaqzQtTjG0HRMfrra/z6Ok7uL3S87vSlarIVohEsJsSj5edu3MiHoHjAkvPROz5ZjoKai+w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/reporters@30.4.1': resolution: {integrity: sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2723,6 +2760,15 @@ packages: node-notifier: optional: true + '@jest/reporters@30.5.1': + resolution: {integrity: sha512-RbUXIfv85KxitJn4l3MpAoMilkvXe2QCO5lXxHWftywo/VdZ5vkEoHRDgphcxP6qmoIkUaN8/UZj6NhdkIFdJg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + '@jest/schemas@30.0.5': resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2731,26 +2777,50 @@ packages: resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/schemas@30.5.0': + resolution: {integrity: sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/snapshot-utils@30.4.1': resolution: {integrity: sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/snapshot-utils@30.5.1': + resolution: {integrity: sha512-V3wnxNtiVmw5PPVg433Cn3VdXnsOeu/ofLw3KC04Bn2y1wIlU5kozXQn48rhrgj/02LrCVtntTEF1yBha0XSUw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/source-map@30.0.1': resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/source-map@30.5.0': + resolution: {integrity: sha512-xWpTJP9D0bDFGbPGT8XuWSwwha/iHADyyKzUnMx4UbdgnHugxrDaQFO4RZ8x4ZsFzRP6pNii8uvlgKCDxCIuDg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/test-result@30.4.1': resolution: {integrity: sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/test-result@30.5.1': + resolution: {integrity: sha512-A/1S6ZBdpic50E0pxLgvaB9XNPL4k7AksmG69OO2oiotxciWZwHkbOec+qbIi+uUtIIByOVlXJUl97oZUsz+Jw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/test-sequencer@30.4.1': resolution: {integrity: sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/test-sequencer@30.5.1': + resolution: {integrity: sha512-SHcPnrjdVRYJv6y6l4JUTy4Jccu7zmO6BmiOfOA34UiVBto22s19WiDC0A/2qfM7MWB/qdcoqfSIRMitpjTT4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/transform@30.4.1': resolution: {integrity: sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/transform@30.5.1': + resolution: {integrity: sha512-EDnDhn0jleU9ZhpVoA4gvqw+Ev0iw/r5upNT2b79RiwiaTiYAMMhvNJP3lmocjIe5J2ZkoNr0B3K/J6O5GIm4Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.2.0': resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2759,6 +2829,10 @@ packages: resolution: {integrity: sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.5.1': + resolution: {integrity: sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -3871,9 +3945,9 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} '@playwright/test@1.62.1': resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} @@ -4356,6 +4430,9 @@ packages: '@sinclair/typebox@0.34.46': resolution: {integrity: sha512-kiW7CtS/NkdvTUjkjUJo7d5JsFfbJ14YjdhDk9KoEgK6nFjKNXZPrX0jfLA8ZlET4cFLHxOZ/0vFKOP+bOxIOQ==} + '@sinclair/typebox@0.34.52': + resolution: {integrity: sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -4392,86 +4469,86 @@ packages: '@swc-node/sourcemap-support@0.6.1': resolution: {integrity: sha512-ovltDVH5QpdHXZkW138vG4+dgcNsxfwxHVoV6BtmTbz2KKl1A8ZSlbdtxzzfNjCjbpayda8Us9eMtcHobm38dA==} - '@swc/core-darwin-arm64@1.15.47': - resolution: {integrity: sha512-GsoMtan3ojGGMGFbl31mmRu5ctZ56re8grGE8mO/OHJ8O+JRkzod02fe7X6ZQ8JvamA3imkEkx/h3u+vsOgPgA==} + '@swc/core-darwin-arm64@1.16.1': + resolution: {integrity: sha512-zlJblJ8ncErD43lKdxjbUaUskJQf+LxiPXYcWXD8/8ZMV+7uuAT+CwjciLXpyZBd5Pq/S726bMpeeAwSeL1hhg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.47': - resolution: {integrity: sha512-leTi7Rx3KF4zcC637iqWgk9SoV8VXAD8ppQYXsep63px5A/UftOcxLN1pmr8Z1si/YvX90ompP/rHgpYkgwXWg==} + '@swc/core-darwin-x64@1.16.1': + resolution: {integrity: sha512-IN0BmPWb0YAh/17mmlWB/HDBtTw2MfuW4hulf/tQAgTQBRH17l+z499bNJLK6LizSjqs0P7V+jU38Zj+vJC1DA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.47': - resolution: {integrity: sha512-hBqHuoWKKIsKmDBn9qVeWqj5GWZhtlcczVaqQmNRXsDfq+voR5CxKRfamA367QjJXtceYuliLFfEL8QsskRM2g==} + '@swc/core-linux-arm-gnueabihf@1.16.1': + resolution: {integrity: sha512-EYgrx2YOCQ2Twz2S793kqNjPkpvYVUPzzR95bIb7by+VQcyaai4lZZ2iz/tZvcFVKSNcN3/JTKwx+aBn2ZL52A==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.47': - resolution: {integrity: sha512-TBxvRz+B4K205TWHHZxWVxkC2RFNP/Mz3PNcECBos5PsKwxjg3QSJzdoebr0VCf0Bfh8HOPldKxAP/8XkFe9gA==} + '@swc/core-linux-arm64-gnu@1.16.1': + resolution: {integrity: sha512-moyKm0YZlHdHohzm1YwgAyesqnE853rO0REMfJLFAova51wF9BNi+3ZW2PeS7Vqvn6HeJuepLpAHbBdZctxpHA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [glibc] - '@swc/core-linux-arm64-musl@1.15.47': - resolution: {integrity: sha512-3Yu3Uq/VgytqsPjTMbkPU1ExADytbdWbruJYhA584E9jrpE2Ki+R6VVPoZCeAVk1Cb7QxcRTgblw6bSa6a/R+w==} + '@swc/core-linux-arm64-musl@1.16.1': + resolution: {integrity: sha512-kKGBO9wdapiSzuf5ZzZ2fYtlu1BNSYtIIUxvH1ir/gcelTOREEHGDCLTDFx/2Knf878nU11A40z7LxwasEFxqA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [musl] - '@swc/core-linux-ppc64-gnu@1.15.47': - resolution: {integrity: sha512-wfdMi5IaOaNtmh2/6geRoxIdNfqylUZFdtzTKS655y1axWfIWyx7As74vv0wVdjeCIZ3WmCI9odDd4rUttXOSQ==} + '@swc/core-linux-ppc64-gnu@1.16.1': + resolution: {integrity: sha512-nZ6qahtLxC3PM54cWOQZHxt4lTCF/3J4LIoWWzz6v7A+rLs8Dx54anYQf7mH3eIi8KlNpgKci/ie8ZSqFN8O7A==} engines: {node: '>=10'} cpu: [ppc64] os: [linux] libc: [glibc] - '@swc/core-linux-s390x-gnu@1.15.47': - resolution: {integrity: sha512-3hHYBY0yx8Ez7GMRrkhXHQzMdR5IZA6Wq5Ee4svlgwvSECLpnAJ9+0AimEGUFDvuLwE7nV/2+PYe8+Nm4rvNcQ==} + '@swc/core-linux-s390x-gnu@1.16.1': + resolution: {integrity: sha512-4ji5PNzhYq193Z4/4xUaSoNJza6iCkDJSzhetrbB6KOYxsr+kxtQr8ePWhMJUiMt6JUWtXaZ1PYT8FhtED+nGA==} engines: {node: '>=10'} cpu: [s390x] os: [linux] libc: [glibc] - '@swc/core-linux-x64-gnu@1.15.47': - resolution: {integrity: sha512-TjfhjgP/jGCfFHYC3JQPhJA1HwErbIJ9JfREDc1KNkvY6P0LodCgKVIlQ5deeTbkG7ih3bF5PHJLuLpaZjdRyQ==} + '@swc/core-linux-x64-gnu@1.16.1': + resolution: {integrity: sha512-VJQxqrisHV+B394IgrOu8YsIIXZgffnf5tO+yc9Z/hoUpuZEvuQTjWwlnpZdpyD+0nx6LTD1/3k646JYm43yJA==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [glibc] - '@swc/core-linux-x64-musl@1.15.47': - resolution: {integrity: sha512-CQpS8Ge/avfjZd0UEwG/sds83Uu32deQXcV1Jo3jD0mmvQQqtYAjpsDZXugmheeAwmt+YIuoVtVHro8LMYHqsQ==} + '@swc/core-linux-x64-musl@1.16.1': + resolution: {integrity: sha512-r9oV1mwxxsIGcLV1IQ/tw76MW3doatKze1QFWuC+a7QqJUkhY/bKTSVk6NpKKUGm2LDsE33Va8VqSClfA7vSiQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [musl] - '@swc/core-win32-arm64-msvc@1.15.47': - resolution: {integrity: sha512-0W8IKHsUTYiT7G2RqtOoVWk+89yzZikIiDUb/sCK6BmQDBhN91hQSfyUtW12jhEWLzYgcfmisfsZrmZE+84U1A==} + '@swc/core-win32-arm64-msvc@1.16.1': + resolution: {integrity: sha512-6huNRessoBLxWEqBm5zJXyCQ27TO7anvkdiuQ5MDO4CJni0nOXEqKtV9RllQ2TdyENKKsUMXVnIfW2hIXx/R5Q==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.47': - resolution: {integrity: sha512-ZIp49d2Z4/ka2jO9otOg4hDvTdPmp86kVOgS2M5FCPI7eKKZ1W0boxWn+8XeZrfERtFGW0AlMRm4JhlJa7l3NA==} + '@swc/core-win32-ia32-msvc@1.16.1': + resolution: {integrity: sha512-OVKJFUzphrGmsh+BGtcZDesx0YryV7/Yvy5XGgTqnrZfjnyfcr5uaqYQugCckdIlupc5Vs3XtDjRAj12z4ZPlw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.47': - resolution: {integrity: sha512-2h8Iek95vnixkBRCo+H8p09+Q5ll2NgSMFrWTy0iKt7+/t+8/T5mBpiT6c0ZxSS7wcWjwZ9sGZkK70tTSYHdDw==} + '@swc/core-win32-x64-msvc@1.16.1': + resolution: {integrity: sha512-Bt+VIhWYCGk4urklnkkteLUOeLv1VxigwTCeB/xC6rBZxY6IIKdDwCJf6on3E3SUGsIqmQS6QqtuJQc1VxF4Aw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.47': - resolution: {integrity: sha512-FbsO5JcfOjfH38W/rohBRBweJeERsAuIP4f377lmkmxTcq9exjtx4SkRuZY5CdfhR2CBVwDIJegBpJDffwNsOg==} + '@swc/core@1.16.1': + resolution: {integrity: sha512-nUaeu91O5QZKrQdaDCHd402ogUIoNOOjpkZNq0UomWK0G6gDaGmLhvddF1/3BXf5O8aLyo6ZPY/aMDWvaJQ/hg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -4724,16 +4801,16 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.67.0': - resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==} + '@typescript-eslint/eslint-plugin@8.69.0': + resolution: {integrity: sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.67.0 + '@typescript-eslint/parser': ^8.69.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.67.0': - resolution: {integrity: sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==} + '@typescript-eslint/parser@8.69.0': + resolution: {integrity: sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -4745,8 +4822,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.67.0': - resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==} + '@typescript-eslint/project-service@8.69.0': + resolution: {integrity: sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -4755,8 +4832,8 @@ packages: resolution: {integrity: sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.67.0': - resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==} + '@typescript-eslint/scope-manager@8.69.0': + resolution: {integrity: sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.66.0': @@ -4765,8 +4842,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/tsconfig-utils@8.67.0': - resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==} + '@typescript-eslint/tsconfig-utils@8.69.0': + resolution: {integrity: sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -4778,8 +4855,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.67.0': - resolution: {integrity: sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==} + '@typescript-eslint/type-utils@8.69.0': + resolution: {integrity: sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -4789,8 +4866,8 @@ packages: resolution: {integrity: sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.67.0': - resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} + '@typescript-eslint/types@8.69.0': + resolution: {integrity: sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.66.0': @@ -4799,8 +4876,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/typescript-estree@8.67.0': - resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==} + '@typescript-eslint/typescript-estree@8.69.0': + resolution: {integrity: sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -4812,8 +4889,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.67.0': - resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==} + '@typescript-eslint/utils@8.69.0': + resolution: {integrity: sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -4823,13 +4900,16 @@ packages: resolution: {integrity: sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.67.0': - resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} + '@typescript-eslint/visitor-keys@8.69.0': + resolution: {integrity: sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.3': resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} cpu: [arm] @@ -5136,9 +5216,15 @@ packages: ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + algoliasearch@5.48.1: resolution: {integrity: sha512-Rf7xmeuIo7nb6S4mp4abW2faW8DauZyE2faBIKFaUfP3wnpOvNSbiI5AwVhqBNj0jPgBWEvhyCu0sLjN2q77Rg==} engines: {node: '>= 14.0.0'} @@ -5318,8 +5404,8 @@ packages: axios@1.18.1: resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} - axios@1.19.0: - resolution: {integrity: sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==} + axios@1.20.0: + resolution: {integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -5331,6 +5417,12 @@ packages: peerDependencies: '@babel/core': ^7.11.0 || ^8.0.0-0 + babel-jest@30.5.1: + resolution: {integrity: sha512-ge1xUVZS91ml09YRMgRGgeKJ4YJpcOiuwteAxFBYLugQyp7cRw+hHej6Ho0vPjvLrjq60bb7JPHH9LAMA1/krA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-0 + babel-loader@9.2.1: resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} engines: {node: '>= 14.15.0'} @@ -5347,10 +5439,18 @@ packages: resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} engines: {node: '>=12'} + babel-plugin-istanbul@8.0.0: + resolution: {integrity: sha512-18wCskrN3DgbuBmp1gr7LBGT8xdz5xhQQqFvFhVxbkl8VBCrMKQ2YtqBWtUal1Zrc1HTuX0011+Brjw78TCFkg==} + engines: {node: '>=18'} + babel-plugin-jest-hoist@30.4.0: resolution: {integrity: sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + babel-plugin-jest-hoist@30.5.0: + resolution: {integrity: sha512-gtGo1B+u14jrZQv6TdSWIWkTqclboo7Qn+dFAGUOIuXLFuJKAdg3U5MIWzZnW4vfUb4dX9skmAMiby86e/SF4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -5395,6 +5495,12 @@ packages: peerDependencies: '@babel/core': ^7.11.0 || ^8.0.0-beta.1 + babel-preset-jest@30.5.0: + resolution: {integrity: sha512-ZGPn5ClP4lBDpuOK8W1yQIOy359HmbnZv3suucAlIe+SEE9yDsxV4S2PjSbH2Vc97U+WmzYD7vw3kr8NsQ/i6w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 || ^8.0.0 + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -5626,8 +5732,8 @@ packages: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - cjs-module-lexer@2.2.0: - resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + cjs-module-lexer@2.2.1: + resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==} cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} @@ -6442,6 +6548,9 @@ packages: es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -6699,6 +6808,10 @@ packages: resolution: {integrity: sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + expect@30.5.1: + resolution: {integrity: sha512-m8YrYgvKe9+9gEnWEuKz+qCGfHqkrff7PPfyDnOFkjsfYRKqiYyOxDFMFieCGAuhtk/VNm63tvNgKZVzVy+Hvg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} @@ -7139,8 +7252,8 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hls.js@1.7.0: - resolution: {integrity: sha512-NnQpT6Z//+2IB2qovSUbKbrlXY1MOpi0JynZ9L2NNOuTJiNCyMSQj9k2laEj1v7CxU/Hb8oTWR98eT3mVpPQVQ==} + hls.js@1.7.1: + resolution: {integrity: sha512-DlzIkeBAS9IIQ432k3BUf3HlwbsR0+trB1i2lDdN2gUkNkrehFurh0/48M5c1/EjlDkdGng1gwZIpwyPxvdZ/g==} hono@4.12.34: resolution: {integrity: sha512-GqXJqY/xJkJmuloTrnV1ZEXG3fqte+VjkUqoRNZXcrUidiUOP4fMSIHHY4tsqZBK++kVyWmt/AAfSUuy57/eSA==} @@ -7285,6 +7398,10 @@ packages: resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} engines: {node: '>= 4'} + ignore@7.0.8: + resolution: {integrity: sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==} + engines: {node: '>= 4'} + image-size@0.5.5: resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} @@ -7624,16 +7741,20 @@ packages: engines: {node: '>=10'} hasBin: true - jest-changed-files@30.4.1: - resolution: {integrity: sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==} + jest-changed-files@30.5.1: + resolution: {integrity: sha512-0+bvMM/ENhDI29Z8q1r4HxiDIi4G5tnBmSw4esfPQoj9q8Nik7KIyuxHkTVnnniJQf05SxpGaKDQ+4h28ynGPg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-circus@30.4.2: resolution: {integrity: sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@30.4.2: - resolution: {integrity: sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==} + jest-circus@30.5.1: + resolution: {integrity: sha512-NgliezXQ6yznqR4W5Gqw++0cZSbBZlF0NknNIAE5VmSJKWOtmWJmWnBq3TSkUOVBTPrT7FGGhVdA8DLWnxo2Sw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.5.1: + resolution: {integrity: sha512-uwNYepWgaNBCplm42fCIUZTf/tIEHIy5AYvx7eL1BrwIgyjPt+2poouR23UO2yopIP+kV8oZFHfv+l4pg/8prQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -7657,6 +7778,21 @@ packages: ts-node: optional: true + jest-config@30.5.1: + resolution: {integrity: sha512-L8PKM2X/ngG8PxfLMqglKGZjylPgw84bVPUlMY9W/o76TnLqPWrmQgsaT0HrheGdRtpGE5FbmREA0Kvb+Qx5gQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + esbuild-register: + optional: true + ts-node: + optional: true + jest-diff@30.2.0: resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -7665,16 +7801,28 @@ packages: resolution: {integrity: sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-diff@30.5.1: + resolution: {integrity: sha512-e3cNNMpv8Kh20MjjphTXs+3Vz7DQyLM1nft7KJhnh46atFhjVJRa+0Hq0beywuwsACtMQUBihQkFl8zxb7gt1Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-docblock@30.4.0: resolution: {integrity: sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-docblock@30.5.0: + resolution: {integrity: sha512-NwDqcxtoZi33RhuW+zJS/RVA3rmheQ8BnwpYZuc/Eruaz6seQb7+aoCeDZu/3X7W2XmD8DbSo9Pn72DbKsBFYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-each@30.4.1: resolution: {integrity: sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-environment-jsdom@30.4.1: - resolution: {integrity: sha512-o3nfaN4zej7qgk2X0j8Jhq/S9nAVKs2xK3QeQxeHVvpkEPxaA1yxDGydR+iVI7zPy7Cp62Aq2h3Ja46QvfWHGA==} + jest-each@30.5.1: + resolution: {integrity: sha512-S1af0TU4v1EZ/AUlkFs/sxf/5KGsbAT9kRgdyoMX/x72y7C8ZEgETE5o1TPnbKRnrbprc5FR/moYLfdRmqEjsQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-jsdom@30.5.1: + resolution: {integrity: sha512-8lzKbC/SRbQE24wr1OOJV+aYtDAuVNKBryN6YcFiCcaZZ3I7grcZY7w91BwNvGET0ubKDmomEHZFHMaF+6pAlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -7686,14 +7834,26 @@ packages: resolution: {integrity: sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-environment-node@30.5.1: + resolution: {integrity: sha512-LrPj3sPMjsQoOB3jrb8p/sa+XkSFNKo60TTsyc+EB2kxQJHgbwElpXnx1yX25fdFn5958FIObRtcLSHyV8VIAw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-haste-map@30.4.1: resolution: {integrity: sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-haste-map@30.5.1: + resolution: {integrity: sha512-VIFgt67jW480YDxKfEv9IYQKrFpYt7bOCMn3VsnjK7AK9qo7p6acpnA1DHwsVOULE3dTaYew/6JaTD/d0VDHoQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-leak-detector@30.4.1: resolution: {integrity: sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-leak-detector@30.5.1: + resolution: {integrity: sha512-gt4GT2aWgEoCNTcBe4rqS74xTIUJxi+UD9SNSu9aOk5LmTEd6fS5KSTmAKAfitCCktQHNN+upUuL6EkBfFbMDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-matcher-utils@30.2.0: resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -7702,6 +7862,10 @@ packages: resolution: {integrity: sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-matcher-utils@30.5.1: + resolution: {integrity: sha512-aroZVqwOz/wC2y6pC+obgFWKV9viaQWQTTSB6W5H55+egtUczIfXR/rxExTv92xD/ADYwpqaYfVWx1aqwKg7FA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.2.0: resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -7710,6 +7874,10 @@ packages: resolution: {integrity: sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.5.1: + resolution: {integrity: sha512-UdQlLdd9wL/Ys7xRErckqwD6wPlSZYueosSWuHc1r2ztGLwlgPvtSJq2+BPEgaEY13WLvfFbmhTj8pba0Sd1jg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.2.0: resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -7718,6 +7886,10 @@ packages: resolution: {integrity: sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.5.1: + resolution: {integrity: sha512-9fVjc3leUpGID2/by/LU4Dvdcp7PFh9LlxS3QRWK3ABm+KtvEVsG/AEGeLY3gKOZsjkBxyfwGltoAVlW7dygHg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -7747,26 +7919,46 @@ packages: resolution: {integrity: sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@30.4.2: - resolution: {integrity: sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==} + jest-regex-util@30.5.0: + resolution: {integrity: sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve-dependencies@30.5.1: + resolution: {integrity: sha512-JKpXGONDcTaunrNVn8KCl6qAnwl06jIkvv70lhq0Ze47lsPx9sH5HoeEUiXX6iFGnliHN/qpIbQ0l38wrVmXaw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-resolve@30.4.1: resolution: {integrity: sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-resolve@30.5.1: + resolution: {integrity: sha512-wprhLejRtwN6h8ZgaqC0eYjGJ1uMdGPT/+b3eFncbG4NWuuP9QL+vWwRinu9waw7hkOLcpMJGVJAMgBwsPssMQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-runner@30.4.2: resolution: {integrity: sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-runner@30.5.1: + resolution: {integrity: sha512-FPlQE4+mwnFxXmpPrSi836KV2ZzvK1g6/nPCT8o5BcoDUUNJQeHo1/Qdkoe/QeoL4M7OeJpbnGUhYKhC1VMdaQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-runtime@30.4.2: resolution: {integrity: sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-runtime@30.5.1: + resolution: {integrity: sha512-UB88+NRkK2Tw/OqV7dofYcyiUGrVZtD41k/N0xQOs9fG//57XHK7JLWG52HD1UYpUAhjK4xm6DBvFX3yWudsMA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-snapshot@30.4.1: resolution: {integrity: sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-snapshot@30.5.1: + resolution: {integrity: sha512-cNWFdSb5xuDGl8hKkAZJ3YtI/PzHpAPFV+HUXWIOG8rMhpDTLVbvAc2d2wRicoYw2wGsJGLaurJT6BLC97bLXQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-util@30.2.0: resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -7775,14 +7967,26 @@ packages: resolution: {integrity: sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-util@30.5.1: + resolution: {integrity: sha512-yKuxmNy2rSbTXw+3SIPanJo+nV4/BS1p26v44IYBFMsswSQySfMMcPHErnOncda7i9HEz0q605rIhSTBVgrZTg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-validate@30.4.1: resolution: {integrity: sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-validate@30.5.1: + resolution: {integrity: sha512-i/buJ56wTpxihE93hQYNMfdOThS87+HGvLZzZJmU4xggPcdTYQq051iwALLCHp3q+SkCGH+EFejQZz5EbBSkkg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-watcher@30.4.1: resolution: {integrity: sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-watcher@30.5.1: + resolution: {integrity: sha512-+FHJ7C+S7b3ySfhA1aFmoa6TztsnwZVv84ycPRn0tVN93np2EU4b8C/KadqA3l6igdjgLBTnUotab9ER0HLG8A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} @@ -7791,8 +7995,12 @@ packages: resolution: {integrity: sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@30.4.2: - resolution: {integrity: sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==} + jest-worker@30.5.1: + resolution: {integrity: sha512-Cbxh5v7AoLuFRmFJSM4/aHdQ68rjXvUWr716EE0Dh3I7T+T/3FgFKhOERGXHcU2Meftq9+9zxPM3TSNyI9D+HA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.5.1: + resolution: {integrity: sha512-3qrR8+ZXFnn7y0H2yjWQNkGGBLBY4zTRoTMAq9zJcgwLLtlyonfsCLviIXK9xuE2KgIyM+M36AFcoK2DgFR36w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -7819,14 +8027,18 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.15.1: - resolution: {integrity: sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==} + js-yaml@3.15.2: + resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} hasBin: true js-yaml@4.3.1: resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} hasBin: true + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + jsdom@26.1.0: resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} engines: {node: '>=18'} @@ -8160,8 +8372,8 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked@18.0.9: - resolution: {integrity: sha512-/Sa4qiiHZxf0/FQdBBowr9q4r10krCwMvpK48FUBdXdUXScDxiQGR9zCPrFgRVR5LU3iySOiIjy09ZQvADir1w==} + marked@18.0.11: + resolution: {integrity: sha512-HnslJfsZkRPBDJRHvVtAaWlZHEpSu7u8LgQuJCELjRKuWR+hpq4A7sLq3p8HaI9ypVoXDXxV34CsQJEe1+J5Aw==} engines: {node: '>= 20'} hasBin: true @@ -8617,8 +8829,8 @@ packages: resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==} engines: {node: '>= 10'} - ng-mocks@14.17.1: - resolution: {integrity: sha512-YxHOVaXoCTBlR89vXs/niq8v7ncyIgAP5MUuFG6F80LHvC7wRw+chto2hiboKboJJ6V9uynIhZzLsSIVyti9gA==} + ng-mocks@14.17.3: + resolution: {integrity: sha512-IQ6j31VlX9m2vxq08eyJ2A+EXdFvE5QkjgURHXwq0kqW/jpk0QBuaNpiKz4zSXA+rAcl4DtuYQGTGYf5CTC6ug==} peerDependencies: '@angular/common': 5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14 || 15.0.0-alpha - 15 || 16.0.0-alpha - 16 || 17.0.0-alpha - 17 || 18.0.0-alpha - 18 || 19.0.0-alpha - 19 || 20.0.0-alpha - 20 || 21.0.0-alpha - 21 || 22.0.0-alpha - 22 '@angular/core': 5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14 || 15.0.0-alpha - 15 || 16.0.0-alpha - 16 || 17.0.0-alpha - 17 || 18.0.0-alpha - 18 || 19.0.0-alpha - 19 || 20.0.0-alpha - 20 || 21.0.0-alpha - 21 || 22.0.0-alpha - 22 @@ -8743,8 +8955,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.23: - resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + nwsapi@2.2.27: + resolution: {integrity: sha512-gQPNF78qebCQ6tvVFBYrvJdBNOrYZm90ZlXgpIFm06p6qHDHq/XC4TnJftN6OMbxVE0UTBAoRgcsDeJBBooITw==} nx-electron@22.0.0: resolution: {integrity: sha512-KcuGOa4h7Ctm3K0Tu1s7lLHhaUGcV8Y9BHzqAOZB/PRZb2+d4wjMbo76LDU3fAmtH3cjY/KEPVpWY6GYTrwjDA==} @@ -9038,6 +9250,10 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -9391,6 +9607,10 @@ packages: resolution: {integrity: sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-format@30.5.1: + resolution: {integrity: sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -10035,13 +10255,14 @@ packages: shaka-player@5.2.4: resolution: {integrity: sha512-vf81av2EIcb03jRpeeZBhrPT3PMyggXnZA9k4sxGBxpr/H6v0iEL6b51T2Kwz5YNrQG/yDYoadgBW+oW40LeoA==} + engines: {node: '>=18'} shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} - sharp@0.35.3: - resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==} + sharp@0.35.4: + resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==} engines: {node: '>=20.9.0'} peerDependencies: '@types/node': '*' @@ -10238,9 +10459,6 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - stream-replace-string@2.0.0: - resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} - string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -10365,8 +10583,8 @@ packages: resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==} engines: {node: '>=16.0.0'} - synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} tailwindcss@3.4.19: @@ -10470,6 +10688,10 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + test-exclude@7.0.2: + resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} + engines: {node: '>=18'} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -10669,8 +10891,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.23.12: - resolution: {integrity: sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==} + tsx@4.23.13: + resolution: {integrity: sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==} engines: {node: '>=18.0.0'} hasBin: true @@ -10733,8 +10955,8 @@ packages: typed-assert@1.0.9: resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} - typescript-eslint@8.67.0: - resolution: {integrity: sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==} + typescript-eslint@8.69.0: + resolution: {integrity: sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -11430,6 +11652,9 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.5.4: + resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} + zone.js@0.16.2: resolution: {integrity: sha512-Eky7p2Z1Ig3NnbfodSPoARCjKBSTFMnE/ACsP1L/XJEfY4SdOFce19BsUCWVwL6K5ABZFy5J3bjcMWffX+YM3Q==} @@ -11627,54 +11852,54 @@ snapshots: '@angular-eslint/bundled-angular-compiler@21.4.0': {} - '@angular-eslint/eslint-plugin-template@21.3.1(@angular-eslint/template-parser@21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.67.0)(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin-template@21.3.1(@angular-eslint/template-parser@21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.69.0)(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.1 '@angular-eslint/template-parser': 21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@angular-eslint/utils': 21.3.1(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/utils': 21.3.1(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) aria-query: 5.3.2 axobject-query: 4.1.0 eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 - '@angular-eslint/eslint-plugin-template@21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.66.0)(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin-template@21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.66.0)(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.4.0 '@angular-eslint/template-parser': 21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@angular-eslint/utils': 21.4.0(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/utils': 21.4.0(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) aria-query: 5.3.2 axobject-query: 4.1.0 eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 - '@angular-eslint/eslint-plugin@21.3.1(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin@21.3.1(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.1 - '@angular-eslint/utils': 21.3.1(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/utils': 21.3.1(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/eslint-plugin@21.4.0(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin@21.4.0(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.4.0 - '@angular-eslint/utils': 21.4.0(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/utils': 21.4.0(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/schematics@21.3.1(@angular-eslint/template-parser@21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(@typescript-eslint/types@8.67.0)(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@angular-eslint/schematics@21.3.1(@angular-eslint/template-parser@21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(@typescript-eslint/types@8.69.0)(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@angular-devkit/core': 21.2.19(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.21(chokidar@5.0.0) - '@angular-eslint/eslint-plugin': 21.3.1(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@angular-eslint/eslint-plugin-template': 21.3.1(@angular-eslint/template-parser@21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.67.0)(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/eslint-plugin': 21.3.1(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/eslint-plugin-template': 21.3.1(@angular-eslint/template-parser@21.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.69.0)(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@angular/cli': 21.2.21(@types/node@20.19.9)(chokidar@5.0.0) ignore: 7.0.5 semver: 7.7.4 @@ -11687,12 +11912,12 @@ snapshots: - eslint - typescript - '@angular-eslint/schematics@21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(@typescript-eslint/types@8.66.0)(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@angular-eslint/schematics@21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(@typescript-eslint/types@8.66.0)(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@angular-devkit/core': 21.2.19(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.21(chokidar@5.0.0) - '@angular-eslint/eslint-plugin': 21.4.0(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@angular-eslint/eslint-plugin-template': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.66.0)(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/eslint-plugin': 21.4.0(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/eslint-plugin-template': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.66.0)(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@angular/cli': 21.2.21(@types/node@20.19.9)(chokidar@5.0.0) ignore: 7.0.5 semver: 7.7.4 @@ -11719,17 +11944,17 @@ snapshots: eslint-scope: 9.1.2 typescript: 5.9.3 - '@angular-eslint/utils@21.3.1(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@angular-eslint/utils@21.3.1(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.1 - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 - '@angular-eslint/utils@21.4.0(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@angular-eslint/utils@21.4.0(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.4.0 - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 @@ -11738,7 +11963,7 @@ snapshots: '@angular/core': 21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2) tslib: 2.8.1 - '@angular/build@21.2.19(@angular/compiler-cli@21.2.19(@angular/compiler@21.2.19)(typescript@5.9.3))(@angular/compiler@21.2.19)(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.19(@angular/animations@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/service-worker@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(chokidar@5.0.0)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(postcss@8.5.26)(sass-embedded@1.100.0)(tailwindcss@3.4.19(tsx@4.23.12)(yaml@2.9.0))(terser@5.49.2)(tslib@2.8.1)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': + '@angular/build@21.2.19(@angular/compiler-cli@21.2.19(@angular/compiler@21.2.19)(typescript@5.9.3))(@angular/compiler@21.2.19)(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.19(@angular/animations@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/service-worker@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(chokidar@5.0.0)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(postcss@8.5.26)(sass-embedded@1.100.0)(tailwindcss@3.4.19(tsx@4.23.13)(yaml@2.9.0))(terser@5.49.2)(tslib@2.8.1)(tsx@4.23.13)(typescript@5.9.3)(yaml@2.9.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.19(chokidar@5.0.0) @@ -11748,7 +11973,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@20.19.9) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.6(patch_hash=215b6585a9c92fa68c096d500f4676983200307b1e64c1321e20ccbd50bbc8f3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(sass-embedded@1.100.0)(sass@1.97.3)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.6(patch_hash=215b6585a9c92fa68c096d500f4676983200307b1e64c1321e20ccbd50bbc8f3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(sass-embedded@1.100.0)(sass@1.97.3)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0)) beasties: 0.4.1 browserslist: 4.28.8 esbuild: 0.28.1 @@ -11769,7 +11994,7 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.29.0 - vite: 7.3.6(patch_hash=215b6585a9c92fa68c096d500f4676983200307b1e64c1321e20ccbd50bbc8f3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(sass-embedded@1.100.0)(sass@1.97.3)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0) + vite: 7.3.6(patch_hash=215b6585a9c92fa68c096d500f4676983200307b1e64c1321e20ccbd50bbc8f3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(sass-embedded@1.100.0)(sass@1.97.3)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2) @@ -11778,7 +12003,7 @@ snapshots: less: 4.5.1 lmdb: 3.5.1 postcss: 8.5.26 - tailwindcss: 3.4.19(tsx@4.23.12)(yaml@2.9.0) + tailwindcss: 3.4.19(tsx@4.23.13)(yaml@2.9.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -11981,7 +12206,7 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 js-yaml: 4.3.1 - picomatch: 4.0.5 + picomatch: 4.0.7 retext-smartypants: 6.2.0 shiki: 4.4.3 smol-toml: 1.6.1 @@ -12016,13 +12241,13 @@ snapshots: github-slugger: 2.0.0 satteri: 0.10.5 - '@astrojs/mdx@7.0.7(@astrojs/markdown-satteri@0.3.7)(astro@7.2.4(@astrojs/markdown-remark@7.2.4)(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0))': + '@astrojs/mdx@7.0.7(@astrojs/markdown-satteri@0.3.7)(astro@7.2.4(@astrojs/markdown-remark@7.2.4)(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0))': dependencies: '@astrojs/internal-helpers': 0.10.4 '@astrojs/markdown-remark': 7.2.4 '@mdx-js/mdx': 3.1.1 acorn: 8.18.0 - astro: 7.2.4(@astrojs/markdown-remark@7.2.4)(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0) + astro: 7.2.4(@astrojs/markdown-remark@7.2.4)(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0) es-module-lexer: 2.3.1 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -12042,11 +12267,10 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/sitemap@3.7.3': + '@astrojs/sitemap@3.7.4': dependencies: sitemap: 9.0.1 - stream-replace-string: 2.0.0 - zod: 4.3.6 + zod: 4.5.4 '@astrojs/telemetry@3.3.3': dependencies: @@ -13368,15 +13592,15 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.6': + '@eslint/eslintrc@3.3.7': dependencies: - ajv: 6.14.0 + ajv: 6.15.0 debug: 4.4.3(supports-color@7.2.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.3.1 + js-yaml: 4.3.2 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -13391,7 +13615,7 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@faker-js/faker@10.5.0': {} + '@faker-js/faker@10.6.0': {} '@fontsource/crimson-pro@5.3.0': {} @@ -13428,108 +13652,108 @@ snapshots: '@img/colour@1.1.0': {} - '@img/sharp-darwin-arm64@0.35.3': + '@img/sharp-darwin-arm64@0.35.4': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.3.2 + '@img/sharp-libvips-darwin-arm64': 1.3.3 optional: true - '@img/sharp-darwin-x64@0.35.3': + '@img/sharp-darwin-x64@0.35.4': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.3.2 + '@img/sharp-libvips-darwin-x64': 1.3.3 optional: true - '@img/sharp-freebsd-wasm32@0.35.3': + '@img/sharp-freebsd-wasm32@0.35.4': dependencies: - '@img/sharp-wasm32': 0.35.3 + '@img/sharp-wasm32': 0.35.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.3.2': + '@img/sharp-libvips-darwin-arm64@1.3.3': optional: true - '@img/sharp-libvips-darwin-x64@1.3.2': + '@img/sharp-libvips-darwin-x64@1.3.3': optional: true - '@img/sharp-libvips-linux-arm64@1.3.2': + '@img/sharp-libvips-linux-arm64@1.3.3': optional: true - '@img/sharp-libvips-linux-arm@1.3.2': + '@img/sharp-libvips-linux-arm@1.3.3': optional: true - '@img/sharp-libvips-linux-ppc64@1.3.2': + '@img/sharp-libvips-linux-ppc64@1.3.3': optional: true - '@img/sharp-libvips-linux-riscv64@1.3.2': + '@img/sharp-libvips-linux-riscv64@1.3.3': optional: true - '@img/sharp-libvips-linux-s390x@1.3.2': + '@img/sharp-libvips-linux-s390x@1.3.3': optional: true - '@img/sharp-libvips-linux-x64@1.3.2': + '@img/sharp-libvips-linux-x64@1.3.3': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.3.2': + '@img/sharp-libvips-linuxmusl-arm64@1.3.3': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.3.2': + '@img/sharp-libvips-linuxmusl-x64@1.3.3': optional: true - '@img/sharp-linux-arm64@0.35.3': + '@img/sharp-linux-arm64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.3.2 + '@img/sharp-libvips-linux-arm64': 1.3.3 optional: true - '@img/sharp-linux-arm@0.35.3': + '@img/sharp-linux-arm@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.3.2 + '@img/sharp-libvips-linux-arm': 1.3.3 optional: true - '@img/sharp-linux-ppc64@0.35.3': + '@img/sharp-linux-ppc64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.3.2 + '@img/sharp-libvips-linux-ppc64': 1.3.3 optional: true - '@img/sharp-linux-riscv64@0.35.3': + '@img/sharp-linux-riscv64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.3.2 + '@img/sharp-libvips-linux-riscv64': 1.3.3 optional: true - '@img/sharp-linux-s390x@0.35.3': + '@img/sharp-linux-s390x@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.3.2 + '@img/sharp-libvips-linux-s390x': 1.3.3 optional: true - '@img/sharp-linux-x64@0.35.3': + '@img/sharp-linux-x64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.3.2 + '@img/sharp-libvips-linux-x64': 1.3.3 optional: true - '@img/sharp-linuxmusl-arm64@0.35.3': + '@img/sharp-linuxmusl-arm64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 optional: true - '@img/sharp-linuxmusl-x64@0.35.3': + '@img/sharp-linuxmusl-x64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.3.2 + '@img/sharp-libvips-linuxmusl-x64': 1.3.3 optional: true - '@img/sharp-wasm32@0.35.3': + '@img/sharp-wasm32@0.35.4': dependencies: '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-webcontainers-wasm32@0.35.3': + '@img/sharp-webcontainers-wasm32@0.35.4': dependencies: - '@img/sharp-wasm32': 0.35.3 + '@img/sharp-wasm32': 0.35.4 optional: true - '@img/sharp-win32-arm64@0.35.3': + '@img/sharp-win32-arm64@0.35.4': optional: true - '@img/sharp-win32-ia32@0.35.3': + '@img/sharp-win32-ia32@0.35.4': optional: true - '@img/sharp-win32-x64@0.35.3': + '@img/sharp-win32-x64@0.35.4': optional: true '@inquirer/ansi@1.0.2': {} @@ -13675,7 +13899,7 @@ snapshots: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 - js-yaml: 3.15.1 + js-yaml: 3.15.2 resolve-from: 5.0.0 '@istanbuljs/schema@0.1.6': {} @@ -13689,35 +13913,44 @@ snapshots: jest-util: 30.4.1 slash: 3.0.0 - '@jest/core@30.4.2(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3))': + '@jest/console@30.5.1': dependencies: - '@jest/console': 30.4.1 - '@jest/pattern': 30.4.0 - '@jest/reporters': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 + '@jest/types': 30.5.1 + '@types/node': 20.19.9 + chalk: 4.1.2 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + slash: 3.0.0 + + '@jest/core@30.5.1(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3))': + dependencies: + '@jest/console': 30.5.1 + '@jest/pattern': 30.5.0 + '@jest/reporters': 30.5.1 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 '@types/node': 20.19.9 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 4.3.1 + ci-info: 4.4.0 exit-x: 0.2.2 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-changed-files: 30.4.1 - jest-config: 30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) - jest-haste-map: 30.4.1 - jest-message-util: 30.4.1 - jest-regex-util: 30.4.0 - jest-resolve: 30.4.1 - jest-resolve-dependencies: 30.4.2 - jest-runner: 30.4.2 - jest-runtime: 30.4.2 - jest-snapshot: 30.4.1 - jest-util: 30.4.1 - jest-validate: 30.4.1 - jest-watcher: 30.4.1 - pretty-format: 30.4.1 + jest-changed-files: 30.5.1 + jest-config: 30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) + jest-haste-map: 30.5.1 + jest-message-util: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-resolve-dependencies: 30.5.1 + jest-runner: 30.5.1 + jest-runtime: 30.5.1 + jest-snapshot: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 + jest-watcher: 30.5.1 + pretty-format: 30.5.1 slash: 3.0.0 transitivePeerDependencies: - babel-plugin-macros @@ -13729,6 +13962,8 @@ snapshots: '@jest/diff-sequences@30.4.0': {} + '@jest/diff-sequences@30.5.0': {} + '@jest/environment-jsdom-abstract@30.2.0(jsdom@26.1.0)': dependencies: '@jest/environment': 30.2.0 @@ -13740,15 +13975,15 @@ snapshots: jest-util: 30.2.0 jsdom: 26.1.0 - '@jest/environment-jsdom-abstract@30.4.1(jsdom@26.1.0)': + '@jest/environment-jsdom-abstract@30.5.1(@types/jsdom@21.1.7)(jsdom@26.1.0)': dependencies: - '@jest/environment': 30.4.1 - '@jest/fake-timers': 30.4.1 - '@jest/types': 30.4.1 + '@jest/environment': 30.5.1 + '@jest/fake-timers': 30.5.1 + '@jest/types': 30.5.1 '@types/jsdom': 21.1.7 '@types/node': 20.19.9 - jest-mock: 30.4.1 - jest-util: 30.4.1 + jest-mock: 30.5.1 + jest-util: 30.5.1 jsdom: 26.1.0 '@jest/environment@30.2.0': @@ -13765,6 +14000,13 @@ snapshots: '@types/node': 20.19.9 jest-mock: 30.4.1 + '@jest/environment@30.5.1': + dependencies: + '@jest/fake-timers': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 20.19.9 + jest-mock: 30.5.1 + '@jest/expect-utils@30.2.0': dependencies: '@jest/get-type': 30.1.0 @@ -13773,6 +14015,10 @@ snapshots: dependencies: '@jest/get-type': 30.1.0 + '@jest/expect-utils@30.5.1': + dependencies: + '@jest/get-type': 30.5.0 + '@jest/expect@30.4.1': dependencies: expect: 30.4.1 @@ -13780,6 +14026,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/expect@30.5.1': + dependencies: + expect: 30.5.1 + jest-snapshot: 30.5.1 + transitivePeerDependencies: + - supports-color + '@jest/fake-timers@30.2.0': dependencies: '@jest/types': 30.2.0 @@ -13798,8 +14051,19 @@ snapshots: jest-mock: 30.4.1 jest-util: 30.4.1 + '@jest/fake-timers@30.5.1': + dependencies: + '@jest/types': 30.5.1 + '@sinonjs/fake-timers': 15.4.0 + '@types/node': 20.19.9 + jest-message-util: 30.5.1 + jest-mock: 30.5.1 + jest-util: 30.5.1 + '@jest/get-type@30.1.0': {} + '@jest/get-type@30.5.0': {} + '@jest/globals@30.4.1': dependencies: '@jest/environment': 30.4.1 @@ -13809,6 +14073,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/globals@30.5.1': + dependencies: + '@jest/environment': 30.5.1 + '@jest/expect': 30.5.1 + '@jest/types': 30.5.1 + jest-mock: 30.5.1 + transitivePeerDependencies: + - supports-color + '@jest/pattern@30.0.1': dependencies: '@types/node': 20.19.9 @@ -13819,6 +14092,11 @@ snapshots: '@types/node': 20.19.9 jest-regex-util: 30.4.0 + '@jest/pattern@30.5.0': + dependencies: + '@types/node': 20.19.9 + jest-regex-util: 30.5.0 + '@jest/reporters@30.4.1': dependencies: '@bcoe/v8-coverage': 0.2.3 @@ -13847,13 +14125,45 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/reporters@30.5.1': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.5.1 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 20.19.9 + chalk: 4.1.2 + collect-v8-coverage: 1.0.3 + exit-x: 0.2.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + jest-worker: 30.5.1 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + '@jest/schemas@30.0.5': dependencies: '@sinclair/typebox': 0.34.46 '@jest/schemas@30.4.1': dependencies: - '@sinclair/typebox': 0.34.46 + '@sinclair/typebox': 0.34.52 + + '@jest/schemas@30.5.0': + dependencies: + '@sinclair/typebox': 0.34.52 '@jest/snapshot-utils@30.4.1': dependencies: @@ -13862,12 +14172,26 @@ snapshots: graceful-fs: 4.2.11 natural-compare: 1.4.0 + '@jest/snapshot-utils@30.5.1': + dependencies: + '@jest/types': 30.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + '@jest/source-map@30.0.1': dependencies: '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 + '@jest/source-map@30.5.0': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + callsites: 3.1.0 + convert-source-map: 2.0.0 + graceful-fs: 4.2.11 + '@jest/test-result@30.4.1': dependencies: '@jest/console': 30.4.1 @@ -13875,6 +14199,13 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.3 + '@jest/test-result@30.5.1': + dependencies: + '@jest/console': 30.5.1 + '@jest/types': 30.5.1 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.3 + '@jest/test-sequencer@30.4.1': dependencies: '@jest/test-result': 30.4.1 @@ -13882,6 +14213,13 @@ snapshots: jest-haste-map: 30.4.1 slash: 3.0.0 + '@jest/test-sequencer@30.5.1': + dependencies: + '@jest/test-result': 30.5.1 + graceful-fs: 4.2.11 + jest-haste-map: 30.5.1 + slash: 3.0.0 + '@jest/transform@30.4.1': dependencies: '@babel/core': 7.29.7 @@ -13901,6 +14239,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/transform@30.5.1': + dependencies: + '@babel/core': 7.29.7 + '@jest/types': 30.5.1 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 8.0.0 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.5.1 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + '@jest/types@30.2.0': dependencies: '@jest/pattern': 30.0.1 @@ -13921,6 +14278,16 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 + '@jest/types@30.5.1': + dependencies: + '@jest/pattern': 30.5.0 + '@jest/schemas': 30.5.0 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.19.9 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -14205,7 +14572,7 @@ snapshots: - bufferutil - utf-8-validate - '@module-federation/enhanced@2.8.2(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26))': + '@module-federation/enhanced@2.8.2(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26))': dependencies: '@module-federation/bridge-react-webpack-plugin': 2.8.2 '@module-federation/cli': 2.8.2(typescript@5.9.3) @@ -14222,7 +14589,7 @@ snapshots: tapable: 2.3.0 optionalDependencies: typescript: 5.9.3 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -14251,16 +14618,16 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/node@2.7.49(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26))': + '@module-federation/node@2.7.49(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26))': dependencies: - '@module-federation/enhanced': 2.8.2(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + '@module-federation/enhanced': 2.8.2(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) '@module-federation/runtime': 2.8.2 '@module-federation/sdk': 2.8.2 encoding: 0.1.13 node-fetch: 2.7.0(encoding@0.1.13) tapable: 2.3.0 optionalDependencies: - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -14478,13 +14845,13 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@ngrx/eslint-plugin@21.1.1(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript-eslint@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(typescript@5.9.3)': + '@ngrx/eslint-plugin@21.1.1(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript-eslint@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) strip-json-comments: 3.1.1 typescript: 5.9.3 - typescript-eslint: 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + typescript-eslint: 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@ngrx/router-store@21.1.1(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/router@21.2.19(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.19(@angular/animations@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2))(@ngrx/store@21.1.1(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(rxjs@7.8.2)': dependencies: @@ -14623,7 +14990,7 @@ snapshots: '@npmcli/fs@5.0.0': dependencies: - semver: 7.8.5 + semver: 7.7.4 '@npmcli/git@7.0.2': dependencies: @@ -14633,7 +15000,7 @@ snapshots: lru-cache: 11.5.2 npm-pick-manifest: 11.0.3 proc-log: 6.1.0 - semver: 7.8.5 + semver: 7.7.4 which: 6.0.1 '@npmcli/installed-package-contents@4.0.0': @@ -14650,7 +15017,7 @@ snapshots: hosted-git-info: 9.0.3 json-parse-even-better-errors: 5.0.0 proc-log: 6.1.0 - semver: 7.8.5 + semver: 7.7.4 spdx-expression-parse: 4.0.0 '@npmcli/promise-spawn@9.0.1': @@ -14667,18 +15034,18 @@ snapshots: node-gyp: 12.4.0 proc-log: 6.1.0 - '@nx/angular@22.7.8(a7389d00e46db7588c00ae81852ff238)': + '@nx/angular@22.7.8(9da22baaa942ea628a4531574667d706)': dependencies: '@angular-devkit/core': 21.2.19(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.21(chokidar@5.0.0) - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/eslint': 22.7.8(5d8e116ecf28960b728f05bee433010d) - '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/module-federation': 22.7.8(3fcd68d5bd6850ba8eaece9f0c7a0deb) - '@nx/rspack': 22.7.8(8d884c30e57452b2377686fef3ba1e96) - '@nx/web': 22.7.8(ddd6b5dbda84baddadf906abc88c5890) - '@nx/webpack': 22.7.8(@babel/traverse@7.29.8)(@rspack/core@1.6.8(@swc/helpers@0.5.23))(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(typescript@5.9.3) - '@nx/workspace': 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/eslint': 22.7.8(c6268304c3e993c057e90202eca80e3c) + '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/module-federation': 22.7.8(c3c8e52b0839abcbeddb0667e71eb5e2) + '@nx/rspack': 22.7.8(3579752277ba60d7d0ceb886096052bc) + '@nx/web': 22.7.8(e36557eae963c5bd5b3bad2c1c9ad54a) + '@nx/webpack': 22.7.8(@babel/traverse@7.29.8)(@rspack/core@1.6.8(@swc/helpers@0.5.23))(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(typescript@5.9.3) + '@nx/workspace': 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) '@schematics/angular': 21.2.19(chokidar@5.0.0) '@typescript-eslint/type-utils': 8.66.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) @@ -14691,7 +15058,7 @@ snapshots: tslib: 2.8.1 webpack-merge: 5.10.0 optionalDependencies: - '@angular/build': 21.2.19(@angular/compiler-cli@21.2.19(@angular/compiler@21.2.19)(typescript@5.9.3))(@angular/compiler@21.2.19)(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.19(@angular/animations@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/service-worker@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(chokidar@5.0.0)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(postcss@8.5.26)(sass-embedded@1.100.0)(tailwindcss@3.4.19(tsx@4.23.12)(yaml@2.9.0))(terser@5.49.2)(tslib@2.8.1)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) + '@angular/build': 21.2.19(@angular/compiler-cli@21.2.19(@angular/compiler@21.2.19)(typescript@5.9.3))(@angular/compiler@21.2.19)(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.19(@angular/animations@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/service-worker@21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(chokidar@5.0.0)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(postcss@8.5.26)(sass-embedded@1.100.0)(tailwindcss@3.4.19(tsx@4.23.13)(yaml@2.9.0))(terser@5.49.2)(tslib@2.8.1)(tsx@4.23.13)(typescript@5.9.3)(yaml@2.9.0) transitivePeerDependencies: - '@babel/traverse' - '@minify-html/node' @@ -14734,21 +15101,21 @@ snapshots: - webpack-cli - webpack-hot-middleware - '@nx/devkit@22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))': + '@nx/devkit@22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))': dependencies: '@zkochan/js-yaml': 0.0.7 ejs: 5.0.1 enquirer: 2.3.6 minimatch: 10.2.5 - nx: 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)) + nx: 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)) semver: 7.8.5 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/esbuild@22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))': + '@nx/esbuild@22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))': dependencies: - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) picocolors: 1.1.1 tinyglobby: 0.2.17 tsconfig-paths: 4.2.0 @@ -14763,14 +15130,14 @@ snapshots: - supports-color - verdaccio - '@nx/eslint-plugin@22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(@typescript-eslint/parser@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@1.21.7)))(eslint@9.39.2(jiti@1.21.7))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(typescript@5.9.3)': + '@nx/eslint-plugin@22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(@typescript-eslint/parser@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@1.21.7)))(eslint@9.39.2(jiti@1.21.7))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(typescript@5.9.3)': dependencies: - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) - '@typescript-eslint/parser': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@typescript-eslint/type-utils': 8.66.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) chalk: 4.1.2 confusing-browser-globals: 1.0.11 globals: 17.9.0 @@ -14789,16 +15156,16 @@ snapshots: - typescript - verdaccio - '@nx/eslint@22.7.8(5d8e116ecf28960b728f05bee433010d)': + '@nx/eslint@22.7.8(c6268304c3e993c057e90202eca80e3c)': dependencies: - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) eslint: 9.39.2(jiti@1.21.7) semver: 7.8.5 tslib: 2.8.1 typescript: 5.9.3 optionalDependencies: - '@nx/jest': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3))(typescript@5.9.3) + '@nx/jest': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3))(typescript@5.9.3) '@zkochan/js-yaml': 0.0.7 transitivePeerDependencies: - '@babel/traverse' @@ -14808,17 +15175,17 @@ snapshots: - supports-color - verdaccio - '@nx/jest@22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3))(typescript@5.9.3)': + '@nx/jest@22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@jest/reporters': 30.4.1 '@jest/test-result': 30.4.1 - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) identity-obj-proxy: 3.0.0 - jest-config: 30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) + jest-config: 30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) jest-resolve: 30.4.1 - jest-util: 30.4.1 + jest-util: 30.5.1 minimatch: 10.2.5 picocolors: 1.1.1 resolve.exports: 2.0.3 @@ -14839,7 +15206,7 @@ snapshots: - typescript - verdaccio - '@nx/js@22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))': + '@nx/js@22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7) @@ -14848,8 +15215,8 @@ snapshots: '@babel/preset-env': 7.29.7(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) '@babel/runtime': 7.29.7 - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/workspace': 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/workspace': 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)) '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.29.7) babel-plugin-macros: 3.1.0 @@ -14874,20 +15241,20 @@ snapshots: - nx - supports-color - '@nx/module-federation@22.7.8(3fcd68d5bd6850ba8eaece9f0c7a0deb)': + '@nx/module-federation@22.7.8(c3c8e52b0839abcbeddb0667e71eb5e2)': dependencies: - '@module-federation/enhanced': 2.8.2(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - '@module-federation/node': 2.7.49(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + '@module-federation/enhanced': 2.8.2(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + '@module-federation/node': 2.7.49(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) '@module-federation/sdk': 2.8.2 - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/web': 22.7.8(ddd6b5dbda84baddadf906abc88c5890) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/web': 22.7.8(e36557eae963c5bd5b3bad2c1c9ad54a) '@rspack/core': 1.6.8(@swc/helpers@0.5.23) express: 4.22.2 http-proxy-middleware: 3.0.7 picocolors: 1.1.1 tslib: 2.8.1 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) transitivePeerDependencies: - '@babel/traverse' - '@minify-html/node' @@ -14950,11 +15317,11 @@ snapshots: '@nx/nx-win32-x64-msvc@22.7.8': optional: true - '@nx/playwright@22.7.8(fd8f618a9324a70c524ebeba2216a705)': + '@nx/playwright@22.7.8(b0b327483e86e3b4312dfd51a3eacfc2)': dependencies: - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/eslint': 22.7.8(5d8e116ecf28960b728f05bee433010d) - '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/eslint': 22.7.8(c6268304c3e993c057e90202eca80e3c) + '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) minimatch: 10.2.5 tslib: 2.8.1 optionalDependencies: @@ -14970,40 +15337,40 @@ snapshots: - supports-color - verdaccio - '@nx/rspack@22.7.8(8d884c30e57452b2377686fef3ba1e96)': + '@nx/rspack@22.7.8(3579752277ba60d7d0ceb886096052bc)': dependencies: - '@module-federation/enhanced': 2.8.2(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - '@module-federation/node': 2.7.49(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/module-federation': 22.7.8(3fcd68d5bd6850ba8eaece9f0c7a0deb) - '@nx/web': 22.7.8(ddd6b5dbda84baddadf906abc88c5890) + '@module-federation/enhanced': 2.8.2(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + '@module-federation/node': 2.7.49(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/module-federation': 22.7.8(c3c8e52b0839abcbeddb0667e71eb5e2) + '@nx/web': 22.7.8(e36557eae963c5bd5b3bad2c1c9ad54a) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) '@rspack/core': 1.6.8(@swc/helpers@0.5.23) - '@rspack/dev-server': 1.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.23))(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + '@rspack/dev-server': 1.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.23))(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) '@rspack/plugin-react-refresh': 1.6.2(react-refresh@0.18.0) autoprefixer: 10.5.4(postcss@8.5.26) browserslist: 4.28.8 - css-loader: 6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.23))(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + css-loader: 6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.23))(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) enquirer: 2.3.6 express: 4.22.2 http-proxy-middleware: 3.0.7 - less-loader: 12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.23))(less@4.5.1)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - license-webpack-plugin: 4.0.2(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + less-loader: 12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.23))(less@4.5.1)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + license-webpack-plugin: 4.0.2(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) loader-utils: 2.0.4 parse5: 4.0.0 picocolors: 1.1.1 postcss: 8.5.26 postcss-import: 14.1.0(postcss@8.5.26) - postcss-loader: 8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.23))(postcss@8.5.26)(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + postcss-loader: 8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.23))(postcss@8.5.26)(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) sass: 1.102.0 sass-embedded: 1.100.0 - sass-loader: 16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.23))(sass-embedded@1.100.0)(sass@1.102.0)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - source-map-loader: 5.0.0(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - style-loader: 3.3.4(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + sass-loader: 16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.23))(sass-embedded@1.100.0)(sass@1.102.0)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + source-map-loader: 5.0.0(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + style-loader: 3.3.4(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) ts-checker-rspack-plugin: 1.6.0(@rspack/core@1.6.8(@swc/helpers@0.5.23))(typescript@5.9.3) tslib: 2.8.1 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) webpack-node-externals: 3.0.0 transitivePeerDependencies: - '@babel/traverse' @@ -15041,19 +15408,19 @@ snapshots: - webpack-cli - webpack-hot-middleware - '@nx/web@22.7.8(ddd6b5dbda84baddadf906abc88c5890)': + '@nx/web@22.7.8(e36557eae963c5bd5b3bad2c1c9ad54a)': dependencies: - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) detect-port: 2.1.0 http-server: 14.1.1 picocolors: 1.1.1 tslib: 2.8.1 optionalDependencies: - '@nx/eslint': 22.7.8(5d8e116ecf28960b728f05bee433010d) - '@nx/jest': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3))(typescript@5.9.3) - '@nx/playwright': 22.7.8(fd8f618a9324a70c524ebeba2216a705) - '@nx/webpack': 22.7.8(@babel/traverse@7.29.8)(@rspack/core@1.6.8(@swc/helpers@0.5.23))(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(typescript@5.9.3) + '@nx/eslint': 22.7.8(c6268304c3e993c057e90202eca80e3c) + '@nx/jest': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3))(typescript@5.9.3) + '@nx/playwright': 22.7.8(b0b327483e86e3b4312dfd51a3eacfc2) + '@nx/webpack': 22.7.8(@babel/traverse@7.29.8)(@rspack/core@1.6.8(@swc/helpers@0.5.23))(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(typescript@5.9.3) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -15063,44 +15430,44 @@ snapshots: - supports-color - verdaccio - '@nx/webpack@22.7.8(@babel/traverse@7.29.8)(@rspack/core@1.6.8(@swc/helpers@0.5.23))(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(typescript@5.9.3)': + '@nx/webpack@22.7.8(@babel/traverse@7.29.8)(@rspack/core@1.6.8(@swc/helpers@0.5.23))(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(typescript@5.9.3)': dependencies: '@babel/core': 7.29.7 - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/js': 22.7.8(@babel/traverse@7.29.8)(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) ajv: 8.18.0 autoprefixer: 10.5.4(postcss@8.5.26) - babel-loader: 9.2.1(@babel/core@7.29.7)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + babel-loader: 9.2.1(@babel/core@7.29.7)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) browserslist: 4.28.8 - copy-webpack-plugin: 14.0.0(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - css-loader: 6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.23))(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - css-minimizer-webpack-plugin: 8.0.0(esbuild@0.28.2)(lightningcss@1.33.0)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + copy-webpack-plugin: 14.0.0(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + css-loader: 6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.23))(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + css-minimizer-webpack-plugin: 8.0.0(esbuild@0.28.2)(lightningcss@1.33.0)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) less: 4.5.1 - less-loader: 12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.23))(less@4.5.1)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - license-webpack-plugin: 4.0.2(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + less-loader: 12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.23))(less@4.5.1)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + license-webpack-plugin: 4.0.2(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) loader-utils: 2.0.4 - mini-css-extract-plugin: 2.4.7(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + mini-css-extract-plugin: 2.4.7(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) parse5: 4.0.0 picocolors: 1.1.1 postcss: 8.5.26 postcss-import: 14.1.0(postcss@8.5.26) - postcss-loader: 8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.23))(postcss@8.5.26)(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + postcss-loader: 8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.23))(postcss@8.5.26)(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) rxjs: 7.8.2 sass: 1.102.0 sass-embedded: 1.100.0 - sass-loader: 16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.23))(sass-embedded@1.100.0)(sass@1.102.0)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - source-map-loader: 5.0.0(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - style-loader: 3.3.4(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - terser-webpack-plugin: 5.6.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) - ts-loader: 9.6.2(loader-utils@2.0.4)(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + sass-loader: 16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.23))(sass-embedded@1.100.0)(sass@1.102.0)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + source-map-loader: 5.0.0(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + style-loader: 3.3.4(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + terser-webpack-plugin: 5.6.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + ts-loader: 9.6.2(loader-utils@2.0.4)(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) tsconfig-paths-webpack-plugin: 4.2.0 tslib: 2.8.1 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) - webpack-dev-server: 5.2.6(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack-dev-server: 5.2.6(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) webpack-node-externals: 3.0.0 - webpack-subresource-integrity: 5.1.0(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + webpack-subresource-integrity: 5.1.0(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) transitivePeerDependencies: - '@babel/traverse' - '@minify-html/node' @@ -15128,13 +15495,13 @@ snapshots: - verdaccio - webpack-cli - '@nx/workspace@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))': + '@nx/workspace@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))': dependencies: - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) '@zkochan/js-yaml': 0.0.7 chalk: 4.1.2 enquirer: 2.3.6 - nx: 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)) + nx: 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)) picomatch: 4.0.4 semver: 7.8.5 tslib: 2.8.1 @@ -15255,7 +15622,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.5 + picomatch: 4.0.4 optionalDependencies: '@parcel/watcher-android-arm64': 2.6.0 '@parcel/watcher-darwin-arm64': 2.6.0 @@ -15269,7 +15636,6 @@ snapshots: '@parcel/watcher-linux-x64-musl': 2.6.0 '@parcel/watcher-win32-arm64': 2.6.0 '@parcel/watcher-win32-x64': 2.6.0 - optional: true '@peculiar/asn1-cms@2.8.0': dependencies: @@ -15386,7 +15752,7 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.9': {} + '@pkgr/core@0.3.6': {} '@playwright/test@1.62.1': dependencies: @@ -15613,7 +15979,7 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.23 - '@rspack/dev-server@1.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.23))(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26))': + '@rspack/dev-server@1.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.23))(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26))': dependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.23) '@types/bonjour': 3.5.13 @@ -15642,7 +16008,7 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + webpack-dev-middleware: 7.4.5(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) ws: 8.21.3 transitivePeerDependencies: - bufferutil @@ -15752,6 +16118,8 @@ snapshots: '@sinclair/typebox@0.34.46': {} + '@sinclair/typebox@0.34.52': {} + '@sindresorhus/is@4.6.0': {} '@sindresorhus/merge-streams@2.3.0': {} @@ -15770,17 +16138,17 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@swc-node/core@1.15.0(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)': + '@swc-node/core@1.15.0(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)': dependencies: - '@swc/core': 1.15.47(@swc/helpers@0.5.23) + '@swc/core': 1.16.1(@swc/helpers@0.5.23) '@swc/types': 0.1.28 - '@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3)': + '@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3)': dependencies: '@node-rs/xxhash': 1.7.6 - '@swc-node/core': 1.15.0(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28) + '@swc-node/core': 1.15.0(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28) '@swc-node/sourcemap-support': 0.6.1 - '@swc/core': 1.15.47(@swc/helpers@0.5.23) + '@swc/core': 1.16.1(@swc/helpers@0.5.23) colorette: 2.0.20 debug: 4.4.3(supports-color@7.2.0) fast-json-stable-stringify: 2.1.0 @@ -15799,59 +16167,59 @@ snapshots: source-map-support: 0.5.21 tslib: 2.8.1 - '@swc/core-darwin-arm64@1.15.47': + '@swc/core-darwin-arm64@1.16.1': optional: true - '@swc/core-darwin-x64@1.15.47': + '@swc/core-darwin-x64@1.16.1': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.47': + '@swc/core-linux-arm-gnueabihf@1.16.1': optional: true - '@swc/core-linux-arm64-gnu@1.15.47': + '@swc/core-linux-arm64-gnu@1.16.1': optional: true - '@swc/core-linux-arm64-musl@1.15.47': + '@swc/core-linux-arm64-musl@1.16.1': optional: true - '@swc/core-linux-ppc64-gnu@1.15.47': + '@swc/core-linux-ppc64-gnu@1.16.1': optional: true - '@swc/core-linux-s390x-gnu@1.15.47': + '@swc/core-linux-s390x-gnu@1.16.1': optional: true - '@swc/core-linux-x64-gnu@1.15.47': + '@swc/core-linux-x64-gnu@1.16.1': optional: true - '@swc/core-linux-x64-musl@1.15.47': + '@swc/core-linux-x64-musl@1.16.1': optional: true - '@swc/core-win32-arm64-msvc@1.15.47': + '@swc/core-win32-arm64-msvc@1.16.1': optional: true - '@swc/core-win32-ia32-msvc@1.15.47': + '@swc/core-win32-ia32-msvc@1.16.1': optional: true - '@swc/core-win32-x64-msvc@1.15.47': + '@swc/core-win32-x64-msvc@1.16.1': optional: true - '@swc/core@1.15.47(@swc/helpers@0.5.23)': + '@swc/core@1.16.1(@swc/helpers@0.5.23)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.28 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.47 - '@swc/core-darwin-x64': 1.15.47 - '@swc/core-linux-arm-gnueabihf': 1.15.47 - '@swc/core-linux-arm64-gnu': 1.15.47 - '@swc/core-linux-arm64-musl': 1.15.47 - '@swc/core-linux-ppc64-gnu': 1.15.47 - '@swc/core-linux-s390x-gnu': 1.15.47 - '@swc/core-linux-x64-gnu': 1.15.47 - '@swc/core-linux-x64-musl': 1.15.47 - '@swc/core-win32-arm64-msvc': 1.15.47 - '@swc/core-win32-ia32-msvc': 1.15.47 - '@swc/core-win32-x64-msvc': 1.15.47 + '@swc/core-darwin-arm64': 1.16.1 + '@swc/core-darwin-x64': 1.16.1 + '@swc/core-linux-arm-gnueabihf': 1.16.1 + '@swc/core-linux-arm64-gnu': 1.16.1 + '@swc/core-linux-arm64-musl': 1.16.1 + '@swc/core-linux-ppc64-gnu': 1.16.1 + '@swc/core-linux-s390x-gnu': 1.16.1 + '@swc/core-linux-x64-gnu': 1.16.1 + '@swc/core-linux-x64-musl': 1.16.1 + '@swc/core-win32-arm64-msvc': 1.16.1 + '@swc/core-win32-ia32-msvc': 1.16.1 + '@swc/core-win32-x64-msvc': 1.16.1 '@swc/helpers': 0.5.23 '@swc/counter@0.1.3': {} @@ -15868,10 +16236,10 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/typography@0.5.20(tailwindcss@3.4.19(tsx@4.23.12)(yaml@2.9.0))': + '@tailwindcss/typography@0.5.20(tailwindcss@3.4.19(tsx@4.23.13)(yaml@2.9.0))': dependencies: postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.19(tsx@4.23.12)(yaml@2.9.0) + tailwindcss: 3.4.19(tsx@4.23.13)(yaml@2.9.0) '@tsconfig/node10@1.0.12': {} @@ -16099,7 +16467,7 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 20.19.9 + '@types/node': 24.13.3 '@types/send@0.17.6': dependencies: @@ -16149,28 +16517,28 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.67.0 - '@typescript-eslint/type-utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.67.0 + '@typescript-eslint/parser': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/type-utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.69.0 eslint: 9.39.2(jiti@1.21.7) - ignore: 7.0.6 + ignore: 7.0.8 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/parser@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.67.0 - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/typescript-estree': 8.67.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.67.0 + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.69.0 debug: 4.4.3(supports-color@7.2.0) eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 @@ -16186,10 +16554,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.67.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.69.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@5.9.3) - '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 debug: 4.4.3(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: @@ -16200,16 +16568,16 @@ snapshots: '@typescript-eslint/types': 8.66.0 '@typescript-eslint/visitor-keys': 8.66.0 - '@typescript-eslint/scope-manager@8.67.0': + '@typescript-eslint/scope-manager@8.69.0': dependencies: - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/visitor-keys': 8.67.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 '@typescript-eslint/tsconfig-utils@8.66.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.67.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.69.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 @@ -16225,11 +16593,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/typescript-estree': 8.67.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) debug: 4.4.3(supports-color@7.2.0) eslint: 9.39.2(jiti@1.21.7) ts-api-utils: 2.5.0(typescript@5.9.3) @@ -16239,7 +16607,7 @@ snapshots: '@typescript-eslint/types@8.66.0': {} - '@typescript-eslint/types@8.67.0': {} + '@typescript-eslint/types@8.69.0': {} '@typescript-eslint/typescript-estree@8.66.0(typescript@5.9.3)': dependencies: @@ -16256,12 +16624,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.67.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.69.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.67.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@5.9.3) - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/visitor-keys': 8.67.0 + '@typescript-eslint/project-service': 8.69.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.6 semver: 7.8.5 @@ -16282,12 +16650,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.2(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.67.0 - '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/typescript-estree': 8.67.0(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: @@ -16298,13 +16666,15 @@ snapshots: '@typescript-eslint/types': 8.66.0 eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.67.0': + '@typescript-eslint/visitor-keys@8.69.0': dependencies: - '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/types': 8.69.0 eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.3': {} + '@ungap/structured-clone@1.4.0': {} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': optional: true @@ -16420,9 +16790,9 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.6(patch_hash=215b6585a9c92fa68c096d500f4676983200307b1e64c1321e20ccbd50bbc8f3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(sass-embedded@1.100.0)(sass@1.97.3)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0))': + '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.6(patch_hash=215b6585a9c92fa68c096d500f4676983200307b1e64c1321e20ccbd50bbc8f3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(sass-embedded@1.100.0)(sass@1.97.3)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0))': dependencies: - vite: 7.3.6(patch_hash=215b6585a9c92fa68c096d500f4676983200307b1e64c1321e20ccbd50bbc8f3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(sass-embedded@1.100.0)(sass@1.97.3)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0) + vite: 7.3.6(patch_hash=215b6585a9c92fa68c096d500f4676983200307b1e64c1321e20ccbd50bbc8f3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(sass-embedded@1.100.0)(sass@1.97.3)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0) '@webassemblyjs/ast@1.14.1': dependencies: @@ -16599,6 +16969,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -16606,6 +16983,13 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + algoliasearch@5.48.1: dependencies: '@algolia/abtesting': 1.14.1 @@ -16627,21 +17011,21 @@ snapshots: dependencies: process-ancestry: 0.1.0 - angular-eslint@21.4.0(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript-eslint@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(typescript@5.9.3): + angular-eslint@21.4.0(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript-eslint@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(typescript@5.9.3): dependencies: '@angular-devkit/core': 21.2.19(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.21(chokidar@5.0.0) '@angular-eslint/builder': 21.4.0(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@angular-eslint/eslint-plugin': 21.4.0(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@angular-eslint/eslint-plugin-template': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.66.0)(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@angular-eslint/schematics': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(@typescript-eslint/types@8.66.0)(@typescript-eslint/utils@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/eslint-plugin': 21.4.0(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/eslint-plugin-template': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.66.0)(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@angular-eslint/schematics': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@angular/cli@21.2.21(@types/node@20.19.9)(chokidar@5.0.0))(@typescript-eslint/types@8.66.0)(@typescript-eslint/utils@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@angular-eslint/template-parser': 21.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@angular/cli': 21.2.21(@types/node@20.19.9)(chokidar@5.0.0) '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 - typescript-eslint: 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + typescript-eslint: 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) transitivePeerDependencies: - chokidar - supports-color @@ -16699,7 +17083,7 @@ snapshots: '@noble/hashes': 2.3.0 '@peculiar/webcrypto': 1.7.1 '@types/fs-extra': 9.0.13 - ajv: 8.18.0 + ajv: 8.20.0 asn1js: 3.0.10 async-exit-hook: 2.0.1 builder-util: 26.15.3 @@ -16812,7 +17196,7 @@ snapshots: astring@1.9.0: {} - astro@7.2.4(@astrojs/markdown-remark@7.2.4)(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0): + astro@7.2.4(@astrojs/markdown-remark@7.2.4)(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0): dependencies: '@astrojs/compiler-rs': 0.3.2(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) '@astrojs/internal-helpers': 0.10.4 @@ -16862,14 +17246,14 @@ snapshots: ultrahtml: 1.6.0 unifont: 0.7.5 unstorage: 1.17.5 - vite: 8.2.2(@types/node@20.19.9)(esbuild@0.28.2)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0) - vitefu: 1.1.3(vite@8.2.2(@types/node@20.19.9)(esbuild@0.28.2)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0)) + vite: 8.2.2(@types/node@20.19.9)(esbuild@0.28.2)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.2.2(@types/node@20.19.9)(esbuild@0.28.2)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0)) xxhash-wasm: 1.1.0 yargs-parser: 22.0.0 - zod: 4.3.6 + zod: 4.5.4 optionalDependencies: '@astrojs/markdown-remark': 7.2.4 - sharp: 0.35.3(@types/node@20.19.9) + sharp: 0.35.4(@types/node@20.19.9) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -16939,7 +17323,7 @@ snapshots: - debug - supports-color - axios@1.19.0: + axios@1.20.0: dependencies: follow-redirects: 1.16.0(debug@4.4.3) form-data: 4.0.6 @@ -16964,12 +17348,25 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.29.7)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + babel-jest@30.5.1(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@jest/transform': 30.5.1 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 8.0.0 + babel-preset-jest: 30.5.0(@babel/core@7.29.7) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-loader@9.2.1(@babel/core@7.29.7)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: '@babel/core': 7.29.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) babel-plugin-const-enum@1.2.0(@babel/core@7.29.7): dependencies: @@ -16990,10 +17387,24 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-istanbul@8.0.0: + dependencies: + '@babel/helper-plugin-utils': 7.29.7 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.6 + istanbul-lib-instrument: 6.0.3 + test-exclude: 7.0.2 + transitivePeerDependencies: + - supports-color + babel-plugin-jest-hoist@30.4.0: dependencies: '@types/babel__core': 7.20.5 + babel-plugin-jest-hoist@30.5.0: + dependencies: + '@types/babel__core': 7.20.5 + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.29.7 @@ -17064,6 +17475,12 @@ snapshots: babel-plugin-jest-hoist: 30.4.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) + babel-preset-jest@30.5.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + babel-plugin-jest-hoist: 30.5.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -17339,7 +17756,7 @@ snapshots: ci-info@4.4.0: {} - cjs-module-lexer@2.2.0: {} + cjs-module-lexer@2.2.1: {} cli-cursor@3.1.0: dependencies: @@ -17486,7 +17903,7 @@ snapshots: dependencies: is-what: 3.14.1 - copy-webpack-plugin@12.0.2(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)): + copy-webpack-plugin@12.0.2(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 @@ -17494,16 +17911,16 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 7.1.0 - webpack: 5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2) + webpack: 5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2) - copy-webpack-plugin@14.0.0(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + copy-webpack-plugin@14.0.0(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 7.1.0 tinyglobby: 0.2.17 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) core-js-compat@3.50.0: dependencies: @@ -17563,7 +17980,7 @@ snapshots: dependencies: postcss: 8.5.26 - css-loader@6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.23))(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + css-loader@6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.23))(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: icss-utils: 5.1.0(postcss@8.5.26) postcss: 8.5.26 @@ -17575,9 +17992,9 @@ snapshots: semver: 7.8.5 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.23) - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) - css-minimizer-webpack-plugin@8.0.0(esbuild@0.28.2)(lightningcss@1.33.0)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + css-minimizer-webpack-plugin@8.0.0(esbuild@0.28.2)(lightningcss@1.33.0)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: '@jridgewell/trace-mapping': 0.3.31 cssnano: 7.1.9(postcss@8.5.26) @@ -17585,7 +18002,7 @@ snapshots: postcss: 8.5.26 schema-utils: 4.3.3 serialize-javascript: 7.1.0 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) optionalDependencies: esbuild: 0.28.2 lightningcss: 1.33.0 @@ -17867,7 +18284,7 @@ snapshots: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 esbuild: 0.25.12 - tsx: 4.23.12 + tsx: 4.23.13 drizzle-orm@0.45.2(@types/better-sqlite3@7.6.13)(better-sqlite3@13.0.3): optionalDependencies: @@ -18113,6 +18530,8 @@ snapshots: es-module-lexer@2.3.1: {} + es-module-lexer@2.3.2: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -18278,17 +18697,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@1.21.7)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -18299,7 +18718,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.2(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@1.21.7)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -18311,7 +18730,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -18352,7 +18771,7 @@ snapshots: '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.6 + '@eslint/eslintrc': 3.3.7 '@eslint/js': 9.39.2 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.8 @@ -18388,8 +18807,8 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 4.2.1 espree@9.6.1: @@ -18493,6 +18912,15 @@ snapshots: jest-mock: 30.4.1 jest-util: 30.4.1 + expect@30.5.1: + dependencies: + '@jest/expect-utils': 30.5.1 + '@jest/get-type': 30.5.0 + jest-matcher-utils: 30.5.1 + jest-message-util: 30.5.1 + jest-mock: 30.5.1 + jest-util: 30.5.1 + exponential-backoff@3.1.3: {} express-rate-limit@8.3.0(express@5.2.1): @@ -18613,6 +19041,10 @@ snapshots: optionalDependencies: picomatch: 4.0.5 + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -18719,7 +19151,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -18734,9 +19166,9 @@ snapshots: semver: 7.8.5 tapable: 2.3.0 typescript: 5.9.3 - webpack: 5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2) + webpack: 5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2) - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -18751,7 +19183,7 @@ snapshots: semver: 7.8.5 tapable: 2.3.0 typescript: 5.9.3 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) form-data@4.0.6: dependencies: @@ -18929,7 +19361,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.8.5 + semver: 7.7.4 serialize-error: 7.0.1 optional: true @@ -18957,7 +19389,7 @@ snapshots: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.3 - ignore: 7.0.6 + ignore: 7.0.8 path-type: 6.0.0 slash: 5.1.0 unicorn-magic: 0.3.0 @@ -19161,7 +19593,7 @@ snapshots: he@1.2.0: {} - hls.js@1.7.0: {} + hls.js@1.7.1: {} hono@4.12.34: {} @@ -19339,6 +19771,8 @@ snapshots: ignore@7.0.6: {} + ignore@7.0.8: {} + image-size@0.5.5: optional: true @@ -19598,7 +20032,7 @@ snapshots: '@babel/parser': 7.29.8 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 - semver: 7.8.5 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -19633,10 +20067,10 @@ snapshots: filelist: 1.0.4 picocolors: 1.1.1 - jest-changed-files@30.4.1: + jest-changed-files@30.5.1: dependencies: execa: 5.1.1 - jest-util: 30.4.1 + jest-util: 30.5.1 p-limit: 3.1.0 jest-circus@30.4.2(babel-plugin-macros@3.1.0): @@ -19665,17 +20099,43 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)): + jest-circus@30.5.1(babel-plugin-macros@3.1.0): dependencies: - '@jest/core': 30.4.2(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) - '@jest/test-result': 30.4.1 - '@jest/types': 30.4.1 + '@jest/environment': 30.5.1 + '@jest/expect': 30.5.1 + '@jest/test-result': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 20.19.9 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.7.2(babel-plugin-macros@3.1.0) + is-generator-fn: 2.1.0 + jest-each: 30.5.1 + jest-matcher-utils: 30.5.1 + jest-message-util: 30.5.1 + jest-runtime: 30.5.1 + jest-snapshot: 30.5.1 + jest-util: 30.5.1 + p-limit: 3.1.0 + pretty-format: 30.5.1 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)): + dependencies: + '@jest/core': 30.5.1(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) + '@jest/test-result': 30.5.1 + '@jest/types': 30.5.1 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) - jest-util: 30.4.1 - jest-validate: 30.4.1 + jest-config: 30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) + jest-util: 30.5.1 + jest-validate: 30.5.1 yargs: 17.7.3 transitivePeerDependencies: - '@types/node' @@ -19684,7 +20144,7 @@ snapshots: - supports-color - ts-node - jest-config@30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)): + jest-config@30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)): dependencies: '@babel/core': 7.29.7 '@jest/get-type': 30.1.0 @@ -19712,7 +20172,40 @@ snapshots: optionalDependencies: '@types/node': 20.19.9 esbuild-register: 3.6.0(esbuild@0.28.2) - ts-node: 10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3) + ts-node: 10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)): + dependencies: + '@babel/core': 7.29.7 + '@jest/get-type': 30.5.0 + '@jest/pattern': 30.5.0 + '@jest/test-sequencer': 30.5.1 + '@jest/types': 30.5.1 + babel-jest: 30.5.1(@babel/core@7.29.7) + chalk: 4.1.2 + ci-info: 4.4.0 + deepmerge: 4.3.1 + glob: 13.0.6 + graceful-fs: 4.2.11 + jest-circus: 30.5.1(babel-plugin-macros@3.1.0) + jest-docblock: 30.5.0 + jest-environment-node: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-runner: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 + parse-json: 5.2.0 + pretty-format: 30.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.19.9 + esbuild-register: 3.6.0(esbuild@0.28.2) + ts-node: 10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -19731,10 +20224,21 @@ snapshots: chalk: 4.1.2 pretty-format: 30.4.1 + jest-diff@30.5.1: + dependencies: + '@jest/diff-sequences': 30.5.0 + '@jest/get-type': 30.5.0 + chalk: 4.1.2 + pretty-format: 30.5.1 + jest-docblock@30.4.0: dependencies: detect-newline: 3.1.0 + jest-docblock@30.5.0: + dependencies: + detect-newline: 3.1.0 + jest-each@30.4.1: dependencies: '@jest/get-type': 30.1.0 @@ -19743,10 +20247,19 @@ snapshots: jest-util: 30.4.1 pretty-format: 30.4.1 - jest-environment-jsdom@30.4.1: + jest-each@30.5.1: dependencies: - '@jest/environment': 30.4.1 - '@jest/environment-jsdom-abstract': 30.4.1(jsdom@26.1.0) + '@jest/get-type': 30.5.0 + '@jest/types': 30.5.1 + chalk: 4.1.2 + jest-util: 30.5.1 + pretty-format: 30.5.1 + + jest-environment-jsdom@30.5.1: + dependencies: + '@jest/environment': 30.5.1 + '@jest/environment-jsdom-abstract': 30.5.1(@types/jsdom@21.1.7)(jsdom@26.1.0) + '@types/jsdom': 21.1.7 jsdom: 26.1.0 transitivePeerDependencies: - bufferutil @@ -19763,6 +20276,16 @@ snapshots: jest-util: 30.4.1 jest-validate: 30.4.1 + jest-environment-node@30.5.1: + dependencies: + '@jest/environment': 30.5.1 + '@jest/fake-timers': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 20.19.9 + jest-mock: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 + jest-haste-map@30.4.1: dependencies: '@jest/types': 30.4.1 @@ -19778,11 +20301,30 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + jest-haste-map@30.5.1: + dependencies: + '@jest/types': 30.5.1 + '@parcel/watcher': 2.6.0 + '@types/node': 20.19.9 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + fdir: 6.5.0(picomatch@4.0.5) + graceful-fs: 4.2.11 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 + jest-worker: 30.5.1 + picomatch: 4.0.5 + jest-leak-detector@30.4.1: dependencies: '@jest/get-type': 30.1.0 pretty-format: 30.4.1 + jest-leak-detector@30.5.1: + dependencies: + '@jest/get-type': 30.5.0 + pretty-format: 30.5.1 + jest-matcher-utils@30.2.0: dependencies: '@jest/get-type': 30.1.0 @@ -19797,6 +20339,13 @@ snapshots: jest-diff: 30.4.1 pretty-format: 30.4.1 + jest-matcher-utils@30.5.1: + dependencies: + '@jest/get-type': 30.5.0 + chalk: 4.1.2 + jest-diff: 30.5.1 + pretty-format: 30.5.1 + jest-message-util@30.2.0: dependencies: '@babel/code-frame': 7.29.7 @@ -19822,6 +20371,19 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 + jest-message-util@30.5.1: + dependencies: + '@babel/code-frame': 7.29.7 + '@jest/types': 30.5.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-util: 30.5.1 + picomatch: 4.0.5 + pretty-format: 30.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-mock@30.2.0: dependencies: '@jest/types': 30.2.0 @@ -19834,11 +20396,18 @@ snapshots: '@types/node': 20.19.9 jest-util: 30.4.1 + jest-mock@30.5.1: + dependencies: + '@jest/expect-utils': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 20.19.9 + jest-util: 30.5.1 + jest-pnp-resolver@1.2.3(jest-resolve@30.4.1): optionalDependencies: jest-resolve: 30.4.1 - jest-preset-angular@15.0.3(e3b998715f9ba0e14eb4dd646f182898): + jest-preset-angular@15.0.3(49d964010ff732709c8b8b9285288d9d): dependencies: '@angular/compiler-cli': 21.2.19(@angular/compiler@21.2.19)(typescript@5.9.3) '@angular/core': 21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2) @@ -19847,11 +20416,11 @@ snapshots: '@jest/environment-jsdom-abstract': 30.2.0(jsdom@26.1.0) bs-logger: 0.2.6 esbuild-wasm: 0.27.2 - jest: 30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) - jest-util: 30.4.1 + jest: 30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) + jest-util: 30.5.1 jsdom: 26.1.0 pretty-format: 30.2.0 - ts-jest: 29.4.12(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(esbuild@0.28.2)(jest-util@30.4.1)(jest@30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)))(typescript@5.9.3) + ts-jest: 29.4.12(@babel/core@7.29.7)(@jest/transform@30.5.1)(@jest/types@30.5.1)(babel-jest@30.5.1(@babel/core@7.29.7))(esbuild@0.28.2)(jest-util@30.5.1)(jest@30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)))(typescript@5.9.3) typescript: 5.9.3 optionalDependencies: esbuild: 0.28.2 @@ -19866,10 +20435,12 @@ snapshots: jest-regex-util@30.4.0: {} - jest-resolve-dependencies@30.4.2: + jest-regex-util@30.5.0: {} + + jest-resolve-dependencies@30.5.1: dependencies: - jest-regex-util: 30.4.0 - jest-snapshot: 30.4.1 + jest-regex-util: 30.5.0 + jest-snapshot: 30.5.1 transitivePeerDependencies: - supports-color @@ -19884,6 +20455,16 @@ snapshots: slash: 3.0.0 unrs-resolver: 1.12.2 + jest-resolve@30.5.1: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 + slash: 3.0.0 + unrs-resolver: 1.12.2 + jest-runner@30.4.2: dependencies: '@jest/console': 30.4.1 @@ -19911,6 +20492,33 @@ snapshots: transitivePeerDependencies: - supports-color + jest-runner@30.5.1: + dependencies: + '@jest/console': 30.5.1 + '@jest/environment': 30.5.1 + '@jest/source-map': 30.5.0 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 20.19.9 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.5.0 + jest-environment-node: 30.5.1 + jest-haste-map: 30.5.1 + jest-leak-detector: 30.5.1 + jest-message-util: 30.5.1 + jest-resolve: 30.5.1 + jest-runtime: 30.5.1 + jest-util: 30.5.1 + jest-watcher: 30.5.1 + jest-worker: 30.5.1 + p-limit: 3.1.0 + transitivePeerDependencies: + - supports-color + jest-runtime@30.4.2: dependencies: '@jest/environment': 30.4.1 @@ -19922,7 +20530,7 @@ snapshots: '@jest/types': 30.4.1 '@types/node': 20.19.9 chalk: 4.1.2 - cjs-module-lexer: 2.2.0 + cjs-module-lexer: 2.2.1 collect-v8-coverage: 1.0.3 glob: 10.5.0 graceful-fs: 4.2.11 @@ -19938,6 +20546,34 @@ snapshots: transitivePeerDependencies: - supports-color + jest-runtime@30.5.1: + dependencies: + '@jest/environment': 30.5.1 + '@jest/fake-timers': 30.5.1 + '@jest/globals': 30.5.1 + '@jest/source-map': 30.5.0 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 20.19.9 + chalk: 4.1.2 + cjs-module-lexer: 2.2.1 + collect-v8-coverage: 1.0.3 + es-module-lexer: 2.3.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + jest-haste-map: 30.5.1 + jest-message-util: 30.5.1 + jest-mock: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-snapshot: 30.5.1 + jest-util: 30.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + jest-snapshot@30.4.1: dependencies: '@babel/core': 7.29.7 @@ -19960,7 +20596,33 @@ snapshots: jest-util: 30.4.1 pretty-format: 30.4.1 semver: 7.8.5 - synckit: 0.11.11 + synckit: 0.11.13 + transitivePeerDependencies: + - supports-color + + jest-snapshot@30.5.1: + dependencies: + '@babel/core': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.8 + '@jest/expect-utils': 30.5.1 + '@jest/get-type': 30.5.0 + '@jest/snapshot-utils': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) + chalk: 4.1.2 + expect: 30.5.1 + graceful-fs: 4.2.11 + jest-diff: 30.5.1 + jest-matcher-utils: 30.5.1 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + pretty-format: 30.5.1 + semver: 7.8.5 + synckit: 0.11.13 transitivePeerDependencies: - supports-color @@ -19978,7 +20640,16 @@ snapshots: '@jest/types': 30.4.1 '@types/node': 20.19.9 chalk: 4.1.2 - ci-info: 4.3.1 + ci-info: 4.4.0 + graceful-fs: 4.2.11 + picomatch: 4.0.5 + + jest-util@30.5.1: + dependencies: + '@jest/types': 30.5.1 + '@types/node': 20.19.9 + chalk: 4.1.2 + ci-info: 4.4.0 graceful-fs: 4.2.11 picomatch: 4.0.5 @@ -19991,6 +20662,15 @@ snapshots: leven: 3.1.0 pretty-format: 30.4.1 + jest-validate@30.5.1: + dependencies: + '@jest/get-type': 30.5.0 + '@jest/types': 30.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.5.1 + jest-watcher@30.4.1: dependencies: '@jest/test-result': 30.4.1 @@ -20002,6 +20682,17 @@ snapshots: jest-util: 30.4.1 string-length: 4.0.2 + jest-watcher@30.5.1: + dependencies: + '@jest/test-result': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 20.19.9 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.5.1 + string-length: 4.0.2 + jest-worker@27.5.1: dependencies: '@types/node': 20.19.9 @@ -20016,12 +20707,20 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)): + jest-worker@30.5.1: dependencies: - '@jest/core': 30.4.2(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) - '@jest/types': 30.4.1 + '@types/node': 20.19.9 + '@ungap/structured-clone': 1.4.0 + jest-util: 30.5.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)): + dependencies: + '@jest/core': 30.5.1(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) + '@jest/types': 30.5.1 import-local: 3.2.0 - jest-cli: 30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) + jest-cli: 30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -20039,7 +20738,7 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@3.15.1: + js-yaml@3.15.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 @@ -20048,6 +20747,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + jsdom@26.1.0: dependencies: cssstyle: 4.6.0 @@ -20057,7 +20760,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.23 + nwsapi: 2.2.27 parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 @@ -20138,12 +20841,12 @@ snapshots: lazy-val@1.0.5: {} - less-loader@12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.23))(less@4.5.1)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + less-loader@12.3.3(@rspack/core@1.6.8(@swc/helpers@0.5.23))(less@4.5.1)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: less: 4.5.1 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.23) - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) less@4.5.1: dependencies: @@ -20166,17 +20869,17 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - license-webpack-plugin@4.0.2(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)): + license-webpack-plugin@4.0.2(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)): dependencies: webpack-sources: 3.3.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2) + webpack: 5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2) - license-webpack-plugin@4.0.2(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + license-webpack-plugin@4.0.2(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: webpack-sources: 3.3.3 optionalDependencies: - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) lightningcss-android-arm64@1.33.0: optional: true @@ -20395,7 +21098,7 @@ snapshots: markdown-table@3.0.4: {} - marked@18.0.9: {} + marked@18.0.11: {} matcher@3.0.0: dependencies: @@ -20911,10 +21614,10 @@ snapshots: dependencies: dom-walk: 0.1.2 - mini-css-extract-plugin@2.4.7(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + mini-css-extract-plugin@2.4.7(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: schema-utils: 4.3.3 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) minimalistic-assert@1.0.1: {} @@ -20940,15 +21643,15 @@ snapshots: minimist@1.2.8: {} - minimizer-webpack-plugin@5.6.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + minimizer-webpack-plugin@5.6.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.49.2 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) optionalDependencies: - '@swc/core': 1.15.47(@swc/helpers@0.5.23) + '@swc/core': 1.16.1(@swc/helpers@0.5.23) esbuild: 0.28.2 lightningcss: 1.33.0 postcss: 8.5.26 @@ -21078,7 +21781,7 @@ snapshots: neotraverse@1.0.1: {} - ng-mocks@14.17.1(b285834fe0000b6ade3305b52068a4d2): + ng-mocks@14.17.3(b285834fe0000b6ade3305b52068a4d2): dependencies: '@angular/common': 21.2.19(@angular/core@21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) '@angular/core': 21.2.19(@angular/compiler@21.2.19)(rxjs@7.8.2)(zone.js@0.16.2) @@ -21103,21 +21806,20 @@ snapshots: node-abi@4.33.0: dependencies: - semver: 7.8.5 + semver: 7.7.4 node-abort-controller@3.1.1: {} node-addon-api@6.1.0: optional: true - node-addon-api@7.1.1: - optional: true + node-addon-api@7.1.1: {} node-addon-api@8.9.1: {} node-api-version@0.2.1: dependencies: - semver: 7.8.5 + semver: 7.7.4 node-fetch-native@1.6.7: {} @@ -21141,7 +21843,7 @@ snapshots: graceful-fs: 4.2.11 nopt: 9.0.0 proc-log: 6.1.0 - semver: 7.8.5 + semver: 7.7.4 tar: 7.5.22 tinyglobby: 0.2.17 undici: 6.28.0 @@ -21167,7 +21869,7 @@ snapshots: npm-install-checks@8.0.0: dependencies: - semver: 7.8.5 + semver: 7.7.4 npm-normalize-package-bin@5.0.0: {} @@ -21175,7 +21877,7 @@ snapshots: dependencies: hosted-git-info: 9.0.3 proc-log: 6.1.0 - semver: 7.8.5 + semver: 7.7.4 validate-npm-package-name: 7.0.2 npm-packlist@10.0.4: @@ -21188,7 +21890,7 @@ snapshots: npm-install-checks: 8.0.0 npm-normalize-package-bin: 5.0.0 npm-package-arg: 13.0.2 - semver: 7.8.5 + semver: 7.7.4 npm-registry-fetch@19.1.1: dependencies: @@ -21211,24 +21913,24 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.23: {} + nwsapi@2.2.27: {} - nx-electron@22.0.0(patch_hash=f4bbde1778360c4c462b255bec47a337c0465d59cdcab14ecb601161f3467002)(@nx/devkit@22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))))(@nx/workspace@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)))(@swc/core@1.15.47(@swc/helpers@0.5.23))(electron-builder-squirrel-windows@26.15.7)(electron@43.3.0)(esbuild@0.28.2)(rxjs@7.8.2)(typescript@5.9.3): + nx-electron@22.0.0(patch_hash=f4bbde1778360c4c462b255bec47a337c0465d59cdcab14ecb601161f3467002)(@nx/devkit@22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))))(@nx/workspace@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)))(@swc/core@1.16.1(@swc/helpers@0.5.23))(electron-builder-squirrel-windows@26.15.7)(electron@43.3.0)(esbuild@0.28.2)(rxjs@7.8.2)(typescript@5.9.3): dependencies: - '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23))) - '@nx/workspace': 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)) - copy-webpack-plugin: 12.0.2(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)) + '@nx/devkit': 22.7.8(nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23))) + '@nx/workspace': 22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)) + copy-webpack-plugin: 12.0.2(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)) electron: 43.3.0 electron-builder: 26.15.7(electron-builder-squirrel-windows@26.15.7) - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)) - license-webpack-plugin: 4.0.2(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)) + license-webpack-plugin: 4.0.2(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)) rxjs-for-await: 1.0.0(rxjs@7.8.2) strip-json-comments: 3.1.1 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)) + terser-webpack-plugin: 5.3.16(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)) tree-kill: 1.2.2 - ts-loader: 9.5.4(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)) + ts-loader: 9.5.4(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)) tsconfig-paths-webpack-plugin: 4.2.0 - webpack: 5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2) + webpack: 5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2) webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -21240,7 +21942,7 @@ snapshots: - uglify-js - webpack-cli - nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.15.47(@swc/helpers@0.5.23)): + nx@22.7.8(@swc-node/register@1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3))(@swc/core@1.16.1(@swc/helpers@0.5.23)): dependencies: '@emnapi/core': 1.4.5 '@emnapi/runtime': 1.4.5 @@ -21367,8 +22069,8 @@ snapshots: '@nx/nx-linux-x64-musl': 22.7.8 '@nx/nx-win32-arm64-msvc': 22.7.8 '@nx/nx-win32-x64-msvc': 22.7.8 - '@swc-node/register': 1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3) - '@swc/core': 1.15.47(@swc/helpers@0.5.23) + '@swc-node/register': 1.12.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@swc/core@1.16.1(@swc/helpers@0.5.23))(@swc/types@0.1.28)(typescript@5.9.3) + '@swc/core': 1.16.1(@swc/helpers@0.5.23) object-assign@4.1.1: {} @@ -21701,6 +22403,8 @@ snapshots: picomatch@4.0.5: {} + picomatch@4.0.7: {} + pify@2.3.0: {} pify@4.0.1: @@ -21816,16 +22520,16 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.26 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.26)(tsx@4.23.12)(yaml@2.9.0): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.26)(tsx@4.23.13)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.26 - tsx: 4.23.12 + tsx: 4.23.13 yaml: 2.9.0 - postcss-loader@8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.23))(postcss@8.5.26)(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + postcss-loader@8.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.23))(postcss@8.5.26)(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: cosmiconfig: 9.0.2(typescript@5.9.3) jiti: 2.7.0 @@ -21833,7 +22537,7 @@ snapshots: semver: 7.8.5 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.23) - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) transitivePeerDependencies: - typescript @@ -22028,6 +22732,13 @@ snapshots: react-is-18: react-is@18.3.1 react-is-19: react-is@19.2.8 + pretty-format@30.5.1: + dependencies: + '@jest/react-is-18': react-is@18.3.1 + '@jest/react-is-19': react-is@19.2.8 + '@jest/schemas': 30.5.0 + ansi-styles: 5.2.0 + prismjs@1.30.0: {} proc-log@6.1.0: {} @@ -22627,14 +23338,14 @@ snapshots: sass-embedded-win32-arm64: 1.100.0 sass-embedded-win32-x64: 1.100.0 - sass-loader@16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.23))(sass-embedded@1.100.0)(sass@1.102.0)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + sass-loader@16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.23))(sass-embedded@1.100.0)(sass@1.102.0)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: neo-async: 2.6.2 optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.23) sass: 1.102.0 sass-embedded: 1.100.0 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) sass@1.100.0: dependencies: @@ -22836,37 +23547,37 @@ snapshots: dependencies: kind-of: 6.0.3 - sharp@0.35.3(@types/node@20.19.9): + sharp@0.35.4(@types/node@20.19.9): dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.35.3 - '@img/sharp-darwin-x64': 0.35.3 - '@img/sharp-freebsd-wasm32': 0.35.3 - '@img/sharp-libvips-darwin-arm64': 1.3.2 - '@img/sharp-libvips-darwin-x64': 1.3.2 - '@img/sharp-libvips-linux-arm': 1.3.2 - '@img/sharp-libvips-linux-arm64': 1.3.2 - '@img/sharp-libvips-linux-ppc64': 1.3.2 - '@img/sharp-libvips-linux-riscv64': 1.3.2 - '@img/sharp-libvips-linux-s390x': 1.3.2 - '@img/sharp-libvips-linux-x64': 1.3.2 - '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 - '@img/sharp-libvips-linuxmusl-x64': 1.3.2 - '@img/sharp-linux-arm': 0.35.3 - '@img/sharp-linux-arm64': 0.35.3 - '@img/sharp-linux-ppc64': 0.35.3 - '@img/sharp-linux-riscv64': 0.35.3 - '@img/sharp-linux-s390x': 0.35.3 - '@img/sharp-linux-x64': 0.35.3 - '@img/sharp-linuxmusl-arm64': 0.35.3 - '@img/sharp-linuxmusl-x64': 0.35.3 - '@img/sharp-webcontainers-wasm32': 0.35.3 - '@img/sharp-win32-arm64': 0.35.3 - '@img/sharp-win32-ia32': 0.35.3 - '@img/sharp-win32-x64': 0.35.3 + '@img/sharp-darwin-arm64': 0.35.4 + '@img/sharp-darwin-x64': 0.35.4 + '@img/sharp-freebsd-wasm32': 0.35.4 + '@img/sharp-libvips-darwin-arm64': 1.3.3 + '@img/sharp-libvips-darwin-x64': 1.3.3 + '@img/sharp-libvips-linux-arm': 1.3.3 + '@img/sharp-libvips-linux-arm64': 1.3.3 + '@img/sharp-libvips-linux-ppc64': 1.3.3 + '@img/sharp-libvips-linux-riscv64': 1.3.3 + '@img/sharp-libvips-linux-s390x': 1.3.3 + '@img/sharp-libvips-linux-x64': 1.3.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 + '@img/sharp-libvips-linuxmusl-x64': 1.3.3 + '@img/sharp-linux-arm': 0.35.4 + '@img/sharp-linux-arm64': 0.35.4 + '@img/sharp-linux-ppc64': 0.35.4 + '@img/sharp-linux-riscv64': 0.35.4 + '@img/sharp-linux-s390x': 0.35.4 + '@img/sharp-linux-x64': 0.35.4 + '@img/sharp-linuxmusl-arm64': 0.35.4 + '@img/sharp-linuxmusl-x64': 0.35.4 + '@img/sharp-webcontainers-wasm32': 0.35.4 + '@img/sharp-win32-arm64': 0.35.4 + '@img/sharp-win32-ia32': 0.35.4 + '@img/sharp-win32-x64': 0.35.4 '@types/node': 20.19.9 shebang-command@2.0.0: @@ -22965,7 +23676,7 @@ snapshots: '@types/node': 24.13.3 '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.6.0 + sax: 1.6.1 slash@3.0.0: {} @@ -23006,11 +23717,11 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + source-map-loader@5.0.0(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) source-map-support@0.5.13: dependencies: @@ -23091,8 +23802,6 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - stream-replace-string@2.0.0: {} - string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -23177,9 +23886,9 @@ snapshots: strip-json-comments@3.1.1: {} - style-loader@3.3.4(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + style-loader@3.3.4(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) style-to-js@1.1.21: dependencies: @@ -23239,11 +23948,11 @@ snapshots: sync-message-port@1.2.0: {} - synckit@0.11.11: + synckit@0.11.13: dependencies: - '@pkgr/core': 0.2.9 + '@pkgr/core': 0.3.6 - tailwindcss@3.4.19(tsx@4.23.12)(yaml@2.9.0): + tailwindcss@3.4.19(tsx@4.23.13)(yaml@2.9.0): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -23262,7 +23971,7 @@ snapshots: postcss: 8.5.26 postcss-import: 15.1.0(postcss@8.5.26) postcss-js: 4.1.0(postcss@8.5.26) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.26)(tsx@4.23.12)(yaml@2.9.0) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.26)(tsx@4.23.13)(yaml@2.9.0) postcss-nested: 6.2.0(postcss@8.5.26) postcss-selector-parser: 6.1.4 resolve: 1.22.11 @@ -23301,27 +24010,27 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.6.3 - terser-webpack-plugin@5.3.16(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)): + terser-webpack-plugin@5.3.16(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 7.1.0 terser: 5.44.1 - webpack: 5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2) + webpack: 5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2) optionalDependencies: - '@swc/core': 1.15.47(@swc/helpers@0.5.23) + '@swc/core': 1.16.1(@swc/helpers@0.5.23) esbuild: 0.28.2 - terser-webpack-plugin@5.6.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + terser-webpack-plugin@5.6.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.49.2 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) optionalDependencies: - '@swc/core': 1.15.47(@swc/helpers@0.5.23) + '@swc/core': 1.16.1(@swc/helpers@0.5.23) esbuild: 0.28.2 lightningcss: 1.33.0 postcss: 8.5.26 @@ -23346,6 +24055,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.5 + test-exclude@7.0.2: + dependencies: + '@istanbuljs/schema': 0.1.6 + glob: 10.5.0 + minimatch: 10.2.6 + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -23379,8 +24094,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tldts-core@6.1.86: {} @@ -23446,12 +24161,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.4.12(@babel/core@7.29.7)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.7))(esbuild@0.28.2)(jest-util@30.4.1)(jest@30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.12(@babel/core@7.29.7)(@jest/transform@30.5.1)(@jest/types@30.5.1)(babel-jest@30.5.1(@babel/core@7.29.7))(esbuild@0.28.2)(jest-util@30.5.1)(jest@30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.9 - jest: 30.4.2(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) + jest: 30.5.1(@types/node@20.19.9)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2))(ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -23461,13 +24176,13 @@ snapshots: yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.29.7 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - babel-jest: 30.4.1(@babel/core@7.29.7) + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + babel-jest: 30.5.1(@babel/core@7.29.7) esbuild: 0.28.2 - jest-util: 30.4.1 + jest-util: 30.5.1 - ts-loader@9.5.4(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)): + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.4 @@ -23475,19 +24190,19 @@ snapshots: semver: 7.8.5 source-map: 0.7.6 typescript: 5.9.3 - webpack: 5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2) + webpack: 5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2) - ts-loader@9.6.2(loader-utils@2.0.4)(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + ts-loader@9.6.2(loader-utils@2.0.4)(typescript@5.9.3)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: chalk: 4.1.2 picomatch: 4.0.5 source-map: 0.7.6 typescript: 5.9.3 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) optionalDependencies: loader-utils: 2.0.4 - ts-node@10.9.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3): + ts-node@10.9.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(@types/node@20.19.9)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -23505,7 +24220,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.47(@swc/helpers@0.5.23) + '@swc/core': 1.16.1(@swc/helpers@0.5.23) tsconfig-paths-webpack-plugin@4.2.0: dependencies: @@ -23531,7 +24246,7 @@ snapshots: tslib@2.8.1: {} - tsx@4.23.12: + tsx@4.23.13: dependencies: esbuild: 0.28.2 optionalDependencies: @@ -23610,12 +24325,12 @@ snapshots: typed-assert@1.0.9: {} - typescript-eslint@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): + typescript-eslint@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/parser': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.67.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.67.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: @@ -23881,7 +24596,7 @@ snapshots: dependencies: global: 4.4.0 - vite@7.3.6(patch_hash=215b6585a9c92fa68c096d500f4676983200307b1e64c1321e20ccbd50bbc8f3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(sass-embedded@1.100.0)(sass@1.97.3)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0): + vite@7.3.6(patch_hash=215b6585a9c92fa68c096d500f4676983200307b1e64c1321e20ccbd50bbc8f3)(@types/node@20.19.9)(jiti@1.21.7)(less@4.5.1)(lightningcss@1.33.0)(sass-embedded@1.100.0)(sass@1.97.3)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0): dependencies: esbuild: 0.28.2 fdir: 6.5.0(picomatch@4.0.5) @@ -23898,10 +24613,10 @@ snapshots: sass: 1.97.3 sass-embedded: 1.100.0 terser: 5.49.2 - tsx: 4.23.12 + tsx: 4.23.13 yaml: 2.9.0 - vite@8.2.2(@types/node@20.19.9)(esbuild@0.28.2)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0): + vite@8.2.2(@types/node@20.19.9)(esbuild@0.28.2)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -23917,12 +24632,12 @@ snapshots: sass: 1.102.0 sass-embedded: 1.100.0 terser: 5.49.2 - tsx: 4.23.12 + tsx: 4.23.13 yaml: 2.9.0 - vitefu@1.1.3(vite@8.2.2(@types/node@20.19.9)(esbuild@0.28.2)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0)): + vitefu@1.1.3(vite@8.2.2(@types/node@20.19.9)(esbuild@0.28.2)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0)): optionalDependencies: - vite: 8.2.2(@types/node@20.19.9)(esbuild@0.28.2)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.12)(yaml@2.9.0) + vite: 8.2.2(@types/node@20.19.9)(esbuild@0.28.2)(jiti@1.21.7)(less@4.5.1)(sass-embedded@1.100.0)(sass@1.102.0)(terser@5.49.2)(tsx@4.23.13)(yaml@2.9.0) w3c-xmlserializer@5.0.0: dependencies: @@ -23971,7 +24686,7 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-dev-middleware@7.4.5(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + webpack-dev-middleware@7.4.5(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: colorette: 2.0.20 memfs: 4.68.0 @@ -23980,9 +24695,9 @@ snapshots: range-parser: 1.3.0 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) - webpack-dev-server@5.2.6(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + webpack-dev-server@5.2.6(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -24010,10 +24725,10 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + webpack-dev-middleware: 7.4.5(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) ws: 8.21.3 optionalDependencies: - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) transitivePeerDependencies: - bufferutil - debug @@ -24032,12 +24747,12 @@ snapshots: webpack-sources@3.5.1: {} - webpack-subresource-integrity@5.1.0(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): + webpack-subresource-integrity@5.1.0(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)): dependencies: typed-assert: 1.0.9 - webpack: 5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) + webpack: 5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26) - webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2): + webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -24061,7 +24776,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(webpack@5.104.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)) + terser-webpack-plugin: 5.3.16(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(webpack@5.104.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)) watchpack: 2.5.0 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -24069,7 +24784,7 @@ snapshots: - esbuild - uglify-js - webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26): + webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26): dependencies: '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 @@ -24085,7 +24800,7 @@ snapshots: events: 3.3.0 graceful-fs: 4.2.11 mime-db: 1.54.0 - minimizer-webpack-plugin: 5.6.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) + minimizer-webpack-plugin: 5.6.1(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(webpack@5.109.2(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 @@ -24336,6 +25051,8 @@ snapshots: zod@4.3.6: {} + zod@4.5.4: {} + zone.js@0.16.2: {} zwitch@2.0.4: {} From 0245d73d78a88919972e2783b2c588f2ac8435d1 Mon Sep 17 00:00:00 2001 From: 4gray <4gray@users.noreply.github.com> Date: Sat, 5 Sep 2026 11:18:05 +0200 Subject: [PATCH 3/6] feat(portals): make connection cooldown configurable in desktop settings (#1536) --- .changes/portals-connectivity-setting.md | 6 + AGENTS.md | 14 ++ CLAUDE.md | 14 ++ .../src/settings-connectivity-guard.e2e.ts | 147 ++++++++++++++++++ .../src/app/events/settings.events.spec.ts | 33 ++++ .../src/app/events/settings.events.ts | 11 ++ .../src/app/services/store.service.ts | 4 + .../app/util/host-connectivity-guard.spec.ts | 58 +++++++ .../src/app/util/host-connectivity-guard.ts | 24 ++- .../app/settings/settings-form.utils.spec.ts | 10 ++ .../src/app/settings/settings-form.utils.ts | 2 + .../settings-general-section.component.html | 51 +++++- .../settings-general-section.component.ts | 1 + .../settings/settings.component.form.spec.ts | 34 ++++ .../src/app/settings/settings.component.html | 3 + .../src/app/settings/settings.component.ts | 2 + .../test-stubs/settings-test-harness.stub.ts | 4 + apps/web/src/assets/i18n/ar.json | 9 ++ apps/web/src/assets/i18n/ary.json | 9 ++ apps/web/src/assets/i18n/by.json | 9 ++ apps/web/src/assets/i18n/de.json | 9 ++ apps/web/src/assets/i18n/el.json | 9 ++ apps/web/src/assets/i18n/en.json | 9 ++ apps/web/src/assets/i18n/es.json | 9 ++ apps/web/src/assets/i18n/fr.json | 9 ++ apps/web/src/assets/i18n/hu.json | 9 ++ apps/web/src/assets/i18n/it.json | 9 ++ apps/web/src/assets/i18n/ja.json | 9 ++ apps/web/src/assets/i18n/ko.json | 9 ++ apps/web/src/assets/i18n/nl.json | 9 ++ apps/web/src/assets/i18n/pl.json | 9 ++ apps/web/src/assets/i18n/pt.json | 9 ++ apps/web/src/assets/i18n/ru.json | 9 ++ apps/web/src/assets/i18n/tr.json | 9 ++ apps/web/src/assets/i18n/zh.json | 9 ++ apps/web/src/assets/i18n/zhtw.json | 9 ++ docs/architecture/host-connectivity-guard.md | 29 ++++ .../stalker-account-info.component.html | 32 +++- .../stalker-account-info.component.spec.ts | 27 ++++ .../stalker-account-info.component.ts | 13 +- .../account-info/account-info.component.html | 28 +++- .../account-info.component.spec.ts | 32 ++++ .../account-info/account-info.component.ts | 13 +- .../lib/runtime-capabilities.service.spec.ts | 10 ++ .../src/lib/runtime-capabilities.service.ts | 8 + .../src/lib/settings-store.service.spec.ts | 19 +++ .../src/lib/settings-store.service.ts | 12 ++ .../interfaces/src/lib/settings.interface.ts | 2 + 48 files changed, 787 insertions(+), 27 deletions(-) create mode 100644 .changes/portals-connectivity-setting.md create mode 100644 apps/electron-backend-e2e/src/settings-connectivity-guard.e2e.ts diff --git a/.changes/portals-connectivity-setting.md b/.changes/portals-connectivity-setting.md new file mode 100644 index 000000000..65acde25c --- /dev/null +++ b/.changes/portals-connectivity-setting.md @@ -0,0 +1,6 @@ +--- +type: feature +area: portals +--- + +Desktop settings now let you disable the temporary pause after repeated Xtream or Stalker connection failures, without restarting. Account info explains when requests are paused and offers an immediate retry. diff --git a/AGENTS.md b/AGENTS.md index dc8d0321c..d1616fbb1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -166,6 +166,20 @@ agent-browser connect ws://127.0.0.1:9222/devtools/page/ agent-browser screenshot /tmp/iptvnator-cdp.png ``` +## Portal Connectivity Preference + +- Desktop Settings > General > Portal connections exposes default-on + `Settings.portalConnectivityGuard`. Only explicit false opts out. Save mirrors + the value to Electron `PORTAL_CONNECTIVITY_GUARD` and applies it without restart; + settings bootstrap restores it before the renderer loads. It controls Xtream + and Stalker together. Preference transitions clear cooldowns and invalidate old + request completions; unchanged saves preserve evidence. The environment switch + `IPTVNATOR_DISABLE_CONNECTIVITY_GUARD=1` remains authoritative. PWA clients do not + control the shared backend's guard. +- Both account-info dialogs explain guard refusals with localized paused-request + copy and Retry now; Stalker preserves cached account data on a failed refresh. + Contract: `docs/architecture/host-connectivity-guard.md`. + ## Radio / Audio Player M3U playlists can contain radio channels identified by the `radio="true"` attribute on `#EXTINF` lines. When a radio channel is selected: diff --git a/CLAUDE.md b/CLAUDE.md index 1ddc0c668..75b4f3520 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1625,3 +1625,17 @@ No formal migration system yet. Schema changes are applied via raw SQL in the `c - The `nx-generate` skill handles generator discovery internally - don't call nx_docs just to look up generator syntax + +## Portal Connectivity Preference + +- Desktop Settings > General > Portal connections exposes default-on + `Settings.portalConnectivityGuard`. Only explicit false opts out. Save mirrors + the value to Electron `PORTAL_CONNECTIVITY_GUARD` and applies it without restart; + settings bootstrap restores it before the renderer loads. It controls Xtream + and Stalker together. Preference transitions clear cooldowns and invalidate old + request completions; unchanged saves preserve evidence. The environment switch + `IPTVNATOR_DISABLE_CONNECTIVITY_GUARD=1` remains authoritative. PWA clients do not + control the shared backend's guard. +- Both account-info dialogs explain guard refusals with localized paused-request + copy and Retry now; Stalker preserves cached account data on a failed refresh. + Contract: `docs/architecture/host-connectivity-guard.md`. diff --git a/apps/electron-backend-e2e/src/settings-connectivity-guard.e2e.ts b/apps/electron-backend-e2e/src/settings-connectivity-guard.e2e.ts new file mode 100644 index 000000000..4082eab85 --- /dev/null +++ b/apps/electron-backend-e2e/src/settings-connectivity-guard.e2e.ts @@ -0,0 +1,147 @@ +import { Page } from '@playwright/test'; +import { createServer } from 'node:net'; +import { + closeElectronApp, + expect, + launchElectronApp, + openSettings, + openSettingsSection, + saveSettings, + test, +} from './electron-test-fixtures'; + +const pausedMessage = 'skipped after repeated connection failures'; +// Xtream currently rejects network failures with a plain object, whose fields +// Electron discards. Stalker preserves the error code in its Error message. +const xtreamNetworkFailure = + "Error invoking remote method 'XTREAM_REQUEST': [object Object]"; + +async function unusedLocalOrigin(): Promise { + const server = createServer(); + await new Promise((resolve) => + server.listen(0, '127.0.0.1', resolve) + ); + const address = server.address(); + if (!address || typeof address === 'string') + throw new Error('No test port'); + await new Promise((resolve, reject) => + server.close((error) => (error ? reject(error) : resolve())) + ); + return `http://127.0.0.1:${address.port}`; +} + +/** Real IPC/network failure: both protocols must share the saved policy. */ +async function requestFailure(page: Page, origin: string, stalker = false) { + return page.evaluate( + async ({ origin, stalker }) => { + try { + if (stalker) { + await window.electron.stalkerRequest({ + url: `${origin}/portal.php`, + macAddress: '00:1A:79:00:00:01', + params: { type: 'stb', action: 'handshake' }, + }); + } else { + await window.electron.xtreamRequest({ + url: origin, + params: { + username: 'test', + password: 'test', + action: 'get_account_info', + }, + }); + } + return 'unexpected success'; + } catch (error) { + return error instanceof Error ? error.message : String(error); + } + }, + { origin, stalker } + ); +} + +test('@settings @electron saves the portal cooldown preference and applies it without restart', async ({ + dataDir, +}) => { + const origin = await unusedLocalOrigin(); + let app = await launchElectronApp(dataDir, { + omitEnvKeys: ['IPTVNATOR_DISABLE_CONNECTIVITY_GUARD'], + }); + try { + await openSettings(app.mainWindow); + await openSettingsSection(app.mainWindow, 'general'); + let checkbox = app.mainWindow + .getByTestId('portal-connectivity-toggle') + .getByRole('checkbox'); + await expect(checkbox).toBeChecked(); + await requestFailure(app.mainWindow, origin); + await requestFailure(app.mainWindow, origin); + expect(await requestFailure(app.mainWindow, origin, true)).toContain( + pausedMessage + ); + + await checkbox.uncheck(); + // An unsaved edit cannot alter backend policy. + expect(await requestFailure(app.mainWindow, origin)).toContain( + pausedMessage + ); + await saveSettings(app.mainWindow); + for (const stalker of [false, true, false]) { + expect( + await requestFailure(app.mainWindow, origin, stalker) + ).toContain(stalker ? 'ECONNREFUSED' : xtreamNetworkFailure); + } + await expect( + app.mainWindow.locator('mat-snack-bar-container') + ).toBeHidden(); + await app.mainWindow + .getByTestId('portal-connectivity-setting') + .screenshot({ + path: test.info().outputPath('portal-connections.png'), + }); + + await closeElectronApp(app); + app = await launchElectronApp(dataDir, { + omitEnvKeys: ['IPTVNATOR_DISABLE_CONNECTIVITY_GUARD'], + }); + // Check the cold-start mirror before opening Settings or saving again. + for (let index = 0; index < 3; index++) { + expect(await requestFailure(app.mainWindow, origin)).toContain( + xtreamNetworkFailure + ); + } + await openSettings(app.mainWindow); + await openSettingsSection(app.mainWindow, 'general'); + checkbox = app.mainWindow + .getByTestId('portal-connectivity-toggle') + .getByRole('checkbox'); + await expect(checkbox).not.toBeChecked(); + await checkbox.check(); + await saveSettings(app.mainWindow); + expect(await requestFailure(app.mainWindow, origin)).toContain( + xtreamNetworkFailure + ); + expect(await requestFailure(app.mainWindow, origin, true)).toContain( + 'ECONNREFUSED' + ); + expect(await requestFailure(app.mainWindow, origin)).toContain( + pausedMessage + ); + await app.mainWindow.getByTestId('DARK_THEME').click(); + await saveSettings(app.mainWindow); + await expect( + app.mainWindow.locator('mat-snack-bar-container') + ).toBeHidden(); + await app.mainWindow + .getByTestId('portal-connectivity-setting') + .screenshot({ + path: test.info().outputPath('portal-connections-dark.png'), + }); + // Unrelated saves (such as theme changes) must preserve the cooldown. + expect(await requestFailure(app.mainWindow, origin)).toContain( + pausedMessage + ); + } finally { + await closeElectronApp(app); + } +}); diff --git a/apps/electron-backend/src/app/events/settings.events.spec.ts b/apps/electron-backend/src/app/events/settings.events.spec.ts index f9bae781c..65c7f459d 100644 --- a/apps/electron-backend/src/app/events/settings.events.spec.ts +++ b/apps/electron-backend/src/app/events/settings.events.spec.ts @@ -28,6 +28,7 @@ const STORE_KEYS = { MPV_PLAYER_ARGUMENTS: 'MPV_PLAYER_ARGUMENTS', MPV_REUSE_INSTANCE: 'MPV_REUSE_INSTANCE', STARTUP_WINDOW_MODE: 'STARTUP_WINDOW_MODE', + PORTAL_CONNECTIVITY_GUARD: 'PORTAL_CONNECTIVITY_GUARD', VLC_PLAYER_ARGUMENTS: 'VLC_PLAYER_ARGUMENTS', VLC_REUSE_INSTANCE: 'VLC_REUSE_INSTANCE', } as const; @@ -55,6 +56,7 @@ jest.mock('../services/store.service', () => ({ MPV_PLAYER_ARGUMENTS: STORE_KEYS.MPV_PLAYER_ARGUMENTS, MPV_REUSE_INSTANCE: STORE_KEYS.MPV_REUSE_INSTANCE, STARTUP_WINDOW_MODE: STORE_KEYS.STARTUP_WINDOW_MODE, + PORTAL_CONNECTIVITY_GUARD: STORE_KEYS.PORTAL_CONNECTIVITY_GUARD, VLC_PLAYER_ARGUMENTS: STORE_KEYS.VLC_PLAYER_ARGUMENTS, VLC_REUSE_INSTANCE: STORE_KEYS.VLC_REUSE_INSTANCE, store: { @@ -101,6 +103,37 @@ describe('SETTINGS_UPDATE', () => { consoleLogSpy.mockRestore(); }); + it('restores the persisted preference before the renderer starts', async () => { + mockStoreGet.mockReturnValue(false); + const settingsEvents = (await import('./settings.events')).default; + settingsEvents.bootstrapSettingsEvents(); + const guard = await import('../util/host-connectivity-guard'); + expect( + guard.beginGuardedHostRequest('https://portal.example') + ).toBeNull(); + settingsUpdateHandler({}, { portalConnectivityGuard: true }); + expect( + guard.beginGuardedHostRequest('https://portal.example') + ).not.toBeNull(); + expect(mockStoreSet).toHaveBeenCalledWith( + STORE_KEYS.PORTAL_CONNECTIVITY_GUARD, + true + ); + }); + + it('applies an opt-out immediately and preserves it through unrelated saves', async () => { + const guard = await import('../util/host-connectivity-guard'); + settingsUpdateHandler({}, { portalConnectivityGuard: false }); + settingsUpdateHandler({}, { showCaptions: true }); + expect( + guard.beginGuardedHostRequest('https://portal.example') + ).toBeNull(); + expect(mockStoreSet).toHaveBeenCalledWith( + STORE_KEYS.PORTAL_CONNECTIVITY_GUARD, + false + ); + }); + it('normalizes external-player arguments and preserves explicit false reuse settings', () => { settingsUpdateHandler( {}, diff --git a/apps/electron-backend/src/app/events/settings.events.ts b/apps/electron-backend/src/app/events/settings.events.ts index 5770e4483..bb32607f5 100644 --- a/apps/electron-backend/src/app/events/settings.events.ts +++ b/apps/electron-backend/src/app/events/settings.events.ts @@ -12,14 +12,19 @@ import { MPV_PLAYER_ARGUMENTS, MPV_REUSE_INSTANCE, STARTUP_WINDOW_MODE, + PORTAL_CONNECTIVITY_GUARD, store, VLC_PLAYER_ARGUMENTS, VLC_REUSE_INSTANCE, } from '../services/store.service'; import { httpServer } from '../server/http-server'; +import { setHostConnectivityGuardEnabled } from '../util/host-connectivity-guard'; export default class SettingsEvents { static bootstrapSettingsEvents(): Electron.IpcMain { + setHostConnectivityGuardEnabled( + store.get(PORTAL_CONNECTIVITY_GUARD, true) !== false + ); return ipcMain; } } @@ -30,6 +35,12 @@ ipcMain.handle('SETTINGS_UPDATE', (_event, arg) => { redactSensitiveData(arg) ); + if (arg.portalConnectivityGuard !== undefined) { + const enabled = arg.portalConnectivityGuard !== false; + store.set(PORTAL_CONNECTIVITY_GUARD, enabled); + setHostConnectivityGuardEnabled(enabled); + } + if (arg.mpvPlayerArguments !== undefined) { store.set( MPV_PLAYER_ARGUMENTS, diff --git a/apps/electron-backend/src/app/services/store.service.ts b/apps/electron-backend/src/app/services/store.service.ts index 5600c4f86..d53338efb 100644 --- a/apps/electron-backend/src/app/services/store.service.ts +++ b/apps/electron-backend/src/app/services/store.service.ts @@ -25,6 +25,9 @@ export const EMBEDDED_MPV_FRAME_COPY = 'EMBEDDED_MPV_FRAME_COPY'; */ export const STARTUP_WINDOW_MODE = 'STARTUP_WINDOW_MODE'; +/** Desktop portal request cooldown; absent means enabled. */ +export const PORTAL_CONNECTIVITY_GUARD = 'PORTAL_CONNECTIVITY_GUARD'; + /** * Extra libmpv options for embedded sessions, one "key=value" per line, as * typed in Settings > Playback. Mirrored here by the SETTINGS_UPDATE handler @@ -52,6 +55,7 @@ export type StoreType = { [EMBEDDED_MPV_EXTRA_OPTIONS]: string; [EMBEDDED_MPV_AUTO_RECONNECT]: boolean; [STARTUP_WINDOW_MODE]: StartupWindowMode; + [PORTAL_CONNECTIVITY_GUARD]: boolean; }; // Export singleton store instance diff --git a/apps/electron-backend/src/app/util/host-connectivity-guard.spec.ts b/apps/electron-backend/src/app/util/host-connectivity-guard.spec.ts index 85181baa6..2f791a9ae 100644 --- a/apps/electron-backend/src/app/util/host-connectivity-guard.spec.ts +++ b/apps/electron-backend/src/app/util/host-connectivity-guard.spec.ts @@ -9,6 +9,8 @@ import { beginGuardedHostRequest, reportGuardedHostFailure, resetHostConnectivityGuardForTests, + setHostConnectivityGuardEnabled, + reportGuardedHostSuccess, } from './host-connectivity-guard'; describe('reportGuardedHostFailure', () => { @@ -49,6 +51,62 @@ describe('reportGuardedHostFailure', () => { resetHostConnectivityGuardForTests(); }); + it('bypasses an open guard when disabled and starts fresh when re-enabled', () => { + attempt(ownFailure()); + attempt(ownFailure()); + expect(() => beginGuardedHostRequest(URL_ON_ENDPOINT)).toThrow( + HostConnectivityGuardError + ); + setHostConnectivityGuardEnabled(false); + expect(beginGuardedHostRequest(URL_ON_ENDPOINT)).toBeNull(); + setHostConnectivityGuardEnabled(true); + expect(() => beginGuardedHostRequest(URL_ON_ENDPOINT)).not.toThrow(); + attempt(ownFailure()); + expect(() => beginGuardedHostRequest(URL_ON_ENDPOINT)).not.toThrow(); + }); + + it('does not reset the guard when saving an unchanged preference', () => { + attempt(ownFailure()); + attempt(ownFailure()); + setHostConnectivityGuardEnabled(true); + expect(() => beginGuardedHostRequest(URL_ON_ENDPOINT)).toThrow( + HostConnectivityGuardError + ); + }); + + it('ignores old failures and successes after a preference transition', () => { + const oldFailure = beginGuardedHostRequest(URL_ON_ENDPOINT); + const oldSuccess = beginGuardedHostRequest(URL_ON_ENDPOINT); + setHostConnectivityGuardEnabled(false); + setHostConnectivityGuardEnabled(true); + reportGuardedHostFailure(oldFailure, ownFailure()); + reportGuardedHostFailure(oldFailure, ownFailure()); + expect(() => beginGuardedHostRequest(URL_ON_ENDPOINT)).not.toThrow(); + attempt(ownFailure()); + attempt(ownFailure()); + reportGuardedHostSuccess(oldSuccess); + expect(() => beginGuardedHostRequest(URL_ON_ENDPOINT)).toThrow( + HostConnectivityGuardError + ); + }); + + it('keeps the environment disable switch authoritative', () => { + const original = process.env.IPTVNATOR_DISABLE_CONNECTIVITY_GUARD; + process.env.IPTVNATOR_DISABLE_CONNECTIVITY_GUARD = '1'; + try { + setHostConnectivityGuardEnabled(true); + attempt(ownFailure()); + attempt(ownFailure()); + expect(() => + beginGuardedHostRequest(URL_ON_ENDPOINT) + ).not.toThrow(); + } finally { + if (original === undefined) + delete process.env.IPTVNATOR_DISABLE_CONNECTIVITY_GUARD; + else process.env.IPTVNATOR_DISABLE_CONNECTIVITY_GUARD = original; + } + }); + it('does not charge a same-origin redirect hop to the guarded endpoint', () => { // `/player_api.php` -> 302 -> `/slow/player_api.php` on the same origin: // the origin answered, so its record must clear even though the failing diff --git a/apps/electron-backend/src/app/util/host-connectivity-guard.ts b/apps/electron-backend/src/app/util/host-connectivity-guard.ts index 52c713244..2b0289a7b 100644 --- a/apps/electron-backend/src/app/util/host-connectivity-guard.ts +++ b/apps/electron-backend/src/app/util/host-connectivity-guard.ts @@ -22,6 +22,16 @@ export { HostConnectivityGuardError }; export type { HostRequestToken }; let sharedGuard: HostConnectivityGuard | null = null; +let enabled = true; +let currentTokens = new WeakSet(); + +/** Apply a saved desktop preference without letting old requests affect a new guard. */ +export function setHostConnectivityGuardEnabled(value: boolean): void { + if (enabled === value) return; + enabled = value; + sharedGuard = null; + currentTokens = new WeakSet(); +} /** The guard both portal IPC handlers share. */ export function getHostConnectivityGuard(): HostConnectivityGuard { @@ -40,6 +50,8 @@ export function getHostConnectivityGuard(): HostConnectivityGuard { /** Test seam: forgets the shared guard so each spec starts clean. */ export function resetHostConnectivityGuardForTests(): void { + enabled = true; + currentTokens = new WeakSet(); sharedGuard = null; } @@ -53,7 +65,7 @@ export function resetHostConnectivityGuardForTests(): void { */ export function beginGuardedHostRequest(url: string): HostRequestToken | null { const endpoint = portalEndpointKeyOf(url); - if (!endpoint) { + if (!endpoint || !enabled) { return null; } @@ -62,6 +74,7 @@ export function beginGuardedHostRequest(url: string): HostRequestToken | null { throw new HostConnectivityGuardError(endpoint); } + currentTokens.add(check.token); return check.token; } @@ -70,11 +83,14 @@ export function observeGuardedHostRequest( url: string ): HostRequestToken | null { const endpoint = portalEndpointKeyOf(url); - return endpoint ? getHostConnectivityGuard().observe(endpoint) : null; + if (!endpoint || !enabled) return null; + const token = getHostConnectivityGuard().observe(endpoint); + currentTokens.add(token); + return token; } export function reportGuardedHostSuccess(token: HostRequestToken | null): void { - if (token) { + if (token && currentTokens.has(token)) { getHostConnectivityGuard().reportSuccess(token); } } @@ -91,7 +107,7 @@ export function reportGuardedHostFailure( error: unknown, options: { countFailures?: boolean; requestUrl?: string } = {} ): void { - if (!token) { + if (!token || !currentTokens.has(token)) { return; } diff --git a/apps/web/src/app/settings/settings-form.utils.spec.ts b/apps/web/src/app/settings/settings-form.utils.spec.ts index de8010dc2..283733ae3 100644 --- a/apps/web/src/app/settings/settings-form.utils.spec.ts +++ b/apps/web/src/app/settings/settings-form.utils.spec.ts @@ -8,6 +8,16 @@ import { describe('settings form utils — strip country prefix', () => { const formBuilder = new FormBuilder(); + it('defaults portal request pauses on and preserves an explicit opt-out', () => { + const form = createSettingsForm(new FormBuilder(), true); + expect(form.get('portalConnectivityGuard')?.value).toBe(true); + form.patchValue({ portalConnectivityGuard: false }); + expect( + createSettingsFromFormValue(form, {} as Settings) + .portalConnectivityGuard + ).toBe(false); + }); + it('defaults the form control to false', () => { const form = createSettingsForm(formBuilder, true); diff --git a/apps/web/src/app/settings/settings-form.utils.ts b/apps/web/src/app/settings/settings-form.utils.ts index e689bd9e9..7cc11b783 100644 --- a/apps/web/src/app/settings/settings-form.utils.ts +++ b/apps/web/src/app/settings/settings-form.utils.ts @@ -107,6 +107,7 @@ export function createSettingsForm( embeddedMpvFrameCopy: false, embeddedMpvExtraOptions: ['', [embeddedMpvExtraOptionsValidator]], embeddedMpvAutoReconnect: true, + portalConnectivityGuard: true, coverSize: 'medium' as CoverSize, ...(supportsEpg ? { @@ -195,6 +196,7 @@ export function createSettingsFromFormValue( value.embeddedMpvExtraOptions ), embeddedMpvAutoReconnect: value.embeddedMpvAutoReconnect ?? true, + portalConnectivityGuard: value.portalConnectivityGuard !== false, coverSize: value.coverSize ?? 'medium', epgUrl, preferUploadedEpgOverXtream: diff --git a/apps/web/src/app/settings/settings-general-section.component.html b/apps/web/src/app/settings/settings-general-section.component.html index 897fe7451..f50b4e60e 100644 --- a/apps/web/src/app/settings/settings-general-section.component.html +++ b/apps/web/src/app/settings/settings-general-section.component.html @@ -1,8 +1,4 @@ -
+
settings @@ -204,3 +200,48 @@
+@if (supportsPortalConnectivityGuard()) { +
+
+
+ hub +
+
+

{{ 'SETTINGS.PORTAL_CONNECTIONS' | translate }}

+
+
+
+
+

+ {{ 'SETTINGS.PORTAL_CONNECTIVITY_GUARD' | translate }} +

+

+ {{ + 'SETTINGS.PORTAL_CONNECTIVITY_GUARD_DESCRIPTION' + | translate + }} +

+ @if (form().get('portalConnectivityGuard')?.value === false) { +

+ {{ + 'SETTINGS.PORTAL_CONNECTIVITY_GUARD_DISABLED' + | translate + }} +

+ } +
+
+ +
+
+
+} diff --git a/apps/web/src/app/settings/settings-general-section.component.ts b/apps/web/src/app/settings/settings-general-section.component.ts index f03f1dbca..ae6a9a4a8 100644 --- a/apps/web/src/app/settings/settings-general-section.component.ts +++ b/apps/web/src/app/settings/settings-general-section.component.ts @@ -39,6 +39,7 @@ export class SettingsGeneralSectionComponent { input.required(); /** Desktop only: the window-mode select needs the main-process mirror and F11 */ readonly supportsStartupWindowMode = input(false); + readonly supportsPortalConnectivityGuard = input(false); readonly selectTheme = output(); readonly selectCoverSize = output(); diff --git a/apps/web/src/app/settings/settings.component.form.spec.ts b/apps/web/src/app/settings/settings.component.form.spec.ts index 110c575b9..fed7a1a91 100644 --- a/apps/web/src/app/settings/settings.component.form.spec.ts +++ b/apps/web/src/app/settings/settings.component.form.spec.ts @@ -59,6 +59,40 @@ describe('SettingsComponent form', () => { window.electron = originalElectron; }); + it('stages the desktop portal pause setting until Save', async () => { + const checkbox = (fixture.nativeElement as HTMLElement).querySelector( + '[data-test-id="portal-connectivity-toggle"] input' + ) as HTMLInputElement; + expect(checkbox).not.toBeNull(); + expect(checkbox.checked).toBe(true); + checkbox.click(); + fixture.detectChanges(); + expect( + component.settingsForm.get('portalConnectivityGuard')?.value + ).toBe(false); + expect(window.electron.updateSettings).not.toHaveBeenCalled(); + component.form.hydrateFromStore(); + fixture.detectChanges(); + expect(checkbox.checked).toBe(true); + checkbox.click(); + await component.form.save(() => undefined); + expect(window.electron.updateSettings).toHaveBeenCalledWith( + expect.objectContaining({ portalConnectivityGuard: false }) + ); + }); + + it('hides the portal pause setting when the desktop bridge is unavailable', () => { + fixture.destroy(); + window.electron = undefined; + fixture = TestBed.createComponent(SettingsComponent); + fixture.detectChanges(); + expect( + (fixture.nativeElement as HTMLElement).querySelector( + '[data-test-id="portal-connectivity-setting"]' + ) + ).toBeNull(); + }); + describe('Get and set settings on component init', () => { const settings = { language: Language.GERMAN, diff --git a/apps/web/src/app/settings/settings.component.html b/apps/web/src/app/settings/settings.component.html index 60e62513f..8b69c6fa5 100644 --- a/apps/web/src/app/settings/settings.component.html +++ b/apps/web/src/app/settings/settings.component.html @@ -111,6 +111,9 @@ [coverSizeOptions]="coverSizeOptions" [startupBehaviorOptions]="startupBehaviorOptions" [startupWindowModeOptions]="startupWindowModeOptions" + [supportsPortalConnectivityGuard]=" + supportsPortalConnectivityGuard + " [supportsStartupWindowMode]="supportsStartupWindowMode" (selectTheme)="form.selectTheme($event)" (selectCoverSize)="form.selectCoverSize($event)" diff --git a/apps/web/src/app/settings/settings.component.ts b/apps/web/src/app/settings/settings.component.ts index babf5c56f..8e1891377 100644 --- a/apps/web/src/app/settings/settings.component.ts +++ b/apps/web/src/app/settings/settings.component.ts @@ -142,6 +142,8 @@ export class SettingsComponent readonly supportsVodMultiSource = this.vodSourceDiscovery.isAvailable; readonly supportsRemoteControl = this.runtime.supportsRemoteControl; readonly supportsStartupWindowMode = this.runtime.supportsStartupWindowMode; + readonly supportsPortalConnectivityGuard = + this.runtime.supportsPortalConnectivityGuard; /** Settings form object */ readonly settingsForm = this.form.form; diff --git a/apps/web/src/app/settings/test-stubs/settings-test-harness.stub.ts b/apps/web/src/app/settings/test-stubs/settings-test-harness.stub.ts index d4875a837..5627c742b 100644 --- a/apps/web/src/app/settings/test-stubs/settings-test-harness.stub.ts +++ b/apps/web/src/app/settings/test-stubs/settings-test-harness.stub.ts @@ -112,6 +112,7 @@ export const DEFAULT_SETTINGS = { embeddedMpvFrameCopy: false, embeddedMpvExtraOptions: '', embeddedMpvAutoReconnect: true, + portalConnectivityGuard: true, coverSize: 'medium', dashboardRails: DEFAULT_DASHBOARD_RAILS, preferUploadedEpgOverXtream: false, @@ -222,6 +223,9 @@ export function createEpgBridgeStub(): Partial { /** The full desktop bridge the settings page expects to be present */ export function createElectronStub(): typeof window.electron { return { + resetHostConnectivityGuard: jest + .fn() + .mockResolvedValue({ success: true }), checkEpgFreshness: jest.fn().mockResolvedValue({ freshUrls: [], staleUrls: [], diff --git a/apps/web/src/assets/i18n/ar.json b/apps/web/src/assets/i18n/ar.json index 4e33d4818..3d636b102 100644 --- a/apps/web/src/assets/i18n/ar.json +++ b/apps/web/src/assets/i18n/ar.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "اتصالات البوابات", + "PORTAL_CONNECTIVITY_GUARD": "إيقاف الطلبات إلى البوابات غير المتاحة مؤقتًا", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "بعد تكرار فشل الاتصال، تُوقف طلبات Xtream وStalker الجديدة لمدة 30 ثانية. جرّب تعطيل هذا الخيار إذا كانت البوابة تصبح غير متاحة بشكل متقطع. يُطبّق بعد الحفظ دون إعادة التشغيل.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "سيُنفّذ كل طلب بشكل مستقل. قد يستغرق ظهور الخطأ وقتًا أطول عند عدم توفر الخادم.", "TITLE": "الإعدادات", "GENERAL": "عام", "GENERAL_SUBTITLE": "تغيير تكوين التطبيق", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "الطلبات متوقفة مؤقتًا", + "DESCRIPTION": "أُوقفت الطلبات بعد تكرار فشل الاتصال. أعد المحاولة للاتصال بالبوابة فورًا.", + "RETRY": "إعادة المحاولة الآن" + }, "ALL_CATEGORIES": "جميع الفئات", "MY_FAVORITES": "المفضلة", "ADD_TO_FAVORITES": "إضافة للمفضلة", diff --git a/apps/web/src/assets/i18n/ary.json b/apps/web/src/assets/i18n/ary.json index 7ff2c5f33..32cf398a1 100644 --- a/apps/web/src/assets/i18n/ary.json +++ b/apps/web/src/assets/i18n/ary.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "الاتصال بالبوابات", + "PORTAL_CONNECTIVITY_GUARD": "وقّف مؤقتاً الطلبات للبوابات اللي ما متاحاش", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "من بعد ما يفشل الاتصال عدة مرات، كيوقف طلبات Xtream وStalker الجديدة لمدة 30 ثانية. جرّب تطفي هاد الخيار إلا كانت البوابة كتقطع مرة مرة. كيتطبق من بعد الحفظ بلا إعادة التشغيل.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "كل طلب غادي يتنفذ بوحدو. إلا كان السيرفر ما متاحش، رسالة الخطأ تقدر تتأخر.", "TITLE": "الإعدادات", "GENERAL": "عام", "GENERAL_SUBTITLE": "بدل تكوين التطبيق", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "الطلبات موقوفة مؤقتاً", + "DESCRIPTION": "توقفات الطلبات من بعد ما فشل الاتصال عدة مرات. عاود جرّب باش تتاصل بالبوابة دابا.", + "RETRY": "عاود جرّب دابا" + }, "ALL_CATEGORIES": "جميع الفئات", "MY_FAVORITES": "المفضلة ديالي", "ADD_TO_FAVORITES": "زيد للمفضلة", diff --git a/apps/web/src/assets/i18n/by.json b/apps/web/src/assets/i18n/by.json index af8641217..77f57d576 100644 --- a/apps/web/src/assets/i18n/by.json +++ b/apps/web/src/assets/i18n/by.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Падключэнне да парталаў", + "PORTAL_CONNECTIVITY_GUARD": "Прыпыняць запыты да недаступных парталаў", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Пасля паўторных памылак падключэння прыпыняць новыя запыты Xtream і Stalker на 30 секунд. Паспрабуйце выключыць, калі партал перыядычна становіцца недаступным. Ужываецца пасля захавання без перазапуску.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Кожны запыт будзе выконвацца незалежна. Калі сервер недаступны, чаканне памылкі можа павялічыцца.", "TITLE": "Налады", "GENERAL": "Агульныя", "GENERAL_SUBTITLE": "Змяніце канфігурацыю праграмы", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Запыты часова прыпынены", + "DESCRIPTION": "Запыты прыпынены пасля паўторных памылак падключэння. Паўтарыце спробу, каб звярнуцца да партала зараз.", + "RETRY": "Паўтарыць зараз" + }, "ALL_CATEGORIES": "Усе катэгорыі", "MY_FAVORITES": "Выбранае", "ADD_TO_FAVORITES": "Дадаць у выбранае", diff --git a/apps/web/src/assets/i18n/de.json b/apps/web/src/assets/i18n/de.json index 4ad91e64a..224cd854f 100644 --- a/apps/web/src/assets/i18n/de.json +++ b/apps/web/src/assets/i18n/de.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Portalverbindungen", + "PORTAL_CONNECTIVITY_GUARD": "Anfragen an nicht erreichbare Portale pausieren", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Nach wiederholten Verbindungsfehlern neue Xtream- und Stalker-Anfragen 30 Sekunden pausieren. Bei zeitweise nicht erreichbaren Portalen versuchsweise deaktivieren. Gilt nach dem Speichern ohne Neustart.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Jede Anfrage wird unabhängig ausgeführt. Bei nicht erreichbaren Servern kann die Fehlermeldung länger dauern.", "TITLE": "Einstellungen", "GENERAL": "Allgemein", "GENERAL_SUBTITLE": "Allgemeine App-Einstellungen ändern", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Anfragen vorübergehend pausiert", + "DESCRIPTION": "Anfragen wurden nach wiederholten Verbindungsfehlern pausiert. Jetzt erneut versuchen, um das Portal sofort zu kontaktieren.", + "RETRY": "Jetzt erneut versuchen" + }, "ALL_CATEGORIES": "Alle Kategorien", "MY_FAVORITES": "Meine Favoriten", "ADD_TO_FAVORITES": "Zu den Favoriten hinzufügen", diff --git a/apps/web/src/assets/i18n/el.json b/apps/web/src/assets/i18n/el.json index d379e9dcb..ead1eba01 100644 --- a/apps/web/src/assets/i18n/el.json +++ b/apps/web/src/assets/i18n/el.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Συνδέσεις πυλών", + "PORTAL_CONNECTIVITY_GUARD": "Παύση αιτημάτων προς μη διαθέσιμες πύλες", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Μετά από επανειλημμένα σφάλματα σύνδεσης, παύση νέων αιτημάτων Xtream και Stalker για 30 δευτερόλεπτα. Δοκιμάστε να το απενεργοποιήσετε αν μια πύλη είναι κατά διαστήματα μη διαθέσιμη. Ισχύει μετά την αποθήκευση, χωρίς επανεκκίνηση.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Κάθε αίτημα εκτελείται ανεξάρτητα. Οι μη διαθέσιμοι διακομιστές μπορεί να αργούν περισσότερο να αναφέρουν σφάλμα.", "TITLE": "Ρυθμίσεις", "GENERAL": "Γενικά", "GENERAL_SUBTITLE": "Αλλαγή της διαμόρφωσης της εφαρμογής", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Τα αιτήματα έχουν παύσει προσωρινά", + "DESCRIPTION": "Τα αιτήματα σταμάτησαν μετά από επανειλημμένα σφάλματα σύνδεσης. Δοκιμάστε ξανά για άμεση επικοινωνία με την πύλη.", + "RETRY": "Νέα προσπάθεια τώρα" + }, "ALL_CATEGORIES": "Όλες οι κατηγορίες", "MY_FAVORITES": "Τα αγαπημένα μου", "ADD_TO_FAVORITES": "Προσθήκη στα αγαπημένα", diff --git a/apps/web/src/assets/i18n/en.json b/apps/web/src/assets/i18n/en.json index 0464b6b39..432955f05 100644 --- a/apps/web/src/assets/i18n/en.json +++ b/apps/web/src/assets/i18n/en.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Portal connections", + "PORTAL_CONNECTIVITY_GUARD": "Pause requests to unavailable portals", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "After repeated connection failures, pause new Xtream and Stalker requests for 30 seconds. Try disabling this if a portal becomes unavailable intermittently. Applies after saving, without restarting.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Each request will run independently. Unavailable servers may take longer to report an error.", "TITLE": "Settings", "GENERAL": "General", "GENERAL_SUBTITLE": "Change the configuration of the application", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Requests temporarily paused", + "DESCRIPTION": "Requests were paused after repeated connection failures. Retry now to contact the portal immediately.", + "RETRY": "Retry now" + }, "ALL_CATEGORIES": "All categories", "MY_FAVORITES": "My favorites", "ADD_TO_FAVORITES": "Add to favorites", diff --git a/apps/web/src/assets/i18n/es.json b/apps/web/src/assets/i18n/es.json index 09161cf36..29d9bc536 100644 --- a/apps/web/src/assets/i18n/es.json +++ b/apps/web/src/assets/i18n/es.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Conexiones a portales", + "PORTAL_CONNECTIVITY_GUARD": "Pausar solicitudes a portales no disponibles", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Tras varios fallos de conexión, pausar las nuevas solicitudes de Xtream y Stalker durante 30 segundos. Prueba a desactivarlo si un portal deja de estar disponible de forma intermitente. Se aplica al guardar, sin reiniciar.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Cada solicitud se ejecutará de forma independiente. Los servidores no disponibles pueden tardar más en mostrar un error.", "TITLE": "Ajustes", "GENERAL": "General", "GENERAL_SUBTITLE": "Cambia la configuracion general de la aplicacion", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Solicitudes pausadas temporalmente", + "DESCRIPTION": "Las solicitudes se pausaron tras varios fallos de conexión. Reintenta para contactar con el portal inmediatamente.", + "RETRY": "Reintentar ahora" + }, "ALL_CATEGORIES": "Todas las categorías", "MY_FAVORITES": "Mis favoritos", "ADD_TO_FAVORITES": "Agregar a los favoritos", diff --git a/apps/web/src/assets/i18n/fr.json b/apps/web/src/assets/i18n/fr.json index 38f22a43f..524b76070 100644 --- a/apps/web/src/assets/i18n/fr.json +++ b/apps/web/src/assets/i18n/fr.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Connexions aux portails", + "PORTAL_CONNECTIVITY_GUARD": "Suspendre les requêtes aux portails indisponibles", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Après plusieurs échecs de connexion, suspendre les nouvelles requêtes Xtream et Stalker pendant 30 secondes. Essayez de désactiver cette option si un portail devient indisponible par intermittence. Prend effet après enregistrement, sans redémarrage.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Chaque requête sera exécutée indépendamment. Les serveurs indisponibles peuvent mettre plus de temps à signaler une erreur.", "TITLE": "Paramètres", "GENERAL": "Général", "GENERAL_SUBTITLE": "Modifier la configuration de l'application", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Requêtes temporairement suspendues", + "DESCRIPTION": "Les requêtes ont été suspendues après plusieurs échecs de connexion. Réessayez pour contacter le portail immédiatement.", + "RETRY": "Réessayer maintenant" + }, "ALL_CATEGORIES": "Toutes les catégories", "MY_FAVORITES": "Mes favoris", "ADD_TO_FAVORITES": "Ajouter aux favoris", diff --git a/apps/web/src/assets/i18n/hu.json b/apps/web/src/assets/i18n/hu.json index 5694503ad..24a6d9828 100644 --- a/apps/web/src/assets/i18n/hu.json +++ b/apps/web/src/assets/i18n/hu.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Portálkapcsolatok", + "PORTAL_CONNECTIVITY_GUARD": "Kérések szüneteltetése az elérhetetlen portálokhoz", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Ismételt kapcsolódási hibák után az új Xtream- és Stalker-kérések szüneteltetése 30 másodpercre. Ha egy portál időnként elérhetetlenné válik, próbálja kikapcsolni. Mentés után, újraindítás nélkül érvényesül.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Minden kérés önállóan fut. Elérhetetlen szervereknél a hiba megjelenése tovább tarthat.", "TITLE": "Beállítások", "GENERAL": "Általános", "GENERAL_SUBTITLE": "Az alkalmazás beállításainak módosítása", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Kérések átmenetileg szüneteltetve", + "DESCRIPTION": "A kérések ismételt kapcsolódási hibák után szünetelnek. Próbálja újra a portál azonnali eléréséhez.", + "RETRY": "Újrapróbálkozás most" + }, "ALL_CATEGORIES": "Összes kategória", "MY_FAVORITES": "Saját kedvencek", "ADD_TO_FAVORITES": "Hozzáadás a kedvencekhez", diff --git a/apps/web/src/assets/i18n/it.json b/apps/web/src/assets/i18n/it.json index 94b15d7f4..5809d7a18 100644 --- a/apps/web/src/assets/i18n/it.json +++ b/apps/web/src/assets/i18n/it.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Connessioni ai portali", + "PORTAL_CONNECTIVITY_GUARD": "Sospendi le richieste ai portali non disponibili", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Dopo ripetuti errori di connessione, sospendi le nuove richieste Xtream e Stalker per 30 secondi. Prova a disattivare se un portale diventa intermittentemente non disponibile. Si applica al salvataggio, senza riavvio.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Ogni richiesta verrà eseguita indipendentemente. I server non disponibili potrebbero impiegare più tempo a segnalare un errore.", "TITLE": "Impostazioni IPTVnator", "GENERAL": "Generale", "GENERAL_SUBTITLE": "Modifica le impostazioni generali dell'applicazione", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Richieste temporaneamente sospese", + "DESCRIPTION": "Le richieste sono state sospese dopo ripetuti errori di connessione. Riprova per contattare subito il portale.", + "RETRY": "Riprova ora" + }, "ALL_CATEGORIES": "Tutte le categorie", "MY_FAVORITES": "I miei preferiti", "ADD_TO_FAVORITES": "Aggiungi ai preferiti", diff --git a/apps/web/src/assets/i18n/ja.json b/apps/web/src/assets/i18n/ja.json index a7b8c555f..18f3dc14d 100644 --- a/apps/web/src/assets/i18n/ja.json +++ b/apps/web/src/assets/i18n/ja.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "ポータル接続", + "PORTAL_CONNECTIVITY_GUARD": "利用できないポータルへのリクエストを一時停止", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "接続エラーが繰り返された場合、新しい Xtream と Stalker のリクエストを30秒間停止します。ポータルが断続的に利用できなくなる場合は、無効にしてみてください。保存後、再起動せずに適用されます。", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "各リクエストは個別に実行されます。サーバーが利用できない場合、エラーの表示に時間がかかることがあります。", "TITLE": "設定", "GENERAL": "一般", "GENERAL_SUBTITLE": "アプリケーションの設定を変更", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "リクエストを一時停止中", + "DESCRIPTION": "接続エラーが繰り返されたため、リクエストを停止しました。今すぐ再試行すると、ポータルに直ちに接続します。", + "RETRY": "今すぐ再試行" + }, "ALL_CATEGORIES": "すべてのカテゴリー", "MY_FAVORITES": "お気に入り", "ADD_TO_FAVORITES": "お気に入りに追加", diff --git a/apps/web/src/assets/i18n/ko.json b/apps/web/src/assets/i18n/ko.json index 120b074e8..c43a4cc8f 100644 --- a/apps/web/src/assets/i18n/ko.json +++ b/apps/web/src/assets/i18n/ko.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "포털 연결", + "PORTAL_CONNECTIVITY_GUARD": "사용할 수 없는 포털에 대한 요청 일시 중지", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "연결 오류가 반복되면 새 Xtream 및 Stalker 요청을 30초 동안 중지합니다. 포털을 간헐적으로 사용할 수 없다면 이 옵션을 꺼 보세요. 저장 후 재시작 없이 적용됩니다.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "각 요청이 독립적으로 실행됩니다. 서버를 사용할 수 없으면 오류가 표시되기까지 더 오래 걸릴 수 있습니다.", "TITLE": "설정", "GENERAL": "일반", "GENERAL_SUBTITLE": "애플리케이션 구성을 변경합니다", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "요청이 일시 중지됨", + "DESCRIPTION": "연결 오류가 반복되어 요청이 중지되었습니다. 지금 다시 시도하여 포털에 즉시 연결하세요.", + "RETRY": "지금 다시 시도" + }, "ALL_CATEGORIES": "모든 카테고리", "MY_FAVORITES": "내가 좋아하는 것들", "ADD_TO_FAVORITES": "즐겨 찾기에 추가", diff --git a/apps/web/src/assets/i18n/nl.json b/apps/web/src/assets/i18n/nl.json index 1070bdc97..8ea848b18 100644 --- a/apps/web/src/assets/i18n/nl.json +++ b/apps/web/src/assets/i18n/nl.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Portalverbindingen", + "PORTAL_CONNECTIVITY_GUARD": "Verzoeken aan onbereikbare portals pauzeren", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Pauzeer nieuwe Xtream- en Stalker-verzoeken 30 seconden na herhaalde verbindingsfouten. Probeer dit uit te schakelen als een portal af en toe onbereikbaar is. Geldt na opslaan, zonder herstart.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Elk verzoek wordt onafhankelijk uitgevoerd. Bij onbereikbare servers kan een foutmelding langer duren.", "TITLE": "Instellingen", "GENERAL": "Algemeen", "GENERAL_SUBTITLE": "Wijzig de configuratie van de applicatie", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Verzoeken tijdelijk gepauzeerd", + "DESCRIPTION": "Verzoeken zijn gepauzeerd na herhaalde verbindingsfouten. Probeer opnieuw om de portal direct te bereiken.", + "RETRY": "Nu opnieuw proberen" + }, "ALL_CATEGORIES": "Alle categorieën", "MY_FAVORITES": "Mijn favorieten", "ADD_TO_FAVORITES": "Voeg toe aan favorieten", diff --git a/apps/web/src/assets/i18n/pl.json b/apps/web/src/assets/i18n/pl.json index ca75a2d34..12df20fc4 100644 --- a/apps/web/src/assets/i18n/pl.json +++ b/apps/web/src/assets/i18n/pl.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Połączenia z portalami", + "PORTAL_CONNECTIVITY_GUARD": "Wstrzymuj żądania do niedostępnych portali", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Po powtarzających się błędach połączenia wstrzymuj nowe żądania Xtream i Stalker na 30 sekund. Spróbuj wyłączyć, jeśli portal bywa niedostępny. Zmiana działa po zapisaniu, bez ponownego uruchomienia.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Każde żądanie będzie wykonywane niezależnie. Niedostępne serwery mogą zgłaszać błąd z większym opóźnieniem.", "TITLE": "Ustawienia", "GENERAL": "Ogólne", "GENERAL_SUBTITLE": "Zmień konfigurację aplikacji", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Żądania tymczasowo wstrzymane", + "DESCRIPTION": "Żądania wstrzymano po powtarzających się błędach połączenia. Ponów próbę, aby natychmiast połączyć się z portalem.", + "RETRY": "Ponów teraz" + }, "ALL_CATEGORIES": "Wszystkie kategorie", "MY_FAVORITES": "Moje ulubione", "ADD_TO_FAVORITES": "Dodaj do ulubionych", diff --git a/apps/web/src/assets/i18n/pt.json b/apps/web/src/assets/i18n/pt.json index 70a33ef7b..550d63356 100644 --- a/apps/web/src/assets/i18n/pt.json +++ b/apps/web/src/assets/i18n/pt.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Ligações aos portais", + "PORTAL_CONNECTIVITY_GUARD": "Pausar pedidos a portais indisponíveis", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Após falhas repetidas de ligação, pausar novos pedidos Xtream e Stalker durante 30 segundos. Experimente desativar se um portal ficar indisponível de forma intermitente. Aplica-se ao guardar, sem reiniciar.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Cada pedido será executado de forma independente. Os servidores indisponíveis podem demorar mais a indicar um erro.", "TITLE": "Configurações", "GENERAL": "Geral", "GENERAL_SUBTITLE": "Altere a configuração do aplicativo", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Pedidos temporariamente pausados", + "DESCRIPTION": "Os pedidos foram pausados após falhas repetidas de ligação. Tente novamente para contactar o portal imediatamente.", + "RETRY": "Tentar novamente agora" + }, "ALL_CATEGORIES": "Todas as categorias", "MY_FAVORITES": "Meus favoritos", "ADD_TO_FAVORITES": "Adicionar aos favoritos", diff --git a/apps/web/src/assets/i18n/ru.json b/apps/web/src/assets/i18n/ru.json index 77768e2a2..d4eaf73f6 100644 --- a/apps/web/src/assets/i18n/ru.json +++ b/apps/web/src/assets/i18n/ru.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Подключение к порталам", + "PORTAL_CONNECTIVITY_GUARD": "Приостанавливать запросы к недоступным порталам", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "После повторных ошибок подключения приостанавливать новые запросы Xtream и Stalker на 30 секунд. Попробуйте отключить, если портал периодически становится недоступен. Применяется после сохранения без перезапуска.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Каждый запрос будет выполняться независимо. Если сервер недоступен, ожидание ошибки может увеличиться.", "TITLE": "Настройки", "GENERAL": "Общие", "GENERAL_SUBTITLE": "Изменение основных параметров приложения", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "Запросы временно приостановлены", + "DESCRIPTION": "Запросы приостановлены после повторных ошибок подключения. Повторите попытку, чтобы обратиться к порталу сейчас.", + "RETRY": "Повторить сейчас" + }, "ALL_CATEGORIES": "Все категории", "MY_FAVORITES": "Мои избранные", "ADD_TO_FAVORITES": "Добавить в избранное", diff --git a/apps/web/src/assets/i18n/tr.json b/apps/web/src/assets/i18n/tr.json index 7c21b8ccb..8f8f17907 100644 --- a/apps/web/src/assets/i18n/tr.json +++ b/apps/web/src/assets/i18n/tr.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "Portal bağlantıları", + "PORTAL_CONNECTIVITY_GUARD": "Kullanılamayan portallara istekleri duraklat", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "Tekrarlanan bağlantı hatalarından sonra yeni Xtream ve Stalker isteklerini 30 saniye duraklatır. Portal zaman zaman kullanılamıyorsa kapatmayı deneyin. Kaydettikten sonra yeniden başlatmadan uygulanır.", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "Her istek bağımsız yürütülür. Kullanılamayan sunucularda hata bildirimi daha uzun sürebilir.", "TITLE": "Ayarlar", "GENERAL": "Genel", "GENERAL_SUBTITLE": "Uygulamanın yapılandırmasını değiştirin", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "İstekler geçici olarak duraklatıldı", + "DESCRIPTION": "Tekrarlanan bağlantı hatalarından sonra istekler duraklatıldı. Portala hemen bağlanmak için yeniden deneyin.", + "RETRY": "Şimdi yeniden dene" + }, "ALL_CATEGORIES": "Tüm kategoriler", "MY_FAVORITES": "Favorilerim", "ADD_TO_FAVORITES": "Favorilere ekle", diff --git a/apps/web/src/assets/i18n/zh.json b/apps/web/src/assets/i18n/zh.json index 466b15dea..ce1919afa 100644 --- a/apps/web/src/assets/i18n/zh.json +++ b/apps/web/src/assets/i18n/zh.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "门户连接", + "PORTAL_CONNECTIVITY_GUARD": "暂停向不可用门户发送请求", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "连接连续失败后,暂停新的 Xtream 和 Stalker 请求 30 秒。如果门户间歇性不可用,请尝试关闭此选项。保存后生效,无需重启。", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "每个请求将独立执行。服务器不可用时,可能需要更长时间才能显示错误。", "TITLE": "设置", "GENERAL": "通用", "GENERAL_SUBTITLE": "更改应用程序的配置", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "请求已暂时暂停", + "DESCRIPTION": "连接连续失败后,请求已暂停。立即重试以重新连接门户。", + "RETRY": "立即重试" + }, "ALL_CATEGORIES": "所有分类", "MY_FAVORITES": "我的收藏", "ADD_TO_FAVORITES": "添加到收藏夹", diff --git a/apps/web/src/assets/i18n/zhtw.json b/apps/web/src/assets/i18n/zhtw.json index 7f277bf24..d5707cc40 100644 --- a/apps/web/src/assets/i18n/zhtw.json +++ b/apps/web/src/assets/i18n/zhtw.json @@ -244,6 +244,10 @@ } }, "SETTINGS": { + "PORTAL_CONNECTIONS": "入口網站連線", + "PORTAL_CONNECTIVITY_GUARD": "暫停向無法使用的入口網站傳送請求", + "PORTAL_CONNECTIVITY_GUARD_DESCRIPTION": "連線連續失敗後,暫停新的 Xtream 和 Stalker 請求 30 秒。如果入口網站間歇性無法使用,請嘗試關閉此選項。儲存後生效,無需重新啟動。", + "PORTAL_CONNECTIVITY_GUARD_DISABLED": "每個請求將獨立執行。伺服器無法使用時,可能需要更長時間才能顯示錯誤。", "TITLE": "設定", "GENERAL": "一般", "GENERAL_SUBTITLE": "更改應用程式的配置", @@ -1002,6 +1006,11 @@ } }, "PORTALS": { + "REQUESTS_PAUSED": { + "TITLE": "請求已暫時暫停", + "DESCRIPTION": "連線連續失敗後,請求已暫停。立即重試以重新連線至入口網站。", + "RETRY": "立即重試" + }, "ALL_CATEGORIES": "所有類別", "MY_FAVORITES": "我的最愛", "ADD_TO_FAVORITES": "新增至最愛", diff --git a/docs/architecture/host-connectivity-guard.md b/docs/architecture/host-connectivity-guard.md index 3ee0f8ba9..63f9a0190 100644 --- a/docs/architecture/host-connectivity-guard.md +++ b/docs/architecture/host-connectivity-guard.md @@ -69,6 +69,35 @@ timeouts but not the breaker, deliberately: idle-based, see above — which outlives the 45 s half-open trial expiry and would let a second trial in behind the first. +## Desktop preference and account feedback + +Settings > General > Portal connections offers **Pause requests to unavailable +portals**, enabled by default. `Settings.portalConnectivityGuard` is default-on +for missing or non-boolean legacy values; only explicit `false` opts out. The +form stages edits until Save and persists the choice through the normal settings +store. `SETTINGS_UPDATE` mirrors it to Electron's `PORTAL_CONNECTIVITY_GUARD` +config key and applies it immediately. `SettingsEvents.bootstrapSettingsEvents` +loads that mirror before the renderer is loaded, so a saved opt-out already +applies to the first portal request after restarting. + +The preference controls both Xtream and Stalker. A real preference transition +replaces the Electron guard and its weak set of admitted request tokens, clearing +existing cooldowns and ignoring completions from the old generation. Disabled +requests return no token and cannot contribute failures when the user re-enables +the guard. Saving an unchanged value preserves existing evidence. +`IPTVNATOR_DISABLE_CONNECTIVITY_GUARD=1` (or `true`) still overrides an enabled +preference. The UI is capability-gated by `supportsPortalConnectivityGuard` +(`updateSettings` plus `resetHostConnectivityGuard`); the PWA has no client-side +switch for its shared server-wide guard. + +Both account-info dialogs classify the existing cross-process guard message and +show a localized **Requests temporarily paused** explanation with **Retry now**. +Stalker keeps cached account data visible and offers the same retry beside the +paused refresh notice. Retry resets before requesting again; actual network +failures retain the generic unavailable state. These notices describe the last +request outcome, not a live countdown. The preference does not fix the separate +same-millisecond sibling-counting issue #1438. + ## Rules Being wrong here means refusing to talk to a portal that works, so every rule diff --git a/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.html b/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.html index 282e971db..e1f25eb1f 100644 --- a/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.html +++ b/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.html @@ -46,7 +46,17 @@ @if (refreshFailed()) { } @else if (loadState() === 'loading') {

- {{ 'PORTALS.ERROR_VIEW.PORTAL_UNAVAILABLE.TITLE' | translate }} + {{ + (requestsPaused() + ? 'PORTALS.REQUESTS_PAUSED.TITLE' + : 'PORTALS.ERROR_VIEW.PORTAL_UNAVAILABLE.TITLE' + ) | translate + }}

{{ - 'PORTALS.ERROR_VIEW.PORTAL_UNAVAILABLE.DESCRIPTION' - | translate + (requestsPaused() + ? 'PORTALS.REQUESTS_PAUSED.DESCRIPTION' + : 'PORTALS.ERROR_VIEW.PORTAL_UNAVAILABLE.DESCRIPTION' + ) | translate }}

} @else if (loadState() === 'loading') { diff --git a/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.spec.ts b/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.spec.ts index 789380c13..4f20105f8 100644 --- a/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.spec.ts +++ b/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.spec.ts @@ -84,6 +84,33 @@ describe('StalkerAccountInfoComponent', () => { }; }); + it.each([false, true])( + 'explains a paused refresh with cached snapshot=%s and allows retry', + async (cached) => { + if (cached) + playlistsService.getPlaylist.mockReturnValue( + of({ ...playlist, stalkerAccountInfo: cachedSnapshot }) + ); + accountInfoService.fetchAccountInfo.mockRejectedValueOnce( + new Error( + "Error invoking remote method 'STALKER_REQUEST': Portal http://portal.example is not responding; skipped after repeated connection failures" + ) + ); + await createComponent(); + expect(component.requestsPaused()).toBe(true); + expect(component.isCachedSnapshot()).toBe(cached); + expect(fixture.nativeElement.textContent).toContain( + 'PORTALS.REQUESTS_PAUSED.DESCRIPTION' + ); + expect(fixture.nativeElement.textContent).toContain( + 'PORTALS.REQUESTS_PAUSED.RETRY' + ); + await component.reload(); + expect(component.requestsPaused()).toBe(false); + expect(component.refreshFailed()).toBe(false); + } + ); + it('shows the fresh snapshot when the portal answers', async () => { await createComponent(); diff --git a/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.ts b/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.ts index eb95f5d1a..711fc7262 100644 --- a/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.ts +++ b/libs/portal/stalker/feature/src/lib/stalker-account-info/stalker-account-info.component.ts @@ -23,6 +23,7 @@ import { resetHostConnectivityGuard, } from '@iptvnator/services'; import { + isHostConnectivityFastFailMessage, PlaylistMeta, type StalkerAccountInfoDialogData, } from '@iptvnator/shared/interfaces'; @@ -56,9 +57,8 @@ const DAY_IN_MS = 86_400_000; changeDetection: ChangeDetectionStrategy.OnPush, }) export class StalkerAccountInfoComponent { - private readonly data = inject( - MAT_DIALOG_DATA - ); + private readonly data = + inject(MAT_DIALOG_DATA); private readonly accountInfoService = inject(StalkerAccountInfoService); private readonly dataService = inject(DataService); private readonly playlistsService = inject(PlaylistsService); @@ -72,6 +72,7 @@ export class StalkerAccountInfoComponent { */ readonly isFullPortal = isFullStalkerPortalPlaylist(this.playlist); readonly loadState = signal('loading'); + readonly requestsPaused = signal(false); readonly snapshot = signal(null); readonly snapshotSource = signal(null); readonly refreshFailed = signal(false); @@ -242,6 +243,7 @@ export class StalkerAccountInfoComponent { } private async load(): Promise { + this.requestsPaused.set(false); this.refreshFailed.set(false); if (!this.snapshot()) { this.loadState.set('loading'); @@ -259,6 +261,11 @@ export class StalkerAccountInfoComponent { } this.loadState.set('ready'); } catch (error) { + this.requestsPaused.set( + isHostConnectivityFastFailMessage( + error instanceof Error ? error.message : error + ) + ); this.logger.error('Failed to fetch account info', error); if (this.snapshot()) { // Keep showing the cached snapshot; just flag the refresh. diff --git a/libs/portal/xtream/feature/src/lib/account-info/account-info.component.html b/libs/portal/xtream/feature/src/lib/account-info/account-info.component.html index 4cbafd473..d7f9af99f 100644 --- a/libs/portal/xtream/feature/src/lib/account-info/account-info.component.html +++ b/libs/portal/xtream/feature/src/lib/account-info/account-info.component.html @@ -91,27 +91,43 @@ signal_wifi_connected_no_internet_4

- {{ 'PORTALS.ERROR_VIEW.PORTAL_UNAVAILABLE.TITLE' | translate }} + {{ + (requestsPaused() + ? 'PORTALS.REQUESTS_PAUSED.TITLE' + : 'PORTALS.ERROR_VIEW.PORTAL_UNAVAILABLE.TITLE' + ) | translate + }}

{{ - 'PORTALS.ERROR_VIEW.PORTAL_UNAVAILABLE.DESCRIPTION' - | translate + (requestsPaused() + ? 'PORTALS.REQUESTS_PAUSED.DESCRIPTION' + : 'PORTALS.ERROR_VIEW.PORTAL_UNAVAILABLE.DESCRIPTION' + ) | translate }}

} @else if (loadState() === 'loading') { diff --git a/libs/portal/xtream/feature/src/lib/account-info/account-info.component.spec.ts b/libs/portal/xtream/feature/src/lib/account-info/account-info.component.spec.ts index 197cab058..da4ff61ff 100644 --- a/libs/portal/xtream/feature/src/lib/account-info/account-info.component.spec.ts +++ b/libs/portal/xtream/feature/src/lib/account-info/account-info.component.spec.ts @@ -84,6 +84,38 @@ describe('AccountInfoComponent', () => { await fixture.whenStable(); }); + it('explains a guard refusal and clears the notice on successful retry', async () => { + xtreamApiService.getAccountInfo.mockRejectedValueOnce( + new Error( + "Error invoking remote method 'XTREAM_REQUEST': Portal https://portal.example is not responding; skipped after repeated connection failures" + ) + ); + await component.reload(); + fixture.detectChanges(); + expect(component.requestsPaused()).toBe(true); + expect(fixture.nativeElement.textContent).toContain( + 'PORTALS.REQUESTS_PAUSED.TITLE' + ); + expect(fixture.nativeElement.textContent).toContain( + 'PORTALS.REQUESTS_PAUSED.RETRY' + ); + await component.reload(); + expect(component.requestsPaused()).toBe(false); + expect(component.loadState()).toBe('ready'); + }); + + it('keeps actual network errors distinct from a paused request', async () => { + xtreamApiService.getAccountInfo.mockRejectedValueOnce( + new Error('connect ECONNREFUSED') + ); + await component.reload(); + fixture.detectChanges(); + expect(component.requestsPaused()).toBe(false); + expect(fixture.nativeElement.textContent).toContain( + 'PORTALS.ERROR_VIEW.PORTAL_UNAVAILABLE.TITLE' + ); + }); + it('loads account info from dialog-supplied playlist credentials', () => { expect(xtreamApiService.getAccountInfo).toHaveBeenCalledWith({ serverUrl: 'https://dialog.example.test', diff --git a/libs/portal/xtream/feature/src/lib/account-info/account-info.component.ts b/libs/portal/xtream/feature/src/lib/account-info/account-info.component.ts index bbe911862..8ef92c7b4 100644 --- a/libs/portal/xtream/feature/src/lib/account-info/account-info.component.ts +++ b/libs/portal/xtream/feature/src/lib/account-info/account-info.component.ts @@ -15,11 +15,9 @@ import { XtreamStore, } from '@iptvnator/portal/xtream/data-access'; import { createLogger } from '@iptvnator/portal/shared/util'; +import { DataService, resetHostConnectivityGuard } from '@iptvnator/services'; import { - DataService, - resetHostConnectivityGuard, -} from '@iptvnator/services'; -import { + isHostConnectivityFastFailMessage, resolveXtreamPortalStatus, type XtreamAccountInfoDialogData, } from '@iptvnator/shared/interfaces'; @@ -67,6 +65,7 @@ export class AccountInfoComponent { () => this.data.playlist ?? this.xtreamStore.currentPlaylist() ); readonly loadState = signal('loading'); + readonly requestsPaused = signal(false); readonly accountInfo = signal(null); readonly skeletonStats = [1, 2, 3, 4]; readonly skeletonPanels = [1, 2]; @@ -241,6 +240,7 @@ export class AccountInfoComponent { } private async load(): Promise { + this.requestsPaused.set(false); const playlist = this.currentPlaylist(); if (!playlist?.serverUrl || !playlist.username || !playlist.password) { @@ -261,6 +261,11 @@ export class AccountInfoComponent { this.accountInfo.set(accountInfo); this.loadState.set('ready'); } catch (error) { + this.requestsPaused.set( + isHostConnectivityFastFailMessage( + error instanceof Error ? error.message : error + ) + ); this.logger.error('Failed to fetch account info', error); this.accountInfo.set(null); this.loadState.set('error'); diff --git a/libs/services/src/lib/runtime-capabilities.service.spec.ts b/libs/services/src/lib/runtime-capabilities.service.spec.ts index 88e2a0fb2..7f23b4cf6 100644 --- a/libs/services/src/lib/runtime-capabilities.service.spec.ts +++ b/libs/services/src/lib/runtime-capabilities.service.spec.ts @@ -10,6 +10,16 @@ describe('RuntimeCapabilitiesService', () => { testWindow.electron = originalElectron; }); + it('offers the portal cooldown setting only with both desktop bridge methods', () => { + const service = new RuntimeCapabilitiesService(); + testWindow.electron = { updateSettings: jest.fn() }; + expect(service.supportsPortalConnectivityGuard).toBe(false); + testWindow.electron['resetHostConnectivityGuard'] = jest.fn(); + expect(service.supportsPortalConnectivityGuard).toBe(true); + testWindow.electron = undefined; + expect(service.supportsPortalConnectivityGuard).toBe(false); + }); + it('reports browser PWA capabilities when the Electron bridge is absent', () => { testWindow.electron = undefined; diff --git a/libs/services/src/lib/runtime-capabilities.service.ts b/libs/services/src/lib/runtime-capabilities.service.ts index 939227817..c055492a0 100644 --- a/libs/services/src/lib/runtime-capabilities.service.ts +++ b/libs/services/src/lib/runtime-capabilities.service.ts @@ -69,6 +69,14 @@ export class RuntimeCapabilitiesService { ); } + /** Desktop-only preference: PWA clients cannot configure the shared server guard. */ + get supportsPortalConnectivityGuard(): boolean { + return ( + this.hasElectronMethod('updateSettings') && + this.hasElectronMethod('resetHostConnectivityGuard') + ); + } + /** * Desktop window mode at launch (normal / maximized / fullscreen) plus * the F11 toggle. The mode reaches the main process through diff --git a/libs/services/src/lib/settings-store.service.spec.ts b/libs/services/src/lib/settings-store.service.spec.ts index d60e72d12..aaa96dd3a 100644 --- a/libs/services/src/lib/settings-store.service.spec.ts +++ b/libs/services/src/lib/settings-store.service.spec.ts @@ -54,6 +54,25 @@ describe('SettingsStore dashboard rail settings', () => { }); }); + it('defaults portal request pauses on and persists an explicit opt-out', async () => { + const store = injector.get(SettingsStore); + expect(store.getSettings().portalConnectivityGuard).toBe(true); + await store.updateSettings({ portalConnectivityGuard: false }); + expect(store.getSettings().portalConnectivityGuard).toBe(false); + }); + + it('restores a portal pause opt-out and keeps it through partial updates', async () => { + storedSettings = { portalConnectivityGuard: false }; + const store = injector.get(SettingsStore); + await store.loadSettings(); + await store.updateSettings({ showCaptions: true }); + expect(store.getSettings().portalConnectivityGuard).toBe(false); + expect(storage.set).toHaveBeenLastCalledWith( + STORE_KEY.Settings, + expect.objectContaining({ portalConnectivityGuard: false }) + ); + }); + it('shares the pending initial settings load across startup waiters', async () => { const pendingSettings = new Subject | null>(); storage.get.mockReturnValue(pendingSettings.asObservable()); diff --git a/libs/services/src/lib/settings-store.service.ts b/libs/services/src/lib/settings-store.service.ts index 342015ccd..dd392a44d 100644 --- a/libs/services/src/lib/settings-store.service.ts +++ b/libs/services/src/lib/settings-store.service.ts @@ -57,6 +57,7 @@ const DEFAULT_SETTINGS: Settings = { embeddedMpvFrameCopy: false, embeddedMpvExtraOptions: '', embeddedMpvAutoReconnect: true, + portalConnectivityGuard: true, coverSize: 'medium', epgViewMode: 'timeline', epgOffsetMinutes: 0, @@ -169,6 +170,9 @@ export const SettingsStore = signalStore( webPlayerSharedControls: storedSettings.webPlayerSharedControls !== false, + portalConnectivityGuard: + storedSettings.portalConnectivityGuard !== + false, embeddedMpvAutoReconnect: storedSettings.embeddedMpvAutoReconnect !== false, @@ -206,6 +210,12 @@ export const SettingsStore = signalStore( settings.webPlayerSharedControls !== false, } : {}), + ...(settings.portalConnectivityGuard !== undefined + ? { + portalConnectivityGuard: + settings.portalConnectivityGuard !== false, + } + : {}), ...(settings.embeddedMpvAutoReconnect !== undefined ? { embeddedMpvAutoReconnect: @@ -298,6 +308,8 @@ export const SettingsStore = signalStore( store.embeddedMpvFrameCopy?.() ?? false, embeddedMpvExtraOptions: store.embeddedMpvExtraOptions?.() ?? '', + portalConnectivityGuard: + store.portalConnectivityGuard?.() !== false, embeddedMpvAutoReconnect: store.embeddedMpvAutoReconnect?.() !== false, coverSize: diff --git a/libs/shared/interfaces/src/lib/settings.interface.ts b/libs/shared/interfaces/src/lib/settings.interface.ts index 11196dee3..9074622a8 100644 --- a/libs/shared/interfaces/src/lib/settings.interface.ts +++ b/libs/shared/interfaces/src/lib/settings.interface.ts @@ -229,6 +229,8 @@ export interface Settings { * Captured per session, so a change applies to the next session. */ embeddedMpvAutoReconnect?: boolean; + /** Desktop Xtream/Stalker request cooldown. Default on; applies on Save. */ + portalConnectivityGuard?: boolean; /** Cover/poster sizing preset applied across grids and rails */ coverSize?: CoverSize; /** Live EPG panel layout: horizontal timeline (default) or vertical list */ From 07ccf45f32d71d83f53615542ccfe563b6f02774 Mon Sep 17 00:00:00 2001 From: 4gray <4gray@users.noreply.github.com> Date: Sat, 5 Sep 2026 11:33:05 +0200 Subject: [PATCH 4/6] fix(playback): hide VLC RC console on Windows (#1533) * fix(playback): hide VLC RC console on Windows * fix(playback): preserve VLC retry arguments containing quiet flag --- .changes/playback-vlc-windows-console.md | 7 + .../vlc-session.service.lifecycle.spec.ts | 9 ++ .../app/events/vlc-session.service.spec.ts | 153 ++++++++++++++++++ .../src/app/events/vlc-session.service.ts | 8 +- docs/architecture/embedded-inline-playback.md | 13 +- 5 files changed, 185 insertions(+), 5 deletions(-) create mode 100644 .changes/playback-vlc-windows-console.md diff --git a/.changes/playback-vlc-windows-console.md b/.changes/playback-vlc-windows-console.md new file mode 100644 index 000000000..c29a9b86a --- /dev/null +++ b/.changes/playback-vlc-windows-console.md @@ -0,0 +1,7 @@ +--- +type: fix +area: playback +issues: [871] +--- + +VLC now opens without an extra console window on Windows when playback progress tracking or Reuse VLC instance is enabled. diff --git a/apps/electron-backend/src/app/events/vlc-session.service.lifecycle.spec.ts b/apps/electron-backend/src/app/events/vlc-session.service.lifecycle.spec.ts index f7f50de94..5b7c0f145 100644 --- a/apps/electron-backend/src/app/events/vlc-session.service.lifecycle.spec.ts +++ b/apps/electron-backend/src/app/events/vlc-session.service.lifecycle.spec.ts @@ -47,6 +47,7 @@ import { externalPlayerSessions } from './external-player-runtime'; import { externalPlayerProcessTeardownGate } from './external-player-process'; import { openVlcPlayer, shutdownVlcSession } from './vlc-session.service'; +const originalPlatform = process.platform; const spawnMock = spawn as unknown as jest.Mock; const streamUrl = 'https://example.com/stream.m3u8'; const rcWrites: string[] = []; @@ -136,6 +137,7 @@ describe('vlc-session.service process lifecycle', () => { // Drop any process tracked for reuse so tests stay isolated. shutdownVlcSession(); consoleErrorSpy.mockRestore(); + Object.defineProperty(process, 'platform', { value: originalPlatform }); }); describe('instance reuse', () => { @@ -1219,12 +1221,14 @@ describe('vlc-session.service process lifecycle', () => { }); it('retries without the RC interface when VLC exits with code 1', async () => { + Object.defineProperty(process, 'platform', { value: 'win32' }); mockStoreValues({ [VLC_PLAYER_PATH]: '/usr/bin/vlc', [VLC_REUSE_INSTANCE]: true, }); const proc = createMockChildProcess(); await openTrackedVlcInstance(proc); + expect(spawnMock.mock.calls[0][1]).toContain('--rc-quiet'); const retryProc = createMockChildProcess(); spawnMock.mockReturnValueOnce(retryProc); @@ -1234,6 +1238,7 @@ describe('vlc-session.service process lifecycle', () => { const retryArgs = spawnMock.mock.calls[1][1] as string[]; expect(retryArgs.join(' ')).not.toContain('--extraintf'); expect(retryArgs.join(' ')).not.toContain('--rc-host'); + expect(retryArgs).not.toContain('--rc-quiet'); // Retry processes are never tracked for reuse. expect(spawnMock.mock.calls[1][2]).toMatchObject({ detached: true, @@ -1262,6 +1267,7 @@ describe('vlc-session.service process lifecycle', () => { }); it('retries without the RC interface after a start error', async () => { + Object.defineProperty(process, 'platform', { value: 'win32' }); mockStoreValues({ [VLC_PLAYER_PATH]: '/usr/bin/vlc', [VLC_REUSE_INSTANCE]: true, @@ -1272,11 +1278,14 @@ describe('vlc-session.service process lifecycle', () => { const openPromise = openVlcPlayer({ title: 'S', url: streamUrl }); await waitForSpawnCallCount(1); + expect(spawnMock.mock.calls[0][1]).toContain('--rc-quiet'); proc.emit('error', new Error('rc unsupported')); await waitForSpawnCallCount(2); const retryArgs = spawnMock.mock.calls[1][1] as string[]; expect(retryArgs.join(' ')).not.toContain('--extraintf'); + expect(retryArgs.join(' ')).not.toContain('--rc-host'); + expect(retryArgs).not.toContain('--rc-quiet'); retryProc.emit('spawn'); const session = await openPromise; expect(session.status).toBe('opened'); diff --git a/apps/electron-backend/src/app/events/vlc-session.service.spec.ts b/apps/electron-backend/src/app/events/vlc-session.service.spec.ts index 0d7fb8208..e7043479c 100644 --- a/apps/electron-backend/src/app/events/vlc-session.service.spec.ts +++ b/apps/electron-backend/src/app/events/vlc-session.service.spec.ts @@ -39,6 +39,7 @@ import { spawn, type ChildProcess } from 'child_process'; import { EventEmitter } from 'events'; import { createServer } from 'net'; import { + VLC_PLAYER_ARGUMENTS, VLC_PLAYER_PATH, VLC_REUSE_INSTANCE, store, @@ -51,6 +52,7 @@ import { shutdownVlcSession, } from './vlc-session.service'; +const originalPlatform = process.platform; const spawnMock = spawn as unknown as jest.Mock; const streamUrl = 'https://example.com/stream.m3u8'; @@ -86,6 +88,8 @@ describe('vlc-session.service helpers and launch args', () => { beforeEach(() => { jest.clearAllMocks(); + Object.defineProperty(process, 'platform', { value: 'darwin' }); + jest.useFakeTimers({ doNotFake: ['setImmediate'] }); consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(); (createServer as unknown as jest.Mock).mockImplementation(() => ({ unref: jest.fn(), @@ -103,7 +107,10 @@ describe('vlc-session.service helpers and launch args', () => { afterEach(() => { // Drop any process tracked for reuse so tests stay isolated. shutdownVlcSession(); + jest.clearAllTimers(); + jest.useRealTimers(); consoleErrorSpy.mockRestore(); + Object.defineProperty(process, 'platform', { value: originalPlatform }); }); describe('buildVlcEnqueueCommands', () => { @@ -177,6 +184,152 @@ describe('vlc-session.service helpers and launch args', () => { }); describe('openVlcPlayer launch args', () => { + it.each(['error', 'exit'])( + 'preserves data containing --rc-quiet during an RC retry (%s)', + async (event) => { + Object.defineProperty(process, 'platform', { value: 'win32' }); + mockStoreValues({ + [VLC_PLAYER_PATH]: '/usr/bin/vlc', + [VLC_REUSE_INSTANCE]: true, + [VLC_PLAYER_ARGUMENTS]: '--fullscreen\n--rc-quiet', + }); + const proc = createMockChildProcess(); + const retryProc = createMockChildProcess(); + spawnMock + .mockReturnValueOnce(proc) + .mockReturnValueOnce(retryProc); + const url = `${streamUrl}?option=--rc-quiet`; + const openPromise = openVlcPlayer({ + title: 'Movie --rc-quiet', + url, + userAgent: 'Agent --rc-quiet', + }); + await waitForSpawnCallCount(1); + proc.emit('spawn'); + await openPromise; + proc.emit(event, event === 'exit' ? 1 : new Error('RC failed')); + await waitForSpawnCallCount(2); + + expect(spawnMock.mock.lastCall[1]).toEqual([ + '--fullscreen', + // Custom arguments are preserved; only the managed flag goes. + '--rc-quiet', + ':http-user-agent=Agent --rc-quiet', + url, + ':meta-title=Movie --rc-quiet', + ]); + retryProc.emit('spawn'); + retryProc.emit('exit', 0); + } + ); + + it.each(['win32', 'darwin', 'linux'] as const)( + 'adds quiet mode only for managed Windows RC launches (%s)', + async (platform) => { + Object.defineProperty(process, 'platform', { value: platform }); + for (const reuseInstance of [false, true]) { + mockStoreValues({ + [VLC_PLAYER_PATH]: '/usr/bin/vlc', + [VLC_REUSE_INSTANCE]: reuseInstance, + }); + const proc = createMockChildProcess(); + spawnMock.mockReturnValueOnce(proc); + const openPromise = openVlcPlayer({ + title: 'RC Stream', + url: streamUrl, + // Exercise progress-only and reuse-only RC separately. + ...(!reuseInstance && { + contentInfo: { + playlistId: 'playlist', + contentXtreamId: 1, + contentType: 'vod' as const, + }, + }), + }); + await waitForSpawnCallCount(reuseInstance ? 2 : 1); + proc.emit('spawn'); + await openPromise; + + expect(spawnMock.mock.lastCall[1]).toEqual([ + '--extraintf=rc', + '--rc-host=127.0.0.1:43210', + ...(platform === 'win32' ? ['--rc-quiet'] : []), + streamUrl, + ':meta-title=RC Stream', + ]); + expect(spawnMock.mock.lastCall[2].detached).toBe( + !reuseInstance + ); + proc.emit('exit', 0); + } + } + ); + + it.each(['--rc-quiet', '--no-rc-quiet'])( + 'keeps custom arguments before managed quiet mode (%s)', + async (customQuiet) => { + Object.defineProperty(process, 'platform', { value: 'win32' }); + mockStoreValues({ + [VLC_PLAYER_PATH]: '/usr/bin/vlc', + [VLC_REUSE_INSTANCE]: true, + [VLC_PLAYER_ARGUMENTS]: `--fullscreen\n${customQuiet}`, + }); + const proc = createMockChildProcess(); + spawnMock.mockReturnValueOnce(proc); + const openPromise = openVlcPlayer({ + title: 'Custom', + url: streamUrl, + }); + await waitForSpawnCallCount(1); + proc.emit('spawn'); + await openPromise; + + expect(spawnMock.mock.lastCall[1]).toEqual([ + '--fullscreen', + customQuiet, + '--extraintf=rc', + '--rc-host=127.0.0.1:43210', + '--rc-quiet', + streamUrl, + ':meta-title=Custom', + ]); + proc.emit('exit', 0); + } + ); + + it.each([false, true])( + 'does not add quiet mode without an RC port (reuse: %s)', + async (reuseInstance) => { + Object.defineProperty(process, 'platform', { value: 'win32' }); + mockStoreValues({ + [VLC_PLAYER_PATH]: '/usr/bin/vlc', + [VLC_REUSE_INSTANCE]: reuseInstance, + }); + (createServer as unknown as jest.Mock).mockImplementation( + () => { + throw new Error('No free port'); + } + ); + const proc = createMockChildProcess(); + spawnMock.mockReturnValueOnce(proc); + const openPromise = openVlcPlayer({ + title: 'No RC', + url: streamUrl, + }); + await waitForSpawnCallCount(1); + proc.emit('spawn'); + await openPromise; + + expect(spawnMock.mock.lastCall[1]).toEqual([ + streamUrl, + ':meta-title=No RC', + ]); + expect(createServer).toHaveBeenCalledTimes( + reuseInstance ? 1 : 0 + ); + } + ); + it('spawns a detached VLC process with http options and start time', async () => { const proc = createMockChildProcess(); spawnMock.mockReturnValueOnce(proc); diff --git a/apps/electron-backend/src/app/events/vlc-session.service.ts b/apps/electron-backend/src/app/events/vlc-session.service.ts index 3ec688255..7ca52da0f 100644 --- a/apps/electron-backend/src/app/events/vlc-session.service.ts +++ b/apps/electron-backend/src/app/events/vlc-session.service.ts @@ -249,6 +249,10 @@ export async function openVlcPlayer({ if (rcPort > 0) { args.push('--extraintf=rc'); args.push(`--rc-host=127.0.0.1:${rcPort}`); + if (process.platform === 'win32') { + // Keep TCP control without VLC's separate DOS console. + args.push('--rc-quiet'); + } } if (effectiveUserAgent) { @@ -521,7 +525,7 @@ export async function openVlcPlayer({ (arg) => !arg.includes('--extraintf') && !arg.includes('--rc-host') && - !arg.includes('--rc-quiet') + arg !== '--rc-quiet' ); spawnVlc(retryArgs, true); } else { @@ -572,7 +576,7 @@ export async function openVlcPlayer({ (arg) => !arg.includes('--extraintf') && !arg.includes('--rc-host') && - !arg.includes('--rc-quiet') + arg !== '--rc-quiet' ); spawnVlc(retryArgs, true); return; diff --git a/docs/architecture/embedded-inline-playback.md b/docs/architecture/embedded-inline-playback.md index 537b89e90..ed317b278 100644 --- a/docs/architecture/embedded-inline-playback.md +++ b/docs/architecture/embedded-inline-playback.md @@ -867,15 +867,22 @@ path-only setting; extra flags are stored separately as `mpvPlayerArguments` and Argument fields are line-oriented: one non-empty trimmed line becomes one argv entry. IPTVnator prepends those custom entries before its stream-specific runtime -arguments, then keeps the stream URL last. This avoids shell parsing, keeps paths -with spaces safe, and preserves existing settings for users who never configured -extra arguments. +arguments. This avoids shell parsing, keeps paths with spaces safe, and preserves +existing settings for users who never configured extra arguments. The arguments apply only when IPTVnator spawns a new external player process. If MPV or VLC instance reuse is active and an existing process is reused, subsequent streams are loaded through MPV IPC or VLC RC commands and new process arguments are not re-applied until a fresh process starts. +VLC enables its TCP RC interface when content metadata requires progress +tracking or instance reuse is enabled. On Windows, these managed RC launches +also append `--rc-quiet` after custom arguments to suppress VLC's DOS console +while retaining TCP control. macOS/Linux and launches without an allocated RC +port receive no automatic quiet flag. Both launch-error and exit-code-1 retries +remove the app-generated RC flags, including `--rc-quiet`; custom arguments +continue to be prepended unchanged. + ## Electron External Player Ownership External MPV/VLC integration is split across focused main-process modules: From 1cf17f73010a4292f38ed5267d1bb081f0cad421 Mon Sep 17 00:00:00 2001 From: 4gray <4gray@users.noreply.github.com> Date: Sat, 5 Sep 2026 12:11:56 +0200 Subject: [PATCH 5/6] style(website): solid hairlines, Bricolage Grotesque display face, drop TV effects (#1539) * style(website): solid hairlines, Bricolage Grotesque display face, drop TV effects First of three landing redesign PRs. This one only touches tokens and surface treatment so every page (home, blog, /features, /compare, /download) benefits without any structural change: - Replace every dashed border with a solid hairline; `.card-dotted` becomes `.card-panel` (bg step + hairline, lighter hairline on hover) and the section divider is solid `surface-800`. - Swap the display face from Playfair Display to Bricolage Grotesque (DM Sans body and IBM Plex Mono unchanged). The italic accent word that every heading repeated is gone; only page-level h1s keep the accent, and as colour rather than italic. - Remove the CRT/TV effects: the `.btn-tv` block and its nine keyframes, the scanline overlay on the hero screenshot, the CRT hover overlay and teal glow shadows on feature cards, the pulsing mascot, and the unused scan/tv-* Tailwind animations. - The hero download button and the header Download link are now solid accent buttons; the self-host link is a plain text link. - Blog tag chips use neutral surface borders so teal stays reserved for actions. Co-Authored-By: Claude Fable 5.1 * style(website): finish the dashed sweep in prose and package rows The blanket `border-dashed ` removal ate the utility but not the variant prefix in the blog prose classes, leaving `prose-pre:prose-pre:...` and `prose-hr:prose-hr:...`; and the Linux package rows still used `divide-dashed`. Co-Authored-By: Claude Fable 5.1 --------- Co-authored-by: Claude Fable 5.1 --- apps/website/src/components/BaseHead.astro | 4 +- .../website/src/components/BlogPostCard.astro | 4 +- apps/website/src/components/DownloadCTA.astro | 6 +- apps/website/src/components/FeatureGrid.astro | 19 +- .../src/components/FeaturedBlogPost.astro | 4 +- apps/website/src/components/Footer.astro | 4 +- .../src/components/GiscusComments.astro | 2 +- apps/website/src/components/Header.astro | 6 +- apps/website/src/components/Hero.astro | 51 +-- .../src/components/ScreenshotShowcase.astro | 6 +- .../src/components/SupportSection.astro | 8 +- apps/website/src/components/blog/Alert.astro | 2 +- .../src/components/blog/BlogImageSlider.astro | 2 +- .../src/components/blog/ChangeTable.astro | 6 +- .../src/components/blog/CopyCommand.astro | 4 +- .../src/components/blog/FaqAccordion.astro | 4 +- .../src/components/blog/IconFeatureGrid.astro | 2 +- .../src/components/blog/ImageGallery.astro | 2 +- .../src/components/blog/LinkCards.astro | 2 +- .../src/components/blog/PostButton.astro | 2 +- .../src/components/blog/ReleaseMeta.astro | 2 +- .../website/src/components/blog/Spoiler.astro | 4 +- .../src/components/blog/StatusPill.astro | 2 +- .../src/components/blog/StepRail.astro | 4 +- .../src/components/blog/TerminalBlock.astro | 4 +- .../src/components/compare/CompareHero.astro | 4 +- .../components/compare/CompareSwitcher.astro | 4 +- .../components/compare/ComparisonTable.astro | 6 +- .../components/download/DownloadButton.astro | 2 +- .../components/download/DownloadHero.astro | 6 +- .../components/download/DownloadSection.astro | 2 +- .../src/components/download/FeatureList.astro | 2 +- .../download/OfficialSourcesNote.astro | 2 +- .../src/components/download/PackageList.astro | 6 +- .../download/PlatformSwitcher.astro | 6 +- .../src/components/download/SpecList.astro | 2 +- .../src/components/feature/FeatureHero.astro | 8 +- .../components/feature/FeatureSwitcher.astro | 4 +- apps/website/src/layouts/BlogPost.astro | 6 +- apps/website/src/pages/compare/index.astro | 8 +- apps/website/src/pages/download/index.astro | 6 +- apps/website/src/pages/download/windows.astro | 2 +- apps/website/src/pages/features/epg.astro | 2 +- apps/website/src/pages/features/index.astro | 10 +- .../features/stalker-portal-player.astro | 2 +- .../pages/features/xtream-codes-player.astro | 2 +- apps/website/src/pages/index.astro | 2 +- apps/website/src/styles/global.css | 370 +----------------- apps/website/tailwind.config.mjs | 38 +- 49 files changed, 123 insertions(+), 535 deletions(-) diff --git a/apps/website/src/components/BaseHead.astro b/apps/website/src/components/BaseHead.astro index cfda85563..8a963e23b 100644 --- a/apps/website/src/components/BaseHead.astro +++ b/apps/website/src/components/BaseHead.astro @@ -48,11 +48,11 @@ const schemaPayload = jsonLd {keywords.length > 0 && } - + diff --git a/apps/website/src/components/BlogPostCard.astro b/apps/website/src/components/BlogPostCard.astro index ea918eb56..2731fcc55 100644 --- a/apps/website/src/components/BlogPostCard.astro +++ b/apps/website/src/components/BlogPostCard.astro @@ -19,7 +19,7 @@ const formattedDate = pubDate.toLocaleDateString('en-US', { {heroImage && (
@@ -40,7 +40,7 @@ const formattedDate = pubDate.toLocaleDateString('en-US', { <> · {tags.map((tag) => ( - + {tag} ))} diff --git a/apps/website/src/components/DownloadCTA.astro b/apps/website/src/components/DownloadCTA.astro index 40b8c8b51..f1cced931 100644 --- a/apps/website/src/components/DownloadCTA.astro +++ b/apps/website/src/components/DownloadCTA.astro @@ -28,7 +28,7 @@ const packageManagers = [ Get started

- Get IPTVnator + Get IPTVnator

Download for your platform or use it directly in the browser. @@ -41,7 +41,7 @@ const packageManagers = [ platforms.map((platform) => ( @@ -59,7 +59,7 @@ const packageManagers = [

{ packageManagers.map((pm) => ( -
+
{pm.label} diff --git a/apps/website/src/components/FeatureGrid.astro b/apps/website/src/components/FeatureGrid.astro index 270bf2703..05a78c9e4 100644 --- a/apps/website/src/components/FeatureGrid.astro +++ b/apps/website/src/components/FeatureGrid.astro @@ -84,7 +84,7 @@ const carouselFeatures: FeatureCard[] = [ Features

- Everything you need + Everything you need

A full-featured IPTV player packed with the tools for the best viewing experience. @@ -95,7 +95,7 @@ const carouselFeatures: FeatureCard[] = [

{ heroFeatures.map((feature, i) => ( - +
@@ -106,9 +106,6 @@ const carouselFeatures: FeatureCard[] = [
- -
-
@@ -148,10 +145,10 @@ const carouselFeatures: FeatureCard[] = [ { carouselFeatures.map((feature, i) => ( - +
-
- +
+
@@ -167,10 +164,10 @@ const carouselFeatures: FeatureCard[] = [ { carouselFeatures.map((feature, i) => ( -