From e2aea7da8e0e24a98103f0f74a0c5d9437e88013 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 5 Sep 2024 20:59:23 +0200 Subject: [PATCH] HLS.js wrapper package (#16) * Added hlsjs wrapper package * Added Basic UI * Visibility effect on controls * Seekbar delta calculation in order not to jump back to previously seeked offset for a brief amount of time --- .../src/components/OpenApiReference.tsx | 2 +- packages/dashboard/src/hooks/useJob.ts | 13 +- packages/dashboard/src/pages/JobPage.tsx | 2 +- packages/dashboard/src/pages/JobsPage.tsx | 28 +- packages/hlsjs/.gitignore | 24 + packages/hlsjs/README.md | 9 + .../hlsjs__feature__interstitials/hls.d.ts | 3705 ++ .../hlsjs__feature__interstitials/hls.mjs | 33568 ++++++++++++++++ .../hlsjs__feature__interstitials/hls.mjs.map | 1 + .../hlsjs__feature__interstitials/index.mjs | 1 + .../package.json | 6 + packages/hlsjs/index.html | 32 + .../lib/Controls/components/CheckList.scss | 20 + .../lib/Controls/components/CheckList.tsx | 25 + .../lib/Controls/components/Controls.scss | 36 + .../lib/Controls/components/Controls.tsx | 74 + .../hlsjs/lib/Controls/components/Pane.scss | 15 + .../hlsjs/lib/Controls/components/Pane.tsx | 13 + .../lib/Controls/components/Progress.scss | 68 + .../lib/Controls/components/Progress.tsx | 87 + .../lib/Controls/components/QualitiesPane.tsx | 23 + .../lib/Controls/components/Settings.scss | 23 + .../lib/Controls/components/Settings.tsx | 82 + .../lib/Controls/components/SettingsPane.scss | 11 + .../lib/Controls/components/SettingsPane.tsx | 16 + .../lib/Controls/components/SqButton.scss | 47 + .../lib/Controls/components/SqButton.tsx | 18 + .../Controls/components/TextAudioPane.scss | 3 + .../lib/Controls/components/TextAudioPane.tsx | 40 + packages/hlsjs/lib/Controls/hooks/useDelta.ts | 6 + .../hlsjs/lib/Controls/hooks/usePrevious.ts | 24 + .../hlsjs/lib/Controls/hooks/useSettings.ts | 13 + .../hlsjs/lib/Controls/hooks/useVisible.ts | 46 + packages/hlsjs/lib/Controls/icons/pause.svg | 5 + packages/hlsjs/lib/Controls/icons/play.svg | 4 + .../hlsjs/lib/Controls/icons/settings.svg | 5 + .../hlsjs/lib/Controls/icons/subtitles.svg | 10 + packages/hlsjs/lib/Controls/index.scss | 25 + packages/hlsjs/lib/Controls/index.tsx | 1 + packages/hlsjs/lib/main.ts | 262 + packages/hlsjs/package.json | 45 + packages/hlsjs/src/main.tsx | 22 + packages/hlsjs/src/vite-env.d.ts | 2 + packages/hlsjs/tsconfig.app.json | 24 + packages/hlsjs/tsconfig.json | 7 + packages/hlsjs/tsconfig.node.json | 18 + packages/hlsjs/vite.config.ts | 31 + packages/stitcher/src/playlist.ts | 10 + pnpm-lock.yaml | 1118 +- 49 files changed, 39579 insertions(+), 91 deletions(-) create mode 100644 packages/hlsjs/.gitignore create mode 100644 packages/hlsjs/README.md create mode 100644 packages/hlsjs/external/hlsjs__feature__interstitials/hls.d.ts create mode 100644 packages/hlsjs/external/hlsjs__feature__interstitials/hls.mjs create mode 100644 packages/hlsjs/external/hlsjs__feature__interstitials/hls.mjs.map create mode 100644 packages/hlsjs/external/hlsjs__feature__interstitials/index.mjs create mode 100644 packages/hlsjs/external/hlsjs__feature__interstitials/package.json create mode 100644 packages/hlsjs/index.html create mode 100644 packages/hlsjs/lib/Controls/components/CheckList.scss create mode 100644 packages/hlsjs/lib/Controls/components/CheckList.tsx create mode 100644 packages/hlsjs/lib/Controls/components/Controls.scss create mode 100644 packages/hlsjs/lib/Controls/components/Controls.tsx create mode 100644 packages/hlsjs/lib/Controls/components/Pane.scss create mode 100644 packages/hlsjs/lib/Controls/components/Pane.tsx create mode 100644 packages/hlsjs/lib/Controls/components/Progress.scss create mode 100644 packages/hlsjs/lib/Controls/components/Progress.tsx create mode 100644 packages/hlsjs/lib/Controls/components/QualitiesPane.tsx create mode 100644 packages/hlsjs/lib/Controls/components/Settings.scss create mode 100644 packages/hlsjs/lib/Controls/components/Settings.tsx create mode 100644 packages/hlsjs/lib/Controls/components/SettingsPane.scss create mode 100644 packages/hlsjs/lib/Controls/components/SettingsPane.tsx create mode 100644 packages/hlsjs/lib/Controls/components/SqButton.scss create mode 100644 packages/hlsjs/lib/Controls/components/SqButton.tsx create mode 100644 packages/hlsjs/lib/Controls/components/TextAudioPane.scss create mode 100644 packages/hlsjs/lib/Controls/components/TextAudioPane.tsx create mode 100644 packages/hlsjs/lib/Controls/hooks/useDelta.ts create mode 100644 packages/hlsjs/lib/Controls/hooks/usePrevious.ts create mode 100644 packages/hlsjs/lib/Controls/hooks/useSettings.ts create mode 100644 packages/hlsjs/lib/Controls/hooks/useVisible.ts create mode 100644 packages/hlsjs/lib/Controls/icons/pause.svg create mode 100644 packages/hlsjs/lib/Controls/icons/play.svg create mode 100644 packages/hlsjs/lib/Controls/icons/settings.svg create mode 100644 packages/hlsjs/lib/Controls/icons/subtitles.svg create mode 100644 packages/hlsjs/lib/Controls/index.scss create mode 100644 packages/hlsjs/lib/Controls/index.tsx create mode 100644 packages/hlsjs/lib/main.ts create mode 100644 packages/hlsjs/package.json create mode 100644 packages/hlsjs/src/main.tsx create mode 100644 packages/hlsjs/src/vite-env.d.ts create mode 100644 packages/hlsjs/tsconfig.app.json create mode 100644 packages/hlsjs/tsconfig.json create mode 100644 packages/hlsjs/tsconfig.node.json create mode 100644 packages/hlsjs/vite.config.ts diff --git a/packages/dashboard/src/components/OpenApiReference.tsx b/packages/dashboard/src/components/OpenApiReference.tsx index a42c5f12..212b0028 100644 --- a/packages/dashboard/src/components/OpenApiReference.tsx +++ b/packages/dashboard/src/components/OpenApiReference.tsx @@ -1,7 +1,7 @@ import { ApiReferenceReact } from "@scalar/api-reference-react"; import { tsr } from "@/tsr"; -import "@scalar/api-reference-react/style.css"; import { useEffect } from "react"; +import "@scalar/api-reference-react/style.css"; type OpenApiReferenceProps = { url: string; diff --git a/packages/dashboard/src/hooks/useJob.ts b/packages/dashboard/src/hooks/useJob.ts index 1a492fc1..4cecf33d 100644 --- a/packages/dashboard/src/hooks/useJob.ts +++ b/packages/dashboard/src/hooks/useJob.ts @@ -1,28 +1,23 @@ import { tsr } from "@/tsr"; -import { useEffect, useRef } from "react"; import type { JobDto } from "@/tsr"; export function useJob(id: string) { - const lastResultRef = useRef(); - const { data } = tsr.getJob.useQuery({ queryKey: ["jobsFromRoot", id], queryData: { params: { id }, query: { fromRoot: true } }, refetchInterval: 2000, }); - useEffect(() => { - if (data) { - lastResultRef.current = data.body; - } - }, [data]); + const rootJob = data?.body; - const rootJob = data?.body ?? lastResultRef.current; if (!rootJob) { return null; } const job = findJob(rootJob, id); + if (!job) { + throw new Error("Job not found in tree"); + } return { job, rootJob }; } diff --git a/packages/dashboard/src/pages/JobPage.tsx b/packages/dashboard/src/pages/JobPage.tsx index 450b9a35..3bcbf7ca 100644 --- a/packages/dashboard/src/pages/JobPage.tsx +++ b/packages/dashboard/src/pages/JobPage.tsx @@ -17,7 +17,7 @@ export function JobPage() { const { job, rootJob } = result; return ( -
+
+ ); +} diff --git a/packages/hlsjs/lib/Controls/components/TextAudioPane.scss b/packages/hlsjs/lib/Controls/components/TextAudioPane.scss new file mode 100644 index 00000000..83bcefb6 --- /dev/null +++ b/packages/hlsjs/lib/Controls/components/TextAudioPane.scss @@ -0,0 +1,3 @@ +.mix-textaudiopane { + display: flex; +} diff --git a/packages/hlsjs/lib/Controls/components/TextAudioPane.tsx b/packages/hlsjs/lib/Controls/components/TextAudioPane.tsx new file mode 100644 index 00000000..63f4cabe --- /dev/null +++ b/packages/hlsjs/lib/Controls/components/TextAudioPane.tsx @@ -0,0 +1,40 @@ +import { CheckList } from "./CheckList"; +import { Pane } from "./Pane"; +import type { HlsFacade, HlsState } from "../../main"; + +type QualitiesPaneProps = { + state: HlsState; + facade: HlsFacade; +}; + +export function TextAudioPane({ facade, state }: QualitiesPaneProps) { + return ( +
+ + facade.setSubtitleTrack(id)} + items={state.subtitleTracks.map((subtitleTrack) => ({ + id: subtitleTrack.id, + label: toLang(subtitleTrack.name), + checked: subtitleTrack.active, + }))} + /> + + + facade.setAudioTrack(id)} + items={state.audioTracks.map((audioTrack) => ({ + id: audioTrack.id, + label: toLang(audioTrack.name), + checked: audioTrack.active, + }))} + /> + +
+ ); +} + +function toLang(name: string) { + const lower = name.toLowerCase(); + return lower.charAt(0).toUpperCase() + lower.slice(1); +} diff --git a/packages/hlsjs/lib/Controls/hooks/useDelta.ts b/packages/hlsjs/lib/Controls/hooks/useDelta.ts new file mode 100644 index 00000000..c99445c3 --- /dev/null +++ b/packages/hlsjs/lib/Controls/hooks/useDelta.ts @@ -0,0 +1,6 @@ +import usePrevious from "./usePrevious"; + +export function useDelta(value: number) { + const prev = usePrevious(value); + return prev === undefined ? 0 : value - prev; +} diff --git a/packages/hlsjs/lib/Controls/hooks/usePrevious.ts b/packages/hlsjs/lib/Controls/hooks/usePrevious.ts new file mode 100644 index 00000000..290ec241 --- /dev/null +++ b/packages/hlsjs/lib/Controls/hooks/usePrevious.ts @@ -0,0 +1,24 @@ +import { useEffect, useRef } from "react"; + +/** + * Tracks previous state of a value. + * + * @param value Props, state or any other calculated value. + * @returns Value from the previous render of the enclosing component. + * + * @example + * function Component() { + * const [count, setCount] = useState(0); + * const prevCount = usePrevious(count); + * // ... + * return `Now: ${count}, before: ${prevCount}`; + * } + */ +export default function usePrevious(value: T): T | undefined { + // Source: https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state + const ref = useRef(); + useEffect(() => { + ref.current = value; + }); + return ref.current; +} diff --git a/packages/hlsjs/lib/Controls/hooks/useSettings.ts b/packages/hlsjs/lib/Controls/hooks/useSettings.ts new file mode 100644 index 00000000..11a2e285 --- /dev/null +++ b/packages/hlsjs/lib/Controls/hooks/useSettings.ts @@ -0,0 +1,13 @@ +import { useState } from "react"; + +export type SettingsMode = "text-audio" | "quality"; + +export function useSettings() { + const [settings, setSettings_] = useState(null); + + const setSettings = (value: SettingsMode) => { + setSettings_((v) => (v !== value ? value : null)); + }; + + return [settings, setSettings] as const; +} diff --git a/packages/hlsjs/lib/Controls/hooks/useVisible.ts b/packages/hlsjs/lib/Controls/hooks/useVisible.ts new file mode 100644 index 00000000..f219ce15 --- /dev/null +++ b/packages/hlsjs/lib/Controls/hooks/useVisible.ts @@ -0,0 +1,46 @@ +import { useEffect, useRef, useState } from "react"; + +export function useVisible() { + const ref = useRef(); + const elementRef = useRef(null); + + const [visible, setVisible] = useState(false); + + useEffect(() => { + const container = elementRef.current?.closest(".mix-container") as + | HTMLDivElement + | undefined; + + if (!container) { + return; + } + + const onPointerMove = () => { + clearTimeout(ref.current); + + setVisible(true); + + ref.current = setTimeout(() => { + setVisible(false); + }, 3000); + }; + + const onPointerLeave = () => { + clearTimeout(ref.current); + setVisible(false); + }; + + container.addEventListener("pointermove", onPointerMove); + container.addEventListener("pointerleave", onPointerLeave); + + return () => { + container.removeEventListener("pointermove", onPointerMove); + container.removeEventListener("pointerleave", onPointerLeave); + }; + }, []); + + return { + visible, + elementRef, + }; +} diff --git a/packages/hlsjs/lib/Controls/icons/pause.svg b/packages/hlsjs/lib/Controls/icons/pause.svg new file mode 100644 index 00000000..888e7e3d --- /dev/null +++ b/packages/hlsjs/lib/Controls/icons/pause.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/packages/hlsjs/lib/Controls/icons/play.svg b/packages/hlsjs/lib/Controls/icons/play.svg new file mode 100644 index 00000000..8f0f5211 --- /dev/null +++ b/packages/hlsjs/lib/Controls/icons/play.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/packages/hlsjs/lib/Controls/icons/settings.svg b/packages/hlsjs/lib/Controls/icons/settings.svg new file mode 100644 index 00000000..5db418ba --- /dev/null +++ b/packages/hlsjs/lib/Controls/icons/settings.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/packages/hlsjs/lib/Controls/icons/subtitles.svg b/packages/hlsjs/lib/Controls/icons/subtitles.svg new file mode 100644 index 00000000..64034225 --- /dev/null +++ b/packages/hlsjs/lib/Controls/icons/subtitles.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/packages/hlsjs/lib/Controls/index.scss b/packages/hlsjs/lib/Controls/index.scss new file mode 100644 index 00000000..055c97ec --- /dev/null +++ b/packages/hlsjs/lib/Controls/index.scss @@ -0,0 +1,25 @@ +$size: 1em; +$size-sm: 0.85em; + +@import "./components//Controls.scss"; +@import "./components/Progress.scss"; +@import "./components//Settings.scss"; +@import "./components/SettingsPane.scss"; +@import "./components/CheckList.scss"; +@import "./components/Pane.scss"; +@import "./components/TextAudioPane.scss"; +@import "./components/SqButton.scss"; + +.mix-container { + aspect-ratio: 16 / 9; + position: relative; + background-color: #000000; + overflow: hidden; + + video { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + } +} diff --git a/packages/hlsjs/lib/Controls/index.tsx b/packages/hlsjs/lib/Controls/index.tsx new file mode 100644 index 00000000..7e6eec34 --- /dev/null +++ b/packages/hlsjs/lib/Controls/index.tsx @@ -0,0 +1 @@ +export { Controls } from "./components/Controls"; diff --git a/packages/hlsjs/lib/main.ts b/packages/hlsjs/lib/main.ts new file mode 100644 index 00000000..648bb7f1 --- /dev/null +++ b/packages/hlsjs/lib/main.ts @@ -0,0 +1,262 @@ +import Hls from "hls.js"; +import update from "immutability-helper"; +import EventEmitter from "eventemitter3"; +import type { Spec } from "immutability-helper"; + +export { Controls as HlsControls } from "./Controls"; + +export type HlsInterstitial = { + seekAllowed: boolean; +}; + +export type HlsQuality = { + id: number; + height: number; + active: boolean; +}; + +export type HlsSubtitleTrack = { + id: number; + name: string; + active: boolean; +}; + +export type HlsAudioTrack = { + id: number; + name: string; + active: boolean; +}; + +export type HlsSeekRange = { + start: number; + end: number; +}; + +export type HlsState = { + playheadState: "idle" | "play" | "pause"; + time: number; + seekRange: HlsSeekRange; + interstitial: HlsInterstitial | null; + cuePoints: number[]; + qualities: HlsQuality[]; + subtitleTracks: HlsSubtitleTrack[]; + audioTracks: HlsAudioTrack[]; +}; + +export type HlsFacadeEvent = { + "*": () => void; +}; + +export class HlsFacade extends EventEmitter { + private intervalId_: number | undefined; + + constructor(public hls: Hls) { + super(); + + hls.once(Hls.Events.BUFFER_CREATED, () => { + this.syncState_(); + }); + + hls.on(Hls.Events.LEVEL_SWITCHING, () => { + this.syncQualities_(); + }); + + hls.on(Hls.Events.AUDIO_TRACK_SWITCHING, () => { + this.syncAudioTracks_(); + }); + + hls.on(Hls.Events.SUBTITLE_TRACK_SWITCH, () => { + this.syncSubtitleTracks_(); + }); + + hls.on(Hls.Events.INTERSTITIAL_ASSET_PLAYER_CREATED, (_, data) => { + data.player.once(Hls.Events.BUFFER_CREATED, () => { + this.syncState_(); + }); + }); + + hls.on(Hls.Events.INTERSTITIAL_STARTED, (_, data) => { + const interstitial: HlsInterstitial = { + seekAllowed: !data.event.restrictions.skip, + }; + this.setState_({ + interstitial: { + $set: interstitial, + }, + }); + }); + + hls.on(Hls.Events.INTERSTITIAL_ENDED, () => { + this.setState_({ interstitial: { $set: null } }); + }); + + hls.on(Hls.Events.INTERSTITIALS_UPDATED, (_, data) => { + this.setState_({ + cuePoints: { + $set: data.schedule.reduce((acc, item) => { + if (!acc.includes(item.start)) { + acc.push(item.start); + } + return acc; + }, []), + }, + }); + }); + } + + destroy() { + clearInterval(this.intervalId_); + } + + state: HlsState = { + playheadState: "idle", + time: 0, + seekRange: { start: 0, end: 0 }, + interstitial: null, + cuePoints: [], + qualities: [], + subtitleTracks: [], + audioTracks: [], + }; + + private onTick_() { + const { integrated } = this.getInterstitialsManager_(); + + this.setState_({ + time: { $set: integrated.currentTime }, + seekRange: { $set: { start: 0, end: integrated.duration } }, + }); + } + + playOrPause() { + const media = this.getMedia_(); + const { playheadState } = this.state; + + const shouldPause = playheadState === "play"; + if (shouldPause) { + media.pause(); + } else { + if (playheadState === "idle") { + media.autoplay = true; + } + media.play(); + } + + this.setState_({ + playheadState: { $set: shouldPause ? "pause" : "play" }, + }); + } + + seekTo(targetTime: number) { + this.getInterstitialsManager_().integrated.seekTo(targetTime); + } + + setQuality(id: number | null) { + if (id) { + this.hls.nextLevel = id - 1; + } else { + this.hls.nextLevel = -1; + } + } + + setSubtitleTrack(id: number | null) { + if (id) { + this.hls.subtitleTrack = id - 1; + } else { + this.hls.subtitleTrack = -1; + } + } + + setAudioTrack(id: number | null) { + if (id) { + this.hls.audioTrack = id - 1; + } else { + this.hls.audioTrack = -1; + } + } + + private setState_(spec: Spec) { + const nextState = update(this.state, spec); + if (nextState !== this.state) { + this.state = nextState; + } + this.emit("*"); + } + + private getInterstitialsManager_() { + const { interstitialsManager } = this.hls; + if (!interstitialsManager) { + throw new HlsFacadeNoInterstitialsManager(); + } + return interstitialsManager; + } + + private getMedia_() { + const manager = this.getInterstitialsManager_(); + const media = manager.bufferingPlayer?.media ?? this.hls.media; + if (!media) { + throw new HlsFacadeNoMedia(); + } + return media; + } + + private syncState_() { + clearInterval(this.intervalId_); + this.intervalId_ = setInterval(() => this.onTick_(), 500); + this.onTick_(); + } + + private syncQualities_() { + const qualities = this.hls.levels.map((level, index) => ({ + id: index + 1, + height: level.height ?? 0, + active: index === this.hls.nextLoadLevel, + })); + + qualities.sort((a, b) => b.height - a.height); + + this.setState_({ + qualities: { $set: qualities }, + }); + } + + private syncAudioTracks_() { + const audioTracks = this.hls.audioTracks.map( + (audioTrack, index) => ({ + id: index + 1, + name: audioTrack.name, + active: index === this.hls.audioTrack, + }), + ); + + this.setState_({ + audioTracks: { $set: audioTracks }, + }); + } + + private syncSubtitleTracks_() { + const subtitleTracks = this.hls.subtitleTracks.map( + (subtitleTrack, index) => ({ + id: index + 1, + name: subtitleTrack.name, + active: index === this.hls.subtitleTrack, + }), + ); + + this.setState_({ + subtitleTracks: { $set: subtitleTracks }, + }); + } +} + +export class HlsFacadeNoMedia extends Error { + constructor() { + super("No available media found"); + } +} + +export class HlsFacadeNoInterstitialsManager extends Error { + constructor() { + super("No interstitials manager found"); + } +} diff --git a/packages/hlsjs/package.json b/packages/hlsjs/package.json new file mode 100644 index 00000000..1ff224fd --- /dev/null +++ b/packages/hlsjs/package.json @@ -0,0 +1,45 @@ +{ + "name": "@mixwave/hlsjs", + "private": true, + "version": "0.0.0", + "type": "module", + "files": [ + "dist" + ], + "main": "./dist/main.umd.cjs", + "module": "./dist/main.js", + "exports": { + ".": { + "import": "./dist/main.js", + "require": "./dist/main.umd.cjs" + } + }, + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build" + }, + "peerDependencies": { + "hls.js": "^1.5.15", + "react": "^18.3.1" + }, + "dependencies": { + "clsx": "^2.1.1", + "eventemitter3": "^5.0.1", + "immutability-helper": "^3.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/eventemitter3": "^2.0.2", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "globals": "^15.9.0", + "sass-embedded": "^1.78.0", + "typescript": "^5.5.3", + "vite": "^5.4.1", + "vite-plugin-dts": "^4.1.0", + "vite-plugin-svgr": "^4.2.0", + "vite-tsconfig-paths": "^5.0.1" + } +} diff --git a/packages/hlsjs/src/main.tsx b/packages/hlsjs/src/main.tsx new file mode 100644 index 00000000..03035e75 --- /dev/null +++ b/packages/hlsjs/src/main.tsx @@ -0,0 +1,22 @@ +import { HlsFacade, HlsControls } from "../lib/main"; +import Hls from "hls.js"; +import ReactDOM from "react-dom/client"; + +const hls = new Hls(); + +const mediaElement = document.querySelector("video")!; +hls.attachMedia(mediaElement); + +const facade = new HlsFacade(hls); + +Object.assign(window, { facade }); + +// hls.config.startPosition = 10; + +hls.loadSource( + "http://127.0.0.1:52002/session/e158bbf7-6a25-4ab5-b5a0-806fe85f862f/master.m3u8", +); + +const root = ReactDOM.createRoot(document.getElementById("root")!); + +root.render(); diff --git a/packages/hlsjs/src/vite-env.d.ts b/packages/hlsjs/src/vite-env.d.ts new file mode 100644 index 00000000..b1f45c78 --- /dev/null +++ b/packages/hlsjs/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/packages/hlsjs/tsconfig.app.json b/packages/hlsjs/tsconfig.app.json new file mode 100644 index 00000000..6e26486c --- /dev/null +++ b/packages/hlsjs/tsconfig.app.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "es2020", + "useDefineForClassFields": true, + "lib": ["es2020", "dom", "dom.iterable"], + "module": "esnext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "baseUrl": ".", + "paths": { + "hls.js": ["./external/hlsjs__feature__interstitials/hls"] + } + }, + "include": ["src", "lib"] +} diff --git a/packages/hlsjs/tsconfig.json b/packages/hlsjs/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/packages/hlsjs/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/packages/hlsjs/tsconfig.node.json b/packages/hlsjs/tsconfig.node.json new file mode 100644 index 00000000..342ca4f3 --- /dev/null +++ b/packages/hlsjs/tsconfig.node.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "es2022", + "lib": ["es2023"], + "module": "esnext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/hlsjs/vite.config.ts b/packages/hlsjs/vite.config.ts new file mode 100644 index 00000000..727d19d4 --- /dev/null +++ b/packages/hlsjs/vite.config.ts @@ -0,0 +1,31 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import { resolve } from "path"; +import tsconfigPaths from "vite-tsconfig-paths"; +import dts from "vite-plugin-dts"; +import svgr from "vite-plugin-svgr"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + tsconfigPaths(), + dts({ + insertTypesEntry: true, + }), + react(), + svgr(), + ], + build: { + lib: { + entry: resolve(__dirname, "lib/main.ts"), + name: "MixwaveHLSjs", + fileName: "main", + }, + rollupOptions: { + external: ["react", "hls.js"], + }, + }, + server: { + port: 52005, + }, +}); diff --git a/packages/stitcher/src/playlist.ts b/packages/stitcher/src/playlist.ts index cf8f7611..8ec7533e 100644 --- a/packages/stitcher/src/playlist.ts +++ b/packages/stitcher/src/playlist.ts @@ -40,6 +40,16 @@ export async function formatMasterPlaylist(session: Session) { return variant.resolution.height <= session.maxResolution; }); + const filePath = parseFilepath(url); + for (const v of master.variants) { + for (const audioRendition of v.audio) { + audioRendition.uri = `${filePath.dir}/${audioRendition.uri}`; + } + for (const subtitleRendition of v.subtitles) { + subtitleRendition.uri = `${filePath.dir}/${subtitleRendition.uri}`; + } + } + if (!master.variants.length) { throw new NoVariantsError(); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0419cc88..f87ea869 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -288,6 +288,61 @@ importers: specifier: ^1.3.2 version: 1.3.2(@algolia/client-search@4.24.0)(search-insights@2.16.2) + packages/hlsjs: + dependencies: + clsx: + specifier: ^2.1.1 + version: 2.1.1 + eventemitter3: + specifier: ^5.0.1 + version: 5.0.1 + hls.js: + specifier: github:video-dev/hls.js#feature/interstitials + version: github.com/video-dev/hls.js/e5915a7df3c4f44001ce405fa5bc4785bc68ed63 + immutability-helper: + specifier: ^3.1.1 + version: 3.1.1 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@types/eventemitter3': + specifier: ^2.0.2 + version: 2.0.2 + '@types/react': + specifier: ^18.3.3 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.1) + globals: + specifier: ^15.9.0 + version: 15.9.0 + sass-embedded: + specifier: ^1.78.0 + version: 1.78.0 + typescript: + specifier: ^5.5.3 + version: 5.5.4 + vite: + specifier: ^5.4.1 + version: 5.4.1(sass-embedded@1.78.0) + vite-plugin-dts: + specifier: ^4.1.0 + version: 4.1.0(typescript@5.5.4)(vite@5.4.1) + vite-plugin-svgr: + specifier: ^4.2.0 + version: 4.2.0(typescript@5.5.4)(vite@5.4.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.5.4)(vite@5.4.1) + packages/stitcher: dependencies: '@fastify/cors': @@ -1214,14 +1269,14 @@ packages: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 + '@babel/generator': 7.25.6 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 debug: 4.3.6 gensync: 1.0.0-beta.2 @@ -1230,15 +1285,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.25.0: - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.25.2 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - /@babel/generator@7.25.6: resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} @@ -1252,14 +1298,14 @@ packages: resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7: resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -1285,7 +1331,7 @@ packages: '@babel/helper-optimise-call-expression': 7.24.7 '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -1337,7 +1383,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/traverse': 7.25.6 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -1345,8 +1391,8 @@ packages: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -1360,7 +1406,7 @@ packages: '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -1368,7 +1414,7 @@ packages: resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 /@babel/helper-plugin-utils@7.24.8: resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} @@ -1404,8 +1450,8 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -1413,8 +1459,8 @@ packages: resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -1436,7 +1482,7 @@ packages: dependencies: '@babel/template': 7.25.0 '@babel/traverse': 7.25.6 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -1445,7 +1491,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 /@babel/highlight@7.24.7: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} @@ -1461,7 +1507,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 + dev: true /@babel/parser@7.25.6: resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} @@ -2405,7 +2452,7 @@ packages: dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 esutils: 2.0.3 /@babel/preset-typescript@7.24.7(@babel/core@7.25.2): @@ -2452,18 +2499,18 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 /@babel/traverse@7.25.3: resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: @@ -2490,6 +2537,7 @@ packages: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.25.6: resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} @@ -2503,6 +2551,10 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@bufbuild/protobuf@1.10.0: + resolution: {integrity: sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==} + dev: true + /@bull-board/api@5.21.3(@bull-board/ui@5.21.3): resolution: {integrity: sha512-d3feBl7L1A6gwtIPpeVwsF3DNJmN5ilmFeiuEFsdtLSCrXWvBfIemaUXDH67cQCpQZcefmuwsWkg9cJbEegoUA==} peerDependencies: @@ -3403,6 +3455,50 @@ packages: engines: {node: '>=8'} dev: false + /@microsoft/api-extractor-model@7.29.4: + resolution: {integrity: sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw==} + dependencies: + '@microsoft/tsdoc': 0.15.0 + '@microsoft/tsdoc-config': 0.17.0 + '@rushstack/node-core-library': 5.5.1 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor@7.47.4: + resolution: {integrity: sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.29.4 + '@microsoft/tsdoc': 0.15.0 + '@microsoft/tsdoc-config': 0.17.0 + '@rushstack/node-core-library': 5.5.1 + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.13.3 + '@rushstack/ts-command-line': 4.22.3 + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/tsdoc-config@0.17.0: + resolution: {integrity: sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==} + dependencies: + '@microsoft/tsdoc': 0.15.0 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.8 + dev: true + + /@microsoft/tsdoc@0.15.0: + resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} + dev: true + /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3: resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} cpu: [arm64] @@ -4264,6 +4360,20 @@ packages: '@codemirror/view': 6.30.0 dev: false + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + /@rollup/rollup-android-arm-eabi@4.20.0: resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} cpu: [arm] @@ -4392,6 +4502,54 @@ packages: dev: true optional: true + /@rushstack/node-core-library@5.5.1: + resolution: {integrity: sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + dev: true + + /@rushstack/rig-package@0.5.3: + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + dev: true + + /@rushstack/terminal@0.13.3: + resolution: {integrity: sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@rushstack/node-core-library': 5.5.1 + supports-color: 8.1.1 + dev: true + + /@rushstack/ts-command-line@4.22.3: + resolution: {integrity: sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==} + dependencies: + '@rushstack/terminal': 0.13.3 + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + dev: true + /@scalar/api-client@2.0.48(storybook@8.2.8)(tailwindcss@3.4.7)(typescript@5.5.4): resolution: {integrity: sha512-ZCOaJ3teZdzWCwUrDfgGsvkiGWGpnOfm5dCf4ovhrzFCf8Um9r/8H/cg/RG/rq5T7TssaB0gMG1hAUK9xiSB0w==} engines: {node: '>=18'} @@ -5318,6 +5476,132 @@ packages: - vitest dev: false + /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.25.2): + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + dev: true + + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.25.2): + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + dev: true + + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.25.2): + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + dev: true + + /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.25.2): + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + dev: true + + /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.25.2): + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + dev: true + + /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.25.2): + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + dev: true + + /@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.25.2): + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + dev: true + + /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.25.2): + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + dev: true + + /@svgr/babel-preset@8.1.0(@babel/core@7.25.2): + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.25.2) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.25.2) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.25.2) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.25.2) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.25.2) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.25.2) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.25.2) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.25.2) + dev: true + + /@svgr/core@8.1.0(typescript@5.5.4): + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + dependencies: + '@babel/core': 7.25.2 + '@svgr/babel-preset': 8.1.0(@babel/core@7.25.2) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.5.4) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@svgr/hast-util-to-babel-ast@8.0.0: + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + dependencies: + '@babel/types': 7.25.6 + entities: 4.5.0 + dev: true + + /@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0): + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@babel/core': 7.25.2 + '@svgr/babel-preset': 8.1.0(@babel/core@7.25.2) + '@svgr/core': 8.1.0(typescript@5.5.4) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: true + /@swc/helpers@0.5.12: resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} dependencies: @@ -5459,6 +5743,10 @@ packages: zod: 3.23.8 dev: false + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: true + /@types/aria-query@5.0.4: resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} dev: false @@ -5476,20 +5764,20 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 dev: true /@types/babel__traverse@7.20.6: resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true /@types/body-parser@1.19.5: @@ -5524,6 +5812,13 @@ packages: /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + /@types/eventemitter3@2.0.2: + resolution: {integrity: sha512-nLbSkHNDMVCyINVOtmDq9lTv+PDzeypazRMoqYDKyLPzrbLLiSHFSZLifMU1PxFHRvLJuyDlr/GU0j60eEyeaA==} + deprecated: This is a stub types definition for EventEmitter3 (https://github.com/primus/eventemitter3). EventEmitter3 provides its own type definitions, so you don't need @types/eventemitter3 installed! + dependencies: + eventemitter3: 5.0.1 + dev: true + /@types/express-serve-static-core@4.19.5: resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} dependencies: @@ -5776,14 +6071,30 @@ packages: - supports-color dev: true - /@vitejs/plugin-vue@5.1.2(vite@5.3.5)(vue@3.4.37): + /@vitejs/plugin-react@4.3.1(vite@5.4.1): + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.4.1(sass-embedded@1.78.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue@5.1.2(vite@5.4.3)(vue@3.4.37): resolution: {integrity: sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 vue: ^3.2.25 dependencies: - vite: 5.3.5(@types/node@22.1.0) + vite: 5.4.3 vue: 3.4.37(typescript@5.5.4) dev: true @@ -5810,10 +6121,28 @@ packages: pretty-format: 29.7.0 dev: false + /@volar/language-core@2.4.1: + resolution: {integrity: sha512-9AKhC7Qn2mQYxj7Dz3bVxeOk7gGJladhWixUYKef/o0o7Bm4an+A3XvmcTHVqZ8stE6lBVH++g050tBtJ4TZPQ==} + dependencies: + '@volar/source-map': 2.4.1 + dev: true + + /@volar/source-map@2.4.1: + resolution: {integrity: sha512-Xq6ep3OZg9xUqN90jEgB9ztX5SsTz1yiV8wiQbcYNjWkek+Ie3dc8l7AVt3EhDm9mSIR58oWczHkzM2H6HIsmQ==} + dev: true + + /@volar/typescript@2.4.1: + resolution: {integrity: sha512-UoRzC0PXcwajFQTu8XxKSYNsWNBtVja6Y9gC8eLv7kYm+UEKJCcZ8g7dialsOYA0HKs3Vpg57MeCsawFLC6m9Q==} + dependencies: + '@volar/language-core': 2.4.1 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 + dev: true + /@vue/compiler-core@3.4.37: resolution: {integrity: sha512-ZDDT/KiLKuCRXyzWecNzC5vTcubGz4LECAtfGPENpo0nrmqJHwuWtRLxk/Sb9RAKtR9iFflFycbkjkY+W/PZUQ==} dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@vue/shared': 3.4.37 entities: 5.0.0 estree-walker: 2.0.2 @@ -5828,7 +6157,7 @@ packages: /@vue/compiler-sfc@3.4.37: resolution: {integrity: sha512-vCfetdas40Wk9aK/WWf8XcVESffsbNkBQwS5t13Y/PcfqKfIwJX2gF+82th6dOpnpbptNMlMjAny80li7TaCIg==} dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@vue/compiler-core': 3.4.37 '@vue/compiler-dom': 3.4.37 '@vue/compiler-ssr': 3.4.37 @@ -5844,6 +6173,13 @@ packages: '@vue/compiler-dom': 3.4.37 '@vue/shared': 3.4.37 + /@vue/compiler-vue2@2.7.16: + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + /@vue/devtools-api@6.6.3: resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==} dev: false @@ -5872,6 +6208,25 @@ packages: rfdc: 1.4.1 dev: true + /@vue/language-core@2.0.29(typescript@5.5.4): + resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 2.4.1 + '@vue/compiler-dom': 3.4.37 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.4.37 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + typescript: 5.5.4 + dev: true + /@vue/reactivity@3.4.37: resolution: {integrity: sha512-UmdKXGx0BZ5kkxPqQr3PK3tElz6adTey4307NzZ3whZu19i5VavYal7u2FfOmAzlcDVgE8+X0HZ2LxLb/jgbYw==} dependencies: @@ -6019,7 +6374,17 @@ packages: resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true - dev: false + + /ajv-draft-04@1.0.0(ajv@8.13.0): + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.13.0 + dev: true /ajv-draft-04@1.0.0(ajv@8.17.1): resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} @@ -6043,6 +6408,17 @@ packages: ajv: 8.17.1 dev: false + /ajv-formats@3.0.1(ajv@8.13.0): + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.13.0 + dev: true + /ajv-formats@3.0.1(ajv@8.17.1): resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -6054,6 +6430,24 @@ packages: ajv: 8.17.1 dev: false + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + /ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} dependencies: @@ -6137,6 +6531,10 @@ packages: sprintf-js: 1.0.3 dev: true + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + /aria-hidden@1.2.4: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} @@ -6265,7 +6663,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 dev: true @@ -6433,6 +6831,10 @@ packages: node-int64: 0.4.0 dev: true + /buffer-builder@0.2.0: + resolution: {integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==} + dev: true + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -6720,12 +7122,19 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: false + /compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + dev: true + + /computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + dev: true + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} /confbox@0.1.7: resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - dev: false /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} @@ -6768,6 +7177,22 @@ packages: dependencies: browserslist: 4.23.3 + /cosmiconfig@8.3.6(typescript@5.5.4): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.5.4 + dev: true + /create-jest@29.7.0(@types/node@22.1.0): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6841,6 +7266,10 @@ packages: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} dev: false + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -6982,6 +7411,13 @@ packages: resolution: {integrity: sha512-lCiFG48ZUzGXjKN0qhSkxD/i3ndyV6I37zQ3W2VFYLjF1ob8A+QgSsM7Ps2UT0d3LpJxLMmMHiJJ34z5hkKLiA==} dev: false + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.3 + dev: true + /dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -7027,7 +7463,6 @@ packages: /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: false /entities@5.0.0: resolution: {integrity: sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==} @@ -7165,6 +7600,9 @@ packages: engines: {node: '>=6'} dev: false + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -7268,7 +7706,6 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: false /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} @@ -7544,6 +7981,15 @@ packages: universalify: 2.0.1 dev: false + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -7706,6 +8152,11 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + /globals@15.9.0: + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + engines: {node: '>=18'} + dev: true + /globby@14.0.2: resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} @@ -7718,6 +8169,10 @@ packages: unicorn-magic: 0.1.0 dev: false + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -7913,6 +8368,11 @@ packages: space-separated-tokens: 2.0.2 dev: false + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + /hh-mm-ss@1.2.0: resolution: {integrity: sha512-f4I9Hz1dLpX/3mrEs7yq30+FiuO3tt5NWAqAGeBTaoeoBfB8vhcQ3BphuDc5DjZb/K809agqrAaFlP0jhEU/8w==} dependencies: @@ -8001,6 +8461,27 @@ packages: engines: {node: '>= 4'} dev: false + /immutability-helper@3.1.1: + resolution: {integrity: sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ==} + dev: false + + /immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + /import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -8233,7 +8714,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.25.2 - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -8246,7 +8727,7 @@ packages: engines: {node: '>=10'} dependencies: '@babel/core': 7.25.2 - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.3 @@ -8626,10 +9107,10 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.25.2 - '@babel/generator': 7.25.0 + '@babel/generator': 7.25.6 '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -8722,6 +9203,10 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + /js-cookie@3.0.5: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} @@ -8738,6 +9223,13 @@ packages: esprima: 4.0.1 dev: true + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + /jscodeshift@0.15.2(@babel/preset-env@7.25.4): resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} hasBin: true @@ -8804,13 +9296,18 @@ packages: /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -8837,6 +9334,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + /ldrs@1.0.2: resolution: {integrity: sha512-sYJmivdkIiHrUEqTrEWccBoLdaENpzbzkABI5rk8rRxTXrg9i2xVuDvUUuhOhJY3RmQyaoxs046pM1DCRdcIpg==} dev: false @@ -8879,6 +9380,14 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.7.1 + pkg-types: 1.1.3 + dev: true + /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -8918,7 +9427,6 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -8945,6 +9453,12 @@ packages: get-func-name: 2.0.2 dev: false + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.3 + dev: true + /lowlight@3.1.0: resolution: {integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==} dependencies: @@ -8966,6 +9480,13 @@ packages: dependencies: yallist: 3.1.1 + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + /lucide-react@0.424.0(react@18.3.1): resolution: {integrity: sha512-x2Nj2aytk1iOyHqt4hKenfVlySq0rYxNeEf8hE0o+Yh0iE36Rqz0rkngVdv2uQtjZ70LAE73eeplhhptYt9x4Q==} peerDependencies: @@ -9488,6 +10009,12 @@ packages: brace-expansion: 2.0.1 dev: false + /minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -9550,7 +10077,6 @@ packages: pathe: 1.1.2 pkg-types: 1.1.3 ufo: 1.5.4 - dev: false /mnemonist@0.39.6: resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} @@ -9591,6 +10117,10 @@ packages: msgpackr-extract: 3.0.3 dev: false + /muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + dev: true + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -9622,6 +10152,13 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: false + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.3 + dev: true + /node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: false @@ -9822,6 +10359,13 @@ packages: /package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + /parse-filepath@1.0.2: resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} engines: {node: '>=0.8'} @@ -9862,6 +10406,10 @@ packages: engines: {node: '>= 0.8'} dev: false + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -9918,6 +10466,11 @@ packages: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + /path-type@5.0.0: resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} engines: {node: '>=12'} @@ -9925,7 +10478,6 @@ packages: /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: false /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -10009,7 +10561,6 @@ packages: confbox: 0.1.7 mlly: 1.7.1 pathe: 1.1.2 - dev: false /possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} @@ -10079,6 +10630,15 @@ packages: picocolors: 1.0.1 source-map-js: 1.2.0 + /postcss@8.4.44: + resolution: {integrity: sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + dev: true + /preact@10.23.2: resolution: {integrity: sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==} dev: true @@ -10177,7 +10737,6 @@ packages: /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - dev: false /pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} @@ -10595,7 +11154,6 @@ packages: /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - dev: false /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} @@ -10604,6 +11162,11 @@ packages: resolve-from: 5.0.0 dev: true + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -10681,6 +11244,12 @@ packages: dependencies: queue-microtask: 1.2.3 + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.3 + dev: true + /s3-sync-client@4.3.1(@aws-sdk/abort-controller@3.374.0)(@aws-sdk/client-s3@3.623.0): resolution: {integrity: sha512-nWbbKCNnXmWvD8XwdWhX25VNxIhgQEm6vXqSYjwyBNZI07OuMOr/LNOYmEPcLfqFFjy55ZNcFSBI18W29ybuUw==} engines: {node: '>=16.0.0'} @@ -10711,6 +11280,220 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false + /sass-embedded-android-arm64@1.78.0: + resolution: {integrity: sha512-2sAr11EgwPudAuyk4Ite+fWGYJspiFSiZDU2D8/vjjI7BaB9FG6ksYqww3svoMMnjPUWBCjKPDELpZTxViLJbw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-android-arm@1.78.0: + resolution: {integrity: sha512-YM6nrmKsj+ImaSTd96F+jzbWSbhPkRN4kedbLgIJ5FsILNa9NAqhmrCQz9pdcjuAhyfxWImdUACsT23CPGENZQ==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-android-ia32@1.78.0: + resolution: {integrity: sha512-TyJOo4TgnHpOfC/PfqCBqd+jGRanWoRd4Br/0KAfIvaIFjTGIPdk26vUyDVugV1J8QUEY4INGE8EXAuDeRldUQ==} + engines: {node: '>=14.0.0'} + cpu: [ia32] + os: [android] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-android-riscv64@1.78.0: + resolution: {integrity: sha512-wwajpsVRuhb7ixrkA3Yu60V2LtROYn45PIYeda30/MrMJi9k3xEqHLhodTexFm6wZoKclGSDZ6L9U5q0XyRKiQ==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-android-x64@1.78.0: + resolution: {integrity: sha512-k5l66PO0LgSHMDbDzAQ/vqrXMlJ3r42ZHJA8MJvUbA6sQxTzDS381V7L+EhOATwyI225j2FhEeTHW6rr4WBQzA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-darwin-arm64@1.78.0: + resolution: {integrity: sha512-3JaxceFSR6N+a22hPYYkj1p45eBaWTt/M8MPTbfzU3TGZrU9bmRX7WlUVtXTo1yYI2iMf22nCv0PQ5ExFF3FMQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-darwin-x64@1.78.0: + resolution: {integrity: sha512-UMTijqE3fJ8vEaaD7GPG7G3GsHuPKOdpS8vuA2v2uwO3BPFp/rEKah66atvGqvGO+0JYApkSv0YTnnexSrkHIQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-linux-arm64@1.78.0: + resolution: {integrity: sha512-juMIMpp3DIAiQ842y+boqh0u2SjN4m3mDKrDfMuBznj8DSQoy9J/3e4hLh3g+p0/j83WuROu5nNoYxm2Xz8rww==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-linux-arm@1.78.0: + resolution: {integrity: sha512-JafT+Co0RK8oO3g9TfVRuG7tkYeh35yDGTgqCFxLrktnkiw5pmIagCfpjxk5GBcSfJMOzhCgclTCDJWAuHGuMQ==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-linux-ia32@1.78.0: + resolution: {integrity: sha512-Gy8GW5g6WX9t8CT2Dto5AL6ikB+pG7aAXWXvfu3RFHktixSwSbyy6CeGqSk1t0xyJCFkQQA/V8HU9bNdeHiBxg==} + engines: {node: '>=14.0.0'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-linux-musl-arm64@1.78.0: + resolution: {integrity: sha512-Lu/TlRHbe9aJY7B7PwWCJz7pTT5Rc50VkApWEmPiU/nu0mGbSpg0Xwar6pNeG8+98ubgKKdRb01N3bvclf5a4A==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-linux-musl-arm@1.78.0: + resolution: {integrity: sha512-DUVXtcsfsiOJ2Zwp4Y3T6KZWX8h0gWpzmFUrx+gSIbg67vV8Ww2DWMjWRwqLe7HOLTYBegMBYpMgMgZiPtXhIA==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-linux-musl-ia32@1.78.0: + resolution: {integrity: sha512-1E5ywUnq6MRPAecr2r/vDOBr93wXyculEmfyF5JRG8mUufMaxGIhfx64OQE6Drjs+EDURcYZ+Qcg6/ubJWqhcw==} + engines: {node: '>=14.0.0'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-linux-musl-riscv64@1.78.0: + resolution: {integrity: sha512-YvQEvX7ctn5BwC79+HBagDYIciEkwcl2NLgoydmEsBO/0+ncMKSGnjsn/iRzErbq1KJNyjGEni8eSHlrtQI1vQ==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-linux-musl-x64@1.78.0: + resolution: {integrity: sha512-azdUcZZvZmtUBslIKr2/l4aQrTX7BvO96TD0GLdWz9vuXZrokYm09AJZEnb5j6Pk5I4Xr0yM6BG1Vgcbzqi5Zg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-linux-riscv64@1.78.0: + resolution: {integrity: sha512-g8M6vqHMjZUoH9C1WJsgwu+qmwdJAAMDaJTM1emeAScUZMTaQGzm+Q6C5oSGnAGR3XLT/drgbHhbmruXDgkdeQ==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-linux-x64@1.78.0: + resolution: {integrity: sha512-m997ThzpMwql4u6LzZCoHPIQkgK6bbLPLc7ydemo2Wusqzh6j8XAGxVT5oANp6s2Dmj+yh49pKDozal+tzEX9w==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-win32-arm64@1.78.0: + resolution: {integrity: sha512-qTLIIC5URYRmeuYYllfoL0K1cHSUd+f3sFHAA6fjtdgf288usd6ToCbWpuFb0BtVceEfGQX8lEp+teOG7n7Quw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-win32-ia32@1.78.0: + resolution: {integrity: sha512-BrOWh18T6Y9xgCokGXElEnd8j03fO4W83bwJ9wHRRkrQWaeHtHs3XWW0fX1j2brngWUTjU+jcYUijWF1Z60krw==} + engines: {node: '>=14.0.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /sass-embedded-win32-x64@1.78.0: + resolution: {integrity: sha512-C14iFDJd7oGhmQehRiEL7GtzMmLwubcDqsBarQ+u9LbHoDlUQfIPd7y8mVtNgtxJCdrAO/jc5qR4C+85yE3xPQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /sass-embedded@1.78.0: + resolution: {integrity: sha512-NR2kvhWVFABmBm0AqgFw9OweQycs0Qs+/teJ9Su+BUY7up+f8S5F/Zi+7QtAqJlewsQyUNfzm1vRuM+20lBwRQ==} + engines: {node: '>=16.0.0'} + hasBin: true + dependencies: + '@bufbuild/protobuf': 1.10.0 + buffer-builder: 0.2.0 + immutable: 4.3.7 + rxjs: 7.8.1 + supports-color: 8.1.1 + varint: 6.0.0 + optionalDependencies: + sass-embedded-android-arm: 1.78.0 + sass-embedded-android-arm64: 1.78.0 + sass-embedded-android-ia32: 1.78.0 + sass-embedded-android-riscv64: 1.78.0 + sass-embedded-android-x64: 1.78.0 + sass-embedded-darwin-arm64: 1.78.0 + sass-embedded-darwin-x64: 1.78.0 + sass-embedded-linux-arm: 1.78.0 + sass-embedded-linux-arm64: 1.78.0 + sass-embedded-linux-ia32: 1.78.0 + sass-embedded-linux-musl-arm: 1.78.0 + sass-embedded-linux-musl-arm64: 1.78.0 + sass-embedded-linux-musl-ia32: 1.78.0 + sass-embedded-linux-musl-riscv64: 1.78.0 + sass-embedded-linux-musl-x64: 1.78.0 + sass-embedded-linux-riscv64: 1.78.0 + sass-embedded-linux-x64: 1.78.0 + sass-embedded-win32-arm64: 1.78.0 + sass-embedded-win32-ia32: 1.78.0 + sass-embedded-win32-x64: 1.78.0 + dev: true + /scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: @@ -10734,6 +11517,14 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -10850,6 +11641,13 @@ packages: engines: {node: '>=14.16'} dev: false + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.3 + dev: true + /sonic-boom@4.0.1: resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} dependencies: @@ -11102,6 +11900,10 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: true + /tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: true @@ -11338,13 +12140,25 @@ packages: typescript: 5.5.4 dev: true + /tsconfck@3.1.3(typescript@5.5.4): + resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.5.4 + dev: true + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: false /tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - dev: false /turbo-darwin-64@2.0.11: resolution: {integrity: sha512-YlHEEhcm+jI1BSZoLugGHUWDfRXaNaQIv7tGQBfadYjo9kixBnqoTOU6s1ubOrQMID+lizZZQs79GXwqM6vohg==} @@ -11439,6 +12253,12 @@ packages: mime-types: 2.1.35 dev: false + /typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} @@ -11446,7 +12266,6 @@ packages: /ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - dev: false /unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} @@ -11556,6 +12375,11 @@ packages: unist-util-visit-parents: 6.0.1 dev: false + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + /universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -11580,7 +12404,6 @@ packages: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 - dev: false /use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} @@ -11657,6 +12480,10 @@ packages: convert-source-map: 2.0.0 dev: true + /varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + dev: true + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -11684,6 +12511,66 @@ packages: vfile-message: 4.0.2 dev: false + /vite-plugin-dts@4.1.0(typescript@5.5.4)(vite@5.4.1): + resolution: {integrity: sha512-sRlmt9k2q8MrX4F2058N3KmB6WyJ3Ao6QaExOv1X99F3j0GhPziEz1zscWQ1q2r1PeFc96L7GIUu8Pl2DPr2Hg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@microsoft/api-extractor': 7.47.4 + '@rollup/pluginutils': 5.1.0 + '@volar/typescript': 2.4.1 + '@vue/language-core': 2.0.29(typescript@5.5.4) + compare-versions: 6.1.1 + debug: 4.3.6 + kolorist: 1.8.0 + local-pkg: 0.5.0 + magic-string: 0.30.11 + typescript: 5.5.4 + vite: 5.4.1(sass-embedded@1.78.0) + vue-tsc: 2.0.29(typescript@5.5.4) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + dev: true + + /vite-plugin-svgr@4.2.0(typescript@5.5.4)(vite@5.4.1): + resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==} + peerDependencies: + vite: ^2.6.0 || 3 || 4 || 5 + dependencies: + '@rollup/pluginutils': 5.1.0 + '@svgr/core': 8.1.0(typescript@5.5.4) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) + vite: 5.4.1(sass-embedded@1.78.0) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + dev: true + + /vite-tsconfig-paths@5.0.1(typescript@5.5.4)(vite@5.4.1): + resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.6 + globrex: 0.1.2 + tsconfck: 3.1.3(typescript@5.5.4) + vite: 5.4.1(sass-embedded@1.78.0) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /vite@5.3.5(@types/node@22.1.0): resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -11720,6 +12607,83 @@ packages: fsevents: 2.3.3 dev: true + /vite@5.4.1(sass-embedded@1.78.0): + resolution: {integrity: sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.20.0 + sass-embedded: 1.78.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@5.4.3: + resolution: {integrity: sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.21.5 + postcss: 8.4.44 + rollup: 4.20.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vitepress@1.3.2(@algolia/client-search@4.24.0)(search-insights@2.16.2): resolution: {integrity: sha512-6gvecsCuR6b1Cid4w19KQiQ02qkpgzFRqiG0v1ZBekGkrZCzsxdDD5y4WH82HRXAOhU4iZIpzA1CsWqs719rqA==} hasBin: true @@ -11737,7 +12701,7 @@ packages: '@shikijs/core': 1.12.1 '@shikijs/transformers': 1.12.1 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.1.2(vite@5.3.5)(vue@3.4.37) + '@vitejs/plugin-vue': 5.1.2(vite@5.4.3)(vue@3.4.37) '@vue/devtools-api': 7.3.8 '@vue/shared': 3.4.37 '@vueuse/core': 10.11.1(vue@3.4.37) @@ -11746,7 +12710,7 @@ packages: mark.js: 8.11.1 minisearch: 7.1.0 shiki: 1.12.1 - vite: 5.3.5(@types/node@22.1.0) + vite: 5.4.3 vue: 3.4.37(typescript@5.5.4) transitivePeerDependencies: - '@algolia/client-search' @@ -11767,6 +12731,7 @@ packages: - react - react-dom - sass + - sass-embedded - search-insights - sortablejs - stylus @@ -11776,6 +12741,10 @@ packages: - universal-cookie dev: true + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: true + /vue-demi@0.14.10(vue@3.4.37): resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -11803,6 +12772,18 @@ packages: resolution: {integrity: sha512-ATt+o38ALfPBfmaT3rfr10K+mkZ/7EdqZewEZVI3krSc1RaIDK8fI9gQro0Jlh8HZcOHv2oUDJufSIUl/qpdOA==} dev: false + /vue-tsc@2.0.29(typescript@5.5.4): + resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + dependencies: + '@volar/typescript': 2.4.1 + '@vue/language-core': 2.0.29(typescript@5.5.4) + semver: 7.6.3 + typescript: 5.5.4 + dev: true + /vue@3.4.37(typescript@5.5.4): resolution: {integrity: sha512-3vXvNfkKTBsSJ7JP+LyR7GBuwQuckbWvuwAid3xbqK9ppsKt/DUvfqgZ48fgOLEfpy1IacL5f8QhUVl77RaI7A==} peerDependencies: @@ -11950,7 +12931,6 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} @@ -12008,3 +12988,11 @@ packages: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false + + github.com/video-dev/hls.js/e5915a7df3c4f44001ce405fa5bc4785bc68ed63: + resolution: {tarball: https://codeload.github.com/video-dev/hls.js/tar.gz/e5915a7df3c4f44001ce405fa5bc4785bc68ed63} + name: hls.js + version: 0.0.0 + prepare: true + requiresBuild: true + dev: false