void',
+ 'Called about 60 times a second while playing.',
+ ],
+ [
+ 'onStartNewTrack',
+ '(track: TrackInfo) => void',
+ 'Called whenever a different track becomes current, for any reason.',
+ ],
+ [
+ 'onPlayNextTrack',
+ '(track: TrackInfo) => void',
+ 'Called when the queue advances to the next track.',
+ ],
+ [
+ 'onPlayPreviousTrack',
+ '(track: TrackInfo) => void',
+ 'Called when the queue goes back a track.',
+ ],
+ ['onEnded', '() => void', 'Called when the last track finishes.'],
+ ['onError', '(error: Error) => void', 'Called on audio errors.'],
+ [
+ 'onPlayBlocked',
+ '() => void',
+ 'Called when the browser blocks playback (autoplay policy).',
+ ],
+ ['onDebug', '(msg: string) => void', 'Internal debug messages. Development only.'],
+ ]}
+ />
+
+
+
+
+ {`
+player.addTrack('https://example.com/encore.mp3', {
+ // Skip the HEAD request used to resolve redirects, if the URL is already final.
+ skipHEAD: true,
+ metadata: { title: 'Ripple', artist: 'Grateful Dead' },
+});
+`}
+
+
+
+
+ Getters return fresh snapshots each time you read them. Nothing you get back is live.
+
+
+
+
+
+
+ Every callback and getter gives you TrackInfo: plain data with no
+ methods, safe to store in React state or send over postMessage.
+
+ {`
+interface TrackInfo {
+ index: number; // Position in the queue
+ currentTime: number; // Seconds
+ duration: number; // Seconds, NaN until loaded
+ isPlaying: boolean;
+ isPaused: boolean;
+ volume: number;
+ playbackRate: number;
+ trackUrl: string; // Resolved URL, after redirects
+ playbackType: 'HTML5' | 'WEBAUDIO'; // Which backend is making sound right now
+ webAudioLoadingState: 'NONE' | 'LOADING' | 'LOADED' | 'ERROR';
+ metadata?: TrackMetadata;
+ machineState: string; // Internal state, handy for debugging
+}
+`}
+
+ playbackType tells you whether the next handoff can be gapless. When the
+ current track is WEBAUDIO and the next one has{' '}
+ webAudioLoadingState: 'LOADED', it will be.
+
+
+
+
+
+
+
+
+
+ gapless.js preloads and decodes the next two tracks by default. Lower it to save
+ bandwidth and memory, raise it for flaky connections. You can change it at any time.
+
+ {`
+const player = new Queue({ tracks, preloadNumTracks: 1 });
+
+player.preloadNumTracks = 0; // Disable preloading
+player.preloadNumTracks = 3; // Preload 3 ahead
+`}
+
+ Decoded audio lives in memory as raw PCM, roughly 10 MB per minute of stereo at 44.1
+ kHz. Keep this in mind for long tracks on mobile.
+
+
+
+
+
+ Speeds between 0.25× and 4× are supported, and gapless transitions are rescheduled to
+ match.
+
+ {`
+const player = new Queue({ tracks, playbackRate: 1.5 });
+
+player.setPlaybackRate(2);
+player.playbackRate; // 2
+`}
+
+
+
+
+ Browsers won’t start audio until the user has interacted with the page. Call{' '}
+ play(), next() or gotoTrack(…, true) from a
+ click or key handler and it just works. gapless.js creates its{' '}
+ AudioContext lazily on that first gesture, so you won’t see console
+ warnings on page load.
+
+
+ If you start playback outside a gesture and the browser refuses,{' '}
+ onPlayBlocked fires. Show a play button and call play(){' '}
+ again when it’s clicked.
+
+ {`
+const player = new Queue({
+ tracks,
+ onPlayBlocked: () => showPlayButton(),
+});
+`}
+
+
+
+
+ v4 is a complete rewrite. It’s ESM only, callbacks receive plain{' '}
+ TrackInfo objects instead of Track instances, and Media
+ Session support is built in.
+
+
+
+
+
+
+ );
+}
diff --git a/demo/app/globals.css b/demo/app/globals.css
new file mode 100644
index 0000000..062f8ab
--- /dev/null
+++ b/demo/app/globals.css
@@ -0,0 +1,29 @@
+@import 'tailwindcss';
+
+/* --font-inter and --font-jetbrains-mono come from timber's self-hosted
+ fonts in layout.tsx. */
+@theme inline {
+ --font-sans: var(--font-inter), ui-sans-serif, system-ui, sans-serif;
+ --font-mono: var(--font-jetbrains-mono), ui-monospace, SFMono-Regular, Menlo, monospace;
+ --font-sans--font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11', 'ss01', 'ss03';
+}
+
+@layer base {
+ a {
+ text-decoration-line: underline;
+ text-underline-offset: 4px;
+ }
+}
+
+/* sugar-high token colors. Code blocks are dark in both themes. */
+.sh {
+ --sh-class: #7dd3fc;
+ --sh-identifier: #e4e4e7;
+ --sh-sign: #a1a1aa;
+ --sh-property: #93c5fd;
+ --sh-entity: #6ee7b7;
+ --sh-jsxliterals: #e4e4e7;
+ --sh-string: #fcd34d;
+ --sh-keyword: #f9a8d4;
+ --sh-comment: #71717a;
+}
diff --git a/demo/app/icon.tsx b/demo/app/icon.tsx
new file mode 100644
index 0000000..d32098f
--- /dev/null
+++ b/demo/app/icon.tsx
@@ -0,0 +1,6 @@
+import { ImageResponse } from 'takumi-js/response';
+import { Mark } from './_components/mark';
+
+export default function Icon() {
+ return new ImageResponse(, { width: 64, height: 64 });
+}
diff --git a/demo/app/layout.tsx b/demo/app/layout.tsx
new file mode 100644
index 0000000..5f04a15
--- /dev/null
+++ b/demo/app/layout.tsx
@@ -0,0 +1,44 @@
+import type { ReactNode } from 'react';
+import { Inter, JetBrains_Mono } from '@timber-js/app/fonts/google';
+import './globals.css';
+
+// `.className` defines the CSS variable (globals.css maps it into Tailwind's
+// font-sans / font-mono). `.variable` is only the variable's name.
+const inter = Inter({
+ subsets: ['latin'],
+ weight: ['400', '500', '600'],
+ display: 'swap',
+ variable: '--font-inter',
+});
+const mono = JetBrains_Mono({
+ subsets: ['latin'],
+ weight: ['400', '500', '600'],
+ display: 'swap',
+ variable: '--font-jetbrains-mono',
+});
+
+export const metadata = {
+ // Makes the auto-linked og:image absolute, which link unfurlers require.
+ metadataBase: new URL('https://gapless.saewitz.com'),
+ title: 'gapless.js',
+ description: 'Gapless audio playback for the web.',
+ openGraph: {
+ title: 'gapless.js',
+ description: 'Gapless audio playback for the web.',
+ type: 'website',
+ },
+ twitter: { card: 'summary_large_image' },
+};
+
+export default function RootLayout({ children }: { children: ReactNode }) {
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/demo/app/opengraph-image.tsx b/demo/app/opengraph-image.tsx
new file mode 100644
index 0000000..63f1a8a
--- /dev/null
+++ b/demo/app/opengraph-image.tsx
@@ -0,0 +1,5 @@
+import { ogImage } from './_components/og-image';
+
+export default function OpengraphImage() {
+ return ogImage({ subtitle: 'Gapless audio playback for the web' });
+}
diff --git a/demo/app/page.tsx b/demo/app/page.tsx
new file mode 100644
index 0000000..3fad9bf
--- /dev/null
+++ b/demo/app/page.tsx
@@ -0,0 +1,79 @@
+import { NativeDemo } from './_components/native-demo';
+import { GaplessDemo } from './_components/gapless-demo';
+import { FullShow } from './_components/player';
+import { SiteHeader } from './_components/site-header';
+import { StageBadge } from './_components/ui';
+import { CodeBlock } from './_components/code';
+
+export default function Home() {
+ return (
+
+
+
+
+
+ gapless.js is a javascript library for playing recorded concerts, to suit our needs over{' '}
+
+ https://relisten.net
+
+ . It is driven by a state machine and is completely headless (you design your own UI)
+ and library agnostic.
+
+
+ It is not intended to be a universal solution to all use-cases, but specifically to
+ solve playing back concerts and similar “song”/“album” style playback. Meaning, it’s not
+ designed for short loops (though it could support that).
+
+
+
+ This library is over a decade old at this point, though we completely re-wrote it from
+ scratch in the past year. It takes inspiration from{' '}
+ Gapless 5 by Rego Sen, who pioneered
+ these techniques on the web. We wrote our own after we had slightly different needs,
+ like playing back concerts and a headless UI.
+
+
+
+ Plain {``} tags (non-library)
+
+
+
+
+ gapless.js
+
+
+
+
+ A complete gapless.js concert
+
+
+
+ Quick start
+ {`
+import Queue from 'gapless';
+
+const player = new Queue({
+ tracks: [
+ 'https://example.com/set1-01.mp3',
+ 'https://example.com/set1-02.mp3',
+ 'https://example.com/set1-03.mp3',
+ ],
+ onProgress: (track) => console.log(track.index, track.currentTime, track.duration),
+ onEnded: () => console.log('Show over'),
+});
+
+// Call from a click handler. Browsers only allow audio after a user gesture.
+playButton.addEventListener('click', () => player.togglePlayPause());
+`}
+
+ gapless.js preloads and decodes upcoming tracks in the background and starts each one on
+ the exact sample the previous one ends. Bring your own UI.{' '}
+
+ Read the full docs →
+
+
+
+
+
+ );
+}
diff --git a/demo/index.html b/demo/index.html
deleted file mode 100644
index 4a5ac33..0000000
--- a/demo/index.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
- gapless.js — React demo
-
-
-
-
-
-
diff --git a/demo/package.json b/demo/package.json
index 4d8b5cf..61c15e4 100644
--- a/demo/package.json
+++ b/demo/package.json
@@ -3,18 +3,25 @@
"private": true,
"type": "module",
"scripts": {
- "dev": "vite",
- "build": "vite build"
+ "dev": "timber dev",
+ "build": "timber build",
+ "preview": "timber preview"
},
"dependencies": {
+ "@timber-js/app": "0.2.0-alpha.220",
+ "@vitejs/plugin-react": "^6.1.2",
+ "@vitejs/plugin-rsc": "^0.5.36",
"react": "^19.3.0",
- "react-dom": "^19.3.0"
+ "react-dom": "^19.3.0",
+ "sugar-high": "^2.6.2",
+ "takumi-js": "^2.16.2"
},
"devDependencies": {
+ "@tailwindcss/vite": "^4.3.3",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
- "@vitejs/plugin-react": "^6.1.2",
+ "tailwindcss": "^4.3.3",
"typescript": "^7.0.2",
- "vite": "^8.3.4"
+ "vite": "8.3.0"
}
}
diff --git a/demo/public/clips/part-1.wav b/demo/public/clips/part-1.wav
new file mode 100644
index 0000000..c0a2975
Binary files /dev/null and b/demo/public/clips/part-1.wav differ
diff --git a/demo/public/clips/part-2.wav b/demo/public/clips/part-2.wav
new file mode 100644
index 0000000..9690072
Binary files /dev/null and b/demo/public/clips/part-2.wav differ
diff --git a/demo/src/App.css b/demo/src/App.css
deleted file mode 100644
index 70295e7..0000000
--- a/demo/src/App.css
+++ /dev/null
@@ -1,79 +0,0 @@
-*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
-body { font-family: system-ui, sans-serif; background: #111; color: #eee; padding: 24px; line-height: 1.5; }
-h1 { font-size: 1.2rem; font-weight: 600; margin-bottom: 4px; }
-p.sub { font-size: 0.8rem; color: #888; margin-bottom: 20px; }
-
-.player-layout {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 16px;
- align-items: start;
-}
-@media (max-width: 900px) {
- .player-layout { grid-template-columns: 1fr; }
-}
-.player-left, .player-right {
- display: flex;
- flex-direction: column;
- gap: 16px;
- min-width: 0;
-}
-
-section { background: #1a1a1a; border: 1px solid #2a2a2a; border-radius: 8px; padding: 16px; }
-section h2 { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; color: #666; margin-bottom: 12px; }
-
-.track-title { font-size: 1rem; font-weight: 600; }
-.track-time { font-size: 0.8rem; color: #888; margin-top: 2px; }
-
-.progress-wrap { margin: 12px 0; cursor: pointer; }
-.progress-bg { height: 4px; background: #333; border-radius: 2px; overflow: hidden; }
-.progress-fill { height: 100%; width: 0%; background: #3b82f6; border-radius: 2px; transition: width 0.1s linear; }
-
-.controls { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
-button {
- background: #2a2a2a; border: 1px solid #3a3a3a; color: #eee;
- padding: 6px 14px; border-radius: 6px; cursor: pointer; font-size: 0.85rem;
-}
-button:hover { background: #333; }
-button.primary { background: #3b82f6; border-color: #3b82f6; }
-button.primary:hover { background: #2563eb; }
-label { font-size: 0.8rem; color: #aaa; }
-input[type=range] { width: 120px; cursor: pointer; }
-
-.playlist { list-style: none; }
-.playlist li {
- display: flex; align-items: center; gap: 10px;
- padding: 7px 10px; border-radius: 6px; cursor: pointer; font-size: 0.85rem;
-}
-.playlist li:hover { background: #222; }
-.playlist li.active { background: #1e3a5f; }
-.playlist li .idx { width: 20px; text-align: right; color: #555; font-size: 0.75rem; }
-.playlist li .title { flex: 1; }
-.playlist li .dur { color: #666; font-size: 0.75rem; }
-.playlist li .badge {
- font-size: 0.65rem; padding: 1px 5px; border-radius: 4px;
- background: #2a2a2a; color: #888;
-}
-.playlist li .badge.web { background: #14532d; color: #4ade80; }
-.playlist li .badge.h5 { background: #1e3a5f; color: #93c5fd; }
-.playlist li .badge.load { background: #3b2a05; color: #fbbf24; }
-
-.status { font-size: 0.75rem; font-family: monospace; color: #6b7280; display: flex; gap: 16px; flex-wrap: wrap; }
-.status span b { color: #d1d5db; }
-
-.log { font-family: monospace; font-size: 0.72rem; color: #4ade80; background: #0a0a0a; border-radius: 6px; padding: 10px; height: 160px; overflow-y: auto; }
-.log div { margin-bottom: 2px; }
-.log div.warn { color: #fbbf24; }
-.log div.err { color: #f87171; }
-
-.tip { font-size: 0.78rem; color: #6b7280; margin-top: 8px; }
-.tip b { color: #fbbf24; }
-
-.preset-selector { display: flex; gap: 8px; margin-bottom: 16px; }
-
-.debug-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
-@media (max-width: 600px) { .debug-grid { grid-template-columns: 1fr; } }
-.debug-label { font-size: 0.65rem; text-transform: uppercase; letter-spacing: 0.06em; color: #555; margin: 8px 0 2px; }
-.debug-label:first-child { margin-top: 0; }
-.debug-pre { font-family: monospace; font-size: 0.7rem; color: #4ade80; background: #0a0a0a; border-radius: 4px; padding: 6px 8px; margin: 0; overflow: auto; max-height: 140px; white-space: pre-wrap; word-break: break-all; }
-.debug-log { max-height: 120px; color: #fbbf24; }
diff --git a/demo/src/App.tsx b/demo/src/App.tsx
deleted file mode 100644
index 9f498c7..0000000
--- a/demo/src/App.tsx
+++ /dev/null
@@ -1,138 +0,0 @@
-import { useState } from 'react';
-import { useGapless } from './useGapless';
-import { NowPlaying } from './components/NowPlaying';
-import { Playlist } from './components/Playlist';
-import { Status } from './components/Status';
-import { MachineDebug } from './components/MachineDebug';
-import { EventLog } from './components/EventLog';
-
-function trackUrl(url: string) {
- if (import.meta.env.DEV) return `/proxy?url=${encodeURIComponent(url)}`;
- return url;
-}
-
-const BASE =
- 'https://audio.relisten.net/archive.org//download/gd1977-05-08.148737.SBD.Betty.Anon.Noel.t-flac2448/';
-
-interface TestPreset {
- label: string;
- description: string;
- tracks: string[];
- titles: string[];
-}
-
-const PRESETS: TestPreset[] = [
- {
- label: 'Scarlet > Fire (2 tracks)',
- description: 'Grateful Dead — Cornell 1977-05-08 — Set 2 excerpt — Scarlet Begonias > Fire on the Mountain',
- tracks: [
- trackUrl(BASE + 'gd77-05-08.s2t02.mp3'),
- trackUrl(BASE + 'gd77-05-08.s2t03.mp3'),
- ],
- titles: ['Scarlet Begonias', 'Fire on the Mountain'],
- },
- {
- label: 'Full Set 1 (11 tracks)',
- description: 'Grateful Dead — Cornell 1977-05-08 — Complete Set 1 — New Minglewood Blues through Row Jimmy',
- tracks: [
- trackUrl(BASE + 'gd77-05-08.s1t01.mp3'),
- trackUrl(BASE + 'gd77-05-08.s1t02.mp3'),
- trackUrl(BASE + 'gd77-05-08.s1t03.mp3'),
- trackUrl(BASE + 'gd77-05-08.s1t04.mp3'),
- trackUrl(BASE + 'gd77-05-08.s1t05.mp3'),
- trackUrl(BASE + 'gd77-05-08.s1t06.mp3'),
- trackUrl(BASE + 'gd77-05-08.s1t07.mp3'),
- trackUrl(BASE + 'gd77-05-08.s1t08.mp3'),
- trackUrl(BASE + 'gd77-05-08.s1t09.mp3'),
- trackUrl(BASE + 'gd77-05-08.s1t10.mp3'),
- trackUrl(BASE + 'gd77-05-08.s1t11.mp3'),
- ],
- titles: [
- 'New Minglewood Blues',
- 'Loser',
- 'El Paso',
- 'They Love Each Other',
- 'Jack Straw',
- 'Deal',
- 'Lazy Lightning',
- 'Supplication',
- 'Brown Eyed Women',
- 'Mama Tried',
- 'Row Jimmy',
- ],
- },
-];
-
-function Player({ preset }: { preset: TestPreset }) {
- const gapless = useGapless({ tracks: preset.tracks, titles: preset.titles, volume: 0.8 });
-
- return (
-
- );
-}
-
-export function App() {
- const [presetIndex, setPresetIndex] = useState(0);
- const preset = PRESETS[presetIndex];
-
- return (
- <>
- gapless.js — React demo
- {preset.description} · audio.relisten.net
-
-
- {PRESETS.map((p, i) => (
-
- ))}
-
-
-
- >
- );
-}
diff --git a/demo/src/components/EventLog.tsx b/demo/src/components/EventLog.tsx
deleted file mode 100644
index e03e063..0000000
--- a/demo/src/components/EventLog.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import type { LogEntry } from '../useGapless';
-
-interface EventLogProps {
- logs: LogEntry[];
-}
-
-export function EventLog({ logs }: EventLogProps) {
- return (
-
- Event Log
-
- {logs.map((entry, i) => (
-
- [{entry.time}] {entry.msg}
-
- ))}
-
-
- );
-}
diff --git a/demo/src/components/MachineDebug.tsx b/demo/src/components/MachineDebug.tsx
deleted file mode 100644
index adc77b8..0000000
--- a/demo/src/components/MachineDebug.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import type { TrackInfo } from 'gapless';
-import type { QueueSnapshot, MachineLogEntry } from '../useGapless';
-
-export function MachineDebug({
- queueSnapshot,
- currentTrack,
- tracks,
- machineLog,
-}: {
- queueSnapshot: QueueSnapshot;
- currentTrack: TrackInfo | undefined;
- tracks: readonly TrackInfo[];
- machineLog: MachineLogEntry[];
-}) {
- const currentTrackDebug = currentTrack
- ? {
- machineState: currentTrack.machineState,
- playbackType: currentTrack.playbackType,
- webAudioLoadingState: currentTrack.webAudioLoadingState,
- isPlaying: currentTrack.isPlaying,
- }
- : null;
-
- const tracksSummary = tracks.map((t, i) => `${i}: ${t.machineState}`).join(', ');
-
- return (
-
- State Machines
-
-
-
Queue
-
{JSON.stringify(queueSnapshot, null, 2)}
-
-
-
Current Track
-
- {currentTrackDebug ? JSON.stringify(currentTrackDebug, null, 2) : '(none)'}
-
-
-
- All Tracks
- {tracksSummary || '(empty)'}
- Transition Log ({machineLog.length})
-
- {machineLog.length === 0
- ? '(no events yet)'
- : machineLog.map((e) => `${e.time} ${e.msg}`).join('\n')}
-
-
- );
-}
diff --git a/demo/src/components/NowPlaying.tsx b/demo/src/components/NowPlaying.tsx
deleted file mode 100644
index 4319004..0000000
--- a/demo/src/components/NowPlaying.tsx
+++ /dev/null
@@ -1,104 +0,0 @@
-import type { TrackInfo } from 'gapless';
-import { useCallback, useRef } from 'react';
-
-function fmt(s: number | undefined) {
- if (!s || isNaN(s)) return '0:00';
- return `${Math.floor(s / 60)}:${String(Math.floor(s % 60)).padStart(2, '0')}`;
-}
-
-interface NowPlayingProps {
- state: 'idle' | 'playing' | 'paused' | 'ended';
- currentTrack: TrackInfo | undefined;
- volume: number;
- onToggle: () => void;
- onPrev: () => void;
- onNext: () => void;
- onSeek: (time: number) => void;
- onSeekToEnd: () => void;
- onVolumeChange: (v: number) => void;
- playbackRate: number;
- onPlaybackRateChange: (rate: number) => void;
-}
-
-export function NowPlaying({
- state,
- currentTrack,
- volume,
- onToggle,
- onPrev,
- onNext,
- onSeek,
- onSeekToEnd,
- onVolumeChange,
- playbackRate,
- onPlaybackRateChange,
-}: NowPlayingProps) {
- const wrapRef = useRef(null);
-
- const progress =
- currentTrack && currentTrack.duration
- ? (currentTrack.currentTime / currentTrack.duration) * 100
- : 0;
-
- const handleProgressClick = useCallback(
- (e: React.MouseEvent) => {
- if (!currentTrack || isNaN(currentTrack.duration)) return;
- const rect = wrapRef.current!.getBoundingClientRect();
- const ratio = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));
- onSeek(ratio * currentTrack.duration);
- },
- [currentTrack, onSeek],
- );
-
- const isPlaying = state === 'playing';
-
- return (
-
- );
-}
diff --git a/demo/src/components/Playlist.tsx b/demo/src/components/Playlist.tsx
deleted file mode 100644
index b5bf951..0000000
--- a/demo/src/components/Playlist.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import type { TrackInfo } from 'gapless';
-
-function fmt(s: number | undefined) {
- if (!s || isNaN(s)) return '0:00';
- return `${Math.floor(s / 60)}:${String(Math.floor(s % 60)).padStart(2, '0')}`;
-}
-
-function badgeInfo(info: TrackInfo) {
- if (info.playbackType === 'WEBAUDIO') return { cls: 'web', label: 'WebAudio' };
- if (info.webAudioLoadingState === 'LOADING') return { cls: 'load', label: 'decoding\u2026' };
- if (info.webAudioLoadingState === 'LOADED') return { cls: 'web', label: 'ready' };
- return { cls: 'h5', label: 'HTML5' };
-}
-
-interface PlaylistProps {
- tracks: readonly TrackInfo[];
- currentTrack: TrackInfo | undefined;
- onSelect: (index: number) => void;
-}
-
-export function Playlist({ tracks, currentTrack, onSelect }: PlaylistProps) {
- return (
-
- Playlist
-
- {tracks.map((track, i) => {
- const { cls, label } = badgeInfo(track);
- const isActive = currentTrack && i === currentTrack.index;
- return (
- - onSelect(i)}>
- {i + 1}
- {track.metadata?.title ?? `Track ${i + 1}`}
- {label}
- {fmt(track.duration)}
-
- );
- })}
-
-
- );
-}
diff --git a/demo/src/components/Status.tsx b/demo/src/components/Status.tsx
deleted file mode 100644
index 4a161db..0000000
--- a/demo/src/components/Status.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import type { TrackInfo } from 'gapless';
-
-interface StatusProps {
- state: 'idle' | 'playing' | 'paused' | 'ended';
- currentTrack: TrackInfo | undefined;
- tracks: readonly TrackInfo[];
- volume: number;
-}
-
-export function Status({ state, currentTrack, tracks, volume }: StatusProps) {
- const nextTrack = currentTrack ? tracks[currentTrack.index + 1] : undefined;
-
- return (
-
- Status
-
-
- state: {state}
-
-
- track:{' '}
-
- {currentTrack ? `${currentTrack.index + 1}/${tracks.length}` : `0/${tracks.length}`}
-
-
-
- playback: {currentTrack?.playbackType ?? 'N/A'}
-
-
- buffer: {currentTrack?.webAudioLoadingState ?? 'N/A'}
-
-
- next buffer: {nextTrack?.webAudioLoadingState ?? 'N/A'}
-
-
- volume: {Math.round(volume * 100)}%
-
-
-
- );
-}
diff --git a/demo/src/main.tsx b/demo/src/main.tsx
deleted file mode 100644
index 1ed0b9f..0000000
--- a/demo/src/main.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { StrictMode } from 'react';
-import { createRoot } from 'react-dom/client';
-import { App } from './App';
-import './App.css';
-
-createRoot(document.getElementById('root')!).render(
-
-
- ,
-);
diff --git a/demo/src/useGapless.ts b/demo/src/useGapless.ts
deleted file mode 100644
index 03d3dbe..0000000
--- a/demo/src/useGapless.ts
+++ /dev/null
@@ -1,233 +0,0 @@
-import { useState, useRef, useEffect, useCallback } from 'react';
-import { Queue, type TrackInfo } from 'gapless';
-
-export interface LogEntry {
- time: string;
- msg: string;
- level: 'info' | 'warn' | 'err';
-}
-
-export interface MachineLogEntry {
- time: string;
- msg: string;
-}
-
-export interface QueueSnapshot {
- state: string;
- context: { currentTrackIndex: number; trackCount: number };
-}
-
-export interface GaplessState {
- state: 'idle' | 'playing' | 'paused' | 'ended';
- currentTrack: TrackInfo | undefined;
- tracks: readonly TrackInfo[];
- logs: LogEntry[];
- volume: number;
- playbackRate: number;
- queueSnapshot: QueueSnapshot;
- machineLog: MachineLogEntry[];
-}
-
-export interface GaplessControls {
- play: () => void;
- pause: () => void;
- toggle: () => void;
- next: () => void;
- prev: () => void;
- seek: (time: number) => void;
- gotoTrack: (index: number) => void;
- setVolume: (v: number) => void;
- setPlaybackRate: (rate: number) => void;
- seekToEnd: () => void;
-}
-
-export function useGapless(options: {
- tracks: string[];
- titles: string[];
- volume: number;
-}): GaplessState & GaplessControls {
- const [state, setState] = useState<'idle' | 'playing' | 'paused' | 'ended'>('idle');
- const [currentTrack, setCurrentTrack] = useState();
- const [tracks, setTracks] = useState([]);
- const [logs, setLogs] = useState([]);
- const [volume, setVolumeState] = useState(options.volume);
- const [playbackRate, setPlaybackRateState] = useState(1);
- const [queueSnapshot, setQueueSnapshot] = useState({
- state: 'idle',
- context: { currentTrackIndex: 0, trackCount: 0 },
- });
- const [machineLog, setMachineLog] = useState([]);
- const ctxReady = useRef(false);
- const queueRef = useRef(null);
-
- const addLog = useCallback((msg: string, level: LogEntry['level'] = 'info') => {
- setLogs((prev) => {
- const entry: LogEntry = { time: new Date().toLocaleTimeString(), msg, level };
- const next = [entry, ...prev];
- if (next.length > 200) next.length = 200;
- return next;
- });
- }, []);
-
- const addMachineLog = useCallback((msg: string) => {
- setMachineLog((prev) => {
- const entry: MachineLogEntry = { time: new Date().toLocaleTimeString(), msg };
- const next = [entry, ...prev];
- if (next.length > 30) next.length = 30;
- return next;
- });
- }, []);
-
- useEffect(() => {
- const queue = new Queue({
- tracks: options.tracks,
- volume: options.volume,
- trackMetadata: options.titles.map((title) => ({ title })),
-
- onProgress(info) {
- setCurrentTrack(info);
- setTracks(queue.tracks);
- setVolumeState(queue.volume);
- setQueueSnapshot(queue.queueSnapshot);
- if (info.isPaused) {
- setState('paused');
- } else if (info.isPlaying) {
- setState('playing');
- }
- },
-
- onStartNewTrack(info) {
- addLog(`\u25b6 started: "${info.metadata?.title ?? info.trackUrl}" (index ${info.index})`);
- setTracks(queue.tracks);
- },
-
- onPlayNextTrack(info) {
- addLog(`\u2192 next: "${info.metadata?.title}"`);
- },
-
- onPlayPreviousTrack(info) {
- addLog(`\u2190 prev: "${info.metadata?.title}"`);
- },
-
- onEnded() {
- addLog('\u25fc queue ended');
- setState('ended');
- },
-
- onError(err) {
- addLog(`ERROR: ${err.message}`, 'err');
- },
-
- onDebug(msg) {
- addLog(`DBG: ${msg}`, 'warn');
- // Capture machine-related messages in the compact log
- if (
- msg.includes('machineState') ||
- msg.includes('Machine') ||
- msg.includes('state=') ||
- msg.includes('onended') ||
- msg.includes('PLAY') ||
- msg.includes('PAUSE') ||
- msg.includes('BUFFER') ||
- msg.includes('scheduleGapless') ||
- msg.includes('deactivate') ||
- msg.includes('preload')
- ) {
- addMachineLog(msg);
- }
- },
-
- onQueueStateChange(snapshot) {
- setQueueSnapshot(snapshot);
- },
-
- onPlayBlocked() {
- addLog('Autoplay blocked \u2014 click Play', 'warn');
- },
- });
-
- queueRef.current = queue;
- setTracks(queue.tracks);
- addLog('Ready \u2014 click Play to start');
- addLog(`Queue created: ${options.tracks.length} tracks`);
-
- return () => {
- queueRef.current = null;
- };
- // Run once on mount
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
-
- const withCtx = useCallback((fn: () => void) => {
- const queue = queueRef.current;
- if (!queue) return;
- if (ctxReady.current) {
- fn();
- } else {
- ctxReady.current = true;
- queue.resumeAudioContext().then(fn);
- }
- }, []);
-
- const toggle = useCallback(() => withCtx(() => queueRef.current?.togglePlayPause()), [withCtx]);
- const play = useCallback(() => withCtx(() => queueRef.current?.play()), [withCtx]);
- const pause = useCallback(() => withCtx(() => queueRef.current?.pause()), [withCtx]);
- const next = useCallback(() => withCtx(() => queueRef.current?.next()), [withCtx]);
- const prev = useCallback(() => withCtx(() => queueRef.current?.previous()), [withCtx]);
-
- const seek = useCallback((time: number) => {
- queueRef.current?.seek(time);
- }, []);
-
- const gotoTrack = useCallback((index: number) => {
- withCtx(() => {
- queueRef.current?.gotoTrack(index, true);
- addLog(`jumped to track ${index + 1}`);
- });
- }, [withCtx, addLog]);
-
- const setVolume = useCallback((v: number) => {
- queueRef.current?.setVolume(v);
- setVolumeState(v);
- }, []);
-
- const setPlaybackRate = useCallback((rate: number) => {
- queueRef.current?.setPlaybackRate(rate);
- setPlaybackRateState(rate);
- }, []);
-
- const seekToEnd = useCallback(() => {
- const queue = queueRef.current;
- const cur = queue?.currentTrack;
- if (!cur || isNaN(cur.duration)) {
- addLog('duration not yet known', 'warn');
- return;
- }
- const t = Math.max(0, cur.duration - 2);
- queue!.seek(t);
- const mins = Math.floor(t / 60);
- const secs = String(Math.floor(t % 60)).padStart(2, '0');
- addLog(`seek \u2192 ${mins}:${secs} (end \u2212 5s)`);
- }, [addLog]);
-
- return {
- state,
- currentTrack,
- tracks,
- logs,
- volume,
- playbackRate,
- queueSnapshot,
- machineLog,
- play,
- pause,
- toggle,
- next,
- prev,
- seek,
- gotoTrack,
- setVolume,
- setPlaybackRate,
- seekToEnd,
- };
-}
diff --git a/demo/timber-env.d.ts b/demo/timber-env.d.ts
new file mode 100644
index 0000000..ed129a9
--- /dev/null
+++ b/demo/timber-env.d.ts
@@ -0,0 +1,8 @@
+// This file is auto-generated by timber.js. Do not edit.
+// It ensures TypeScript picks up the generated route types and
+// Vite-provided ambient types (CSS, assets, import.meta.env, HMR).
+/* eslint-disable @typescript-eslint/triple-slash-reference */
+///
+///
+///
+///
diff --git a/demo/timber.config.ts b/demo/timber.config.ts
new file mode 100644
index 0000000..fc511f0
--- /dev/null
+++ b/demo/timber.config.ts
@@ -0,0 +1,10 @@
+import { defineConfig } from '@timber-js/app';
+import { nitro } from '@timber-js/app/adapters/nitro';
+
+// Pre-render every route to plain HTML + assets. No server at runtime — the
+// Nitro adapter just merges pages and client assets into one directory that
+// any static host can serve, and gives us `timber preview`.
+export default defineConfig({
+ output: 'static',
+ adapter: nitro(),
+});
diff --git a/demo/tsconfig.json b/demo/tsconfig.json
index 59aa8e2..e4032d4 100644
--- a/demo/tsconfig.json
+++ b/demo/tsconfig.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "ES2020",
+ "target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"jsx": "react-jsx",
@@ -11,10 +11,9 @@
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
- "baseUrl": ".",
"paths": {
"gapless": ["../src/index.ts"]
}
},
- "include": ["src"]
+ "include": ["app", "*.config.ts", "timber-env.d.ts"]
}
diff --git a/demo/vite.config.ts b/demo/vite.config.ts
index b280de9..c9bb863 100644
--- a/demo/vite.config.ts
+++ b/demo/vite.config.ts
@@ -1,64 +1,24 @@
-import { defineConfig, type Plugin } from 'vite';
-import react from '@vitejs/plugin-react';
+import { defineConfig } from 'vite';
+import { timber } from '@timber-js/app';
+import tailwindcss from '@tailwindcss/vite';
import path from 'node:path';
-import http from 'node:http';
-import https from 'node:https';
-
-function corsProxyPlugin(): Plugin {
- return {
- name: 'cors-proxy',
- configureServer(server) {
- server.middlewares.use((req, res, next) => {
- const url = new URL(req.url!, `http://localhost`);
- if (url.pathname !== '/proxy') return next();
-
- const target = url.searchParams.get('url');
- if (!target) {
- res.writeHead(400);
- res.end('Missing ?url=');
- return;
- }
-
- let targetUrl: URL;
- try {
- targetUrl = new URL(target);
- } catch {
- res.writeHead(400);
- res.end('Invalid url');
- return;
- }
-
- const lib = targetUrl.protocol === 'https:' ? https : http;
- const headers: Record = { 'User-Agent': 'gapless-dev-proxy/1.0' };
- if (req.headers.range) headers['Range'] = req.headers.range;
-
- const proxyReq = lib.get(target, { headers }, (proxyRes) => {
- const resHeaders: Record = {
- 'Content-Type': proxyRes.headers['content-type'] ?? 'application/octet-stream',
- 'Access-Control-Allow-Origin': '*',
- 'Cache-Control': 'public, max-age=86400',
- };
- if (proxyRes.headers['content-length']) resHeaders['Content-Length'] = proxyRes.headers['content-length'];
- if (proxyRes.headers['content-range']) resHeaders['Content-Range'] = proxyRes.headers['content-range'];
- if (proxyRes.headers['accept-ranges']) resHeaders['Accept-Ranges'] = proxyRes.headers['accept-ranges'];
-
- res.writeHead(proxyRes.statusCode ?? 200, resHeaders);
- proxyRes.pipe(res);
- });
- proxyReq.on('error', (err) => {
- res.writeHead(502);
- res.end(err.message);
- });
- });
- },
- };
-}
export default defineConfig({
- plugins: [react(), corsProxyPlugin()],
+ plugins: [timber(), tailwindcss()],
+ server: {
+ proxy: {
+ // audio.relisten.net only sends CORS headers to allow-listed origins.
+ '/relisten-audio': {
+ target: 'https://audio.relisten.net',
+ changeOrigin: true,
+ rewrite: (p) => p.replace(/^\/relisten-audio/, ''),
+ },
+ },
+ },
resolve: {
alias: {
- 'gapless': path.resolve(__dirname, '../src/index.ts'),
+ // Always demo the library source in this repo, not a published build.
+ gapless: path.resolve(import.meta.dirname, '../src/index.ts'),
},
},
});
diff --git a/eslint.config.mjs b/eslint.config.mjs
deleted file mode 100644
index 8e77f67..0000000
--- a/eslint.config.mjs
+++ /dev/null
@@ -1,3 +0,0 @@
-import main from '@switz/eslint-config';
-
-export default main;
diff --git a/lib/graph.sh b/lib/graph.sh
index 0d12939..5327595 100755
--- a/lib/graph.sh
+++ b/lib/graph.sh
@@ -1,9 +1,11 @@
echo '{
"children": [
- { "id": "t1", "title": "Track One", "border": "double", "shadow": true, "children": ["Instant HTML5"] },
- { "id": "t2", "title": "Track Two", "border": "double", "shadow": true, "children": ["Gapless Web Audio"] }
+ { "id": "t1", "title": "Track One", "border": "double", "shadow": true, "children": ["Instant HTML5", "↓", "Web Audio"] },
+ { "id": "t2", "title": "Track Two", "border": "double", "shadow": true, "children": ["Web Audio"] },
+ { "id": "t3", "title": "Track Three", "border": "double", "shadow": true, "children": ["Web Audio"] }
],
"connections": [
- { "from": "t1", "to": "t2", "label": "preload" }
+ { "from": "t1", "to": "t2", "label": "gapless" },
+ { "from": "t2", "to": "t3", "label": "gapless" }
]
- }' | npx box-of-rain --svg > artifacts/graph.svg
\ No newline at end of file
+ }' | npx box-of-rain --svg > artifacts/graph.svg
diff --git a/oxfmt.config.mjs b/oxfmt.config.mjs
new file mode 100644
index 0000000..54fed45
--- /dev/null
+++ b/oxfmt.config.mjs
@@ -0,0 +1,7 @@
+import shared from '@switz/lint-config/oxfmt' with { type: 'json' };
+
+export default {
+ ...shared,
+ // src/gapless.js is the legacy v3 UMD build, kept verbatim.
+ ignorePatterns: ['dist', 'demo/.timber', 'pnpm-lock.yaml', 'artifacts', 'src/gapless.js'],
+};
diff --git a/oxlint.json b/oxlint.json
new file mode 100644
index 0000000..7df6096
--- /dev/null
+++ b/oxlint.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
+ "extends": [
+ "./node_modules/@switz/lint-config/oxlint.json",
+ "./node_modules/@switz/lint-config/oxlint.react.json"
+ ],
+ "ignorePatterns": ["dist", "demo/.timber", "src/gapless.js"],
+ "overrides": [
+ {
+ "files": ["tests/**"],
+ "rules": {
+ "typescript/no-explicit-any": "off",
+ "typescript/no-non-null-assertion": "off",
+ "unicorn/no-useless-spread": "off"
+ }
+ }
+ ]
+}
diff --git a/package.json b/package.json
index 90bfdf9..91d770d 100644
--- a/package.json
+++ b/package.json
@@ -1,16 +1,24 @@
{
"name": "gapless",
"version": "4.4.3",
+ "private": false,
"description": "Gapless audio playback javascript plugin",
- "type": "module",
- "main": "dist/index.mjs",
- "module": "dist/index.mjs",
- "types": "dist/index.d.ts",
+ "license": "MIT",
+ "author": "Daniel Saewitz",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/RelistenNet/gapless.js.git"
+ },
"files": [
"dist",
"src",
"README.md"
],
+ "type": "module",
+ "sideEffects": false,
+ "main": "dist/index.mjs",
+ "module": "dist/index.mjs",
+ "types": "dist/index.d.ts",
"exports": {
"./package.json": "./package.json",
".": {
@@ -18,8 +26,6 @@
"default": "./dist/index.mjs"
}
},
- "sideEffects": false,
- "private": false,
"scripts": {
"test": "vitest run",
"build": "tsup && tsc -p tsconfig.build.json",
@@ -28,27 +34,25 @@
"types": "tsc --noEmit",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage",
- "prepublishOnly": "pnpm run build"
+ "prepublishOnly": "pnpm run build",
+ "lint": "oxlint -c oxlint.json",
+ "fmt": "oxfmt -c oxfmt.config.mjs .",
+ "fmt:check": "oxfmt -c oxfmt.config.mjs --check ."
},
- "repository": {
- "type": "git",
- "url": "git+https://github.com/RelistenNet/gapless.js.git"
+ "dependencies": {
+ "xstate": "^5.33.2"
},
- "author": "Daniel Saewitz",
- "license": "MIT",
"devDependencies": {
"@playwright/test": "^1.64.0",
- "@switz/eslint-config": "^13.1.0",
+ "@switz/lint-config": "^14.0.0",
"@vitest/coverage-v8": "^5.0.4",
- "eslint": "^10.12.0",
"happy-dom": "^21.0.1",
+ "oxfmt": "^0.73.0",
+ "oxlint": "^1.88.0",
"playwright": "^1.64.0",
"tsup": "^8.5.1",
"typescript": "^7.0.2",
"vitest": "^5.0.4"
},
- "packageManager": "pnpm@12.11.2",
- "dependencies": {
- "xstate": "^5.33.2"
- }
+ "packageManager": "pnpm@12.11.2"
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3069ac5..c3f2213 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -173,18 +173,21 @@ importers:
'@playwright/test':
specifier: ^1.64.0
version: 1.64.0
- '@switz/eslint-config':
- specifier: ^13.1.0
- version: 13.1.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(tailwindcss@4.3.3)(typescript@7.0.2)
+ '@switz/lint-config':
+ specifier: ^14.0.0
+ version: 14.0.0(oxfmt@0.73.0)(oxlint@1.88.0)
'@vitest/coverage-v8':
specifier: ^5.0.4
version: 5.0.4(vitest@5.0.4)
- eslint:
- specifier: ^10.12.0
- version: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
happy-dom:
specifier: ^21.0.1
version: 21.0.1
+ oxfmt:
+ specifier: ^0.73.0
+ version: 0.73.0
+ oxlint:
+ specifier: ^1.88.0
+ version: 1.88.0
playwright:
specifier: ^1.64.0
version: 1.64.0
@@ -196,39 +199,53 @@ importers:
version: 7.0.2
vitest:
specifier: ^5.0.4
- version: 5.0.4(@types/node@26.6.2)(@vitest/coverage-v8@5.0.4)(happy-dom@21.0.1)(vite@8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
+ version: 5.0.4(@opentelemetry/api@1.9.1)(@types/node@26.6.2)(@vitest/coverage-v8@5.0.4)(happy-dom@21.0.1)(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
demo:
dependencies:
+ '@timber-js/app':
+ specifier: 0.2.0-alpha.220
+ version: 0.2.0-alpha.220(@vitejs/plugin-react@6.1.2(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)))(@vitejs/plugin-rsc@0.5.37(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)))(nuqs@2.10.2(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
+ '@vitejs/plugin-react':
+ specifier: ^6.1.2
+ version: 6.1.2(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
+ '@vitejs/plugin-rsc':
+ specifier: ^0.5.36
+ version: 0.5.37(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
react:
specifier: ^19.3.0
version: 19.3.0
react-dom:
specifier: ^19.3.0
version: 19.3.0(react@19.3.0)
+ sugar-high:
+ specifier: ^2.6.2
+ version: 2.6.2
+ takumi-js:
+ specifier: ^2.16.2
+ version: 2.16.2(csstype@3.2.3)(react@19.3.0)
devDependencies:
+ '@tailwindcss/vite':
+ specifier: ^4.3.3
+ version: 4.3.3(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
'@types/react':
specifier: ^19.3.0
version: 19.3.0
'@types/react-dom':
specifier: ^19.3.0
version: 19.3.0(@types/react@19.3.0)
- '@vitejs/plugin-react':
- specifier: ^6.1.2
- version: 6.1.2(vite@8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
+ tailwindcss:
+ specifier: ^4.3.3
+ version: 4.3.3
typescript:
specifier: ^7.0.2
version: 7.0.2
vite:
- specifier: ^8.3.4
- version: 8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
+ specifier: 8.3.0
+ version: 8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
packages:
- '@babel/code-frame@7.29.7':
- resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-string-parser@7.29.7':
resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
engines: {node: '>=6.9.0'}
@@ -250,12 +267,6 @@ packages:
resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
engines: {node: '>=18'}
- '@cacheable/memory@2.2.0':
- resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==}
-
- '@cacheable/utils@2.5.0':
- resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==}
-
'@esbuild/aix-ppc64@0.27.3':
resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==}
engines: {node: '>=18'}
@@ -412,82 +423,12 @@ packages:
cpu: [x64]
os: [win32]
- '@eslint-community/eslint-utils@4.10.1':
- resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
-
- '@eslint-community/eslint-utils@4.9.1':
- resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
-
- '@eslint-community/regexpp@4.12.2':
- resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
- engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
-
- '@eslint/config-array@0.23.5':
- resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
-
- '@eslint/config-helpers@0.7.0':
- resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
-
- '@eslint/core@1.2.1':
- resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
-
- '@eslint/css-tree@4.0.4':
- resolution: {integrity: sha512-nxMparyhqVWQvadx9x8dIfubfIPOE+X2b2waua8fzdnM9vdp9rgVtwEZlG0TmCwEUz/d/f40fzvO/eqBwdxz0A==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
-
- '@eslint/js@10.0.1':
- resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- peerDependencies:
- eslint: ^10.0.0
- peerDependenciesMeta:
- eslint:
- optional: true
-
- '@eslint/object-schema@3.0.5':
- resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
-
- '@eslint/plugin-kit@0.7.3':
- resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
-
- '@humanfs/core@0.19.2':
- resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
- engines: {node: '>=18.18.0'}
-
- '@humanfs/node@0.16.8':
- resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==}
- engines: {node: '>=18.18.0'}
-
- '@humanfs/types@0.15.0':
- resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==}
- engines: {node: '>=18.18.0'}
-
- '@humanwhocodes/module-importer@1.0.1':
- resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
- engines: {node: '>=12.22'}
-
- '@humanwhocodes/retry@0.4.3':
- resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
- engines: {node: '>=18.18'}
-
- '@isaacs/cliui@8.0.2':
- resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
- engines: {node: '>=12'}
-
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
@@ -501,424 +442,912 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
- '@keyv/bigmap@1.3.1':
- resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==}
- engines: {node: '>= 18'}
- peerDependencies:
- keyv: ^5.6.0
+ '@opentelemetry/api@1.9.1':
+ resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==}
+ engines: {node: '>=8.0.0'}
- '@keyv/serialize@1.1.1':
- resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
-
- '@npmcli/config@8.3.4':
- resolution: {integrity: sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==}
- engines: {node: ^16.14.0 || >=18.0.0}
+ '@opentelemetry/context-async-hooks@2.12.0':
+ resolution: {integrity: sha512-iK/1nD7mmZVkuYjVjkdFBiCvzntJdFny1S3CYbUYyOq7V5enL6XX+gJ7eh965L1LnS11VA8mQ7Ej/ck04SB0MQ==}
+ engines: {node: ^18.19.0 || >=20.6.0}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
- '@npmcli/git@5.0.8':
- resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==}
- engines: {node: ^16.14.0 || >=18.0.0}
+ '@opentelemetry/core@2.12.0':
+ resolution: {integrity: sha512-1HsSAuvT4/my0QrXWsyXFdWjKaPeCHsismKZgEEIb8NK13LP6DrMRlsUbvD/0F9mDWK3xDom9AMv3IscxgOnOQ==}
+ engines: {node: ^18.19.0 || >=20.6.0}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
- '@npmcli/map-workspaces@3.0.6':
- resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ '@opentelemetry/resources@2.12.0':
+ resolution: {integrity: sha512-+rSRoOdln6NhXTVcBdHSlZxJDNzwxadeweK2ltZO3tVtfp6aklABc06xclDk6ovRR+EiGgIcSbh/6NgjFhnb3A==}
+ engines: {node: ^18.19.0 || >=20.6.0}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
- '@npmcli/name-from-folder@2.0.0':
- resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ '@opentelemetry/sdk-trace-base@2.12.0':
+ resolution: {integrity: sha512-JOERgZCxRM06FEJ5kEWxlSRChah6MmXDx3KwCruqEv/iEyLkTokCSemf2y1w8oIHtfrr8EVTpzebq/31vn2Cpg==}
+ engines: {node: ^18.19.0 || >=20.6.0}
+ deprecated: Use @opentelemetry/sdk-trace package
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
- '@npmcli/package-json@5.2.1':
- resolution: {integrity: sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==}
- engines: {node: ^16.14.0 || >=18.0.0}
+ '@opentelemetry/sdk-trace@2.12.0':
+ resolution: {integrity: sha512-ImVuRQ6faOsTi1Wna88s2avgrrf/iDgXPigIeynkUhjstMuoQUDOJXgkez2j1mlU4btjXcXBGa+q7qKFYR3GsA==}
+ engines: {node: ^18.19.0 || >=20.6.0}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
- '@npmcli/promise-spawn@7.0.2':
- resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==}
- engines: {node: ^16.14.0 || >=18.0.0}
+ '@opentelemetry/semantic-conventions@1.43.0':
+ resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==}
+ engines: {node: '>=14'}
'@oxc-project/types@0.153.0':
resolution: {integrity: sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==}
- '@pkgjs/parseargs@0.11.0':
- resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
- engines: {node: '>=14'}
-
- '@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.64.0':
- resolution: {integrity: sha512-oTN9FNYuN6bqQMwiho6jJKLCG2/QOYCixGXuCjRmzOq23eODeukuY2XiAVoVpAECbuezMt1MHQjAiQxK8F+Y+g==}
- engines: {node: '>=20'}
- hasBin: true
-
- '@rolldown/binding-android-arm-eabi@1.2.13':
- resolution: {integrity: sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==}
+ '@oxc-transform-react/binding-android-arm-eabi@0.153.0':
+ resolution: {integrity: sha512-VxhI7In+VRTemKyq9D1mztsDSo/nzRzhDLaMi3NobklIbFfLZYOYYPFM0knL4hQKZi1jFfMPHiP5Y/WjP4DGkw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
- '@rolldown/binding-android-arm64@1.2.13':
- resolution: {integrity: sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==}
+ '@oxc-transform-react/binding-android-arm64@0.153.0':
+ resolution: {integrity: sha512-JBv/BQvt84KRH63M4t296rGtt3X3awHZQ5jtK8zBwXLvH5FhpW/FtPaSUbCMI2x9sqI5/c94snOIPAX+dKb2qA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@rolldown/binding-darwin-arm64@1.2.13':
- resolution: {integrity: sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==}
+ '@oxc-transform-react/binding-darwin-arm64@0.153.0':
+ resolution: {integrity: sha512-Yvq5H8B2WPfwXo42ZCkmq0E5yOepxNTCwBmSZVKjze7/Buqa6OupyKw5YuZa7B/S+HyBJVQ5mXsDLKGSsXPoGQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@rolldown/binding-darwin-x64@1.2.13':
- resolution: {integrity: sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==}
+ '@oxc-transform-react/binding-darwin-x64@0.153.0':
+ resolution: {integrity: sha512-A/NArh1lZX5dvwvZEnRXYl1O+xKiw5N8Qz8gJYKkRbHT8XvD8XU/hP7DO5j8Vzfm+N8EYK/iHUqnf370wwS+yw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@rolldown/binding-freebsd-x64@1.2.13':
- resolution: {integrity: sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==}
+ '@oxc-transform-react/binding-freebsd-x64@0.153.0':
+ resolution: {integrity: sha512-ZpVCiJKiQBd98TDSSvrcFjCKAhi/EZETxe5KRHgX0JgXffPQMfP3ICPPCTvMK4YjIozZIhvKb7j8hLeC831PHw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- '@rolldown/binding-linux-arm-gnueabihf@1.2.13':
- resolution: {integrity: sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==}
+ '@oxc-transform-react/binding-linux-arm-gnueabihf@0.153.0':
+ resolution: {integrity: sha512-UA/u81e7E9DHVD2tdFRgXwzriEgRWpU4emBfYYt45DS2s93CIf5ht8swqc69DKZtexknpa4PshBWH1nJE5mqeg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@rolldown/binding-linux-arm64-gnu@1.2.13':
- resolution: {integrity: sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==}
+ '@oxc-transform-react/binding-linux-arm-musleabihf@0.153.0':
+ resolution: {integrity: sha512-PfEJ6ccNSfkdYQ8eFGzFvEJQEVcSYy924Rpd1qvLF8xpu0riem8mNSPrytPmAGXNhM9aavRakoT8k9Sv1D0mAA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@oxc-transform-react/binding-linux-arm64-gnu@0.153.0':
+ resolution: {integrity: sha512-1f8YX+9uPrFpPbg5pH6oN7j+0i2GbGxhZiRkTPLmYcpAJvPqVruWPfXdDiH6M3/dklgTfPjsydIcIiY7ORV6Ug==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-arm64-musl@1.2.13':
- resolution: {integrity: sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==}
+ '@oxc-transform-react/binding-linux-arm64-musl@0.153.0':
+ resolution: {integrity: sha512-GnN2R0H6KSjbr6RP/fjXoMG6MeFlbeqru1bkahnLoYjpqtKGiuGlWh4oTYgaxoPiE3AJciCr123rxHBUFQKUPA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@rolldown/binding-linux-ppc64-gnu@1.2.13':
- resolution: {integrity: sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==}
+ '@oxc-transform-react/binding-linux-ppc64-gnu@0.153.0':
+ resolution: {integrity: sha512-iveCsZ524m57Ke9E0vpD2zgOFtzTcORd8YmM8xCAkU0llWPg5gtn37g5lLGYhH983yKzK0dJwIWXfpWrGpvXXw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-s390x-gnu@1.2.13':
- resolution: {integrity: sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==}
+ '@oxc-transform-react/binding-linux-riscv64-gnu@0.153.0':
+ resolution: {integrity: sha512-DxPNVE+XuWWUw9GMqDuEKz4yF6pZenATAEhlZjQo+0bLtkUW7zch8pwX3lhasqJu94MhYpww33y1hBCPsn6yRA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@oxc-transform-react/binding-linux-riscv64-musl@0.153.0':
+ resolution: {integrity: sha512-nvXxNdHVwwsRNwKfymDo34PuVun1sRi1XD2A5DAwO3xokyFEz9aGK0/FdQnmOixTtouE/NEFb7jT6g5x3Y170w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
+ '@oxc-transform-react/binding-linux-s390x-gnu@0.153.0':
+ resolution: {integrity: sha512-O9Gcu3zuzkn0JYV4Teosp4BYtlAVhL78r9EawRA1W63pULu3TdnKqPjVNBI7Mn8goqNiDbrQaug6wLFbKnaNaQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-gnu@1.2.13':
- resolution: {integrity: sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==}
+ '@oxc-transform-react/binding-linux-x64-gnu@0.153.0':
+ resolution: {integrity: sha512-r1Pek4cpycy8Ju7UM033+RbXyKgS9FS0DH0mar/yVMs+44r/tJDa96eN6ov7138gJ6MQIQj3lKjUSZoSdGfu2Q==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-musl@1.2.13':
- resolution: {integrity: sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==}
+ '@oxc-transform-react/binding-linux-x64-musl@0.153.0':
+ resolution: {integrity: sha512-d5aS8XA3wYNLrLALGGXaS1Q6NIDmbd54+xxCk0RZFM9iLGDiowXj3ObsuNFqmTn8ljjHkiosz+QZJW5YCu90+A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
- '@rolldown/binding-openharmony-arm64@1.2.13':
- resolution: {integrity: sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==}
+ '@oxc-transform-react/binding-openharmony-arm64@0.153.0':
+ resolution: {integrity: sha512-7D81GeqwiJNdxnLSJnqqlKSqOmEEy+xmqZlKrviveQJr2SE30V5d8CQdT1Ye3uM6qyEzncFsW2jSgHmof+F8zw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- '@rolldown/binding-win32-arm64-msvc@1.2.13':
- resolution: {integrity: sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==}
+ '@oxc-transform-react/binding-win32-arm64-msvc@0.153.0':
+ resolution: {integrity: sha512-0usRzLDKvY3+SYQs9mLNlP9x3sTaWjHOpudUcgSKTob/dfXL2xUysujSsht23ooV3XtNo8K02xDbq/ov/wgGzA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@rolldown/binding-win32-x64-msvc@1.2.13':
- resolution: {integrity: sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==}
+ '@oxc-transform-react/binding-win32-ia32-msvc@0.153.0':
+ resolution: {integrity: sha512-280xKSNDYfpEnlZOi7nuQ4+tQL5SYl9M/14FQkq95CvkpFIJLYAyJYZxT9XJhPO7BGAsuIrZNO9sMoqKjakvhw==}
engines: {node: ^20.19.0 || >=22.12.0}
- cpu: [x64]
+ cpu: [ia32]
os: [win32]
- '@rolldown/pluginutils@1.0.1':
- resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
+ '@oxc-transform-react/binding-win32-x64-msvc@0.153.0':
+ resolution: {integrity: sha512-EatiBeAhQJRdUEGZ1aDBMc+P1rzMgPiElnB2oTkLK3nZ4y8jnP+xhT2Gsolg8EEH9sSfazAq4HJaQFdUByX7mg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
- '@rollup/rollup-android-arm-eabi@4.59.0':
- resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==}
+ '@oxfmt/binding-android-arm-eabi@0.73.0':
+ resolution: {integrity: sha512-dhunAdMbi/4o0Y66/+Wl6rpsNqpvE4i26Qw6bB77A97L2lJoktWg6m+X9QOon8iOEEqzD9rEZqFi5uZ4oIzhCA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.59.0':
- resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==}
+ '@oxfmt/binding-android-arm64@0.73.0':
+ resolution: {integrity: sha512-dBoypjC2/xeyKyIhN2waX0/XeoccH9k0lVVe+sGRc4X8HSJVRtqyZDoXdr7bGY9A75c51dX0z0dLDpGQKwCdCg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.59.0':
- resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==}
+ '@oxfmt/binding-darwin-arm64@0.73.0':
+ resolution: {integrity: sha512-Tn7Y+qWIpCQK+qdYwBcn6YvqeBuPiuG3tcNlYg16a5QL2o3rSmrgBB1nCyYqo0uvc1LNrfQW9/CK2tzFuID/Fg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.59.0':
- resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==}
+ '@oxfmt/binding-darwin-x64@0.73.0':
+ resolution: {integrity: sha512-yVb0E0tg/+9Xc9YJCBq66qF1DC/aN5mhb5nnHz0k4ikwkMANtSul2VPDSwjYdXR6/DFimc+pPUgLBqkIa5Ctuw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-freebsd-arm64@4.59.0':
- resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==}
- cpu: [arm64]
- os: [freebsd]
-
- '@rollup/rollup-freebsd-x64@4.59.0':
- resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==}
+ '@oxfmt/binding-freebsd-x64@0.73.0':
+ resolution: {integrity: sha512-IKR4lFnBkYNL9Uqdxa5GMTQLvnLj+3sDwTvh2atHCzah0xeo+1xR5bigRU8uyXlOsA4VpXUn0UAimq4E4RBGmQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
- resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==}
+ '@oxfmt/binding-linux-arm-gnueabihf@0.73.0':
+ resolution: {integrity: sha512-7qnZ4g0ZCO3aZevOOQpZIABYwwXJW1lLDo2elviGdPQ0i11255xKEMFsi97fC1/nauQFseCJfELUy/k2JoOP+g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- libc: [glibc]
- '@rollup/rollup-linux-arm-musleabihf@4.59.0':
- resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==}
+ '@oxfmt/binding-linux-arm-musleabihf@0.73.0':
+ resolution: {integrity: sha512-36eBico2j/WPB84gb4FYd/jjqGCKOwU4M+TWLBUIqlnzTozQueLy0joA5BwsSp2OZFVkOlpCwvA3ndPamdiyLw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- libc: [musl]
- '@rollup/rollup-linux-arm64-gnu@4.59.0':
- resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==}
+ '@oxfmt/binding-linux-arm64-gnu@0.73.0':
+ resolution: {integrity: sha512-VZ3cSgCAT18knKo52DcACmAuIoqG6qVEyeZRFbJd0xmYQ8GyYjuBc6IAh6MZHijT6q7p4/HPI+6ZWsCuhdV6iw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-arm64-musl@4.59.0':
- resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==}
+ '@oxfmt/binding-linux-arm64-musl@0.73.0':
+ resolution: {integrity: sha512-8YVzH59XSHcqwXNgc5qK851zCqwpmBgOifARXEPPe5/xTsIbHceYoPZAyqfpYV0CfKmzSaEDBgYHFza4rhx+Zw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-loong64-gnu@4.59.0':
- resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==}
- cpu: [loong64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-loong64-musl@4.59.0':
- resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==}
- cpu: [loong64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-ppc64-gnu@4.59.0':
- resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==}
+ '@oxfmt/binding-linux-ppc64-gnu@0.73.0':
+ resolution: {integrity: sha512-MqRJnmCys0rwOgpWyEidSA7v/bvOqfNDJhPkQoR9mPVYrvSmMaW2Xhdpl28cbTA+brOM1is62GjIvJplVlUVpw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-ppc64-musl@4.59.0':
- resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==}
- cpu: [ppc64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-riscv64-gnu@4.59.0':
- resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==}
+ '@oxfmt/binding-linux-riscv64-gnu@0.73.0':
+ resolution: {integrity: sha512-4t2F3SWJSK/O/kRRFnL0elJzn75fJGGu71gs1HtiWcS80SmJOpkHiwwLnTp9suGdns8VHEPxYS0GTcyVwHKWBA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-riscv64-musl@4.59.0':
- resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==}
+ '@oxfmt/binding-linux-riscv64-musl@0.73.0':
+ resolution: {integrity: sha512-D8b4I8I1kLdJQFwdFXNV+cwh3xWSiNKofjdGUk0nDpc0AHOds8T+poGbP9RWQMvgsvMb9OMgp/aV7ahBR37TbQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-s390x-gnu@4.59.0':
- resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==}
+ '@oxfmt/binding-linux-s390x-gnu@0.73.0':
+ resolution: {integrity: sha512-QrC1S5VL1+N5rvorB15jH7CPvjVHA7GyUI5oVEd8Bd9m5605RDBQYTxDQ920DuylRoZOh2V7/xXpfCtFUrojUQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-x64-gnu@4.59.0':
- resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==}
+ '@oxfmt/binding-linux-x64-gnu@0.73.0':
+ resolution: {integrity: sha512-dFcUKQPltCEPa+YlkF3zqufn6nJPZdG73LpnjBvZFFsU3laCMssDXSYB99mVaj43FqdEgjpz5TO6gbYXcczd9g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-x64-musl@4.59.0':
- resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==}
+ '@oxfmt/binding-linux-x64-musl@0.73.0':
+ resolution: {integrity: sha512-LmQe+nV8e+eUwfPNCxDF+owbsg88toBiR/8rZRgVOeKQP3MaGefXZRvBoc1UG37iWEQ/9JlCXG9Mc4nf4N3agw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
- '@rollup/rollup-openbsd-x64@4.59.0':
- resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==}
- cpu: [x64]
- os: [openbsd]
-
- '@rollup/rollup-openharmony-arm64@4.59.0':
- resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==}
+ '@oxfmt/binding-openharmony-arm64@0.73.0':
+ resolution: {integrity: sha512-8weOr1OKknE0G2DbR6ejJUT9AOsoBU6cXlsetmbihHv1K+bK7qP61T6lJxY0k/aAO7GyOJiRGNlL+04r4eH8Xg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- '@rollup/rollup-win32-arm64-msvc@4.59.0':
- resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==}
+ '@oxfmt/binding-win32-arm64-msvc@0.73.0':
+ resolution: {integrity: sha512-mZV+QxXYgb8E18gzAFItb937VIsE4dqWdStrD3tRRC52UubOYEuU+e7NaIqUsGdB5YsJqNeuck3Ue/af2r9wyA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.59.0':
- resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==}
+ '@oxfmt/binding-win32-ia32-msvc@0.73.0':
+ resolution: {integrity: sha512-QJPUsbgUb97ZPPMkFUq6VQq0fLhC4Np19KL9aB/qKVwXnpKE6MIiILXqzhKnQ/UbnEDjKJ7Xv1d6zH4bYPCUdQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-gnu@4.59.0':
- resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==}
+ '@oxfmt/binding-win32-x64-msvc@0.73.0':
+ resolution: {integrity: sha512-cGcze2fu+ykIaFtkEvZlkZ3HvnCLk+WISthtq99zWTWn0x13t5L9TxvGdLZMUMvtfYR+ICkiCwKnguVubdcw0w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.59.0':
- resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==}
- cpu: [x64]
- os: [win32]
+ '@oxlint/binding-android-arm-eabi@1.88.0':
+ resolution: {integrity: sha512-k6Fgkf86ubfeH4GvqYsRolfuVAp0pfYVZvifSlXNHPdMaWUOfxUrmLEeDD7hF6U2oJuhsVxhSWq86/xCJ+9MmA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [android]
- '@switz/eslint-config@13.1.0':
- resolution: {integrity: sha512-IjaQvQy3QTGJRXFj3qb7N2fl1auBZ5d6quXFWvrkUeHKkIgDKGp8NjB5TcvRHn6U7rGjkw7xixQSd1uMjNocRQ==}
- deprecated: Moved to @switz/lint-config
- peerDependencies:
- eslint: '>= 9'
+ '@oxlint/binding-android-arm64@1.88.0':
+ resolution: {integrity: sha512-AsIyhl9o1ejwtac7NMbhKpMdSml6NWR0ljKjZERxC8OHYDAW8o/Om9n1QHVLi4VCEUo42Zte2/Op9kyoGpJZMg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
- '@types/chai@5.2.3':
- resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
+ '@oxlint/binding-darwin-arm64@1.88.0':
+ resolution: {integrity: sha512-qgBjB7eEKcCB4RqjXGuoSZq74g0wD09fWFJ+HWcCJcKaga8TeUHtb+BY0SsxdleSLBgx4RZ7qmgo0EzqEq7JoQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
- '@types/concat-stream@2.0.3':
- resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==}
+ '@oxlint/binding-darwin-x64@1.88.0':
+ resolution: {integrity: sha512-sCz3X5Mw/xdzEzn4fsCt1Iq8NKJnGNfhR+b9B5k+4DysYAHsmIhYoocnBPiQ9kvY3+pUun2A0Z8Vtun/Nv6YoQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
- '@types/debug@4.1.13':
- resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
+ '@oxlint/binding-freebsd-x64@1.88.0':
+ resolution: {integrity: sha512-xTOdYOIqCufgIj0knvxu86FBfovP6QBiD7ngNva01gb8xPQCD5gXkE5APGczH35zStim1O3zqvFbLQmY85xXRg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
- '@types/deep-eql@4.0.2':
- resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+ '@oxlint/binding-linux-arm-gnueabihf@1.88.0':
+ resolution: {integrity: sha512-BLadtw88NdYJBrAtC1dYzrPfSP2d5zgx6iuZycdD0YmZBJ2Nqbit9Z4PSaIb6gxK25dweArGMPbOmq/0ugwUPg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
- '@types/esrecurse@4.3.1':
- resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
+ '@oxlint/binding-linux-arm-musleabihf@1.88.0':
+ resolution: {integrity: sha512-wILSczl/DaZsCcf7j7tvNbssp8hxEHIJxrv4j7+JjI3TAL1U/JTWbeUtoJJC/vo8+2hkTmHLYoKJjmiNbijdXw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
- '@types/estree-jsx@1.0.5':
- resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+ '@oxlint/binding-linux-arm64-gnu@1.88.0':
+ resolution: {integrity: sha512-jutT2Hy8JCuZuMwIFHo2HtyxfOfBJHyQxlBHBK1SL9W2f8n/WhjAP0FnDMz9d/mjhv9+QA0mx5AdQ9fDjsrFFg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- '@types/estree@1.0.8':
- resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+ '@oxlint/binding-linux-arm64-musl@1.88.0':
+ resolution: {integrity: sha512-8N8iGV9hh4Lkeuq7QsEkjoXNRRflqR1G2qyoGYXcA0k5qllrdqmfylKEXyHIVERxqNDyMO4StqDQ0uLxXcBQAg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
- '@types/estree@1.0.9':
- resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+ '@oxlint/binding-linux-ppc64-gnu@1.88.0':
+ resolution: {integrity: sha512-5ydcQt3znNQ/rGEWYRvpS2cK9+T18P2VYgnyJ+eloEAwi9YUmsXy5VGrRqNWIK6qzWwHGnEE3ojVqqQNo+f0hA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
- '@types/hast@3.0.4':
- resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+ '@oxlint/binding-linux-riscv64-gnu@1.88.0':
+ resolution: {integrity: sha512-iGx0uvFT54b/5DPJdEBCxYIrVB3v0uTy+JhRh3CyEp8/22BXDkG8rffkFwREdLsdj9mOrPbJYVOZw8ipcBuzjw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
- '@types/is-empty@1.2.3':
- resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==}
+ '@oxlint/binding-linux-riscv64-musl@1.88.0':
+ resolution: {integrity: sha512-Wt47mKMWelVjRjuR7BCFxXkB0m79K1sTEbqMHRWciKUgo5iv7sWsF4RXSOyFYHD9zerNrkRZblnN273rhwOA1Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
- '@types/json-schema@7.0.15':
- resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ '@oxlint/binding-linux-s390x-gnu@1.88.0':
+ resolution: {integrity: sha512-g3L12KCS4+1gtUt3RbJ4F+Yxx4LNmmZLEPfhd8rAHEJjJk2lAgNfnjGoP/phJyhG5WS6VbNYbJtadJelNfvTMA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
- '@types/mdast@4.0.4':
- resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+ '@oxlint/binding-linux-x64-gnu@1.88.0':
+ resolution: {integrity: sha512-og/XHVDOD9ZJgRiZkT9DgzQd4sr+JZW7e4l17Q/jVMZiIbeEd4uIu9iAoUbTF1gIvVZoRc4QDOxyVUvQGp4WHg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
- '@types/ms@2.1.0':
- resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+ '@oxlint/binding-linux-x64-musl@1.88.0':
+ resolution: {integrity: sha512-EmhBsp+xuKb6YbZNEMLBo80Xw71AZOIm18do8ni/GLX/Lw1XzNhVYpbxO1KasYtoAvrGtCOdCPULRlIE0bPbTQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
- '@types/node@22.19.20':
- resolution: {integrity: sha512-6tELRwSDYWW9EdZhbeZmYGZ1/7Djkt+Ah3/ScEYT9cDord7UJzasR/4D3VONg9tQI5CDp+/CZC1AXj2pCFOvpw==}
+ '@oxlint/binding-openharmony-arm64@1.88.0':
+ resolution: {integrity: sha512-DBUcx/KwYdg1DAz+G01P/GFv512J04EsZadbHptx2FTpWT/MWRg21ZToNHt9pnsfQRBQ3et/g+vqzbvrdAVbuA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
- '@types/node@26.6.2':
- resolution: {integrity: sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==}
+ '@oxlint/binding-win32-arm64-msvc@1.88.0':
+ resolution: {integrity: sha512-xeVd0n4XG5HvynxfYvXi6uB+JvZbVZataowPS8cYpMbYg9mwE4sSyElFQd4LVJFifq8bRLDSR18XgEildmcXAg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
- '@types/react-dom@19.3.0':
- resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==}
- peerDependencies:
- '@types/react': ^19.3.0
+ '@oxlint/binding-win32-ia32-msvc@1.88.0':
+ resolution: {integrity: sha512-MA6iOw//amleaz2mVMsZrA7NHlEexjTrhIxSMFCXQi6IUuQO+3Od00GZhr2iCYw6RFzMW36jkKK/WHBXMsoQAw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ia32]
+ os: [win32]
- '@types/react@19.3.0':
- resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==}
+ '@oxlint/binding-win32-x64-msvc@1.88.0':
+ resolution: {integrity: sha512-3Sz6rVWe8Dy+ufsXurFN1GX2dX43F/lQMSLelK9gFjiba7nHvLlqlhR5cHlWVnCpSqUY1hN9pyCX9XToe6ve6g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
- '@types/supports-color@8.1.3':
- resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==}
+ '@playwright/test@1.64.0':
+ resolution: {integrity: sha512-oTN9FNYuN6bqQMwiho6jJKLCG2/QOYCixGXuCjRmzOq23eODeukuY2XiAVoVpAECbuezMt1MHQjAiQxK8F+Y+g==}
+ engines: {node: '>=20'}
+ hasBin: true
- '@types/unist@2.0.11':
- resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+ '@rolldown/binding-android-arm-eabi@1.2.13':
+ resolution: {integrity: sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [android]
- '@types/unist@3.0.3':
- resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+ '@rolldown/binding-android-arm64@1.2.13':
+ resolution: {integrity: sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
- '@types/whatwg-mimetype@3.0.2':
- resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
+ '@rolldown/binding-darwin-arm64@1.2.13':
+ resolution: {integrity: sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
- '@types/ws@8.18.1':
- resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
+ '@rolldown/binding-darwin-x64@1.2.13':
+ resolution: {integrity: sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
- '@typescript-eslint/eslint-plugin@8.61.0':
- resolution: {integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- '@typescript-eslint/parser': ^8.61.0
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
+ '@rolldown/binding-freebsd-x64@1.2.13':
+ resolution: {integrity: sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.13':
+ resolution: {integrity: sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-gnu@1.2.13':
+ resolution: {integrity: sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-arm64-musl@1.2.13':
+ resolution: {integrity: sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@rolldown/binding-linux-ppc64-gnu@1.2.13':
+ resolution: {integrity: sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-s390x-gnu@1.2.13':
+ resolution: {integrity: sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-x64-gnu@1.2.13':
+ resolution: {integrity: sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-x64-musl@1.2.13':
+ resolution: {integrity: sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@rolldown/binding-openharmony-arm64@1.2.13':
+ resolution: {integrity: sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rolldown/binding-win32-arm64-msvc@1.2.13':
+ resolution: {integrity: sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rolldown/binding-win32-x64-msvc@1.2.13':
+ resolution: {integrity: sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@rolldown/pluginutils@1.0.1':
+ resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
+
+ '@rollup/rollup-android-arm-eabi@4.59.0':
+ resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.59.0':
+ resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.59.0':
+ resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.59.0':
+ resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.59.0':
+ resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.59.0':
+ resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+ resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+ resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-arm64-gnu@4.59.0':
+ resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm64-musl@4.59.0':
+ resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-loong64-gnu@4.59.0':
+ resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-loong64-musl@4.59.0':
+ resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+ resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-ppc64-musl@4.59.0':
+ resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+ resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-riscv64-musl@4.59.0':
+ resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-s390x-gnu@4.59.0':
+ resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-gnu@4.59.0':
+ resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-musl@4.59.0':
+ resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-openbsd-x64@4.59.0':
+ resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@rollup/rollup-openharmony-arm64@4.59.0':
+ resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.59.0':
+ resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==}
+ cpu: [arm64]
+ os: [win32]
- '@typescript-eslint/parser@8.61.0':
- resolution: {integrity: sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@rollup/rollup-win32-ia32-msvc@4.59.0':
+ resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-gnu@4.59.0':
+ resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.59.0':
+ resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@standard-schema/spec@1.1.0':
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
+ '@switz/lint-config@14.0.0':
+ resolution: {integrity: sha512-hRfUu9bQxPj6r1DzMfxH0P4xqGXu19GikGTJ3cw2wDo3b0kmgI8innNzpihRHWCSFcvauF73XRuC+bRs4uedFw==}
peerDependencies:
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
+ oxfmt: '>= 0.38.0'
+ oxlint: '>= 1.45.0'
+ oxlint-tailwindcss: '*'
+ peerDependenciesMeta:
+ oxfmt:
+ optional: true
+ oxlint-tailwindcss:
+ optional: true
+
+ '@tailwindcss/node@4.3.3':
+ resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==}
+
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [android]
+
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [win32]
- '@typescript-eslint/project-service@8.61.0':
- resolution: {integrity: sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/oxide@4.3.3':
+ resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==}
+ engines: {node: '>= 20'}
+
+ '@tailwindcss/vite@4.3.3':
+ resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==}
peerDependencies:
- typescript: '>=4.8.4 <6.1.0'
+ vite: ^5.2.0 || ^6 || ^7 || ^8
- '@typescript-eslint/scope-manager@8.61.0':
- resolution: {integrity: sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@takumi-rs/core-darwin-arm64@2.16.2':
+ resolution: {integrity: sha512-4bTzrfKNKVvM7r09pGV4ySUYkPrIW9IInOoOsNlcUKL8znMqfaM5cxie6VL0Hn94wHFIiAK9cDQEZwEe0SLMPg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@takumi-rs/core-darwin-x64@2.16.2':
+ resolution: {integrity: sha512-FanSHh0FtV1mDKvJy/KVHOA9loFO1kF2PNfdUuScv8jZWtLoUOSImbCwTomaePnNIeFY7jBjVREj2xhMenHz2w==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@takumi-rs/core-linux-arm64-gnu@2.16.2':
+ resolution: {integrity: sha512-aXxQ6F7UTZgKzqyPNypZ96V+XQvOFtPH9LX0/AnOO7dxbB8n3/JdSocwaJn/XUHicrar+k+VTv4CQ6Z9xx0RDQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- '@typescript-eslint/tsconfig-utils@8.61.0':
- resolution: {integrity: sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@takumi-rs/core-linux-arm64-musl@2.16.2':
+ resolution: {integrity: sha512-U8aB9ISUmkFtuC/n9B3zunUbFLxf/oOqDUYNwI05ukMxGrV87UbbQKaYmhRdvLAqWJacz2EdhMDr+Padjly5GA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@takumi-rs/core-linux-x64-gnu@2.16.2':
+ resolution: {integrity: sha512-aYjF4E+9Dw5jLAFMCcvzEFeWtouX7YYc550pwQ8aj6U98qTtj6aoSPEv2mtxoDKe+QDkQ1yfqB90+vgNp0uCjA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@takumi-rs/core-linux-x64-musl@2.16.2':
+ resolution: {integrity: sha512-Nz04aGC7x1Qm313VCnFHBXzXRDgyfgsOK6KHZt/jBo8ZEOqaC+jSJvVNMNesSGCsFRzNMOlIdb0UuW21aYEutQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@takumi-rs/core-win32-arm64-msvc@2.16.2':
+ resolution: {integrity: sha512-u+LIuDwTMji4KD2s7GC1/g7H7L0Yf4djFdu6jOKNXg4sVrDv7ZG0ovoDKMyXGDGHSVuoypvkLMCZO4U/Q042Zg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@takumi-rs/core-win32-x64-msvc@2.16.2':
+ resolution: {integrity: sha512-za4ZORo4/NCn96b1JQh9wxuJ6t84Vzs7oIfwSjWd5Sw7S2xfX4DzP+U+uY+7NU8v7XYH78aqyzhEL8FkoNc9vA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@takumi-rs/core@2.16.2':
+ resolution: {integrity: sha512-0CfFW08JP23zjNb5dmXel48UXOEK01wXxCvDkAWzJ0Bs4MA7m2NLL2UoFX+HP7tIfYeEO/3uyRjJv0jXbP4IMA==}
+ engines: {node: '>=18'}
peerDependencies:
- typescript: '>=4.8.4 <6.1.0'
+ csstype: '*'
+ peerDependenciesMeta:
+ csstype:
+ optional: true
- '@typescript-eslint/type-utils@8.61.0':
- resolution: {integrity: sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@takumi-rs/helpers@2.16.2':
+ resolution: {integrity: sha512-GmVDykCVTWhN7hVXO5eVhFvLkzX7HrAp/a5xMGX/IJjblR7Hxb5TP0OqwmtZUIkoRLhtjIl6Mlchag0NuBJGBw==}
+ engines: {node: '>=18'}
peerDependencies:
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
+ preact: ^10.0.0 || ^11.0.0
+ react: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ preact:
+ optional: true
+ react:
+ optional: true
- '@typescript-eslint/types@8.61.0':
- resolution: {integrity: sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@takumi-rs/wasm@2.16.2':
+ resolution: {integrity: sha512-HaLYmKkTvyzCv53/YH7Vh/UBzy0LJc3OxrgoKwAQovEGbLBPXi8iqBnjJrst8ZjAVPVrTKe/YT/DUXt/yb5GLg==}
+ engines: {node: '>=20.19'}
+ peerDependencies:
+ csstype: '*'
+ peerDependenciesMeta:
+ csstype:
+ optional: true
- '@typescript-eslint/typescript-estree@8.61.0':
- resolution: {integrity: sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@timber-js/app@0.2.0-alpha.220':
+ resolution: {integrity: sha512-ayvTCc/TNaCF5UvTjn2TB6t8bdExxic94NMHvbDKptWtbeWJGMZXLX7tz/Vkk3YOszRAT24CzXc2jBK1bRtfmw==}
+ engines: {node: '>=22.18.0'}
+ hasBin: true
peerDependencies:
- typescript: '>=4.8.4 <6.1.0'
+ '@content-collections/core': ^0.14.0 || ^0.15.0
+ '@content-collections/mdx': ^0.2.0
+ '@content-collections/vite': ^0.2.0 || ^0.3.0
+ '@typescript/native-preview': ^7.0.0-dev.0
+ '@vitejs/plugin-react': ^6.1.0
+ '@vitejs/plugin-rsc': ^0.5.35
+ nuqs: ^2.0.0
+ react: 19.3.0
+ react-dom: 19.3.0
+ satteri: ^0.9.5
+ vite: 8.3.0
+ vite-plugin-satteri: ^0.2.15
+ wrangler: ^4.0.0
+ zod: ^3.22.0 || ^4.0.0
+ peerDependenciesMeta:
+ '@content-collections/core':
+ optional: true
+ '@content-collections/mdx':
+ optional: true
+ '@content-collections/vite':
+ optional: true
+ '@typescript/native-preview':
+ optional: true
+ satteri:
+ optional: true
+ vite-plugin-satteri:
+ optional: true
+ wrangler:
+ optional: true
+ zod:
+ optional: true
+
+ '@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.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+
+ '@types/node@26.6.2':
+ resolution: {integrity: sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==}
- '@typescript-eslint/utils@8.61.0':
- resolution: {integrity: sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@types/react-dom@19.3.0':
+ resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==}
peerDependencies:
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
+ '@types/react': ^19.3.0
+
+ '@types/react@19.3.0':
+ resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==}
+
+ '@types/whatwg-mimetype@3.0.2':
+ resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
- '@typescript-eslint/visitor-keys@8.61.0':
- resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@types/ws@8.18.1':
+ resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
'@typescript/typescript-aix-ppc64@7.0.2':
resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==}
@@ -1038,12 +1467,7 @@ packages:
resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==}
engines: {node: '>=16.20.0'}
cpu: [x64]
- os: [win32]
-
- '@valibot/to-json-schema@1.7.1':
- resolution: {integrity: sha512-3qkmU6KXWh8GIThEAW3kuRHPQBMjWkKy+Ppz3WkUucx53DTpOa6siMn4xDGSOhlVyMrDaJTCTMLYPZVAIk1P0A==}
- peerDependencies:
- valibot: ^1.4.0
+ os: [win32]
'@vitejs/plugin-react@6.1.2':
resolution: {integrity: sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==}
@@ -1061,6 +1485,17 @@ packages:
oxc-transform-react:
optional: true
+ '@vitejs/plugin-rsc@0.5.37':
+ resolution: {integrity: sha512-4BUmLYKjDDJXEonK8QL034IsqXHFjtaKVUBs9syJsTOoKKUad8JkaYwQdyaCyplVccjuAQOLC86e9sE4fwP+NQ==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ react-server-dom-webpack: '*'
+ vite: '*'
+ peerDependenciesMeta:
+ react-server-dom-webpack:
+ optional: true
+
'@vitest/coverage-v8@5.0.4':
resolution: {integrity: sha512-P5YcQY8Y6RmoE9xRXI38rT8pssbcubEzqtYTM2XQoxOXMDn04nRaTI1SM8qCl9/NfW3ag9GlzdSXu7IwO5Ft8A==}
peerDependencies:
@@ -1092,70 +1527,14 @@ packages:
'@vitest/spy@5.0.4':
resolution: {integrity: sha512-MZKk/gSkm2q+ICobMxCpH1mA+cCAWm8WV7UhxlqGjq/sJ3AGc1BqFOs5CRVXxH78wQtme9q/NAAgBquj4AcyMw==}
- abbrev@2.0.0:
- resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- acorn-jsx@5.3.2:
- resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
- peerDependencies:
- acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
-
acorn@8.16.0:
resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
engines: {node: '>=0.4.0'}
hasBin: true
- ajv@6.15.0:
- resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
-
- ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
-
- ansi-regex@6.2.2:
- resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
- engines: {node: '>=12'}
-
- ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
-
- ansi-styles@6.2.3:
- resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
- engines: {node: '>=12'}
-
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
- array-buffer-byte-length@1.0.2:
- resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
- engines: {node: '>= 0.4'}
-
- array-includes@3.1.9:
- resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==}
- engines: {node: '>= 0.4'}
-
- array.prototype.findlast@1.2.5:
- resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
- engines: {node: '>= 0.4'}
-
- array.prototype.flat@1.3.3:
- resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
- engines: {node: '>= 0.4'}
-
- array.prototype.flatmap@1.3.3:
- resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
- engines: {node: '>= 0.4'}
-
- array.prototype.tosorted@1.1.4:
- resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
- engines: {node: '>= 0.4'}
-
- arraybuffer.prototype.slice@1.0.4:
- resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
- engines: {node: '>= 0.4'}
-
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
@@ -1163,41 +1542,6 @@ packages:
ast-v8-to-istanbul@1.0.7:
resolution: {integrity: sha512-kFL68AG6ajd8fg248zwM9GQrUWEp79gsmjum34OEXjs4yHuUMZfYKwOLW9GMmB4oNvVrj+EAGxsP7ye2UR9UlA==}
- async-function@1.0.0:
- resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
- engines: {node: '>= 0.4'}
-
- available-typed-arrays@1.0.7:
- resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
- engines: {node: '>= 0.4'}
-
- bail@2.0.2:
- resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
-
- balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-
- balanced-match@4.0.4:
- resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
- engines: {node: 18 || 20 || >=22}
-
- brace-expansion@1.1.15:
- resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==}
-
- brace-expansion@2.1.7:
- resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==}
-
- brace-expansion@5.0.12:
- resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==}
- engines: {node: 20 || >=22}
-
- brace-expansion@5.0.6:
- resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==}
- engines: {node: 18 || 20 || >=22}
-
- buffer-from@1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-
buffer-image-size@0.6.4:
resolution: {integrity: sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ==}
engines: {node: '>=4.0'}
@@ -1212,70 +1556,18 @@ packages:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
- cacheable@2.5.0:
- resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==}
-
- call-bind-apply-helpers@1.0.2:
- resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
- engines: {node: '>= 0.4'}
-
- call-bind@1.0.9:
- resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==}
- engines: {node: '>= 0.4'}
-
- call-bound@1.0.4:
- resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
- engines: {node: '>= 0.4'}
-
- ccount@2.0.1:
- resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
-
chai@6.3.0:
resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==}
engines: {node: '>=18'}
- chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
-
- character-entities-html4@2.1.0:
- resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
-
- character-entities-legacy@3.0.0:
- resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
-
- character-entities@2.0.2:
- resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
-
- character-reference-invalid@2.0.1:
- resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
-
chokidar@4.0.3:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
- ci-info@4.4.0:
- resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==}
- engines: {node: '>=8'}
-
- color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
-
- color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-
commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
- concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
- concat-stream@2.0.0:
- resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==}
- engines: {'0': node >= 6.0}
-
confbox@0.1.8:
resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
@@ -1283,24 +1575,23 @@ packages:
resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
engines: {node: ^14.18.0 || >=16.10.0}
- cross-spawn@7.0.6:
- resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
- engines: {node: '>= 8'}
+ cookie@2.0.1:
+ resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==}
+ engines: {node: '>=22'}
+
+ crossws@0.4.15:
+ resolution: {integrity: sha512-NsUOpDZosz7nyI+qEIl05yaiXOWaXH2oTeM+XBWtiSWZtb5rzcIsl1AST/HzM2jzUn76eFuyrkn83E6iSBRUvw==}
+ peerDependencies:
+ srvx: '>=0.11.5'
+ peerDependenciesMeta:
+ srvx:
+ optional: true
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
- data-view-buffer@1.0.2:
- resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
- engines: {node: '>= 0.4'}
-
- data-view-byte-length@1.0.2:
- resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
- engines: {node: '>= 0.4'}
-
- data-view-byte-offset@1.0.1:
- resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
- engines: {node: '>= 0.4'}
+ db0@0.4.1:
+ resolution: {integrity: sha512-6RBY/bSn42UrqATwsiULj2uYFyEykB3XeA/NLIVQeHNXlYV6D4Idxx3/aa6k5Y45Dwzx7sygeLotnqHWSeURYA==}
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
@@ -1311,233 +1602,42 @@ packages:
supports-color:
optional: true
- decode-named-character-reference@1.3.0:
- resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
-
- deep-is@0.1.4:
- resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
-
- define-data-property@1.1.4:
- resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
- engines: {node: '>= 0.4'}
-
- define-properties@1.2.1:
- resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
- engines: {node: '>= 0.4'}
-
- dequal@2.0.3:
- resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
- engines: {node: '>=6'}
-
detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
- devlop@1.1.0:
- resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
-
- doctrine@2.1.0:
- resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
- engines: {node: '>=0.10.0'}
-
- dunder-proto@1.0.1:
- resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
- engines: {node: '>= 0.4'}
-
- eastasianwidth@0.2.0:
- resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
-
- emoji-regex@10.6.0:
- resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
-
- emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
-
- emoji-regex@9.2.2:
- resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
-
- enhanced-resolve@5.23.0:
- resolution: {integrity: sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==}
+ enhanced-resolve@5.26.0:
+ resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==}
engines: {node: '>=10.13.0'}
entities@7.0.1:
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
engines: {node: '>=0.12'}
- err-code@2.0.3:
- resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
-
- error-ex@1.3.4:
- resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
-
- es-abstract@1.24.2:
- resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==}
- engines: {node: '>= 0.4'}
-
- es-define-property@1.0.1:
- resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
- engines: {node: '>= 0.4'}
-
- es-errors@1.3.0:
- resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
- engines: {node: '>= 0.4'}
-
- es-iterator-helpers@1.3.3:
- resolution: {integrity: sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==}
- engines: {node: '>= 0.4'}
+ env-runner@0.2.3:
+ resolution: {integrity: sha512-S8EFBKyznRwPVwayK187cYjvnpgC92xy+q0BIF++V965pfjMVVRbQ/HoTYGA/1EHmZ7E68k6Heq+4WnvVhOL5w==}
+ hasBin: true
es-module-lexer@2.3.2:
resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==}
- es-object-atoms@1.1.2:
- resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
- engines: {node: '>= 0.4'}
-
- es-set-tostringtag@2.1.0:
- resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
- engines: {node: '>= 0.4'}
-
- es-shim-unscopables@1.1.0:
- resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
- engines: {node: '>= 0.4'}
-
- es-to-primitive@1.3.0:
- resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
- engines: {node: '>= 0.4'}
+ es-module-lexer@3.0.3:
+ resolution: {integrity: sha512-yWGe1O/j+almnV4hOYrmZo8u58JdnmXEMneRQAYkWtqSiT86yoMIEKF4rpqEDj52tbYl3xceBD3DQIBwcsC9Pw==}
esbuild@0.27.3:
resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==}
engines: {node: '>=18'}
hasBin: true
- escape-string-regexp@4.0.0:
- resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
- engines: {node: '>=10'}
-
- eslint-config-prettier@10.1.8:
- resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
- hasBin: true
- peerDependencies:
- eslint: '>=7.0.0'
-
- eslint-mdx@3.8.1:
- resolution: {integrity: sha512-hnsqWwMOHqUANwxWEGt8XbwABPEr5sTOolAzqyUDFdlERpqjFE/icylb+mJl60VICL+kLbbvXWbnFLWZdTqJ2g==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- eslint: '>=8.0.0'
- remark-lint-file-extension: '*'
- peerDependenciesMeta:
- remark-lint-file-extension:
- optional: true
-
- eslint-plugin-better-tailwindcss@4.5.0:
- resolution: {integrity: sha512-EBNTx6OJYaWv7uUxHWTy1fhiNz2rZVkoeOHZzAJFwWaEPideBf04CMshrJ7YntG0KQzadlbRhHKYr32q5aBX4w==}
- engines: {node: ^20.19.0 || ^22.12.0 || >=23.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0
- oxlint: ^1.35.0
- tailwindcss: ^3.3.0 || ^4.1.17
- peerDependenciesMeta:
- eslint:
- optional: true
- oxlint:
- optional: true
-
- eslint-plugin-mdx@3.8.1:
- resolution: {integrity: sha512-4OLgotfBxUDc1f6ihXSagT/1+JCCUABA/2r6Kzl6gqFftg4dCV0wBfdwFo6X6UO/FzTHr3g6mVt+6prRXffc/Q==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- eslint: '>=8.0.0'
-
- eslint-plugin-prettier@5.5.6:
- resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==}
- engines: {node: ^14.18.0 || >=16.0.0}
- peerDependencies:
- '@types/eslint': '>=8.0.0'
- eslint: '>=8.0.0'
- eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0'
- prettier: '>=3.0.0'
- peerDependenciesMeta:
- '@types/eslint':
- optional: true
- eslint-config-prettier:
- optional: true
-
- eslint-plugin-react@7.37.5:
- resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==}
- engines: {node: '>=4'}
- peerDependencies:
- eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
-
- eslint-scope@9.1.2:
- resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
-
- eslint-visitor-keys@3.4.3:
- resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- eslint-visitor-keys@5.0.1:
- resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
-
- eslint@10.12.0:
- resolution: {integrity: sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- hasBin: true
- peerDependencies:
- jiti: '*'
- peerDependenciesMeta:
- jiti:
- optional: true
-
- espree@11.2.0:
- resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
-
- esquery@1.7.0:
- resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
- engines: {node: '>=0.10'}
-
- esrecurse@4.3.0:
- resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
- engines: {node: '>=4.0'}
-
- estraverse@5.3.0:
- resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
- engines: {node: '>=4.0'}
-
- estree-util-is-identifier-name@3.0.0:
- resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
-
- estree-util-visit@2.0.0:
- resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==}
-
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
- esutils@2.0.3:
- resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
- engines: {node: '>=0.10.0'}
-
expect-type@1.4.0:
resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==}
engines: {node: '>=12.0.0'}
- extend@3.0.2:
- resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
-
- fast-deep-equal@3.1.3:
- resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
-
- fast-diff@1.3.0:
- resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
-
- fast-json-stable-stringify@2.1.0:
- resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
-
- fast-levenshtein@2.0.6:
- resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ exsolve@1.1.3:
+ resolution: {integrity: sha512-kuzL9zherLQoqDeQaS55AiiIg1kb4KYXaSusTtgZTPlvKP2gGCI82LNmBNh5RjDVUXIcmgx+/Mx7vPwRzBbhJA==}
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
@@ -1548,298 +1648,39 @@ packages:
picomatch:
optional: true
- file-entry-cache@11.1.5:
- resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==}
-
- find-up@5.0.0:
- resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
- engines: {node: '>=10'}
-
fix-dts-default-cjs-exports@1.0.1:
resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==}
- flat-cache@6.1.23:
- resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==}
-
- flatted@3.4.4:
- resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
-
- for-each@0.3.5:
- resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
- engines: {node: '>= 0.4'}
-
- foreground-child@3.3.1:
- resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
- engines: {node: '>=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:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
-
- function.prototype.name@1.1.8:
- resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
- engines: {node: '>= 0.4'}
-
- functions-have-names@1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
-
- generator-function@2.0.1:
- resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
- engines: {node: '>= 0.4'}
-
- get-intrinsic@1.3.0:
- resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
- engines: {node: '>= 0.4'}
-
- get-proto@1.0.1:
- resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
- engines: {node: '>= 0.4'}
-
- get-symbol-description@1.1.0:
- resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
- engines: {node: '>= 0.4'}
-
- glob-parent@6.0.2:
- resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
- engines: {node: '>=10.13.0'}
-
- glob@10.5.0:
- resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
- deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
- hasBin: true
-
- globals@17.6.0:
- resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==}
- engines: {node: '>=18'}
-
- globalthis@1.0.4:
- resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
- engines: {node: '>= 0.4'}
-
- gopd@1.2.0:
- resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
- engines: {node: '>= 0.4'}
-
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ h3@2.0.2:
+ resolution: {integrity: sha512-+/zvHSNldYpNURuUUG+y1KzdASUhNnSd1VpqxYFVY40ov3YzuBnCETaUQaT+QbKkoxhh9LRa6AEQdB14LALwdA==}
+ engines: {node: '>=20.19.0'}
+ hasBin: true
+ peerDependencies:
+ crossws: ^0.4.12
+ ocache: '>=0.3.0'
+ peerDependenciesMeta:
+ crossws:
+ optional: true
+ ocache:
+ optional: true
+
happy-dom@21.0.1:
resolution: {integrity: sha512-pRBs/u9fhrncyByOl58DMex0R2uAj6ZPKWIjV5j5yNGZBqLw3P6BTRhlc0DD5b/Ht4/6JYTMuE2LJhUWRC6SGw==}
engines: {node: '>=20.0.0'}
- has-bigints@1.1.0:
- resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
- engines: {node: '>= 0.4'}
-
- has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
-
- has-property-descriptors@1.0.2:
- resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
-
- has-proto@1.2.0:
- resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
- engines: {node: '>= 0.4'}
-
- has-symbols@1.1.0:
- resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
- engines: {node: '>= 0.4'}
-
- has-tostringtag@1.0.2:
- resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
- engines: {node: '>= 0.4'}
-
- hashery@1.5.1:
- resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==}
- engines: {node: '>=20'}
-
- hasown@2.0.4:
- resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
- engines: {node: '>= 0.4'}
-
- hookified@1.15.1:
- resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==}
-
- hookified@2.2.0:
- resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==}
-
- hosted-git-info@7.0.2:
- resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
- engines: {node: ^16.14.0 || >=18.0.0}
-
- ignore@5.3.2:
- resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
- engines: {node: '>= 4'}
-
- ignore@6.0.2:
- resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==}
- engines: {node: '>= 4'}
-
- ignore@7.0.5:
- resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
- engines: {node: '>= 4'}
-
- import-meta-resolve@4.2.0:
- resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
-
- imurmurhash@0.1.4:
- resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
- engines: {node: '>=0.8.19'}
-
- inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
- ini@4.1.3:
- resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- internal-slot@1.1.0:
- resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
- engines: {node: '>= 0.4'}
-
- is-alphabetical@2.0.1:
- resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
-
- is-alphanumerical@2.0.1:
- resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
-
- is-array-buffer@3.0.5:
- resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
- engines: {node: '>= 0.4'}
-
- is-arrayish@0.2.1:
- resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
-
- is-async-function@2.1.1:
- resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
- engines: {node: '>= 0.4'}
-
- is-bigint@1.1.0:
- resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
- engines: {node: '>= 0.4'}
-
- is-boolean-object@1.2.2:
- resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
- engines: {node: '>= 0.4'}
-
- is-callable@1.2.7:
- resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
- engines: {node: '>= 0.4'}
-
- is-core-module@2.16.2:
- resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==}
- engines: {node: '>= 0.4'}
-
- is-data-view@1.0.2:
- resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
- engines: {node: '>= 0.4'}
-
- is-date-object@1.1.0:
- resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
- engines: {node: '>= 0.4'}
-
- is-decimal@2.0.1:
- resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
-
- is-empty@1.2.0:
- resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==}
-
- is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
-
- is-finalizationregistry@1.1.1:
- resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
- engines: {node: '>= 0.4'}
-
- is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
-
- is-generator-function@1.1.2:
- resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
- engines: {node: '>= 0.4'}
-
- is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
-
- is-hexadecimal@2.0.1:
- resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
-
- is-map@2.0.3:
- resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
- engines: {node: '>= 0.4'}
-
- is-negative-zero@2.0.3:
- resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
- engines: {node: '>= 0.4'}
-
- is-number-object@1.1.1:
- resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
- engines: {node: '>= 0.4'}
-
- is-plain-obj@4.1.0:
- resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
- engines: {node: '>=12'}
-
- is-regex@1.2.1:
- resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
- engines: {node: '>= 0.4'}
-
- is-set@2.0.3:
- resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
- engines: {node: '>= 0.4'}
-
- is-shared-array-buffer@1.0.4:
- resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
- engines: {node: '>= 0.4'}
-
- is-string@1.1.1:
- resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
- engines: {node: '>= 0.4'}
+ hookable@6.1.2:
+ resolution: {integrity: sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==}
- is-symbol@1.1.1:
- resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
- engines: {node: '>= 0.4'}
-
- is-typed-array@1.1.15:
- resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
- engines: {node: '>= 0.4'}
-
- is-weakmap@2.0.2:
- resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
- engines: {node: '>= 0.4'}
-
- is-weakref@1.1.1:
- resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
- engines: {node: '>= 0.4'}
-
- is-weakset@2.0.4:
- resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
- engines: {node: '>= 0.4'}
-
- isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
-
- isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
- isexe@3.1.5:
- resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==}
- engines: {node: '>=18'}
-
- iterator.prototype@1.1.5:
- resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
- engines: {node: '>= 0.4'}
-
- jackspeak@3.4.3:
- resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+ httpxy@0.5.5:
+ resolution: {integrity: sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==}
jiti@2.7.0:
resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
@@ -1852,34 +1693,14 @@ packages:
js-tokens@10.0.0:
resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==}
- js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
- json-parse-even-better-errors@3.0.2:
- resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- json-schema-traverse@0.4.1:
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
-
- json-stable-stringify-without-jsonify@1.0.1:
- resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
-
- json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
-
- jsx-ast-utils@3.3.5:
- resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
- engines: {node: '>=4.0'}
-
- keyv@5.6.0:
- resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==}
+ jsonc-parser@3.3.1:
+ resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
- levn@0.4.1:
- resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
- engines: {node: '>= 0.8.0'}
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
lightningcss-android-arm64@1.33.0:
resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
@@ -1887,30 +1708,61 @@ packages:
cpu: [arm64]
os: [android]
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ 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:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ 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:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ 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:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ 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:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
lightningcss-linux-arm64-gnu@1.33.0:
resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
engines: {node: '>= 12.0.0'}
@@ -1918,6 +1770,13 @@ packages:
os: [linux]
libc: [glibc]
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
lightningcss-linux-arm64-musl@1.33.0:
resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
engines: {node: '>= 12.0.0'}
@@ -1925,6 +1784,13 @@ packages:
os: [linux]
libc: [musl]
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
lightningcss-linux-x64-gnu@1.33.0:
resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
engines: {node: '>= 12.0.0'}
@@ -1932,6 +1798,13 @@ packages:
os: [linux]
libc: [glibc]
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
lightningcss-linux-x64-musl@1.33.0:
resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
engines: {node: '>= 12.0.0'}
@@ -1939,18 +1812,34 @@ packages:
os: [linux]
libc: [musl]
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ 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:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ 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:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
+ engines: {node: '>= 12.0.0'}
+
lightningcss@1.33.0:
resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
engines: {node: '>= 12.0.0'}
@@ -1962,31 +1851,10 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
- lines-and-columns@2.0.4:
- resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- load-plugin@6.0.3:
- resolution: {integrity: sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==}
-
load-tsconfig@0.2.5:
resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- locate-path@6.0.0:
- resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
- engines: {node: '>=10'}
-
- longest-streak@3.1.0:
- resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
-
- loose-envify@1.4.0:
- resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
- hasBin: true
-
- lru-cache@10.4.3:
- resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
-
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
@@ -1996,143 +1864,6 @@ packages:
magicast@0.5.5:
resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==}
- math-intrinsics@1.1.0:
- resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
- engines: {node: '>= 0.4'}
-
- mdast-util-from-markdown@2.0.3:
- resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==}
-
- mdast-util-mdx-expression@2.0.1:
- resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
-
- mdast-util-mdx-jsx@3.2.0:
- resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
-
- mdast-util-mdx@3.0.0:
- resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
-
- mdast-util-mdxjs-esm@2.0.1:
- resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
-
- mdast-util-phrasing@4.1.0:
- resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
-
- mdast-util-to-markdown@2.1.2:
- resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
-
- mdast-util-to-string@4.0.0:
- resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
-
- mdn-data@2.28.1:
- resolution: {integrity: sha512-U9w+PzSZ00Z5m9rZ5ARVFL5xOfuCHdKYi/1RRwDCJsboFgJDNT3zT6PIPD7mZQYaQLhsZM3GfDRgSMRHhSmVng==}
-
- micromark-core-commonmark@2.0.3:
- resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
-
- micromark-extension-mdx-expression@3.0.1:
- resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==}
-
- micromark-extension-mdx-jsx@3.0.2:
- resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==}
-
- micromark-extension-mdx-md@2.0.0:
- resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
-
- micromark-extension-mdxjs-esm@3.0.0:
- resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
-
- micromark-extension-mdxjs@3.0.0:
- resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
-
- micromark-factory-destination@2.0.1:
- resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
-
- micromark-factory-label@2.0.1:
- resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
-
- micromark-factory-mdx-expression@2.0.3:
- resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==}
-
- micromark-factory-space@2.0.1:
- resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
-
- micromark-factory-title@2.0.1:
- resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
-
- micromark-factory-whitespace@2.0.1:
- resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
-
- micromark-util-character@2.1.1:
- resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
-
- micromark-util-chunked@2.0.1:
- resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
-
- micromark-util-classify-character@2.0.1:
- resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
-
- micromark-util-combine-extensions@2.0.1:
- resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
-
- micromark-util-decode-numeric-character-reference@2.0.2:
- resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
-
- micromark-util-decode-string@2.0.1:
- resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
-
- micromark-util-encode@2.0.1:
- resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
-
- micromark-util-events-to-acorn@2.0.3:
- resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==}
-
- micromark-util-html-tag-name@2.0.1:
- resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
-
- micromark-util-normalize-identifier@2.0.1:
- resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
-
- micromark-util-resolve-all@2.0.1:
- resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
-
- micromark-util-sanitize-uri@2.0.1:
- resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
-
- micromark-util-subtokenize@2.1.0:
- resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
-
- micromark-util-symbol@2.0.1:
- resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
-
- micromark-util-types@2.0.2:
- resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
-
- micromark@4.0.2:
- resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
-
- minimatch@10.2.5:
- resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
- engines: {node: 18 || 20 || >=22}
-
- minimatch@10.2.6:
- resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
- engines: {node: 18 || 20 || >=22}
-
- minimatch@3.1.5:
- resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
-
- minimatch@9.0.9:
- resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- minimist@1.2.8:
- resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
-
- minipass@7.1.3:
- resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
- engines: {node: '>=16 || 14 >=14.17'}
-
mlly@1.8.0:
resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
@@ -2147,110 +1878,78 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- natural-compare@1.4.0:
- resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
-
- node-exports-info@1.6.0:
- resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==}
- engines: {node: '>= 0.4'}
+ nf3@0.3.24:
+ resolution: {integrity: sha512-HxLK4bo+5jNsEETZp4w3tJblHOA9MCBY14IN9nZJJV8JDxt9yNIYxuBuLMjTAR5GFa3HL61+8VQDUrXv3/C8fw==}
- nopt@7.2.1:
- resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ nitro@3.0.260903-beta:
+ resolution: {integrity: sha512-54gANPi62O8rfMvepiJUVuIzEIinYfpeHbebywlLxvVTgIYXDwSvpaU9Id+0sJOBjBx0wC1/CVYXJkH7SY+l0g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
- normalize-package-data@6.0.2:
- resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==}
- engines: {node: ^16.14.0 || >=18.0.0}
-
- npm-install-checks@6.3.0:
- resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- npm-normalize-package-bin@3.0.1:
- resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- npm-package-arg@11.0.3:
- resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==}
- engines: {node: ^16.14.0 || >=18.0.0}
-
- npm-pick-manifest@9.1.0:
- resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==}
- engines: {node: ^16.14.0 || >=18.0.0}
+ nuqs@2.10.2:
+ resolution: {integrity: sha512-HaLMCr9H2wywEnTu3j+QW98EteDT3Kfmx3SJJ6JfcvCvkFi/g/fKd/oCXa5DF0x1s1l4zcFtzsq9bflj6RcM6A==}
+ peerDependencies:
+ '@remix-run/react': '>=2'
+ '@tanstack/react-router': ^1
+ next: '>=14.2.0'
+ react: '>=18.2.0 || ^19.0.0-0'
+ react-router: ^5 || ^6 || ^7 || ^8
+ react-router-dom: ^5 || ^6 || ^7
+ peerDependenciesMeta:
+ '@remix-run/react':
+ optional: true
+ '@tanstack/react-router':
+ optional: true
+ next:
+ optional: true
+ react-router:
+ optional: true
+ react-router-dom:
+ optional: true
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
- object-inspect@1.13.4:
- resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
- engines: {node: '>= 0.4'}
-
- object-keys@1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
-
- object.assign@4.1.7:
- resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
- engines: {node: '>= 0.4'}
-
- object.entries@1.1.9:
- resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
- engines: {node: '>= 0.4'}
-
- object.fromentries@2.0.8:
- resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
- engines: {node: '>= 0.4'}
-
- object.values@1.2.1:
- resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
- engines: {node: '>= 0.4'}
-
obug@3.0.0:
resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==}
engines: {node: '>=12.20.0'}
- optionator@0.9.4:
- resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
- engines: {node: '>= 0.8.0'}
-
- own-keys@1.0.1:
- resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
- engines: {node: '>= 0.4'}
-
- p-limit@3.1.0:
- resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
- engines: {node: '>=10'}
-
- p-locate@5.0.0:
- resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
- engines: {node: '>=10'}
-
- package-json-from-dist@1.0.1:
- resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
-
- parse-entities@4.0.2:
- resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
-
- parse-json@7.1.1:
- resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==}
- engines: {node: '>=16'}
-
- path-exists@4.0.0:
- resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
- engines: {node: '>=8'}
+ ocache@0.3.0:
+ resolution: {integrity: sha512-RS/9P0zeBb0gDJmadGERLH8lZNXK7xbufTDhclkXGvFGTsj0G4M5/cLk+mizcERH29mLXNnocfB5wjcK70wGJg==}
- path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
+ oxc-transform-react@0.153.0:
+ resolution: {integrity: sha512-9p/BCIQj12y8Uble3WWUxVeZy88RjqOU7cVp18cLV7PTbNYVaWOyxC2+J9g+EdC9/AOKXzX/z1l92NZ9rvvgVQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
- path-parse@1.0.7:
- resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ oxfmt@0.73.0:
+ resolution: {integrity: sha512-Ke4xbpuzqIBP4bkd48q815RhqWNJqOBzxVA9199M4qcF0y0LtpUv7UTg1dJ5ea6jw0RBUDZvX3qOUMNmmxfxbw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@astrojs/compiler-rs': ^0.4.0 || ^0.5.0
+ svelte: ^5.0.0
+ vite-plus: '*'
+ peerDependenciesMeta:
+ '@astrojs/compiler-rs':
+ optional: true
+ svelte:
+ optional: true
+ vite-plus:
+ optional: true
- path-scurry@1.11.1:
- resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
- engines: {node: '>=16 || 14 >=14.18'}
+ oxlint@1.88.0:
+ resolution: {integrity: sha512-uIcFgw8BmqvFRGzH5+r7d2zJMEexwNSrEmM6WQNnGh3VkO0XYTEFoyxyNE6tjKMUib9Cue4XJA2DoWruO5D6aw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ oxlint-tsgolint: '>=7.0.2003'
+ vite-plus: '*'
+ peerDependenciesMeta:
+ oxlint-tsgolint:
+ optional: true
+ vite-plus:
+ optional: true
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
@@ -2283,10 +1982,6 @@ packages:
engines: {node: '>=20'}
hasBin: true
- possible-typed-array-names@1.1.0:
- resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
- engines: {node: '>= 0.4'}
-
postcss-load-config@6.0.1:
resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==}
engines: {node: '>= 18'}
@@ -2309,100 +2004,23 @@ packages:
resolution: {integrity: sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==}
engines: {node: ^10 || ^12 || >=14}
- prelude-ls@1.2.1:
- resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
- engines: {node: '>= 0.8.0'}
-
- prettier-linter-helpers@1.0.1:
- resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==}
- engines: {node: '>=6.0.0'}
-
- prettier@3.8.3:
- resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==}
- engines: {node: '>=14'}
- hasBin: true
-
- proc-log@4.2.0:
- resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- promise-inflight@1.0.1:
- resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==}
- peerDependencies:
- bluebird: '*'
- peerDependenciesMeta:
- bluebird:
- optional: true
-
- promise-retry@2.0.1:
- resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
- engines: {node: '>=10'}
-
- prop-types@15.8.1:
- resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
-
- punycode@2.3.1:
- resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
- engines: {node: '>=6'}
-
- qified@0.10.1:
- resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==}
- engines: {node: '>=20'}
-
react-dom@19.3.0:
resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==}
peerDependencies:
react: ^19.3.0
- react-is@16.13.1:
- resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
-
react@19.3.0:
resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==}
engines: {node: '>=0.10.0'}
- read-package-json-fast@3.0.2:
- resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- readable-stream@3.6.2:
- resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
- engines: {node: '>= 6'}
-
readdirp@4.1.2:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
- reflect.getprototypeof@1.0.10:
- resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
- engines: {node: '>= 0.4'}
-
- regexp.prototype.flags@1.5.4:
- resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
- engines: {node: '>= 0.4'}
-
- remark-mdx@3.1.1:
- resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==}
-
- remark-parse@11.0.0:
- resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
-
- remark-stringify@11.0.0:
- resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
-
resolve-from@5.0.0:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
- resolve@2.0.0-next.7:
- resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==}
- engines: {node: '>= 0.4'}
- hasBin: true
-
- retry@0.12.0:
- resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
- engines: {node: '>= 4'}
-
rolldown@1.2.13:
resolution: {integrity: sha512-/5apOkwWxtACcQtZ5WlrAsKS4JwXVThQPJZ3RqIruRY9UG9M8e0VlXN068xum/JRKA4aIUoJ13ghe/kGCvidiQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -2413,73 +2031,16 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
- safe-array-concat@1.1.4:
- resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==}
- engines: {node: '>=0.4'}
-
- safe-buffer@5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-
- safe-push-apply@1.0.0:
- resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
- engines: {node: '>= 0.4'}
+ rou3@0.9.2:
+ resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==}
- safe-regex-test@1.1.0:
- resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
- engines: {node: '>= 0.4'}
+ rou3@1.0.0:
+ resolution: {integrity: sha512-ySeaQkSrua+ut9g+65I7FHqOFBaY8tV0FmccXItoq0q21se32Q3u4YiW7/RqXSosWgYJaaKwRHXy3BST9PeCNQ==}
+ engines: {node: '>=20.19.0'}
scheduler@0.28.0:
resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==}
- semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
- hasBin: true
-
- semver@7.8.4:
- resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==}
- engines: {node: '>=10'}
- hasBin: true
-
- set-function-length@1.2.2:
- resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
- engines: {node: '>= 0.4'}
-
- set-function-name@2.0.2:
- resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
- engines: {node: '>= 0.4'}
-
- set-proto@1.0.0:
- resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
- engines: {node: '>= 0.4'}
-
- shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
-
- shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
-
- side-channel-list@1.0.1:
- resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
- engines: {node: '>= 0.4'}
-
- side-channel-map@1.0.1:
- resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
- engines: {node: '>= 0.4'}
-
- side-channel-weakmap@1.0.2:
- resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
- engines: {node: '>= 0.4'}
-
- side-channel@1.1.1:
- resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
- engines: {node: '>= 0.4'}
-
- signal-exit@4.1.0:
- resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
- engines: {node: '>=14'}
-
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
@@ -2492,107 +2053,36 @@ packages:
resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
engines: {node: '>= 12'}
- spdx-correct@3.2.0:
- resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
-
- spdx-exceptions@2.5.0:
- resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
-
- spdx-expression-parse@3.0.1:
- resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
-
- spdx-license-ids@3.0.23:
- resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==}
+ srvx@1.0.5:
+ resolution: {integrity: sha512-KvSKRpgPG/oaq3cyT614OQ2bAa7DynuGamivCZeoZzIUULOdbQz6wUtnnVuC4+DCx2Zglzo8v5gBYmWIWYhDxA==}
+ engines: {node: '>=20.16.0'}
+ hasBin: true
std-env@4.3.0:
resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==}
- stop-iteration-iterator@1.1.0:
- resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
- engines: {node: '>= 0.4'}
-
- string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
-
- string-width@5.1.2:
- resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
- engines: {node: '>=12'}
-
- string-width@6.1.0:
- resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==}
- engines: {node: '>=16'}
-
- string.prototype.matchall@4.0.12:
- resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
- engines: {node: '>= 0.4'}
-
- string.prototype.repeat@1.0.0:
- resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
-
- string.prototype.trim@1.2.11:
- resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==}
- engines: {node: '>= 0.4'}
-
- string.prototype.trimend@1.0.10:
- resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==}
- engines: {node: '>= 0.4'}
-
- string.prototype.trimstart@1.0.8:
- resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
- engines: {node: '>= 0.4'}
-
- string_decoder@1.3.0:
- resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
-
- stringify-entities@4.0.4:
- resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
-
- strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
-
- strip-ansi@7.2.0:
- resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
- engines: {node: '>=12'}
-
- strip-bom@3.0.0:
- resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
- engines: {node: '>=4'}
+ strip-literal@4.0.0:
+ resolution: {integrity: sha512-PaqAvfUZKBwc/SLmNZtHmzK+v19Z4O4eS3cKPeGvbIv/U3pnyEq4Tuw3/4v/FwfM8VQaEawsyCcOQ0P+kpwWWw==}
sucrase@3.35.1:
resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==}
engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
- supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
+ sugar-high@2.6.2:
+ resolution: {integrity: sha512-5mO9Zscg++wspkvgWwJ5YXY3fdkEAeIV/8C4YAjw5rbyYT+tvfyb3SDo3a3jGLpXOtXEpBXz5ymOLDB6j5dmDA==}
supports-color@9.4.0:
resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==}
engines: {node: '>=12'}
- supports-preserve-symlinks-flag@1.0.0:
- resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
- engines: {node: '>= 0.4'}
-
- synckit@0.11.13:
- resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==}
- engines: {node: ^14.18.0 || >=16.0.0}
-
- tailwind-csstree@0.3.3:
- resolution: {integrity: sha512-je9J5UYRsTJqAjYrIBMMlge8T/rreRd44pJxgG5Zx/zeo4kAC/liUKqzztRZrGlYRJLvIf2Cb1DVJMTXSzEShA==}
- engines: {node: '>=18.18'}
- peerDependencies:
- '@eslint/css': '>=1.0.0'
- peerDependenciesMeta:
- '@eslint/css':
- optional: true
-
tailwindcss@4.3.3:
resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==}
+ takumi-js@2.16.2:
+ resolution: {integrity: sha512-HzYqPb3DRQrnBPf4GIbmA8b2HDvK6pqv9qkzJ3hjdSpxDAqrGqHf3T9ryRyFwADxqsBT7AHNzdfyCe84M4zcMg==}
+ engines: {node: '>=20.19'}
+
tapable@2.3.3:
resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
engines: {node: '>=6'}
@@ -2623,6 +2113,10 @@ packages:
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'}
+ tinypool@2.2.0:
+ resolution: {integrity: sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==}
+ engines: {node: ^20.0.0 || >=22.0.0}
+
tinyrainbow@3.2.0:
resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==}
engines: {node: '>=14.0.0'}
@@ -2631,26 +2125,9 @@ packages:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
- trough@2.2.0:
- resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
-
- ts-api-utils@2.5.0:
- resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
- engines: {node: '>=18.12'}
- peerDependencies:
- typescript: '>=4.8.4'
-
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- tsconfig-paths-webpack-plugin@4.2.0:
- resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==}
- engines: {node: '>=10.13.0'}
-
- tsconfig-paths@4.2.0:
- resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
- engines: {node: '>=6'}
-
tsup@8.5.1:
resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==}
engines: {node: '>=18'}
@@ -2670,39 +2147,8 @@ packages:
typescript:
optional: true
- type-check@0.4.0:
- resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
- engines: {node: '>= 0.8.0'}
-
- type-fest@3.13.1:
- resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==}
- engines: {node: '>=14.16'}
-
- typed-array-buffer@1.0.3:
- resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
- engines: {node: '>= 0.4'}
-
- typed-array-byte-length@1.0.3:
- resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
- engines: {node: '>= 0.4'}
-
- typed-array-byte-offset@1.0.4:
- resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
- engines: {node: '>= 0.4'}
-
- typed-array-length@1.0.8:
- resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==}
- engines: {node: '>= 0.4'}
-
- typedarray@0.0.6:
- resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
-
- typescript-eslint@8.61.0:
- resolution: {integrity: sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
+ turbo-stream@3.2.1:
+ resolution: {integrity: sha512-BaX0eWz3IrypOVDFqPv3VGD6uZZW8y3oFAOJqZQ+oopmOyQ8/xNm7IMwAJFvxax2DBa8zSk+/AeqA6D6b1PXGg==}
typescript@7.0.2:
resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==}
@@ -2712,78 +2158,17 @@ packages:
ufo@1.6.3:
resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
- unbox-primitive@1.1.0:
- resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
- engines: {node: '>= 0.4'}
-
- undici-types@6.21.0:
- resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
-
undici-types@8.9.0:
resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==}
- unified-engine@11.2.2:
- resolution: {integrity: sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg==}
-
- unified@11.0.5:
- resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
-
- unist-util-inspect@8.1.0:
- resolution: {integrity: sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==}
-
- unist-util-is@6.0.1:
- resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
-
- unist-util-position-from-estree@2.0.0:
- resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
-
- unist-util-stringify-position@4.0.0:
- resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
-
- unist-util-visit-parents@6.0.2:
- resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
-
- unist-util-visit@5.1.0:
- resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
+ unenv@2.0.0-rc.24:
+ resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==}
- uri-js@4.4.1:
- resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ unstorage@2.0.0-alpha.10:
+ resolution: {integrity: sha512-6h1veZp8gnp4dGllf0tDijoXxDYymJu251IpKKkrSVH+QHL6tXFbwG85KM+CBHSgpkkgtPuIiZ9oLCLP5+1Evw==}
- util-deprecate@1.0.2:
- resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-
- valibot@1.4.1:
- resolution: {integrity: sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g==}
- peerDependencies:
- typescript: '>=5'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- validate-npm-package-license@3.0.4:
- resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
-
- validate-npm-package-name@5.0.1:
- resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- vfile-message@4.0.3:
- resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
-
- vfile-reporter@8.1.1:
- resolution: {integrity: sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==}
-
- vfile-sort@4.0.0:
- resolution: {integrity: sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==}
-
- vfile-statistics@3.0.0:
- resolution: {integrity: sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==}
-
- vfile@6.0.3:
- resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
-
- vite@8.3.4:
- resolution: {integrity: sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==}
+ vite@8.3.0:
+ resolution: {integrity: sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
@@ -2825,6 +2210,14 @@ packages:
yaml:
optional: true
+ vitefu@1.1.3:
+ resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
vitest@5.0.4:
resolution: {integrity: sha512-z0WxZRV2Sg48wF0FSgMq3TFG8JS38/Qr96vZVZdX6+Em9raQTvnXQvdTFJe2m3rfyJnEHeHQ/snceIdi8D1pVg==}
engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0}
@@ -2862,60 +2255,19 @@ packages:
'@vitest/ui':
optional: true
happy-dom:
- optional: true
- jsdom:
- optional: true
-
- walk-up-path@3.0.1:
- resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==}
-
- whatwg-mimetype@3.0.0:
- resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
- engines: {node: '>=12'}
-
- which-boxed-primitive@1.1.1:
- resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
- engines: {node: '>= 0.4'}
-
- which-builtin-type@1.2.1:
- resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
- engines: {node: '>= 0.4'}
-
- which-collection@1.0.2:
- resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
- engines: {node: '>= 0.4'}
-
- which-typed-array@1.1.22:
- resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==}
- engines: {node: '>= 0.4'}
-
- which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
+ optional: true
+ jsdom:
+ optional: true
- which@4.0.0:
- resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==}
- engines: {node: ^16.13.0 || >=18.0.0}
- hasBin: true
+ whatwg-mimetype@3.0.0:
+ resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+ engines: {node: '>=12'}
why-is-node-running@3.2.1:
resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==}
engines: {node: '>=20.11'}
hasBin: true
- word-wrap@1.2.5:
- resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
- engines: {node: '>=0.10.0'}
-
- wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
-
- wrap-ansi@8.1.0:
- resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
- engines: {node: '>=12'}
-
ws@8.21.3:
resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==}
engines: {node: '>=10.0.0'}
@@ -2936,21 +2288,8 @@ packages:
engines: {node: '>= 14.6'}
hasBin: true
- yocto-queue@0.1.0:
- resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
- engines: {node: '>=10'}
-
- zwitch@2.0.4:
- resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
-
snapshots:
- '@babel/code-frame@7.29.7':
- dependencies:
- '@babel/helper-validator-identifier': 7.29.7
- js-tokens: 4.0.0
- picocolors: 1.1.1
-
'@babel/helper-string-parser@7.29.7': {}
'@babel/helper-validator-identifier@7.29.7': {}
@@ -2966,18 +2305,6 @@ snapshots:
'@bcoe/v8-coverage@1.0.2': {}
- '@cacheable/memory@2.2.0':
- dependencies:
- '@cacheable/utils': 2.5.0
- '@keyv/bigmap': 1.3.1(keyv@5.6.0)
- hookified: 1.15.1
- keyv: 5.6.0
-
- '@cacheable/utils@2.5.0':
- dependencies:
- hashery: 1.5.1
- keyv: 5.6.0
-
'@esbuild/aix-ppc64@0.27.3':
optional: true
@@ -3048,1493 +2375,805 @@ snapshots:
optional: true
'@esbuild/win32-arm64@0.27.3':
- optional: true
-
- '@esbuild/win32-ia32@0.27.3':
- optional: true
-
- '@esbuild/win32-x64@0.27.3':
- optional: true
-
- '@eslint-community/eslint-utils@4.10.1(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))':
- dependencies:
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- eslint-visitor-keys: 3.4.3
-
- '@eslint-community/eslint-utils@4.9.1(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))':
- dependencies:
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- eslint-visitor-keys: 3.4.3
-
- '@eslint-community/regexpp@4.12.2': {}
-
- '@eslint/config-array@0.23.5(supports-color@9.4.0)':
- dependencies:
- '@eslint/object-schema': 3.0.5
- debug: 4.4.3(supports-color@9.4.0)
- minimatch: 10.2.6
- transitivePeerDependencies:
- - supports-color
-
- '@eslint/config-helpers@0.7.0':
- dependencies:
- '@eslint/core': 1.2.1
-
- '@eslint/core@1.2.1':
- dependencies:
- '@types/json-schema': 7.0.15
-
- '@eslint/css-tree@4.0.4':
- dependencies:
- mdn-data: 2.28.1
- source-map-js: 1.2.1
-
- '@eslint/js@10.0.1(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))':
- optionalDependencies:
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
-
- '@eslint/object-schema@3.0.5': {}
-
- '@eslint/plugin-kit@0.7.3':
- dependencies:
- '@eslint/core': 1.2.1
- levn: 0.4.1
-
- '@humanfs/core@0.19.2':
- dependencies:
- '@humanfs/types': 0.15.0
-
- '@humanfs/node@0.16.8':
- dependencies:
- '@humanfs/core': 0.19.2
- '@humanfs/types': 0.15.0
- '@humanwhocodes/retry': 0.4.3
-
- '@humanfs/types@0.15.0': {}
-
- '@humanwhocodes/module-importer@1.0.1': {}
-
- '@humanwhocodes/retry@0.4.3': {}
-
- '@isaacs/cliui@8.0.2':
- dependencies:
- string-width: 5.1.2
- string-width-cjs: string-width@4.2.3
- strip-ansi: 7.2.0
- strip-ansi-cjs: strip-ansi@6.0.1
- wrap-ansi: 8.1.0
- wrap-ansi-cjs: wrap-ansi@7.0.0
-
- '@jridgewell/gen-mapping@0.3.13':
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
- '@jridgewell/trace-mapping': 0.3.31
-
- '@jridgewell/resolve-uri@3.1.2': {}
-
- '@jridgewell/sourcemap-codec@1.5.5': {}
-
- '@jridgewell/sourcemap-codec@1.6.0': {}
-
- '@jridgewell/trace-mapping@0.3.31':
- dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.6.0
-
- '@keyv/bigmap@1.3.1(keyv@5.6.0)':
- dependencies:
- hashery: 1.5.1
- hookified: 1.15.1
- keyv: 5.6.0
-
- '@keyv/serialize@1.1.1': {}
-
- '@npmcli/config@8.3.4':
- dependencies:
- '@npmcli/map-workspaces': 3.0.6
- '@npmcli/package-json': 5.2.1
- ci-info: 4.4.0
- ini: 4.1.3
- nopt: 7.2.1
- proc-log: 4.2.0
- semver: 7.8.4
- walk-up-path: 3.0.1
- transitivePeerDependencies:
- - bluebird
-
- '@npmcli/git@5.0.8':
- dependencies:
- '@npmcli/promise-spawn': 7.0.2
- ini: 4.1.3
- lru-cache: 10.4.3
- npm-pick-manifest: 9.1.0
- proc-log: 4.2.0
- promise-inflight: 1.0.1
- promise-retry: 2.0.1
- semver: 7.8.4
- which: 4.0.0
- transitivePeerDependencies:
- - bluebird
-
- '@npmcli/map-workspaces@3.0.6':
- dependencies:
- '@npmcli/name-from-folder': 2.0.0
- glob: 10.5.0
- minimatch: 9.0.9
- read-package-json-fast: 3.0.2
-
- '@npmcli/name-from-folder@2.0.0': {}
-
- '@npmcli/package-json@5.2.1':
- dependencies:
- '@npmcli/git': 5.0.8
- glob: 10.5.0
- hosted-git-info: 7.0.2
- json-parse-even-better-errors: 3.0.2
- normalize-package-data: 6.0.2
- proc-log: 4.2.0
- semver: 7.8.4
- transitivePeerDependencies:
- - bluebird
-
- '@npmcli/promise-spawn@7.0.2':
- dependencies:
- which: 4.0.0
-
- '@oxc-project/types@0.153.0': {}
-
- '@pkgjs/parseargs@0.11.0':
- optional: true
-
- '@pkgr/core@0.3.6': {}
-
- '@playwright/test@1.64.0':
- dependencies:
- playwright: 1.64.0
-
- '@rolldown/binding-android-arm-eabi@1.2.13':
- optional: true
-
- '@rolldown/binding-android-arm64@1.2.13':
- optional: true
-
- '@rolldown/binding-darwin-arm64@1.2.13':
- optional: true
-
- '@rolldown/binding-darwin-x64@1.2.13':
- optional: true
-
- '@rolldown/binding-freebsd-x64@1.2.13':
- optional: true
-
- '@rolldown/binding-linux-arm-gnueabihf@1.2.13':
- optional: true
-
- '@rolldown/binding-linux-arm64-gnu@1.2.13':
- optional: true
-
- '@rolldown/binding-linux-arm64-musl@1.2.13':
- optional: true
-
- '@rolldown/binding-linux-ppc64-gnu@1.2.13':
- optional: true
-
- '@rolldown/binding-linux-s390x-gnu@1.2.13':
- optional: true
-
- '@rolldown/binding-linux-x64-gnu@1.2.13':
- optional: true
-
- '@rolldown/binding-linux-x64-musl@1.2.13':
- optional: true
-
- '@rolldown/binding-openharmony-arm64@1.2.13':
- optional: true
-
- '@rolldown/binding-win32-arm64-msvc@1.2.13':
- optional: true
-
- '@rolldown/binding-win32-x64-msvc@1.2.13':
- optional: true
-
- '@rolldown/pluginutils@1.0.1': {}
-
- '@rollup/rollup-android-arm-eabi@4.59.0':
- optional: true
-
- '@rollup/rollup-android-arm64@4.59.0':
- optional: true
-
- '@rollup/rollup-darwin-arm64@4.59.0':
- optional: true
-
- '@rollup/rollup-darwin-x64@4.59.0':
- optional: true
-
- '@rollup/rollup-freebsd-arm64@4.59.0':
- optional: true
-
- '@rollup/rollup-freebsd-x64@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-arm-musleabihf@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-arm64-gnu@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-arm64-musl@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-loong64-gnu@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-loong64-musl@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-ppc64-gnu@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-ppc64-musl@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-riscv64-gnu@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-riscv64-musl@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-s390x-gnu@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-x64-gnu@4.59.0':
- optional: true
-
- '@rollup/rollup-linux-x64-musl@4.59.0':
- optional: true
-
- '@rollup/rollup-openbsd-x64@4.59.0':
- optional: true
-
- '@rollup/rollup-openharmony-arm64@4.59.0':
- optional: true
-
- '@rollup/rollup-win32-arm64-msvc@4.59.0':
- optional: true
-
- '@rollup/rollup-win32-ia32-msvc@4.59.0':
- optional: true
-
- '@rollup/rollup-win32-x64-gnu@4.59.0':
- optional: true
-
- '@rollup/rollup-win32-x64-msvc@4.59.0':
- optional: true
-
- '@switz/eslint-config@13.1.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(tailwindcss@4.3.3)(typescript@7.0.2)':
- dependencies:
- '@eslint/js': 10.0.1(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))
- '@typescript-eslint/parser': 8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- eslint-config-prettier: 10.1.8(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))
- eslint-plugin-better-tailwindcss: 4.5.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(tailwindcss@4.3.3)(typescript@7.0.2)
- eslint-plugin-mdx: 3.8.1(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)
- eslint-plugin-prettier: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0)))(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(prettier@3.8.3)
- eslint-plugin-react: 7.37.5(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))
- globals: 17.6.0
- prettier: 3.8.3
- typescript-eslint: 8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)
- transitivePeerDependencies:
- - '@eslint/css'
- - '@types/eslint'
- - bluebird
- - oxlint
- - remark-lint-file-extension
- - supports-color
- - tailwindcss
- - typescript
-
- '@types/chai@5.2.3':
- dependencies:
- '@types/deep-eql': 4.0.2
- assertion-error: 2.0.1
-
- '@types/concat-stream@2.0.3':
- dependencies:
- '@types/node': 22.19.20
-
- '@types/debug@4.1.13':
- dependencies:
- '@types/ms': 2.1.0
-
- '@types/deep-eql@4.0.2': {}
-
- '@types/esrecurse@4.3.1': {}
-
- '@types/estree-jsx@1.0.5':
- dependencies:
- '@types/estree': 1.0.9
-
- '@types/estree@1.0.8': {}
-
- '@types/estree@1.0.9': {}
-
- '@types/hast@3.0.4':
- dependencies:
- '@types/unist': 3.0.3
-
- '@types/is-empty@1.2.3': {}
-
- '@types/json-schema@7.0.15': {}
-
- '@types/mdast@4.0.4':
- dependencies:
- '@types/unist': 3.0.3
-
- '@types/ms@2.1.0': {}
+ optional: true
- '@types/node@22.19.20':
- dependencies:
- undici-types: 6.21.0
+ '@esbuild/win32-ia32@0.27.3':
+ optional: true
- '@types/node@26.6.2':
- dependencies:
- undici-types: 8.9.0
+ '@esbuild/win32-x64@0.27.3':
+ optional: true
- '@types/react-dom@19.3.0(@types/react@19.3.0)':
+ '@jridgewell/gen-mapping@0.3.13':
dependencies:
- '@types/react': 19.3.0
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
- '@types/react@19.3.0':
+ '@jridgewell/remapping@2.3.5':
dependencies:
- csstype: 3.2.3
-
- '@types/supports-color@8.1.3': {}
-
- '@types/unist@2.0.11': {}
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
- '@types/unist@3.0.3': {}
+ '@jridgewell/resolve-uri@3.1.2': {}
- '@types/whatwg-mimetype@3.0.2': {}
+ '@jridgewell/sourcemap-codec@1.5.5': {}
- '@types/ws@8.18.1':
- dependencies:
- '@types/node': 26.6.2
+ '@jridgewell/sourcemap-codec@1.6.0': {}
- '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2))(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)':
+ '@jridgewell/trace-mapping@0.3.31':
dependencies:
- '@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)
- '@typescript-eslint/scope-manager': 8.61.0
- '@typescript-eslint/type-utils': 8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)
- '@typescript-eslint/utils': 8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)
- '@typescript-eslint/visitor-keys': 8.61.0
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- ignore: 7.0.5
- natural-compare: 1.4.0
- ts-api-utils: 2.5.0(typescript@7.0.2)
- typescript: 7.0.2
- transitivePeerDependencies:
- - supports-color
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.6.0
- '@typescript-eslint/parser@8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)':
- dependencies:
- '@typescript-eslint/scope-manager': 8.61.0
- '@typescript-eslint/types': 8.61.0
- '@typescript-eslint/typescript-estree': 8.61.0(supports-color@9.4.0)(typescript@7.0.2)
- '@typescript-eslint/visitor-keys': 8.61.0
- debug: 4.4.3(supports-color@9.4.0)
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- typescript: 7.0.2
- transitivePeerDependencies:
- - supports-color
+ '@opentelemetry/api@1.9.1': {}
- '@typescript-eslint/project-service@8.61.0(supports-color@9.4.0)(typescript@7.0.2)':
+ '@opentelemetry/context-async-hooks@2.12.0(@opentelemetry/api@1.9.1)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@7.0.2)
- '@typescript-eslint/types': 8.61.0
- debug: 4.4.3(supports-color@9.4.0)
- typescript: 7.0.2
- transitivePeerDependencies:
- - supports-color
+ '@opentelemetry/api': 1.9.1
- '@typescript-eslint/scope-manager@8.61.0':
+ '@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1)':
dependencies:
- '@typescript-eslint/types': 8.61.0
- '@typescript-eslint/visitor-keys': 8.61.0
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/semantic-conventions': 1.43.0
- '@typescript-eslint/tsconfig-utils@8.61.0(typescript@7.0.2)':
+ '@opentelemetry/resources@2.12.0(@opentelemetry/api@1.9.1)':
dependencies:
- typescript: 7.0.2
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/semantic-conventions': 1.43.0
- '@typescript-eslint/type-utils@8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)':
+ '@opentelemetry/sdk-trace-base@2.12.0(@opentelemetry/api@1.9.1)':
dependencies:
- '@typescript-eslint/types': 8.61.0
- '@typescript-eslint/typescript-estree': 8.61.0(supports-color@9.4.0)(typescript@7.0.2)
- '@typescript-eslint/utils': 8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)
- debug: 4.4.3(supports-color@9.4.0)
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- ts-api-utils: 2.5.0(typescript@7.0.2)
- typescript: 7.0.2
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/types@8.61.0': {}
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/sdk-trace': 2.12.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/semantic-conventions': 1.43.0
- '@typescript-eslint/typescript-estree@8.61.0(supports-color@9.4.0)(typescript@7.0.2)':
+ '@opentelemetry/sdk-trace@2.12.0(@opentelemetry/api@1.9.1)':
dependencies:
- '@typescript-eslint/project-service': 8.61.0(supports-color@9.4.0)(typescript@7.0.2)
- '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@7.0.2)
- '@typescript-eslint/types': 8.61.0
- '@typescript-eslint/visitor-keys': 8.61.0
- debug: 4.4.3(supports-color@9.4.0)
- minimatch: 10.2.5
- semver: 7.8.4
- tinyglobby: 0.2.17
- ts-api-utils: 2.5.0(typescript@7.0.2)
- typescript: 7.0.2
- transitivePeerDependencies:
- - supports-color
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/semantic-conventions': 1.43.0
- '@typescript-eslint/utils@8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)':
- dependencies:
- '@eslint-community/eslint-utils': 4.9.1(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))
- '@typescript-eslint/scope-manager': 8.61.0
- '@typescript-eslint/types': 8.61.0
- '@typescript-eslint/typescript-estree': 8.61.0(supports-color@9.4.0)(typescript@7.0.2)
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- typescript: 7.0.2
- transitivePeerDependencies:
- - supports-color
+ '@opentelemetry/semantic-conventions@1.43.0': {}
- '@typescript-eslint/visitor-keys@8.61.0':
- dependencies:
- '@typescript-eslint/types': 8.61.0
- eslint-visitor-keys: 5.0.1
+ '@oxc-project/types@0.153.0': {}
- '@typescript/typescript-aix-ppc64@7.0.2':
+ '@oxc-transform-react/binding-android-arm-eabi@0.153.0':
optional: true
- '@typescript/typescript-darwin-arm64@7.0.2':
+ '@oxc-transform-react/binding-android-arm64@0.153.0':
optional: true
- '@typescript/typescript-darwin-x64@7.0.2':
+ '@oxc-transform-react/binding-darwin-arm64@0.153.0':
optional: true
- '@typescript/typescript-freebsd-arm64@7.0.2':
+ '@oxc-transform-react/binding-darwin-x64@0.153.0':
optional: true
- '@typescript/typescript-freebsd-x64@7.0.2':
+ '@oxc-transform-react/binding-freebsd-x64@0.153.0':
optional: true
- '@typescript/typescript-linux-arm64@7.0.2':
+ '@oxc-transform-react/binding-linux-arm-gnueabihf@0.153.0':
optional: true
- '@typescript/typescript-linux-arm@7.0.2':
+ '@oxc-transform-react/binding-linux-arm-musleabihf@0.153.0':
optional: true
- '@typescript/typescript-linux-loong64@7.0.2':
+ '@oxc-transform-react/binding-linux-arm64-gnu@0.153.0':
optional: true
- '@typescript/typescript-linux-mips64el@7.0.2':
+ '@oxc-transform-react/binding-linux-arm64-musl@0.153.0':
optional: true
- '@typescript/typescript-linux-ppc64@7.0.2':
+ '@oxc-transform-react/binding-linux-ppc64-gnu@0.153.0':
optional: true
- '@typescript/typescript-linux-riscv64@7.0.2':
+ '@oxc-transform-react/binding-linux-riscv64-gnu@0.153.0':
optional: true
- '@typescript/typescript-linux-s390x@7.0.2':
+ '@oxc-transform-react/binding-linux-riscv64-musl@0.153.0':
optional: true
- '@typescript/typescript-linux-x64@7.0.2':
+ '@oxc-transform-react/binding-linux-s390x-gnu@0.153.0':
optional: true
- '@typescript/typescript-netbsd-arm64@7.0.2':
+ '@oxc-transform-react/binding-linux-x64-gnu@0.153.0':
optional: true
- '@typescript/typescript-netbsd-x64@7.0.2':
+ '@oxc-transform-react/binding-linux-x64-musl@0.153.0':
optional: true
- '@typescript/typescript-openbsd-arm64@7.0.2':
+ '@oxc-transform-react/binding-openharmony-arm64@0.153.0':
optional: true
- '@typescript/typescript-openbsd-x64@7.0.2':
+ '@oxc-transform-react/binding-win32-arm64-msvc@0.153.0':
optional: true
- '@typescript/typescript-sunos-x64@7.0.2':
+ '@oxc-transform-react/binding-win32-ia32-msvc@0.153.0':
optional: true
- '@typescript/typescript-win32-arm64@7.0.2':
+ '@oxc-transform-react/binding-win32-x64-msvc@0.153.0':
optional: true
- '@typescript/typescript-win32-x64@7.0.2':
+ '@oxfmt/binding-android-arm-eabi@0.73.0':
optional: true
- '@valibot/to-json-schema@1.7.1(valibot@1.4.1(typescript@7.0.2))':
- dependencies:
- valibot: 1.4.1(typescript@7.0.2)
-
- '@vitejs/plugin-react@6.1.2(vite@8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))':
- dependencies:
- '@rolldown/pluginutils': 1.0.1
- vite: 8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
-
- '@vitest/coverage-v8@5.0.4(vitest@5.0.4)':
- dependencies:
- '@bcoe/v8-coverage': 1.0.2
- '@vitest/istanbul-lib-coverage': 1.0.2
- '@vitest/istanbul-lib-report': 1.0.2
- ast-v8-to-istanbul: 1.0.7
- magicast: 0.5.5
- obug: 3.0.0
- std-env: 4.3.0
- tinyrainbow: 3.2.0
- vitest: 5.0.4(@types/node@26.6.2)(@vitest/coverage-v8@5.0.4)(happy-dom@21.0.1)(vite@8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
-
- '@vitest/istanbul-lib-coverage@1.0.2': {}
-
- '@vitest/istanbul-lib-report@1.0.2':
- dependencies:
- '@vitest/istanbul-lib-coverage': 1.0.2
-
- '@vitest/mocker@5.0.4(vite@8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))':
- dependencies:
- '@jridgewell/trace-mapping': 0.3.31
- '@vitest/spy': 5.0.4
- estree-walker: 3.0.3
- magic-string: 1.4.3
- optionalDependencies:
- vite: 8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
+ '@oxfmt/binding-android-arm64@0.73.0':
+ optional: true
- '@vitest/spy@5.0.4': {}
+ '@oxfmt/binding-darwin-arm64@0.73.0':
+ optional: true
- abbrev@2.0.0: {}
+ '@oxfmt/binding-darwin-x64@0.73.0':
+ optional: true
- acorn-jsx@5.3.2(acorn@8.16.0):
- dependencies:
- acorn: 8.16.0
+ '@oxfmt/binding-freebsd-x64@0.73.0':
+ optional: true
- acorn@8.16.0: {}
+ '@oxfmt/binding-linux-arm-gnueabihf@0.73.0':
+ optional: true
- 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
+ '@oxfmt/binding-linux-arm-musleabihf@0.73.0':
+ optional: true
- ansi-regex@5.0.1: {}
+ '@oxfmt/binding-linux-arm64-gnu@0.73.0':
+ optional: true
- ansi-regex@6.2.2: {}
+ '@oxfmt/binding-linux-arm64-musl@0.73.0':
+ optional: true
- ansi-styles@4.3.0:
- dependencies:
- color-convert: 2.0.1
+ '@oxfmt/binding-linux-ppc64-gnu@0.73.0':
+ optional: true
- ansi-styles@6.2.3: {}
+ '@oxfmt/binding-linux-riscv64-gnu@0.73.0':
+ optional: true
- any-promise@1.3.0: {}
+ '@oxfmt/binding-linux-riscv64-musl@0.73.0':
+ optional: true
- array-buffer-byte-length@1.0.2:
- dependencies:
- call-bound: 1.0.4
- is-array-buffer: 3.0.5
+ '@oxfmt/binding-linux-s390x-gnu@0.73.0':
+ optional: true
- array-includes@3.1.9:
- dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-object-atoms: 1.1.2
- get-intrinsic: 1.3.0
- is-string: 1.1.1
- math-intrinsics: 1.1.0
-
- array.prototype.findlast@1.2.5:
- dependencies:
- call-bind: 1.0.9
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-errors: 1.3.0
- es-object-atoms: 1.1.2
- es-shim-unscopables: 1.1.0
-
- array.prototype.flat@1.3.3:
- dependencies:
- call-bind: 1.0.9
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-shim-unscopables: 1.1.0
+ '@oxfmt/binding-linux-x64-gnu@0.73.0':
+ optional: true
- array.prototype.flatmap@1.3.3:
- dependencies:
- call-bind: 1.0.9
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-shim-unscopables: 1.1.0
+ '@oxfmt/binding-linux-x64-musl@0.73.0':
+ optional: true
- array.prototype.tosorted@1.1.4:
- dependencies:
- call-bind: 1.0.9
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-errors: 1.3.0
- es-shim-unscopables: 1.1.0
+ '@oxfmt/binding-openharmony-arm64@0.73.0':
+ optional: true
- arraybuffer.prototype.slice@1.0.4:
- dependencies:
- array-buffer-byte-length: 1.0.2
- call-bind: 1.0.9
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- is-array-buffer: 3.0.5
+ '@oxfmt/binding-win32-arm64-msvc@0.73.0':
+ optional: true
- assertion-error@2.0.1: {}
+ '@oxfmt/binding-win32-ia32-msvc@0.73.0':
+ optional: true
- ast-v8-to-istanbul@1.0.7:
- dependencies:
- '@jridgewell/trace-mapping': 0.3.31
- estree-walker: 3.0.3
- js-tokens: 10.0.0
+ '@oxfmt/binding-win32-x64-msvc@0.73.0':
+ optional: true
- async-function@1.0.0: {}
+ '@oxlint/binding-android-arm-eabi@1.88.0':
+ optional: true
- available-typed-arrays@1.0.7:
- dependencies:
- possible-typed-array-names: 1.1.0
+ '@oxlint/binding-android-arm64@1.88.0':
+ optional: true
- bail@2.0.2: {}
+ '@oxlint/binding-darwin-arm64@1.88.0':
+ optional: true
- balanced-match@1.0.2: {}
+ '@oxlint/binding-darwin-x64@1.88.0':
+ optional: true
- balanced-match@4.0.4: {}
+ '@oxlint/binding-freebsd-x64@1.88.0':
+ optional: true
- brace-expansion@1.1.15:
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
+ '@oxlint/binding-linux-arm-gnueabihf@1.88.0':
+ optional: true
- brace-expansion@2.1.7:
- dependencies:
- balanced-match: 1.0.2
+ '@oxlint/binding-linux-arm-musleabihf@1.88.0':
+ optional: true
- brace-expansion@5.0.12:
- dependencies:
- balanced-match: 4.0.4
+ '@oxlint/binding-linux-arm64-gnu@1.88.0':
+ optional: true
- brace-expansion@5.0.6:
- dependencies:
- balanced-match: 4.0.4
+ '@oxlint/binding-linux-arm64-musl@1.88.0':
+ optional: true
- buffer-from@1.1.2: {}
+ '@oxlint/binding-linux-ppc64-gnu@1.88.0':
+ optional: true
- buffer-image-size@0.6.4:
- dependencies:
- '@types/node': 26.6.2
+ '@oxlint/binding-linux-riscv64-gnu@1.88.0':
+ optional: true
- bundle-require@5.1.0(esbuild@0.27.3):
- dependencies:
- esbuild: 0.27.3
- load-tsconfig: 0.2.5
+ '@oxlint/binding-linux-riscv64-musl@1.88.0':
+ optional: true
- cac@6.7.14: {}
+ '@oxlint/binding-linux-s390x-gnu@1.88.0':
+ optional: true
- cacheable@2.5.0:
- dependencies:
- '@cacheable/memory': 2.2.0
- '@cacheable/utils': 2.5.0
- hookified: 1.15.1
- keyv: 5.6.0
- qified: 0.10.1
+ '@oxlint/binding-linux-x64-gnu@1.88.0':
+ optional: true
- call-bind-apply-helpers@1.0.2:
- dependencies:
- es-errors: 1.3.0
- function-bind: 1.1.2
+ '@oxlint/binding-linux-x64-musl@1.88.0':
+ optional: true
- call-bind@1.0.9:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-define-property: 1.0.1
- get-intrinsic: 1.3.0
- set-function-length: 1.2.2
+ '@oxlint/binding-openharmony-arm64@1.88.0':
+ optional: true
- call-bound@1.0.4:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- get-intrinsic: 1.3.0
+ '@oxlint/binding-win32-arm64-msvc@1.88.0':
+ optional: true
- ccount@2.0.1: {}
+ '@oxlint/binding-win32-ia32-msvc@1.88.0':
+ optional: true
- chai@6.3.0: {}
+ '@oxlint/binding-win32-x64-msvc@1.88.0':
+ optional: true
- chalk@4.1.2:
+ '@playwright/test@1.64.0':
dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
- character-entities-html4@2.1.0: {}
-
- character-entities-legacy@3.0.0: {}
-
- character-entities@2.0.2: {}
+ playwright: 1.64.0
- character-reference-invalid@2.0.1: {}
+ '@rolldown/binding-android-arm-eabi@1.2.13':
+ optional: true
- chokidar@4.0.3:
- dependencies:
- readdirp: 4.1.2
+ '@rolldown/binding-android-arm64@1.2.13':
+ optional: true
- ci-info@4.4.0: {}
+ '@rolldown/binding-darwin-arm64@1.2.13':
+ optional: true
- color-convert@2.0.1:
- dependencies:
- color-name: 1.1.4
+ '@rolldown/binding-darwin-x64@1.2.13':
+ optional: true
- color-name@1.1.4: {}
+ '@rolldown/binding-freebsd-x64@1.2.13':
+ optional: true
- commander@4.1.1: {}
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.13':
+ optional: true
- concat-map@0.0.1: {}
+ '@rolldown/binding-linux-arm64-gnu@1.2.13':
+ optional: true
- concat-stream@2.0.0:
- dependencies:
- buffer-from: 1.1.2
- inherits: 2.0.4
- readable-stream: 3.6.2
- typedarray: 0.0.6
+ '@rolldown/binding-linux-arm64-musl@1.2.13':
+ optional: true
- confbox@0.1.8: {}
+ '@rolldown/binding-linux-ppc64-gnu@1.2.13':
+ optional: true
- consola@3.4.2: {}
+ '@rolldown/binding-linux-s390x-gnu@1.2.13':
+ optional: true
- cross-spawn@7.0.6:
- dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
+ '@rolldown/binding-linux-x64-gnu@1.2.13':
+ optional: true
- csstype@3.2.3: {}
+ '@rolldown/binding-linux-x64-musl@1.2.13':
+ optional: true
- data-view-buffer@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-data-view: 1.0.2
+ '@rolldown/binding-openharmony-arm64@1.2.13':
+ optional: true
- data-view-byte-length@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-data-view: 1.0.2
+ '@rolldown/binding-win32-arm64-msvc@1.2.13':
+ optional: true
- data-view-byte-offset@1.0.1:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-data-view: 1.0.2
+ '@rolldown/binding-win32-x64-msvc@1.2.13':
+ optional: true
- debug@4.4.3(supports-color@9.4.0):
- dependencies:
- ms: 2.1.3
- optionalDependencies:
- supports-color: 9.4.0
+ '@rolldown/pluginutils@1.0.1': {}
- decode-named-character-reference@1.3.0:
- dependencies:
- character-entities: 2.0.2
+ '@rollup/rollup-android-arm-eabi@4.59.0':
+ optional: true
- deep-is@0.1.4: {}
+ '@rollup/rollup-android-arm64@4.59.0':
+ optional: true
- define-data-property@1.1.4:
- dependencies:
- es-define-property: 1.0.1
- es-errors: 1.3.0
- gopd: 1.2.0
+ '@rollup/rollup-darwin-arm64@4.59.0':
+ optional: true
- define-properties@1.2.1:
- dependencies:
- define-data-property: 1.1.4
- has-property-descriptors: 1.0.2
- object-keys: 1.1.1
+ '@rollup/rollup-darwin-x64@4.59.0':
+ optional: true
- dequal@2.0.3: {}
+ '@rollup/rollup-freebsd-arm64@4.59.0':
+ optional: true
- detect-libc@2.1.2: {}
+ '@rollup/rollup-freebsd-x64@4.59.0':
+ optional: true
- devlop@1.1.0:
- dependencies:
- dequal: 2.0.3
+ '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+ optional: true
- doctrine@2.1.0:
- dependencies:
- esutils: 2.0.3
+ '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+ optional: true
- dunder-proto@1.0.1:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-errors: 1.3.0
- gopd: 1.2.0
+ '@rollup/rollup-linux-arm64-gnu@4.59.0':
+ optional: true
- eastasianwidth@0.2.0: {}
+ '@rollup/rollup-linux-arm64-musl@4.59.0':
+ optional: true
- emoji-regex@10.6.0: {}
+ '@rollup/rollup-linux-loong64-gnu@4.59.0':
+ optional: true
- emoji-regex@8.0.0: {}
+ '@rollup/rollup-linux-loong64-musl@4.59.0':
+ optional: true
- emoji-regex@9.2.2: {}
+ '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+ optional: true
- enhanced-resolve@5.23.0:
- dependencies:
- graceful-fs: 4.2.11
- tapable: 2.3.3
+ '@rollup/rollup-linux-ppc64-musl@4.59.0':
+ optional: true
- entities@7.0.1: {}
+ '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+ optional: true
- err-code@2.0.3: {}
+ '@rollup/rollup-linux-riscv64-musl@4.59.0':
+ optional: true
- error-ex@1.3.4:
- dependencies:
- is-arrayish: 0.2.1
+ '@rollup/rollup-linux-s390x-gnu@4.59.0':
+ optional: true
- es-abstract@1.24.2:
- dependencies:
- array-buffer-byte-length: 1.0.2
- arraybuffer.prototype.slice: 1.0.4
- available-typed-arrays: 1.0.7
- call-bind: 1.0.9
- call-bound: 1.0.4
- data-view-buffer: 1.0.2
- data-view-byte-length: 1.0.2
- data-view-byte-offset: 1.0.1
- es-define-property: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.2
- es-set-tostringtag: 2.1.0
- es-to-primitive: 1.3.0
- function.prototype.name: 1.1.8
- get-intrinsic: 1.3.0
- get-proto: 1.0.1
- get-symbol-description: 1.1.0
- globalthis: 1.0.4
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
- has-proto: 1.2.0
- has-symbols: 1.1.0
- hasown: 2.0.4
- internal-slot: 1.1.0
- is-array-buffer: 3.0.5
- is-callable: 1.2.7
- is-data-view: 1.0.2
- is-negative-zero: 2.0.3
- is-regex: 1.2.1
- is-set: 2.0.3
- is-shared-array-buffer: 1.0.4
- is-string: 1.1.1
- is-typed-array: 1.1.15
- is-weakref: 1.1.1
- math-intrinsics: 1.1.0
- object-inspect: 1.13.4
- object-keys: 1.1.1
- object.assign: 4.1.7
- own-keys: 1.0.1
- regexp.prototype.flags: 1.5.4
- safe-array-concat: 1.1.4
- safe-push-apply: 1.0.0
- safe-regex-test: 1.1.0
- set-proto: 1.0.0
- stop-iteration-iterator: 1.1.0
- string.prototype.trim: 1.2.11
- string.prototype.trimend: 1.0.10
- string.prototype.trimstart: 1.0.8
- typed-array-buffer: 1.0.3
- typed-array-byte-length: 1.0.3
- typed-array-byte-offset: 1.0.4
- typed-array-length: 1.0.8
- unbox-primitive: 1.1.0
- which-typed-array: 1.1.22
-
- es-define-property@1.0.1: {}
-
- es-errors@1.3.0: {}
-
- es-iterator-helpers@1.3.3:
- dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-errors: 1.3.0
- es-set-tostringtag: 2.1.0
- function-bind: 1.1.2
- get-intrinsic: 1.3.0
- globalthis: 1.0.4
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
- has-proto: 1.2.0
- has-symbols: 1.1.0
- internal-slot: 1.1.0
- iterator.prototype: 1.1.5
- math-intrinsics: 1.1.0
+ '@rollup/rollup-linux-x64-gnu@4.59.0':
+ optional: true
- es-module-lexer@2.3.2: {}
+ '@rollup/rollup-linux-x64-musl@4.59.0':
+ optional: true
- es-object-atoms@1.1.2:
- dependencies:
- es-errors: 1.3.0
+ '@rollup/rollup-openbsd-x64@4.59.0':
+ optional: true
- es-set-tostringtag@2.1.0:
- dependencies:
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- has-tostringtag: 1.0.2
- hasown: 2.0.4
+ '@rollup/rollup-openharmony-arm64@4.59.0':
+ optional: true
- es-shim-unscopables@1.1.0:
- dependencies:
- hasown: 2.0.4
+ '@rollup/rollup-win32-arm64-msvc@4.59.0':
+ optional: true
- es-to-primitive@1.3.0:
- dependencies:
- is-callable: 1.2.7
- is-date-object: 1.1.0
- is-symbol: 1.1.1
+ '@rollup/rollup-win32-ia32-msvc@4.59.0':
+ optional: true
- esbuild@0.27.3:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.27.3
- '@esbuild/android-arm': 0.27.3
- '@esbuild/android-arm64': 0.27.3
- '@esbuild/android-x64': 0.27.3
- '@esbuild/darwin-arm64': 0.27.3
- '@esbuild/darwin-x64': 0.27.3
- '@esbuild/freebsd-arm64': 0.27.3
- '@esbuild/freebsd-x64': 0.27.3
- '@esbuild/linux-arm': 0.27.3
- '@esbuild/linux-arm64': 0.27.3
- '@esbuild/linux-ia32': 0.27.3
- '@esbuild/linux-loong64': 0.27.3
- '@esbuild/linux-mips64el': 0.27.3
- '@esbuild/linux-ppc64': 0.27.3
- '@esbuild/linux-riscv64': 0.27.3
- '@esbuild/linux-s390x': 0.27.3
- '@esbuild/linux-x64': 0.27.3
- '@esbuild/netbsd-arm64': 0.27.3
- '@esbuild/netbsd-x64': 0.27.3
- '@esbuild/openbsd-arm64': 0.27.3
- '@esbuild/openbsd-x64': 0.27.3
- '@esbuild/openharmony-arm64': 0.27.3
- '@esbuild/sunos-x64': 0.27.3
- '@esbuild/win32-arm64': 0.27.3
- '@esbuild/win32-ia32': 0.27.3
- '@esbuild/win32-x64': 0.27.3
+ '@rollup/rollup-win32-x64-gnu@4.59.0':
+ optional: true
- escape-string-regexp@4.0.0: {}
+ '@rollup/rollup-win32-x64-msvc@4.59.0':
+ optional: true
- eslint-config-prettier@10.1.8(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0)):
- dependencies:
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
+ '@standard-schema/spec@1.1.0': {}
- eslint-mdx@3.8.1(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0):
+ '@switz/lint-config@14.0.0(oxfmt@0.73.0)(oxlint@1.88.0)':
dependencies:
- acorn: 8.16.0
- acorn-jsx: 5.3.2(acorn@8.16.0)
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- espree: 11.2.0
- estree-util-visit: 2.0.0
- remark-mdx: 3.1.1(supports-color@9.4.0)
- remark-parse: 11.0.0(supports-color@9.4.0)
- remark-stringify: 11.0.0
- synckit: 0.11.13
- unified: 11.0.5
- unified-engine: 11.2.2(supports-color@9.4.0)
- unist-util-visit: 5.1.0
- vfile: 6.0.3
- transitivePeerDependencies:
- - bluebird
- - supports-color
+ oxlint: 1.88.0
+ optionalDependencies:
+ oxfmt: 0.73.0
- eslint-plugin-better-tailwindcss@4.5.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(tailwindcss@4.3.3)(typescript@7.0.2):
+ '@tailwindcss/node@4.3.3':
dependencies:
- '@eslint/css-tree': 4.0.4
- '@valibot/to-json-schema': 1.7.1(valibot@1.4.1(typescript@7.0.2))
- enhanced-resolve: 5.23.0
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.26.0
jiti: 2.7.0
- synckit: 0.11.13
- tailwind-csstree: 0.3.3
+ lightningcss: 1.32.0
+ magic-string: 0.30.21
+ source-map-js: 1.2.2
tailwindcss: 4.3.3
- tsconfig-paths-webpack-plugin: 4.2.0
- valibot: 1.4.1(typescript@7.0.2)
- optionalDependencies:
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- transitivePeerDependencies:
- - '@eslint/css'
- - typescript
- eslint-plugin-mdx@3.8.1(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0):
- dependencies:
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- eslint-mdx: 3.8.1(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)
- mdast-util-from-markdown: 2.0.3(supports-color@9.4.0)
- mdast-util-mdx: 3.0.0(supports-color@9.4.0)
- micromark-extension-mdxjs: 3.0.0
- remark-mdx: 3.1.1(supports-color@9.4.0)
- remark-parse: 11.0.0(supports-color@9.4.0)
- remark-stringify: 11.0.0
- synckit: 0.11.13
- unified: 11.0.5
- vfile: 6.0.3
- transitivePeerDependencies:
- - bluebird
- - remark-lint-file-extension
- - supports-color
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ optional: true
- eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0)))(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(prettier@3.8.3):
- dependencies:
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- prettier: 3.8.3
- prettier-linter-helpers: 1.0.1
- synckit: 0.11.13
- optionalDependencies:
- eslint-config-prettier: 10.1.8(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ optional: true
- eslint-plugin-react@7.37.5(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0)):
- dependencies:
- array-includes: 3.1.9
- array.prototype.findlast: 1.2.5
- array.prototype.flatmap: 1.3.3
- array.prototype.tosorted: 1.1.4
- doctrine: 2.1.0
- es-iterator-helpers: 1.3.3
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- estraverse: 5.3.0
- hasown: 2.0.4
- jsx-ast-utils: 3.3.5
- minimatch: 3.1.5
- object.entries: 1.1.9
- object.fromentries: 2.0.8
- object.values: 1.2.1
- prop-types: 15.8.1
- resolve: 2.0.0-next.7
- semver: 6.3.1
- string.prototype.matchall: 4.0.12
- string.prototype.repeat: 1.0.0
-
- eslint-scope@9.1.2:
- dependencies:
- '@types/esrecurse': 4.3.1
- '@types/estree': 1.0.9
- esrecurse: 4.3.0
- estraverse: 5.3.0
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ optional: true
- eslint-visitor-keys@3.4.3: {}
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ optional: true
- eslint-visitor-keys@5.0.1: {}
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ optional: true
- eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0):
- dependencies:
- '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))
- '@eslint-community/regexpp': 4.12.2
- '@eslint/config-array': 0.23.5(supports-color@9.4.0)
- '@eslint/config-helpers': 0.7.0
- '@eslint/core': 1.2.1
- '@eslint/plugin-kit': 0.7.3
- '@humanfs/node': 0.16.8
- '@humanwhocodes/module-importer': 1.0.1
- '@humanwhocodes/retry': 0.4.3
- '@types/estree': 1.0.9
- ajv: 6.15.0
- cross-spawn: 7.0.6
- debug: 4.4.3(supports-color@9.4.0)
- escape-string-regexp: 4.0.0
- eslint-scope: 9.1.2
- eslint-visitor-keys: 5.0.1
- espree: 11.2.0
- esquery: 1.7.0
- esutils: 2.0.3
- fast-deep-equal: 3.1.3
- file-entry-cache: 11.1.5
- find-up: 5.0.0
- glob-parent: 6.0.2
- ignore: 5.3.2
- imurmurhash: 0.1.4
- is-glob: 4.0.3
- json-stable-stringify-without-jsonify: 1.0.1
- minimatch: 10.2.6
- natural-compare: 1.4.0
- optionator: 0.9.4
- optionalDependencies:
- jiti: 2.7.0
- transitivePeerDependencies:
- - supports-color
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ optional: true
- espree@11.2.0:
- dependencies:
- acorn: 8.16.0
- acorn-jsx: 5.3.2(acorn@8.16.0)
- eslint-visitor-keys: 5.0.1
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ optional: true
- esquery@1.7.0:
- dependencies:
- estraverse: 5.3.0
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ optional: true
- esrecurse@4.3.0:
- dependencies:
- estraverse: 5.3.0
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ optional: true
- estraverse@5.3.0: {}
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ optional: true
- estree-util-is-identifier-name@3.0.0: {}
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ optional: true
- estree-util-visit@2.0.0:
- dependencies:
- '@types/estree-jsx': 1.0.5
- '@types/unist': 3.0.3
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ optional: true
- estree-walker@3.0.3:
- dependencies:
- '@types/estree': 1.0.9
+ '@tailwindcss/oxide@4.3.3':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-x64': 4.3.3
+ '@tailwindcss/oxide-freebsd-x64': 4.3.3
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.3
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.3
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.3
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.3
+
+ '@tailwindcss/vite@4.3.3(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))':
+ dependencies:
+ '@tailwindcss/node': 4.3.3
+ '@tailwindcss/oxide': 4.3.3
+ tailwindcss: 4.3.3
+ vite: 8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
+
+ '@takumi-rs/core-darwin-arm64@2.16.2':
+ optional: true
- esutils@2.0.3: {}
+ '@takumi-rs/core-darwin-x64@2.16.2':
+ optional: true
- expect-type@1.4.0: {}
+ '@takumi-rs/core-linux-arm64-gnu@2.16.2':
+ optional: true
- extend@3.0.2: {}
+ '@takumi-rs/core-linux-arm64-musl@2.16.2':
+ optional: true
- fast-deep-equal@3.1.3: {}
+ '@takumi-rs/core-linux-x64-gnu@2.16.2':
+ optional: true
- fast-diff@1.3.0: {}
+ '@takumi-rs/core-linux-x64-musl@2.16.2':
+ optional: true
- fast-json-stable-stringify@2.1.0: {}
+ '@takumi-rs/core-win32-arm64-msvc@2.16.2':
+ optional: true
- fast-levenshtein@2.0.6: {}
+ '@takumi-rs/core-win32-x64-msvc@2.16.2':
+ optional: true
- fdir@6.5.0(picomatch@4.0.3):
+ '@takumi-rs/core@2.16.2(csstype@3.2.3)(react@19.3.0)':
+ dependencies:
+ '@takumi-rs/helpers': 2.16.2(react@19.3.0)
optionalDependencies:
- picomatch: 4.0.3
+ '@takumi-rs/core-darwin-arm64': 2.16.2
+ '@takumi-rs/core-darwin-x64': 2.16.2
+ '@takumi-rs/core-linux-arm64-gnu': 2.16.2
+ '@takumi-rs/core-linux-arm64-musl': 2.16.2
+ '@takumi-rs/core-linux-x64-gnu': 2.16.2
+ '@takumi-rs/core-linux-x64-musl': 2.16.2
+ '@takumi-rs/core-win32-arm64-msvc': 2.16.2
+ '@takumi-rs/core-win32-x64-msvc': 2.16.2
+ csstype: 3.2.3
+ transitivePeerDependencies:
+ - preact
+ - react
- fdir@6.5.0(picomatch@4.0.7):
+ '@takumi-rs/helpers@2.16.2(react@19.3.0)':
optionalDependencies:
- picomatch: 4.0.7
+ react: 19.3.0
- file-entry-cache@11.1.5:
+ '@takumi-rs/wasm@2.16.2(csstype@3.2.3)(react@19.3.0)':
dependencies:
- flat-cache: 6.1.23
+ '@takumi-rs/helpers': 2.16.2(react@19.3.0)
+ optionalDependencies:
+ csstype: 3.2.3
+ transitivePeerDependencies:
+ - preact
+ - react
+
+ '@timber-js/app@0.2.0-alpha.220(@vitejs/plugin-react@6.1.2(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)))(@vitejs/plugin-rsc@0.5.37(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)))(nuqs@2.10.2(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))':
+ dependencies:
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/context-async-hooks': 2.12.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/sdk-trace-base': 2.12.0(@opentelemetry/api@1.9.1)
+ '@vitejs/plugin-react': 6.1.2(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
+ '@vitejs/plugin-rsc': 0.5.37(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
+ cookie: 2.0.1
+ jsonc-parser: 3.3.1
+ magic-string: 1.4.3
+ nitro: 3.0.260903-beta
+ nuqs: 2.10.2(react@19.3.0)
+ oxc-transform-react: 0.153.0
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+ srvx: 1.0.5
+ vite: 8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
- find-up@5.0.0:
+ '@types/chai@5.2.3':
dependencies:
- locate-path: 6.0.0
- path-exists: 4.0.0
+ '@types/deep-eql': 4.0.2
+ assertion-error: 2.0.1
- fix-dts-default-cjs-exports@1.0.1:
- dependencies:
- magic-string: 0.30.21
- mlly: 1.8.0
- rollup: 4.59.0
+ '@types/deep-eql@4.0.2': {}
+
+ '@types/estree@1.0.8': {}
+
+ '@types/estree@1.0.9': {}
- flat-cache@6.1.23:
+ '@types/node@26.6.2':
dependencies:
- cacheable: 2.5.0
- flatted: 3.4.4
- hookified: 1.15.1
+ undici-types: 8.9.0
- flatted@3.4.4: {}
+ '@types/react-dom@19.3.0(@types/react@19.3.0)':
+ dependencies:
+ '@types/react': 19.3.0
- for-each@0.3.5:
+ '@types/react@19.3.0':
dependencies:
- is-callable: 1.2.7
+ csstype: 3.2.3
+
+ '@types/whatwg-mimetype@3.0.2': {}
- foreground-child@3.3.1:
+ '@types/ws@8.18.1':
dependencies:
- cross-spawn: 7.0.6
- signal-exit: 4.1.0
+ '@types/node': 26.6.2
- fsevents@2.3.3:
+ '@typescript/typescript-aix-ppc64@7.0.2':
optional: true
- function-bind@1.1.2: {}
+ '@typescript/typescript-darwin-arm64@7.0.2':
+ optional: true
- function.prototype.name@1.1.8:
- dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- define-properties: 1.2.1
- functions-have-names: 1.2.3
- hasown: 2.0.4
- is-callable: 1.2.7
+ '@typescript/typescript-darwin-x64@7.0.2':
+ optional: true
- functions-have-names@1.2.3: {}
+ '@typescript/typescript-freebsd-arm64@7.0.2':
+ optional: true
- generator-function@2.0.1: {}
+ '@typescript/typescript-freebsd-x64@7.0.2':
+ optional: true
- get-intrinsic@1.3.0:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-define-property: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.2
- function-bind: 1.1.2
- get-proto: 1.0.1
- gopd: 1.2.0
- has-symbols: 1.1.0
- hasown: 2.0.4
- math-intrinsics: 1.1.0
-
- get-proto@1.0.1:
- dependencies:
- dunder-proto: 1.0.1
- es-object-atoms: 1.1.2
+ '@typescript/typescript-linux-arm64@7.0.2':
+ optional: true
- get-symbol-description@1.1.0:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
+ '@typescript/typescript-linux-arm@7.0.2':
+ optional: true
- glob-parent@6.0.2:
- dependencies:
- is-glob: 4.0.3
+ '@typescript/typescript-linux-loong64@7.0.2':
+ optional: true
- glob@10.5.0:
- dependencies:
- foreground-child: 3.3.1
- jackspeak: 3.4.3
- minimatch: 9.0.9
- minipass: 7.1.3
- package-json-from-dist: 1.0.1
- path-scurry: 1.11.1
+ '@typescript/typescript-linux-mips64el@7.0.2':
+ optional: true
- globals@17.6.0: {}
+ '@typescript/typescript-linux-ppc64@7.0.2':
+ optional: true
- globalthis@1.0.4:
- dependencies:
- define-properties: 1.2.1
- gopd: 1.2.0
+ '@typescript/typescript-linux-riscv64@7.0.2':
+ optional: true
- gopd@1.2.0: {}
+ '@typescript/typescript-linux-s390x@7.0.2':
+ optional: true
- graceful-fs@4.2.11: {}
+ '@typescript/typescript-linux-x64@7.0.2':
+ optional: true
- happy-dom@21.0.1:
- dependencies:
- '@types/node': 26.6.2
- '@types/whatwg-mimetype': 3.0.2
- '@types/ws': 8.18.1
- buffer-image-size: 0.6.4
- entities: 7.0.1
- whatwg-mimetype: 3.0.0
- ws: 8.21.3
- transitivePeerDependencies:
- - bufferutil
- - utf-8-validate
+ '@typescript/typescript-netbsd-arm64@7.0.2':
+ optional: true
- has-bigints@1.1.0: {}
+ '@typescript/typescript-netbsd-x64@7.0.2':
+ optional: true
- has-flag@4.0.0: {}
+ '@typescript/typescript-openbsd-arm64@7.0.2':
+ optional: true
- has-property-descriptors@1.0.2:
- dependencies:
- es-define-property: 1.0.1
+ '@typescript/typescript-openbsd-x64@7.0.2':
+ optional: true
- has-proto@1.2.0:
- dependencies:
- dunder-proto: 1.0.1
+ '@typescript/typescript-sunos-x64@7.0.2':
+ optional: true
- has-symbols@1.1.0: {}
+ '@typescript/typescript-win32-arm64@7.0.2':
+ optional: true
- has-tostringtag@1.0.2:
- dependencies:
- has-symbols: 1.1.0
+ '@typescript/typescript-win32-x64@7.0.2':
+ optional: true
- hashery@1.5.1:
+ '@vitejs/plugin-react@6.1.2(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))':
dependencies:
- hookified: 1.15.1
+ '@rolldown/pluginutils': 1.0.1
+ vite: 8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
- hasown@2.0.4:
+ '@vitejs/plugin-rsc@0.5.37(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))':
dependencies:
- function-bind: 1.1.2
-
- hookified@1.15.1: {}
-
- hookified@2.2.0: {}
+ '@rolldown/pluginutils': 1.0.1
+ es-module-lexer: 3.0.3
+ estree-walker: 3.0.3
+ magic-string: 1.4.3
+ obug: 3.0.0
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+ srvx: 1.0.5
+ strip-literal: 4.0.0
+ turbo-stream: 3.2.1
+ vite: 8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
+ vitefu: 1.1.3(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
- hosted-git-info@7.0.2:
+ '@vitest/coverage-v8@5.0.4(vitest@5.0.4)':
dependencies:
- lru-cache: 10.4.3
+ '@bcoe/v8-coverage': 1.0.2
+ '@vitest/istanbul-lib-coverage': 1.0.2
+ '@vitest/istanbul-lib-report': 1.0.2
+ ast-v8-to-istanbul: 1.0.7
+ magicast: 0.5.5
+ obug: 3.0.0
+ std-env: 4.3.0
+ tinyrainbow: 3.2.0
+ vitest: 5.0.4(@opentelemetry/api@1.9.1)(@types/node@26.6.2)(@vitest/coverage-v8@5.0.4)(happy-dom@21.0.1)(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
- ignore@5.3.2: {}
+ '@vitest/istanbul-lib-coverage@1.0.2': {}
- ignore@6.0.2: {}
+ '@vitest/istanbul-lib-report@1.0.2':
+ dependencies:
+ '@vitest/istanbul-lib-coverage': 1.0.2
- ignore@7.0.5: {}
+ '@vitest/mocker@5.0.4(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ '@vitest/spy': 5.0.4
+ estree-walker: 3.0.3
+ magic-string: 1.4.3
+ optionalDependencies:
+ vite: 8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
- import-meta-resolve@4.2.0: {}
+ '@vitest/spy@5.0.4': {}
- imurmurhash@0.1.4: {}
+ acorn@8.16.0: {}
- inherits@2.0.4: {}
+ any-promise@1.3.0: {}
- ini@4.1.3: {}
+ assertion-error@2.0.1: {}
- internal-slot@1.1.0:
+ ast-v8-to-istanbul@1.0.7:
dependencies:
- es-errors: 1.3.0
- hasown: 2.0.4
- side-channel: 1.1.1
-
- is-alphabetical@2.0.1: {}
+ '@jridgewell/trace-mapping': 0.3.31
+ estree-walker: 3.0.3
+ js-tokens: 10.0.0
- is-alphanumerical@2.0.1:
+ buffer-image-size@0.6.4:
dependencies:
- is-alphabetical: 2.0.1
- is-decimal: 2.0.1
+ '@types/node': 26.6.2
- is-array-buffer@3.0.5:
+ bundle-require@5.1.0(esbuild@0.27.3):
dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
- is-arrayish@0.2.1: {}
+ esbuild: 0.27.3
+ load-tsconfig: 0.2.5
- is-async-function@2.1.1:
- dependencies:
- async-function: 1.0.0
- call-bound: 1.0.4
- get-proto: 1.0.1
- has-tostringtag: 1.0.2
- safe-regex-test: 1.1.0
+ cac@6.7.14: {}
- is-bigint@1.1.0:
- dependencies:
- has-bigints: 1.1.0
+ chai@6.3.0: {}
- is-boolean-object@1.2.2:
+ chokidar@4.0.3:
dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
+ readdirp: 4.1.2
- is-callable@1.2.7: {}
+ commander@4.1.1: {}
- is-core-module@2.16.2:
- dependencies:
- hasown: 2.0.4
+ confbox@0.1.8: {}
- is-data-view@1.0.2:
- dependencies:
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
- is-typed-array: 1.1.15
+ consola@3.4.2: {}
- is-date-object@1.1.0:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
+ cookie@2.0.1: {}
- is-decimal@2.0.1: {}
+ crossws@0.4.15(srvx@1.0.5):
+ optionalDependencies:
+ srvx: 1.0.5
- is-empty@1.2.0: {}
+ csstype@3.2.3: {}
- is-extglob@2.1.1: {}
+ db0@0.4.1: {}
- is-finalizationregistry@1.1.1:
+ debug@4.4.3(supports-color@9.4.0):
dependencies:
- call-bound: 1.0.4
+ ms: 2.1.3
+ optionalDependencies:
+ supports-color: 9.4.0
- is-fullwidth-code-point@3.0.0: {}
+ detect-libc@2.1.2: {}
- is-generator-function@1.1.2:
+ enhanced-resolve@5.26.0:
dependencies:
- call-bound: 1.0.4
- generator-function: 2.0.1
- get-proto: 1.0.1
- has-tostringtag: 1.0.2
- safe-regex-test: 1.1.0
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
- is-glob@4.0.3:
+ entities@7.0.1: {}
+
+ env-runner@0.2.3:
dependencies:
- is-extglob: 2.1.1
+ crossws: 0.4.15(srvx@1.0.5)
+ exsolve: 1.1.3
+ httpxy: 0.5.5
+ srvx: 1.0.5
- is-hexadecimal@2.0.1: {}
+ es-module-lexer@2.3.2: {}
- is-map@2.0.3: {}
+ es-module-lexer@3.0.3: {}
- is-negative-zero@2.0.3: {}
+ esbuild@0.27.3:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.27.3
+ '@esbuild/android-arm': 0.27.3
+ '@esbuild/android-arm64': 0.27.3
+ '@esbuild/android-x64': 0.27.3
+ '@esbuild/darwin-arm64': 0.27.3
+ '@esbuild/darwin-x64': 0.27.3
+ '@esbuild/freebsd-arm64': 0.27.3
+ '@esbuild/freebsd-x64': 0.27.3
+ '@esbuild/linux-arm': 0.27.3
+ '@esbuild/linux-arm64': 0.27.3
+ '@esbuild/linux-ia32': 0.27.3
+ '@esbuild/linux-loong64': 0.27.3
+ '@esbuild/linux-mips64el': 0.27.3
+ '@esbuild/linux-ppc64': 0.27.3
+ '@esbuild/linux-riscv64': 0.27.3
+ '@esbuild/linux-s390x': 0.27.3
+ '@esbuild/linux-x64': 0.27.3
+ '@esbuild/netbsd-arm64': 0.27.3
+ '@esbuild/netbsd-x64': 0.27.3
+ '@esbuild/openbsd-arm64': 0.27.3
+ '@esbuild/openbsd-x64': 0.27.3
+ '@esbuild/openharmony-arm64': 0.27.3
+ '@esbuild/sunos-x64': 0.27.3
+ '@esbuild/win32-arm64': 0.27.3
+ '@esbuild/win32-ia32': 0.27.3
+ '@esbuild/win32-x64': 0.27.3
- is-number-object@1.1.1:
+ estree-walker@3.0.3:
dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-plain-obj@4.1.0: {}
+ '@types/estree': 1.0.9
- is-regex@1.2.1:
- dependencies:
- call-bound: 1.0.4
- gopd: 1.2.0
- has-tostringtag: 1.0.2
- hasown: 2.0.4
+ expect-type@1.4.0: {}
- is-set@2.0.3: {}
+ exsolve@1.1.3: {}
- is-shared-array-buffer@1.0.4:
- dependencies:
- call-bound: 1.0.4
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
- is-string@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
+ fdir@6.5.0(picomatch@4.0.7):
+ optionalDependencies:
+ picomatch: 4.0.7
- is-symbol@1.1.1:
+ fix-dts-default-cjs-exports@1.0.1:
dependencies:
- call-bound: 1.0.4
- has-symbols: 1.1.0
- safe-regex-test: 1.1.0
+ magic-string: 0.30.21
+ mlly: 1.8.0
+ rollup: 4.59.0
- is-typed-array@1.1.15:
- dependencies:
- which-typed-array: 1.1.22
+ fsevents@2.3.3:
+ optional: true
- is-weakmap@2.0.2: {}
+ graceful-fs@4.2.11: {}
- is-weakref@1.1.1:
+ h3@2.0.2(crossws@0.4.15(srvx@1.0.5))(ocache@0.3.0):
dependencies:
- call-bound: 1.0.4
+ rou3: 1.0.0
+ srvx: 1.0.5
+ optionalDependencies:
+ crossws: 0.4.15(srvx@1.0.5)
+ ocache: 0.3.0
- is-weakset@2.0.4:
+ happy-dom@21.0.1:
dependencies:
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
- isarray@2.0.5: {}
-
- isexe@2.0.0: {}
+ '@types/node': 26.6.2
+ '@types/whatwg-mimetype': 3.0.2
+ '@types/ws': 8.18.1
+ buffer-image-size: 0.6.4
+ entities: 7.0.1
+ whatwg-mimetype: 3.0.0
+ ws: 8.21.3
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
- isexe@3.1.5: {}
+ hookable@6.1.2: {}
- iterator.prototype@1.1.5:
- dependencies:
- define-data-property: 1.1.4
- es-object-atoms: 1.1.2
- get-intrinsic: 1.3.0
- get-proto: 1.0.1
- has-symbols: 1.1.0
- set-function-name: 2.0.2
-
- jackspeak@3.4.3:
- dependencies:
- '@isaacs/cliui': 8.0.2
- optionalDependencies:
- '@pkgjs/parseargs': 0.11.0
+ httpxy@0.5.5: {}
jiti@2.7.0: {}
@@ -4542,438 +3181,125 @@ snapshots:
js-tokens@10.0.0: {}
- js-tokens@4.0.0: {}
-
- json-parse-even-better-errors@3.0.2: {}
-
- json-schema-traverse@0.4.1: {}
-
- json-stable-stringify-without-jsonify@1.0.1: {}
+ jsonc-parser@3.3.1: {}
- json5@2.2.3: {}
-
- jsx-ast-utils@3.3.5:
- dependencies:
- array-includes: 3.1.9
- array.prototype.flat: 1.3.3
- object.assign: 4.1.7
- object.values: 1.2.1
-
- keyv@5.6.0:
- dependencies:
- '@keyv/serialize': 1.1.1
-
- levn@0.4.1:
- dependencies:
- prelude-ls: 1.2.1
- type-check: 0.4.0
+ lightningcss-android-arm64@1.32.0:
+ optional: true
lightningcss-android-arm64@1.33.0:
optional: true
- lightningcss-darwin-arm64@1.33.0:
+ lightningcss-darwin-arm64@1.32.0:
optional: true
- lightningcss-darwin-x64@1.33.0:
+ lightningcss-darwin-arm64@1.33.0:
optional: true
- lightningcss-freebsd-x64@1.33.0:
+ lightningcss-darwin-x64@1.32.0:
optional: true
- lightningcss-linux-arm-gnueabihf@1.33.0:
+ lightningcss-darwin-x64@1.33.0:
optional: true
- lightningcss-linux-arm64-gnu@1.33.0:
+ lightningcss-freebsd-x64@1.32.0:
optional: true
- lightningcss-linux-arm64-musl@1.33.0:
+ lightningcss-freebsd-x64@1.33.0:
optional: true
- lightningcss-linux-x64-gnu@1.33.0:
+ lightningcss-linux-arm-gnueabihf@1.32.0:
optional: true
- lightningcss-linux-x64-musl@1.33.0:
+ lightningcss-linux-arm-gnueabihf@1.33.0:
optional: true
- lightningcss-win32-arm64-msvc@1.33.0:
+ lightningcss-linux-arm64-gnu@1.32.0:
optional: true
- lightningcss-win32-x64-msvc@1.33.0:
+ lightningcss-linux-arm64-gnu@1.33.0:
optional: true
- 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
-
- lilconfig@3.1.3: {}
-
- lines-and-columns@1.2.4: {}
-
- lines-and-columns@2.0.4: {}
-
- load-plugin@6.0.3:
- dependencies:
- '@npmcli/config': 8.3.4
- import-meta-resolve: 4.2.0
- transitivePeerDependencies:
- - bluebird
-
- load-tsconfig@0.2.5: {}
-
- locate-path@6.0.0:
- dependencies:
- p-locate: 5.0.0
-
- longest-streak@3.1.0: {}
-
- loose-envify@1.4.0:
- dependencies:
- js-tokens: 4.0.0
-
- lru-cache@10.4.3: {}
-
- magic-string@0.30.21:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
-
- magic-string@1.4.3:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.6.0
-
- magicast@0.5.5:
- dependencies:
- '@babel/parser': 7.29.9
- '@babel/types': 7.29.8
- source-map-js: 1.2.1
-
- math-intrinsics@1.1.0: {}
-
- mdast-util-from-markdown@2.0.3(supports-color@9.4.0):
- dependencies:
- '@types/mdast': 4.0.4
- '@types/unist': 3.0.3
- decode-named-character-reference: 1.3.0
- devlop: 1.1.0
- mdast-util-to-string: 4.0.0
- micromark: 4.0.2(supports-color@9.4.0)
- micromark-util-decode-numeric-character-reference: 2.0.2
- micromark-util-decode-string: 2.0.1
- micromark-util-normalize-identifier: 2.0.1
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
- unist-util-stringify-position: 4.0.0
- transitivePeerDependencies:
- - supports-color
-
- mdast-util-mdx-expression@2.0.1(supports-color@9.4.0):
- dependencies:
- '@types/estree-jsx': 1.0.5
- '@types/hast': 3.0.4
- '@types/mdast': 4.0.4
- devlop: 1.1.0
- mdast-util-from-markdown: 2.0.3(supports-color@9.4.0)
- mdast-util-to-markdown: 2.1.2
- transitivePeerDependencies:
- - supports-color
-
- mdast-util-mdx-jsx@3.2.0(supports-color@9.4.0):
- dependencies:
- '@types/estree-jsx': 1.0.5
- '@types/hast': 3.0.4
- '@types/mdast': 4.0.4
- '@types/unist': 3.0.3
- ccount: 2.0.1
- devlop: 1.1.0
- mdast-util-from-markdown: 2.0.3(supports-color@9.4.0)
- mdast-util-to-markdown: 2.1.2
- parse-entities: 4.0.2
- stringify-entities: 4.0.4
- unist-util-stringify-position: 4.0.0
- vfile-message: 4.0.3
- transitivePeerDependencies:
- - supports-color
-
- mdast-util-mdx@3.0.0(supports-color@9.4.0):
- dependencies:
- mdast-util-from-markdown: 2.0.3(supports-color@9.4.0)
- mdast-util-mdx-expression: 2.0.1(supports-color@9.4.0)
- mdast-util-mdx-jsx: 3.2.0(supports-color@9.4.0)
- mdast-util-mdxjs-esm: 2.0.1(supports-color@9.4.0)
- mdast-util-to-markdown: 2.1.2
- transitivePeerDependencies:
- - supports-color
-
- mdast-util-mdxjs-esm@2.0.1(supports-color@9.4.0):
- dependencies:
- '@types/estree-jsx': 1.0.5
- '@types/hast': 3.0.4
- '@types/mdast': 4.0.4
- devlop: 1.1.0
- mdast-util-from-markdown: 2.0.3(supports-color@9.4.0)
- mdast-util-to-markdown: 2.1.2
- transitivePeerDependencies:
- - supports-color
-
- mdast-util-phrasing@4.1.0:
- dependencies:
- '@types/mdast': 4.0.4
- unist-util-is: 6.0.1
-
- mdast-util-to-markdown@2.1.2:
- dependencies:
- '@types/mdast': 4.0.4
- '@types/unist': 3.0.3
- longest-streak: 3.1.0
- mdast-util-phrasing: 4.1.0
- mdast-util-to-string: 4.0.0
- micromark-util-classify-character: 2.0.1
- micromark-util-decode-string: 2.0.1
- unist-util-visit: 5.1.0
- zwitch: 2.0.4
-
- mdast-util-to-string@4.0.0:
- dependencies:
- '@types/mdast': 4.0.4
-
- mdn-data@2.28.1: {}
-
- micromark-core-commonmark@2.0.3:
- dependencies:
- decode-named-character-reference: 1.3.0
- devlop: 1.1.0
- micromark-factory-destination: 2.0.1
- micromark-factory-label: 2.0.1
- micromark-factory-space: 2.0.1
- micromark-factory-title: 2.0.1
- micromark-factory-whitespace: 2.0.1
- micromark-util-character: 2.1.1
- micromark-util-chunked: 2.0.1
- micromark-util-classify-character: 2.0.1
- micromark-util-html-tag-name: 2.0.1
- micromark-util-normalize-identifier: 2.0.1
- micromark-util-resolve-all: 2.0.1
- micromark-util-subtokenize: 2.1.0
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-extension-mdx-expression@3.0.1:
- dependencies:
- '@types/estree': 1.0.9
- devlop: 1.1.0
- micromark-factory-mdx-expression: 2.0.3
- micromark-factory-space: 2.0.1
- micromark-util-character: 2.1.1
- micromark-util-events-to-acorn: 2.0.3
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-extension-mdx-jsx@3.0.2:
- dependencies:
- '@types/estree': 1.0.9
- devlop: 1.1.0
- estree-util-is-identifier-name: 3.0.0
- micromark-factory-mdx-expression: 2.0.3
- micromark-factory-space: 2.0.1
- micromark-util-character: 2.1.1
- micromark-util-events-to-acorn: 2.0.3
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
- vfile-message: 4.0.3
-
- micromark-extension-mdx-md@2.0.0:
- dependencies:
- micromark-util-types: 2.0.2
-
- micromark-extension-mdxjs-esm@3.0.0:
- dependencies:
- '@types/estree': 1.0.9
- devlop: 1.1.0
- micromark-core-commonmark: 2.0.3
- micromark-util-character: 2.1.1
- micromark-util-events-to-acorn: 2.0.3
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
- unist-util-position-from-estree: 2.0.0
- vfile-message: 4.0.3
-
- micromark-extension-mdxjs@3.0.0:
- dependencies:
- acorn: 8.16.0
- acorn-jsx: 5.3.2(acorn@8.16.0)
- micromark-extension-mdx-expression: 3.0.1
- micromark-extension-mdx-jsx: 3.0.2
- micromark-extension-mdx-md: 2.0.0
- micromark-extension-mdxjs-esm: 3.0.0
- micromark-util-combine-extensions: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-factory-destination@2.0.1:
- dependencies:
- micromark-util-character: 2.1.1
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-factory-label@2.0.1:
- dependencies:
- devlop: 1.1.0
- micromark-util-character: 2.1.1
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-factory-mdx-expression@2.0.3:
- dependencies:
- '@types/estree': 1.0.9
- devlop: 1.1.0
- micromark-factory-space: 2.0.1
- micromark-util-character: 2.1.1
- micromark-util-events-to-acorn: 2.0.3
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
- unist-util-position-from-estree: 2.0.0
- vfile-message: 4.0.3
-
- micromark-factory-space@2.0.1:
- dependencies:
- micromark-util-character: 2.1.1
- micromark-util-types: 2.0.2
-
- micromark-factory-title@2.0.1:
- dependencies:
- micromark-factory-space: 2.0.1
- micromark-util-character: 2.1.1
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-factory-whitespace@2.0.1:
- dependencies:
- micromark-factory-space: 2.0.1
- micromark-util-character: 2.1.1
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-util-character@2.1.1:
- dependencies:
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-util-chunked@2.0.1:
- dependencies:
- micromark-util-symbol: 2.0.1
+ lightningcss-linux-arm64-musl@1.32.0:
+ optional: true
- micromark-util-classify-character@2.0.1:
- dependencies:
- micromark-util-character: 2.1.1
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ lightningcss-linux-arm64-musl@1.33.0:
+ optional: true
- micromark-util-combine-extensions@2.0.1:
- dependencies:
- micromark-util-chunked: 2.0.1
- micromark-util-types: 2.0.2
+ lightningcss-linux-x64-gnu@1.32.0:
+ optional: true
- micromark-util-decode-numeric-character-reference@2.0.2:
- dependencies:
- micromark-util-symbol: 2.0.1
+ lightningcss-linux-x64-gnu@1.33.0:
+ optional: true
- micromark-util-decode-string@2.0.1:
- dependencies:
- decode-named-character-reference: 1.3.0
- micromark-util-character: 2.1.1
- micromark-util-decode-numeric-character-reference: 2.0.2
- micromark-util-symbol: 2.0.1
+ lightningcss-linux-x64-musl@1.32.0:
+ optional: true
- micromark-util-encode@2.0.1: {}
+ lightningcss-linux-x64-musl@1.33.0:
+ optional: true
- micromark-util-events-to-acorn@2.0.3:
- dependencies:
- '@types/estree': 1.0.9
- '@types/unist': 3.0.3
- devlop: 1.1.0
- estree-util-visit: 2.0.0
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
- vfile-message: 4.0.3
+ lightningcss-win32-arm64-msvc@1.32.0:
+ optional: true
- micromark-util-html-tag-name@2.0.1: {}
+ lightningcss-win32-arm64-msvc@1.33.0:
+ optional: true
- micromark-util-normalize-identifier@2.0.1:
- dependencies:
- micromark-util-symbol: 2.0.1
+ lightningcss-win32-x64-msvc@1.32.0:
+ optional: true
- micromark-util-resolve-all@2.0.1:
- dependencies:
- micromark-util-types: 2.0.2
+ lightningcss-win32-x64-msvc@1.33.0:
+ optional: true
- micromark-util-sanitize-uri@2.0.1:
+ lightningcss@1.32.0:
dependencies:
- micromark-util-character: 2.1.1
- micromark-util-encode: 2.0.1
- micromark-util-symbol: 2.0.1
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
- micromark-util-subtokenize@2.1.0:
+ lightningcss@1.33.0:
dependencies:
- devlop: 1.1.0
- micromark-util-chunked: 2.0.1
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-util-symbol@2.0.1: {}
+ 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
- micromark-util-types@2.0.2: {}
+ lilconfig@3.1.3: {}
- micromark@4.0.2(supports-color@9.4.0):
- dependencies:
- '@types/debug': 4.1.13
- debug: 4.4.3(supports-color@9.4.0)
- decode-named-character-reference: 1.3.0
- devlop: 1.1.0
- micromark-core-commonmark: 2.0.3
- micromark-factory-space: 2.0.1
- micromark-util-character: 2.1.1
- micromark-util-chunked: 2.0.1
- micromark-util-combine-extensions: 2.0.1
- micromark-util-decode-numeric-character-reference: 2.0.2
- micromark-util-encode: 2.0.1
- micromark-util-normalize-identifier: 2.0.1
- micromark-util-resolve-all: 2.0.1
- micromark-util-sanitize-uri: 2.0.1
- micromark-util-subtokenize: 2.1.0
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
- transitivePeerDependencies:
- - supports-color
+ lines-and-columns@1.2.4: {}
- minimatch@10.2.5:
- dependencies:
- brace-expansion: 5.0.6
+ load-tsconfig@0.2.5: {}
- minimatch@10.2.6:
+ magic-string@0.30.21:
dependencies:
- brace-expansion: 5.0.12
+ '@jridgewell/sourcemap-codec': 1.5.5
- minimatch@3.1.5:
+ magic-string@1.4.3:
dependencies:
- brace-expansion: 1.1.15
+ '@jridgewell/sourcemap-codec': 1.6.0
- minimatch@9.0.9:
+ magicast@0.5.5:
dependencies:
- brace-expansion: 2.1.7
-
- minimist@1.2.8: {}
-
- minipass@7.1.3: {}
+ '@babel/parser': 7.29.9
+ '@babel/types': 7.29.8
+ source-map-js: 1.2.1
mlly@1.8.0:
dependencies:
@@ -4992,136 +3318,102 @@ snapshots:
nanoid@3.3.20: {}
- natural-compare@1.4.0: {}
-
- node-exports-info@1.6.0:
- dependencies:
- array.prototype.flatmap: 1.3.3
- es-errors: 1.3.0
- object.entries: 1.1.9
- semver: 6.3.1
-
- nopt@7.2.1:
- dependencies:
- abbrev: 2.0.0
-
- normalize-package-data@6.0.2:
- dependencies:
- hosted-git-info: 7.0.2
- semver: 7.8.4
- validate-npm-package-license: 3.0.4
-
- npm-install-checks@6.3.0:
- dependencies:
- semver: 7.8.4
-
- npm-normalize-package-bin@3.0.1: {}
+ nf3@0.3.24: {}
- npm-package-arg@11.0.3:
+ nitro@3.0.260903-beta:
dependencies:
- hosted-git-info: 7.0.2
- proc-log: 4.2.0
- semver: 7.8.4
- validate-npm-package-name: 5.0.1
+ consola: 3.4.2
+ crossws: 0.4.15(srvx@1.0.5)
+ db0: 0.4.1
+ env-runner: 0.2.3
+ h3: 2.0.2(crossws@0.4.15(srvx@1.0.5))(ocache@0.3.0)
+ hookable: 6.1.2
+ nf3: 0.3.24
+ ocache: 0.3.0
+ rolldown: 1.2.13
+ rou3: 0.9.2
+ srvx: 1.0.5
+ unenv: 2.0.0-rc.24
+ unstorage: 2.0.0-alpha.10
- npm-pick-manifest@9.1.0:
+ nuqs@2.10.2(react@19.3.0):
dependencies:
- npm-install-checks: 6.3.0
- npm-normalize-package-bin: 3.0.1
- npm-package-arg: 11.0.3
- semver: 7.8.4
+ '@standard-schema/spec': 1.1.0
+ react: 19.3.0
object-assign@4.1.1: {}
- object-inspect@1.13.4: {}
-
- object-keys@1.1.1: {}
-
- object.assign@4.1.7:
- dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.2
- has-symbols: 1.1.0
- object-keys: 1.1.1
-
- object.entries@1.1.9:
- dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.2
-
- object.fromentries@2.0.8:
- dependencies:
- call-bind: 1.0.9
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-object-atoms: 1.1.2
-
- object.values@1.2.1:
- dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.2
-
obug@3.0.0: {}
- optionator@0.9.4:
- dependencies:
- deep-is: 0.1.4
- fast-levenshtein: 2.0.6
- levn: 0.4.1
- prelude-ls: 1.2.1
- type-check: 0.4.0
- word-wrap: 1.2.5
-
- own-keys@1.0.1:
- dependencies:
- get-intrinsic: 1.3.0
- object-keys: 1.1.1
- safe-push-apply: 1.0.0
-
- p-limit@3.1.0:
- dependencies:
- yocto-queue: 0.1.0
-
- p-locate@5.0.0:
- dependencies:
- p-limit: 3.1.0
-
- package-json-from-dist@1.0.1: {}
-
- parse-entities@4.0.2:
- dependencies:
- '@types/unist': 2.0.11
- character-entities-legacy: 3.0.0
- character-reference-invalid: 2.0.1
- decode-named-character-reference: 1.3.0
- is-alphanumerical: 2.0.1
- is-decimal: 2.0.1
- is-hexadecimal: 2.0.1
-
- parse-json@7.1.1:
- dependencies:
- '@babel/code-frame': 7.29.7
- error-ex: 1.3.4
- json-parse-even-better-errors: 3.0.2
- lines-and-columns: 2.0.4
- type-fest: 3.13.1
-
- path-exists@4.0.0: {}
-
- path-key@3.1.1: {}
+ ocache@0.3.0: {}
- path-parse@1.0.7: {}
-
- path-scurry@1.11.1:
- dependencies:
- lru-cache: 10.4.3
- minipass: 7.1.3
+ oxc-transform-react@0.153.0:
+ optionalDependencies:
+ '@oxc-transform-react/binding-android-arm-eabi': 0.153.0
+ '@oxc-transform-react/binding-android-arm64': 0.153.0
+ '@oxc-transform-react/binding-darwin-arm64': 0.153.0
+ '@oxc-transform-react/binding-darwin-x64': 0.153.0
+ '@oxc-transform-react/binding-freebsd-x64': 0.153.0
+ '@oxc-transform-react/binding-linux-arm-gnueabihf': 0.153.0
+ '@oxc-transform-react/binding-linux-arm-musleabihf': 0.153.0
+ '@oxc-transform-react/binding-linux-arm64-gnu': 0.153.0
+ '@oxc-transform-react/binding-linux-arm64-musl': 0.153.0
+ '@oxc-transform-react/binding-linux-ppc64-gnu': 0.153.0
+ '@oxc-transform-react/binding-linux-riscv64-gnu': 0.153.0
+ '@oxc-transform-react/binding-linux-riscv64-musl': 0.153.0
+ '@oxc-transform-react/binding-linux-s390x-gnu': 0.153.0
+ '@oxc-transform-react/binding-linux-x64-gnu': 0.153.0
+ '@oxc-transform-react/binding-linux-x64-musl': 0.153.0
+ '@oxc-transform-react/binding-openharmony-arm64': 0.153.0
+ '@oxc-transform-react/binding-win32-arm64-msvc': 0.153.0
+ '@oxc-transform-react/binding-win32-ia32-msvc': 0.153.0
+ '@oxc-transform-react/binding-win32-x64-msvc': 0.153.0
+
+ oxfmt@0.73.0:
+ dependencies:
+ tinypool: 2.2.0
+ optionalDependencies:
+ '@oxfmt/binding-android-arm-eabi': 0.73.0
+ '@oxfmt/binding-android-arm64': 0.73.0
+ '@oxfmt/binding-darwin-arm64': 0.73.0
+ '@oxfmt/binding-darwin-x64': 0.73.0
+ '@oxfmt/binding-freebsd-x64': 0.73.0
+ '@oxfmt/binding-linux-arm-gnueabihf': 0.73.0
+ '@oxfmt/binding-linux-arm-musleabihf': 0.73.0
+ '@oxfmt/binding-linux-arm64-gnu': 0.73.0
+ '@oxfmt/binding-linux-arm64-musl': 0.73.0
+ '@oxfmt/binding-linux-ppc64-gnu': 0.73.0
+ '@oxfmt/binding-linux-riscv64-gnu': 0.73.0
+ '@oxfmt/binding-linux-riscv64-musl': 0.73.0
+ '@oxfmt/binding-linux-s390x-gnu': 0.73.0
+ '@oxfmt/binding-linux-x64-gnu': 0.73.0
+ '@oxfmt/binding-linux-x64-musl': 0.73.0
+ '@oxfmt/binding-openharmony-arm64': 0.73.0
+ '@oxfmt/binding-win32-arm64-msvc': 0.73.0
+ '@oxfmt/binding-win32-ia32-msvc': 0.73.0
+ '@oxfmt/binding-win32-x64-msvc': 0.73.0
+
+ oxlint@1.88.0:
+ optionalDependencies:
+ '@oxlint/binding-android-arm-eabi': 1.88.0
+ '@oxlint/binding-android-arm64': 1.88.0
+ '@oxlint/binding-darwin-arm64': 1.88.0
+ '@oxlint/binding-darwin-x64': 1.88.0
+ '@oxlint/binding-freebsd-x64': 1.88.0
+ '@oxlint/binding-linux-arm-gnueabihf': 1.88.0
+ '@oxlint/binding-linux-arm-musleabihf': 1.88.0
+ '@oxlint/binding-linux-arm64-gnu': 1.88.0
+ '@oxlint/binding-linux-arm64-musl': 1.88.0
+ '@oxlint/binding-linux-ppc64-gnu': 1.88.0
+ '@oxlint/binding-linux-riscv64-gnu': 1.88.0
+ '@oxlint/binding-linux-riscv64-musl': 1.88.0
+ '@oxlint/binding-linux-s390x-gnu': 1.88.0
+ '@oxlint/binding-linux-x64-gnu': 1.88.0
+ '@oxlint/binding-linux-x64-musl': 1.88.0
+ '@oxlint/binding-openharmony-arm64': 1.88.0
+ '@oxlint/binding-win32-arm64-msvc': 1.88.0
+ '@oxlint/binding-win32-ia32-msvc': 1.88.0
+ '@oxlint/binding-win32-x64-msvc': 1.88.0
pathe@2.0.3: {}
@@ -5145,8 +3437,6 @@ snapshots:
dependencies:
playwright-core: 1.64.0
- possible-typed-array-names@1.1.0: {}
-
postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.30)(yaml@2.9.0):
dependencies:
lilconfig: 3.1.3
@@ -5161,112 +3451,17 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.2
- prelude-ls@1.2.1: {}
-
- prettier-linter-helpers@1.0.1:
- dependencies:
- fast-diff: 1.3.0
-
- prettier@3.8.3: {}
-
- proc-log@4.2.0: {}
-
- promise-inflight@1.0.1: {}
-
- promise-retry@2.0.1:
- dependencies:
- err-code: 2.0.3
- retry: 0.12.0
-
- prop-types@15.8.1:
- dependencies:
- loose-envify: 1.4.0
- object-assign: 4.1.1
- react-is: 16.13.1
-
- punycode@2.3.1: {}
-
- qified@0.10.1:
- dependencies:
- hookified: 2.2.0
-
react-dom@19.3.0(react@19.3.0):
dependencies:
react: 19.3.0
scheduler: 0.28.0
- react-is@16.13.1: {}
-
react@19.3.0: {}
- read-package-json-fast@3.0.2:
- dependencies:
- json-parse-even-better-errors: 3.0.2
- npm-normalize-package-bin: 3.0.1
-
- readable-stream@3.6.2:
- dependencies:
- inherits: 2.0.4
- string_decoder: 1.3.0
- util-deprecate: 1.0.2
-
readdirp@4.1.2: {}
- reflect.getprototypeof@1.0.10:
- dependencies:
- call-bind: 1.0.9
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-errors: 1.3.0
- es-object-atoms: 1.1.2
- get-intrinsic: 1.3.0
- get-proto: 1.0.1
- which-builtin-type: 1.2.1
-
- regexp.prototype.flags@1.5.4:
- dependencies:
- call-bind: 1.0.9
- define-properties: 1.2.1
- es-errors: 1.3.0
- get-proto: 1.0.1
- gopd: 1.2.0
- set-function-name: 2.0.2
-
- remark-mdx@3.1.1(supports-color@9.4.0):
- dependencies:
- mdast-util-mdx: 3.0.0(supports-color@9.4.0)
- micromark-extension-mdxjs: 3.0.0
- transitivePeerDependencies:
- - supports-color
-
- remark-parse@11.0.0(supports-color@9.4.0):
- dependencies:
- '@types/mdast': 4.0.4
- mdast-util-from-markdown: 2.0.3(supports-color@9.4.0)
- micromark-util-types: 2.0.2
- unified: 11.0.5
- transitivePeerDependencies:
- - supports-color
-
- remark-stringify@11.0.0:
- dependencies:
- '@types/mdast': 4.0.4
- mdast-util-to-markdown: 2.1.2
- unified: 11.0.5
-
resolve-from@5.0.0: {}
- resolve@2.0.0-next.7:
- dependencies:
- es-errors: 1.3.0
- is-core-module: 2.16.2
- node-exports-info: 1.6.0
- object-keys: 1.1.1
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
-
- retry@0.12.0: {}
-
rolldown@1.2.13:
dependencies:
'@oxc-project/types': 0.153.0
@@ -5319,199 +3514,25 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.59.0
fsevents: 2.3.3
- safe-array-concat@1.1.4:
- dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
- has-symbols: 1.1.0
- isarray: 2.0.5
-
- safe-buffer@5.2.1: {}
-
- safe-push-apply@1.0.0:
- dependencies:
- es-errors: 1.3.0
- isarray: 2.0.5
+ rou3@0.9.2: {}
- safe-regex-test@1.1.0:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-regex: 1.2.1
+ rou3@1.0.0: {}
scheduler@0.28.0: {}
- semver@6.3.1: {}
-
- semver@7.8.4: {}
-
- set-function-length@1.2.2:
- dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- function-bind: 1.1.2
- get-intrinsic: 1.3.0
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
-
- set-function-name@2.0.2:
- dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- functions-have-names: 1.2.3
- has-property-descriptors: 1.0.2
-
- set-proto@1.0.0:
- dependencies:
- dunder-proto: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.2
-
- shebang-command@2.0.0:
- dependencies:
- shebang-regex: 3.0.0
-
- shebang-regex@3.0.0: {}
-
- side-channel-list@1.0.1:
- dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
-
- side-channel-map@1.0.1:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
-
- side-channel-weakmap@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
- side-channel-map: 1.0.1
-
- side-channel@1.1.1:
- dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
- side-channel-list: 1.0.1
- side-channel-map: 1.0.1
- side-channel-weakmap: 1.0.2
-
- signal-exit@4.1.0: {}
-
source-map-js@1.2.1: {}
source-map-js@1.2.2: {}
source-map@0.7.6: {}
- spdx-correct@3.2.0:
- dependencies:
- spdx-expression-parse: 3.0.1
- spdx-license-ids: 3.0.23
-
- spdx-exceptions@2.5.0: {}
-
- spdx-expression-parse@3.0.1:
- dependencies:
- spdx-exceptions: 2.5.0
- spdx-license-ids: 3.0.23
-
- spdx-license-ids@3.0.23: {}
+ srvx@1.0.5: {}
std-env@4.3.0: {}
- stop-iteration-iterator@1.1.0:
- dependencies:
- es-errors: 1.3.0
- internal-slot: 1.1.0
-
- string-width@4.2.3:
- dependencies:
- emoji-regex: 8.0.0
- is-fullwidth-code-point: 3.0.0
- strip-ansi: 6.0.1
-
- string-width@5.1.2:
- dependencies:
- eastasianwidth: 0.2.0
- emoji-regex: 9.2.2
- strip-ansi: 7.2.0
-
- string-width@6.1.0:
- dependencies:
- eastasianwidth: 0.2.0
- emoji-regex: 10.6.0
- strip-ansi: 7.2.0
-
- string.prototype.matchall@4.0.12:
- dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-errors: 1.3.0
- es-object-atoms: 1.1.2
- get-intrinsic: 1.3.0
- gopd: 1.2.0
- has-symbols: 1.1.0
- internal-slot: 1.1.0
- regexp.prototype.flags: 1.5.4
- set-function-name: 2.0.2
- side-channel: 1.1.1
-
- string.prototype.repeat@1.0.0:
- dependencies:
- define-properties: 1.2.1
- es-abstract: 1.24.2
-
- string.prototype.trim@1.2.11:
- dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- define-data-property: 1.1.4
- define-properties: 1.2.1
- es-abstract: 1.24.2
- es-object-atoms: 1.1.2
- has-property-descriptors: 1.0.2
- safe-regex-test: 1.1.0
-
- string.prototype.trimend@1.0.10:
- dependencies:
- call-bind: 1.0.9
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.2
-
- string.prototype.trimstart@1.0.8:
- dependencies:
- call-bind: 1.0.9
- define-properties: 1.2.1
- es-object-atoms: 1.1.2
-
- string_decoder@1.3.0:
- dependencies:
- safe-buffer: 5.2.1
-
- stringify-entities@4.0.4:
- dependencies:
- character-entities-html4: 2.1.0
- character-entities-legacy: 3.0.0
-
- strip-ansi@6.0.1:
- dependencies:
- ansi-regex: 5.0.1
-
- strip-ansi@7.2.0:
+ strip-literal@4.0.0:
dependencies:
- ansi-regex: 6.2.2
-
- strip-bom@3.0.0: {}
+ js-tokens: 10.0.0
sucrase@3.35.1:
dependencies:
@@ -5523,21 +3544,22 @@ snapshots:
tinyglobby: 0.2.15
ts-interface-checker: 0.1.13
- supports-color@7.2.0:
- dependencies:
- has-flag: 4.0.0
+ sugar-high@2.6.2: {}
- supports-color@9.4.0: {}
+ supports-color@9.4.0:
+ optional: true
- supports-preserve-symlinks-flag@1.0.0: {}
+ tailwindcss@4.3.3: {}
- synckit@0.11.13:
+ takumi-js@2.16.2(csstype@3.2.3)(react@19.3.0):
dependencies:
- '@pkgr/core': 0.3.6
-
- tailwind-csstree@0.3.3: {}
-
- tailwindcss@4.3.3: {}
+ '@takumi-rs/core': 2.16.2(csstype@3.2.3)(react@19.3.0)
+ '@takumi-rs/helpers': 2.16.2(react@19.3.0)
+ '@takumi-rs/wasm': 2.16.2(csstype@3.2.3)(react@19.3.0)
+ transitivePeerDependencies:
+ - csstype
+ - preact
+ - react
tapable@2.3.3: {}
@@ -5565,31 +3587,14 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.7)
picomatch: 4.0.7
+ tinypool@2.2.0: {}
+
tinyrainbow@3.2.0: {}
tree-kill@1.2.2: {}
- trough@2.2.0: {}
-
- ts-api-utils@2.5.0(typescript@7.0.2):
- dependencies:
- typescript: 7.0.2
-
ts-interface-checker@0.1.13: {}
- tsconfig-paths-webpack-plugin@4.2.0:
- dependencies:
- chalk: 4.1.2
- enhanced-resolve: 5.23.0
- tapable: 2.3.3
- tsconfig-paths: 4.2.0
-
- tsconfig-paths@4.2.0:
- dependencies:
- json5: 2.2.3
- minimist: 1.2.8
- strip-bom: 3.0.0
-
tsup@8.5.1(jiti@2.7.0)(postcss@8.5.30)(supports-color@9.4.0)(typescript@7.0.2)(yaml@2.9.0):
dependencies:
bundle-require: 5.1.0(esbuild@0.27.3)
@@ -5618,57 +3623,7 @@ snapshots:
- tsx
- yaml
- type-check@0.4.0:
- dependencies:
- prelude-ls: 1.2.1
-
- type-fest@3.13.1: {}
-
- typed-array-buffer@1.0.3:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-typed-array: 1.1.15
-
- typed-array-byte-length@1.0.3:
- dependencies:
- call-bind: 1.0.9
- for-each: 0.3.5
- gopd: 1.2.0
- has-proto: 1.2.0
- is-typed-array: 1.1.15
-
- typed-array-byte-offset@1.0.4:
- dependencies:
- available-typed-arrays: 1.0.7
- call-bind: 1.0.9
- for-each: 0.3.5
- gopd: 1.2.0
- has-proto: 1.2.0
- is-typed-array: 1.1.15
- reflect.getprototypeof: 1.0.10
-
- typed-array-length@1.0.8:
- dependencies:
- call-bind: 1.0.9
- for-each: 0.3.5
- gopd: 1.2.0
- is-typed-array: 1.1.15
- possible-typed-array-names: 1.1.0
- reflect.getprototypeof: 1.0.10
-
- typedarray@0.0.6: {}
-
- typescript-eslint@8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2):
- dependencies:
- '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2))(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)
- '@typescript-eslint/parser': 8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)
- '@typescript-eslint/typescript-estree': 8.61.0(supports-color@9.4.0)(typescript@7.0.2)
- '@typescript-eslint/utils': 8.61.0(eslint@10.12.0(jiti@2.7.0)(supports-color@9.4.0))(supports-color@9.4.0)(typescript@7.0.2)
- eslint: 10.12.0(jiti@2.7.0)(supports-color@9.4.0)
- typescript: 7.0.2
- transitivePeerDependencies:
- - supports-color
+ turbo-stream@3.2.1: {}
typescript@7.0.2:
optionalDependencies:
@@ -5695,130 +3650,15 @@ snapshots:
ufo@1.6.3: {}
- unbox-primitive@1.1.0:
- dependencies:
- call-bound: 1.0.4
- has-bigints: 1.1.0
- has-symbols: 1.1.0
- which-boxed-primitive: 1.1.1
-
- undici-types@6.21.0: {}
-
undici-types@8.9.0: {}
- unified-engine@11.2.2(supports-color@9.4.0):
- dependencies:
- '@types/concat-stream': 2.0.3
- '@types/debug': 4.1.13
- '@types/is-empty': 1.2.3
- '@types/node': 22.19.20
- '@types/unist': 3.0.3
- concat-stream: 2.0.0
- debug: 4.4.3(supports-color@9.4.0)
- extend: 3.0.2
- glob: 10.5.0
- ignore: 6.0.2
- is-empty: 1.2.0
- is-plain-obj: 4.1.0
- load-plugin: 6.0.3
- parse-json: 7.1.1
- trough: 2.2.0
- unist-util-inspect: 8.1.0
- vfile: 6.0.3
- vfile-message: 4.0.3
- vfile-reporter: 8.1.1
- vfile-statistics: 3.0.0
- yaml: 2.9.0
- transitivePeerDependencies:
- - bluebird
- - supports-color
-
- unified@11.0.5:
- dependencies:
- '@types/unist': 3.0.3
- bail: 2.0.2
- devlop: 1.1.0
- extend: 3.0.2
- is-plain-obj: 4.1.0
- trough: 2.2.0
- vfile: 6.0.3
-
- unist-util-inspect@8.1.0:
- dependencies:
- '@types/unist': 3.0.3
-
- unist-util-is@6.0.1:
- dependencies:
- '@types/unist': 3.0.3
-
- unist-util-position-from-estree@2.0.0:
- dependencies:
- '@types/unist': 3.0.3
-
- unist-util-stringify-position@4.0.0:
- dependencies:
- '@types/unist': 3.0.3
-
- unist-util-visit-parents@6.0.2:
- dependencies:
- '@types/unist': 3.0.3
- unist-util-is: 6.0.1
-
- unist-util-visit@5.1.0:
- dependencies:
- '@types/unist': 3.0.3
- unist-util-is: 6.0.1
- unist-util-visit-parents: 6.0.2
-
- uri-js@4.4.1:
- dependencies:
- punycode: 2.3.1
-
- util-deprecate@1.0.2: {}
-
- valibot@1.4.1(typescript@7.0.2):
- optionalDependencies:
- typescript: 7.0.2
-
- validate-npm-package-license@3.0.4:
- dependencies:
- spdx-correct: 3.2.0
- spdx-expression-parse: 3.0.1
-
- validate-npm-package-name@5.0.1: {}
-
- vfile-message@4.0.3:
- dependencies:
- '@types/unist': 3.0.3
- unist-util-stringify-position: 4.0.0
-
- vfile-reporter@8.1.1:
- dependencies:
- '@types/supports-color': 8.1.3
- string-width: 6.1.0
- supports-color: 9.4.0
- unist-util-stringify-position: 4.0.0
- vfile: 6.0.3
- vfile-message: 4.0.3
- vfile-sort: 4.0.0
- vfile-statistics: 3.0.0
-
- vfile-sort@4.0.0:
- dependencies:
- vfile: 6.0.3
- vfile-message: 4.0.3
-
- vfile-statistics@3.0.0:
+ unenv@2.0.0-rc.24:
dependencies:
- vfile: 6.0.3
- vfile-message: 4.0.3
+ pathe: 2.0.3
- vfile@6.0.3:
- dependencies:
- '@types/unist': 3.0.3
- vfile-message: 4.0.3
+ unstorage@2.0.0-alpha.10: {}
- vite@8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0):
+ vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0):
dependencies:
lightningcss: 1.33.0
picomatch: 4.0.7
@@ -5832,10 +3672,14 @@ snapshots:
jiti: 2.7.0
yaml: 2.9.0
- vitest@5.0.4(@types/node@26.6.2)(@vitest/coverage-v8@5.0.4)(happy-dom@21.0.1)(vite@8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)):
+ vitefu@1.1.3(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)):
+ optionalDependencies:
+ vite: 8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
+
+ vitest@5.0.4(@opentelemetry/api@1.9.1)(@types/node@26.6.2)(@vitest/coverage-v8@5.0.4)(happy-dom@21.0.1)(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)):
dependencies:
'@types/chai': 5.2.3
- '@vitest/mocker': 5.0.4(vite@8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
+ '@vitest/mocker': 5.0.4(vite@8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0))
chai: 6.3.0
es-module-lexer: 2.3.2
expect-type: 1.4.0
@@ -5846,90 +3690,23 @@ snapshots:
tinybench: 6.2.2
tinyexec: 1.3.1
tinyglobby: 0.2.17
- vite: 8.3.4(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
+ vite: 8.3.0(@types/node@26.6.2)(esbuild@0.27.3)(jiti@2.7.0)(yaml@2.9.0)
why-is-node-running: 3.2.1
optionalDependencies:
+ '@opentelemetry/api': 1.9.1
'@types/node': 26.6.2
'@vitest/coverage-v8': 5.0.4(vitest@5.0.4)
happy-dom: 21.0.1
transitivePeerDependencies:
- msw
- walk-up-path@3.0.1: {}
-
whatwg-mimetype@3.0.0: {}
- which-boxed-primitive@1.1.1:
- dependencies:
- is-bigint: 1.1.0
- is-boolean-object: 1.2.2
- is-number-object: 1.1.1
- is-string: 1.1.1
- is-symbol: 1.1.1
-
- which-builtin-type@1.2.1:
- dependencies:
- call-bound: 1.0.4
- function.prototype.name: 1.1.8
- has-tostringtag: 1.0.2
- is-async-function: 2.1.1
- is-date-object: 1.1.0
- is-finalizationregistry: 1.1.1
- is-generator-function: 1.1.2
- is-regex: 1.2.1
- is-weakref: 1.1.1
- isarray: 2.0.5
- which-boxed-primitive: 1.1.1
- which-collection: 1.0.2
- which-typed-array: 1.1.22
-
- which-collection@1.0.2:
- dependencies:
- is-map: 2.0.3
- is-set: 2.0.3
- is-weakmap: 2.0.2
- is-weakset: 2.0.4
-
- which-typed-array@1.1.22:
- dependencies:
- available-typed-arrays: 1.0.7
- call-bind: 1.0.9
- call-bound: 1.0.4
- for-each: 0.3.5
- get-proto: 1.0.1
- gopd: 1.2.0
- has-tostringtag: 1.0.2
-
- which@2.0.2:
- dependencies:
- isexe: 2.0.0
-
- which@4.0.0:
- dependencies:
- isexe: 3.1.5
-
why-is-node-running@3.2.1: {}
- word-wrap@1.2.5: {}
-
- wrap-ansi@7.0.0:
- dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
-
- wrap-ansi@8.1.0:
- dependencies:
- ansi-styles: 6.2.3
- string-width: 5.1.2
- strip-ansi: 7.2.0
-
ws@8.21.3: {}
xstate@5.33.2: {}
- yaml@2.9.0: {}
-
- yocto-queue@0.1.0: {}
-
- zwitch@2.0.4: {}
+ yaml@2.9.0:
+ optional: true
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 46c78cc..8e0c3a5 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -2,3 +2,9 @@ packages:
- 'demo'
allowBuilds:
esbuild: true
+# timber.js alphas ship several times a week; install them as soon as they're
+# published instead of waiting out the release-age cooldown.
+minimumReleaseAgeExclude:
+ - '@timber-js/*'
+trustPolicyExclude:
+ - '@timber-js/*'
diff --git a/src/Queue.ts b/src/Queue.ts
index 9e7f8a6..2b27fe0 100644
--- a/src/Queue.ts
+++ b/src/Queue.ts
@@ -14,7 +14,13 @@ import { createQueueMachine } from './machines/queue.machine';
import { Track } from './Track';
import type { TrackQueueRef } from './Track';
import { throttle } from './utils/throttle';
-import type { GaplessOptions, AddTrackOptions, TrackInfo, TrackMetadata, PlaybackMethod } from './types';
+import type {
+ GaplessOptions,
+ AddTrackOptions,
+ TrackInfo,
+ TrackMetadata,
+ PlaybackMethod,
+} from './types';
const MAX_SCHEDULE_LOOKAHEAD = 5;
@@ -40,13 +46,13 @@ function getSilentWavUrl(): string {
view.setUint32(4, fileSize - 8, true);
writeStr(8, 'WAVE');
writeStr(12, 'fmt ');
- view.setUint32(16, 16, true); // fmt chunk size
- view.setUint16(20, 1, true); // PCM
- view.setUint16(22, 1, true); // mono
+ view.setUint32(16, 16, true); // fmt chunk size
+ view.setUint16(20, 1, true); // PCM
+ view.setUint16(22, 1, true); // mono
view.setUint32(24, sampleRate, true);
view.setUint32(28, sampleRate, true); // byte rate
- view.setUint16(32, 1, true); // block align
- view.setUint16(34, 8, true); // 8 bits per sample
+ view.setUint16(32, 1, true); // block align
+ view.setUint16(34, 8, true); // 8 bits per sample
writeStr(36, 'data');
view.setUint32(40, numSamples, true);
new Uint8Array(buffer, 44).fill(128); // 8-bit PCM silence = 128
@@ -83,7 +89,7 @@ export class Queue implements TrackQueueRef {
private _throttledUpdatePositionState = throttle(
(duration: number, currentTime: number, playbackRate: number) =>
updateMediaSessionPositionState(duration, currentTime, playbackRate),
- 1000,
+ 1000
);
constructor(options: GaplessOptions = {}) {
@@ -137,7 +143,7 @@ export class Queue implements TrackQueueRef {
// -----------------------------------------------------------------------
const machine = createQueueMachine({
currentTrackIndex: 0,
- trackCount: this._tracks.length
+ trackCount: this._tracks.length,
}).provide({
actions: {
deactivateCurrent: ({ context }) => {
@@ -212,8 +218,13 @@ export class Queue implements TrackQueueRef {
this._actor = createActor(machine);
+ let wasPlaying = false;
this._actor.subscribe((snapshot) => {
const playing = snapshot.value === 'playing';
+ // Media Session handlers are page-global. With several queues on one
+ // page, the one that starts playing takes over the OS controls.
+ if (playing && !wasPlaying) this._claimMediaSession();
+ wasPlaying = playing;
updateMediaSessionPlaybackState(playing);
if (playing) {
this._startMediaSessionAnchor();
@@ -224,15 +235,24 @@ export class Queue implements TrackQueueRef {
this._actor.start();
- setupMediaSession({
- onPlay: () => this.play(),
- onPause: () => {
- if (this._actor.getSnapshot().value === 'playing') this.pause();
- },
- onNext: () => this.next(),
- onPrevious: () => this.previous(),
- onSeek: (t) => this.seek(t),
- });
+ setupMediaSession(this._mediaSessionHandlers);
+ }
+
+ private readonly _mediaSessionHandlers = {
+ onPlay: () => this.play(),
+ onPause: () => {
+ if (this._actor.getSnapshot().value === 'playing') this.pause();
+ },
+ onNext: () => this.next(),
+ onPrevious: () => this.previous(),
+ onSeek: (t: number) => this.seek(t),
+ };
+
+ /** Point the OS media controls and metadata at this queue. */
+ private _claimMediaSession(): void {
+ setupMediaSession(this._mediaSessionHandlers);
+ const cur = this._currentTrack;
+ if (cur) updateMediaSessionMetadata(cur.metadata);
}
// --------------------------------------------------------------------------
@@ -390,7 +410,10 @@ export class Queue implements TrackQueueRef {
}
/** Snapshot of the queue state machine (state name + context). For debugging. */
- get queueSnapshot(): { state: string; context: { currentTrackIndex: number; trackCount: number } } {
+ get queueSnapshot(): {
+ state: string;
+ context: { currentTrackIndex: number; trackCount: number };
+ } {
const snap = this._actor.getSnapshot();
return { state: snap.value as string, context: snap.context };
}
@@ -483,7 +506,9 @@ export class Queue implements TrackQueueRef {
cur.playbackType === 'HTML5' &&
cur.webAudioLoadingState === 'LOADING'
) {
- this.onDebug(`_preloadAhead(${fromIndex}): deferring all — current track buffer still loading`);
+ this.onDebug(
+ `_preloadAhead(${fromIndex}): deferring all — current track buffer still loading`
+ );
return;
}
@@ -495,17 +520,18 @@ export class Queue implements TrackQueueRef {
const curBelowThreshold =
cur != null &&
cur.isPlaying &&
- (() => {
- const threshold = isNaN(cur.duration) ? 15 : Math.min(cur.duration * 0.2, 15);
- return cur.currentTime < threshold;
- })();
+ cur.currentTime < (isNaN(cur.duration) ? 15 : Math.min(cur.duration * 0.2, 15));
const limit = fromIndex + this._preloadNumTracks + 1;
- this.onDebug(`_preloadAhead(${fromIndex}) limit=${limit} trackCount=${this._tracks.length} belowThreshold=${curBelowThreshold}`);
+ this.onDebug(
+ `_preloadAhead(${fromIndex}) limit=${limit} trackCount=${this._tracks.length} belowThreshold=${curBelowThreshold}`
+ );
for (let i = fromIndex + 1; i < this._tracks.length && i < limit; i++) {
const t = this._tracks[i];
if (i > fromIndex + 1 && curBelowThreshold) {
- this.onDebug(`_preloadAhead: deferring track ${i} (current at ${cur!.currentTime.toFixed(1)}s, below threshold)`);
+ this.onDebug(
+ `_preloadAhead: deferring track ${i} (current at ${cur.currentTime.toFixed(1)}s, below threshold)`
+ );
return;
}
if (!t.isBufferLoaded) {
diff --git a/src/Track.ts b/src/Track.ts
index 011d83b..c71fb1d 100644
--- a/src/Track.ts
+++ b/src/Track.ts
@@ -7,7 +7,13 @@ import { getAudioContext, resumeAudioContext } from './utils/audioContext';
import { createTrackMachine } from './machines/track.machine';
import { fetchDecodeMachine } from './machines/fetchDecode.machine';
import type { TrackContext } from './machines/track.machine';
-import type { TrackInfo, TrackMetadata, WebAudioLoadingState, PlaybackType, PlaybackMethod } from './types';
+import type {
+ TrackInfo,
+ TrackMetadata,
+ WebAudioLoadingState,
+ PlaybackType,
+ PlaybackMethod,
+} from './types';
export interface TrackQueueRef {
onTrackEnded(track: Track): void;
@@ -39,7 +45,6 @@ const PRELOAD_DELAY = 15;
*/
const CROSSOVER_FADE_SEC = 0.03;
-
export class Track {
readonly index: number;
readonly metadata: TrackMetadata;
@@ -290,7 +295,8 @@ export class Track {
queueMicrotask(() => this.queueRef.onProgress(this.toInfo()));
},
seekHtml5: ({ context }: { context: TrackContext }) => this._seekHtml5(context.seekTarget),
- seekWebAudio: ({ context }: { context: TrackContext }) => this._seekWebAudio(context.seekTarget),
+ seekWebAudio: ({ context }: { context: TrackContext }) =>
+ this._seekWebAudio(context.seekTarget),
resetHtml5Element: () => {
this._seekAbort.abort();
this._seekAbort = new AbortController();
@@ -345,21 +351,29 @@ export class Track {
}
setPlaybackRate(rate: number): void {
- if (this.ctx && this.sourceNode && this._actor.getSnapshot().context.isPlaying
- && this.ctx.currentTime >= this._waRefCtxTime) {
+ if (
+ this.ctx &&
+ this.sourceNode &&
+ this._actor.getSnapshot().context.isPlaying &&
+ this.ctx.currentTime >= this._waRefCtxTime
+ ) {
const oldRate = this.sourceNode.playbackRate.value;
- this._waRefTrackTime = this._waRefTrackTime + (this.ctx.currentTime - this._waRefCtxTime) * oldRate;
+ this._waRefTrackTime =
+ this._waRefTrackTime + (this.ctx.currentTime - this._waRefCtxTime) * oldRate;
this._waRefCtxTime = this.ctx.currentTime;
}
this.audio.playbackRate = rate;
if (this.sourceNode) {
this.sourceNode.playbackRate.value = rate;
if (this.audioBuffer && this.ctx) {
- const remaining = this.audioBuffer.duration - this._bufferStartPaddingSec - this._waRefTrackTime;
+ const remaining =
+ this.audioBuffer.duration - this._bufferStartPaddingSec - this._waRefTrackTime;
if (remaining > 0) {
try {
this.sourceNode.stop(this._waRefCtxTime + remaining / rate);
- } catch { /* already stopped */ }
+ } catch {
+ /* already stopped */
+ }
}
}
}
@@ -452,7 +466,11 @@ export class Track {
if (snap.value === 'webaudio') {
if (!snap.context.isPlaying) return snap.context.seekTarget;
if (!this.ctx) return 0;
- return Math.max(0, this._waRefTrackTime + (this.ctx.currentTime - this._waRefCtxTime) * this.queueRef.playbackRate);
+ return Math.max(
+ 0,
+ this._waRefTrackTime +
+ (this.ctx.currentTime - this._waRefCtxTime) * this.queueRef.playbackRate
+ );
}
if ((snap.value === 'idle' || snap.value === 'loading') && snap.context.seekTarget > 0) {
return snap.context.seekTarget;
@@ -546,9 +564,13 @@ export class Track {
this.audio.currentTime = seekTarget;
} else {
const target = seekTarget;
- this.audio.addEventListener('loadedmetadata', () => {
- this.audio.currentTime = target;
- }, { once: true, signal: this._seekAbort.signal });
+ this.audio.addEventListener(
+ 'loadedmetadata',
+ () => {
+ this.audio.currentTime = target;
+ },
+ { once: true, signal: this._seekAbort.signal }
+ );
}
}
const promise = this.audio.play();
@@ -611,10 +633,7 @@ export class Track {
if (!this.ctx || !this.audioBuffer || !this.gainNode) return;
const htmlTime = this.audio.currentTime;
- const offset =
- isFinite(seekTarget) && seekTarget > htmlTime
- ? seekTarget
- : htmlTime;
+ const offset = isFinite(seekTarget) && seekTarget > htmlTime ? seekTarget : htmlTime;
this._crossoverComputedOffset = isFinite(offset) ? offset : 0;
if (!wasPlaying) {
@@ -644,11 +663,14 @@ export class Track {
} else if (!this._html5GainNode) {
if (when !== null && this.ctx) {
const delayMs = (when - this.ctx.currentTime) * 1000;
- setTimeout(() => {
- this.audio.volume = 0;
- this.audio.pause();
- this.audio.volume = 1;
- }, Math.max(0, delayMs));
+ setTimeout(
+ () => {
+ this.audio.volume = 0;
+ this.audio.pause();
+ this.audio.volume = 1;
+ },
+ Math.max(0, delayMs)
+ );
} else {
this.audio.volume = 0;
this.audio.pause();
@@ -695,7 +717,10 @@ export class Track {
const lead = wasSuspended
? 0.15
- : Math.max(0.02, 2 * ((this.ctx as unknown as { baseLatency?: number }).baseLatency || 0) + 0.01);
+ : Math.max(
+ 0.02,
+ 2 * ((this.ctx as unknown as { baseLatency?: number }).baseLatency || 0) + 0.01
+ );
const when = this.ctx.currentTime + lead;
const rate = this.queueRef.playbackRate;
@@ -781,7 +806,9 @@ export class Track {
queueMicrotask(() => this.queueRef.onTrackBufferReady(this));
}
- const preloadThreshold = isNaN(this.duration) ? PRELOAD_DELAY : Math.min(this.duration * 0.2, PRELOAD_DELAY);
+ const preloadThreshold = isNaN(this.duration)
+ ? PRELOAD_DELAY
+ : Math.min(this.duration * 0.2, PRELOAD_DELAY);
if (!this._notifiedPreloadThreshold && this.currentTime >= preloadThreshold) {
this._notifiedPreloadThreshold = true;
queueMicrotask(() => this.queueRef.onPreloadReady(this));
diff --git a/src/machines/queue.machine.ts b/src/machines/queue.machine.ts
index 93fef09..4e555bf 100644
--- a/src/machines/queue.machine.ts
+++ b/src/machines/queue.machine.ts
@@ -73,14 +73,11 @@ export function createQueueMachine(initialContext: QueueContext) {
return Math.max(0, context.currentTrackIndex - 1);
}
// Clamp to last valid index when removing at or after current
- return newCount > 0
- ? Math.min(context.currentTrackIndex, newCount - 1)
- : 0;
+ return newCount > 0 ? Math.min(context.currentTrackIndex, newCount - 1) : 0;
},
}),
gotoTrackIndex: assign({
- currentTrackIndex: ({ event }) =>
- (event as { type: 'GOTO'; index: number }).index,
+ currentTrackIndex: ({ event }) => (event as { type: 'GOTO'; index: number }).index,
}),
advanceToNextTrack: assign({
currentTrackIndex: ({ context }) => {
@@ -141,7 +138,12 @@ export function createQueueMachine(initialContext: QueueContext) {
on: {
PLAY: {
target: 'playing',
- actions: ['playCurrent', 'updateMediaSessionMetadata', 'preloadAhead', 'scheduleGapless'],
+ actions: [
+ 'playCurrent',
+ 'updateMediaSessionMetadata',
+ 'preloadAhead',
+ 'scheduleGapless',
+ ],
},
GOTO: [
{
@@ -193,7 +195,7 @@ export function createQueueMachine(initialContext: QueueContext) {
'cancelAllGapless',
'decrementTrackCount',
'activateCurrent',
- 'playCurrent',
+ 'playCurrent',
'notifyStartNewTrack',
'updateMediaSessionMetadata',
'preloadAhead',
@@ -322,11 +324,21 @@ export function createQueueMachine(initialContext: QueueContext) {
],
PLAY: {
target: 'playing',
- actions: ['playCurrent', 'updateMediaSessionMetadata', 'preloadAhead', 'scheduleGapless'],
+ actions: [
+ 'playCurrent',
+ 'updateMediaSessionMetadata',
+ 'preloadAhead',
+ 'scheduleGapless',
+ ],
},
TOGGLE: {
target: 'playing',
- actions: ['playCurrent', 'updateMediaSessionMetadata', 'preloadAhead', 'scheduleGapless'],
+ actions: [
+ 'playCurrent',
+ 'updateMediaSessionMetadata',
+ 'preloadAhead',
+ 'scheduleGapless',
+ ],
},
NEXT: {
actions: [
diff --git a/src/machines/track.machine.ts b/src/machines/track.machine.ts
index e1705a6..aae0b4e 100644
--- a/src/machines/track.machine.ts
+++ b/src/machines/track.machine.ts
@@ -87,7 +87,8 @@ export function createTrackMachine(initialContext: TrackContext) {
guards: {
canPlayWebAudio: () => false,
isWebAudioOnly: () => false,
- canStartFetch: ({ context }) => context.webAudioLoadingState === 'NONE' && !context.fetchStarted,
+ canStartFetch: ({ context }) =>
+ context.webAudioLoadingState === 'NONE' && !context.fetchStarted,
},
actions: {
playHtml5: () => {},
@@ -119,7 +120,10 @@ export function createTrackMachine(initialContext: TrackContext) {
setLoadingState: assign({ webAudioLoadingState: () => 'LOADING' as WebAudioLoadingState }),
setLoadedState: assign({ webAudioLoadingState: () => 'LOADED' as WebAudioLoadingState }),
setErrorState: assign({ webAudioLoadingState: () => 'ERROR' as WebAudioLoadingState }),
- clearScheduleAndLookahead: assign({ scheduledStartContextTime: () => null, notifiedLookahead: () => false }),
+ clearScheduleAndLookahead: assign({
+ scheduledStartContextTime: () => null,
+ notifiedLookahead: () => false,
+ }),
setPlayingWebAudio: assign({
isPlaying: () => true,
webAudioLoadingState: () => 'LOADED' as WebAudioLoadingState,
@@ -214,11 +218,7 @@ export function createTrackMachine(initialContext: TrackContext) {
{
guard: 'canPlayWebAudio',
target: 'webaudio',
- actions: [
- 'setPlayingWebAudio',
- 'startSourceNode',
- 'startProgressLoop',
- ],
+ actions: ['setPlayingWebAudio', 'startSourceNode', 'startProgressLoop'],
},
{
guard: 'isWebAudioOnly',
@@ -226,23 +226,21 @@ export function createTrackMachine(initialContext: TrackContext) {
},
{
target: 'html5',
- actions: ['setIsPlaying', 'playHtml5', 'startProgressLoop', 'triggerFetchForPendingPlay'],
+ actions: [
+ 'setIsPlaying',
+ 'playHtml5',
+ 'startProgressLoop',
+ 'triggerFetchForPendingPlay',
+ ],
},
],
PLAY_WEBAUDIO: {
target: 'webaudio',
- actions: [
- 'setPlayingWebAudio',
- 'startSourceNode',
- 'startProgressLoop',
- ],
+ actions: ['setPlayingWebAudio', 'startSourceNode', 'startProgressLoop'],
},
SCHEDULE_GAPLESS: {
target: 'webaudio',
- actions: [
- 'setScheduledGapless',
- 'startScheduledSourceNode',
- ],
+ actions: ['setScheduledGapless', 'startScheduledSourceNode'],
},
PRELOAD: { target: 'loading' },
BUFFER_LOADING: {
@@ -252,7 +250,13 @@ export function createTrackMachine(initialContext: TrackContext) {
{
guard: ({ context }: { context: TrackContext }) => context.pendingPlay,
target: 'webaudio',
- actions: ['clearPendingPlay', 'setPlayingWebAudio', 'startSourceNode', 'startProgressLoop', 'notifyBufferReady'],
+ actions: [
+ 'clearPendingPlay',
+ 'setPlayingWebAudio',
+ 'startSourceNode',
+ 'startProgressLoop',
+ 'notifyBufferReady',
+ ],
},
{
actions: ['setLoadedState', 'notifyBufferReady'],
@@ -273,7 +277,13 @@ export function createTrackMachine(initialContext: TrackContext) {
html5: {
on: {
PAUSE: {
- actions: ['clearIsPlaying', 'freezePausedTime', 'pauseHtml5', 'stopProgressLoop', 'reportProgress'],
+ actions: [
+ 'clearIsPlaying',
+ 'freezePausedTime',
+ 'pauseHtml5',
+ 'stopProgressLoop',
+ 'reportProgress',
+ ],
},
PLAY: {
actions: ['setIsPlaying', 'playHtml5', 'startProgressLoop'],
@@ -300,11 +310,7 @@ export function createTrackMachine(initialContext: TrackContext) {
actions: 'setErrorState',
},
SEEK: {
- actions: [
- 'setSeekTarget',
- 'seekHtml5',
- 'reportProgress',
- ],
+ actions: ['setSeekTarget', 'seekHtml5', 'reportProgress'],
},
LOOKAHEAD_REACHED: {
actions: 'setNotifiedLookahead',
@@ -329,7 +335,14 @@ export function createTrackMachine(initialContext: TrackContext) {
},
DEACTIVATE: {
target: 'idle',
- actions: ['clearIsPlaying', 'pauseHtml5', 'resetHtml5Element', 'resetTiming', 'stopProgressLoop', 'clearSeekTarget'],
+ actions: [
+ 'clearIsPlaying',
+ 'pauseHtml5',
+ 'resetHtml5Element',
+ 'resetTiming',
+ 'stopProgressLoop',
+ 'clearSeekTarget',
+ ],
},
},
},
@@ -349,7 +362,13 @@ export function createTrackMachine(initialContext: TrackContext) {
{
guard: ({ context }: { context: TrackContext }) => context.pendingPlay,
target: 'webaudio',
- actions: ['clearPendingPlay', 'setPlayingWebAudio', 'startSourceNode', 'startProgressLoop', 'notifyBufferReady'],
+ actions: [
+ 'clearPendingPlay',
+ 'setPlayingWebAudio',
+ 'startSourceNode',
+ 'startProgressLoop',
+ 'notifyBufferReady',
+ ],
},
{
target: 'idle',
@@ -364,11 +383,7 @@ export function createTrackMachine(initialContext: TrackContext) {
{
guard: 'canPlayWebAudio',
target: 'webaudio',
- actions: [
- 'setPlayingWebAudio',
- 'startSourceNode',
- 'startProgressLoop',
- ],
+ actions: ['setPlayingWebAudio', 'startSourceNode', 'startProgressLoop'],
},
{
guard: 'isWebAudioOnly',
@@ -376,23 +391,21 @@ export function createTrackMachine(initialContext: TrackContext) {
},
{
target: 'html5',
- actions: ['setIsPlaying', 'playHtml5', 'startProgressLoop', 'triggerFetchForPendingPlay'],
+ actions: [
+ 'setIsPlaying',
+ 'playHtml5',
+ 'startProgressLoop',
+ 'triggerFetchForPendingPlay',
+ ],
},
],
PLAY_WEBAUDIO: {
target: 'webaudio',
- actions: [
- 'setPlayingWebAudio',
- 'startSourceNode',
- 'startProgressLoop',
- ],
+ actions: ['setPlayingWebAudio', 'startSourceNode', 'startProgressLoop'],
},
SCHEDULE_GAPLESS: {
target: 'webaudio',
- actions: [
- 'setScheduledGapless',
- 'startScheduledSourceNode',
- ],
+ actions: ['setScheduledGapless', 'startScheduledSourceNode'],
},
ACTIVATE: {
target: 'idle',
@@ -442,12 +455,7 @@ export function createTrackMachine(initialContext: TrackContext) {
actions: 'setPlayingWebAudioType',
},
SEEK: {
- actions: [
- 'setSeekTarget',
- 'clearScheduledStart',
- 'seekWebAudio',
- 'reportProgress',
- ],
+ actions: ['setSeekTarget', 'clearScheduledStart', 'seekWebAudio', 'reportProgress'],
},
SET_VOLUME: {},
CANCEL_GAPLESS: {
diff --git a/src/utils/audioContext.ts b/src/utils/audioContext.ts
index c66998a..af7d933 100644
--- a/src/utils/audioContext.ts
+++ b/src/utils/audioContext.ts
@@ -14,8 +14,12 @@ let _audioContext: AudioContext | null | undefined = undefined;
function createAudioContext(): AudioContext | null {
if (!isBrowser) return null;
const Ctor =
- (window as unknown as { AudioContext?: typeof AudioContext; webkitAudioContext?: typeof AudioContext })
- .AudioContext ??
+ (
+ window as unknown as {
+ AudioContext?: typeof AudioContext;
+ webkitAudioContext?: typeof AudioContext;
+ }
+ ).AudioContext ??
(window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;
if (!Ctor) return null;
return new Ctor();
diff --git a/src/utils/mediaSession.ts b/src/utils/mediaSession.ts
index 020398e..1025ca0 100644
--- a/src/utils/mediaSession.ts
+++ b/src/utils/mediaSession.ts
@@ -7,8 +7,9 @@
import type { TrackMetadata } from '../types';
-const hasMediaSession =
- typeof navigator !== 'undefined' && 'mediaSession' in navigator;
+// Checked per call rather than once at import, so environments that add it
+// later (and tests that stub it) are picked up.
+const hasMediaSession = () => typeof navigator !== 'undefined' && 'mediaSession' in navigator;
export interface MediaSessionHandlers {
onPlay: () => void;
@@ -18,9 +19,13 @@ export interface MediaSessionHandlers {
onSeek: (time: number) => void;
}
-/** Register Media Session action handlers. Call once after construction. */
+/**
+ * Register Media Session action handlers. The handlers are global to the page,
+ * so the last caller wins. Queue calls this on construction and again whenever
+ * it starts playing, so the playing queue always owns the OS controls.
+ */
export function setupMediaSession(handlers: MediaSessionHandlers): void {
- if (!hasMediaSession) return;
+ if (!hasMediaSession()) return;
const { mediaSession } = navigator;
mediaSession.setActionHandler('play', handlers.onPlay);
mediaSession.setActionHandler('pause', handlers.onPause);
@@ -33,7 +38,7 @@ export function setupMediaSession(handlers: MediaSessionHandlers): void {
/** Update the OS metadata display (title, artist, album, artwork). */
export function updateMediaSessionMetadata(metadata?: TrackMetadata): void {
- if (!hasMediaSession) return;
+ if (!hasMediaSession()) return;
if (!metadata) {
navigator.mediaSession.metadata = null;
return;
@@ -47,10 +52,8 @@ export function updateMediaSessionMetadata(metadata?: TrackMetadata): void {
}
/** Sync the OS playback state indicator (playing / paused). */
-export function updateMediaSessionPlaybackState(
- isPlaying: boolean,
-): void {
- if (!hasMediaSession) return;
+export function updateMediaSessionPlaybackState(isPlaying: boolean): void {
+ if (!hasMediaSession()) return;
navigator.mediaSession.playbackState = isPlaying ? 'playing' : 'paused';
}
@@ -58,9 +61,9 @@ export function updateMediaSessionPlaybackState(
export function updateMediaSessionPositionState(
duration: number,
position: number,
- playbackRate = 1,
+ playbackRate = 1
): void {
- if (!hasMediaSession) return;
+ if (!hasMediaSession()) return;
try {
navigator.mediaSession.setPositionState({ duration, position, playbackRate });
} catch {
diff --git a/src/utils/throttle.ts b/src/utils/throttle.ts
index c48e2c5..25d2cbb 100644
--- a/src/utils/throttle.ts
+++ b/src/utils/throttle.ts
@@ -2,7 +2,7 @@
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function throttle void>(
fn: T,
- ms: number,
+ ms: number
): (...args: Parameters) => void {
let last = 0;
return (...args: Parameters) => {
diff --git a/tests/setup.ts b/tests/setup.ts
index a9d6886..f466163 100644
--- a/tests/setup.ts
+++ b/tests/setup.ts
@@ -58,7 +58,12 @@ export class MockAudioBufferSourceNode {
// Mock GainNode
// ---------------------------------------------------------------------------
export class MockGainNode {
- gain: { value: number; setValueAtTime: Mock; linearRampToValueAtTime: Mock; cancelScheduledValues: Mock } = {
+ gain: {
+ value: number;
+ setValueAtTime: Mock;
+ linearRampToValueAtTime: Mock;
+ cancelScheduledValues: Mock;
+ } = {
value: 1,
setValueAtTime: vi.fn(),
linearRampToValueAtTime: vi.fn(),
@@ -81,7 +86,11 @@ export class MockAudioBuffer {
/** Optional: simulate `paddingSec` of silence at the start, then full-amplitude content. */
paddingSec = 0;
- constructor(public duration: number, public numberOfChannels = 2, public sampleRate = 44100) {}
+ constructor(
+ public duration: number,
+ public numberOfChannels = 2,
+ public sampleRate = 44100
+ ) {}
get length(): number {
return Math.round(this.duration * this.sampleRate);
@@ -122,7 +131,7 @@ export class MockAudioContext {
const mockBuffer = new MockAudioBuffer(180) as unknown as AudioBuffer;
success?.(mockBuffer);
return Promise.resolve(mockBuffer);
- },
+ }
);
}
@@ -146,7 +155,10 @@ export class MockAudioElement {
// Event handlers
onerror: ((e: unknown) => void) | null = null;
onended: (() => void) | null = null;
- private _listeners: Record> = {};
+ private _listeners: Record<
+ string,
+ Array<{ cb: EventListenerOrEventListenerObject; once: boolean }>
+ > = {};
play = vi.fn(() => {
this.paused = false;
@@ -211,17 +223,20 @@ export function mockFetchSuccess(arrayBuffer = new ArrayBuffer(1024)): Mock {
}
export function mockFetchRedirect(finalUrl: string, arrayBuffer = new ArrayBuffer(1024)): void {
- vi.stubGlobal('fetch', vi.fn().mockImplementation((_url: string, opts?: RequestInit) => {
- if (opts?.method === 'HEAD') {
- return Promise.resolve({ ok: true, url: finalUrl, redirected: true });
- }
- return Promise.resolve({
- ok: true,
- url: finalUrl,
- redirected: false,
- arrayBuffer: () => Promise.resolve(arrayBuffer),
- });
- }));
+ vi.stubGlobal(
+ 'fetch',
+ vi.fn().mockImplementation((_url: string, opts?: RequestInit) => {
+ if (opts?.method === 'HEAD') {
+ return Promise.resolve({ ok: true, url: finalUrl, redirected: true });
+ }
+ return Promise.resolve({
+ ok: true,
+ url: finalUrl,
+ redirected: false,
+ arrayBuffer: () => Promise.resolve(arrayBuffer),
+ });
+ })
+ );
}
export function mockFetchFailure(): void {
@@ -250,10 +265,13 @@ beforeEach(() => {
// requestAnimationFrame shim (happy-dom may not have it)
if (typeof requestAnimationFrame === 'undefined') {
- vi.stubGlobal('requestAnimationFrame', vi.fn((cb: FrameRequestCallback) => {
- setTimeout(() => cb(0), 0);
- return 0;
- }));
+ vi.stubGlobal(
+ 'requestAnimationFrame',
+ vi.fn((cb: FrameRequestCallback) => {
+ setTimeout(() => cb(0), 0);
+ return 0;
+ })
+ );
vi.stubGlobal('cancelAnimationFrame', vi.fn());
}
});
diff --git a/tests/unit/crossover-flow.test.ts b/tests/unit/crossover-flow.test.ts
index d27e550..1c80867 100644
--- a/tests/unit/crossover-flow.test.ts
+++ b/tests/unit/crossover-flow.test.ts
@@ -1,6 +1,12 @@
import { describe, it, expect, vi } from 'vitest';
import { Queue } from '../../src/Queue';
-import { mockFetchSuccess, mockFetchRedirect, MockAudioElement, advanceTime, MockGainNode } from '../setup';
+import {
+ mockFetchSuccess,
+ mockFetchRedirect,
+ MockAudioElement,
+ advanceTime,
+ MockGainNode,
+} from '../setup';
describe('crossover end-to-end flow', () => {
it('after q.play() + decode, current track crosses over and HTML5 element is paused', async () => {
@@ -8,10 +14,10 @@ describe('crossover end-to-end flow', () => {
const debug: string[] = [];
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'], onDebug: (m: string) => debug.push(m) });
q.play();
- for (let i = 0; i < 15; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 15; i++) await new Promise((r) => setTimeout(r, 0));
// The HTML5 element is paused after the crossfade completes.
// The delay includes the scheduling lead (~50 ms) plus the fade (~30 ms).
- await new Promise(r => setTimeout(r, 150));
+ await new Promise((r) => setTimeout(r, 150));
const tracks = (q as any)._tracks;
expect(tracks[0].playbackType).toBe('WEBAUDIO');
@@ -19,7 +25,7 @@ describe('crossover end-to-end flow', () => {
expect(tracks[0].isPlaying).toBe(true);
expect((tracks[0].audio as MockAudioElement).paused).toBe(true);
- expect(debug.some(m => m.includes('crossoverHtml5ToWebAudio'))).toBe(true);
+ expect(debug.some((m) => m.includes('crossoverHtml5ToWebAudio'))).toBe(true);
});
it('when paused before BUFFER_READY, crossover moves to webaudio paused (no source started)', async () => {
@@ -27,7 +33,7 @@ describe('crossover end-to-end flow', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
q.pause();
- for (let i = 0; i < 15; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 15; i++) await new Promise((r) => setTimeout(r, 0));
const tracks = (q as any)._tracks;
expect(tracks[0].playbackType).toBe('WEBAUDIO');
@@ -58,19 +64,23 @@ describe('crossover end-to-end flow', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
// Let microtasks settle. Track 0's fetch is hung (we haven't resolved it).
- for (let i = 0; i < 5; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 5; i++) await new Promise((r) => setTimeout(r, 0));
// Track 1's fetch must NOT have started yet — only HEAD requests and track 0's GET.
- const calls = fetchSpy.mock.calls.map(c => `${(c[1] as RequestInit | undefined)?.method ?? 'GET'} ${String(c[0])}`);
- expect(calls.some(c => c.includes('GET') && c.includes('b.mp3'))).toBe(false);
+ const calls = fetchSpy.mock.calls.map(
+ (c) => `${(c[1] as RequestInit | undefined)?.method ?? 'GET'} ${String(c[0])}`
+ );
+ expect(calls.some((c) => c.includes('GET') && c.includes('b.mp3'))).toBe(false);
// Resolve track 0's fetch → BUFFER_READY → crossover → gate releases.
resolveTrack0Fetch(new ArrayBuffer(1024));
- for (let i = 0; i < 10; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 10; i++) await new Promise((r) => setTimeout(r, 0));
// Now track 1's fetch should have started.
- const callsAfter = fetchSpy.mock.calls.map(c => `${(c[1] as RequestInit | undefined)?.method ?? 'GET'} ${String(c[0])}`);
- expect(callsAfter.some(c => c.includes('GET') && c.includes('b.mp3'))).toBe(true);
+ const callsAfter = fetchSpy.mock.calls.map(
+ (c) => `${(c[1] as RequestInit | undefined)?.method ?? 'GET'} ${String(c[0])}`
+ );
+ expect(callsAfter.some((c) => c.includes('GET') && c.includes('b.mp3'))).toBe(true);
});
it('Fix 2 — crossover triggers cancel-and-reschedule of any existing gapless schedule', async () => {
@@ -79,14 +89,14 @@ describe('crossover end-to-end flow', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'], onDebug: (m: string) => debug.push(m) });
q.play();
advanceTime(20);
- for (let i = 0; i < 20; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 20; i++) await new Promise((r) => setTimeout(r, 0));
// After crossover, _scheduledNextIndex is set, and the cancel-and-reschedule
// path was taken (TRACK_LOADED for the current track).
expect((q as any)._scheduledNextIndex).toBe(1);
// The cancel-and-reschedule path is what we want to confirm fired. The debug
// log shows _cancelScheduledGapless followed by _tryScheduleGapless.
- const scheduledLines = debug.filter(m => m.includes('_tryScheduleGapless: scheduled'));
+ const scheduledLines = debug.filter((m) => m.includes('_tryScheduleGapless: scheduled'));
expect(scheduledLines.length).toBeGreaterThanOrEqual(1);
});
@@ -100,8 +110,8 @@ describe('crossover end-to-end flow', () => {
mockFetchSuccess();
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
- for (let i = 0; i < 15; i++) await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 150));
+ for (let i = 0; i < 15; i++) await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 150));
const tracks = (q as any)._tracks;
expect(tracks[0].playbackType).toBe('WEBAUDIO');
@@ -111,16 +121,22 @@ describe('crossover end-to-end flow', () => {
// Two GainNodes should have ramped — the html5GainNode (1→0) and the
// WebAudio fade gain (0→1). Inspect createGain call results.
- const ctx = (q as any)._tracks[0].ctx as { createGain: { mock: { results: { value: MockGainNode }[] } } };
+ const ctx = (q as any)._tracks[0].ctx as {
+ createGain: { mock: { results: { value: MockGainNode }[] } };
+ };
const gainNodes = ctx.createGain.mock.results.map((r) => r.value);
const html5FadeNode = gainNodes.find((g) =>
- (g.gain.linearRampToValueAtTime as ReturnType).mock.calls.some((call) => call[0] === 0)
+ (g.gain.linearRampToValueAtTime as ReturnType).mock.calls.some(
+ (call) => call[0] === 0
+ )
);
expect(html5FadeNode).toBeDefined();
const webAudioFadeNode = gainNodes.find((g) =>
- (g.gain.linearRampToValueAtTime as ReturnType).mock.calls.some((call) => call[0] === 1)
+ (g.gain.linearRampToValueAtTime as ReturnType).mock.calls.some(
+ (call) => call[0] === 1
+ )
);
expect(webAudioFadeNode).toBeDefined();
});
@@ -136,7 +152,7 @@ describe('crossover end-to-end flow', () => {
mockFetchRedirect('https://cdn.example.com/redirected.mp3');
const q = new Queue({ tracks: ['https://example.com/a.mp3', 'b.mp3'] });
q.play();
- for (let i = 0; i < 10; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 10; i++) await new Promise((r) => setTimeout(r, 0));
const tracks = (q as any)._tracks;
expect((tracks[0].audio as MockAudioElement).src).toBe('https://example.com/a.mp3');
@@ -155,13 +171,15 @@ describe('crossover end-to-end flow', () => {
const tracks = (q as any)._tracks;
(tracks[0].audio as MockAudioElement).currentTime = 4;
- for (let i = 0; i < 15; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 15; i++) await new Promise((r) => setTimeout(r, 0));
expect(tracks[0].playbackType).toBe('WEBAUDIO');
- const sourceCreate = (tracks[0].ctx.createBufferSource as ReturnType);
- const allSources = sourceCreate.mock.results.map((r) => r.value as { start: ReturnType });
- const startedSource = allSources.find(s => s.start.mock.calls.length > 0);
+ const sourceCreate = tracks[0].ctx.createBufferSource as ReturnType;
+ const allSources = sourceCreate.mock.results.map(
+ (r) => r.value as { start: ReturnType }
+ );
+ const startedSource = allSources.find((s) => s.start.mock.calls.length > 0);
expect(startedSource).toBeDefined();
const [, offsetArg] = startedSource!.start.mock.calls[0];
// With the scheduling lead (≥20 ms at 1x rate), the source starts
@@ -183,7 +201,7 @@ describe('crossover end-to-end flow', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
advanceTime(20);
- for (let i = 0; i < 20; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 20; i++) await new Promise((r) => setTimeout(r, 0));
const internal = q as any;
expect(internal._scheduledNextIndex).toBe(1);
@@ -194,7 +212,7 @@ describe('crossover end-to-end flow', () => {
// Seek the current track close to the end → cancelAndRescheduleGapless.
q.seek(track1.duration - 1);
- for (let i = 0; i < 5; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 5; i++) await new Promise((r) => setTimeout(r, 0));
// gainNode of the next track should NOT have been disconnected.
expect(track1.gainNode.disconnect.mock.calls.length).toBe(gainNodeDisconnectsBefore);
@@ -210,22 +228,24 @@ describe('crossover end-to-end flow', () => {
// track to 31.5, but the HTML5 element's currentTime stays low because
// the element hasn't loaded/seeked yet.
q.gotoTrack(0, false, 31.5);
- for (let i = 0; i < 5; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 5; i++) await new Promise((r) => setTimeout(r, 0));
const tracks = (q as any)._tracks;
// HTML5 element's currentTime is still near 0
(tracks[0].audio as MockAudioElement).currentTime = 1.3;
q.play();
- for (let i = 0; i < 15; i++) await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 150));
+ for (let i = 0; i < 15; i++) await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 150));
expect(tracks[0].playbackType).toBe('WEBAUDIO');
// The WebAudio source should have started near 31.5, not at 1.3
- const sourceCreate = (tracks[0].ctx.createBufferSource as ReturnType);
- const allSources = sourceCreate.mock.results.map((r) => r.value as { start: ReturnType });
- const startedSource = allSources.find(s => s.start.mock.calls.length > 0);
+ const sourceCreate = tracks[0].ctx.createBufferSource as ReturnType;
+ const allSources = sourceCreate.mock.results.map(
+ (r) => r.value as { start: ReturnType }
+ );
+ const startedSource = allSources.find((s) => s.start.mock.calls.length > 0);
expect(startedSource).toBeDefined();
const [, offsetArg] = startedSource!.start.mock.calls[0];
expect(offsetArg).toBeGreaterThanOrEqual(31.5);
@@ -237,7 +257,7 @@ describe('crossover end-to-end flow', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
advanceTime(20); // past 15s threshold so further preloads aren't deferred
- for (let i = 0; i < 20; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 20; i++) await new Promise((r) => setTimeout(r, 0));
const internal = q as any;
expect(internal._tracks[0].playbackType).toBe('WEBAUDIO');
diff --git a/tests/unit/features.test.ts b/tests/unit/features.test.ts
index 32149d0..e689de7 100644
--- a/tests/unit/features.test.ts
+++ b/tests/unit/features.test.ts
@@ -99,7 +99,7 @@ describe('preloadNumTracks', () => {
// Manually call the internal preload ahead
(q as unknown as { _preloadAhead: (i: number) => void })._preloadAhead(0);
// Only track 1 should be considered (limit = 0 + 1 + 1 = 2, so only index 1)
- const debugCalls = onDebug.mock.calls.map(c => c[0]);
+ const debugCalls = onDebug.mock.calls.map((c) => c[0]);
const preloadCalls = debugCalls.filter((m: string) => m.includes('_preloadAhead'));
expect(preloadCalls.length).toBeGreaterThan(0);
});
@@ -310,7 +310,9 @@ describe('playbackRate', () => {
injectBuffer(q, 0);
q.play();
const tracks = (q as unknown as { _tracks: Track[] })._tracks;
- const track0 = tracks[0] as unknown as { sourceNode: { playbackRate: { value: number } } | null };
+ const track0 = tracks[0] as unknown as {
+ sourceNode: { playbackRate: { value: number } } | null;
+ };
expect(track0.sourceNode).not.toBeNull();
expect(track0.sourceNode!.playbackRate.value).toBe(1.5);
});
@@ -321,7 +323,9 @@ describe('playbackRate', () => {
q.play();
q.setPlaybackRate(2);
const tracks = (q as unknown as { _tracks: Track[] })._tracks;
- const track0 = tracks[0] as unknown as { sourceNode: { playbackRate: { value: number } } | null };
+ const track0 = tracks[0] as unknown as {
+ sourceNode: { playbackRate: { value: number } } | null;
+ };
expect(track0.sourceNode!.playbackRate.value).toBe(2);
});
@@ -347,7 +351,8 @@ describe('playbackRate', () => {
t.audioBuffer = new MockAudioBuffer(180) as unknown as AudioBuffer;
t.play();
t.setPlaybackRate(2);
- const sourceNode = (t as unknown as { sourceNode: { playbackRate: { value: number } } | null }).sourceNode;
+ const sourceNode = (t as unknown as { sourceNode: { playbackRate: { value: number } } | null })
+ .sourceNode;
expect(sourceNode!.playbackRate.value).toBe(2);
expect((t.audio as unknown as { playbackRate: number }).playbackRate).toBe(2);
});
@@ -362,7 +367,9 @@ describe('playbackRate', () => {
// Schedule gapless for track 1
advanceTime(10);
tracks[1].scheduleGaplessStart(10);
- const sourceNode1 = (tracks[1] as unknown as { sourceNode: { playbackRate: { value: number } } | null }).sourceNode;
+ const sourceNode1 = (
+ tracks[1] as unknown as { sourceNode: { playbackRate: { value: number } } | null }
+ ).sourceNode;
expect(sourceNode1).not.toBeNull();
expect(sourceNode1!.playbackRate.value).toBe(1.5);
});
@@ -376,7 +383,8 @@ describe('playbackRate', () => {
// At 1x: remaining = 100 - 0 = 100s, endTime = ctx.currentTime + 100
// At 2x: remaining = (100 - 0) / 2 = 50s, endTime = ctx.currentTime + 50
- const computeEndTime = (q as unknown as { _computeTrackEndTime: (t: Track) => number | null })._computeTrackEndTime;
+ const computeEndTime = (q as unknown as { _computeTrackEndTime: (t: Track) => number | null })
+ ._computeTrackEndTime;
const tracks = (q as unknown as { _tracks: Track[] })._tracks;
const endTime = computeEndTime.call(q, tracks[0]);
// ctx.currentTime is 0, so endTime should be 50
@@ -393,7 +401,8 @@ describe('playbackRate', () => {
// Schedule track 0 to start at ctx time 5
tracks[0].scheduleGaplessStart(5);
- const computeEndTime = (q as unknown as { _computeTrackEndTime: (t: Track) => number | null })._computeTrackEndTime;
+ const computeEndTime = (q as unknown as { _computeTrackEndTime: (t: Track) => number | null })
+ ._computeTrackEndTime;
const endTime = computeEndTime.call(q, tracks[0]);
// scheduledStartContextTime=5, duration=100, rate=2 → 5 + 100/2 = 55
expect(endTime).toBeCloseTo(55, 1);
@@ -412,12 +421,13 @@ describe('playbackRate', () => {
advanceTime(5);
tracks[0].scheduleGaplessStart(5); // gapless start at ctx=5, dur=100
- advanceTime(25); // position 25 @ ctx 30
+ advanceTime(25); // position 25 @ ctx 30
tracks[0].pause();
- advanceTime(40); // paused for 40s → ctx 70
- tracks[0].play(); // resume from 25 @ ctx 70
+ advanceTime(40); // paused for 40s → ctx 70
+ tracks[0].play(); // resume from 25 @ ctx 70
- const computeEndTime = (q as unknown as { _computeTrackEndTime: (t: Track) => number | null })._computeTrackEndTime;
+ const computeEndTime = (q as unknown as { _computeTrackEndTime: (t: Track) => number | null })
+ ._computeTrackEndTime;
const endTime = computeEndTime.call(q, tracks[0]);
// Correct: 70 + (100 - 25) = 145. The stale scheduled-start math gave
// 5 + 100 = 105 — i.e. the next track started 40s (the pause duration)
diff --git a/tests/unit/fuzz.test.ts b/tests/unit/fuzz.test.ts
index b9300e9..6cec6c7 100644
--- a/tests/unit/fuzz.test.ts
+++ b/tests/unit/fuzz.test.ts
@@ -72,26 +72,23 @@ function checkInvariants(queue: Queue, opDescription: string, seed: number): voi
// 1. State is one of the valid states
const validStates = ['idle', 'playing', 'paused', 'ended'];
- expect(
- validStates.includes(snap.state),
- `${label}: Invalid state "${snap.state}"`,
- ).toBe(true);
+ expect(validStates.includes(snap.state), `${label}: Invalid state "${snap.state}"`).toBe(true);
// 2. Machine trackCount matches actual tracks length
expect(
snap.context.trackCount,
- `${label}: trackCount mismatch machine=${snap.context.trackCount} actual=${trackCount}`,
+ `${label}: trackCount mismatch machine=${snap.context.trackCount} actual=${trackCount}`
).toBe(trackCount);
// 3. currentTrackIndex is in bounds (0 <= idx < trackCount, or >= 0 when empty)
expect(
snap.context.currentTrackIndex,
- `${label}: currentTrackIndex ${snap.context.currentTrackIndex} < 0`,
+ `${label}: currentTrackIndex ${snap.context.currentTrackIndex} < 0`
).toBeGreaterThanOrEqual(0);
if (trackCount > 0) {
expect(
snap.context.currentTrackIndex,
- `${label}: currentTrackIndex ${snap.context.currentTrackIndex} >= trackCount ${trackCount}`,
+ `${label}: currentTrackIndex ${snap.context.currentTrackIndex} >= trackCount ${trackCount}`
).toBeLessThan(trackCount);
}
@@ -99,7 +96,7 @@ function checkInvariants(queue: Queue, opDescription: string, seed: number): voi
for (let i = 0; i < trackCount; i++) {
expect(
tracks[i].index,
- `${label}: _tracks[${i}].index is ${tracks[i].index}, expected ${i}`,
+ `${label}: _tracks[${i}].index is ${tracks[i].index}, expected ${i}`
).toBe(i);
}
@@ -107,7 +104,7 @@ function checkInvariants(queue: Queue, opDescription: string, seed: number): voi
if (trackCount === 0) {
expect(
snap.state === 'playing' || snap.state === 'paused',
- `${label}: state is "${snap.state}" with 0 tracks`,
+ `${label}: state is "${snap.state}" with 0 tracks`
).toBe(false);
}
@@ -115,19 +112,13 @@ function checkInvariants(queue: Queue, opDescription: string, seed: number): voi
if (snap.state === 'ended' && trackCount > 0) {
expect(
snap.context.currentTrackIndex,
- `${label}: ended state but currentTrackIndex ${snap.context.currentTrackIndex} is not last (trackCount=${trackCount})`,
+ `${label}: ended state but currentTrackIndex ${snap.context.currentTrackIndex} is not last (trackCount=${trackCount})`
).toBeGreaterThanOrEqual(trackCount - 1);
}
// 7. volume should always be in [0, 1]
- expect(
- queue.volume,
- `${label}: volume ${queue.volume} out of range`,
- ).toBeGreaterThanOrEqual(0);
- expect(
- queue.volume,
- `${label}: volume ${queue.volume} out of range`,
- ).toBeLessThanOrEqual(1);
+ expect(queue.volume, `${label}: volume ${queue.volume} out of range`).toBeGreaterThanOrEqual(0);
+ expect(queue.volume, `${label}: volume ${queue.volume} out of range`).toBeLessThanOrEqual(1);
// 8. isPlaying / isPaused should be consistent with state
if (snap.state === 'playing') {
@@ -142,25 +133,26 @@ function checkInvariants(queue: Queue, opDescription: string, seed: number): voi
// 9. currentTrackIndex getter should match machine context
expect(
queue.currentTrackIndex,
- `${label}: public currentTrackIndex getter ${queue.currentTrackIndex} != machine ${snap.context.currentTrackIndex}`,
+ `${label}: public currentTrackIndex getter ${queue.currentTrackIndex} != machine ${snap.context.currentTrackIndex}`
).toBe(snap.context.currentTrackIndex);
// 10. tracks.length should match internal _tracks.length
expect(
queue.tracks.length,
- `${label}: public tracks.length ${queue.tracks.length} != internal ${trackCount}`,
+ `${label}: public tracks.length ${queue.tracks.length} != internal ${trackCount}`
).toBe(trackCount);
// 11. _scheduledNextIndex (if set) should be in bounds
- const scheduledIdx = (queue as unknown as { _scheduledNextIndex: number | null })._scheduledNextIndex;
+ const scheduledIdx = (queue as unknown as { _scheduledNextIndex: number | null })
+ ._scheduledNextIndex;
if (scheduledIdx !== null) {
expect(
scheduledIdx,
- `${label}: _scheduledNextIndex ${scheduledIdx} < 0`,
+ `${label}: _scheduledNextIndex ${scheduledIdx} < 0`
).toBeGreaterThanOrEqual(0);
expect(
scheduledIdx,
- `${label}: _scheduledNextIndex ${scheduledIdx} >= trackCount ${trackCount}`,
+ `${label}: _scheduledNextIndex ${scheduledIdx} >= trackCount ${trackCount}`
).toBeLessThan(trackCount);
}
}
@@ -264,7 +256,7 @@ function runFuzzScenario(
seed: number,
initialTracks: number,
numOps: number,
- weights: Weights,
+ weights: Weights
): void {
trackCounter = 0;
const rand = mulberry32(seed);
diff --git a/tests/unit/media-keys.test.ts b/tests/unit/media-keys.test.ts
index 10278b1..a471b67 100644
--- a/tests/unit/media-keys.test.ts
+++ b/tests/unit/media-keys.test.ts
@@ -7,7 +7,7 @@ describe('media key support via silent anchor element', () => {
mockFetchSuccess();
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const anchor = (q as any)._mediaSessionAnchor as MockAudioElement;
expect(anchor).toBeDefined();
@@ -20,7 +20,7 @@ describe('media key support via silent anchor element', () => {
mockFetchSuccess();
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const anchor = (q as any)._mediaSessionAnchor as MockAudioElement;
expect(anchor.paused).toBe(false);
@@ -33,7 +33,7 @@ describe('media key support via silent anchor element', () => {
mockFetchSuccess();
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
q.pause();
const anchor = (q as any)._mediaSessionAnchor as MockAudioElement;
@@ -47,8 +47,8 @@ describe('media key support via silent anchor element', () => {
mockFetchSuccess();
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
- for (let i = 0; i < 15; i++) await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 150));
+ for (let i = 0; i < 15; i++) await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 150));
const tracks = (q as any)._tracks;
expect(tracks[0].machineState).toBe('webaudio');
@@ -62,7 +62,7 @@ describe('media key support via silent anchor element', () => {
mockFetchSuccess();
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const anchor1 = (q as any)._mediaSessionAnchor;
q.pause();
@@ -76,7 +76,7 @@ describe('media key support via silent anchor element', () => {
mockFetchSuccess();
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const anchor = (q as any)._mediaSessionAnchor as MockAudioElement;
expect(anchor.paused).toBe(false);
@@ -86,3 +86,57 @@ describe('media key support via silent anchor element', () => {
expect((q as any)._mediaSessionAnchor).toBeNull();
});
});
+
+describe('media session handlers with several queues on one page', () => {
+ function stubMediaSession() {
+ const handlers = new Map();
+ const mediaSession = {
+ metadata: null as MediaMetadata | null,
+ playbackState: 'none',
+ setActionHandler: (action: string, handler: MediaSessionActionHandler | null) => {
+ handlers.set(action, handler);
+ },
+ setPositionState: () => {},
+ };
+ Object.defineProperty(navigator, 'mediaSession', { value: mediaSession, configurable: true });
+ globalThis.MediaMetadata ??= class {
+ constructor(init: MediaMetadataInit) {
+ Object.assign(this, init);
+ }
+ } as unknown as typeof MediaMetadata;
+ return {
+ handlers,
+ mediaSession,
+ restore: () => Reflect.deleteProperty(navigator, 'mediaSession'),
+ };
+ }
+
+ it('routes OS controls to the queue that is playing, not the last one created', async () => {
+ const { handlers, mediaSession, restore } = stubMediaSession();
+ try {
+ mockFetchSuccess();
+ const a = new Queue({ tracks: ['a.mp3'], trackMetadata: [{ title: 'A' }] });
+ const b = new Queue({ tracks: ['b.mp3'], trackMetadata: [{ title: 'B' }] });
+
+ // b was constructed last, so it holds the handlers until a plays.
+ a.play();
+ await new Promise((r) => setTimeout(r, 0));
+ expect(a.isPlaying).toBe(true);
+ expect((mediaSession.metadata as unknown as { title: string }).title).toBe('A');
+
+ handlers.get('pause')!({ action: 'pause' });
+ expect(a.isPlaying).toBe(false);
+
+ // Once b plays, the controls follow it.
+ b.play();
+ await new Promise((r) => setTimeout(r, 0));
+ handlers.get('pause')!({ action: 'pause' });
+ expect(b.isPlaying).toBe(false);
+
+ a.destroy();
+ b.destroy();
+ } finally {
+ restore();
+ }
+ });
+});
diff --git a/tests/unit/queue.test.ts b/tests/unit/queue.test.ts
index f60cdc3..de84e8d 100644
--- a/tests/unit/queue.test.ts
+++ b/tests/unit/queue.test.ts
@@ -8,7 +8,14 @@
import { describe, it, expect, vi } from 'vitest';
import { Queue } from '../../src/Queue';
import type { TrackInfo } from '../../src/types';
-import { MockAudioBuffer, MockAudioContext, MockAudioElement, advanceTime, mockFetchSuccess, mockFetchFailure } from '../setup';
+import {
+ MockAudioBuffer,
+ MockAudioContext,
+ MockAudioElement,
+ advanceTime,
+ mockFetchSuccess,
+ mockFetchFailure,
+} from '../setup';
import { _resetAudioContext } from '../../src/utils/audioContext';
// Helper: inject a pre-decoded buffer into a track (bypasses fetch pipeline)
@@ -114,7 +121,10 @@ describe('Queue navigation', () => {
injectBuffer(q, 1, 180);
q.gotoTrack(1, true); // activates track 1 — buffer ready → plays via WebAudio
// Simulate being 30 seconds in by seeking
- const tracks = (q as unknown as { _tracks: unknown[] })._tracks as Array<{ seek: (t: number) => void; currentTime: number }>;
+ const tracks = (q as unknown as { _tracks: unknown[] })._tracks as Array<{
+ seek: (t: number) => void;
+ currentTime: number;
+ }>;
tracks[1].seek(30);
q.previous();
// Should seek to 0, not change track
@@ -259,7 +269,11 @@ describe('Queue destroy', () => {
});
describe('Queue TRACK_ENDED while paused', () => {
- type InternalTrack = { audioBuffer: AudioBuffer | null; audio: MockAudioElement; isBufferLoaded: boolean };
+ type InternalTrack = {
+ audioBuffer: AudioBuffer | null;
+ audio: MockAudioElement;
+ isBufferLoaded: boolean;
+ };
type InternalQueue = { _tracks: InternalTrack[] };
// Helper: grab the mock audio element for a given track index
@@ -434,7 +448,7 @@ describe('Queue MediaSession pause guard', () => {
// not corrupt state. This is what the guard prevents Chrome from doing.
type InternalTrack = { audio: MockAudioElement };
- type InternalQueue = { _tracks: InternalTrack[] };
+ type InternalQueue = { _tracks: InternalTrack[] };
it('calling pause() while already paused does not corrupt state', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
@@ -492,9 +506,7 @@ describe('Queue media session position updates via onProgress', () => {
q.play();
// Manually fire onProgress like the progress loop would
q.onProgress({ index: 0, currentTime: 10, duration: 120 } as TrackInfo);
- expect(spy).toHaveBeenCalledWith(
- expect.objectContaining({ currentTime: 10, duration: 120 }),
- );
+ expect(spy).toHaveBeenCalledWith(expect.objectContaining({ currentTime: 10, duration: 120 }));
});
it('onProgress ignores reports from non-current tracks', () => {
@@ -547,7 +559,9 @@ describe('Queue gapless transition progress', () => {
injectBuffer(q, 1, 180);
const internal = q as unknown as InternalQueue;
- const track1 = internal._tracks[1] as unknown as { scheduleGaplessStart: (when: number) => void };
+ const track1 = internal._tracks[1] as unknown as {
+ scheduleGaplessStart: (when: number) => void;
+ };
track1.scheduleGaplessStart(0); // schedule to start at ctx time 0
@@ -643,7 +657,7 @@ describe('Queue pause/resume after gapless transition', () => {
advanceTime(50); // track 1 at position 50 (ctx 50)
q.pause();
advanceTime(30); // paused for 30s (ctx 80)
- q.play(); // resume from 50 at ctx 80; PLAY action re-runs scheduleGapless
+ q.play(); // resume from 50 at ctx 80; PLAY action re-runs scheduleGapless
// Track 2 must be scheduled at the resumed end time: 80 + (200 - 50) = 230.
// The stale scheduled-start math gave 0 + 200 = 200 — 30s before track 1
@@ -683,7 +697,7 @@ describe('Queue seek cancels stale gapless schedule', () => {
injectBuffer(q, 0, 300);
q.play();
// Let fetch+decode settle so track 1 buffer is ready and gapless is scheduled
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
// Verify track 1 was gapless-scheduled
@@ -708,7 +722,7 @@ describe('Queue seek cancels stale gapless schedule', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
const oldStart = internal._tracks[1].scheduledStartContextTime;
@@ -728,7 +742,7 @@ describe('Queue seek cancels stale gapless schedule', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
// Track 1 should be in webaudio (gapless-scheduled)
@@ -782,7 +796,7 @@ describe('Queue pause cancels stale gapless schedule', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
expect(internal._scheduledNextIndex).toBe(1);
@@ -799,7 +813,7 @@ describe('Queue pause cancels stale gapless schedule', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
expect(internal._scheduledNextIndex).toBe(1);
@@ -840,7 +854,7 @@ describe('Queue next/previous/gotoTrack cancel stale gapless schedule', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
expect(internal._scheduledNextIndex).toBe(1);
@@ -857,7 +871,7 @@ describe('Queue next/previous/gotoTrack cancel stale gapless schedule', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
// Track 1 was gapless-scheduled (in webaudio state)
expect(q.tracks[1].machineState).toBe('webaudio');
@@ -874,7 +888,7 @@ describe('Queue next/previous/gotoTrack cancel stale gapless schedule', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
expect(internal._scheduledNextIndex).toBe(1);
@@ -890,7 +904,7 @@ describe('Queue next/previous/gotoTrack cancel stale gapless schedule', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
expect(internal._scheduledNextIndex).toBe(1);
@@ -906,7 +920,7 @@ describe('Queue next/previous/gotoTrack cancel stale gapless schedule', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
// Track 1 was gapless-scheduled
expect(q.tracks[1].machineState).toBe('webaudio');
@@ -924,7 +938,7 @@ describe('Queue next/previous/gotoTrack cancel stale gapless schedule', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
expect(internal._scheduledNextIndex).toBe(1);
@@ -998,7 +1012,7 @@ describe('Queue HTML5 fallback and background loading', () => {
expect(q.currentTrackIndex).toBe(1);
expect(q.isPlaying).toBe(true);
// Let the buffer decode complete
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
// Track 1's buffer should now be loaded
const internal = q as unknown as InternalQueue;
expect(internal._tracks[1].isBufferLoaded).toBe(true);
@@ -1007,7 +1021,11 @@ describe('Queue HTML5 fallback and background loading', () => {
});
describe('Queue preloading', () => {
- type InternalTrack = { audioBuffer: AudioBuffer | null; audio: HTMLAudioElement; isBufferLoaded: boolean };
+ type InternalTrack = {
+ audioBuffer: AudioBuffer | null;
+ audio: HTMLAudioElement;
+ isBufferLoaded: boolean;
+ };
type InternalQueue = { _tracks: InternalTrack[]; _scheduledNextIndex: number | null };
it('defers preloading next track when playing via HTML5', () => {
@@ -1026,7 +1044,7 @@ describe('Queue preloading', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
q.play();
// eslint-disable-next-line @typescript-eslint/no-explicit-any
- const urls = (fetchSpy.mock.calls as any[][]).map(c => String(c[0]));
+ const urls = (fetchSpy.mock.calls as any[][]).map((c) => String(c[0]));
expect(urls.some((u: string) => u.includes('a.mp3'))).toBe(true);
});
@@ -1037,7 +1055,7 @@ describe('Queue preloading', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'], playbackMethod: 'HTML5_ONLY' });
q.play();
// eslint-disable-next-line @typescript-eslint/no-explicit-any
- const urls = (fetchSpy.mock.calls as any[][]).map(c => String(c[0]));
+ const urls = (fetchSpy.mock.calls as any[][]).map((c) => String(c[0]));
expect(urls.every((u: string) => !u.includes('a.mp3'))).toBe(true);
});
@@ -1055,7 +1073,7 @@ describe('Queue preloading', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
injectBuffer(q, 0, 180);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const t1 = (q as unknown as InternalQueue)._tracks[1];
expect(q.tracks[1].webAudioLoadingState).toBe('LOADED');
expect(t1.isBufferLoaded).toBe(true);
@@ -1066,7 +1084,7 @@ describe('Queue preloading', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
injectBuffer(q, 0, 180);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
expect(q.tracks[1].webAudioLoadingState).toBe('ERROR');
});
@@ -1075,7 +1093,7 @@ describe('Queue preloading', () => {
const onStartNewTrack = vi.fn();
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'], onStartNewTrack });
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
tracks[0].audio.onended?.(new Event('ended'));
await Promise.resolve();
@@ -1088,7 +1106,7 @@ describe('Queue preloading', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
injectBuffer(q, 0, 180);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
expect(tracks[0].isBufferLoaded).toBe(true);
expect(tracks[1].isBufferLoaded).toBe(true);
@@ -1105,7 +1123,7 @@ describe('Queue preloading', () => {
// currentTime is driven by ctx.currentTime.
advanceTime(20);
// Let all fetch+decode promises settle
- for (let i = 0; i < 10; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 10; i++) await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
// Track 1: preloaded (1 ahead, immediate next — never deferred)
expect(tracks[1].isBufferLoaded).toBe(true);
@@ -1123,12 +1141,12 @@ describe('Queue preloading', () => {
injectBuffer(q, 0, 180);
q.play();
advanceTime(20);
- for (let i = 0; i < 10; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 10; i++) await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
// Advance to track 1
q.next();
advanceTime(20);
- for (let i = 0; i < 10; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 10; i++) await new Promise((r) => setTimeout(r, 0));
// Track 3 should now be preloaded (2 ahead of track 1)
expect(tracks[3].isBufferLoaded).toBe(true);
// Track 4 should still NOT be preloaded (beyond 2 ahead)
@@ -1142,15 +1160,15 @@ describe('Queue preloading', () => {
injectBuffer(q, 0, 180);
q.play();
q.gotoTrack(3, true);
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
// Go back to track 1
q.gotoTrack(1, true);
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
// Tracks 2 and 3 (ahead of track 1) should be preloaded
expect(tracks[2].isBufferLoaded).toBe(true);
expect(tracks[3].isBufferLoaded).toBe(true);
@@ -1162,15 +1180,15 @@ describe('Queue preloading', () => {
injectBuffer(q, 0, 180);
q.play();
// Wait for preload chain to complete (track 1, then track 2)
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
q.gotoTrack(3, true);
q.pause();
// Go back via previous() while paused — track 2 has buffer, plays WebAudio
q.previous();
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
// Track 3 (1 ahead of track 2) should be preloaded
expect(tracks[3].isBufferLoaded).toBe(true);
@@ -1181,9 +1199,9 @@ describe('Queue preloading', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3', 'd.mp3', 'e.mp3'] });
// Goto track 2 without auto-play (from idle state)
q.gotoTrack(2);
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
// Track 3 (1 ahead of track 2) should be preloaded
expect(tracks[3].isBufferLoaded).toBe(true);
@@ -1195,7 +1213,7 @@ describe('Queue preloading', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'], onStartNewTrack });
injectBuffer(q, 0, 180);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
// Track 1 should be preloaded (track 0 is Web Audio, so preload is immediate)
const tracks = (q as unknown as InternalQueue)._tracks;
expect(tracks[1].isBufferLoaded).toBe(true);
@@ -1241,7 +1259,7 @@ describe('Queue deferred preloading', () => {
mockFetchSuccess();
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'] });
q.play();
- for (let i = 0; i < 20; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 20; i++) await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
expect(tracks[0].playbackType).toBe('WEBAUDIO');
expect(tracks[1].isBufferLoaded).toBe(true);
@@ -1252,7 +1270,7 @@ describe('Queue deferred preloading', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'] });
injectBuffer(q, 0, 180);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
expect(tracks[1].isBufferLoaded).toBe(true);
});
@@ -1261,8 +1279,8 @@ describe('Queue deferred preloading', () => {
mockFetchSuccess();
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'] });
q.gotoTrack(0);
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
expect(tracks[1].isBufferLoaded).toBe(true);
});
@@ -1290,9 +1308,9 @@ describe('Queue preloading without prior AudioContext', () => {
// gotoTrack without playing — triggers preload on nearby tracks
q.gotoTrack(0);
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const tracks = (q as unknown as InternalQueue)._tracks;
// Next track should have been fetched+decoded despite no prior play()
@@ -1310,12 +1328,12 @@ describe('Queue preloading without prior AudioContext', () => {
// Directly call preload on track 1 (simulating what Queue._preloadAhead does)
(tracks[1] as unknown as { preload(): void }).preload();
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
// Fetch should have been triggered for track 1
// eslint-disable-next-line @typescript-eslint/no-explicit-any
- const urls = (fetchSpy.mock.calls as any[][]).map(c => String(c[0]));
+ const urls = (fetchSpy.mock.calls as any[][]).map((c) => String(c[0]));
expect(urls.some((u: string) => u.includes('b.mp3'))).toBe(true);
expect(tracks[1].isBufferLoaded).toBe(true);
});
@@ -1331,11 +1349,11 @@ describe('Queue preloading without prior AudioContext', () => {
const tracks = (q as unknown as InternalQueue)._tracks;
(tracks[1] as unknown as { preload(): void }).preload();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
// No fetch for audio buffer — Web Audio is not available
// eslint-disable-next-line @typescript-eslint/no-explicit-any
- const urls = (fetchSpy.mock.calls as any[][]).map(c => String(c[0]));
+ const urls = (fetchSpy.mock.calls as any[][]).map((c) => String(c[0]));
expect(urls.every((u: string) => !u.includes('b.mp3'))).toBe(true);
expect(tracks[1].isBufferLoaded).toBe(false);
});
@@ -1351,16 +1369,16 @@ describe('Queue preloading without prior AudioContext', () => {
// gotoTrack() creates the AudioContext and triggers preloading (paused, so no deferral)
q.gotoTrack(0);
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
// Track 1 should already be preloaded by gotoTrack()'s preload-ahead logic
expect(tracks[1].isBufferLoaded).toBe(true);
// Manually preload track 3 — should also work since ctx now exists
(tracks[3] as unknown as { preload(): void }).preload();
- await new Promise(r => setTimeout(r, 0));
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
expect(tracks[3].isBufferLoaded).toBe(true);
});
@@ -1478,7 +1496,11 @@ describe('Queue seek targets correct track', () => {
// _scheduledNextIndex cleanup after gapless transition
// ---------------------------------------------------------------------------
describe('Queue _scheduledNextIndex cleanup', () => {
- type InternalTrack = { audioBuffer: AudioBuffer | null; audio: MockAudioElement; isBufferLoaded: boolean };
+ type InternalTrack = {
+ audioBuffer: AudioBuffer | null;
+ audio: MockAudioElement;
+ isBufferLoaded: boolean;
+ };
type InternalQueue = { _tracks: InternalTrack[]; _scheduledNextIndex: number | null };
it('gapless-transitioned track is removed from _scheduledNextIndex', async () => {
@@ -1612,7 +1634,7 @@ describe('Queue gapless scheduling state', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
expect(internal._scheduledNextIndex).toBe(1);
@@ -1631,7 +1653,7 @@ describe('Queue gapless scheduling state', () => {
const q = new Queue({ tracks: ['a.mp3', 'b.mp3', 'c.mp3'] });
injectBuffer(q, 0, 300);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
expect(internal._scheduledNextIndex).toBe(1);
@@ -1662,7 +1684,7 @@ describe('Queue autoplay blocked', () => {
mockPlayBlocked(getTrackAudio(q, 0));
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
expect(q.isPaused).toBe(true);
expect(q.isPlaying).toBe(false);
@@ -1675,7 +1697,7 @@ describe('Queue autoplay blocked', () => {
mockPlayBlocked(audio);
q.play();
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
expect(q.isPaused).toBe(true);
@@ -1692,7 +1714,7 @@ describe('Queue autoplay blocked', () => {
mockPlayBlocked(getTrackAudio(q, 1));
q.gotoTrack(1, true);
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
expect(q.isPaused).toBe(true);
expect(q.isPlaying).toBe(false);
@@ -1728,7 +1750,7 @@ describe('Queue gapless scheduling lookahead guard', () => {
(internal._tracks[0].audio as unknown as MockAudioElement).duration = 300;
(internal._tracks[0].audio as unknown as MockAudioElement).currentTime = 0;
- for (let i = 0; i < 20; i++) await new Promise(r => setTimeout(r, 0));
+ for (let i = 0; i < 20; i++) await new Promise((r) => setTimeout(r, 0));
expect(q.tracks[0].playbackType).toBe('WEBAUDIO');
expect(internal._scheduledNextIndex).toBe(1);
@@ -1743,7 +1765,7 @@ describe('Queue gapless scheduling lookahead guard', () => {
q.play();
// Let fetch+decode finish for track 1
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
const internal = q as unknown as InternalQueue;
// WebAudio track with 300s remaining should still be scheduled (no guard)
diff --git a/tests/unit/timing.test.ts b/tests/unit/timing.test.ts
index 46cb6fc..b41de6e 100644
--- a/tests/unit/timing.test.ts
+++ b/tests/unit/timing.test.ts
@@ -48,7 +48,8 @@ describe('Track currentTime', () => {
});
it('returns frozen time when paused on WebAudio', async () => {
- const ctx = (globalThis as unknown as { _mockAudioContext: MockAudioContext })._mockAudioContext;
+ const ctx = (globalThis as unknown as { _mockAudioContext: MockAudioContext })
+ ._mockAudioContext;
const t = new Track({ trackUrl: 'test.mp3', index: 0, queue: makeQueue() });
// Inject a mock buffer directly to skip the fetch pipeline
@@ -138,7 +139,11 @@ describe('Track currentTime', () => {
});
it('reflects playbackRate after pause/resume', () => {
- const t = new Track({ trackUrl: 'test.mp3', index: 0, queue: makeQueue({ playbackRate: 1.5 }) });
+ const t = new Track({
+ trackUrl: 'test.mp3',
+ index: 0,
+ queue: makeQueue({ playbackRate: 1.5 }),
+ });
t.audioBuffer = new MockAudioBuffer(300) as unknown as AudioBuffer;
t.play();
advanceTime(10); // 10 wall-clock seconds at 1.5x = 15 track seconds
@@ -327,14 +332,18 @@ describe('Track mid-stream HTML5 → Web Audio crossover', () => {
(t as unknown as { _actor: { send: (e: { type: string }) => void } })._actor.send({
type: 'LOOKAHEAD_REACHED',
});
- const preSnap = (t as unknown as { _actor: { getSnapshot: () => { context: { notifiedLookahead: boolean } } } })._actor.getSnapshot();
+ const preSnap = (
+ t as unknown as { _actor: { getSnapshot: () => { context: { notifiedLookahead: boolean } } } }
+ )._actor.getSnapshot();
expect(preSnap.context.notifiedLookahead).toBe(true);
// Buffer arrives → crossover
t.audioBuffer = new MockAudioBuffer(300) as unknown as AudioBuffer;
sendBufferReady(t);
- const postSnap = (t as unknown as { _actor: { getSnapshot: () => { context: { notifiedLookahead: boolean } } } })._actor.getSnapshot();
+ const postSnap = (
+ t as unknown as { _actor: { getSnapshot: () => { context: { notifiedLookahead: boolean } } } }
+ )._actor.getSnapshot();
expect(postSnap.context.notifiedLookahead).toBe(false);
});
});
@@ -359,9 +368,9 @@ describe('Track scheduleGaplessStart', () => {
const t = new Track({ trackUrl: 'test.mp3', index: 0, queue: makeQueue() });
t.audioBuffer = new MockAudioBuffer(300) as unknown as AudioBuffer;
- advanceTime(10); // ctx.currentTime = 10
+ advanceTime(10); // ctx.currentTime = 10
t.scheduleGaplessStart(10); // _waRefCtxTime = 10, _waRefTrackTime = 0
- advanceTime(5); // ctx.currentTime = 15
+ advanceTime(5); // ctx.currentTime = 15
// currentTime = 0 + (15 - 10) * 1 = 5
expect(t.currentTime).toBeCloseTo(5, 1);
@@ -426,7 +435,7 @@ describe('Track scheduleGaplessStart', () => {
t.startProgressLoop();
// RAF is mocked to run via setTimeout(cb, 0)
- await new Promise(r => setTimeout(r, 0));
+ await new Promise((r) => setTimeout(r, 0));
expect(onProgress).toHaveBeenCalled();
const info = onProgress.mock.calls[0][0];
diff --git a/v4-architecture.md b/v4-architecture.md
index 813e03c..cc67084 100644
--- a/v4-architecture.md
+++ b/v4-architecture.md
@@ -60,8 +60,8 @@ import type {
AddTrackOptions,
TrackInfo,
TrackMetadata,
- PlaybackType, // 'HTML5' | 'WEBAUDIO'
- WebAudioLoadingState // 'NONE' | 'LOADING' | 'LOADED' | 'ERROR'
+ PlaybackType, // 'HTML5' | 'WEBAUDIO'
+ WebAudioLoadingState, // 'NONE' | 'LOADING' | 'LOADED' | 'ERROR'
} from 'gapless';
```
@@ -78,44 +78,44 @@ const queue = new Queue({
webAudioIsDisabled: false,
// Callbacks
- onProgress: (info: TrackInfo) => {}, // ~60 fps while playing
- onStartNewTrack: (info: TrackInfo) => {}, // any new track becomes current
- onPlayNextTrack: (info: TrackInfo) => {}, // advanced forward
- onPlayPreviousTrack: (info: TrackInfo) => {}, // went backward
- onEnded: () => {}, // last track finished
- onError: (error: Error) => {}, // playback error
- onPlayBlocked: () => {}, // browser blocked autoplay
- onDebug: (msg: string) => {}, // internal debug messages
+ onProgress: (info: TrackInfo) => {}, // ~60 fps while playing
+ onStartNewTrack: (info: TrackInfo) => {}, // any new track becomes current
+ onPlayNextTrack: (info: TrackInfo) => {}, // advanced forward
+ onPlayPreviousTrack: (info: TrackInfo) => {}, // went backward
+ onEnded: () => {}, // last track finished
+ onError: (error: Error) => {}, // playback error
+ onPlayBlocked: () => {}, // browser blocked autoplay
+ onDebug: (msg: string) => {}, // internal debug messages
});
```
### Methods
-| Method | Description |
-|---|---|
-| `play()` | Start or resume playback of the current track. |
-| `pause()` | Pause the current track. |
-| `togglePlayPause()` | Toggle between play and pause. |
-| `next()` | Advance to the next track. No-op on the last track. |
-| `previous()` | Go to previous track, or restart current if > 8 s in. |
-| `gotoTrack(index, playImmediately?)` | Jump to a specific track by index. |
-| `seek(time)` | Seek to a position in seconds. |
-| `setVolume(volume)` | Set volume (0.0–1.0, clamped). |
-| `addTrack(url, options?)` | Append a track to the queue. |
-| `removeTrack(index)` | Remove a track by index (reindexes remaining). |
-| `resumeAudioContext()` | Create + resume the AudioContext. **Must be called from a user gesture.** |
-| `destroy()` | Stop playback and release all resources. |
+| Method | Description |
+| ------------------------------------ | ------------------------------------------------------------------------- |
+| `play()` | Start or resume playback of the current track. |
+| `pause()` | Pause the current track. |
+| `togglePlayPause()` | Toggle between play and pause. |
+| `next()` | Advance to the next track. No-op on the last track. |
+| `previous()` | Go to previous track, or restart current if > 8 s in. |
+| `gotoTrack(index, playImmediately?)` | Jump to a specific track by index. |
+| `seek(time)` | Seek to a position in seconds. |
+| `setVolume(volume)` | Set volume (0.0–1.0, clamped). |
+| `addTrack(url, options?)` | Append a track to the queue. |
+| `removeTrack(index)` | Remove a track by index (reindexes remaining). |
+| `resumeAudioContext()` | Create + resume the AudioContext. **Must be called from a user gesture.** |
+| `destroy()` | Stop playback and release all resources. |
### Getters
-| Getter | Type | Description |
-|---|---|---|
-| `currentTrack` | `TrackInfo \| undefined` | Snapshot of the current track. |
-| `currentTrackIndex` | `number` | Zero-based index of the current track. |
-| `tracks` | `readonly TrackInfo[]` | Snapshot array of all tracks. |
-| `isPlaying` | `boolean` | Queue is in playing state. |
-| `isPaused` | `boolean` | Queue is in paused state. |
-| `volume` | `number` | Current volume (0.0–1.0). |
+| Getter | Type | Description |
+| ------------------- | ------------------------ | -------------------------------------- |
+| `currentTrack` | `TrackInfo \| undefined` | Snapshot of the current track. |
+| `currentTrackIndex` | `number` | Zero-based index of the current track. |
+| `tracks` | `readonly TrackInfo[]` | Snapshot array of all tracks. |
+| `isPlaying` | `boolean` | Queue is in playing state. |
+| `isPaused` | `boolean` | Queue is in paused state. |
+| `volume` | `number` | Current volume (0.0–1.0). |
### TrackInfo
@@ -125,7 +125,7 @@ All callbacks and getters return `TrackInfo` — a plain data snapshot with no m
interface TrackInfo {
index: number;
currentTime: number;
- duration: number; // NaN until metadata loaded
+ duration: number; // NaN until metadata loaded
isPlaying: boolean;
isPaused: boolean;
volume: number;
@@ -143,7 +143,7 @@ interface TrackMetadata {
title?: string;
artist?: string;
album?: string;
- artwork?: MediaImage[]; // for Media Session API
+ artwork?: MediaImage[]; // for Media Session API
[key: string]: unknown;
}
```
@@ -190,28 +190,35 @@ export function useGapless(tracks: string[], metadata: { title: string }[]) {
q.destroy();
queueRef.current = null;
};
- }, []); // stable — create once
+ }, []); // stable — create once
// Wrap user-gesture actions to ensure AudioContext is alive
const withCtx = useCallback((fn: () => void) => {
const q = queueRef.current;
if (!q) return;
- if (ctxReady.current) { fn(); return; }
+ if (ctxReady.current) {
+ fn();
+ return;
+ }
q.resumeAudioContext().then(() => {
ctxReady.current = true;
fn();
});
}, []);
- const play = useCallback(() => withCtx(() => queueRef.current?.play()), [withCtx]);
- const pause = useCallback(() => queueRef.current?.pause(), []);
- const toggle = useCallback(() => withCtx(() => queueRef.current?.togglePlayPause()), [withCtx]);
- const next = useCallback(() => withCtx(() => queueRef.current?.next()), [withCtx]);
- const prev = useCallback(() => withCtx(() => queueRef.current?.previous()), [withCtx]);
- const seek = useCallback((t: number) => queueRef.current?.seek(t), []);
- const goto = useCallback((i: number) => withCtx(() => {
- queueRef.current?.gotoTrack(i, true);
- }), [withCtx]);
+ const play = useCallback(() => withCtx(() => queueRef.current?.play()), [withCtx]);
+ const pause = useCallback(() => queueRef.current?.pause(), []);
+ const toggle = useCallback(() => withCtx(() => queueRef.current?.togglePlayPause()), [withCtx]);
+ const next = useCallback(() => withCtx(() => queueRef.current?.next()), [withCtx]);
+ const prev = useCallback(() => withCtx(() => queueRef.current?.previous()), [withCtx]);
+ const seek = useCallback((t: number) => queueRef.current?.seek(t), []);
+ const goto = useCallback(
+ (i: number) =>
+ withCtx(() => {
+ queueRef.current?.gotoTrack(i, true);
+ }),
+ [withCtx]
+ );
return { state, currentTrack, tracks: allTracks, play, pause, toggle, next, prev, seek, goto };
}
@@ -274,12 +281,12 @@ Each Track has its own machine managing its playback backend and loading state.
**States:**
-| State | Meaning |
-|---|---|
-| `idle` | Constructed, not active. |
-| `html5` | HTML5 `