WIP: sveltekit

This commit is contained in:
Cat /dev/Nulo 2023-12-09 00:46:17 -03:00
parent 0ee2b5993e
commit 6340a8f58b
35 changed files with 1245 additions and 21 deletions

10
frontend-sveltekit/.gitignore vendored Normal file
View file

@ -0,0 +1,10 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
vite.config.js.timestamp-*
vite.config.ts.timestamp-*

View file

@ -0,0 +1 @@
engine-strict=true

View file

@ -0,0 +1,13 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock

View file

@ -0,0 +1,8 @@
{
"useTabs": true,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 100,
"plugins": ["prettier-plugin-svelte"],
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
}

View file

@ -0,0 +1,38 @@
# create-svelte
Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte).
## Creating a project
If you're seeing this, you've probably already done this step. Congrats!
```bash
# create a new project in the current directory
npm create svelte@latest
# create a new project in my-app
npm create svelte@latest my-app
```
## Developing
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
```bash
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
```
## Building
To create a production version of your app:
```bash
npm run build
```
You can preview the production build with `npm run preview`.
> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.

View file

@ -0,0 +1,37 @@
{
"name": "frontend-sveltekit",
"version": "0.0.1",
"private": true,
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"lint": "prettier --check .",
"format": "prettier --write ."
},
"devDependencies": {
"@poppanator/sveltekit-svg": "^4.1.3",
"@sveltejs/adapter-auto": "^2.0.0",
"@sveltejs/kit": "^1.27.4",
"@tailwindcss/typography": "^0.5.10",
"@types/streamsaver": "^2.0.4",
"autoprefixer": "^10.4.16",
"postcss": "^8.4.32",
"prettier": "^3.0.0",
"prettier-plugin-svelte": "^3.0.0",
"svelte": "^4.2.7",
"svelte-check": "^3.6.0",
"tailwindcss": "^3.3.6",
"tslib": "^2.4.1",
"typescript": "^5.0.0",
"vite": "^4.4.2"
},
"type": "module",
"dependencies": {
"common": "workspace:^",
"eva-icons": "^1.1.3",
"streamsaver": "^2.0.6"
}
}

View file

@ -0,0 +1,24 @@
<script lang="ts">
import { currentRoute, type ComponentType } from "./lib/router";
import NotFound from "./lib/routes/NotFound.svelte";
import Home from "./lib/routes/Home.svelte";
import Dump from "./lib/routes/Dump.svelte";
import Portal from "./lib/routes/Portal.svelte";
import Dataset from "./lib/routes/Dataset.svelte";
function chooseComponent(route: ComponentType) {
if (route === "NotFound") return NotFound;
else if (route === "Home") return Home;
else if (route === "Dataset") return Dataset;
else if (route === "Portal") return Portal;
else if (route === "Dump") return Dump;
}
$: r = {
component: chooseComponent($currentRoute.component) as any,
params: $currentRoute.params as any,
};
</script>
<svelte:component this={r.component} params={r.params} />

View file

@ -0,0 +1,8 @@
import './app.css'
import App from './App.svelte'
const app = new App({
target: document.getElementById('app'),
})
export default app

View file

@ -0,0 +1,8 @@
/// <reference types="svelte" />
/// <reference types="vite/client" />
declare module "*svg?component" {
import { ComponentType, SvelteComponentTyped } from "svelte";
const icon: ComponentType<SvelteComponentTyped>;
export default icon;
}

View file

@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

12
frontend-sveltekit/src/app.d.ts vendored Normal file
View file

@ -0,0 +1,12 @@
// See https://kit.svelte.dev/docs/types#app
// for information about these interfaces
declare global {
namespace App {
// interface Error {}
// interface Locals {}
// interface PageData {}
// interface Platform {}
}
}
export {};

View file

@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover" class="bg-gray-50 dark:bg-gray-900 dark:text-white">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>

View file

@ -0,0 +1,5 @@
<div
class="rounded-lg border dark:border-gray-700 bg-white dark:bg-gray-800 m-2"
>
<slot />
</div>

View file

@ -0,0 +1,15 @@
<script lang="ts">
import ExternalLink from "eva-icons/outline/svg/external-link-outline.svg?component";
export let href: string;
</script>
<a
class="flex items-center leading-none text-gray-600 dark:text-gray-300 gap-1 pt-2"
{href}
target="_blank"
rel="noopener"
>
<ExternalLink fill="currentColor" class="h-4" />
<span class="underline">Fuente</span>
</a>

View file

