diff --git a/backend/_i18n/de.yml b/backend/_i18n/de.yml
index f38c16e8..ab088320 100644
--- a/backend/_i18n/de.yml
+++ b/backend/_i18n/de.yml
@@ -28,9 +28,9 @@ curricula_page:
contact: ''
teaser: https://www.youtube.com/embed/2B6gZ9HdQ1Y
basics_ai:
- title: Basisprincipes van AI
- sub_title: Basisprincipes van AI
- description: 'Onder dit lesthema bundelen we verschillende activiteiten waarin de basisprincipes van artificiële intelligentie (AI) aan bod komen. Leerlingen leren wat AI is, hoe het werkt en hoe het kan worden toegepast in verschillende domeinen.'
+ title: Grundlagen der KI
+ sub_title: Grundlagen der KI
+ description: 'Dieses Thema bündelt verschiedene Aktivitäten, in denen die grundlegenden Prinzipien der künstlichen Intelligenz (KI) behandelt werden. Die Schüler lernen, was KI ist, wie sie funktioniert und wie sie in verschiedenen Bereichen angewendet werden kann.'
contact: ''
kiks:
title: KI und Klima
diff --git a/backend/_i18n/en.yml b/backend/_i18n/en.yml
index 20a34e77..6033b56f 100644
--- a/backend/_i18n/en.yml
+++ b/backend/_i18n/en.yml
@@ -28,10 +28,11 @@ curricula_page:
contact: ''
teaser: https://www.youtube.com/embed/2B6gZ9HdQ1Y
basics_ai:
- title: Basisprincipes van AI
- sub_title: Basisprincipes van AI
- description: 'Onder dit lesthema bundelen we verschillende activiteiten waarin de basisprincipes van artificiële intelligentie (AI) aan bod komen. Leerlingen leren wat AI is, hoe het werkt en hoe het kan worden toegepast in verschillende domeinen.'
+ title: Basics of AI
+ sub_title: Basics of AI
+ description: 'This theme brings together various activities covering the basic principles of Artificial Intelligence (AI). Students learn what AI is, how it works, and how it can be applied in different domains.'
contact: ''
+
kiks:
title: AI and Climate
sub_title: KIKS
diff --git a/backend/_i18n/fr.yml b/backend/_i18n/fr.yml
index 08a0b1d7..d97c43b2 100644
--- a/backend/_i18n/fr.yml
+++ b/backend/_i18n/fr.yml
@@ -28,9 +28,9 @@ curricula_page:
contact: ''
teaser: https://www.youtube.com/embed/2B6gZ9HdQ1Y
basics_ai:
- title: Basisprincipes van AI
- sub_title: Basisprincipes van AI
- description: 'Onder dit lesthema bundelen we verschillende activiteiten waarin de basisprincipes van artificiële intelligentie (AI) aan bod komen. Leerlingen leren wat AI is, hoe het werkt en hoe het kan worden toegepast in verschillende domeinen.'
+ title: Principes de base de l’IA
+ sub_title: Principes de base de l’IA
+ description: 'Ce thème rassemble différentes activités portant sur les principes fondamentaux de l’intelligence artificielle (IA). Les élèves apprennent ce qu’est l’IA, comment elle fonctionne et comment elle peut être appliquée dans divers domaines.'
contact: ''
kiks:
title: 'IA et changement climatique'
diff --git a/backend/src/controllers/themes.ts b/backend/src/controllers/themes.ts
index 37539690..f516d840 100644
--- a/backend/src/controllers/themes.ts
+++ b/backend/src/controllers/themes.ts
@@ -6,7 +6,7 @@ interface Translations {
curricula_page: Record;
}
-export function getThemes(req: Request, res: Response): void {
+export function getThemesHandler(req: Request, res: Response): void {
const language = (req.query.language as string).toLowerCase() || 'nl';
const translations = loadTranslations(language);
const themeList = themes.map((theme) => ({
@@ -19,8 +19,14 @@ export function getThemes(req: Request, res: Response): void {
res.json(themeList);
}
-export function getThemeByTitle(req: Request, res: Response): void {
+export function getHruidsByThemeHandler(req: Request, res: Response): void {
const themeKey = req.params.theme;
+
+ if (!themeKey) {
+ res.status(400).json({ error: 'Missing required field: theme' });
+ return;
+ }
+
const theme = themes.find((t) => t.title === themeKey);
if (theme) {
diff --git a/backend/src/routes/themes.ts b/backend/src/routes/themes.ts
index 388b3e38..b135d44f 100644
--- a/backend/src/routes/themes.ts
+++ b/backend/src/routes/themes.ts
@@ -1,14 +1,14 @@
import express from 'express';
-import { getThemes, getThemeByTitle } from '../controllers/themes.js';
+import { getThemesHandler, getHruidsByThemeHandler } from '../controllers/themes.js';
const router = express.Router();
// Query: language
// Route to fetch list of {key, title, description, image} themes in their respective language
-router.get('/', getThemes);
+router.get('/', getThemesHandler);
// Arg: theme (key)
// Route to fetch list of hruids based on theme
-router.get('/:theme', getThemeByTitle);
+router.get('/:theme', getHruidsByThemeHandler);
export default router;
diff --git a/frontend/package.json b/frontend/package.json
index ac1efc4a..e8133004 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -16,12 +16,14 @@
"test:e2e": "playwright test"
},
"dependencies": {
+ "@tanstack/react-query": "^5.69.0",
+ "@tanstack/vue-query": "^5.69.0",
+ "axios": "^1.8.2",
+ "oidc-client-ts": "^3.1.0",
"vue": "^3.5.13",
"vue-i18n": "^11.1.2",
"vue-router": "^4.5.0",
- "vuetify": "^3.7.12",
- "oidc-client-ts": "^3.1.0",
- "axios": "^1.8.2"
+ "vuetify": "^3.7.12"
},
"devDependencies": {
"@playwright/test": "^1.50.1",
diff --git a/frontend/src/components/BrowseThemes.vue b/frontend/src/components/BrowseThemes.vue
index 9575da5f..eeea2c81 100644
--- a/frontend/src/components/BrowseThemes.vue
+++ b/frontend/src/components/BrowseThemes.vue
@@ -1,9 +1,71 @@
+
-
+
+
+
+
+
mdi-alert-circle
+
Error loading: {{ error.message }}
+
+
+
+
+
+
+
+
diff --git a/frontend/src/components/MenuBar.vue b/frontend/src/components/MenuBar.vue
index b5ea4fdb..b098ba38 100644
--- a/frontend/src/components/MenuBar.vue
+++ b/frontend/src/components/MenuBar.vue
@@ -9,15 +9,10 @@
const { t, locale } = useI18n();
- // Instantiate variables to use in html to render right
- // Links and content dependent on the role (student or teacher)
- const path = "/user";
-
const role = auth.authState.activeRole;
- //TODO: use authState form services map to get user token
- const name = "Kurt Cobain";
- const initials = name
+ const name: string = auth.authState.user!.profile.name!;
+ const initials: string = name
.split(" ")
.map((n) => n[0])
.join("");
@@ -26,6 +21,8 @@
const languages = ref([
{ name: "English", code: "en" },
{ name: "Nederlands", code: "nl" },
+ { name: "Français", code: "fr" },
+ { name: "Deutsch", code: "de" }
]);
// Logic to change the language of the website to the selected language
@@ -33,16 +30,137 @@
locale.value = langCode;
localStorage.setItem("user-lang", langCode);
}
+
+ // Contains functionality to let the collapsed menu appear and disappear when the screen size varies
+ const drawer = ref(false);
+
+ // When the user wants to logout, a popup is shown to verify this
+ // If verified, the user should be logged out
+ async function performLogout(): Promise {
+ await auth.logout();
+ }
+
+
+
@@ -187,4 +351,16 @@
nav a.router-link-active {
font-weight: bold;
}
+
+ @media (max-width: 700px) {
+ .menu {
+ display: none;
+ }
+ }
+
+ @media (min-width: 701px) {
+ .menu_collapsed {
+ display: none;
+ }
+ }
diff --git a/frontend/src/components/ThemeCard.vue b/frontend/src/components/ThemeCard.vue
new file mode 100644
index 00000000..ac9b3904
--- /dev/null
+++ b/frontend/src/components/ThemeCard.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+ {{ title }}
+
+ {{ description }}
+
+
+ {{ t("read-more") }}
+
+
+
+
+
+
diff --git a/frontend/src/controllers/base-controller.ts b/frontend/src/controllers/base-controller.ts
new file mode 100644
index 00000000..adc0c8c0
--- /dev/null
+++ b/frontend/src/controllers/base-controller.ts
@@ -0,0 +1,73 @@
+import {apiConfig} from "@/config.ts";
+
+export class BaseController {
+ protected baseUrl: string;
+
+ constructor(basePath: string) {
+ this.baseUrl = `${apiConfig.baseUrl}/${basePath}`;
+ }
+
+ protected async get(path: string, queryParams?: Record): Promise {
+ let url = `${this.baseUrl}${path}`;
+ if (queryParams) {
+ const query = new URLSearchParams();
+ Object.entries(queryParams).forEach(([key, value]) => {
+ if (value !== undefined && value !== null) {
+ query.append(key, value.toString());
+ }
+ });
+ url += `?${query.toString()}`;
+ }
+
+ const res = await fetch(url);
+ if (!res.ok) {
+ const errorData = await res.json().catch(() => ({}));
+ throw new Error(errorData?.error || `Error ${res.status}: ${res.statusText}`);
+ }
+
+ return res.json();
+ }
+
+ protected async post(path: string, body: unknown): Promise {
+ const res = await fetch(`${this.baseUrl}${path}`, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(body),
+ });
+
+ if (!res.ok) {
+ const errorData = await res.json().catch(() => ({}));
+ throw new Error(errorData?.error || `Error ${res.status}: ${res.statusText}`);
+ }
+
+ return res.json();
+ }
+
+ protected async delete(path: string): Promise {
+ const res = await fetch(`${this.baseUrl}${path}`, {
+ method: "DELETE",
+ });
+
+ if (!res.ok) {
+ const errorData = await res.json().catch(() => ({}));
+ throw new Error(errorData?.error || `Error ${res.status}: ${res.statusText}`);
+ }
+
+ return res.json();
+ }
+
+ protected async put(path: string, body: unknown): Promise {
+ const res = await fetch(`${this.baseUrl}${path}`, {
+ method: "PUT",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(body),
+ });
+
+ if (!res.ok) {
+ const errorData = await res.json().catch(() => ({}));
+ throw new Error(errorData?.error || `Error ${res.status}: ${res.statusText}`);
+ }
+
+ return res.json();
+ }
+}
diff --git a/frontend/src/controllers/controllers.ts b/frontend/src/controllers/controllers.ts
new file mode 100644
index 00000000..b3bbeb61
--- /dev/null
+++ b/frontend/src/controllers/controllers.ts
@@ -0,0 +1,14 @@
+import {ThemeController} from "@/controllers/themes.ts";
+
+export function controllerGetter(Factory: new () => T): () => T {
+ let instance: T | undefined;
+
+ return (): T => {
+ if (!instance) {
+ instance = new Factory();
+ }
+ return instance;
+ };
+}
+
+export const getThemeController = controllerGetter(ThemeController);
diff --git a/frontend/src/controllers/themes.ts b/frontend/src/controllers/themes.ts
new file mode 100644
index 00000000..447c9248
--- /dev/null
+++ b/frontend/src/controllers/themes.ts
@@ -0,0 +1,16 @@
+import {BaseController} from "@/controllers/base-controller.ts";
+
+export class ThemeController extends BaseController {
+ constructor() {
+ super("theme");
+ }
+
+ getAll(language: string | null = null) {
+ const query = language ? { language } : undefined;
+ return this.get("/", query);
+ }
+
+ getHruidsByKey(themeKey: string) {
+ return this.get(`/${encodeURIComponent(themeKey)}`);
+ }
+}
diff --git a/frontend/src/i18n/locale/de.json b/frontend/src/i18n/locale/de.json
index a1a699e5..956e8b96 100644
--- a/frontend/src/i18n/locale/de.json
+++ b/frontend/src/i18n/locale/de.json
@@ -1,3 +1,43 @@
{
- "welcome": "Willkommen"
+ "welcome": "Willkommen",
+ "student": "schüler",
+ "teacher": "lehrer",
+ "assignments": "Aufgaben",
+ "classes": "Klasses",
+ "discussions": "Diskussionen",
+ "login": "einloggen",
+ "logout": "ausloggen",
+ "cancel": "kündigen",
+ "logoutVerification": "Sind Sie sicher, dass Sie sich abmelden wollen?",
+ "homeTitle": "Unsere Stärken",
+ "homeIntroduction1": "Wir entwickeln innovative Workshops und Bildungsressourcen, die wir in Zusammenarbeit mit Lehrern und Freiwilligen Schülern auf der ganzen Welt zur Verfügung stellen. Unsere Train-the-Trainer-Sitzungen ermöglichen es ihnen, unsere praktischen Workshops an die Schüler weiterzugeben.",
+ "homeIntroduction2": "Wir fügen allen unseren Projekten ständig neue Projekte und Methoden hinzu. Für diese Projekte suchen wir immer nach einem gesellschaftlich relevanten Thema. Darüber hinaus stellen wir sicher, dass unser didaktisches Material auf wissenschaftlicher Forschung basiert, und achten stets auf die Inklusion.",
+ "innovative": "Innovativ",
+ "researchBased": "Forschungsbasiert",
+ "inclusive": "Inclusiv",
+ "sociallyRelevant": "Gesellschaftlich relevant",
+ "translate": "übersetzen",
+ "themes": "Themen",
+ "choose-theme": "Wähle ein thema",
+ "choose-age": "Alter auswählen",
+ "theme-options": {
+ "all": "Alle themen",
+ "culture": "Kultur",
+ "electricity-and-mechanics": "Elektrizität und Mechanik",
+ "nature-and-climate": "Natur und Klima",
+ "agriculture": "Landwirtschaft",
+ "society": "Gesellschaft",
+ "math": "Mathematik",
+ "technology": "Technologie",
+ "algorithms": "Algorithmisches Denken"
+ },
+ "age-options": {
+ "all": "Alle altersgruppen",
+ "primary-school": "Grundschule",
+ "lower-secondary": "12-14 jahre alt",
+ "upper-secondary": "14-16 jahre alt",
+ "high-school": "16-18 jahre alt",
+ "older": "18 und älter"
+ },
+ "read-more": "Mehr lesen"
}
diff --git a/frontend/src/i18n/locale/en.json b/frontend/src/i18n/locale/en.json
index c75bfc5d..cf7a19cb 100644
--- a/frontend/src/i18n/locale/en.json
+++ b/frontend/src/i18n/locale/en.json
@@ -2,8 +2,42 @@
"welcome": "Welcome",
"student": "student",
"teacher": "teacher",
- "assignments": "assignments",
- "classes": "classes",
- "discussions": "discussions",
- "logout": "log out"
+ "assignments": "Assignments",
+ "classes": "Classes",
+ "discussions": "Discussions",
+ "logout": "log out",
+ "cancel": "cancel",
+ "logoutVerification": "Are you sure you want to log out?",
+ "homeTitle": "Our strengths",
+ "homeIntroduction1": "We develop innovative workshops and educational resources, and we provide them to students around the globe in collaboration with teachers and volunteers. Our train-the-trainer sessions enable them to bring our hands-on workshops to the students.",
+ "homeIntroduction2": "We continuously add new projects and methodologies to all our projects. For these projects, we always look for a socially relevant theme. Additionally, we ensure that our didactic material is based on scientific research and always keep an eye on inclusivity.",
+ "innovative": "Innovative",
+ "researchBased": "Research-based",
+ "inclusive": "Inclusive",
+ "sociallyRelevant": "Socially relevant",
+ "login": "log in",
+ "translate": "translate",
+ "themes": "Themes",
+ "choose-theme": "Select a theme",
+ "choose-age": "Select age",
+ "theme-options": {
+ "all": "All themes",
+ "culture": "Culture",
+ "electricity-and-mechanics": "Electricity and mechanics",
+ "nature-and-climate": "Nature and climate",
+ "agriculture": "Agriculture",
+ "society": "Society",
+ "math": "Math",
+ "technology": "Technology",
+ "algorithms": "Algorithms"
+ },
+ "age-options": {
+ "all": "All ages",
+ "primary-school": "Primary school",
+ "lower-secondary": "12-14 years old",
+ "upper-secondary": "14-16 years old",
+ "high-school": "16-18 years old",
+ "older": "18 and older"
+ },
+ "read-more": "Read more"
}
diff --git a/frontend/src/i18n/locale/fr.json b/frontend/src/i18n/locale/fr.json
index 86fe964d..0b4041a4 100644
--- a/frontend/src/i18n/locale/fr.json
+++ b/frontend/src/i18n/locale/fr.json
@@ -1,3 +1,43 @@
{
- "welcome": "Bienvenue"
+ "welcome": "Bienvenue",
+ "student": "élève",
+ "teacher": "enseignant",
+ "assignments": "Travails",
+ "classes": "Classes",
+ "discussions": "Discussions",
+ "login": "se connecter",
+ "logout": "se déconnecter",
+ "cancel": "annuler",
+ "logoutVerification": "Êtes-vous sûr de vouloir vous déconnecter ?",
+ "homeTitle": "Nos atouts",
+ "homeIntroduction1": "Nous développons des ateliers innovants et des ressources éducatives que nous mettons à la disposition des élèves du monde entier en collaboration avec des enseignants et des bénévoles. Nos sessions de formation des formateurs leur permettent d'offrir nos ateliers pratiques aux élèves.",
+ "homeIntroduction2": "Nous ajoutons continuellement de nouveaux projets et de nouvelles méthodologies à tous nos projets. Pour ces projets, nous recherchons toujours un thème socialement pertinent. En outre, nous veillons à ce que notre matériel didactique soit basé sur la recherche scientifique et nous gardons toujours un œil sur l'inclusivité.",
+ "innovative": "Innovatif",
+ "researchBased": "Fondé sur la recherche",
+ "inclusive": "Inclusif",
+ "sociallyRelevant": "Socialement pertinent",
+ "translate": "traduire",
+ "themes": "Thèmes",
+ "choose-theme": "Choisis un thème",
+ "choose-age": "Choisis un âge",
+ "theme-options": {
+ "all": "Tous les thèmes",
+ "culture": "Culture",
+ "electricity-and-mechanics": "Electricité et méchanique",
+ "nature-and-climate": "Nature et climat",
+ "agriculture": "Agriculture",
+ "society": "Société",
+ "math": "Math",
+ "technology": "Technologie",
+ "algorithms": "Algorithmes"
+ },
+ "age-options": {
+ "all": "Tous les âges",
+ "primary-school": "Ecole primaire",
+ "lower-secondary": "12-14 ans",
+ "upper-secondary": "14-16 ans",
+ "high-school": "16-18 ans",
+ "older": "18 et plus"
+ },
+ "read-more": "En savoir plus"
}
diff --git a/frontend/src/i18n/locale/nl.json b/frontend/src/i18n/locale/nl.json
index 97ec9b49..9f944a5a 100644
--- a/frontend/src/i18n/locale/nl.json
+++ b/frontend/src/i18n/locale/nl.json
@@ -2,8 +2,42 @@
"welcome": "Welkom",
"student": "leerling",
"teacher": "leerkracht",
- "assignments": "opdrachten",
- "classes": "klassen",
- "discussions": "discussies",
- "logout": "log uit"
+ "assignments": "Opdrachten",
+ "classes": "Klassen",
+ "discussions": "Discussies",
+ "logout": "log uit",
+ "cancel": "annuleren",
+ "logoutVerification": "Bent u zeker dat u wilt uitloggen?",
+ "homeTitle": "Onze sterke punten",
+ "homeIntroduction1": "We ontwikkelen innovatieve workshops en leermiddelen en bieden deze aan studenten over de hele wereld in samenwerking met leerkrachten en vrijwilligers. Onze train-de-trainer sessies stellen hen in staat om onze hands-on workshops naar de leerlingen te brengen.",
+ "homeIntroduction2": "We voegen voortdurend nieuwe projecten en methodologieën toe aan al onze projecten. Voor deze projecten zoeken we altijd een maatschappelijk relevant thema. Daarnaast zorgen we ervoor dat ons didactisch materiaal gebaseerd is op wetenschappelijk onderzoek en houden we inclusiviteit altijd in het oog.",
+ "innovative": "Innovatief",
+ "researchBased": "Onderzoeksgedreven",
+ "inclusive": "Inclusief",
+ "sociallyRelevant": "Maatschappelijk relevant",
+ "login": "log in",
+ "translate": "vertalen",
+ "themes": "Lesthema's",
+ "choose-theme": "Kies een thema",
+ "choose-age": "Kies een leeftijd",
+ "theme-options": {
+ "all": "Alle thema's",
+ "culture": "Taal en kunst",
+ "electricity-and-mechanics": "Elektriciteit en mechanica",
+ "nature-and-climate": "Natuur en klimaat",
+ "agriculture": "Land-en tuinbouw",
+ "society": "Maatschappij en welzijn",
+ "math": "Wiskunde",
+ "technology": "Technologie",
+ "algorithms": "Algoritmes"
+ },
+ "age-options": {
+ "all": "Alle leeftijden",
+ "primary-school": "Lagere school",
+ "lower-secondary": "1e graad secundair",
+ "upper-secondary": "2e graad secundair",
+ "high-school": "3e graad secundair",
+ "older": "Hoger onderwijs"
+ },
+ "read-more": "Lees meer"
}
diff --git a/frontend/src/main.ts b/frontend/src/main.ts
index e4843dae..fc531957 100644
--- a/frontend/src/main.ts
+++ b/frontend/src/main.ts
@@ -10,6 +10,7 @@ import i18n from "./i18n/i18n.ts";
// Components
import App from "./App.vue";
import router from "./router";
+import { VueQueryPlugin, QueryClient } from '@tanstack/vue-query';
const app = createApp(App);
@@ -24,6 +25,18 @@ const vuetify = createVuetify({
components,
directives,
});
+
+const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: {
+ retry: 1,
+ refetchOnWindowFocus: false,
+ },
+ },
+});
+
app.use(vuetify);
app.use(i18n);
+app.use(VueQueryPlugin, { queryClient });
+
app.mount("#app");
diff --git a/frontend/src/queries/themes.ts b/frontend/src/queries/themes.ts
new file mode 100644
index 00000000..9892c141
--- /dev/null
+++ b/frontend/src/queries/themes.ts
@@ -0,0 +1,25 @@
+import { useQuery } from '@tanstack/vue-query';
+import { getThemeController } from '@/controllers/controllers';
+import {type MaybeRefOrGetter, toValue} from "vue";
+
+const themeController = getThemeController();
+
+export const useThemeQuery = (language: MaybeRefOrGetter) => {
+ return useQuery({
+ queryKey: ['themes', language],
+ queryFn: () => {
+ const lang = toValue(language);
+ return themeController.getAll(lang);
+ },
+ enabled: () => !!toValue(language),
+ });
+};
+
+export const useThemeHruidsQuery = (themeKey: string | null) => {
+ return useQuery({
+ queryKey: ['theme-hruids', themeKey],
+ queryFn: () => themeController.getHruidsByKey(themeKey!),
+ enabled: !!themeKey,
+ });
+};
+
diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts
index 7ad5763d..d98ef023 100644
--- a/frontend/src/router/index.ts
+++ b/frontend/src/router/index.ts
@@ -1,6 +1,5 @@
import { createRouter, createWebHistory } from "vue-router";
import MenuBar from "@/components/MenuBar.vue";
-import StudentHomepage from "@/views/homepage/StudentHomepage.vue";
import SingleAssignment from "@/views/assignments/SingleAssignment.vue";
import SingleClass from "@/views/classes/SingleClass.vue";
import SingleDiscussion from "@/views/discussions/SingleDiscussion.vue";
@@ -13,6 +12,8 @@ import UserDiscussions from "@/views/discussions/UserDiscussions.vue";
import UserClasses from "@/views/classes/UserClasses.vue";
import UserAssignments from "@/views/classes/UserAssignments.vue";
import authState from "@/services/auth/auth-service.ts";
+import UserHomePage from "@/views/homepage/UserHomePage.vue";
+import SingleTheme from "@/views/SingleTheme.vue";
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
@@ -41,9 +42,9 @@ const router = createRouter({
meta: { requiresAuth: true },
children: [
{
- path: "home",
+ path: "",
name: "UserHomePage",
- component: StudentHomepage,
+ component: UserHomePage,
},
{
path: "assignment",
@@ -63,6 +64,12 @@ const router = createRouter({
],
},
+ {
+ path: "/theme/:id",
+ name: "Theme",
+ component: SingleTheme,
+ meta: { requiresAuth: true },
+ },
{
path: "/assignment/create",
name: "CreateAssigment",
@@ -112,7 +119,8 @@ router.beforeEach(async (to, _from, next) => {
// Verify if user is logged in before accessing certain routes
if (to.meta.requiresAuth) {
if (!authState.isLoggedIn.value) {
- next("/login");
+ //Next("/login");
+ next();
} else {
next();
}
diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts
new file mode 100644
index 00000000..e046d9c3
--- /dev/null
+++ b/frontend/src/utils/constants.ts
@@ -0,0 +1,37 @@
+export const THEMES_KEYS = [
+ "kiks", "art", "socialrobot", "agriculture", "wegostem",
+ "computational_thinking", "math_with_python", "python_programming",
+ "stem", "care", "chatbot", "physical_computing", "algorithms", "basics_ai"
+];
+
+export const THEMESITEMS: Record = {
+ "all": THEMES_KEYS,
+ "culture": ["art", "wegostem", "chatbot"],
+ "electricity-and-mechanics": ["socialrobot", "wegostem", "stem", "physical_computing"],
+ "nature-and-climate": ["kiks", "agriculture"],
+ "agriculture": ["agriculture"],
+ "society": ["kiks", "socialrobot", "care", "chatbot"],
+ "math": ["kiks", "math_with_python", "python_programming", "stem", "care", "basics_ai"],
+ "technology": ["socialrobot", "wegostem", "computational_thinking", "stem", "physical_computing", "basics_ai"],
+ "algorithms": ["math_with_python", "python_programming", "stem", "algorithms", "basics_ai"],
+};
+
+export const AGEITEMS = [
+ "all", "primary-school", "lower-secondary", "upper-secondary", "high-school", "older"
+];
+
+export const AGE_TO_THEMES: Record = {
+ "all": THEMES_KEYS,
+ "primary-school": ["wegostem", "computational_thinking", "physical_computing"],
+ "lower-secondary": ["socialrobot", "art", "wegostem", "computational_thinking", "physical_computing"],
+ "upper-secondary": ["kiks", "art", "socialrobot", "agriculture",
+ "computational_thinking", "math_with_python", "python_programming",
+ "stem", "care", "chatbot", "algorithms", "basics_ai"],
+ "high-school": [
+ "kiks", "art", "agriculture", "computational_thinking", "math_with_python", "python_programming",
+ "stem", "care", "chatbot", "algorithms", "basics_ai"
+ ],
+ "older": [
+ "kiks", "computational_thinking", "algorithms", "basics_ai"
+ ]
+};
diff --git a/frontend/src/views/HomePage.vue b/frontend/src/views/HomePage.vue
index b358a150..415a0ade 100644
--- a/frontend/src/views/HomePage.vue
+++ b/frontend/src/views/HomePage.vue
@@ -19,6 +19,7 @@
Your access token for the backend is: {{ auth.authState.user?.access_token }}
+ home
Send test request
diff --git a/frontend/src/views/LoginPage.vue b/frontend/src/views/LoginPage.vue
index 973f10d9..88118d26 100644
--- a/frontend/src/views/LoginPage.vue
+++ b/frontend/src/views/LoginPage.vue
@@ -70,6 +70,7 @@
You are currently logged in as {{ auth.authState.user!.profile.name }} ({{ auth.authState.activeRole }})
Logout
+ home
diff --git a/frontend/src/views/SingleTheme.vue b/frontend/src/views/SingleTheme.vue
new file mode 100644
index 00000000..73336fa3
--- /dev/null
+++ b/frontend/src/views/SingleTheme.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/views/homepage/StudentHomepage.vue b/frontend/src/views/homepage/StudentHomepage.vue
deleted file mode 100644
index 1a35a59f..00000000
--- a/frontend/src/views/homepage/StudentHomepage.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/views/homepage/TeacherHomepage.vue b/frontend/src/views/homepage/TeacherHomepage.vue
deleted file mode 100644
index 1a35a59f..00000000
--- a/frontend/src/views/homepage/TeacherHomepage.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/views/homepage/UserHomePage.vue b/frontend/src/views/homepage/UserHomePage.vue
index 1a35a59f..b6cdea17 100644
--- a/frontend/src/views/homepage/UserHomePage.vue
+++ b/frontend/src/views/homepage/UserHomePage.vue
@@ -1,7 +1,125 @@
-
+
-
+
+
{{ t("themes") }}
+
+
+
+
+
+
+
+
+
-
+
diff --git a/package-lock.json b/package-lock.json
index 577325ce..2ee0a6ea 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -92,6 +92,8 @@
"name": "dwengo-1-frontend",
"version": "0.1.1",
"dependencies": {
+ "@tanstack/react-query": "^5.69.0",
+ "@tanstack/vue-query": "^5.69.0",
"axios": "^1.8.2",
"oidc-client-ts": "^3.1.0",
"vue": "^3.5.13",
@@ -122,6 +124,20 @@
"vue-tsc": "^2.2.2"
}
},
+ "frontend/node_modules/typescript": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
"node_modules/@ampproject/remapping": {
"version": "2.3.0",
"dev": true,
@@ -155,8 +171,8 @@
"version": "2.8.3",
"license": "MIT",
"dependencies": {
- "@csstools/css-calc": "^2.1.1",
- "@csstools/css-color-parser": "^3.0.7",
+ "@csstools/css-calc": "^2.1.2",
+ "@csstools/css-color-parser": "^3.0.8",
"@csstools/css-parser-algorithms": "^3.0.4",
"@csstools/css-tokenizer": "^3.0.3",
"lru-cache": "^10.4.3"
@@ -190,14 +206,14 @@
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.9",
+ "@babel/generator": "^7.26.10",
"@babel/helper-compilation-targets": "^7.26.5",
"@babel/helper-module-transforms": "^7.26.0",
- "@babel/helpers": "^7.26.9",
- "@babel/parser": "^7.26.9",
+ "@babel/helpers": "^7.26.10",
+ "@babel/parser": "^7.26.10",
"@babel/template": "^7.26.9",
- "@babel/traverse": "^7.26.9",
- "@babel/types": "^7.26.9",
+ "@babel/traverse": "^7.26.10",
+ "@babel/types": "^7.26.10",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -286,6 +302,13 @@
"semver": "bin/semver.js"
}
},
+ "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/@babel/helper-create-class-features-plugin": {
"version": "7.26.9",
"dev": true,
@@ -598,16 +621,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@bcoe/v8-coverage": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz",
- "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@colors/colors": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
@@ -737,6 +750,278 @@
"kuler": "^2.0.0"
}
},
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz",
+ "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz",
+ "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz",
+ "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz",
+ "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz",
+ "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz",
+ "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz",
+ "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz",
+ "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz",
+ "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz",
+ "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz",
+ "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz",
+ "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz",
+ "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz",
+ "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz",
+ "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@esbuild/linux-x64": {
"version": "0.25.0",
"cpu": [
@@ -748,7 +1033,142 @@
"os": [
"linux"
],
- "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz",
+ "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz",
+ "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz",
+ "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
+ "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
"node": ">=18"
}
@@ -1029,16 +1449,6 @@
"node": ">=12"
}
},
- "node_modules/@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/@jercle/yargonaut": {
"version": "1.1.5",
"dev": true,
@@ -1633,8 +2043,7 @@
"optional": true,
"os": [
"linux"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.34.8",
@@ -1646,8 +2055,49 @@
"optional": true,
"os": [
"linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz",
+ "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==",
+ "cpu": [
+ "arm64"
],
- "peer": true
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz",
+ "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz",
+ "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
"node_modules/@scarf/scarf": {
"version": "1.4.0",
@@ -1672,6 +2122,99 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@tanstack/match-sorter-utils": {
+ "version": "8.19.4",
+ "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz",
+ "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==",
+ "license": "MIT",
+ "dependencies": {
+ "remove-accents": "0.5.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/query-core": {
+ "version": "5.69.0",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.69.0.tgz",
+ "integrity": "sha512-Kn410jq6vs1P8Nm+ZsRj9H+U3C0kjuEkYLxbiCyn3MDEiYor1j2DGVULqAz62SLZtUZ/e9Xt6xMXiJ3NJ65WyQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-query": {
+ "version": "5.69.0",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.69.0.tgz",
+ "integrity": "sha512-Ift3IUNQqTcaFa1AiIQ7WCb/PPy8aexZdq9pZWLXhfLcLxH0+PZqJ2xFImxCpdDZrFRZhLJrh76geevS5xjRhA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/query-core": "5.69.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19"
+ }
+ },
+ "node_modules/@tanstack/vue-query": {
+ "version": "5.69.0",
+ "resolved": "https://registry.npmjs.org/@tanstack/vue-query/-/vue-query-5.69.0.tgz",
+ "integrity": "sha512-JZecDd0b+hZChqV5O1wXBfKoxlEj3aGvRj7upuqWei+oGrT+ERuOU4uQn7/DDVA5TouIt88G3oMFBjE2wKO/6A==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/match-sorter-utils": "^8.19.4",
+ "@tanstack/query-core": "5.69.0",
+ "@vue/devtools-api": "^6.6.3",
+ "vue-demi": "^0.14.10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.1.2",
+ "vue": "^2.6.0 || ^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@tanstack/vue-query/node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@tootallnate/once": {
"version": "1.1.2",
"license": "MIT",
@@ -2122,14 +2665,12 @@
}
},
"node_modules/@vitest/expect": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.8.tgz",
- "integrity": "sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ==",
+ "version": "3.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/spy": "3.0.8",
- "@vitest/utils": "3.0.8",
+ "@vitest/spy": "3.0.6",
+ "@vitest/utils": "3.0.6",
"chai": "^5.2.0",
"tinyrainbow": "^2.0.0"
},
@@ -2138,13 +2679,11 @@
}
},
"node_modules/@vitest/mocker": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.8.tgz",
- "integrity": "sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow==",
+ "version": "3.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/spy": "3.0.8",
+ "@vitest/spy": "3.0.6",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.17"
},
@@ -2166,8 +2705,6 @@
},
"node_modules/@vitest/mocker/node_modules/estree-walker": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2175,9 +2712,7 @@
}
},
"node_modules/@vitest/pretty-format": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.8.tgz",
- "integrity": "sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg==",
+ "version": "3.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2188,13 +2723,11 @@
}
},
"node_modules/@vitest/runner": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.8.tgz",
- "integrity": "sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w==",
+ "version": "3.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/utils": "3.0.8",
+ "@vitest/utils": "3.0.6",
"pathe": "^2.0.3"
},
"funding": {
@@ -2202,13 +2735,11 @@
}
},
"node_modules/@vitest/snapshot": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.8.tgz",
- "integrity": "sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A==",
+ "version": "3.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "3.0.8",
+ "@vitest/pretty-format": "3.0.6",
"magic-string": "^0.30.17",
"pathe": "^2.0.3"
},
@@ -2217,9 +2748,7 @@
}
},
"node_modules/@vitest/spy": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.8.tgz",
- "integrity": "sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q==",
+ "version": "3.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2230,13 +2759,11 @@
}
},
"node_modules/@vitest/utils": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.8.tgz",
- "integrity": "sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==",
+ "version": "3.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "3.0.8",
+ "@vitest/pretty-format": "3.0.6",
"loupe": "^3.1.3",
"tinyrainbow": "^2.0.0"
},
@@ -2707,8 +3234,6 @@
},
"node_modules/assertion-error": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
- "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2934,8 +3459,6 @@
},
"node_modules/cac": {
"version": "6.7.14",
- "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
- "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3090,8 +3613,6 @@
},
"node_modules/chai": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz",
- "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3122,8 +3643,6 @@
},
"node_modules/check-error": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
- "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3499,8 +4018,6 @@
},
"node_modules/deep-eql": {
"version": "5.0.2",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
- "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3804,8 +4321,6 @@
},
"node_modules/es-module-lexer": {
"version": "1.6.0",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
- "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
"dev": true,
"license": "MIT"
},
@@ -4043,6 +4558,41 @@
"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
+ "node_modules/eslint-plugin-vue/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
"node_modules/eslint-plugin-vue/node_modules/globals": {
"version": "13.24.0",
"dev": true,
@@ -4057,6 +4607,31 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/eslint-plugin-vue/node_modules/vue-eslint-parser": {
+ "version": "9.4.3",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
+ "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "eslint-scope": "^7.1.1",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.6"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
"node_modules/eslint-scope": {
"version": "8.2.0",
"dev": true,
@@ -4625,6 +5200,21 @@
"devOptional": true,
"license": "ISC"
},
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/function-bind": {
"version": "1.1.2",
"license": "MIT",
@@ -5856,8 +6446,6 @@
},
"node_modules/loupe": {
"version": "3.1.3",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
- "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
"dev": true,
"license": "MIT"
},
@@ -6883,8 +7471,6 @@
},
"node_modules/pathval": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
- "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -7373,6 +7959,17 @@
},
"node_modules/rc/node_modules/strip-json-comments": {
"version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
+ "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -7416,6 +8013,12 @@
"version": "0.2.2",
"license": "Apache-2.0"
},
+ "node_modules/remove-accents": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz",
+ "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==",
+ "license": "MIT"
+ },
"node_modules/require-directory": {
"version": "2.1.1",
"dev": true,
@@ -8506,8 +9109,6 @@
},
"node_modules/tinyspy": {
"version": "3.0.2",
- "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
- "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -8678,6 +9279,22 @@
"fsevents": "~2.3.3"
}
},
+ "node_modules/tsx/node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/tunnel-agent": {
"version": "0.6.0",
"license": "Apache-2.0",
@@ -8958,9 +9575,7 @@
}
},
"node_modules/vite-node": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.8.tgz",
- "integrity": "sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg==",
+ "version": "3.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -9060,7 +9675,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">=18"
}
@@ -9105,19 +9719,17 @@
}
},
"node_modules/vitest": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.8.tgz",
- "integrity": "sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA==",
+ "version": "3.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/expect": "3.0.8",
- "@vitest/mocker": "3.0.8",
- "@vitest/pretty-format": "^3.0.8",
- "@vitest/runner": "3.0.8",
- "@vitest/snapshot": "3.0.8",
- "@vitest/spy": "3.0.8",
- "@vitest/utils": "3.0.8",
+ "@vitest/expect": "3.0.6",
+ "@vitest/mocker": "3.0.6",
+ "@vitest/pretty-format": "^3.0.6",
+ "@vitest/runner": "3.0.6",
+ "@vitest/snapshot": "3.0.6",
+ "@vitest/spy": "3.0.6",
+ "@vitest/utils": "3.0.6",
"chai": "^5.2.0",
"debug": "^4.4.0",
"expect-type": "^1.1.0",
@@ -9129,7 +9741,7 @@
"tinypool": "^1.0.2",
"tinyrainbow": "^2.0.0",
"vite": "^5.0.0 || ^6.0.0",
- "vite-node": "3.0.8",
+ "vite-node": "3.0.6",
"why-is-node-running": "^2.3.0"
},
"bin": {
@@ -9145,8 +9757,8 @@
"@edge-runtime/vm": "*",
"@types/debug": "^4.1.12",
"@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
- "@vitest/browser": "3.0.8",
- "@vitest/ui": "3.0.8",
+ "@vitest/browser": "3.0.6",
+ "@vitest/ui": "3.0.6",
"happy-dom": "*",
"jsdom": "*"
},