From 559c86d7333ecd25f6428df5bf9004e5ab5c1f48 Mon Sep 17 00:00:00 2001 From: Diego Temkin <65834932+dtemkin1@users.noreply.github.com> Date: Sat, 5 Oct 2024 16:15:07 -0400 Subject: [PATCH 01/19] improve dark mode colors a bit --- src/components/Audit.vue | 8 +++++--- src/components/Semester.vue | 23 +++++++++++++++-------- src/pages/MainPage.vue | 6 ++++-- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/components/Audit.vue b/src/components/Audit.vue index 12301b52..4ff9fea2 100644 --- a/src/components/Audit.vue +++ b/src/components/Audit.vue @@ -40,8 +40,10 @@ class="req-container" :class="{ 'elevation-3': hover, - 'yellow lighten-3': isPetitioned(item), - 'grey lighten-2': isIgnored(item), + 'yellow lighten-3': isPetitioned(item) && !$vuetify.theme.dark, + 'yellow darken-3': isPetitioned(item) && $vuetify.theme.dark, + 'grey lighten-2': isIgnored(item) && !$vuetify.theme.dark, + 'grey darken-2': isIgnored(item) && $vuetify.theme.dark, }" :style="leaf && canDrag(item) ? 'cursor: grab' : 'cursor: pointer'" :data-cy="'auditItem' + item['list-id']" @@ -489,7 +491,7 @@ export default defineComponent({ : req.percent_fulfilled > 15 ? "#efce15" : "#ef8214"; - return `--percent: ${pfulfilled}%; --bar-color: ${pcolor}; --bg-color: #fff`; + return `--percent: ${pfulfilled}%; --bar-color: ${pcolor}; --bg-color: ${this.$vuetify.theme.dark ? "#1e1e1e" : "#fff"}`; }, deleteReq: function (req) { const reqName = req["list-id"]; diff --git a/src/components/Semester.vue b/src/components/Semester.vue index ae1dc47a..71506759 100644 --- a/src/components/Semester.vue +++ b/src/components/Semester.vue @@ -140,7 +140,7 @@
{{ subject.subject_id }} @@ -378,7 +378,8 @@ export default defineComponent({ bgColor: "red", message: "Loading subjects... give us a minute", textColor: "DarkRed", - bgColorHeader: "red lighten-5", + bgColorHeader: + "red " + (this.$vuetify.theme.dark ? "darken-5" : "lighten-5"), }; } else if (this.itemAdding === undefined) { return { @@ -386,42 +387,48 @@ export default defineComponent({ message: 'If you see this message, contact courseroad@mit.edu and tell them "710".', textColor: "DarkRed", - bgColorHeader: "red lighten-5", + bgColorHeader: + "red" + (this.$vuetify.theme.dark ? "darken-5" : "lighten-5"), }; } else if (this.index === 0 || this.offeredNow) { return { bgColor: "green", message: "Add class here", textColor: "DarkGreen", - bgColorHeader: "green lighten-5", + bgColorHeader: + "green " + (this.$vuetify.theme.dark ? "darken-5" : "lighten-5"), }; } else if (this.itemAddingNoLongerOffered) { return { bgColor: "yellow", message: "Subject no longer offered", textColor: "DarkGoldenRod", - bgColorHeader: "yellow lighten-5", + bgColorHeader: + "yellow " + (this.$vuetify.theme.dark ? "darken-5" : "lighten-5"), }; } else if (this.itemAddingNotCurrentlyOffered) { return { bgColor: "yellow", message: "Subject not offered this year", textColor: "DarkGoldenRod", - bgColorHeader: "yellow lighten-5", + bgColorHeader: + "yellow " + (this.$vuetify.theme.dark ? "darken-5" : "lighten-5"), }; } else if (this.isSameYear) { return { bgColor: "red", message: "Subject not available this semester", textColor: "DarkRed", - bgColorHeader: "red lighten-5", + bgColorHeader: + "red " + (this.$vuetify.theme.dark ? "darken-5" : "lighten-5"), }; } else { return { bgColor: "yellow", message: "Subject may not be available this semester", textColor: "DarkGoldenRod", - bgColorHeader: "yellow lighten-5", + bgColorHeader: + "yellow " + (this.$vuetify.theme.dark ? "darken-5" : "lighten-5"), }; } } diff --git a/src/pages/MainPage.vue b/src/pages/MainPage.vue index 7e07585d..66aaf107 100644 --- a/src/pages/MainPage.vue +++ b/src/pages/MainPage.vue @@ -105,8 +105,10 @@ - - About + + + mdi-information-variant + From 6c0230c9528a2285b33b4efb267c498462cd3810 Mon Sep 17 00:00:00 2001 From: Diego Temkin <65834932+dtemkin1@users.noreply.github.com> Date: Sat, 5 Oct 2024 16:32:12 -0400 Subject: [PATCH 02/19] make about page into dialog (fixes theme not being set when refreshing about page) --- src/app.js | 2 - src/components/About.vue | 180 ++++++++++++++++++++++++++++++++++++ src/pages/About.vue | 195 --------------------------------------- src/pages/MainPage.vue | 36 +++++++- 4 files changed, 211 insertions(+), 202 deletions(-) create mode 100644 src/components/About.vue delete mode 100644 src/pages/About.vue diff --git a/src/app.js b/src/app.js index 3778aaab..4fe74cbb 100644 --- a/src/app.js +++ b/src/app.js @@ -1,7 +1,6 @@ import Vue from "vue"; import App from "./App.vue"; import MainPage from "./pages/MainPage.vue"; -import About from "./pages/About.vue"; import vuetify from "./plugins/vuetify"; import VueRouter from "vue-router"; import VueCookies from "vue-cookies"; @@ -17,7 +16,6 @@ Vue.use(BrowserSupportPlugin); /** @type import("vue-router").RouteConfig[] */ const routes = [ { path: "/", redirect: "/road" }, - { path: "/about", component: About }, { path: "/road/:road?", component: MainPage }, { path: "*", redirect: "/road" }, ]; diff --git a/src/components/About.vue b/src/components/About.vue new file mode 100644 index 00000000..1b3594ef --- /dev/null +++ b/src/components/About.vue @@ -0,0 +1,180 @@ + + + diff --git a/src/pages/About.vue b/src/pages/About.vue deleted file mode 100644 index 8d8e0b89..00000000 --- a/src/pages/About.vue +++ /dev/null @@ -1,195 +0,0 @@ - - - diff --git a/src/pages/MainPage.vue b/src/pages/MainPage.vue index 66aaf107..0cdfc1cf 100644 --- a/src/pages/MainPage.vue +++ b/src/pages/MainPage.vue @@ -105,11 +105,34 @@ - - - mdi-information-variant - - + + + + + + mdi-arrow-left + + + + + Date: Sun, 6 Oct 2024 00:04:30 -0400 Subject: [PATCH 03/19] fix auth, add gitattributes... --- .gitattributes | 217 ++++++++++++++++++++++++++++++++++++++++ src/components/Auth.vue | 8 +- 2 files changed, 221 insertions(+), 4 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..996deab3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,217 @@ +## GITATTRIBUTES FOR WEB PROJECTS +# +# These settings are for any web project. +# +# Details per file setting: +# text These files should be normalized (i.e. convert CRLF to LF). +# binary These files are binary and should be left untouched. +# +# Note that binary is a macro for -text -diff. +###################################################################### + +# Auto detect +## Handle line endings automatically for files detected as +## text and leave all files detected as binary untouched. +## This will handle all files NOT defined below. +* text=auto + +# Source code +*.bash text eol=lf +*.bat text eol=crlf +*.cmd text eol=crlf +*.coffee text +*.css text diff=css +*.htm text diff=html +*.html text diff=html +*.inc text +*.ini text +*.js text +*.mjs text +*.cjs text +*.json text +*.jsx text +*.less text +*.ls text +*.map text -diff +*.od text +*.onlydata text +*.php text diff=php +*.pl text +*.ps1 text eol=crlf +*.py text diff=python +*.rb text diff=ruby +*.sass text +*.scm text +*.scss text diff=css +*.sh text eol=lf +.husky/* text eol=lf +*.sql text +*.styl text +*.tag text +*.ts text +*.tsx text +*.xml text +*.xhtml text diff=html + +# Docker +Dockerfile text + +# Documentation +*.ipynb text eol=lf +*.markdown text diff=markdown +*.md text diff=markdown +*.mdwn text diff=markdown +*.mdown text diff=markdown +*.mkd text diff=markdown +*.mkdn text diff=markdown +*.mdtxt text +*.mdtext text +*.txt text +AUTHORS text +CHANGELOG text +CHANGES text +CONTRIBUTING text +COPYING text +copyright text +*COPYRIGHT* text +INSTALL text +license text +LICENSE text +NEWS text +readme text +*README* text +TODO text + +# Templates +*.dot text +*.ejs text +*.erb text +*.haml text +*.handlebars text +*.hbs text +*.hbt text +*.jade text +*.latte text +*.mustache text +*.njk text +*.phtml text +*.svelte text +*.tmpl text +*.tpl text +*.twig text +*.vue text + +# Configs +*.cnf text +*.conf text +*.config text +.editorconfig text +.env text +.gitattributes text +.gitconfig text +.htaccess text +*.lock text -diff +package.json text eol=lf +package-lock.json text eol=lf -diff +pnpm-lock.yaml text eol=lf -diff +.prettierrc text +yarn.lock text -diff +*.toml text +*.yaml text +*.yml text +browserslist text +Makefile text +makefile text +# Fixes syntax highlighting on GitHub to allow comments +tsconfig.json linguist-language=JSON-with-Comments + +# Heroku +Procfile text + +# Graphics +*.ai binary +*.bmp binary +*.eps binary +*.gif binary +*.gifv binary +*.ico binary +*.jng binary +*.jp2 binary +*.jpg binary +*.jpeg binary +*.jpx binary +*.jxr binary +*.pdf binary +*.png binary +*.psb binary +*.psd binary +# SVG treated as an asset (binary) by default. +*.svg text +# If you want to treat it as binary, +# use the following line instead. +# *.svg binary +*.svgz binary +*.tif binary +*.tiff binary +*.wbmp binary +*.webp binary + +# Audio +*.kar binary +*.m4a binary +*.mid binary +*.midi binary +*.mp3 binary +*.ogg binary +*.ra binary + +# Video +*.3gpp binary +*.3gp binary +*.as binary +*.asf binary +*.asx binary +*.avi binary +*.fla binary +*.flv binary +*.m4v binary +*.mng binary +*.mov binary +*.mp4 binary +*.mpeg binary +*.mpg binary +*.ogv binary +*.swc binary +*.swf binary +*.webm binary + +# Archives +*.7z binary +*.gz binary +*.jar binary +*.rar binary +*.tar binary +*.zip binary + +# Fonts +*.ttf binary +*.eot binary +*.otf binary +*.woff binary +*.woff2 binary + +# Executables +*.exe binary +*.pyc binary +# Prevents massive diffs caused by vendored, minified files +**/.yarn/releases/** binary +**/.yarn/plugins/** binary + +# RC files (like .babelrc or .eslintrc) +*.*rc text + +# Ignore files (like .npmignore or .gitignore) +*.*ignore text + +# Prevents massive diffs from built files +dist/* binary diff --git a/src/components/Auth.vue b/src/components/Auth.vue index bd567fae..c1a299d1 100644 --- a/src/components/Auth.vue +++ b/src/components/Auth.vue @@ -143,11 +143,11 @@ export default defineComponent({ loggedIn(newLoggedIn) { this.$store.commit("setLoggedIn", newLoggedIn); if (newLoggedIn && this.$cookies.get("has_set_year") !== "true") { - // const email = this.accessInfo.academic_id; - // const endPoint = email.indexOf("@"); - // const kerb = email.slice(0, endPoint); + const email = this.accessInfo.academic_id; + const endPoint = email.indexOf("@"); + const kerb = email.slice(0, endPoint); axios - .get(`${import.meta.env.VITE_FIREROAD_URL}/user_info/`) + .get(`${import.meta.env.VITE_URL}/cgi-bin/people.py?kerb=${kerb}`) .then((response) => { if (response.status !== 200) { console.log("Failed to find user year"); From f2847165c0e7ffc31d7393001af559e6be0f715b Mon Sep 17 00:00:00 2001 From: Diego Temkin <65834932+dtemkin1@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:52:50 -0500 Subject: [PATCH 04/19] restore old colors (for now...) --- src/mixins/colorMixin.js | 118 ++++++++++++++++++++------------------- 1 file changed, 60 insertions(+), 58 deletions(-) diff --git a/src/mixins/colorMixin.js b/src/mixins/colorMixin.js index ecd45162..1fb36024 100644 --- a/src/mixins/colorMixin.js +++ b/src/mixins/colorMixin.js @@ -66,48 +66,48 @@ export default { ], colors: { "course-none": "#999999", - "course-1": "#d10d23", - "course-2": "#f16024", - "course-3": "#305aba", - "course-4": "#bde788", - "course-5": "#8abd6d", - "course-6": "#499eda", - "course-7": "#4365a2", - "course-8": "#7a36bf", - "course-9": "#4bb399", - "course-10": "#c96b52", - "course-11": "#81235b", - "course-12": "#4bcb4a", - "course-14": "#f5a623", - "course-15": "#a40052", - "course-16": "#64d4e3", - "course-17": "#c80db9", - "course-18": "#1f3573", - "course-20": "#64a518", - "course-21": "#a18cd3", - "course-21A": "#9162d0", - "course-21G": "#764e8d", - "course-21H": "#b560c3", - "course-21L": "#d574d7", - "course-21M": "#f1a7e5", - "course-21T": "#ad4096", - "course-21W": "#d16ca4", - "course-22": "#734954", - "course-24": "#3f1c57", - "course-CC": "#398486", - "course-CMS": "#8aafb1", - "course-CSB": "#f5889c", - "course-EC": "#8b1d17", - "course-EM": "#e1d059", - "course-ES": "#b0b02e", - "course-HST": "#90cdd0", - "course-IDS": "#9eabd0", - "course-MAS": "#64696d", - "course-SCM": "#152348", - "course-STS": "#155410", - "course-WGS": "#44cf9d", - "course-SP": "#deb821", - "course-SWE": "#b82165", + "course-1": "#de4343", + "course-2": "#de7643", + "course-3": "#4369de", + "course-4": "#57b563", + "course-5": "#43deaf", + "course-6": "#4390de", + "course-7": "#5779b5", + "course-8": "#8157b5", + "course-9": "#8143de", + "course-10": "#b55757", + "course-11": "#b55773", + "course-12": "#43de4f", + "course-14": "#de9043", + "course-15": "#b55c57", + "course-16": "#43b2de", + "course-17": "#de43b7", + "course-18": "#575db5", + "course-20": "#57b56e", + "course-21": "#57b573", + "course-21A": "#57b573", + "course-21G": "#57b599", + "course-21H": "#57b5a5", + "course-21L": "#57b5b2", + "course-21M": "#57acb5", + "course-21T": "#5e9da6", + "course-21W": "#57b580", + "course-22": "#b55757", + "course-24": "#7657b5", + "course-CC": "#4fde43", + "course-CMS": "#57b58c", + "course-CSB": "#579ab5", + "course-EC": "#76b557", + "course-EM": "#576eb5", + "course-ES": "#5a57b5", + "course-HST": "#5779b5", + "course-IDS": "#57b586", + "course-MAS": "#57b55a", + "course-SCM": "#57b573", + "course-STS": "#8f57b5", + "course-WGS": "#579fb5", + "course-SP": "#4343de", + "course-SWE": "#b56b57", "course-AS": "#b0b0b0", "course-MS": "#b0b0b0", "course-NS": "#b0b0b0", @@ -167,27 +167,29 @@ export default { getRawColor: function (courseColor) { return this.colors[courseColor]; }, - getRawTextColor: function (courseColor) { - // See https://github.com/Myndex/max-contrast - // https://stackoverflow.com/questions/1855884/determine-font-color-based-on-background-color + getRawTextColor: function () { + return "#ffffff"; + // getRawTextColor: function (courseColor) { + // // See https://github.com/Myndex/max-contrast + // // https://stackoverflow.com/questions/1855884/determine-font-color-based-on-background-color - const Rs = parseInt(this.colors[courseColor].substring(1, 3), 16); - const Gs = parseInt(this.colors[courseColor].substring(3, 5), 16); - const Bs = parseInt(this.colors[courseColor].substring(5, 7), 16); + // const Rs = parseInt(this.colors[courseColor].substring(1, 3), 16); + // const Gs = parseInt(this.colors[courseColor].substring(3, 5), 16); + // const Bs = parseInt(this.colors[courseColor].substring(5, 7), 16); - const flipYs = 0.342; // based on APCA™ 0.98G middle contrast BG + // const flipYs = 0.342; // based on APCA™ 0.98G middle contrast BG - const trc = 2.4, - Rco = 0.2126729, - Gco = 0.7151522, - Bco = 0.072175; + // const trc = 2.4, + // Rco = 0.2126729, + // Gco = 0.7151522, + // Bco = 0.072175; - let Ys = - (Rs / 255.0) ** trc * Rco + - (Gs / 255.0) ** trc * Gco + - (Bs / 255.0) ** trc * Bco; + // let Ys = + // (Rs / 255.0) ** trc * Rco + + // (Gs / 255.0) ** trc * Gco + + // (Bs / 255.0) ** trc * Bco; - return Ys < flipYs ? "#ffffffee" : "#000000dd"; + // return Ys < flipYs ? colors.shades.white : colors.shades.black; }, // courseColor takes in subject courseColor: function (subject) { From 73de227e0cfb94a102bbdfa15a3441cd17b71ee8 Mon Sep 17 00:00:00 2001 From: Diego Temkin <65834932+dtemkin1@users.noreply.github.com> Date: Tue, 12 Nov 2024 23:39:47 -0500 Subject: [PATCH 05/19] update eslint and config --- .eslintrc.cjs | 16 -- eslint.config.mjs | 33 +++ package-lock.json | 591 ++++++++++++++++++++++++---------------------- package.json | 7 +- vite.config.ts | 12 +- 5 files changed, 353 insertions(+), 306 deletions(-) delete mode 100644 .eslintrc.cjs create mode 100644 eslint.config.mjs diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 6503a113..00000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - env: { - node: true, - es2022: true - }, - extends: [ - 'eslint:recommended', - 'plugin:vue/recommended', - 'plugin:vuetify/base', - "prettier" - ], - rules: { - // override/add rules settings here, such as: - // 'vue/no-unused-vars': 'error' - } -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..2fe2f15a --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,33 @@ +import globals from "globals"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +import pluginVue from "eslint-plugin-vue"; +import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +export default [ + // js.configs.recommended, + ...pluginVue.configs["flat/recommended"], + ...pluginVue.configs["flat/vue2-recommended"], + ...compat.extends("plugin:vuetify/base"), + eslintPluginPrettierRecommended, + { + languageOptions: { + globals: { + ...globals.node, + }, + }, + + rules: {}, + }, +]; diff --git a/package-lock.json b/package-lock.json index f147ab76..c9584433 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,15 +26,18 @@ "vuex": "^3.6.0" }, "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.14.0", "@mdi/font": "^7.4.47", "@vue/test-utils": "^1.2.2", "cypress-file-upload": "^5.0.8", "deepmerge": "^4.3.1", - "eslint": "^8.57.0", + "eslint": "^9.14.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-vue": "^9.26.0", + "eslint-plugin-vue": "^9.31.0", "eslint-plugin-vuetify": "^1.1.0", + "globals": "^15.12.0", "prettier": "3.2.5", "sass": "~1.32", "vue": "^2.7.0" @@ -504,24 +507,51 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -529,7 +559,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -541,16 +571,45 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "type-fest": "^0.20.2" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -568,25 +627,37 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@eslint/js": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", + "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz", + "integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@fontsource/roboto": { @@ -594,18 +665,42 @@ "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.13.tgz", "integrity": "sha512-j61DHjsdUCKMXSdNLTOxcG701FWnF0jcqNNQi2iPCDxU8seN/sMxeh62dC++UiagCWq9ghTypX+Pcy7kX+QOeQ==" }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -621,11 +716,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -786,41 +889,6 @@ "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==", "dev": true }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -1113,12 +1181,6 @@ "@types/node": "*" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/@vitejs/plugin-vue2": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue2/-/plugin-vue2-2.3.1.tgz", @@ -1415,9 +1477,10 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2527,18 +2590,6 @@ "node": ">=0.4.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-event-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.1.0.tgz", @@ -2770,58 +2821,64 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", + "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.14.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-prettier": { @@ -2867,18 +2924,19 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz", - "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==", + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.31.0.tgz", + "integrity": "sha512-aYMUCgivhz1o4tLkRHj5oq9YgYPM4/EJc0M7TAKRLCUA5OYxRLAhYEVD2nLtTwLyixEFI+/QXSvKU9ESZFgqjQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "globals": "^13.24.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.0", - "vue-eslint-parser": "^9.4.2", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", "xml-name-validator": "^4.0.0" }, "engines": { @@ -2904,10 +2962,11 @@ } }, "node_modules/eslint-plugin-vue/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2932,6 +2991,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-vuetify/-/eslint-plugin-vuetify-1.1.0.tgz", "integrity": "sha512-I1YRUCGkDqe8F7O0tdf63UZVKtk4734+8fzbZ24YIZKTTyQp/FIR0nSZYG8mPFhTWerzPta7oXNzliBOwP2XeQ==", "dev": true, + "license": "MIT", "dependencies": { "eslint-plugin-vue": "^7.0.0", "requireindex": "^1.2.0" @@ -2946,6 +3006,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2958,6 +3019,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz", "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==", "dev": true, + "license": "MIT", "dependencies": { "eslint-utils": "^2.1.0", "natural-compare": "^1.4.0", @@ -2976,6 +3038,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -2989,6 +3052,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -2998,6 +3062,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", @@ -3012,6 +3077,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3021,6 +3087,7 @@ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz", "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "eslint-scope": "^5.1.1", @@ -3045,6 +3112,7 @@ "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" @@ -3061,6 +3129,7 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -3076,6 +3145,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -3092,6 +3162,13 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -3107,12 +3184,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3159,32 +3230,65 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "type-fest": "^0.20.2" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3199,18 +3303,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3268,23 +3360,12 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "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", @@ -3338,6 +3419,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -3457,15 +3539,6 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -3493,15 +3566,16 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-loader": { @@ -3573,24 +3647,25 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.6", @@ -3684,7 +3759,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true + "optional": true, + "peer": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -3753,7 +3829,8 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3803,6 +3880,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globals": { + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -3822,12 +3912,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "peer": true }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -4006,7 +4090,8 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4016,7 +4101,8 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "devOptional": true + "optional": true, + "peer": true }, "node_modules/ini": { "version": "2.0.0", @@ -4130,6 +4216,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -4338,7 +4425,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -4416,6 +4504,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -4868,6 +4957,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "devOptional": true, + "peer": true, "dependencies": { "wrappy": "1" } @@ -4953,7 +5043,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -5219,26 +5310,6 @@ "dev": true, "peer": true }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5275,6 +5346,7 @@ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.5" } @@ -5300,16 +5372,6 @@ "node": ">=8" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rfdc": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", @@ -5317,21 +5379,6 @@ "dev": true, "peer": true }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.22.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", @@ -5367,29 +5414,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -6313,10 +6337,11 @@ "integrity": "sha512-9zjvACKE4W0kEb8OQtXzpizKhf6zfFOG/Z1TEUjSJn4Z4rintuAHo8y/FpCUhTWHMmPe8E+Fko+/tiXVM+5jOw==" }, "node_modules/vue-eslint-parser": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", - "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==", + "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", @@ -6337,10 +6362,11 @@ } }, "node_modules/vue-eslint-parser/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6682,7 +6708,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "devOptional": true, + "peer": true }, "node_modules/xml-name-validator": { "version": "4.0.0", diff --git a/package.json b/package.json index f82d0bc1..b9bdef86 100644 --- a/package.json +++ b/package.json @@ -36,15 +36,18 @@ "vuex": "^3.6.0" }, "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.14.0", "@mdi/font": "^7.4.47", "@vue/test-utils": "^1.2.2", "cypress-file-upload": "^5.0.8", "deepmerge": "^4.3.1", - "eslint": "^8.57.0", + "eslint": "^9.14.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-vue": "^9.26.0", + "eslint-plugin-vue": "^9.31.0", "eslint-plugin-vuetify": "^1.1.0", + "globals": "^15.12.0", "prettier": "3.2.5", "sass": "~1.32", "vue": "^2.7.0" diff --git a/vite.config.ts b/vite.config.ts index f2db5b58..cc168716 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue2"; -import path from "path"; +// import path from "path"; // https://vitejs.dev/config/ export default defineConfig({ @@ -9,11 +9,11 @@ export default defineConfig({ }, plugins: [ vue({ - resolve: { - alias: { - "@": path.resolve(__dirname, "./src"), - }, - }, + // resolve: { + // alias: { + // "@": path.resolve(__dirname, "./src"), + // }, + // }, }), ], }); From 5789fcbd3cf573688dd40f730702168a5eba7477 Mon Sep 17 00:00:00 2001 From: Diego Temkin <65834932+dtemkin1@users.noreply.github.com> Date: Wed, 13 Nov 2024 00:17:47 -0500 Subject: [PATCH 06/19] turn this.$ functions and mixins into hooks/exports --- src/mixins/classInfo.js | 55 ++-- src/mixins/colorMixin.js | 458 +++++++++++++++++---------------- src/mixins/courseLinks.js | 138 +++++----- src/mixins/reqFulfillment.js | 365 +++++++++++++------------- src/mixins/sanitizeSubjects.js | 24 +- src/mixins/schedule.js | 34 +-- src/plugins/browserSupport.js | 8 +- src/plugins/composition.js | 16 ++ 8 files changed, 567 insertions(+), 531 deletions(-) create mode 100644 src/plugins/composition.js diff --git a/src/mixins/classInfo.js b/src/mixins/classInfo.js index c5e50635..19eff991 100644 --- a/src/mixins/classInfo.js +++ b/src/mixins/classInfo.js @@ -1,30 +1,33 @@ +import { useStore } from "../plugins/composition"; + +export const classInfo = (req) => { + const store = useStore(); + if ("req" in req) { + if (req.req in store.state.subjectsIndex) { + return store.state.subjectsInfo[store.state.subjectsIndex[req.req]]; + } + let attributeReq = req.req; + if (attributeReq.indexOf("GIR:") === 0) { + attributeReq = attributeReq.substring(4); + } + if (attributeReq in store.state.genericIndex) { + return store.state.genericCourses[store.state.genericIndex[attributeReq]]; + } + } + return undefined; +}; + +export const canDrag = (req) => { + const store = useStore(); + return ( + classInfo(req) !== undefined || + ("req" in req && Object.keys(store.state.subjectsIndex).length === 0) + ); +}; + export default { methods: { - classInfo: function (req) { - if ("req" in req) { - if (req.req in this.$store.state.subjectsIndex) { - return this.$store.state.subjectsInfo[ - this.$store.state.subjectsIndex[req.req] - ]; - } - let attributeReq = req.req; - if (attributeReq.indexOf("GIR:") === 0) { - attributeReq = attributeReq.substring(4); - } - if (attributeReq in this.$store.state.genericIndex) { - return this.$store.state.genericCourses[ - this.$store.state.genericIndex[attributeReq] - ]; - } - } - return undefined; - }, - canDrag: function (req) { - return ( - this.classInfo(req) !== undefined || - ("req" in req && - Object.keys(this.$store.state.subjectsIndex).length === 0) - ); - }, + classInfo: classInfo, + canDrag: canDrag, }, }; diff --git a/src/mixins/colorMixin.js b/src/mixins/colorMixin.js index 1fb36024..99e17f6b 100644 --- a/src/mixins/colorMixin.js +++ b/src/mixins/colorMixin.js @@ -1,232 +1,244 @@ -export default { - data: function () { - return { - validCourses: [ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "14", - "15", - "16", - "17", - "18", - "20", - "21", - "21A", - "21G", - "21H", - "21L", - "21M", - "21T", - "21W", - "22", - "24", - "CC", - "CMS", - "CSB", - "EC", - "EM", - "ES", - "HST", - "IDS", - "MAS", - "SCM", - "STS", - "WGS", - "SP", - "SWE", - "AS", - "MS", - "NS", - ], - validGeneric: [ - "PHY1", - "PHY2", - "CHEM", - "BIOL", - "CAL1", - "CAL2", - "LAB", - "REST", - "HASS-A", - "HASS-H", - "HASS-S", - "HASS-E", - "CI-H", - "CI-HW", - ], - colors: { - "course-none": "#999999", - "course-1": "#de4343", - "course-2": "#de7643", - "course-3": "#4369de", - "course-4": "#57b563", - "course-5": "#43deaf", - "course-6": "#4390de", - "course-7": "#5779b5", - "course-8": "#8157b5", - "course-9": "#8143de", - "course-10": "#b55757", - "course-11": "#b55773", - "course-12": "#43de4f", - "course-14": "#de9043", - "course-15": "#b55c57", - "course-16": "#43b2de", - "course-17": "#de43b7", - "course-18": "#575db5", - "course-20": "#57b56e", - "course-21": "#57b573", - "course-21A": "#57b573", - "course-21G": "#57b599", - "course-21H": "#57b5a5", - "course-21L": "#57b5b2", - "course-21M": "#57acb5", - "course-21T": "#5e9da6", - "course-21W": "#57b580", - "course-22": "#b55757", - "course-24": "#7657b5", - "course-CC": "#4fde43", - "course-CMS": "#57b58c", - "course-CSB": "#579ab5", - "course-EC": "#76b557", - "course-EM": "#576eb5", - "course-ES": "#5a57b5", - "course-HST": "#5779b5", - "course-IDS": "#57b586", - "course-MAS": "#57b55a", - "course-SCM": "#57b573", - "course-STS": "#8f57b5", - "course-WGS": "#579fb5", - "course-SP": "#4343de", - "course-SWE": "#b56b57", - "course-AS": "#b0b0b0", - "course-MS": "#b0b0b0", - "course-NS": "#b0b0b0", - "generic-GIR": "#bf6139", - "generic-HASS-E": "#39bf97", - "generic-HASS-A": "#3997bf", - "generic-HASS-H": "#3946bf", - "generic-HASS-S": "#7c39bf", - "generic-CI-H": "#bf39b1", - "generic-CI-HW": "#bf3961", - "custom_color-0": "#b55757", - "custom_color-1": "#b58657", - "custom_color-2": "#b5b557", - "custom_color-3": "#86b557", - "custom_color-4": "#57b557", - "custom_color-5": "#57b586", - "custom_color-6": "#de4343", - "custom_color-7": "#de9043", - "custom_color-8": "#dede43", - "custom_color-9": "#90de43", - "custom_color-10": "#43de43", - "custom_color-11": "#43de90", - "custom_color-12": "#b51616", - "custom_color-13": "#b56516", - "custom_color-14": "#b5b516", - "custom_color-15": "#65b516", - "custom_color-16": "#16b516", - "custom_color-17": "#16b565", - "custom_color-18": "#57b5b5", - "custom_color-19": "#5786b5", - "custom_color-20": "#5757b5", - "custom_color-21": "#8657b5", - "custom_color-22": "#b557b5", - "custom_color-23": "#b55786", - "custom_color-24": "#43dede", - "custom_color-25": "#4390de", - "custom_color-26": "#4343de", - "custom_color-27": "#9043de", - "custom_color-28": "#de43de", - "custom_color-29": "#de4390", - "custom_color-30": "#16b5b5", - "custom_color-31": "#1665b5", - "custom_color-32": "#1616b5", - "custom_color-33": "#6516b5", - "custom_color-34": "#b516b5", - "custom_color-35": "#b51665", - "custom_color-36": "#000000", - "custom_color-37": "#262626", - "custom_color-38": "#4d4d4d", - "custom_color-39": "#737373", - "custom_color-40": "#999999", - "custom_color-41": "#bfbfbf", - }, - }; - }, - methods: { - getRawColor: function (courseColor) { - return this.colors[courseColor]; - }, - getRawTextColor: function () { - return "#ffffff"; - // getRawTextColor: function (courseColor) { - // // See https://github.com/Myndex/max-contrast - // // https://stackoverflow.com/questions/1855884/determine-font-color-based-on-background-color +export const validCourses = [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "14", + "15", + "16", + "17", + "18", + "20", + "21", + "21A", + "21G", + "21H", + "21L", + "21M", + "21T", + "21W", + "22", + "24", + "CC", + "CMS", + "CSB", + "EC", + "EM", + "ES", + "HST", + "IDS", + "MAS", + "SCM", + "STS", + "WGS", + "SP", + "SWE", + "AS", + "MS", + "NS", +]; +export const validGeneric = [ + "PHY1", + "PHY2", + "CHEM", + "BIOL", + "CAL1", + "CAL2", + "LAB", + "REST", + "HASS-A", + "HASS-H", + "HASS-S", + "HASS-E", + "CI-H", + "CI-HW", +]; +export const colors = { + "course-none": "#999999", + "course-1": "#de4343", + "course-2": "#de7643", + "course-3": "#4369de", + "course-4": "#57b563", + "course-5": "#43deaf", + "course-6": "#4390de", + "course-7": "#5779b5", + "course-8": "#8157b5", + "course-9": "#8143de", + "course-10": "#b55757", + "course-11": "#b55773", + "course-12": "#43de4f", + "course-14": "#de9043", + "course-15": "#b55c57", + "course-16": "#43b2de", + "course-17": "#de43b7", + "course-18": "#575db5", + "course-20": "#57b56e", + "course-21": "#57b573", + "course-21A": "#57b573", + "course-21G": "#57b599", + "course-21H": "#57b5a5", + "course-21L": "#57b5b2", + "course-21M": "#57acb5", + "course-21T": "#5e9da6", + "course-21W": "#57b580", + "course-22": "#b55757", + "course-24": "#7657b5", + "course-CC": "#4fde43", + "course-CMS": "#57b58c", + "course-CSB": "#579ab5", + "course-EC": "#76b557", + "course-EM": "#576eb5", + "course-ES": "#5a57b5", + "course-HST": "#5779b5", + "course-IDS": "#57b586", + "course-MAS": "#57b55a", + "course-SCM": "#57b573", + "course-STS": "#8f57b5", + "course-WGS": "#579fb5", + "course-SP": "#4343de", + "course-SWE": "#b56b57", + "course-AS": "#b0b0b0", + "course-MS": "#b0b0b0", + "course-NS": "#b0b0b0", + "generic-GIR": "#bf6139", + "generic-HASS-E": "#39bf97", + "generic-HASS-A": "#3997bf", + "generic-HASS-H": "#3946bf", + "generic-HASS-S": "#7c39bf", + "generic-CI-H": "#bf39b1", + "generic-CI-HW": "#bf3961", + "custom_color-0": "#b55757", + "custom_color-1": "#b58657", + "custom_color-2": "#b5b557", + "custom_color-3": "#86b557", + "custom_color-4": "#57b557", + "custom_color-5": "#57b586", + "custom_color-6": "#de4343", + "custom_color-7": "#de9043", + "custom_color-8": "#dede43", + "custom_color-9": "#90de43", + "custom_color-10": "#43de43", + "custom_color-11": "#43de90", + "custom_color-12": "#b51616", + "custom_color-13": "#b56516", + "custom_color-14": "#b5b516", + "custom_color-15": "#65b516", + "custom_color-16": "#16b516", + "custom_color-17": "#16b565", + "custom_color-18": "#57b5b5", + "custom_color-19": "#5786b5", + "custom_color-20": "#5757b5", + "custom_color-21": "#8657b5", + "custom_color-22": "#b557b5", + "custom_color-23": "#b55786", + "custom_color-24": "#43dede", + "custom_color-25": "#4390de", + "custom_color-26": "#4343de", + "custom_color-27": "#9043de", + "custom_color-28": "#de43de", + "custom_color-29": "#de4390", + "custom_color-30": "#16b5b5", + "custom_color-31": "#1665b5", + "custom_color-32": "#1616b5", + "custom_color-33": "#6516b5", + "custom_color-34": "#b516b5", + "custom_color-35": "#b51665", + "custom_color-36": "#000000", + "custom_color-37": "#262626", + "custom_color-38": "#4d4d4d", + "custom_color-39": "#737373", + "custom_color-40": "#999999", + "custom_color-41": "#bfbfbf", +}; - // const Rs = parseInt(this.colors[courseColor].substring(1, 3), 16); - // const Gs = parseInt(this.colors[courseColor].substring(3, 5), 16); - // const Bs = parseInt(this.colors[courseColor].substring(5, 7), 16); +export const getRawColor = (courseColor) => { + return colors[courseColor]; +}; - // const flipYs = 0.342; // based on APCA™ 0.98G middle contrast BG +export const getRawTextColor = () => { + return "#ffffff"; + // getRawTextColor: function (courseColor) { + // // See https://github.com/Myndex/max-contrast + // // https://stackoverflow.com/questions/1855884/determine-font-color-based-on-background-color - // const trc = 2.4, - // Rco = 0.2126729, - // Gco = 0.7151522, - // Bco = 0.072175; + // const Rs = parseInt(colors[courseColor].substring(1, 3), 16); + // const Gs = parseInt(colors[courseColor].substring(3, 5), 16); + // const Bs = parseInt(colors[courseColor].substring(5, 7), 16); - // let Ys = - // (Rs / 255.0) ** trc * Rco + - // (Gs / 255.0) ** trc * Gco + - // (Bs / 255.0) ** trc * Bco; + // const flipYs = 0.342; // based on APCA™ 0.98G middle contrast BG - // return Ys < flipYs ? colors.shades.white : colors.shades.black; - }, - // courseColor takes in subject - courseColor: function (subject) { - // Custom course have custom_color component - if (subject.custom_color) { - return "custom_color-" + subject.custom_color.slice(1); - } - // Otherwise it's normal class which id determines color - return this.courseColorFromId(subject.id || subject.subject_id); - }, - // Takes a subject ID directly - courseColorFromId: function (id) { - if (id !== undefined) { - let course = id.split(".")[0]; - if (course.indexOf("GIR:") >= 0) { - course = - course.substring(0, course.indexOf("GIR:")) + - course.substring(course.indexOf("GIR:") + 4); - } - const girAttrs = course - .split(" ") - .filter((c) => this.validGeneric.indexOf(c) >= 0); - if (this.validCourses.indexOf(course) !== -1) { - return "course-" + course; - } else if (girAttrs.length > 0) { - if (girAttrs.length === 1) { - const attr = girAttrs[0]; - if (attr.indexOf("HASS") === 0) { - return "generic-" + course; - } else if (attr.indexOf("CI") === 0) { - return "generic-" + course; - } - } - return "generic-GIR"; + // const trc = 2.4, + // Rco = 0.2126729, + // Gco = 0.7151522, + // Bco = 0.072175; + + // let Ys = + // (Rs / 255.0) ** trc * Rco + + // (Gs / 255.0) ** trc * Gco + + // (Bs / 255.0) ** trc * Bco; + + // return Ys < flipYs ? colors.shades.white : colors.shades.black; +}; + +// courseColor takes in subject +export const courseColor = (subject) => { + // Custom course have custom_color component + if (subject.custom_color) { + return "custom_color-" + subject.custom_color.slice(1); + } + // Otherwise it's normal class which id determines color + return courseColorFromId(subject.id || subject.subject_id); +}; + +// Takes a subject ID directly +export const courseColorFromId = (id) => { + if (id !== undefined) { + let course = id.split(".")[0]; + if (course.indexOf("GIR:") >= 0) { + course = + course.substring(0, course.indexOf("GIR:")) + + course.substring(course.indexOf("GIR:") + 4); + } + const girAttrs = course + .split(" ") + .filter((c) => validGeneric.indexOf(c) >= 0); + if (validCourses.indexOf(course) !== -1) { + return "course-" + course; + } else if (girAttrs.length > 0) { + if (girAttrs.length === 1) { + const attr = girAttrs[0]; + if (attr.indexOf("HASS") === 0) { + return "generic-" + course; + } else if (attr.indexOf("CI") === 0) { + return "generic-" + course; } } - return "course-none"; - }, + return "generic-GIR"; + } + } + return "course-none"; +}; + +export default { + data: function () { + return { + validCourses: validCourses, + validGeneric: validGeneric, + colors: colors, + }; + }, + methods: { + getRawColor: getRawColor, + getRawTextColor: getRawTextColor, + courseColor: courseColor, + courseColorFromId: courseColorFromId, }, }; diff --git a/src/mixins/courseLinks.js b/src/mixins/courseLinks.js index c74fcca1..3773eeb0 100644 --- a/src/mixins/courseLinks.js +++ b/src/mixins/courseLinks.js @@ -1,75 +1,79 @@ +export const courseLinks = [ + { + courses: [ + "major6-1", + "major6-1-8-flex", + "major6-2", + "major6-2new", + "major6-3", + "major6-3new", + "major6-4", + "major6-7", + "major6-14", + "major11-6", + "minor6", + "master6-P", + "meng6-14", + ], + link: "https://eecsis.mit.edu/checklist.cgi", + text: "Course 6 Checklist", + }, + { + courses: ["major11"], + link: "https://duspsis.mit.edu/", + text: "Course 11 Student Status", + }, + { + courses: [ + "neetLM-CB", + "neetLM-IE", + "neetLM-TE", + "neetLM-SB", + "neetLM-MDE", + "neetLM", + ], + link: "https://neet.mit.edu/threads/lm", + text: "NEET Living Machines Website", + }, + { + courses: ["neetAM"], + link: "https://neet.mit.edu/threads/am", + text: "NEET Autonomous Machines Website", + }, + { + courses: ["neetAAM"], + link: "https://neet.mit.edu/threads/amm", + text: "NEET Advanced Materials Machines Website", + }, + { + courses: ["neetDC"], + link: "https://neet.mit.edu/threads/dc", + text: "NEET Digital Cities Website", + }, + { + courses: ["neetCES"], + link: "https://neet.mit.edu/threads/rem", + text: "NEET Renewable Energy Machines", + }, +]; + +export const getCourseLinks = (selectedReqs) => { + const links = []; + for (const { courses, link, text } of courseLinks) { + if (selectedReqs.some((course) => courses.includes(course))) { + links.push({ link, text }); + } + } + return links; +}; + export default { data: function () { return { - courseLinks: [ - { - courses: [ - "major6-1", - "major6-1-8-flex", - "major6-2", - "major6-2new", - "major6-3", - "major6-3new", - "major6-4", - "major6-7", - "major6-14", - "major11-6", - "minor6", - "master6-P", - "meng6-14", - ], - link: "https://eecsis.mit.edu/checklist.cgi", - text: "Course 6 Checklist", - }, - { - courses: ["major11"], - link: "https://duspsis.mit.edu/", - text: "Course 11 Student Status", - }, - { - courses: [ - "neetLM-CB", - "neetLM-IE", - "neetLM-TE", - "neetLM-SB", - "neetLM-MDE", - "neetLM", - ], - link: "https://neet.mit.edu/threads/lm", - text: "NEET Living Machines Website", - }, - { - courses: ["neetAM"], - link: "https://neet.mit.edu/threads/am", - text: "NEET Autonomous Machines Website", - }, - { - courses: ["neetAAM"], - link: "https://neet.mit.edu/threads/amm", - text: "NEET Advanced Materials Machines Website", - }, - { - courses: ["neetDC"], - link: "https://neet.mit.edu/threads/dc", - text: "NEET Digital Cities Website", - }, - { - courses: ["neetCES"], - link: "https://neet.mit.edu/threads/rem", - text: "NEET Renewable Energy Machines", - }, - ], + courseLinks: courseLinks, }; }, methods: { - getCourseLinks: function (selectedReqs) { - const links = []; - for (const { courses, link, text } of this.courseLinks) { - if (selectedReqs.some((course) => courses.includes(course))) { - links.push({ link, text }); - } - } - return links; - }, + getCourseLinks: getCourseLinks, }, }; diff --git a/src/mixins/reqFulfillment.js b/src/mixins/reqFulfillment.js index 06997a3b..c7eb0711 100644 --- a/src/mixins/reqFulfillment.js +++ b/src/mixins/reqFulfillment.js @@ -1,199 +1,194 @@ -export default { - methods: { - classSatisfies: function (req, id, allSubjects) { - if (req === id) { - return true; - } +import { useStore } from "../plugins/composition"; - let subj; - if (id in this.$store.state.subjectsIndex) { - subj = - this.$store.state.subjectsInfo[this.$store.state.subjectsIndex[id]]; - } else if (id in this.$store.state.genericIndex) { - subj = - this.$store.state.genericCourses[this.$store.state.genericIndex[id]]; - } else { - // subj not found in known courses - return false; - } +export const classSatisfies = (req, id, allSubjects) => { + const store = useStore(); + if (req === id) { + return true; + } - if ( - subj.equivalent_subjects !== undefined && - subj.equivalent_subjects.indexOf(req) >= 0 - ) { - return true; - } + let subj; + if (id in store.state.subjectsIndex) { + subj = store.state.subjectsInfo[store.state.subjectsIndex[id]]; + } else if (id in store.state.genericIndex) { + subj = store.state.genericCourses[store.state.genericIndex[id]]; + } else { + // subj not found in known courses + return false; + } + + if ( + subj.equivalent_subjects !== undefined && + subj.equivalent_subjects.indexOf(req) >= 0 + ) { + return true; + } + + // ex: 6.00 satisfies the 6.0001 requirement + if (subj.children !== undefined && subj.children.indexOf(req) >= 0) { + return true; + } - // ex: 6.00 satisfies the 6.0001 requirement - if (subj.children !== undefined && subj.children.indexOf(req) >= 0) { + // ex: 6.0001 and 6.0002 together satisfy the 6.00 requirement + if (subj.parent !== undefined && req === subj.parent) { + const parentCourse = + store.state.subjectsInfo[store.state.subjectsIndex[subj.parent]]; + if (parentCourse !== undefined) { + if (parentCourse.children.every((sid) => allSubjects.indexOf(sid) >= 0)) { return true; } + } + } - // ex: 6.0001 and 6.0002 together satisfy the 6.00 requirement - if (subj.parent !== undefined && req === subj.parent) { - const parentCourse = - this.$store.state.subjectsInfo[ - this.$store.state.subjectsIndex[subj.parent] - ]; - if (parentCourse !== undefined) { - if ( - parentCourse.children.every((sid) => allSubjects.indexOf(sid) >= 0) - ) { - return true; - } - } - } + if (req.indexOf(".") === -1) { + if (req.indexOf("GIR:") >= 0) { + req = req.substring(4); + return subj.gir_attribute === req; + } else if (req.indexOf("HASS") >= 0) { + return subj.hass_attribute.split(",").indexOf(req) >= 0; + } else if (req.indexOf("CI") >= 0) { + return subj.communication_requirement === req; + } + } + return false; +}; - if (req.indexOf(".") === -1) { - if (req.indexOf("GIR:") >= 0) { - req = req.substring(4); - return subj.gir_attribute === req; - } else if (req.indexOf("HASS") >= 0) { - return subj.hass_attribute.split(",").indexOf(req) >= 0; - } else if (req.indexOf("CI") >= 0) { - return subj.communication_requirement === req; - } - } - return false; - }, - reqsFulfilled: function (reqString, subjects) { - const allIDs = subjects.map((s) => s.subject_id); - reqString = reqString.replace(/''/g, '"').replace(/,[\s]+/g, ","); - const splitReq = reqString.split(/(,|\(|\)|\/)/); - const _this = this; - let skipNumber; - for (let i = 0; i < splitReq.length; i++) { - if (splitReq[i].indexOf('"') >= 0 && i !== skipNumber) { - // if the requirement is a string instead of a class ID: - // If the string is "One subject in X", check for any subject with X in their ID - // things that are still not handled correctly: - // 21M.283 doesn't work correctly because film / music - // 24.280, 21L.709, 21L.715, 21L.S96, 21L.S97 don't work because we don't keep the count between i's - // Set other strings (like "permission of instructor") automatically to false - // If required as an alternative to other prereqs, will not affect fulfillment - // If the string is a required prereq, it must be manually dismissed - const req = splitReq[i]; - let idCategory; - let numRequired; - const lowercaseReq = req.toLowerCase(); - if ( - lowercaseReq.indexOf("one subject in") >= 0 || - lowercaseReq.indexOf("two subjects in") >= 0 - ) { - if (lowercaseReq.indexOf("one subject in") >= 0) { - numRequired = 1; - } else { - numRequired = 2; - } - // because "one subject in CMS / History" should be (one subject in CMS || one subject in History) not (one subject in CMS) || History - const orcheck = - splitReq[i + 1] === "/" && - (splitReq[i + 2] === '"Comparative Media Studies"' || - splitReq[i + 2] === '"History"'); - // because FireRoad treats "Brain and Cognitive Sciences" as (Brain) && (Cognitive Sciences) instead of (Brain and Cognitive Sciences) - const andcheck = - splitReq[i + 1] === "," && - splitReq[i + 2] === '"Cognitive Sciences"'; - if (splitReq.length > i + 2 && (orcheck || andcheck)) { - skipNumber = i + 2; - idCategory = this.convertReqToID(splitReq[i + 2]); - splitReq[i + 2] = this.checkForNumRequired( - allIDs, - idCategory, - numRequired, - ); - } - // sometimes the string is 'two subjects in X' and sometimes it is 'any other two subjects in X' - const parts = req.split(" "); - const category = req.split(" ")[parts.indexOf("in") + 1]; - idCategory = this.convertReqToID(category); - splitReq[i] = this.checkForNumRequired( - allIDs, - idCategory, - numRequired, - ); - if (idCategory.toString() === "/film/i") { - const allTitles = subjects.map((s) => s.title); - splitReq[i] = this.checkForNumRequired( - allTitles, - idCategory, - numRequired, - ); - } - } else { - splitReq[i] = "false"; - } - } else if ("()/, ".indexOf(splitReq[i]) < 0 && i !== skipNumber) { - if (allIDs.indexOf(splitReq[i]) >= 0) { - splitReq[i] = "true"; - } else { - const anyClassSatisfies = subjects.some((s) => - _this.classSatisfies(splitReq[i], s.subject_id, allIDs), - ); - splitReq[i] = anyClassSatisfies ? "true" : "false"; - } - } - } - const reqExpression = splitReq - .join("") - .replace(/\//g, "||") - .replace(/,/g, "&&"); - // i know this seems scary, but the above code guarantees there will only be ()/, true false in this string - // eslint-disable-next-line no-eval - return eval(reqExpression); - }, - convertReqToID: function (category) { - // takes in a string like "Comparative Media Studies" or "philosophy" and outputs something that matches - // a class ID like /CMS/ or /24\.[0-8]/ - if (category.indexOf('"') === 0) { - category = category.slice(1); - } - if (category.indexOf('"') === category.length - 1) { - category = category.slice(0, -1); - } - let idCategory = ""; +export const reqsFulfilled = (reqString, subjects) => { + const allIDs = subjects.map((s) => s.subject_id); + reqString = reqString.replace(/''/g, '"').replace(/,[\s]+/g, ","); + const splitReq = reqString.split(/(,|\(|\)|\/)/); + let skipNumber; + for (let i = 0; i < splitReq.length; i++) { + if (splitReq[i].indexOf('"') >= 0 && i !== skipNumber) { + // if the requirement is a string instead of a class ID: + // If the string is "One subject in X", check for any subject with X in their ID + // things that are still not handled correctly: + // 21M.283 doesn't work correctly because film / music + // 24.280, 21L.709, 21L.715, 21L.S96, 21L.S97 don't work because we don't keep the count between i's + // Set other strings (like "permission of instructor") automatically to false + // If required as an alternative to other prereqs, will not affect fulfillment + // If the string is a required prereq, it must be manually dismissed + const req = splitReq[i]; + let idCategory; + let numRequired; + const lowercaseReq = req.toLowerCase(); if ( - category === "Comparative" || - category === "CMS" || - category === "Comparative Media Studies" + lowercaseReq.indexOf("one subject in") >= 0 || + lowercaseReq.indexOf("two subjects in") >= 0 ) { - idCategory = /CMS/; - } else if (category === "Literature") { - idCategory = /21L/; - } else if (/film/i.test(category)) { - idCategory = /film/i; - } else if (category === "philosophy") { - // below 900 is Linguistics - idCategory = /24\.[0-8]/; - } else if (category === "Anthropology") { - idCategory = /21A/; - } else if ( - category === "Brain" || - category === "Cognitive Sciences" || - category === "Cognitive" - ) { - idCategory = /^9\./; - } else if (category === "History") { - idCategory = /21H/; - } else { - idCategory = "do not match anything"; - // maybe this should create a message asking us to add it - } - return idCategory; - }, - checkForNumRequired: function (allIDs, idCategory, numRequired) { - // checks whether there are numRequired matches for idCategory in allIDs - let satisfied = "false"; - let numMatches = 0; - for (let i = 0; i < allIDs.length; i++) { - if (allIDs[i].search(idCategory) >= 0) { - numMatches += 1; + if (lowercaseReq.indexOf("one subject in") >= 0) { + numRequired = 1; + } else { + numRequired = 2; + } + // because "one subject in CMS / History" should be (one subject in CMS || one subject in History) not (one subject in CMS) || History + const orcheck = + splitReq[i + 1] === "/" && + (splitReq[i + 2] === '"Comparative Media Studies"' || + splitReq[i + 2] === '"History"'); + // because FireRoad treats "Brain and Cognitive Sciences" as (Brain) && (Cognitive Sciences) instead of (Brain and Cognitive Sciences) + const andcheck = + splitReq[i + 1] === "," && splitReq[i + 2] === '"Cognitive Sciences"'; + if (splitReq.length > i + 2 && (orcheck || andcheck)) { + skipNumber = i + 2; + idCategory = convertReqToID(splitReq[i + 2]); + splitReq[i + 2] = checkForNumRequired( + allIDs, + idCategory, + numRequired, + ); } + // sometimes the string is 'two subjects in X' and sometimes it is 'any other two subjects in X' + const parts = req.split(" "); + const category = req.split(" ")[parts.indexOf("in") + 1]; + idCategory = convertReqToID(category); + splitReq[i] = checkForNumRequired(allIDs, idCategory, numRequired); + if (idCategory.toString() === "/film/i") { + const allTitles = subjects.map((s) => s.title); + splitReq[i] = checkForNumRequired(allTitles, idCategory, numRequired); + } + } else { + splitReq[i] = "false"; } - if (numMatches >= numRequired) { - satisfied = "true"; + } else if ("()/, ".indexOf(splitReq[i]) < 0 && i !== skipNumber) { + if (allIDs.indexOf(splitReq[i]) >= 0) { + splitReq[i] = "true"; + } else { + const anyClassSatisfies = subjects.some((s) => + classSatisfies(splitReq[i], s.subject_id, allIDs), + ); + splitReq[i] = anyClassSatisfies ? "true" : "false"; } - return satisfied; - }, + } + } + const reqExpression = splitReq + .join("") + .replace(/\//g, "||") + .replace(/,/g, "&&"); + // i know this seems scary, but the above code guarantees there will only be ()/, true false in this string + // eslint-disable-next-line no-eval + return eval(reqExpression); +}; + +export const convertReqToID = (category) => { + // takes in a string like "Comparative Media Studies" or "philosophy" and outputs something that matches + // a class ID like /CMS/ or /24\.[0-8]/ + if (category.indexOf('"') === 0) { + category = category.slice(1); + } + if (category.indexOf('"') === category.length - 1) { + category = category.slice(0, -1); + } + let idCategory = ""; + if ( + category === "Comparative" || + category === "CMS" || + category === "Comparative Media Studies" + ) { + idCategory = /CMS/; + } else if (category === "Literature") { + idCategory = /21L/; + } else if (/film/i.test(category)) { + idCategory = /film/i; + } else if (category === "philosophy") { + // below 900 is Linguistics + idCategory = /24\.[0-8]/; + } else if (category === "Anthropology") { + idCategory = /21A/; + } else if ( + category === "Brain" || + category === "Cognitive Sciences" || + category === "Cognitive" + ) { + idCategory = /^9\./; + } else if (category === "History") { + idCategory = /21H/; + } else { + idCategory = "do not match anything"; + // maybe this should create a message asking us to add it + } + return idCategory; +}; + +export const checkForNumRequired = (allIDs, idCategory, numRequired) => { + // checks whether there are numRequired matches for idCategory in allIDs + let satisfied = "false"; + let numMatches = 0; + for (let i = 0; i < allIDs.length; i++) { + if (allIDs[i].search(idCategory) >= 0) { + numMatches += 1; + } + } + if (numMatches >= numRequired) { + satisfied = "true"; + } + return satisfied; +}; + +export default { + methods: { + classSatisfies: classSatisfies, + reqsFulfilled: reqsFulfilled, + convertReqToID: convertReqToID, + checkForNumRequired: checkForNumRequired, }, }; diff --git a/src/mixins/sanitizeSubjects.js b/src/mixins/sanitizeSubjects.js index 55388e6c..db633056 100644 --- a/src/mixins/sanitizeSubjects.js +++ b/src/mixins/sanitizeSubjects.js @@ -1,15 +1,17 @@ +export const getSimpleSelectedSubjects = (selectedSubjects) => { + const simpless = Array.from(Array(16), () => []); + for (let i = 0; i < selectedSubjects.length; i++) { + const s = selectedSubjects[i]; + if (s.semester === undefined || s.semester < 0) { + s.semester = 0; + } + simpless[s.semester].push(s); + } + return simpless; +}; + export default { methods: { - getSimpleSelectedSubjects(selectedSubjects) { - const simpless = Array.from(Array(16), () => []); - for (let i = 0; i < selectedSubjects.length; i++) { - const s = selectedSubjects[i]; - if (s.semester === undefined || s.semester < 0) { - s.semester = 0; - } - simpless[s.semester].push(s); - } - return simpless; - }, + getSimpleSelectedSubjects: getSimpleSelectedSubjects, }, }; diff --git a/src/mixins/schedule.js b/src/mixins/schedule.js index 2eab8172..1325283e 100644 --- a/src/mixins/schedule.js +++ b/src/mixins/schedule.js @@ -1,20 +1,22 @@ +export const lateSchedule = (subj, genericIndex, compareDate = new Date()) => { + if (subj.schedule === undefined && !(subj.subject_id in genericIndex)) { + const year = compareDate.getFullYear(); + const month = compareDate.getMonth(); + const fallCutoff = new Date(year, 4, 15); + const springCutoff = + month === 11 ? new Date(year, 11, 15) : new Date(year - 1, 11, 15); + const scheduleForFall = month >= 4 && month <= 10; + const lateForFall = + scheduleForFall && subj.offered_fall && compareDate > fallCutoff; + const lateForSpring = + !scheduleForFall && subj.offered_spring && compareDate > springCutoff; + return lateForFall || lateForSpring; + } + return false; +}; + export default { methods: { - lateSchedule: function (subj, genericIndex, compareDate = new Date()) { - if (subj.schedule === undefined && !(subj.subject_id in genericIndex)) { - const year = compareDate.getFullYear(); - const month = compareDate.getMonth(); - const fallCutoff = new Date(year, 4, 15); - const springCutoff = - month === 11 ? new Date(year, 11, 15) : new Date(year - 1, 11, 15); - const scheduleForFall = month >= 4 && month <= 10; - const lateForFall = - scheduleForFall && subj.offered_fall && compareDate > fallCutoff; - const lateForSpring = - !scheduleForFall && subj.offered_spring && compareDate > springCutoff; - return lateForFall || lateForSpring; - } - return false; - }, + lateSchedule: lateSchedule, }, }; diff --git a/src/plugins/browserSupport.js b/src/plugins/browserSupport.js index 0899a17f..76a540ca 100644 --- a/src/plugins/browserSupport.js +++ b/src/plugins/browserSupport.js @@ -1,10 +1,12 @@ +export const flatten = (array) => { + return [].concat.apply([], array); +}; + const BrowserSupportPlugin = { install(Vue) { Vue.mixin({ methods: { - flatten: function (array) { - return [].concat.apply([], array); - }, + flatten: flatten, }, }); }, diff --git a/src/plugins/composition.js b/src/plugins/composition.js new file mode 100644 index 00000000..35335d59 --- /dev/null +++ b/src/plugins/composition.js @@ -0,0 +1,16 @@ +import { getCurrentInstance } from "vue"; + +export const useVuetify = () => { + const vm = getCurrentInstance(); + return vm.proxy?.$vuetify || undefined; +}; + +export const useStore = () => { + const vm = getCurrentInstance(); + return vm.proxy?.$store || undefined; +}; + +export const useCookies = () => { + const vm = getCurrentInstance(); + return vm.proxy?.$cookies || undefined; +}; From 289d80e7d4081595c348a3b213ef655a1878cb22 Mon Sep 17 00:00:00 2001 From: Diego Temkin <65834932+dtemkin1@users.noreply.github.com> Date: Wed, 13 Nov 2024 00:18:09 -0500 Subject: [PATCH 07/19] start migrating to composition api --- src/components/FilterSet.vue | 85 ++++--- src/components/ImportExport.vue | 365 +++++++++++++++---------------- src/components/Requirement.vue | 156 +++++++------ src/components/Road.vue | 177 ++++++++------- src/components/RoadTabs.vue | 176 +++++++-------- src/components/SubjectScroll.vue | 41 ++-- src/components/ThemeToggler.vue | 34 ++- 7 files changed, 501 insertions(+), 533 deletions(-) diff --git a/src/components/FilterSet.vue b/src/components/FilterSet.vue index ce06755b..68fb7e52 100644 --- a/src/components/FilterSet.vue +++ b/src/components/FilterSet.vue @@ -17,54 +17,49 @@
- From 05a5f4b269337e3fad8c698e61d7e9eaf635e8a5 Mon Sep 17 00:00:00 2001 From: Diego Temkin <65834932+dtemkin1@users.noreply.github.com> Date: Sat, 16 Nov 2024 01:09:21 -0500 Subject: [PATCH 12/19] fix eslint, go through all components already done --- eslint.config.mjs | 46 ++- package-lock.json | 655 ++++++++++++++++++++++-------- package.json | 4 +- src/components/ClassSearch.vue | 28 +- src/components/ConflictDialog.vue | 15 +- src/components/CustomClass.vue | 6 +- src/components/FilterSet.vue | 2 +- src/components/Requirement.vue | 2 +- src/components/Semester.vue | 11 +- src/components/SubjectScroll.vue | 8 +- src/mixins/reqFulfillment.js | 1 - 11 files changed, 538 insertions(+), 240 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 2fe2f15a..8b18e4c7 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,33 +1,41 @@ import globals from "globals"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; import js from "@eslint/js"; -import { FlatCompat } from "@eslint/eslintrc"; - -import pluginVue from "eslint-plugin-vue"; +import eslintPluginVue from "eslint-plugin-vue"; import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, - allConfig: js.configs.all, -}); +import ts from "typescript-eslint"; -export default [ - // js.configs.recommended, - ...pluginVue.configs["flat/recommended"], - ...pluginVue.configs["flat/vue2-recommended"], - ...compat.extends("plugin:vuetify/base"), +export default ts.config( + js.configs.recommended, + ...ts.configs.recommended, + ...eslintPluginVue.configs["flat/vue2-recommended"], eslintPluginPrettierRecommended, { + files: ["*.vue", "**/*.vue"], + languageOptions: { globals: { ...globals.node, }, + parserOptions: { + parser: "@typescript-eslint/parser", + }, }, - rules: {}, + rules: { + "vue/script-setup-uses-vars": "error", + "@typescript-eslint/no-unused-vars": [ + "error", + { + args: "all", + argsIgnorePattern: "^_", + caughtErrors: "all", + caughtErrorsIgnorePattern: "^_", + destructuredArrayIgnorePattern: "^_", + varsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, + ], + }, }, -]; +); diff --git a/package-lock.json b/package-lock.json index 01844f40..0f9a1942 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.14.0", "@mdi/font": "^7.4.47", + "@types/eslint__js": "^8.42.3", "@types/jquery": "^3.5.32", "@vue/test-utils": "^1.2.2", "cypress-file-upload": "^5.0.8", @@ -37,10 +38,11 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-vue": "^9.31.0", - "eslint-plugin-vuetify": "^1.1.0", "globals": "^15.12.0", "prettier": "3.2.5", "sass": "~1.32", + "typescript": "^5.6.3", + "typescript-eslint": "^8.14.0", "vue": "^2.7.0" } }, @@ -543,9 +545,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, "license": "MIT", "dependencies": { @@ -629,9 +631,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", - "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", "dev": true, "license": "MIT", "engines": { @@ -649,9 +651,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz", - "integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -890,6 +892,44 @@ "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==", "dev": true }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -1131,13 +1171,21 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, + "node_modules/@types/eslint__js": { + "version": "8.42.3", + "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", + "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -1191,6 +1239,235 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz", + "integrity": "sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.14.0", + "@typescript-eslint/type-utils": "8.14.0", + "@typescript-eslint/utils": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.14.0.tgz", + "integrity": "sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.14.0", + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/typescript-estree": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz", + "integrity": "sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz", + "integrity": "sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.14.0", + "@typescript-eslint/utils": "8.14.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.14.0.tgz", + "integrity": "sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz", + "integrity": "sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.14.0.tgz", + "integrity": "sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.14.0", + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/typescript-estree": "8.14.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz", + "integrity": "sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.14.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@vitejs/plugin-vue2": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue2/-/plugin-vue2-2.3.1.tgz", @@ -2222,10 +2499,11 @@ "peer": true }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2996,127 +3274,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-vuetify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vuetify/-/eslint-plugin-vuetify-1.1.0.tgz", - "integrity": "sha512-I1YRUCGkDqe8F7O0tdf63UZVKtk4734+8fzbZ24YIZKTTyQp/FIR0nSZYG8mPFhTWerzPta7oXNzliBOwP2XeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-plugin-vue": "^7.0.0", - "requireindex": "^1.2.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", - "vuetify": "^2.0.0" - } - }, - "node_modules/eslint-plugin-vuetify/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/eslint-plugin-vuetify/node_modules/eslint-plugin-vue": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz", - "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-utils": "^2.1.0", - "natural-compare": "^1.4.0", - "semver": "^6.3.0", - "vue-eslint-parser": "^7.10.0" - }, - "engines": { - "node": ">=8.10" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-vuetify/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-plugin-vuetify/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-vuetify/node_modules/espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eslint-plugin-vuetify/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-plugin-vuetify/node_modules/vue-eslint-parser": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz", - "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "eslint-scope": "^5.1.1", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.2.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8.10" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -3134,32 +3291,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -3172,6 +3303,16 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", + "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/eslint/node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -3538,6 +3679,36 @@ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -3549,6 +3720,16 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -3922,6 +4103,13 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "peer": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -4816,6 +5004,30 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "peer": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -5320,6 +5532,27 @@ "dev": true, "peer": true }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5351,16 +5584,6 @@ "throttleit": "^1.0.0" } }, - "node_modules/requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.5" - } - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -5382,6 +5605,17 @@ "node": ">=8" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rfdc": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", @@ -5424,6 +5658,30 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -5487,7 +5745,8 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "devOptional": true, + "optional": true, + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -5935,7 +6194,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/throttleit": { "version": "1.0.1", @@ -6003,6 +6263,19 @@ "node": ">= 4.0.0" } }, + "node_modules/ts-api-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -6055,11 +6328,11 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "optional": true, - "peer": true, + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6068,6 +6341,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.14.0.tgz", + "integrity": "sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.14.0", + "@typescript-eslint/parser": "8.14.0", + "@typescript-eslint/utils": "8.14.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/ua-parser-js": { "version": "1.0.37", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", diff --git a/package.json b/package.json index 8e1442ac..6f20f7e4 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.14.0", "@mdi/font": "^7.4.47", + "@types/eslint__js": "^8.42.3", "@types/jquery": "^3.5.32", "@vue/test-utils": "^1.2.2", "cypress-file-upload": "^5.0.8", @@ -47,10 +48,11 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-vue": "^9.31.0", - "eslint-plugin-vuetify": "^1.1.0", "globals": "^15.12.0", "prettier": "3.2.5", "sass": "~1.32", + "typescript": "^5.6.3", + "typescript-eslint": "^8.14.0", "vue": "^2.7.0" }, "bugs": { diff --git a/src/components/ClassSearch.vue b/src/components/ClassSearch.vue index 07f92b31..bfc607f4 100644 --- a/src/components/ClassSearch.vue +++ b/src/components/ClassSearch.vue @@ -47,27 +47,28 @@ :items-per-page-text="'Results per page:\xa0'" :hide-default-header="true" > -