@ -0,0 +1,64 @@
import { zData, type Distribution, zError, zDumpMetadata } from 'common/schema.js';
export async function downloadFile(dataPath: string, datasetId: string, dist: Distribution) {
const streamSaver = await import('streamsaver');
if (!dist.downloadURL) throw new Error('no downloadURL');
const outputS = streamSaver.createWriteStream(
dist.downloadURL.slice(dist.downloadURL.lastIndexOf('/') + 1)
);
const res = await fetchGzipped(
`${dataPath}/${datasetId}/${dist.identifier}/${dist.fileName || dist.identifier}.gz`
);
await res.body!.pipeTo(outputS);
}
async function fetchGzipped(url: string): Promise<Response> {
let res = await fetch(url);
if (res.status === 404 && url.endsWith('.gz')) {
// probar cargando el archivo no comprimido
res = await fetch(url.slice(0, url.length - '.gz'.length));
return res;
}
const ds = new DecompressionStream('gzip');
const decompressedStream = res.body!.pipeThrough(ds);
const resD = new Response(decompressedStream);
return resD;
}
let cachedGzippedJson = new Map<string, { date: Date; data: unknown }>();
async function loadGzippedJson(url: string): Promise<unknown> {
const cachedEntry = cachedGzippedJson.get(url);
if (cachedEntry) {
if (+cachedEntry.date + 10 * 60 * 1000 > +new Date()) {
return cachedEntry.data;
} else {
cachedGzippedJson.delete(url);
}
}
const res = await fetchGzipped(url);
const json = await res.json();
cachedGzippedJson.set(url, { date: new Date(), data: json });
return json;
}
export async function fetchData(portalUrl: string) {
const json = await loadGzippedJson(`${portalUrl}/data.json.gz`);
if (import.meta.env.DEV) console.debug(json);
return zData.parse(json);
}
export async function fetchDumpMetadata(dumpUrl: string) {
const json = await loadGzippedJson(`${dumpUrl}/dump-metadata.json.gz`);
if (import.meta.env.DEV) console.debug(json);
return zDumpMetadata.parse(json);
}
export async function fetchErrors(url: string) {
const res = await fetchGzipped(`${url}/errors.jsonl.gz`);
const text = await res.text();
const lines = text
.split('\n')
.filter((line) => !!line)
.map((line) => JSON.parse(line))
.map((json) => zError.parse(json));
return lines;
}

View file

