Frontend-testinfrastruktur (Vitest) -- geo, offline-queue, formats
All checks were successful
Frontend-tester / test (push) Successful in 41s
All checks were successful
Frontend-tester / test (push) Successful in 41s
Fortsetter robusthetslinjen: frontend-tester var eksplisitt utenfor omfang i ADR-058/060. 30 nye tester: lib/geo.ts (GPS-avstand/retning, fasit-forankret), lib/offline-queue.ts (regresjonsvern for resourceKey-fiksen fra forrige runde), lib/ny-runde/formats.ts (fullstendighetssjekk på tvers av format-listene). Egen, lettvekts Forgejo Actions-workflow (ingen Docker-utenfor-Docker nødvendig). To reelle funn underveis: prosjektet bruker pnpm ikke npm (et første forsøk med npm feilet, ingen skade); pnpm-workspace.yaml var arvet- ignorert fra V0-malen men har nå reelt CI-relevant innhold (allowBuilds: sharp), rettet før det kunne feile CI stille. Se ADR-061/CHANGELOG punkt 70. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
5c2455c1fe
commit
7c8b352eca
11 changed files with 1147 additions and 9 deletions
34
.forgejo/workflows/frontend-tests.yml
Normal file
34
.forgejo/workflows/frontend-tests.yml
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
name: Frontend-tester
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
paths:
|
||||||
|
- "frontend/lib/**"
|
||||||
|
- "frontend/package.json"
|
||||||
|
- "frontend/pnpm-lock.yaml"
|
||||||
|
- "frontend/pnpm-workspace.yaml"
|
||||||
|
- "frontend/vitest.config.mts"
|
||||||
|
- ".forgejo/workflows/frontend-tests.yml"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: docker
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: frontend
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: "22"
|
||||||
|
|
||||||
|
- name: Installer pnpm (corepack)
|
||||||
|
run: corepack enable
|
||||||
|
|
||||||
|
- name: Installer avhengigheter
|
||||||
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Kjør testsuiten
|
||||||
|
run: pnpm test
|
||||||
|
|
@ -5753,9 +5753,7 @@ grenen i `submit_hole_score` hver for seg, `submit_hole_result`, alle
|
||||||
med vellykket skrivning/versjonsøkning, 409 STALE_VERSION ved konflikt,
|
med vellykket skrivning/versjonsøkning, 409 STALE_VERSION ved konflikt,
|
||||||
og bekreftet at en avvist skrivning faktisk IKKE ble lagret. Alle 23
|
og bekreftet at en avvist skrivning faktisk IKKE ble lagret. Alle 23
|
||||||
backend-tester (17 fra før + 6 nye) grønne i samme kjøring via CI-
|
backend-tester (17 fra før + 6 nye) grønne i samme kjøring via CI-
|
||||||
runneren fra ADR-059. `tsc --noEmit` rent. Ingen deploy i selve
|
runneren fra ADR-059. `tsc --noEmit` rent.
|
||||||
skriverunden — venter på eksplisitt bekreftelse per CLAUDE.md før
|
|
||||||
migrasjon 063 kjøres mot ekte `teecup_db`.
|
|
||||||
|
|
||||||
**Bevisst utenfor omfang:** ingen browser-basert to-enhets-verifisering
|
**Bevisst utenfor omfang:** ingen browser-basert to-enhets-verifisering
|
||||||
denne runden (ulikt ADR-057) — pytest-dekningen ble vurdert som
|
denne runden (ulikt ADR-057) — pytest-dekningen ble vurdert som
|
||||||
|
|
@ -5764,6 +5762,86 @@ direkte, og frontend-siden (`session-scorecard.tsx`) følger nøyaktig
|
||||||
samme, allerede browser-verifiserte mønster som `round-detail.tsx` fikk
|
samme, allerede browser-verifiserte mønster som `round-detail.tsx` fikk
|
||||||
i forrige runde.
|
i forrige runde.
|
||||||
|
|
||||||
|
**Rullet ut 2026-08-10**, bruker bekreftet eksplisitt — migrasjon 063
|
||||||
|
kjørt mot ekte `teecup_db`, `teecup_api`/`teecup_frontend` bygget/
|
||||||
|
restartet rent, ingen konsollfeil. CI plukket opp pushen automatisk og
|
||||||
|
kjørte grønt (samme runner som ADR-059).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ADR-061: Frontend-testinfrastruktur (Vitest) — 2026-08-10
|
||||||
|
|
||||||
|
Direkte fortsettelse av ADR-058/060, som begge eksplisitt navnga
|
||||||
|
frontend-tester som bevisst utenfor omfang. Bruker ba om å ta tak i det
|
||||||
|
som neste steg i robusthetslinjen, nå som backend-testriggen og CI-
|
||||||
|
runneren stod klare.
|
||||||
|
|
||||||
|
**Beslutning A — Vitest, ren logikk-testing (`lib/**`), ingen
|
||||||
|
komponenttester ennå.** Node-miljø, ingen jsdom/@testing-library i
|
||||||
|
denne runden — det finnes ingen komponenttester å kjøre ennå, og
|
||||||
|
`node`-miljø er raskere/enklere når det ikke trengs. Tre moduler valgt
|
||||||
|
etter samme risikobaserte prinsipp som backend-rundene:
|
||||||
|
- `lib/geo.ts` (`haversineMeters`/`bearingDegrees`) — ekte GPS-
|
||||||
|
avstandsmåling (ADR-048), fasit-forankret mot kjente geodetiske
|
||||||
|
verdier (Oslo–Bergen luftlinje, 1 breddegrad ved ekvator ≈ 111,2 km),
|
||||||
|
ikke bare selv-konsistente tall.
|
||||||
|
- `lib/offline-queue.ts` — regresjonsvern for `resourceKey`-fiksen fra
|
||||||
|
ADR-060 selv: egen test beviser eksplisitt at to ulike ressurser som
|
||||||
|
deler samme URL IKKE lenger blander sammen versjonsnummer, og at
|
||||||
|
round_hole sin eksisterende bruk (ingen `resourceKey` satt) fortsatt
|
||||||
|
faller tilbake til url-basert nøkling uendret. `fake-indexeddb` gir en
|
||||||
|
ekte IndexedDB-implementasjon i test-miljøet — ikke en mocket
|
||||||
|
tilnærming til køen.
|
||||||
|
- `lib/ny-runde/formats.ts` — fullstendighets-/konsistenssjekker på
|
||||||
|
tvers av format-listene (`FORMAT_TO_API`, `FORMAT_MAP`, `API_TO_FORMAT`,
|
||||||
|
`TWO_SIDED` m.fl.), direkte motivert av et tidligere kjent
|
||||||
|
ømtåelig-punkt (separate `play_format`-gatingsett i flere
|
||||||
|
frontend-filer, lett å glemme å oppdatere ett sted når et nytt
|
||||||
|
format legges til). Testene fanger spesifikt opp det TypeScript IKKE
|
||||||
|
gjør automatisk: `FORMAT_MAP` bygges med en `as`-cast som omgår
|
||||||
|
fullstendighetssjekk, og en vanlig array som `FORMATS` har ingen
|
||||||
|
kompilator-garanti for å dekke alle `FormatId`-verdier.
|
||||||
|
|
||||||
|
**Beslutning B — pnpm, ikke npm.** Prosjektet bruker pnpm
|
||||||
|
(`pnpm-lock.yaml`, Dockerfilens `corepack enable && pnpm install`) —
|
||||||
|
et første forsøk med `npm install` feilet med en intern npm/arborist-
|
||||||
|
krasj nettopp FORDI `node_modules` allerede var strukturert som et
|
||||||
|
pnpm-lagret (`.pnpm/`-innhold), ikke fordi noe var korrupt. Ingen skade
|
||||||
|
skjedd (bekreftet med `pnpm install --frozen-lockfile`, som validerte
|
||||||
|
hele treet på nytt), men en påminnelse om å sjekke lockfile-typen FØR
|
||||||
|
man antar npm er riktig verktøy.
|
||||||
|
|
||||||
|
**Reelt funn, rettet i samme runde:** `frontend/pnpm-workspace.yaml` var
|
||||||
|
ignorert i `frontend/.gitignore` (arvet fra den opprinnelige V0-sandbox-
|
||||||
|
malen, der fila kun inneholdt V0-interne sandbox-detaljer). Filen fikk
|
||||||
|
nå reelt, deploy-relevant innhold (`allowBuilds: sharp: true`, fra
|
||||||
|
`pnpm approve-builds` — uten den feiler `pnpm install` i et rent
|
||||||
|
miljø/CI med `[ERR_PNPM_IGNORED_BUILDS]`). Ignore-regelen fjernet,
|
||||||
|
fila sporet i git — ellers ville CI feilet på akkurat denne
|
||||||
|
installasjonen hver eneste gang, usynlig lokalt siden node_modules
|
||||||
|
allerede var godkjent på denne serveren fra før.
|
||||||
|
|
||||||
|
**Beslutning C — egen, lettvekts CI-workflow, ikke gjenbruk av backend-
|
||||||
|
sin.** `.forgejo/workflows/frontend-tests.yml` trigger kun på
|
||||||
|
`frontend/lib/**`/`package.json`/lockfile-endringer, bruker
|
||||||
|
`actions/setup-node@v4` (Node 22, matcher Dockerfilen) + `corepack
|
||||||
|
enable` + `pnpm install --frozen-lockfile` + `pnpm test` — INGEN
|
||||||
|
Docker-utenfor-Docker, ingen `docker.sock`-tilgang nødvendig, siden
|
||||||
|
denne suiten ikke rører database eller containere i det hele tatt.
|
||||||
|
Enklere og tryggere blast-radius enn backend-workflowen.
|
||||||
|
|
||||||
|
**Verifisert:** 30 tester, 3 filer, alle grønne lokalt
|
||||||
|
(`./node_modules/.bin/vitest run`, og via `pnpm test` etter
|
||||||
|
`allowBuilds`-fiksen). Ingen produksjonskode endret -- ren
|
||||||
|
testinfrastruktur.
|
||||||
|
|
||||||
|
**Bevisst utenfor omfang:** komponenttester (jsdom/@testing-library),
|
||||||
|
og en tilsvarende fullstendighetssjekk PÅ TVERS AV `round-detail.tsx`/
|
||||||
|
`scorecard.tsx`/`leaderboard.tsx` sine egne, separate
|
||||||
|
`play_format`-gatingsett (kjent ømtålelig punkt, men disse er store
|
||||||
|
komponentfiler som ville krevd en helt annen testtilnærming enn ren
|
||||||
|
lib-import — egen, fremtidig vurdering).
|
||||||
|
|
||||||
Disse må avklares før eller under de relevante fasene:
|
Disse må avklares før eller under de relevante fasene:
|
||||||
|
|
||||||
1. **Sesjons-secret:** TeeOff lar `PUBLIC_SESSION_SECRET` falle tilbake på
|
1. **Sesjons-secret:** TeeOff lar `PUBLIC_SESSION_SECRET` falle tilbake på
|
||||||
|
|
|
||||||
35
CHANGELOG.md
35
CHANGELOG.md
|
|
@ -10353,5 +10353,36 @@ Neste steg:
|
||||||
backend-tester grønne (kjørt via CI-runneren fra punkt 68). `tsc
|
backend-tester grønne (kjørt via CI-runneren fra punkt 68). `tsc
|
||||||
--noEmit` rent.
|
--noEmit` rent.
|
||||||
|
|
||||||
**Ikke rullet ut ennå** — venter på eksplisitt bekreftelse før
|
**Rullet ut 2026-08-10**, bruker bekreftet eksplisitt — migrasjon
|
||||||
migrasjon 063 kjøres mot ekte `teecup_db`, per CLAUDE.md.
|
063 kjørt mot ekte `teecup_db`, begge containere bygget/restartet
|
||||||
|
rent, ingen konsollfeil. CI plukket opp pushen og kjørte grønt.
|
||||||
|
|
||||||
|
70. **Frontend-testinfrastruktur (Vitest) — 2026-08-10, se ADR-061.**
|
||||||
|
Fortsettelse av robusthetslinjen: frontend-tester var eksplisitt
|
||||||
|
utenfor omfang i både punkt 67 og 69. Bruker ba om å ta tak i det.
|
||||||
|
|
||||||
|
Vitest satt opp (node-miljø, ingen komponenttester ennå). 30 tester
|
||||||
|
i tre filer: `lib/geo.test.ts` (GPS-avstand/retning, fasit-
|
||||||
|
forankret mot kjente geodetiske verdier), `lib/offline-queue.
|
||||||
|
test.ts` (regresjonsvern for `resourceKey`-fiksen fra punkt 69 --
|
||||||
|
beviser eksplisitt at to ulike hull som deler samme URL ikke lenger
|
||||||
|
blander sammen versjonsnummer, med `fake-indexeddb` som ekte
|
||||||
|
IndexedDB-implementasjon), `lib/ny-runde/formats.test.ts`
|
||||||
|
(fullstendighetssjekk på tvers av format-listene -- fanger opp det
|
||||||
|
TypeScript sin `as`-cast i `FORMAT_MAP` IKKE garanterer).
|
||||||
|
|
||||||
|
To reelle funn underveis: (1) prosjektet bruker pnpm, ikke npm --
|
||||||
|
et første forsøk med `npm install` feilet (intern npm/arborist-
|
||||||
|
krasj mot en pnpm-strukturert `node_modules`), ingen skade, løst
|
||||||
|
ved å bruke riktig verktøy. (2) `frontend/pnpm-workspace.yaml` var
|
||||||
|
ignorert i `.gitignore` (arv fra V0-sandbox-malen) -- fila fikk nå
|
||||||
|
reelt CI-relevant innhold (`allowBuilds: sharp: true`), og ville
|
||||||
|
latt CI feile stille på `[ERR_PNPM_IGNORED_BUILDS]` hver gang uten
|
||||||
|
å bli sporet i git. Rettet.
|
||||||
|
|
||||||
|
Egen, lettvekts CI-workflow (`.forgejo/workflows/frontend-tests.
|
||||||
|
yml`) -- INGEN Docker-utenfor-Docker, siden denne suiten ikke
|
||||||
|
rører database/containere. `actions/setup-node@v4` (Node 22) +
|
||||||
|
`corepack enable` + `pnpm install --frozen-lockfile` + `pnpm test`.
|
||||||
|
|
||||||
|
**Verifisert:** 30/30 grønt lokalt. Ingen produksjonskode endret.
|
||||||
|
|
|
||||||
8
frontend/.gitignore
vendored
8
frontend/.gitignore
vendored
|
|
@ -14,5 +14,9 @@ node_modules
|
||||||
.next/
|
.next/
|
||||||
.pnpm-store/
|
.pnpm-store/
|
||||||
next-env.d.ts
|
next-env.d.ts
|
||||||
pnpm-workspace.yaml
|
.DS_Store
|
||||||
.DS_Store
|
|
||||||
|
# pnpm-workspace.yaml var opprinnelig ignorert (V0-sandbox-mal-standard),
|
||||||
|
# men fikk reelt, deploy-/CI-relevant innhold 2026-08-10 (allowBuilds --
|
||||||
|
# godkjenner sharp sitt install-script). Må derfor spores i git, ellers
|
||||||
|
# feiler `pnpm install` i CI med [ERR_PNPM_IGNORED_BUILDS] hver gang.
|
||||||
68
frontend/lib/geo.test.ts
Normal file
68
frontend/lib/geo.test.ts
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
import { describe, expect, it } from "vitest"
|
||||||
|
import { bearingDegrees, haversineMeters } from "./geo"
|
||||||
|
|
||||||
|
describe("haversineMeters", () => {
|
||||||
|
it("er 0 for identiske punkt", () => {
|
||||||
|
expect(haversineMeters({ lat: 59.9139, lng: 10.7522 }, { lat: 59.9139, lng: 10.7522 })).toBe(0)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("matcher en kjent fasit -- Oslo til Bergen, ca. 305 km luftlinje", () => {
|
||||||
|
// Oslo sentrum og Bergen sentrum -- ekte koordinater, ekte kjent
|
||||||
|
// omtrentlig storsirkel-avstand (ikke kjøreavstand), ikke en oppdiktet
|
||||||
|
// verdi. Toleranse ±3 km for koordinat-presisjon.
|
||||||
|
const oslo = { lat: 59.9139, lng: 10.7522 }
|
||||||
|
const bergen = { lat: 60.3913, lng: 5.3221 }
|
||||||
|
const meters = haversineMeters(oslo, bergen)
|
||||||
|
expect(meters).toBeGreaterThan(302_000)
|
||||||
|
expect(meters).toBeLessThan(308_000)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("1 breddegrad ved ekvator er ca. 111.2 km -- kjent geodetisk fasit", () => {
|
||||||
|
const meters = haversineMeters({ lat: 0, lng: 0 }, { lat: 1, lng: 0 })
|
||||||
|
expect(meters).toBeGreaterThan(110_500)
|
||||||
|
expect(meters).toBeLessThan(111_500)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("er symmetrisk (a til b == b til a)", () => {
|
||||||
|
const a = { lat: 59.91, lng: 10.75 }
|
||||||
|
const b = { lat: 59.92, lng: 10.76 }
|
||||||
|
expect(haversineMeters(a, b)).toBeCloseTo(haversineMeters(b, a), 6)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("golf-relevant kort avstand (typisk slaglengde, ca. 150 m) er presis", () => {
|
||||||
|
// 150 m nord for et fast punkt -- ren nord-sør-forskyvning, lett å
|
||||||
|
// regne ut fasit for: 150 m / 111 320 m per breddegrad.
|
||||||
|
const start = { lat: 59.9, lng: 10.75 }
|
||||||
|
const metersNorth = 150
|
||||||
|
const end = { lat: 59.9 + metersNorth / 111_320, lng: 10.75 }
|
||||||
|
expect(haversineMeters(start, end)).toBeCloseTo(metersNorth, 0)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("bearingDegrees", () => {
|
||||||
|
it("rett nord er 0 grader", () => {
|
||||||
|
expect(bearingDegrees({ lat: 59.9, lng: 10.75 }, { lat: 60.0, lng: 10.75 })).toBeCloseTo(0, 1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("rett øst er 90 grader", () => {
|
||||||
|
// På ekvator for å unngå meridiankonvergens-forvrengning ved høyere
|
||||||
|
// breddegrad -- en ren øst-forskyvning der er den enkleste fasiten.
|
||||||
|
expect(bearingDegrees({ lat: 0, lng: 10 }, { lat: 0, lng: 10.1 })).toBeCloseTo(90, 1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("rett sør er 180 grader", () => {
|
||||||
|
expect(bearingDegrees({ lat: 59.9, lng: 10.75 }, { lat: 59.8, lng: 10.75 })).toBeCloseTo(180, 1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("rett vest er 270 grader", () => {
|
||||||
|
expect(bearingDegrees({ lat: 0, lng: 10 }, { lat: 0, lng: 9.9 })).toBeCloseTo(270, 1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("returnerer alltid en verdi i [0, 360)", () => {
|
||||||
|
const a = { lat: 59.91, lng: 10.75 }
|
||||||
|
const b = { lat: 59.85, lng: 10.6 }
|
||||||
|
const bearing = bearingDegrees(a, b)
|
||||||
|
expect(bearing).toBeGreaterThanOrEqual(0)
|
||||||
|
expect(bearing).toBeLessThan(360)
|
||||||
|
})
|
||||||
|
})
|
||||||
91
frontend/lib/ny-runde/formats.test.ts
Normal file
91
frontend/lib/ny-runde/formats.test.ts
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
import { describe, expect, it } from "vitest"
|
||||||
|
import {
|
||||||
|
API_TO_FORMAT,
|
||||||
|
FORMAT_MAP,
|
||||||
|
FORMAT_TO_API,
|
||||||
|
FORMATS,
|
||||||
|
isScrambleVsSolo,
|
||||||
|
isTwoSided,
|
||||||
|
ORDINARY_FORMATS,
|
||||||
|
showsTeamStep,
|
||||||
|
SCRAMBLE_VS_SOLO,
|
||||||
|
SIDE_IS_UNIT_FORMAT,
|
||||||
|
TWO_SIDED,
|
||||||
|
apiStatLevel,
|
||||||
|
} from "./formats"
|
||||||
|
|
||||||
|
// FORMAT_TO_API er en Record<FormatId, string> -- TypeScript håndhever
|
||||||
|
// allerede ved kompilering at ALLE FormatId-verdier har en oppføring der.
|
||||||
|
// Det disse testene fanger opp er det tsc IKKE fanger: FORMATS (en vanlig
|
||||||
|
// array) og FORMAT_MAP (bygget med en `as`-cast som omgår typesjekk) kan
|
||||||
|
// bli ufullstendige uten at kompilatoren sier ifra -- akkurat den typen
|
||||||
|
// stille avvik minnenotatet om "format-klassifiseringssett" advarer mot.
|
||||||
|
|
||||||
|
describe("fullstendighet på tvers av format-lister", () => {
|
||||||
|
const apiFormatIds = Object.keys(FORMAT_TO_API) as (keyof typeof FORMAT_TO_API)[]
|
||||||
|
|
||||||
|
it("FORMATS har nøyaktig én oppføring per FormatId i FORMAT_TO_API", () => {
|
||||||
|
const formatsIds = FORMATS.map((f) => f.id).sort()
|
||||||
|
expect(formatsIds).toEqual([...apiFormatIds].sort())
|
||||||
|
})
|
||||||
|
|
||||||
|
it("FORMAT_MAP har en oppføring for hver FormatId (fanger opp `as`-castens blindsone)", () => {
|
||||||
|
for (const id of apiFormatIds) {
|
||||||
|
expect(FORMAT_MAP[id], `FORMAT_MAP mangler "${id}"`).toBeDefined()
|
||||||
|
expect(FORMAT_MAP[id].id).toBe(id)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
it("ingen to FormatId deler samme API-verdi (ellers ville API_TO_FORMAT stille mistet en)", () => {
|
||||||
|
const apiValues = Object.values(FORMAT_TO_API)
|
||||||
|
expect(new Set(apiValues).size).toBe(apiValues.length)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("API_TO_FORMAT er en eksakt invers av FORMAT_TO_API", () => {
|
||||||
|
for (const id of apiFormatIds) {
|
||||||
|
const apiValue = FORMAT_TO_API[id]
|
||||||
|
expect(API_TO_FORMAT[apiValue]).toBe(id)
|
||||||
|
}
|
||||||
|
expect(Object.keys(API_TO_FORMAT)).toHaveLength(apiFormatIds.length)
|
||||||
|
})
|
||||||
|
|
||||||
|
it.each([
|
||||||
|
["TWO_SIDED", TWO_SIDED],
|
||||||
|
["SCRAMBLE_VS_SOLO", SCRAMBLE_VS_SOLO],
|
||||||
|
["SIDE_IS_UNIT_FORMAT", SIDE_IS_UNIT_FORMAT],
|
||||||
|
["ORDINARY_FORMATS", ORDINARY_FORMATS],
|
||||||
|
])("%s inneholder kun gyldige FormatId (fanger opp skrivefeil som 'scramble_2')", (_name, list) => {
|
||||||
|
for (const id of list) {
|
||||||
|
expect(apiFormatIds, `"${id}" er ikke en gyldig FormatId`).toContain(id)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("isTwoSided / isScrambleVsSolo / showsTeamStep", () => {
|
||||||
|
it("foursome er to-sidet, singel er det ikke", () => {
|
||||||
|
expect(isTwoSided("foursome")).toBe(true)
|
||||||
|
expect(isTwoSided("slagspill")).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("scramblevssolo(match) er scramble-mot-solo, ingen andre format er det", () => {
|
||||||
|
expect(isScrambleVsSolo("scramblevssolo")).toBe(true)
|
||||||
|
expect(isScrambleVsSolo("scramblevssolomatch")).toBe(true)
|
||||||
|
expect(isScrambleVsSolo("foursome")).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("lag-steget vises for to-sidede, money ball og scramble-mot-solo -- ikke for ordinære", () => {
|
||||||
|
expect(showsTeamStep("foursome")).toBe(true)
|
||||||
|
expect(showsTeamStep("moneyball")).toBe(true)
|
||||||
|
expect(showsTeamStep("scramblevssolo")).toBe(true)
|
||||||
|
expect(showsTeamStep("slagspill")).toBe(false)
|
||||||
|
expect(showsTeamStep("stableford")).toBe(false)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("apiStatLevel", () => {
|
||||||
|
it("mapper alle tre kjente statistikk-nivåer korrekt", () => {
|
||||||
|
expect(apiStatLevel("score")).toBe("strokes_only")
|
||||||
|
expect(apiStatLevel("score_putts")).toBe("strokes_and_putts")
|
||||||
|
expect(apiStatLevel("full")).toBe("full")
|
||||||
|
})
|
||||||
|
})
|
||||||
199
frontend/lib/offline-queue.test.ts
Normal file
199
frontend/lib/offline-queue.test.ts
Normal file
|
|
@ -0,0 +1,199 @@
|
||||||
|
import "fake-indexeddb/auto"
|
||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest"
|
||||||
|
import { enqueueWrite, flushQueue, listQueue, queueCount } from "./offline-queue"
|
||||||
|
|
||||||
|
// Unik matchId per test -- IndexedDB-databasen deles på tvers av tester i
|
||||||
|
// samme fil (ingen reset mellom tester), men listQueue/flushQueue filtrerer
|
||||||
|
// alltid på matchId, så unike ID-er isolerer testene fra hverandre helt uten
|
||||||
|
// å måtte slette/gjenopprette databasen for hver test.
|
||||||
|
function uniqueMatchId(): string {
|
||||||
|
return `match-${Math.random().toString(36).slice(2)}`
|
||||||
|
}
|
||||||
|
|
||||||
|
function jsonResponse(body: unknown, ok = true, status = ok ? 200 : 409): Response {
|
||||||
|
return {
|
||||||
|
ok,
|
||||||
|
status,
|
||||||
|
json: async () => body,
|
||||||
|
} as Response
|
||||||
|
}
|
||||||
|
|
||||||
|
describe("enqueueWrite / listQueue / queueCount", () => {
|
||||||
|
it("lagrer og henter en oppføring for riktig matchId", async () => {
|
||||||
|
const matchId = uniqueMatchId()
|
||||||
|
await enqueueWrite({ url: "/x", method: "POST", body: { a: 1 }, matchId })
|
||||||
|
const entries = await listQueue(matchId)
|
||||||
|
expect(entries).toHaveLength(1)
|
||||||
|
expect(entries[0].body).toEqual({ a: 1 })
|
||||||
|
expect(await queueCount(matchId)).toBe(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("holder køer for ulike matchId helt adskilt", async () => {
|
||||||
|
const matchA = uniqueMatchId()
|
||||||
|
const matchB = uniqueMatchId()
|
||||||
|
await enqueueWrite({ url: "/x", method: "POST", body: {}, matchId: matchA })
|
||||||
|
expect(await queueCount(matchA)).toBe(1)
|
||||||
|
expect(await queueCount(matchB)).toBe(0)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("bevarer rekkefølgen entries ble lagt til i", async () => {
|
||||||
|
const matchId = uniqueMatchId()
|
||||||
|
await enqueueWrite({ url: "/x", method: "POST", body: { n: 1 }, matchId })
|
||||||
|
await enqueueWrite({ url: "/x", method: "POST", body: { n: 2 }, matchId })
|
||||||
|
await enqueueWrite({ url: "/x", method: "POST", body: { n: 3 }, matchId })
|
||||||
|
const entries = await listQueue(matchId)
|
||||||
|
expect(entries.map((e) => (e.body as { n: number }).n)).toEqual([1, 2, 3])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("flushQueue -- versjonskjeding per resourceKey (ADR-060 regresjonsvern)", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.restoreAllMocks()
|
||||||
|
})
|
||||||
|
|
||||||
|
it("kjeder expected_version fremover for FLERE skrivinger til SAMME resourceKey", async () => {
|
||||||
|
const matchId = uniqueMatchId()
|
||||||
|
await enqueueWrite({
|
||||||
|
url: "/hole-scores",
|
||||||
|
method: "POST",
|
||||||
|
body: { hole_number: 3, expected_version: 1 },
|
||||||
|
matchId,
|
||||||
|
resourceKey: "hull-3",
|
||||||
|
})
|
||||||
|
await enqueueWrite({
|
||||||
|
url: "/hole-scores",
|
||||||
|
method: "POST",
|
||||||
|
body: { hole_number: 3, expected_version: 1 }, // fortsatt "1" -- lokal state ble aldri oppdatert offline
|
||||||
|
matchId,
|
||||||
|
resourceKey: "hull-3",
|
||||||
|
})
|
||||||
|
|
||||||
|
const bodiesSent: unknown[] = []
|
||||||
|
vi.stubGlobal(
|
||||||
|
"fetch",
|
||||||
|
vi.fn(async (_url: string, init: RequestInit) => {
|
||||||
|
const body = JSON.parse(init.body as string)
|
||||||
|
bodiesSent.push(body)
|
||||||
|
return jsonResponse({ version: body.expected_version === 1 ? 2 : 3 })
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
const outcomes = await flushQueue(matchId)
|
||||||
|
expect(outcomes.every((o) => o.ok)).toBe(true)
|
||||||
|
// Første sendt med versjon 1 (som lagret), andre skal ha blitt
|
||||||
|
// OVERSTYRT til 2 (versjonen serveren returnerte fra FØRSTE skrivning i
|
||||||
|
// denne batchen) -- ikke den opprinnelig lagrede (utdaterte) "1".
|
||||||
|
expect((bodiesSent[0] as { expected_version: number }).expected_version).toBe(1)
|
||||||
|
expect((bodiesSent[1] as { expected_version: number }).expected_version).toBe(2)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("blander IKKE sammen versjon mellom to ULIKE resourceKey som deler samme URL", async () => {
|
||||||
|
// Dette er nøyaktig regresjonen som ble funnet og rettet i ADR-060:
|
||||||
|
// /hole-scores har samme URL for alle hull i en match. Uten korrekt
|
||||||
|
// nøkling ville hull 7 sin skrivning feilaktig arvet versjonen fra
|
||||||
|
// hull 3 sin skrivning i samme flush-runde.
|
||||||
|
const matchId = uniqueMatchId()
|
||||||
|
await enqueueWrite({
|
||||||
|
url: "/hole-scores",
|
||||||
|
method: "POST",
|
||||||
|
body: { hole_number: 3, expected_version: 1 },
|
||||||
|
matchId,
|
||||||
|
resourceKey: "hull-3",
|
||||||
|
})
|
||||||
|
await enqueueWrite({
|
||||||
|
url: "/hole-scores",
|
||||||
|
method: "POST",
|
||||||
|
body: { hole_number: 7, expected_version: 5 },
|
||||||
|
matchId,
|
||||||
|
resourceKey: "hull-7",
|
||||||
|
})
|
||||||
|
|
||||||
|
const bodiesSent: unknown[] = []
|
||||||
|
vi.stubGlobal(
|
||||||
|
"fetch",
|
||||||
|
vi.fn(async (_url: string, init: RequestInit) => {
|
||||||
|
const body = JSON.parse(init.body as string)
|
||||||
|
bodiesSent.push(body)
|
||||||
|
return jsonResponse({ version: 99 }) // hull 3 sin server-versjon etter skriving
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
await flushQueue(matchId)
|
||||||
|
// Hull 7 sin expected_version skal FORTSATT være 5 -- IKKE 99 (hull 3
|
||||||
|
// sin returnerte versjon), siden de er to forskjellige ressurser.
|
||||||
|
expect((bodiesSent[0] as { hole_number: number; expected_version: number }).expected_version).toBe(1)
|
||||||
|
expect((bodiesSent[1] as { hole_number: number; expected_version: number }).expected_version).toBe(5)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("faller tilbake til url som nøkkel når resourceKey ikke er satt (round_hole-bakoverkompatibilitet)", async () => {
|
||||||
|
const matchId = uniqueMatchId()
|
||||||
|
await enqueueWrite({
|
||||||
|
url: "/rounds/r1/participants/p1/holes/5",
|
||||||
|
method: "PATCH",
|
||||||
|
body: { expected_version: 1 },
|
||||||
|
matchId,
|
||||||
|
// ingen resourceKey -- samme mønster som round-detail.tsx bruker i dag
|
||||||
|
})
|
||||||
|
await enqueueWrite({
|
||||||
|
url: "/rounds/r1/participants/p1/holes/5",
|
||||||
|
method: "PATCH",
|
||||||
|
body: { expected_version: 1 },
|
||||||
|
matchId,
|
||||||
|
})
|
||||||
|
|
||||||
|
const bodiesSent: unknown[] = []
|
||||||
|
vi.stubGlobal(
|
||||||
|
"fetch",
|
||||||
|
vi.fn(async (_url: string, init: RequestInit) => {
|
||||||
|
const body = JSON.parse(init.body as string)
|
||||||
|
bodiesSent.push(body)
|
||||||
|
return jsonResponse({ version: 2 })
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
await flushQueue(matchId)
|
||||||
|
expect((bodiesSent[0] as { expected_version: number }).expected_version).toBe(1)
|
||||||
|
expect((bodiesSent[1] as { expected_version: number }).expected_version).toBe(2)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("fjerner vellykkede oppføringer fra køen, lar mislykkede stå igjen ved ekte nettverksfeil", async () => {
|
||||||
|
const matchId = uniqueMatchId()
|
||||||
|
await enqueueWrite({ url: "/x", method: "POST", body: { n: 1 }, matchId, resourceKey: "a" })
|
||||||
|
await enqueueWrite({ url: "/x", method: "POST", body: { n: 2 }, matchId, resourceKey: "b" })
|
||||||
|
|
||||||
|
let call = 0
|
||||||
|
vi.stubGlobal(
|
||||||
|
"fetch",
|
||||||
|
vi.fn(async () => {
|
||||||
|
call += 1
|
||||||
|
if (call === 1) return jsonResponse({ version: 1 })
|
||||||
|
throw new Error("offline")
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
const outcomes = await flushQueue(matchId)
|
||||||
|
expect(outcomes).toHaveLength(1)
|
||||||
|
expect(outcomes[0].ok).toBe(true)
|
||||||
|
// Andre oppføringen feilet med en EKTE nettverksfeil -- skal fortsatt
|
||||||
|
// ligge i køen til neste forsøk, ikke fjernet.
|
||||||
|
expect(await queueCount(matchId)).toBe(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("fjerner en oppføring ved en DEFINITIV HTTP-feil (f.eks. 409) og rapporterer den", async () => {
|
||||||
|
const matchId = uniqueMatchId()
|
||||||
|
await enqueueWrite({ url: "/x", method: "POST", body: {}, matchId, resourceKey: "a" })
|
||||||
|
|
||||||
|
vi.stubGlobal(
|
||||||
|
"fetch",
|
||||||
|
vi.fn(async () =>
|
||||||
|
jsonResponse({ detail: { code: "STALE_VERSION", message: "Konflikt" } }, false, 409),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
const outcomes = await flushQueue(matchId)
|
||||||
|
expect(outcomes).toHaveLength(1)
|
||||||
|
expect(outcomes[0].ok).toBe(false)
|
||||||
|
expect(outcomes[0].message).toBe("Konflikt")
|
||||||
|
expect(await queueCount(matchId)).toBe(0)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
@ -6,7 +6,8 @@
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "eslint ."
|
"lint": "eslint .",
|
||||||
|
"test": "vitest run"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@base-ui/react": "^1.5.0",
|
"@base-ui/react": "^1.5.0",
|
||||||
|
|
@ -26,8 +27,10 @@
|
||||||
"@types/node": "^24",
|
"@types/node": "^24",
|
||||||
"@types/react": "^19",
|
"@types/react": "^19",
|
||||||
"@types/react-dom": "^19",
|
"@types/react-dom": "^19",
|
||||||
|
"fake-indexeddb": "^6.2.5",
|
||||||
"postcss": "^8.5",
|
"postcss": "^8.5",
|
||||||
"tailwindcss": "^4.3.3",
|
"tailwindcss": "^4.3.3",
|
||||||
"typescript": "5.7.3"
|
"typescript": "5.7.3",
|
||||||
|
"vitest": "^4.1.10"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -54,6 +54,9 @@ importers:
|
||||||
'@types/react-dom':
|
'@types/react-dom':
|
||||||
specifier: ^19
|
specifier: ^19
|
||||||
version: 19.2.4(@types/react@19.2.18)
|
version: 19.2.4(@types/react@19.2.18)
|
||||||
|
fake-indexeddb:
|
||||||
|
specifier: ^6.2.5
|
||||||
|
version: 6.2.5
|
||||||
postcss:
|
postcss:
|
||||||
specifier: ^8.5
|
specifier: ^8.5
|
||||||
version: 8.5.26
|
version: 8.5.26
|
||||||
|
|
@ -63,6 +66,9 @@ importers:
|
||||||
typescript:
|
typescript:
|
||||||
specifier: 5.7.3
|
specifier: 5.7.3
|
||||||
version: 5.7.3
|
version: 5.7.3
|
||||||
|
vitest:
|
||||||
|
specifier: ^4.1.10
|
||||||
|
version: 4.1.10(@types/node@24.13.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
|
|
@ -507,6 +513,102 @@ packages:
|
||||||
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|
||||||
|
'@oxc-project/types@0.143.0':
|
||||||
|
resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==}
|
||||||
|
|
||||||
|
'@rolldown/binding-android-arm64@1.2.3':
|
||||||
|
resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [android]
|
||||||
|
|
||||||
|
'@rolldown/binding-darwin-arm64@1.2.3':
|
||||||
|
resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
'@rolldown/binding-darwin-x64@1.2.3':
|
||||||
|
resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
'@rolldown/binding-freebsd-x64@1.2.3':
|
||||||
|
resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [freebsd]
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-arm-gnueabihf@1.2.3':
|
||||||
|
resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [arm]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-arm64-gnu@1.2.3':
|
||||||
|
resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-arm64-musl@1.2.3':
|
||||||
|
resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [musl]
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-ppc64-gnu@1.2.3':
|
||||||
|
resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [ppc64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-s390x-gnu@1.2.3':
|
||||||
|
resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [s390x]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-x64-gnu@1.2.3':
|
||||||
|
resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-x64-musl@1.2.3':
|
||||||
|
resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [musl]
|
||||||
|
|
||||||
|
'@rolldown/binding-openharmony-arm64@1.2.3':
|
||||||
|
resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [openharmony]
|
||||||
|
|
||||||
|
'@rolldown/binding-win32-arm64-msvc@1.2.3':
|
||||||
|
resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
'@rolldown/binding-win32-x64-msvc@1.2.3':
|
||||||
|
resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
'@rolldown/pluginutils@1.0.1':
|
||||||
|
resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
|
||||||
|
|
||||||
'@sec-ant/readable-stream@0.4.1':
|
'@sec-ant/readable-stream@0.4.1':
|
||||||
resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
|
resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
|
||||||
|
|
||||||
|
|
@ -514,6 +616,9 @@ packages:
|
||||||
resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
|
resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
'@standard-schema/spec@1.1.0':
|
||||||
|
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
|
||||||
|
|
||||||
'@swc/helpers@0.5.15':
|
'@swc/helpers@0.5.15':
|
||||||
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
|
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
|
||||||
|
|
||||||
|
|
@ -612,6 +717,15 @@ packages:
|
||||||
'@ts-morph/common@0.27.0':
|
'@ts-morph/common@0.27.0':
|
||||||
resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==}
|
resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==}
|
||||||
|
|
||||||
|
'@types/chai@5.2.3':
|
||||||
|
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
|
||||||
|
|
||||||
|
'@types/deep-eql@4.0.2':
|
||||||
|
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
|
||||||
|
|
||||||
|
'@types/estree@1.0.9':
|
||||||
|
resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
|
||||||
|
|
||||||
'@types/node@24.13.3':
|
'@types/node@24.13.3':
|
||||||
resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==}
|
resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==}
|
||||||
|
|
||||||
|
|
@ -626,6 +740,35 @@ packages:
|
||||||
'@types/validate-npm-package-name@4.0.2':
|
'@types/validate-npm-package-name@4.0.2':
|
||||||
resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==}
|
resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==}
|
||||||
|
|
||||||
|
'@vitest/expect@4.1.10':
|
||||||
|
resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==}
|
||||||
|
|
||||||
|
'@vitest/mocker@4.1.10':
|
||||||
|
resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==}
|
||||||
|
peerDependencies:
|
||||||
|
msw: ^2.4.9
|
||||||
|
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
|
||||||
|
peerDependenciesMeta:
|
||||||
|
msw:
|
||||||
|
optional: true
|
||||||
|
vite:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@vitest/pretty-format@4.1.10':
|
||||||
|
resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==}
|
||||||
|
|
||||||
|
'@vitest/runner@4.1.10':
|
||||||
|
resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==}
|
||||||
|
|
||||||
|
'@vitest/snapshot@4.1.10':
|
||||||
|
resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==}
|
||||||
|
|
||||||
|
'@vitest/spy@4.1.10':
|
||||||
|
resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==}
|
||||||
|
|
||||||
|
'@vitest/utils@4.1.10':
|
||||||
|
resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==}
|
||||||
|
|
||||||
accepts@2.0.0:
|
accepts@2.0.0:
|
||||||
resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
|
resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
|
@ -664,6 +807,10 @@ packages:
|
||||||
argparse@2.0.1:
|
argparse@2.0.1:
|
||||||
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
|
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
|
||||||
|
|
||||||
|
assertion-error@2.0.1:
|
||||||
|
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
ast-types@0.16.1:
|
ast-types@0.16.1:
|
||||||
resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
|
resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
|
|
@ -721,6 +868,10 @@ packages:
|
||||||
caniuse-lite@1.0.30001807:
|
caniuse-lite@1.0.30001807:
|
||||||
resolution: {integrity: sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==}
|
resolution: {integrity: sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==}
|
||||||
|
|
||||||
|
chai@6.2.2:
|
||||||
|
resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
chalk@5.6.2:
|
chalk@5.6.2:
|
||||||
resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
|
resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
|
||||||
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
|
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
|
||||||
|
|
@ -907,6 +1058,9 @@ packages:
|
||||||
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
es-module-lexer@2.3.1:
|
||||||
|
resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==}
|
||||||
|
|
||||||
es-object-atoms@1.1.2:
|
es-object-atoms@1.1.2:
|
||||||
resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
|
resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
@ -923,6 +1077,9 @@ packages:
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
estree-walker@3.0.3:
|
||||||
|
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
|
||||||
|
|
||||||
etag@1.8.1:
|
etag@1.8.1:
|
||||||
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
|
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
|
@ -943,6 +1100,10 @@ packages:
|
||||||
resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==}
|
resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==}
|
||||||
engines: {node: ^18.19.0 || >=20.5.0}
|
engines: {node: ^18.19.0 || >=20.5.0}
|
||||||
|
|
||||||
|
expect-type@1.4.0:
|
||||||
|
resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==}
|
||||||
|
engines: {node: '>=12.0.0'}
|
||||||
|
|
||||||
express-rate-limit@8.6.2:
|
express-rate-limit@8.6.2:
|
||||||
resolution: {integrity: sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==}
|
resolution: {integrity: sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==}
|
||||||
engines: {node: '>= 16'}
|
engines: {node: '>= 16'}
|
||||||
|
|
@ -953,6 +1114,10 @@ packages:
|
||||||
resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
|
resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
|
||||||
engines: {node: '>= 18'}
|
engines: {node: '>= 18'}
|
||||||
|
|
||||||
|
fake-indexeddb@6.2.5:
|
||||||
|
resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
fast-deep-equal@3.1.3:
|
fast-deep-equal@3.1.3:
|
||||||
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
|
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
|
||||||
|
|
||||||
|
|
@ -1003,6 +1168,11 @@ packages:
|
||||||
resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==}
|
resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==}
|
||||||
engines: {node: '>=14.14'}
|
engines: {node: '>=14.14'}
|
||||||
|
|
||||||
|
fsevents@2.3.3:
|
||||||
|
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
||||||
|
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
function-bind@1.1.2:
|
function-bind@1.1.2:
|
||||||
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
|
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
|
||||||
|
|
||||||
|
|
@ -1236,30 +1406,60 @@ packages:
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
|
lightningcss-android-arm64@1.33.0:
|
||||||
|
resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [android]
|
||||||
|
|
||||||
lightningcss-darwin-arm64@1.32.0:
|
lightningcss-darwin-arm64@1.32.0:
|
||||||
resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
|
resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
|
lightningcss-darwin-arm64@1.33.0:
|
||||||
|
resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
lightningcss-darwin-x64@1.32.0:
|
lightningcss-darwin-x64@1.32.0:
|
||||||
resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
|
resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
|
lightningcss-darwin-x64@1.33.0:
|
||||||
|
resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
lightningcss-freebsd-x64@1.32.0:
|
lightningcss-freebsd-x64@1.32.0:
|
||||||
resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
|
resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [freebsd]
|
os: [freebsd]
|
||||||
|
|
||||||
|
lightningcss-freebsd-x64@1.33.0:
|
||||||
|
resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [freebsd]
|
||||||
|
|
||||||
lightningcss-linux-arm-gnueabihf@1.32.0:
|
lightningcss-linux-arm-gnueabihf@1.32.0:
|
||||||
resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
|
resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
|
lightningcss-linux-arm-gnueabihf@1.33.0:
|
||||||
|
resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [arm]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
lightningcss-linux-arm64-gnu@1.32.0:
|
lightningcss-linux-arm64-gnu@1.32.0:
|
||||||
resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
|
resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
|
|
@ -1267,6 +1467,13 @@ packages:
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
|
lightningcss-linux-arm64-gnu@1.33.0:
|
||||||
|
resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
lightningcss-linux-arm64-musl@1.32.0:
|
lightningcss-linux-arm64-musl@1.32.0:
|
||||||
resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
|
resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
|
|
@ -1274,6 +1481,13 @@ packages:
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
libc: [musl]
|
||||||
|
|
||||||
|
lightningcss-linux-arm64-musl@1.33.0:
|
||||||
|
resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [musl]
|
||||||
|
|
||||||
lightningcss-linux-x64-gnu@1.32.0:
|
lightningcss-linux-x64-gnu@1.32.0:
|
||||||
resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
|
resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
|
|
@ -1281,6 +1495,13 @@ packages:
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
|
lightningcss-linux-x64-gnu@1.33.0:
|
||||||
|
resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
lightningcss-linux-x64-musl@1.32.0:
|
lightningcss-linux-x64-musl@1.32.0:
|
||||||
resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
|
resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
|
|
@ -1288,22 +1509,45 @@ packages:
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
libc: [musl]
|
||||||
|
|
||||||
|
lightningcss-linux-x64-musl@1.33.0:
|
||||||
|
resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [musl]
|
||||||
|
|
||||||
lightningcss-win32-arm64-msvc@1.32.0:
|
lightningcss-win32-arm64-msvc@1.32.0:
|
||||||
resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
|
resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
|
lightningcss-win32-arm64-msvc@1.33.0:
|
||||||
|
resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
lightningcss-win32-x64-msvc@1.32.0:
|
lightningcss-win32-x64-msvc@1.32.0:
|
||||||
resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
|
resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
|
lightningcss-win32-x64-msvc@1.33.0:
|
||||||
|
resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
lightningcss@1.32.0:
|
lightningcss@1.32.0:
|
||||||
resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
|
resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
|
|
||||||
|
lightningcss@1.33.0:
|
||||||
|
resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
|
||||||
|
engines: {node: '>= 12.0.0'}
|
||||||
|
|
||||||
lines-and-columns@1.2.4:
|
lines-and-columns@1.2.4:
|
||||||
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
||||||
|
|
||||||
|
|
@ -1436,6 +1680,10 @@ packages:
|
||||||
resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==}
|
resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
|
|
||||||
|
obug@2.1.4:
|
||||||
|
resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==}
|
||||||
|
engines: {node: '>=12.20.0'}
|
||||||
|
|
||||||
on-finished@2.4.1:
|
on-finished@2.4.1:
|
||||||
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
|
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
|
@ -1509,6 +1757,9 @@ packages:
|
||||||
path-to-regexp@8.4.2:
|
path-to-regexp@8.4.2:
|
||||||
resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
|
resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
|
||||||
|
|
||||||
|
pathe@2.0.3:
|
||||||
|
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
|
||||||
|
|
||||||
picocolors@1.1.1:
|
picocolors@1.1.1:
|
||||||
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
|
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
|
||||||
|
|
||||||
|
|
@ -1603,6 +1854,11 @@ packages:
|
||||||
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
|
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
|
||||||
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
|
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
|
||||||
|
|
||||||
|
rolldown@1.2.3:
|
||||||
|
resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
router@2.2.0:
|
router@2.2.0:
|
||||||
resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
|
resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
|
||||||
engines: {node: '>= 18'}
|
engines: {node: '>= 18'}
|
||||||
|
|
@ -1673,6 +1929,9 @@ packages:
|
||||||
resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
|
resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
siginfo@2.0.0:
|
||||||
|
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
|
||||||
|
|
||||||
signal-exit@3.0.7:
|
signal-exit@3.0.7:
|
||||||
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
|
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
|
||||||
|
|
||||||
|
|
@ -1691,10 +1950,16 @@ packages:
|
||||||
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
|
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
|
stackback@0.0.2:
|
||||||
|
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
|
||||||
|
|
||||||
statuses@2.0.2:
|
statuses@2.0.2:
|
||||||
resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
|
resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
|
std-env@4.2.0:
|
||||||
|
resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==}
|
||||||
|
|
||||||
stdin-discarder@0.2.2:
|
stdin-discarder@0.2.2:
|
||||||
resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
|
resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
|
@ -1759,6 +2024,21 @@ packages:
|
||||||
tiny-invariant@1.3.3:
|
tiny-invariant@1.3.3:
|
||||||
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
|
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
|
||||||
|
|
||||||
|
tinybench@2.9.0:
|
||||||
|
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
|
||||||
|
|
||||||
|
tinyexec@1.3.0:
|
||||||
|
resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
tinyglobby@0.2.17:
|
||||||
|
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
|
||||||
|
engines: {node: '>=12.0.0'}
|
||||||
|
|
||||||
|
tinyrainbow@3.1.1:
|
||||||
|
resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==}
|
||||||
|
engines: {node: '>=14.0.0'}
|
||||||
|
|
||||||
to-regex-range@5.0.1:
|
to-regex-range@5.0.1:
|
||||||
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
||||||
engines: {node: '>=8.0'}
|
engines: {node: '>=8.0'}
|
||||||
|
|
@ -1830,6 +2110,90 @@ packages:
|
||||||
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
|
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
|
vite@8.2.1:
|
||||||
|
resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==}
|
||||||
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
|
hasBin: true
|
||||||
|
peerDependencies:
|
||||||
|
'@types/node': ^20.19.0 || >=22.12.0
|
||||||
|
'@vitejs/devtools': ^0.4.0
|
||||||
|
esbuild: ^0.27.0 || ^0.28.0
|
||||||
|
jiti: '>=1.21.0'
|
||||||
|
less: ^4.0.0
|
||||||
|
sass: ^1.70.0
|
||||||
|
sass-embedded: ^1.70.0
|
||||||
|
stylus: '>=0.54.8'
|
||||||
|
sugarss: ^5.0.0
|
||||||
|
terser: ^5.16.0
|
||||||
|
tsx: ^4.8.1
|
||||||
|
yaml: ^2.4.2
|
||||||
|
peerDependenciesMeta:
|
||||||
|
'@types/node':
|
||||||
|
optional: true
|
||||||
|
'@vitejs/devtools':
|
||||||
|
optional: true
|
||||||
|
esbuild:
|
||||||
|
optional: true
|
||||||
|
jiti:
|
||||||
|
optional: true
|
||||||
|
less:
|
||||||
|
optional: true
|
||||||
|
sass:
|
||||||
|
optional: true
|
||||||
|
sass-embedded:
|
||||||
|
optional: true
|
||||||
|
stylus:
|
||||||
|
optional: true
|
||||||
|
sugarss:
|
||||||
|
optional: true
|
||||||
|
terser:
|
||||||
|
optional: true
|
||||||
|
tsx:
|
||||||
|
optional: true
|
||||||
|
yaml:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
vitest@4.1.10:
|
||||||
|
resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==}
|
||||||
|
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
|
||||||
|
hasBin: true
|
||||||
|
peerDependencies:
|
||||||
|
'@edge-runtime/vm': '*'
|
||||||
|
'@opentelemetry/api': ^1.9.0
|
||||||
|
'@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
|
||||||
|
'@vitest/browser-playwright': 4.1.10
|
||||||
|
'@vitest/browser-preview': 4.1.10
|
||||||
|
'@vitest/browser-webdriverio': 4.1.10
|
||||||
|
'@vitest/coverage-istanbul': 4.1.10
|
||||||
|
'@vitest/coverage-v8': 4.1.10
|
||||||
|
'@vitest/ui': 4.1.10
|
||||||
|
happy-dom: '*'
|
||||||
|
jsdom: '*'
|
||||||
|
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
|
||||||
|
peerDependenciesMeta:
|
||||||
|
'@edge-runtime/vm':
|
||||||
|
optional: true
|
||||||
|
'@opentelemetry/api':
|
||||||
|
optional: true
|
||||||
|
'@types/node':
|
||||||
|
optional: true
|
||||||
|
'@vitest/browser-playwright':
|
||||||
|
optional: true
|
||||||
|
'@vitest/browser-preview':
|
||||||
|
optional: true
|
||||||
|
'@vitest/browser-webdriverio':
|
||||||
|
optional: true
|
||||||
|
'@vitest/coverage-istanbul':
|
||||||
|
optional: true
|
||||||
|
'@vitest/coverage-v8':
|
||||||
|
optional: true
|
||||||
|
'@vitest/ui':
|
||||||
|
optional: true
|
||||||
|
happy-dom:
|
||||||
|
optional: true
|
||||||
|
jsdom:
|
||||||
|
optional: true
|
||||||
|
|
||||||
which@2.0.2:
|
which@2.0.2:
|
||||||
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
|
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|
@ -1840,6 +2204,11 @@ packages:
|
||||||
engines: {node: ^16.13.0 || >=18.0.0}
|
engines: {node: ^16.13.0 || >=18.0.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
why-is-node-running@2.3.0:
|
||||||
|
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
wrappy@1.0.2:
|
wrappy@1.0.2:
|
||||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||||
|
|
||||||
|
|
@ -2304,10 +2673,58 @@ snapshots:
|
||||||
'@nodelib/fs.scandir': 2.1.5
|
'@nodelib/fs.scandir': 2.1.5
|
||||||
fastq: 1.20.1
|
fastq: 1.20.1
|
||||||
|
|
||||||
|
'@oxc-project/types@0.143.0': {}
|
||||||
|
|
||||||
|
'@rolldown/binding-android-arm64@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-darwin-arm64@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-darwin-x64@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-freebsd-x64@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-arm-gnueabihf@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-arm64-gnu@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-arm64-musl@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-ppc64-gnu@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-s390x-gnu@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-x64-gnu@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-linux-x64-musl@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-openharmony-arm64@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-win32-arm64-msvc@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/binding-win32-x64-msvc@1.2.3':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@rolldown/pluginutils@1.0.1': {}
|
||||||
|
|
||||||
'@sec-ant/readable-stream@0.4.1': {}
|
'@sec-ant/readable-stream@0.4.1': {}
|
||||||
|
|
||||||
'@sindresorhus/merge-streams@4.0.0': {}
|
'@sindresorhus/merge-streams@4.0.0': {}
|
||||||
|
|
||||||
|
'@standard-schema/spec@1.1.0': {}
|
||||||
|
|
||||||
'@swc/helpers@0.5.15':
|
'@swc/helpers@0.5.15':
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
|
|
@ -2387,6 +2804,15 @@ snapshots:
|
||||||
minimatch: 10.2.6
|
minimatch: 10.2.6
|
||||||
path-browserify: 1.0.1
|
path-browserify: 1.0.1
|
||||||
|
|
||||||
|
'@types/chai@5.2.3':
|
||||||
|
dependencies:
|
||||||
|
'@types/deep-eql': 4.0.2
|
||||||
|
assertion-error: 2.0.1
|
||||||
|
|
||||||
|
'@types/deep-eql@4.0.2': {}
|
||||||
|
|
||||||
|
'@types/estree@1.0.9': {}
|
||||||
|
|
||||||
'@types/node@24.13.3':
|
'@types/node@24.13.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types: 7.18.2
|
undici-types: 7.18.2
|
||||||
|
|
@ -2401,6 +2827,47 @@ snapshots:
|
||||||
|
|
||||||
'@types/validate-npm-package-name@4.0.2': {}
|
'@types/validate-npm-package-name@4.0.2': {}
|
||||||
|
|
||||||
|
'@vitest/expect@4.1.10':
|
||||||
|
dependencies:
|
||||||
|
'@standard-schema/spec': 1.1.0
|
||||||
|
'@types/chai': 5.2.3
|
||||||
|
'@vitest/spy': 4.1.10
|
||||||
|
'@vitest/utils': 4.1.10
|
||||||
|
chai: 6.2.2
|
||||||
|
tinyrainbow: 3.1.1
|
||||||
|
|
||||||
|
'@vitest/mocker@4.1.10(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))':
|
||||||
|
dependencies:
|
||||||
|
'@vitest/spy': 4.1.10
|
||||||
|
estree-walker: 3.0.3
|
||||||
|
magic-string: 0.30.21
|
||||||
|
optionalDependencies:
|
||||||
|
vite: 8.2.1(@types/node@24.13.3)(jiti@2.7.0)
|
||||||
|
|
||||||
|
'@vitest/pretty-format@4.1.10':
|
||||||
|
dependencies:
|
||||||
|
tinyrainbow: 3.1.1
|
||||||
|
|
||||||
|
'@vitest/runner@4.1.10':
|
||||||
|
dependencies:
|
||||||
|
'@vitest/utils': 4.1.10
|
||||||
|
pathe: 2.0.3
|
||||||
|
|
||||||
|
'@vitest/snapshot@4.1.10':
|
||||||
|
dependencies:
|
||||||
|
'@vitest/pretty-format': 4.1.10
|
||||||
|
'@vitest/utils': 4.1.10
|
||||||
|
magic-string: 0.30.21
|
||||||
|
pathe: 2.0.3
|
||||||
|
|
||||||
|
'@vitest/spy@4.1.10': {}
|
||||||
|
|
||||||
|
'@vitest/utils@4.1.10':
|
||||||
|
dependencies:
|
||||||
|
'@vitest/pretty-format': 4.1.10
|
||||||
|
convert-source-map: 2.0.0
|
||||||
|
tinyrainbow: 3.1.1
|
||||||
|
|
||||||
accepts@2.0.0:
|
accepts@2.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
mime-types: 3.0.2
|
mime-types: 3.0.2
|
||||||
|
|
@ -2429,6 +2896,8 @@ snapshots:
|
||||||
|
|
||||||
argparse@2.0.1: {}
|
argparse@2.0.1: {}
|
||||||
|
|
||||||
|
assertion-error@2.0.1: {}
|
||||||
|
|
||||||
ast-types@0.16.1:
|
ast-types@0.16.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
|
|
@ -2489,6 +2958,8 @@ snapshots:
|
||||||
|
|
||||||
caniuse-lite@1.0.30001807: {}
|
caniuse-lite@1.0.30001807: {}
|
||||||
|
|
||||||
|
chai@6.2.2: {}
|
||||||
|
|
||||||
chalk@5.6.2: {}
|
chalk@5.6.2: {}
|
||||||
|
|
||||||
class-variance-authority@0.7.1:
|
class-variance-authority@0.7.1:
|
||||||
|
|
@ -2629,6 +3100,8 @@ snapshots:
|
||||||
|
|
||||||
es-errors@1.3.0: {}
|
es-errors@1.3.0: {}
|
||||||
|
|
||||||
|
es-module-lexer@2.3.1: {}
|
||||||
|
|
||||||
es-object-atoms@1.1.2:
|
es-object-atoms@1.1.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
es-errors: 1.3.0
|
es-errors: 1.3.0
|
||||||
|
|
@ -2639,6 +3112,10 @@ snapshots:
|
||||||
|
|
||||||
esprima@4.0.1: {}
|
esprima@4.0.1: {}
|
||||||
|
|
||||||
|
estree-walker@3.0.3:
|
||||||
|
dependencies:
|
||||||
|
'@types/estree': 1.0.9
|
||||||
|
|
||||||
etag@1.8.1: {}
|
etag@1.8.1: {}
|
||||||
|
|
||||||
eventsource-parser@3.1.0: {}
|
eventsource-parser@3.1.0: {}
|
||||||
|
|
@ -2674,6 +3151,8 @@ snapshots:
|
||||||
strip-final-newline: 4.0.0
|
strip-final-newline: 4.0.0
|
||||||
yoctocolors: 2.2.0
|
yoctocolors: 2.2.0
|
||||||
|
|
||||||
|
expect-type@1.4.0: {}
|
||||||
|
|
||||||
express-rate-limit@8.6.2(express@5.2.1):
|
express-rate-limit@8.6.2(express@5.2.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
|
|
@ -2715,6 +3194,8 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
fake-indexeddb@6.2.5: {}
|
||||||
|
|
||||||
fast-deep-equal@3.1.3: {}
|
fast-deep-equal@3.1.3: {}
|
||||||
|
|
||||||
fast-glob@3.3.3:
|
fast-glob@3.3.3:
|
||||||
|
|
@ -2768,6 +3249,9 @@ snapshots:
|
||||||
jsonfile: 6.2.1
|
jsonfile: 6.2.1
|
||||||
universalify: 2.0.1
|
universalify: 2.0.1
|
||||||
|
|
||||||
|
fsevents@2.3.3:
|
||||||
|
optional: true
|
||||||
|
|
||||||
function-bind@1.1.2: {}
|
function-bind@1.1.2: {}
|
||||||
|
|
||||||
fuzzysort@3.1.0: {}
|
fuzzysort@3.1.0: {}
|
||||||
|
|
@ -2935,36 +3419,69 @@ snapshots:
|
||||||
lightningcss-android-arm64@1.32.0:
|
lightningcss-android-arm64@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-android-arm64@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss-darwin-arm64@1.32.0:
|
lightningcss-darwin-arm64@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-darwin-arm64@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss-darwin-x64@1.32.0:
|
lightningcss-darwin-x64@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-darwin-x64@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss-freebsd-x64@1.32.0:
|
lightningcss-freebsd-x64@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-freebsd-x64@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss-linux-arm-gnueabihf@1.32.0:
|
lightningcss-linux-arm-gnueabihf@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-linux-arm-gnueabihf@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss-linux-arm64-gnu@1.32.0:
|
lightningcss-linux-arm64-gnu@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-linux-arm64-gnu@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss-linux-arm64-musl@1.32.0:
|
lightningcss-linux-arm64-musl@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-linux-arm64-musl@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss-linux-x64-gnu@1.32.0:
|
lightningcss-linux-x64-gnu@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-linux-x64-gnu@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss-linux-x64-musl@1.32.0:
|
lightningcss-linux-x64-musl@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-linux-x64-musl@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss-win32-arm64-msvc@1.32.0:
|
lightningcss-win32-arm64-msvc@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-win32-arm64-msvc@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss-win32-x64-msvc@1.32.0:
|
lightningcss-win32-x64-msvc@1.32.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
lightningcss-win32-x64-msvc@1.33.0:
|
||||||
|
optional: true
|
||||||
|
|
||||||
lightningcss@1.32.0:
|
lightningcss@1.32.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
detect-libc: 2.1.2
|
detect-libc: 2.1.2
|
||||||
|
|
@ -2981,6 +3498,22 @@ snapshots:
|
||||||
lightningcss-win32-arm64-msvc: 1.32.0
|
lightningcss-win32-arm64-msvc: 1.32.0
|
||||||
lightningcss-win32-x64-msvc: 1.32.0
|
lightningcss-win32-x64-msvc: 1.32.0
|
||||||
|
|
||||||
|
lightningcss@1.33.0:
|
||||||
|
dependencies:
|
||||||
|
detect-libc: 2.1.2
|
||||||
|
optionalDependencies:
|
||||||
|
lightningcss-android-arm64: 1.33.0
|
||||||
|
lightningcss-darwin-arm64: 1.33.0
|
||||||
|
lightningcss-darwin-x64: 1.33.0
|
||||||
|
lightningcss-freebsd-x64: 1.33.0
|
||||||
|
lightningcss-linux-arm-gnueabihf: 1.33.0
|
||||||
|
lightningcss-linux-arm64-gnu: 1.33.0
|
||||||
|
lightningcss-linux-arm64-musl: 1.33.0
|
||||||
|
lightningcss-linux-x64-gnu: 1.33.0
|
||||||
|
lightningcss-linux-x64-musl: 1.33.0
|
||||||
|
lightningcss-win32-arm64-msvc: 1.33.0
|
||||||
|
lightningcss-win32-x64-msvc: 1.33.0
|
||||||
|
|
||||||
lines-and-columns@1.2.4: {}
|
lines-and-columns@1.2.4: {}
|
||||||
|
|
||||||
locate-path@3.0.0:
|
locate-path@3.0.0:
|
||||||
|
|
@ -3087,6 +3620,8 @@ snapshots:
|
||||||
|
|
||||||
object-treeify@1.1.33: {}
|
object-treeify@1.1.33: {}
|
||||||
|
|
||||||
|
obug@2.1.4: {}
|
||||||
|
|
||||||
on-finished@2.4.1:
|
on-finished@2.4.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
ee-first: 1.1.1
|
ee-first: 1.1.1
|
||||||
|
|
@ -3165,6 +3700,8 @@ snapshots:
|
||||||
|
|
||||||
path-to-regexp@8.4.2: {}
|
path-to-regexp@8.4.2: {}
|
||||||
|
|
||||||
|
pathe@2.0.3: {}
|
||||||
|
|
||||||
picocolors@1.1.1: {}
|
picocolors@1.1.1: {}
|
||||||
|
|
||||||
picomatch@2.3.2: {}
|
picomatch@2.3.2: {}
|
||||||
|
|
@ -3254,6 +3791,26 @@ snapshots:
|
||||||
|
|
||||||
reusify@1.1.0: {}
|
reusify@1.1.0: {}
|
||||||
|
|
||||||
|
rolldown@1.2.3:
|
||||||
|
dependencies:
|
||||||
|
'@oxc-project/types': 0.143.0
|
||||||
|
'@rolldown/pluginutils': 1.0.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@rolldown/binding-android-arm64': 1.2.3
|
||||||
|
'@rolldown/binding-darwin-arm64': 1.2.3
|
||||||
|
'@rolldown/binding-darwin-x64': 1.2.3
|
||||||
|
'@rolldown/binding-freebsd-x64': 1.2.3
|
||||||
|
'@rolldown/binding-linux-arm-gnueabihf': 1.2.3
|
||||||
|
'@rolldown/binding-linux-arm64-gnu': 1.2.3
|
||||||
|
'@rolldown/binding-linux-arm64-musl': 1.2.3
|
||||||
|
'@rolldown/binding-linux-ppc64-gnu': 1.2.3
|
||||||
|
'@rolldown/binding-linux-s390x-gnu': 1.2.3
|
||||||
|
'@rolldown/binding-linux-x64-gnu': 1.2.3
|
||||||
|
'@rolldown/binding-linux-x64-musl': 1.2.3
|
||||||
|
'@rolldown/binding-openharmony-arm64': 1.2.3
|
||||||
|
'@rolldown/binding-win32-arm64-msvc': 1.2.3
|
||||||
|
'@rolldown/binding-win32-x64-msvc': 1.2.3
|
||||||
|
|
||||||
router@2.2.0:
|
router@2.2.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
|
|
@ -3411,6 +3968,8 @@ snapshots:
|
||||||
side-channel-map: 1.0.1
|
side-channel-map: 1.0.1
|
||||||
side-channel-weakmap: 1.0.2
|
side-channel-weakmap: 1.0.2
|
||||||
|
|
||||||
|
siginfo@2.0.0: {}
|
||||||
|
|
||||||
signal-exit@3.0.7: {}
|
signal-exit@3.0.7: {}
|
||||||
|
|
||||||
signal-exit@4.1.0: {}
|
signal-exit@4.1.0: {}
|
||||||
|
|
@ -3421,8 +3980,12 @@ snapshots:
|
||||||
|
|
||||||
source-map@0.6.1: {}
|
source-map@0.6.1: {}
|
||||||
|
|
||||||
|
stackback@0.0.2: {}
|
||||||
|
|
||||||
statuses@2.0.2: {}
|
statuses@2.0.2: {}
|
||||||
|
|
||||||
|
std-env@4.2.0: {}
|
||||||
|
|
||||||
stdin-discarder@0.2.2: {}
|
stdin-discarder@0.2.2: {}
|
||||||
|
|
||||||
string-width@7.2.0:
|
string-width@7.2.0:
|
||||||
|
|
@ -3468,6 +4031,17 @@ snapshots:
|
||||||
|
|
||||||
tiny-invariant@1.3.3: {}
|
tiny-invariant@1.3.3: {}
|
||||||
|
|
||||||
|
tinybench@2.9.0: {}
|
||||||
|
|
||||||
|
tinyexec@1.3.0: {}
|
||||||
|
|
||||||
|
tinyglobby@0.2.17:
|
||||||
|
dependencies:
|
||||||
|
fdir: 6.5.0(picomatch@4.0.5)
|
||||||
|
picomatch: 4.0.5
|
||||||
|
|
||||||
|
tinyrainbow@3.1.1: {}
|
||||||
|
|
||||||
to-regex-range@5.0.1:
|
to-regex-range@5.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
is-number: 7.0.0
|
is-number: 7.0.0
|
||||||
|
|
@ -3523,6 +4097,45 @@ snapshots:
|
||||||
|
|
||||||
vary@1.1.2: {}
|
vary@1.1.2: {}
|
||||||
|
|
||||||
|
vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0):
|
||||||
|
dependencies:
|
||||||
|
lightningcss: 1.33.0
|
||||||
|
picomatch: 4.0.5
|
||||||
|
postcss: 8.5.26
|
||||||
|
rolldown: 1.2.3
|
||||||
|
tinyglobby: 0.2.17
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/node': 24.13.3
|
||||||
|
fsevents: 2.3.3
|
||||||
|
jiti: 2.7.0
|
||||||
|
|
||||||
|
vitest@4.1.10(@types/node@24.13.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)):
|
||||||
|
dependencies:
|
||||||
|
'@vitest/expect': 4.1.10
|
||||||
|
'@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))
|
||||||
|
'@vitest/pretty-format': 4.1.10
|
||||||
|
'@vitest/runner': 4.1.10
|
||||||
|
'@vitest/snapshot': 4.1.10
|
||||||
|
'@vitest/spy': 4.1.10
|
||||||
|
'@vitest/utils': 4.1.10
|
||||||
|
es-module-lexer: 2.3.1
|
||||||
|
expect-type: 1.4.0
|
||||||
|
magic-string: 0.30.21
|
||||||
|
obug: 2.1.4
|
||||||
|
pathe: 2.0.3
|
||||||
|
picomatch: 4.0.5
|
||||||
|
std-env: 4.2.0
|
||||||
|
tinybench: 2.9.0
|
||||||
|
tinyexec: 1.3.0
|
||||||
|
tinyglobby: 0.2.17
|
||||||
|
tinyrainbow: 3.1.1
|
||||||
|
vite: 8.2.1(@types/node@24.13.3)(jiti@2.7.0)
|
||||||
|
why-is-node-running: 2.3.0
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/node': 24.13.3
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- msw
|
||||||
|
|
||||||
which@2.0.2:
|
which@2.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
isexe: 2.0.0
|
isexe: 2.0.0
|
||||||
|
|
@ -3531,6 +4144,11 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
isexe: 3.1.5
|
isexe: 3.1.5
|
||||||
|
|
||||||
|
why-is-node-running@2.3.0:
|
||||||
|
dependencies:
|
||||||
|
siginfo: 2.0.0
|
||||||
|
stackback: 0.0.2
|
||||||
|
|
||||||
wrappy@1.0.2: {}
|
wrappy@1.0.2: {}
|
||||||
|
|
||||||
wsl-utils@0.3.1:
|
wsl-utils@0.3.1:
|
||||||
|
|
|
||||||
2
frontend/pnpm-workspace.yaml
Normal file
2
frontend/pnpm-workspace.yaml
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
allowBuilds:
|
||||||
|
sharp: true
|
||||||
10
frontend/vitest.config.mts
Normal file
10
frontend/vitest.config.mts
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
import { defineConfig } from "vitest/config"
|
||||||
|
|
||||||
|
// Ren logikk-testing (lib/*) denne runden -- node-miljø holder, ingen
|
||||||
|
// jsdom/@testing-library ennå (ingen komponenttester skrevet ennå).
|
||||||
|
export default defineConfig({
|
||||||
|
test: {
|
||||||
|
environment: "node",
|
||||||
|
include: ["lib/**/*.test.ts"],
|
||||||
|
},
|
||||||
|
})
|
||||||
Loading…
Reference in a new issue