feat: implement share support
This commit is contained in:
parent
913b0df0b0
commit
d9e5a64e52
@ -20,11 +20,7 @@
|
||||
}: {
|
||||
devShells.default = config.mk-naked-shell.lib.mkNakedShell {
|
||||
name = "musikspider-devshell";
|
||||
packages = with pkgs; [
|
||||
nodejs
|
||||
yarn
|
||||
yarn2nix
|
||||
];
|
||||
packages = with pkgs; [nodejs yarn];
|
||||
};
|
||||
packages.musikspider = pkgs.mkYarnPackage {
|
||||
src = ./.;
|
||||
|
@ -15,8 +15,7 @@
|
||||
"@iconify-json/line-md": "^1.1.24",
|
||||
"@iconify-json/mdi": "^1.1.50",
|
||||
"@skeletonlabs/skeleton": "^1.2.5",
|
||||
"@sveltejs/adapter-auto": "^2.0.1",
|
||||
"@sveltejs/adapter-static": "^2.0.2",
|
||||
"@sveltejs/adapter-node": "^1.2.4",
|
||||
"@sveltejs/kit": "^1.15.9",
|
||||
"@typescript-eslint/eslint-plugin": "^5.59.1",
|
||||
"@typescript-eslint/parser": "^5.59.1",
|
||||
|
@ -3,8 +3,9 @@
|
||||
|
||||
export let href: string;
|
||||
export let title: string = '';
|
||||
let targetId = href === '/' ? '/(app)' : `/(app)${href}`;
|
||||
|
||||
$: isOnPage = href === $page.route.id;
|
||||
$: isOnPage = targetId === $page.route.id;
|
||||
</script>
|
||||
|
||||
<a
|
||||
|
@ -18,7 +18,7 @@
|
||||
<Link title={link.id} href={link.href ?? `/${link.id}`}>
|
||||
<svelte:component this={link.icon} class="w-7 h-7" />
|
||||
</Link>
|
||||
{#if link.id === 'search' && $page.route.id === '/'}
|
||||
{#if link.id === 'search' && $page.route.id === '/(app)'}
|
||||
<input
|
||||
id="search-input"
|
||||
class="input rounded-none"
|
||||
|
@ -7,7 +7,6 @@
|
||||
muted,
|
||||
paused,
|
||||
nextQueuePosition,
|
||||
getAudioElement,
|
||||
loop,
|
||||
queuePosition,
|
||||
prevQueuePosition
|
||||
@ -17,23 +16,13 @@
|
||||
import IconMusic from '~icons/mdi/music';
|
||||
import { RangeSlider } from '@skeletonlabs/skeleton';
|
||||
import { LoopKind } from '../types';
|
||||
import { calculateMinuteSecond, getAudioElement } from '../utils';
|
||||
|
||||
$: track = $currentTrack?.track;
|
||||
$: track_id = $currentTrack?.id;
|
||||
$: thumbUrl = track ? makeThumbnailUrl(track.thumbnail_id) : null;
|
||||
$: audioUrl = track_id ? makeAudioUrl(track_id) : null;
|
||||
|
||||
function calculateMinuteSecond(seconds: number) {
|
||||
let secs = Math.floor(seconds);
|
||||
let secsLeftover = secs % 60;
|
||||
let minutes = (secs - secsLeftover) / 60;
|
||||
|
||||
let secondsFormatted = secsLeftover < 10 ? `0${secsLeftover}` : `${secsLeftover}`;
|
||||
let minutesFormatted = minutes < 10 ? `0${minutes}` : `${minutes}`;
|
||||
|
||||
return `${minutesFormatted}:${secondsFormatted}`;
|
||||
}
|
||||
|
||||
let currentTime = 0;
|
||||
let duration = 0;
|
||||
|
||||
|
@ -1,9 +1,17 @@
|
||||
<script lang="ts">
|
||||
import type { TrackWithId } from '../types';
|
||||
import { makeThumbnailUrl, currentTrack, setQueuePositionTo, getAudioElement } from '../stores';
|
||||
import {
|
||||
makeThumbnailUrl,
|
||||
currentTrack,
|
||||
setQueuePositionTo,
|
||||
makeGenScopedTokenUrl,
|
||||
makeShareUrl
|
||||
} from '../stores';
|
||||
import Spinnny from '~icons/line-md/loading-loop';
|
||||
import IconPlay from '~icons/mdi/play';
|
||||
import IconMusic from '~icons/mdi/music';
|
||||
import { toastStore } from '@skeletonlabs/skeleton';
|
||||
import { getAudioElement } from '../utils';
|
||||
|
||||
export let track_with_id: TrackWithId;
|
||||
let track = track_with_id.track;
|
||||
@ -13,6 +21,23 @@
|
||||
let showSpinner = false;
|
||||
let isError = false;
|
||||
let showPlayIcon = false;
|
||||
|
||||
async function shareMusic() {
|
||||
try {
|
||||
const resp = await fetch(makeGenScopedTokenUrl(track_id));
|
||||
const shareToken = await resp.text();
|
||||
await navigator.clipboard.writeText(makeShareUrl(shareToken));
|
||||
toastStore.trigger({
|
||||
message: `copied share URL to clipboard`,
|
||||
background: 'variant-filled-success'
|
||||
});
|
||||
} catch (e) {
|
||||
toastStore.trigger({
|
||||
message: `error while generating share URL: ${e}`,
|
||||
background: 'variant-filled-error'
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="flex gap-2 w-fit max-w-full">
|
||||
@ -36,22 +61,29 @@
|
||||
: 'hidden'}"
|
||||
/>
|
||||
<!-- svelte-ignore a11y-missing-attribute -->
|
||||
<img
|
||||
src={thumbUrl}
|
||||
class="child {showSpinner || isError ? 'hidden' : ''}"
|
||||
on:error={() => {
|
||||
isError = true;
|
||||
showSpinner = false;
|
||||
}}
|
||||
on:loadstart={() => (showSpinner = true)}
|
||||
on:load={() => (showSpinner = false)}
|
||||
/>
|
||||
{#if thumbUrl !== null}
|
||||
<img
|
||||
src={thumbUrl}
|
||||
class="child {showSpinner || isError ? 'hidden' : ''}"
|
||||
on:error={() => {
|
||||
isError = true;
|
||||
showSpinner = false;
|
||||
}}
|
||||
on:loadstart={() => (showSpinner = true)}
|
||||
on:load={() => (showSpinner = false)}
|
||||
/>
|
||||
{/if}
|
||||
<IconPlay
|
||||
class="child play-icon variant-glass-surface {showPlayIcon ? 'opacity-100' : 'opacity-0'}"
|
||||
/>
|
||||
</button>
|
||||
<div class="whitespace-nowrap overflow-ellipsis overflow-hidden">
|
||||
<span>#{track.track_num} - {track.title}</span>
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
<span
|
||||
class="chip variant-soft-secondary hover:variant-filled-secondary py-0.5 px-2"
|
||||
on:click={shareMusic}>share</span
|
||||
>
|
||||
<div class="text-sm whitespace-nowrap overflow-ellipsis overflow-hidden">
|
||||
<span
|
||||
class="badge variant-filled-primary py-0.5 {$currentTrack?.id === track_id
|
||||
|
@ -3,26 +3,26 @@
|
||||
import '@skeletonlabs/skeleton/themes/theme-crimson.css';
|
||||
// This contains the bulk of Skeletons required styles:
|
||||
import '@skeletonlabs/skeleton/styles/all.css';
|
||||
import '../app.postcss';
|
||||
import '../../app.postcss';
|
||||
|
||||
import { AppShell, Toast, toastStore } from '@skeletonlabs/skeleton';
|
||||
import {
|
||||
address,
|
||||
changeLoop,
|
||||
currentTrack,
|
||||
getAudioElement,
|
||||
muted,
|
||||
paused,
|
||||
queuePosition,
|
||||
token,
|
||||
tracks,
|
||||
tracksSorted
|
||||
} from '../stores';
|
||||
} from '../../stores';
|
||||
import { _metadataComm as comm } from './+layout';
|
||||
import Navbar from '../components/navbar.svelte';
|
||||
import PlayingNow from '../components/playingnow.svelte';
|
||||
import VolumeSlider from '../components/volumeSlider.svelte';
|
||||
import LoopButton from '../components/loopButton.svelte';
|
||||
import Navbar from '../../components/navbar.svelte';
|
||||
import PlayingNow from '../../components/playingnow.svelte';
|
||||
import VolumeSlider from '../../components/volumeSlider.svelte';
|
||||
import LoopButton from '../../components/loopButton.svelte';
|
||||
import { getAudioElement, interceptKeys } from '../../utils';
|
||||
|
||||
$: title = $currentTrack !== null ? `${$currentTrack.track.title} - musikspider` : `musikspider`;
|
||||
|
||||
@ -82,41 +82,10 @@
|
||||
</script>
|
||||
|
||||
<svelte:window
|
||||
on:keydown={(event) => {
|
||||
const tagName = document.activeElement?.tagName ?? '';
|
||||
const actions = new Map([
|
||||
['Space', () => ($paused = !$paused)],
|
||||
['KeyL', changeLoop],
|
||||
['KeyM', () => ($muted = !$muted)],
|
||||
['KeyS', () => document.getElementById('search-input')?.focus()],
|
||||
[
|
||||
'ArrowLeft',
|
||||
() => {
|
||||
const audio = getAudioElement();
|
||||
if (audio !== null) {
|
||||
audio.currentTime -= 5;
|
||||
}
|
||||
}
|
||||
],
|
||||
[
|
||||
'ArrowRight',
|
||||
() => {
|
||||
const audio = getAudioElement();
|
||||
if (audio !== null) {
|
||||
audio.currentTime += 5;
|
||||
}
|
||||
}
|
||||
]
|
||||
]);
|
||||
if (tagName !== 'INPUT' && actions.has(event.code)) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
const action = actions.get(event.code) ?? null;
|
||||
if (action !== null) {
|
||||
action();
|
||||
}
|
||||
}
|
||||
}}
|
||||
on:keydown={interceptKeys([
|
||||
['KeyS', () => document.getElementById('search-input')?.focus()],
|
||||
['KeyL', changeLoop]
|
||||
])}
|
||||
/>
|
||||
|
||||
<svelte:head>
|
5
src/routes/(app)/+layout.ts
Normal file
5
src/routes/(app)/+layout.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { MetadataCommunicator } from "../../comms";
|
||||
|
||||
export const _metadataComm = new MetadataCommunicator();
|
||||
export const ssr = false;
|
||||
export const prerender = true;
|
@ -1,8 +1,8 @@
|
||||
<script lang="ts">
|
||||
import VirtualList from 'svelte-tiny-virtual-list';
|
||||
import { queue, tracks, tracksSorted } from '../stores';
|
||||
import TrackComponent from '../components/track.svelte';
|
||||
import type { Track, TrackWithId } from '../types';
|
||||
import { tracks, tracksSorted } from '../../stores';
|
||||
import TrackComponent from '../../components/track.svelte';
|
||||
import type { TrackWithId } from '../../types';
|
||||
|
||||
$: trackCount = $tracksSorted.length;
|
||||
let trackItemSize = 62;
|
@ -1,10 +1,9 @@
|
||||
<script lang="ts">
|
||||
import VirtualList from 'svelte-tiny-virtual-list';
|
||||
import { currentTrack, queue, queuePosition, tracks } from '../../stores';
|
||||
import TrackComponent from '../../components/track.svelte';
|
||||
import type { TrackWithId } from '../../types';
|
||||
import { currentTrack, queue, queuePosition, tracks } from '../../../stores';
|
||||
import TrackComponent from '../../../components/track.svelte';
|
||||
import type { TrackWithId } from '../../../types';
|
||||
import IconRemove from '~icons/mdi/minus-thick';
|
||||
import { get } from 'svelte/store';
|
||||
|
||||
$: trackCount = $queue.length;
|
||||
let trackItemSize = 62;
|
@ -1,5 +1,5 @@
|
||||
<script>
|
||||
import { token, address } from '../../stores';
|
||||
import { token, address } from '../../../stores';
|
||||
import Input from './input.svelte';
|
||||
import { _metadataComm as comm } from '../+layout';
|
||||
|
@ -1,6 +0,0 @@
|
||||
import { MetadataCommunicator } from "../comms";
|
||||
|
||||
export const ssr = false;
|
||||
export const prerender = true;
|
||||
|
||||
export const _metadataComm = new MetadataCommunicator();
|
2
src/routes/share/[token]/+layout.ts
Normal file
2
src/routes/share/[token]/+layout.ts
Normal file
@ -0,0 +1,2 @@
|
||||
export const ssr = false;
|
||||
export const prerender = false;
|
19
src/routes/share/[token]/+page.server.ts
Normal file
19
src/routes/share/[token]/+page.server.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import { PUBLIC_MUSIKQUAD_SERVER } from '$env/static/public';
|
||||
import { scheme } from '../../../utils';
|
||||
|
||||
interface MusicInfo {
|
||||
title: string,
|
||||
album: string,
|
||||
artist: string,
|
||||
}
|
||||
|
||||
export async function load({ params }) {
|
||||
const server = PUBLIC_MUSIKQUAD_SERVER;
|
||||
const resp = await fetch(`${scheme}://${server}/share/info/${params.token}`);
|
||||
const info: MusicInfo = await resp.json();
|
||||
return {
|
||||
info,
|
||||
thumbnail_url: `${scheme}://${server}/share/thumbnail/${params.token}`,
|
||||
audio_url: `${scheme}://${server}/share/audio/${params.token}`,
|
||||
};
|
||||
}
|
105
src/routes/share/[token]/+page.svelte
Normal file
105
src/routes/share/[token]/+page.svelte
Normal file
@ -0,0 +1,105 @@
|
||||
<script lang="ts">
|
||||
// Your selected Skeleton theme:
|
||||
import '@skeletonlabs/skeleton/themes/theme-crimson.css';
|
||||
// This contains the bulk of Skeletons required styles:
|
||||
import '@skeletonlabs/skeleton/styles/all.css';
|
||||
import '../../../app.postcss';
|
||||
|
||||
import IconMusic from '~icons/mdi/music';
|
||||
import IconPlay from '~icons/mdi/play';
|
||||
import IconPause from '~icons/mdi/pause';
|
||||
import { RangeSlider } from '@skeletonlabs/skeleton';
|
||||
import { calculateMinuteSecond, getAudioElement, interceptKeys } from '../../../utils';
|
||||
|
||||
export let data;
|
||||
|
||||
let showIcon = false;
|
||||
let isError = false;
|
||||
|
||||
let paused = false;
|
||||
let currentTime = 0;
|
||||
let duration = 0;
|
||||
</script>
|
||||
|
||||
<svelte:window on:keydown={interceptKeys()} />
|
||||
|
||||
<svelte:head>
|
||||
<title>{data.info.title} {data.info.artist !== '' ? `- ${data.info.artist}` : ''}</title>
|
||||
</svelte:head>
|
||||
|
||||
<div
|
||||
class="
|
||||
absolute top-[50%] left-[50%] -translate-x-[50%] -translate-y-[50%]
|
||||
flex w-fit max-w-full p-2 gap-2 rounded
|
||||
"
|
||||
>
|
||||
<audio
|
||||
id="audio-source"
|
||||
src={data.audio_url}
|
||||
autoplay
|
||||
bind:paused
|
||||
bind:currentTime
|
||||
bind:duration
|
||||
/>
|
||||
<button
|
||||
class="relative rounded placeholder w-16 h-16"
|
||||
on:pointerenter={(_) => (showIcon = true)}
|
||||
on:pointerleave={(_) => (showIcon = false)}
|
||||
on:click={(_) => {
|
||||
let elem = getAudioElement();
|
||||
if (elem) {
|
||||
elem.paused ? elem.play() : elem.pause();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<IconMusic class="absolute top-1 left-1 w-14 h-14" />
|
||||
<!-- svelte-ignore a11y-missing-attribute -->
|
||||
<img
|
||||
src={data.thumbnail_url}
|
||||
class="child {isError ? 'hidden' : ''}"
|
||||
on:error={() => (isError = true)}
|
||||
on:load={() => (isError = false)}
|
||||
/>
|
||||
<svelte:component
|
||||
this={paused ? IconPlay : IconPause}
|
||||
class="
|
||||
child play-icon variant-glass-surface
|
||||
{showIcon ? 'opacity-100' : 'opacity-0'}
|
||||
"
|
||||
/>
|
||||
</button>
|
||||
<div class="flex flex-col gap-1 w-[24rem] max-md:w-[18rem]">
|
||||
<div class="text-overflow-ellipsis">
|
||||
<span>{data.info.title}</span>
|
||||
<div class="text-sm text-overflow-ellipsis">
|
||||
<span class="opacity-70">{data.info.album !== '' ? `from ${data.info.album}` : ''}</span>
|
||||
<span class="opacity-40">{data.info.artist !== '' ? `by ${data.info.artist}` : ''}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center gap-1">
|
||||
<RangeSlider
|
||||
name="progress"
|
||||
bind:value={currentTime}
|
||||
max={duration}
|
||||
step={0.01}
|
||||
class="w-[22rem] max-md:w-[16rem]"
|
||||
/>
|
||||
<span class="text-xs opacity-70 w-[2rem]">{calculateMinuteSecond(currentTime)}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style lang="postcss">
|
||||
button :global(.play-icon) {
|
||||
@apply transition-opacity backdrop-blur-sm;
|
||||
}
|
||||
button :global(.child) {
|
||||
@apply absolute rounded top-0 left-0 w-16 h-16;
|
||||
}
|
||||
div :global(.range-content) {
|
||||
@apply p-0;
|
||||
}
|
||||
div :global(.text-overflow-ellipsis) {
|
||||
@apply whitespace-nowrap overflow-ellipsis overflow-hidden;
|
||||
}
|
||||
</style>
|
@ -1,6 +1,8 @@
|
||||
import { get, writable } from 'svelte/store';
|
||||
import { type ResourceId, type Track, type TrackId, type TrackWithId, LoopKind } from './types';
|
||||
import { dev } from '$app/environment';
|
||||
import { type Track, type TrackId, type TrackWithId, LoopKind } from './types';
|
||||
|
||||
import { PUBLIC_BASEURL, PUBLIC_MUSIKQUAD_SERVER } from '$env/static/public';
|
||||
import { scheme } from './utils';
|
||||
|
||||
function writableStorage(key: string, defaultValue: string) {
|
||||
const store = writable(localStorage.getItem(key) ?? defaultValue);
|
||||
@ -8,19 +10,28 @@ function writableStorage(key: string, defaultValue: string) {
|
||||
return store;
|
||||
}
|
||||
|
||||
export const address = writableStorage("address", "127.0.0.1:5505");
|
||||
export const address = writableStorage("address", PUBLIC_MUSIKQUAD_SERVER);
|
||||
export const token = writableStorage("token", "");
|
||||
|
||||
export function makeThumbnailUrl(id: ResourceId) {
|
||||
const scheme = dev ? "http" : "https";
|
||||
export function makeThumbnailUrl(id: number) {
|
||||
if (id === 0) {
|
||||
return null;
|
||||
}
|
||||
return `${scheme}://${get(address)}/thumbnail/${id}?token=${get(token)}`;
|
||||
}
|
||||
|
||||
export function makeAudioUrl(id: TrackId) {
|
||||
const scheme = dev ? "http" : "https";
|
||||
return `${scheme}://${get(address)}/audio/external_id/${id}?token=${get(token)}`;
|
||||
}
|
||||
|
||||
export function makeGenScopedTokenUrl(id: TrackId) {
|
||||
return `${scheme}://${get(address)}/share/generate/${id}?token=${get(token)}`;
|
||||
}
|
||||
|
||||
export function makeShareUrl(token: string) {
|
||||
return `${scheme}://${PUBLIC_BASEURL}/share/${token}`;
|
||||
}
|
||||
|
||||
export const currentTrack = writable<TrackWithId | null>(null);
|
||||
|
||||
export function getCurrentTrack(tracks: Map<TrackId, Track>, queue: TrackId[], position: number | null): TrackWithId | null {
|
||||
@ -147,11 +158,3 @@ export function search(q: string) {
|
||||
});
|
||||
tracksSorted.set(result);
|
||||
}
|
||||
|
||||
export function getAudioElement() {
|
||||
const elem = document.getElementById('audio-source');
|
||||
if (elem === null) {
|
||||
return null;
|
||||
}
|
||||
return elem as HTMLAudioElement;
|
||||
}
|
@ -9,7 +9,7 @@ export interface Track {
|
||||
album_id: ResourceId,
|
||||
artist_name: string,
|
||||
artist_id: ResourceId,
|
||||
thumbnail_id: ResourceId,
|
||||
thumbnail_id: number,
|
||||
}
|
||||
|
||||
export interface TrackWithId {
|
||||
|
67
src/utils.ts
Normal file
67
src/utils.ts
Normal file
@ -0,0 +1,67 @@
|
||||
import { dev } from '$app/environment';
|
||||
|
||||
export const scheme = dev ? "http" : "https";
|
||||
|
||||
export function getAudioElement() {
|
||||
const elem = document.getElementById('audio-source');
|
||||
if (elem === null) {
|
||||
return null;
|
||||
}
|
||||
return elem as HTMLAudioElement;
|
||||
}
|
||||
|
||||
export function calculateMinuteSecond(seconds: number) {
|
||||
let secs = Math.floor(seconds);
|
||||
let secsLeftover = secs % 60;
|
||||
let minutes = (secs - secsLeftover) / 60;
|
||||
|
||||
let secondsFormatted = secsLeftover < 10 ? `0${secsLeftover}` : `${secsLeftover}`;
|
||||
let minutesFormatted = minutes < 10 ? `0${minutes}` : `${minutes}`;
|
||||
|
||||
return `${minutesFormatted}:${secondsFormatted}`;
|
||||
}
|
||||
|
||||
export function interceptKeys(extraActions: [string, () => void][] = []): (event: KeyboardEvent) => void {
|
||||
return (event) => {
|
||||
const tagName = document.activeElement?.tagName ?? '';
|
||||
const audio = getAudioElement();
|
||||
const actions = new Map([
|
||||
...extraActions,
|
||||
['Space', () => {
|
||||
if (audio !== null) {
|
||||
audio.paused ? audio.play() : audio.pause();
|
||||
}
|
||||
}],
|
||||
['KeyM', () => {
|
||||
if (audio !== null) {
|
||||
audio.muted = !audio.muted;
|
||||
}
|
||||
}],
|
||||
[
|
||||
'ArrowLeft',
|
||||
() => {
|
||||
if (audio !== null) {
|
||||
audio.currentTime -= 5;
|
||||
}
|
||||
}
|
||||
],
|
||||
[
|
||||
'ArrowRight',
|
||||
() => {
|
||||
const audio = getAudioElement();
|
||||
if (audio !== null) {
|
||||
audio.currentTime += 5;
|
||||
}
|
||||
}
|
||||
]
|
||||
]);
|
||||
if (tagName !== 'INPUT' && actions.has(event.code)) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
const action = actions.get(event.code) ?? null;
|
||||
if (action !== null) {
|
||||
action();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import adapter from '@sveltejs/adapter-static';
|
||||
import adapter from '@sveltejs/adapter-node';
|
||||
import { vitePreprocess } from '@sveltejs/kit/vite';
|
||||
|
||||
/** @type {import('@sveltejs/kit').Config} */
|
||||
|
138
yarn.lock
138
yarn.lock
@ -275,6 +275,46 @@
|
||||
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1"
|
||||
integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==
|
||||
|
||||
"@rollup/plugin-commonjs@^24.0.0":
|
||||
version "24.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz#79e54bd83bb64396761431eee6c44152ef322100"
|
||||
integrity sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==
|
||||
dependencies:
|
||||
"@rollup/pluginutils" "^5.0.1"
|
||||
commondir "^1.0.1"
|
||||
estree-walker "^2.0.2"
|
||||
glob "^8.0.3"
|
||||
is-reference "1.2.1"
|
||||
magic-string "^0.27.0"
|
||||
|
||||
"@rollup/plugin-json@^6.0.0":
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-6.0.0.tgz#199fea6670fd4dfb1f4932250569b14719db234a"
|
||||
integrity sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==
|
||||
dependencies:
|
||||
"@rollup/pluginutils" "^5.0.1"
|
||||
|
||||
"@rollup/plugin-node-resolve@^15.0.1":
|
||||
version "15.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.2.tgz#8183a80c2cbf7b471f5ac86b16747997f3b5d185"
|
||||
integrity sha512-Y35fRGUjC3FaurG722uhUuG8YHOJRJQbI6/CkbRkdPotSpDj9NtIN85z1zrcyDcCQIW4qp5mgG72U+gJ0TAFEg==
|
||||
dependencies:
|
||||
"@rollup/pluginutils" "^5.0.1"
|
||||
"@types/resolve" "1.20.2"
|
||||
deepmerge "^4.2.2"
|
||||
is-builtin-module "^3.2.1"
|
||||
is-module "^1.0.0"
|
||||
resolve "^1.22.1"
|
||||
|
||||
"@rollup/pluginutils@^5.0.1":
|
||||
version "5.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33"
|
||||
integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==
|
||||
dependencies:
|
||||
"@types/estree" "^1.0.0"
|
||||
estree-walker "^2.0.2"
|
||||
picomatch "^2.3.1"
|
||||
|
||||
"@skeletonlabs/skeleton@^1.2.5":
|
||||
version "1.2.5"
|
||||
resolved "https://registry.yarnpkg.com/@skeletonlabs/skeleton/-/skeleton-1.2.5.tgz#e35fb147b8353024c3fd35961ab0f8d63233ee3b"
|
||||
@ -282,17 +322,15 @@
|
||||
dependencies:
|
||||
svelte "^3.58.0"
|
||||
|
||||
"@sveltejs/adapter-auto@^2.0.1":
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@sveltejs/adapter-auto/-/adapter-auto-2.0.1.tgz#86b14efd833d7002e4ab2338d5c1efaddb8729d3"
|
||||
integrity sha512-anxxYMcQy7HWSKxN4YNaVcgNzCHtNFwygq72EA1Xv7c+5gSECOJ1ez1PYoLciPiFa7A3XBvMDQXUFJ2eqLDtAA==
|
||||
"@sveltejs/adapter-node@^1.2.4":
|
||||
version "1.2.4"
|
||||
resolved "https://registry.yarnpkg.com/@sveltejs/adapter-node/-/adapter-node-1.2.4.tgz#562e658adc805eb8ded43e26ca6f013cd28904e7"
|
||||
integrity sha512-TNnhS+OKRZ9RKnC+ho5mlE2FJquI61i0v7yOXxBUSU3LAoYH2kwVVL8P8ecjefmZ8BOfM1V54pBnDODBU5CEaA==
|
||||
dependencies:
|
||||
import-meta-resolve "^3.0.0"
|
||||
|
||||
"@sveltejs/adapter-static@^2.0.2":
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@sveltejs/adapter-static/-/adapter-static-2.0.2.tgz#49afd27787fb73d789017d002a91031088494139"
|
||||
integrity sha512-9wYtf6s6ew7DHUHMrt55YpD1FgV7oWql2IGsW5BXquLxqcY9vjrqCFo0TzzDpo+ZPZkW/v77k0eOP6tsAb8HmQ==
|
||||
"@rollup/plugin-commonjs" "^24.0.0"
|
||||
"@rollup/plugin-json" "^6.0.0"
|
||||
"@rollup/plugin-node-resolve" "^15.0.1"
|
||||
rollup "^3.7.0"
|
||||
|
||||
"@sveltejs/kit@^1.15.9":
|
||||
version "1.16.0"
|
||||
@ -330,6 +368,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.5.1.tgz#b29aa1f91a59f35e29ff8f7cb24faf1a3a750554"
|
||||
integrity sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==
|
||||
|
||||
"@types/estree@*", "@types/estree@^1.0.0":
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194"
|
||||
integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==
|
||||
|
||||
"@types/json-schema@^7.0.9":
|
||||
version "7.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
||||
@ -340,6 +383,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.6.tgz#f830323c88172e66826d0bde413498b61054b5a6"
|
||||
integrity sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==
|
||||
|
||||
"@types/resolve@1.20.2":
|
||||
version "1.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975"
|
||||
integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==
|
||||
|
||||
"@types/semver@^7.3.12":
|
||||
version "7.3.13"
|
||||
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91"
|
||||
@ -519,6 +567,13 @@ brace-expansion@^1.1.7:
|
||||
balanced-match "^1.0.0"
|
||||
concat-map "0.0.1"
|
||||
|
||||
brace-expansion@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
|
||||
integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
|
||||
dependencies:
|
||||
balanced-match "^1.0.0"
|
||||
|
||||
braces@^3.0.2, braces@~3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
|
||||
@ -541,6 +596,11 @@ buffer-crc32@^0.2.5:
|
||||
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
||||
integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
|
||||
|
||||
builtin-modules@^3.3.0:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
|
||||
integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
|
||||
|
||||
busboy@^1.6.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
|
||||
@ -603,6 +663,11 @@ commander@^4.0.0:
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
|
||||
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
|
||||
|
||||
commondir@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
|
||||
integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
|
||||
|
||||
concat-map@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
@ -639,7 +704,7 @@ deep-is@^0.1.3:
|
||||
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
|
||||
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
|
||||
|
||||
deepmerge@^4.3.1:
|
||||
deepmerge@^4.2.2, deepmerge@^4.3.1:
|
||||
version "4.3.1"
|
||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
|
||||
integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
|
||||
@ -841,6 +906,11 @@ estraverse@^5.1.0, estraverse@^5.2.0:
|
||||
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
|
||||
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
|
||||
|
||||
estree-walker@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
|
||||
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
|
||||
|
||||
esutils@^2.0.2:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
|
||||
@ -992,6 +1062,17 @@ glob@^7.1.3:
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
glob@^8.0.3:
|
||||
version "8.1.0"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
|
||||
integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^5.0.1"
|
||||
once "^1.3.0"
|
||||
|
||||
globals@^13.19.0:
|
||||
version "13.20.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
|
||||
@ -1061,11 +1142,6 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
|
||||
parent-module "^1.0.0"
|
||||
resolve-from "^4.0.0"
|
||||
|
||||
import-meta-resolve@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz#94a6aabc623874fbc2f3525ec1300db71c6cbc11"
|
||||
integrity sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==
|
||||
|
||||
imurmurhash@^0.1.4:
|
||||
version "0.1.4"
|
||||
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
|
||||
@ -1091,6 +1167,13 @@ is-binary-path@~2.1.0:
|
||||
dependencies:
|
||||
binary-extensions "^2.0.0"
|
||||
|
||||
is-builtin-module@^3.2.1:
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169"
|
||||
integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==
|
||||
dependencies:
|
||||
builtin-modules "^3.3.0"
|
||||
|
||||
is-core-module@^2.11.0:
|
||||
version "2.12.0"
|
||||
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4"
|
||||
@ -1110,6 +1193,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
|
||||
dependencies:
|
||||
is-extglob "^2.1.1"
|
||||
|
||||
is-module@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
|
||||
integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==
|
||||
|
||||
is-number@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
||||
@ -1120,6 +1208,13 @@ is-path-inside@^3.0.3:
|
||||
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
|
||||
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
|
||||
|
||||
is-reference@1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
|
||||
integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
|
||||
dependencies:
|
||||
"@types/estree" "*"
|
||||
|
||||
is-stream@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
|
||||
@ -1263,6 +1358,13 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimatch@^5.0.1:
|
||||
version "5.1.6"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
|
||||
integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
|
||||
dependencies:
|
||||
brace-expansion "^2.0.1"
|
||||
|
||||
minimist@^1.2.0, minimist@^1.2.6:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
|
||||
@ -1535,7 +1637,7 @@ resolve-from@^4.0.0:
|
||||
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
|
||||
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
|
||||
|
||||
resolve@^1.1.7, resolve@^1.22.2:
|
||||
resolve@^1.1.7, resolve@^1.22.1, resolve@^1.22.2:
|
||||
version "1.22.2"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
|
||||
integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
|
||||
@ -1563,7 +1665,7 @@ rimraf@^3.0.2:
|
||||
dependencies:
|
||||
glob "^7.1.3"
|
||||
|
||||
rollup@^3.21.0:
|
||||
rollup@^3.21.0, rollup@^3.7.0:
|
||||
version "3.21.5"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.21.5.tgz#1fbae43dc1079497b04604707f1cf979e51bfe49"
|
||||
integrity sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==
|
||||
|
Loading…
Reference in New Issue
Block a user