@ -0,0 +1,41 @@
<script lang="ts">
import { inject } from "regexparam";
import ChevronRight from "eva-icons/outline/svg/chevron-right-outline.svg?component";
import { generateDumpName, routes } from "../router";
import NavItem from "./NavItem.svelte";
export let params:
| { dumpUrl: string }
| { dumpUrl: string; portal: string }
| { dumpUrl: string; portal: string; id: string };
$: kind = "id" in params ? "dataset" : "portal" in params ? "portal" : "dump";
$: dumpName = generateDumpName(params.dumpUrl);
</script>
<nav class="flex justify-between m-2">
<ol
class="flex items-center mb-3 text-sm text-neutral-500 dark:text-neutral-300 [&_.active-breadcrumb]:text-neutral-600 dark:[&_.active-breadcrumb]:text-neutral-200 [&_.active-breadcrumb]:font-bold sm:mb-0"
class:active-breadcrumb={kind === "dump"}
>
<NavItem href={inject(routes.Dump, params)} active={kind === "dump"}
>{dumpName}</NavItem
>
{#if "portal" in params}
<ChevronRight class="w-5 h-5 text-neutral-400" fill="currentColor" />
<NavItem href={inject(routes.Portal, params)} active={kind === "portal"}>
{params.portal}
</NavItem>
{/if}
{#if "id" in params}
<ChevronRight class="w-5 h-5 text-neutral-400" fill="currentColor" />
<NavItem
href={inject(routes.Dataset, params)}
active={kind === "dataset"}
>
{params.id}
</NavItem>
{/if}
</ol>
</nav>

View file

@ -0,0 +1,14 @@
<script lang="ts">
export let active: boolean = false;
export let href: string;
</script>
<li class="flex items-center h-full">
<a
{href}
class="inline-flex items-center px-2 py-1.5 space-x-1.5 rounded-md hover:text-neutral-900 hover:bg-neutral-100 dark:hover:text-gray-100 dark:hover:bg-gray-800"
class:active-breadcrumb={active}
>
<span><slot /></span>
</a>
</li>

View file

@ -0,0 +1,44 @@
import navaid, { type Params } from "navaid";
import { writable } from "svelte/store";
export const routes = {
Home: "/",
Dump: "/dump/:dumpUrl",
Portal: "/dump/:dumpUrl/:portal",
Dataset: "/dump/:dumpUrl/:portal/dataset/:id",
};
export function generateDumpName(dumpUrl: string) {
const clean = decodeURIComponent(dumpUrl).replace(/\/+$/, "");
return clean.slice(clean.lastIndexOf("/") + 1);
}
const title = "Archivo de portales de datos de Argentina";
const titles: { [key in ComponentType]: (params: Params) => string } = {
Home: () => title,
NotFound: () => title,
Dump: (params) => `${generateDumpName(params.dumpUrl)} - ${title}`,
Portal: (params) => `${params.portal} - ${title}`,
Dataset: (params) => `${params.id} - ${title}`,
};
export type ComponentType = "NotFound" | keyof typeof routes;
type Route = {
component: ComponentType;
params?: Params;
};
export const currentRoute = writable<Route>({ component: "Home" });
currentRoute.subscribe(
(route) => (document.title = titles[route.component](route.params!)),
);
export const router = navaid(undefined, () =>
currentRoute.set({ component: "NotFound" }),
);
for (const [component, path] of Object.entries(routes)) {
router.on(path, (params) =>
currentRoute.set({ component: component as keyof typeof routes, params }),
);
}
router.listen();

View file

@ -0,0 +1,103 @@
<script lang="ts">
import ArrowBack from "eva-icons/outline/svg/arrow-back-outline.svg?component";
import { downloadFile, fetchData, fetchErrors } from "../fetch";
import NotFound from "./NotFound.svelte";
import { inject } from "regexparam";
import { routes } from "../router";
import Nav from "../nav/Nav.svelte";
import SourceLink from "../components/SourceLink.svelte";
import Container from "../components/Container.svelte";
export let params: { dumpUrl: string; portal: string; id: string };
$: url = decodeURIComponent(params.dumpUrl) + "/" + params.portal;
$: data = Promise.all([fetchData(url), fetchErrors(url)]).then(
([data, errors]) => ({ data, errors }),
);
</script>
<main class="mx-auto max-w-3xl">
<Nav {params} />
<Container>
{#await data}
<p class="p-6">Cargando dataset...</p>
{:then { data, errors }}
{@const dataset = data.dataset.find((d) => d.identifier === params.id)}
{#if !dataset}
<NotFound />
{:else}
<header
class="py-5 px-6 border-b border-b-gray-200 dark:border-b-gray-700"
>
<h1 class="font-bold text-3xl">{dataset.title}</h1>
<p class="text-xl">{dataset.description}</p>
<!--
lo saqué porque aún antes de que venga la motosierra estos links no funcionan...
entonces no quiero dar la falsa impresión de que empezaron a bajar cosas cuando no es el caso.
{#if dataset.landingPage}
<a
class="flex items-center leading-none text-gray-600 gap-1 pt-2"
href={dataset.landingPage}
target="_blank"
rel="noopener"
>
<ExternalLink fill="currentColor" class="h-4" />
Fuente
</a>
{/if} -->
</header>
<ul class="divide-y divide-gray-100 dark:divide-gray-700">
{#each dataset.distribution as dist}
{@const error = errors.find(
(e) =>
e.datasetIdentifier === dataset.identifier &&
e.distributionIdentifier === dist.identifier,
)}
<li class="flex px-6 py-5 justify-between items-center">
<div>
<h3>
{dist.title}
{#if dist.format}
<span
class="border border-current text-blue-800 dark:text-blue-400 relative inline-flex items-center text-xs font-semibold px-2 py-1 rounded-full ml-1"
>
<span>{dist.format}</span>
</span>
{/if}
</h3>
{#if !dist.downloadURL}
<small class="block text-red-700">
No está en este archivo porque el link de descarga estaba
roto en la fuente al momento de descargarlo :(
</small>
{:else if error}
<small class="block text-red-700">
No está en este archivo porque hubo un error al descargarlo
:(
</small>
{/if}
{#if dist.fileName}
<small>{dist.fileName}</small>
{/if}
</div>
<div class="flex flex-col items-center">
{#if !error}
<button
type="button"
class="inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 bg-blue-600 rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-offset-2 focus:ring-blue-700 focus:shadow-outline focus:outline-none"
on:click={() => downloadFile(url, dataset.identifier, dist)}
>Descargar</button
>
{/if}
{#if dist.downloadURL}
<SourceLink href={dist.downloadURL} />
{/if}
</div>
</li>
{/each}
</ul>
{/if}
{/await}
</Container>
</main>

View file

@ -0,0 +1 @@
<h1>Esa página no pudo ser encontrada.</h1>

View file

@ -0,0 +1,110 @@
<script lang="ts">
import { inject } from "regexparam";
import ArrowForward from "eva-icons/outline/svg/arrow-forward-outline.svg?component";
import { fetchData, fetchErrors } from "../fetch";
import { routes } from "../router";
import type { Dataset } from "common/schema";
import Nav from "../nav/Nav.svelte";
import SourceLink from "../components/SourceLink.svelte";
import Container from "../components/Container.svelte";
export let params: { dumpUrl: string; portal: string };
$: url = `${decodeURIComponent(params.dumpUrl)}/${params.portal}`;
$: data = Promise.all([fetchData(url), fetchErrors(url)]).then(
([data, errors]) => ({ data, errors }),
);
function arreglarHomepageUrl(url: string): string {
if (!url.startsWith("http://") && !url.startsWith("https://"))
return `https://${url}`;
return url;
}
function processStringForSearch(str: string): string {
return str
.toLowerCase()
.replaceAll("á", "a")
.replaceAll("é", "e")
.replaceAll("í", "i")
.replaceAll("ó", "o")
.replaceAll("ú", "u")
.replaceAll("ñ", "n");
}
let query: string = "";
function filterDatasets(datasets: Dataset[], query: string): Dataset[] {
const q = processStringForSearch(query);
return datasets.filter(
(dataset) =>
processStringForSearch(dataset.identifier).includes(q) ||
processStringForSearch(dataset.title).includes(q),
);
}
</script>
<main class="mx-auto max-w-3xl">
<Nav {params} />
<Container>
{#await data}
<p class="p-6">Cargando..</p>
{:then { data, errors }}
<header
class="py-5 px-6 border-b border-b-gray-200 dark:border-b-gray-700 leading-none"
>
<small>
Viendo portal archivado de
<a
class="underline text-blue-500 dark:text-blue-300"
target="_blank"
rel="noopener"
href={url}>{url}</a
>
</small>
<h1 class="font-bold text-3xl">{data.title}</h1>
<p class="text-xl">{data.description}</p>
{#if data.homepage}
<SourceLink href={arreglarHomepageUrl(data.homepage)} />
{/if}
</header>
<div class="w-full mx-auto px-6 py-2">
<input
type="text"
placeholder="Buscar..."
class="flex w-full h-10 px-3 py-2 text-sm bg-white dark:bg-gray-800 border rounded-md border-neutral-300 dark:border-gray-700 ring-offset-background placeholder:text-neutral-500 dark:placeholder:text-gray-500 focus:border-neutral-300 dark:focus:border-gray-700 focus:outline-none focus:ring-2 focus:ring-neutral-400 dark:focus:ring-gray-600 disabled:cursor-not-allowed disabled:opacity-50"
bind:value={query}
/>
</div>
<ul class="divide-y divide-gray-100 dark:divide-gray-700">
{#each filterDatasets(data.dataset, query) as dataset}
{@const datasetLink = inject(routes.Dataset, {
dumpUrl: params.dumpUrl,
portal: params.portal,
id: dataset.identifier,
})}
<li>
<a
class="flex px-6 py-5 hover:bg-gray-50 dark:hover:bg-gray-700 justify-between"
href={datasetLink}
>
<div>
<h3 class="text-lg">{dataset.title}</h3>
<p class="text-sm">{dataset.description}</p>
</div>
<ArrowForward
fill="currentColor"
aria-hidden="true"
class="w-6 shrink-0 text-gray-600 dark:text-gray-400 "
/>
</a>
</li>
{/each}
</ul>
{:catch error}
Hubo un error intenando cargar este portal archivado. <pre>{error}</pre>
{/await}
</Container>
</main>

View file

@ -0,0 +1,5 @@
<script lang="ts">
import '../app.css';
</script>
<slot />

View file

@ -0,0 +1,37 @@
<script lang="ts">
import Container from '../lib/components/Container.svelte';
</script>
<main class="mx-auto prose dark:prose-invert">
<Container>
<div class="py-5 px-6">
<h1>Archivo de portales de datos abiertos</h1>
<p>
Esta herramienta permite ver datos en archivos de portales de datos abiertos de <a
href="https://github.com/catdevnull/transicion-desordenada-diablo/"
rel="noopener">transicion-desordenada-diablo</a
>
(un mejor nombre sería genial), creada en el marco de
<a href="https://bit.ly/CartaDatosAbiertos">un pedido hecho</a> al gobierno entrante el 10 de
diciembre de 2023 por garantizar el mantenimiento de las políticas de datos públicos en Argentina.
</p>
<div class="not-prose flex place-content-center">
<a
href={`/dump/${encodeURIComponent('https://archivos.nulo.ar/dump-2023-12-08/')}`}
class="flex items-center justify-center px-4 py-2 text-xl font-medium text-white transition-colors duration-200 bg-blue-600 rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-offset-2 focus:ring-blue-700 focus:shadow-outline focus:outline-none text-center"
>
Acceder al archivo creado el 8 de diciembre de 2023
</a>
</div>
<p>
Los archivos y las herramientas fueron creados por
<a href="https://nulo.ar">Nulo</a> con ayuda de varias personas. El código está disponible
<a href="https://github.com/catdevnull/transicion-desordenada-diablo/" rel="noopener"
>en GitHub</a
>.
</p>
</div>
</Container>
</main>

View file

@ -0,0 +1,45 @@
<script lang="ts">
import SourceLink from '$lib/components/SourceLink.svelte';
import Container from '$lib/components/Container.svelte';
import type { PageData } from './$types';
export let data: PageData;
</script>
<main class="mx-auto max-w-3xl">
<Container>
<header class="py-5 px-6 border-b border-b-gray-200 dark:border-b-gray-700 leading-none">
<small>
Viendo archivo en
<a
class="underline text-blue-500 dark:text-blue-300"
target="_blank"
rel="noopener"
href={data.url}>{data.url}</a
>
</small>
</header>
<ul class="divide-y divide-gray-100 dark:divide-gray-700">
{#each data.metadata.sites as site}
{@const portalLink = `/dump/${data.dumpUrl}`}
<li>
<div class="flex px-6 py-5 justify-between gap-3">
<div class="flex flex-col">
<h3 class="text-lg">{site.title}</h3>
<p class="text-sm">{site.description}</p>
</div>
<div class="flex flex-col items-center justify-center shrink-0">
<a
href={portalLink}
class="inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 bg-blue-600 rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-offset-2 focus:ring-blue-700 focus:shadow-outline focus:outline-none"
>Ver portal</a
>
<SourceLink href={site.url} />
</div>
</div>
</li>
{/each}
</ul>
</Container>
</main>

View file

@ -0,0 +1,12 @@
import { fetchDumpMetadata } from '$lib/fetch';
/** @type {import('./$types').PageLoad} */
export async function load({ params }) {
const url = decodeURIComponent(params.dumpUrl);
const metadata = await fetchDumpMetadata(url);
return {
dumpUrl: params.dumpUrl,
url,
metadata
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1,18 @@
import adapter from '@sveltejs/adapter-auto';
import { vitePreprocess } from '@sveltejs/kit/vite';
/** @type {import('@sveltejs/kit').Config} */
const config = {
// Consult https://kit.svelte.dev/docs/integrations#preprocessors
// for more information about preprocessors
preprocess: vitePreprocess(),
kit: {
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
// If your environment is not supported or you settled on a specific environment, switch out the adapter.
// See https://kit.svelte.dev/docs/adapters for more information about adapters.
adapter: adapter()
}
};
export default config;

View file

@ -0,0 +1,8 @@
/** @type {import('tailwindcss').Config} */
export default {
content: ['./src/**/*.{html,js,svelte,ts}'],
theme: {
extend: {}
},
plugins: [require('@tailwindcss/typography')]
};

View file

@ -0,0 +1,18 @@
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"moduleResolution": "bundler"
}
// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
//
// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
// from the referenced tsconfig.json - TypeScript does not merge them in
}

View file

@ -0,0 +1,7 @@
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import svg from '@poppanator/sveltekit-svg';
export default defineConfig({
plugins: [sveltekit(), svg()]
});

View file

@ -1,11 +1,16 @@
import streamSaver from "streamsaver";
import { zData, type Distribution, zError, zDumpMetadata } from "common/schema";
import {
zData,
type Distribution,
zError,
zDumpMetadata,
} from "common/schema.js";
export async function downloadFile(
dataPath: string,
datasetId: string,
dist: Distribution,
) {
const streamSaver = await import("streamsaver");
if (!dist.downloadURL) throw new Error("no downloadURL");
const outputS = streamSaver.createWriteStream(
dist.downloadURL.slice(dist.downloadURL.lastIndexOf("/") + 1),

View file

@ -1,8 +0,0 @@
/** @type {import('tailwindcss').Config} */
export default {
content: ["./index.html", "./src/**/*.svelte"],
theme: {
extend: {},
},
plugins: [require("@tailwindcss/typography")],
};

View file

@ -49,6 +49,9 @@ importers:
specifier: ^3.22.4
version: 3.22.4
devDependencies:
'@poppanator/sveltekit-svg':
specifier: ^4.1.3
version: 4.1.3(svelte@4.2.8)(svgo@3.0.5)(vite@5.0.7)
'@sveltejs/vite-plugin-svelte':
specifier: ^3.0.0
version: 3.0.1(svelte@4.2.8)(vite@5.0.7)
@ -94,9 +97,64 @@ importers:
vite:
specifier: ^5.0.0
version: 5.0.7
vite-plugin-svelte-svg:
specifier: ^2.3.0
version: 2.3.0(svelte@4.2.8)(vite@5.0.7)
frontend-sveltekit:
dependencies:
common:
specifier: workspace:^
version: link:../common
eva-icons:
specifier: ^1.1.3
version: 1.1.3
streamsaver:
specifier: ^2.0.6
version: 2.0.6
devDependencies:
'@poppanator/sveltekit-svg':
specifier: ^4.1.3
version: 4.1.3(svelte@4.2.8)(svgo@3.0.5)(vite@4.5.1)
'@sveltejs/adapter-auto':
specifier: ^2.0.0
version: 2.1.1(@sveltejs/kit@1.27.7)
'@sveltejs/kit':
specifier: ^1.27.4
version: 1.27.7(svelte@4.2.8)(vite@4.5.1)
'@tailwindcss/typography':
specifier: ^0.5.10
version: 0.5.10(tailwindcss@3.3.6)
'@types/streamsaver':
specifier: ^2.0.4
version: 2.0.4
autoprefixer:
specifier: ^10.4.16
version: 10.4.16(postcss@8.4.32)
postcss:
specifier: ^8.4.32
version: 8.4.32
prettier:
specifier: ^3.0.0
version: 3.1.0
prettier-plugin-svelte:
specifier: ^3.0.0
version: 3.1.2(prettier@3.1.0)(svelte@4.2.8)
svelte:
specifier: ^4.2.7
version: 4.2.8
svelte-check:
specifier: ^3.6.0
version: 3.6.2(postcss@8.4.32)(svelte@4.2.8)
tailwindcss:
specifier: ^3.3.6
version: 3.3.6
tslib:
specifier: ^2.4.1
version: 2.6.2
typescript:
specifier: ^5.0.0
version: 5.3.3
vite:
specifier: ^4.4.2
version: 4.5.1
packages:
@ -113,6 +171,15 @@ packages:
'@jridgewell/trace-mapping': 0.3.20
dev: true
/@esbuild/android-arm64@0.18.20:
resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-arm64@0.19.8:
resolution: {integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==}
engines: {node: '>=12'}
@ -122,6 +189,15 @@ packages:
dev: true
optional: true
/@esbuild/android-arm@0.18.20:
resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-arm@0.19.8:
resolution: {integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==}
engines: {node: '>=12'}
@ -131,6 +207,15 @@ packages:
dev: true
optional: true
/@esbuild/android-x64@0.18.20:
resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-x64@0.19.8:
resolution: {integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==}
engines: {node: '>=12'}
@ -140,6 +225,15 @@ packages:
dev: true
optional: true
/@esbuild/darwin-arm64@0.18.20:
resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-arm64@0.19.8:
resolution: {integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==}
engines: {node: '>=12'}
@ -149,6 +243,15 @@ packages:
dev: true
optional: true
/@esbuild/darwin-x64@0.18.20:
resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-x64@0.19.8:
resolution: {integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==}
engines: {node: '>=12'}
@ -158,6 +261,15 @@ packages:
dev: true
optional: true
/@esbuild/freebsd-arm64@0.18.20:
resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-arm64@0.19.8:
resolution: {integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==}
engines: {node: '>=12'}
@ -167,6 +279,15 @@ packages:
dev: true
optional: true
/@esbuild/freebsd-x64@0.18.20:
resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-x64@0.19.8:
resolution: {integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==}
engines: {node: '>=12'}
@ -176,6 +297,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-arm64@0.18.20:
resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm64@0.19.8:
resolution: {integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==}
engines: {node: '>=12'}
@ -185,6 +315,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-arm@0.18.20:
resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm@0.19.8:
resolution: {integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==}
engines: {node: '>=12'}
@ -194,6 +333,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-ia32@0.18.20:
resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ia32@0.19.8:
resolution: {integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==}
engines: {node: '>=12'}
@ -203,6 +351,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-loong64@0.18.20:
resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-loong64@0.19.8:
resolution: {integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==}
engines: {node: '>=12'}
@ -212,6 +369,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-mips64el@0.18.20:
resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-mips64el@0.19.8:
resolution: {integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==}
engines: {node: '>=12'}
@ -221,6 +387,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-ppc64@0.18.20:
resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ppc64@0.19.8:
resolution: {integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==}
engines: {node: '>=12'}
@ -230,6 +405,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-riscv64@0.18.20:
resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-riscv64@0.19.8:
resolution: {integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==}
engines: {node: '>=12'}
@ -239,6 +423,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-s390x@0.18.20:
resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-s390x@0.19.8:
resolution: {integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==}
engines: {node: '>=12'}
@ -248,6 +441,15 @@ packages:
dev: true
optional: true
/@esbuild/linux-x64@0.18.20:
resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-x64@0.19.8:
resolution: {integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==}
engines: {node: '>=12'}
@ -257,6 +459,15 @@ packages:
dev: true
optional: true
/@esbuild/netbsd-x64@0.18.20:
resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/netbsd-x64@0.19.8:
resolution: {integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==}
engines: {node: '>=12'}
@ -266,6 +477,15 @@ packages:
dev: true
optional: true
/@esbuild/openbsd-x64@0.18.20:
resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/openbsd-x64@0.19.8:
resolution: {integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==}
engines: {node: '>=12'}
@ -275,6 +495,15 @@ packages:
dev: true
optional: true
/@esbuild/sunos-x64@0.18.20:
resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
requiresBuild: true
dev: true
optional: true
/@esbuild/sunos-x64@0.19.8:
resolution: {integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==}
engines: {node: '>=12'}
@ -284,6 +513,15 @@ packages:
dev: true
optional: true
/@esbuild/win32-arm64@0.18.20:
resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-arm64@0.19.8:
resolution: {integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==}
engines: {node: '>=12'}
@ -293,6 +531,15 @@ packages:
dev: true
optional: true
/@esbuild/win32-ia32@0.18.20:
resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-ia32@0.19.8:
resolution: {integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==}
engines: {node: '>=12'}
@ -302,6 +549,15 @@ packages:
dev: true
optional: true
/@esbuild/win32-x64@0.18.20:
resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-x64@0.19.8:
resolution: {integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==}
engines: {node: '>=12'}
@ -314,7 +570,6 @@ packages:
/@fastify/busboy@2.1.0:
resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==}
engines: {node: '>=14'}
dev: false
/@jridgewell/gen-mapping@0.3.3:
resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
@ -367,6 +622,34 @@ packages:
fastq: 1.15.0
dev: true
/@polka/url@1.0.0-next.24:
resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==}
dev: true
/@poppanator/sveltekit-svg@4.1.3(svelte@4.2.8)(svgo@3.0.5)(vite@4.5.1):
resolution: {integrity: sha512-cKdFxFPPzS470xy2XFQ2m/URa9On4fw7n5wvBqAwVO4sY8dmski+2N3GKFELt4tvzM3JPjAqz76Ex7U5IpKeIg==}
peerDependencies:
svelte: '>=4.x'
svgo: '>=3.x'
vite: '>=4.x'
dependencies:
svelte: 4.2.8
svgo: 3.0.5
vite: 4.5.1
dev: true
/@poppanator/sveltekit-svg@4.1.3(svelte@4.2.8)(svgo@3.0.5)(vite@5.0.7):
resolution: {integrity: sha512-cKdFxFPPzS470xy2XFQ2m/URa9On4fw7n5wvBqAwVO4sY8dmski+2N3GKFELt4tvzM3JPjAqz76Ex7U5IpKeIg==}
peerDependencies:
svelte: '>=4.x'
svgo: '>=3.x'
vite: '>=4.x'
dependencies:
svelte: 4.2.8
svgo: 3.0.5
vite: 5.0.7
dev: true
/@rollup/rollup-android-arm-eabi@4.7.0:
resolution: {integrity: sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==}
cpu: [arm]
@ -471,6 +754,59 @@ packages:
dev: true
optional: true
/@sveltejs/adapter-auto@2.1.1(@sveltejs/kit@1.27.7):
resolution: {integrity: sha512-nzi6x/7/3Axh5VKQ8Eed3pYxastxoa06Y/bFhWb7h3Nu+nGRVxKAy3+hBJgmPCwWScy8n0TsstZjSVKfyrIHkg==}
peerDependencies:
'@sveltejs/kit': ^1.0.0
dependencies:
'@sveltejs/kit': 1.27.7(svelte@4.2.8)(vite@4.5.1)
import-meta-resolve: 4.0.0
dev: true
/@sveltejs/kit@1.27.7(svelte@4.2.8)(vite@4.5.1):
resolution: {integrity: sha512-AzXYDoYt42clCBwLF9GTHsXyg2DFR31Ncyt8yxu8Aw4tgB433V+w+hcr1RTfAN9zKW2J2PY9FMQ8FoX/4Vw8CA==}
engines: {node: ^16.14 || >=18}
hasBin: true
requiresBuild: true
peerDependencies:
svelte: ^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0
vite: ^4.0.0
dependencies:
'@sveltejs/vite-plugin-svelte': 2.5.3(svelte@4.2.8)(vite@4.5.1)
'@types/cookie': 0.5.4
cookie: 0.5.0
devalue: 4.3.2
esm-env: 1.0.0
kleur: 4.1.5
magic-string: 0.30.5
mrmime: 1.0.1
sade: 1.8.1
set-cookie-parser: 2.6.0
sirv: 2.0.3
svelte: 4.2.8
tiny-glob: 0.2.9
undici: 5.26.5
vite: 4.5.1
transitivePeerDependencies:
- supports-color
dev: true
/@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@4.2.8)(vite@4.5.1):
resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==}
engines: {node: ^14.18.0 || >= 16}
peerDependencies:
'@sveltejs/vite-plugin-svelte': ^2.2.0
svelte: ^3.54.0 || ^4.0.0
vite: ^4.0.0
dependencies:
'@sveltejs/vite-plugin-svelte': 2.5.3(svelte@4.2.8)(vite@4.5.1)
debug: 4.3.4
svelte: 4.2.8
vite: 4.5.1
transitivePeerDependencies:
- supports-color
dev: true
/@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.1)(svelte@4.2.8)(vite@5.0.7):
resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==}
engines: {node: ^18.0.0 || >=20}
@ -487,6 +823,26 @@ packages:
- supports-color
dev: true
/@sveltejs/vite-plugin-svelte@2.5.3(svelte@4.2.8)(vite@4.5.1):
resolution: {integrity: sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==}
engines: {node: ^14.18.0 || >= 16}
peerDependencies:
svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-next.0
vite: ^4.0.0
dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@4.2.8)(vite@4.5.1)
debug: 4.3.4
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.5
svelte: 4.2.8
svelte-hmr: 0.15.3(svelte@4.2.8)
vite: 4.5.1
vitefu: 0.2.5(vite@4.5.1)
transitivePeerDependencies:
- supports-color
dev: true
/@sveltejs/vite-plugin-svelte@3.0.1(svelte@4.2.8)(vite@5.0.7):
resolution: {integrity: sha512-CGURX6Ps+TkOovK6xV+Y2rn8JKa8ZPUHPZ/NKgCxAmgBrXReavzFl8aOSCj3kQ1xqT7yGJj53hjcV/gqwDAaWA==}
engines: {node: ^18.0.0 || >=20}
@ -532,6 +888,10 @@ packages:
resolution: {integrity: sha512-BRbo1fOtyVbhfLyuCWw6wAWp+U8UQle+ZXu84MYYWzYSEB28dyfnRBIE99eoG+qdAC0po6L2ScIEivcT07UaMA==}
dev: true
/@types/cookie@0.5.4:
resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==}
dev: true
/@types/estree@1.0.5:
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
dev: true
@ -695,6 +1055,11 @@ packages:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true
/cookie@0.5.0:
resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
engines: {node: '>= 0.6'}
dev: true
/css-select@5.1.0:
resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
dependencies:
@ -766,6 +1131,10 @@ packages:
engines: {node: '>=8'}
dev: true
/devalue@4.3.2:
resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==}
dev: true
/didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
dev: true
@ -814,6 +1183,36 @@ packages:
resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
dev: true
/esbuild@0.18.20:
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/android-arm': 0.18.20
'@esbuild/android-arm64': 0.18.20
'@esbuild/android-x64': 0.18.20
'@esbuild/darwin-arm64': 0.18.20
'@esbuild/darwin-x64': 0.18.20
'@esbuild/freebsd-arm64': 0.18.20
'@esbuild/freebsd-x64': 0.18.20
'@esbuild/linux-arm': 0.18.20
'@esbuild/linux-arm64': 0.18.20
'@esbuild/linux-ia32': 0.18.20
'@esbuild/linux-loong64': 0.18.20
'@esbuild/linux-mips64el': 0.18.20
'@esbuild/linux-ppc64': 0.18.20
'@esbuild/linux-riscv64': 0.18.20
'@esbuild/linux-s390x': 0.18.20
'@esbuild/linux-x64': 0.18.20
'@esbuild/netbsd-x64': 0.18.20
'@esbuild/openbsd-x64': 0.18.20
'@esbuild/sunos-x64': 0.18.20
'@esbuild/win32-arm64': 0.18.20
'@esbuild/win32-ia32': 0.18.20
'@esbuild/win32-x64': 0.18.20
dev: true
/esbuild@0.19.8:
resolution: {integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==}
engines: {node: '>=12'}
@ -849,6 +1248,10 @@ packages:
engines: {node: '>=6'}
dev: true
/esm-env@1.0.0:
resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==}
dev: true
/estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
dependencies:
@ -939,6 +1342,14 @@ packages:
path-is-absolute: 1.0.1
dev: true
/globalyzer@0.1.0:
resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
dev: true
/globrex@0.1.2:
resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
dev: true
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
dev: true
@ -958,6 +1369,10 @@ packages:
resolve-from: 4.0.0
dev: true
/import-meta-resolve@4.0.0:
resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==}
dev: true
/inflight@1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
dependencies:
@ -1107,6 +1522,11 @@ packages:
engines: {node: '>=4'}
dev: true
/mrmime@1.0.1:
resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
engines: {node: '>=10'}
dev: true
/ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
dev: true
@ -1296,6 +1716,16 @@ packages:
source-map-js: 1.0.2
dev: true
/prettier-plugin-svelte@3.1.2(prettier@3.1.0)(svelte@4.2.8):
resolution: {integrity: sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA==}
peerDependencies:
prettier: ^3.0.0
svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0
dependencies:
prettier: 3.1.0
svelte: 4.2.8
dev: true
/prettier-plugin-tailwindcss@0.5.9(prettier@3.1.0):
resolution: {integrity: sha512-9x3t1s2Cjbut2QiP+O0mDqV3gLXTe2CgRlQDgucopVkUdw26sQi53p/q4qvGxMLBDfk/dcTV57Aa/zYwz9l8Ew==}
engines: {node: '>=14.21.3'}
@ -1407,6 +1837,14 @@ packages:
glob: 7.2.3
dev: true
/rollup@3.29.4:
resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
optionalDependencies:
fsevents: 2.3.3
dev: true
/rollup@4.7.0:
resolution: {integrity: sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@ -1450,6 +1888,19 @@ packages:
rimraf: 2.7.1
dev: true
/set-cookie-parser@2.6.0:
resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
dev: true
/sirv@2.0.3:
resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==}
engines: {node: '>= 10'}
dependencies:
'@polka/url': 1.0.0-next.24
mrmime: 1.0.1
totalist: 3.0.1
dev: true
/sorcery@0.11.0:
resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==}
hasBin: true
@ -1656,6 +2107,13 @@ packages:
any-promise: 1.3.0
dev: true
/tiny-glob@0.2.9:
resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
dependencies:
globalyzer: 0.1.0
globrex: 0.1.2
dev: true
/to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@ -1663,6 +2121,11 @@ packages:
is-number: 7.0.0
dev: true
/totalist@3.0.1:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
dev: true
/ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
dev: true
@ -1681,6 +2144,13 @@ packages:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
dev: true
/undici@5.26.5:
resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==}
engines: {node: '>=14.0'}
dependencies:
'@fastify/busboy': 2.1.0
dev: true
/undici@5.28.2:
resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==}
engines: {node: '>=14.0'}
@ -1703,15 +2173,39 @@ packages:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
dev: true
/vite-plugin-svelte-svg@2.3.0(svelte@4.2.8)(vite@5.0.7):
resolution: {integrity: sha512-Bzo62u9Fj9PDldSvPrUgCzIFc9MmNbhxAUdBCofPyPyuVtoKaQxtsI01JXLk35x8/OQFHfxoTShEgPxtd4+c9Q==}
/vite@4.5.1:
resolution: {integrity: sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
svelte: '>= 3.0.0 < 5.0.0'
vite: < 5.0.0
'@types/node': '>= 14'
less: '*'
lightningcss: ^1.21.0
sass: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
peerDependenciesMeta:
'@types/node':
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
dependencies:
svelte: 4.2.8
svgo: 3.0.5
vite: 5.0.7
esbuild: 0.18.20
postcss: 8.4.32
rollup: 3.29.4
optionalDependencies:
fsevents: 2.3.3
dev: true
/vite@5.0.7:
@ -1749,6 +2243,17 @@ packages:
fsevents: 2.3.3
dev: true
/vitefu@0.2.5(vite@4.5.1):
resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
peerDependencies:
vite: ^3.0.0 || ^4.0.0 || ^5.0.0
peerDependenciesMeta:
vite:
optional: true
dependencies:
vite: 4.5.1
dev: true
/vitefu@0.2.5(vite@5.0.7):
resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
peerDependencies:

View file

@ -1,4 +1,5 @@
packages:
- "frontend/"
- "frontend-sveltekit/"
- "downloader/"
- "common/"