diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 2f3ce590c5..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -app/assets/config/manifest.js -app/assets/javascripts/i18n/translations.js -app/assets/javascripts/types/index.d.ts -app/assets/javascripts/inputServiceWorker.js diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 934badb08f..0000000000 --- a/.eslintrc +++ /dev/null @@ -1,83 +0,0 @@ -{ - "plugins": [ - "jest", - "no-jquery" - ], - "parserOptions": { - "ecmaVersion": 2020, - "sourceType": "module" - }, - "extends": [ - "eslint:recommended", - "google", - "plugin:jest/recommended", - "plugin:no-jquery/all", - "plugin:wc/recommended", - "plugin:lit/recommended" - ], - "rules": { - "arrow-parens": ["error", "as-needed"], - "comma-dangle": ["error", { - "arrays": "only-multiline", - "objects": "only-multiline", - "imports": "only-multiline", - "exports": "only-multiline", - "functions": "never" - }], - "indent": "off", - "@typescript-eslint/indent": [ - "error", - 4, - { - "ignoredNodes": [ - "FunctionExpression > .params[decorators.length > 0]", - "FunctionExpression > .params > :matches(Decorator, :not(:first-child))", - "ClassBody.body > PropertyDefinition[decorators.length > 0] > .key", - "TSTypeParameterInstantiation", - "PropertyDefinition" - ] - } - ], - "max-len": ["warn", { "code": 100 }], - "no-invalid-this": "warn", - "no-param-reassign": ["error", { "props": false }], - "object-curly-spacing": ["error", "always"], - "quotes": ["error", "double", { "allowTemplateLiterals": true }], - "require-jsdoc": "off", - "valid-jsdoc": "off", - "space-before-function-paren": [ - "error", - { "anonymous": "always", "named": "never", "asyncArrow": "always" } - ] - }, - "env": { - "browser": true, - "es6": true, - "jest/globals": true - }, - "globals": { - "d3": "readonly", - "dodona": "readonly" - }, - "overrides": [ - { - "extends": ["plugin:@typescript-eslint/recommended"], - "files": ["*.ts"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - // this seems to be extremely slow - // without 1.5s, with 22s - //"project": "./tsconfig.json" - }, - "plugins": ["@typescript-eslint"], - "rules": { - "@typescript-eslint/explicit-member-accessibility": "off", - "@typescript-eslint/explicit-function-return-type": [ - "error", - { "allowExpressions": true } - ], - "@typescript-eslint/no-parameter-properties": "off" - } - } - ] -} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b3a755fcf9..576083c66c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -33,7 +33,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v4 with: - node-version: 16.x + node-version: 22.x cache: yarn - name: Install dependencies run: | @@ -53,7 +53,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v4 with: - node-version: 16.x + node-version: 22.x cache: yarn - name: Install dependencies run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 308823fbd1..260bba78b2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,10 +34,10 @@ jobs: uses: ruby/setup-ruby@v1 with: bundler-cache: true - - name: Use node 16 + - name: Use node 22 uses: actions/setup-node@v4 with: - node-version: 16.x + node-version: 22.x cache: yarn - name: Run tests env: @@ -63,7 +63,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v4 with: - node-version: 16.x + node-version: 22.x cache: yarn - name: Install dependencies run: | @@ -102,10 +102,10 @@ jobs: uses: ruby/setup-ruby@v1 with: bundler-cache: true - - name: Use node 16 + - name: Use node 22 uses: actions/setup-node@v4 with: - node-version: 16.x + node-version: 22.x cache: yarn - name: Setup chromium-chromedriver uses: nanasess/setup-chromedriver@master diff --git a/app/assets/javascripts/components/annotations/annotation_form.ts b/app/assets/javascripts/components/annotations/annotation_form.ts index e4bb7afcf2..3383ffa2a8 100644 --- a/app/assets/javascripts/components/annotations/annotation_form.ts +++ b/app/assets/javascripts/components/annotations/annotation_form.ts @@ -1,5 +1,5 @@ import { customElement, property } from "lit/decorators.js"; -import { html, TemplateResult } from "lit"; +import { html, PropertyValues, TemplateResult } from "lit"; import { watchMixin } from "components/meta/watch_mixin"; import { createRef, Ref, ref } from "lit/directives/ref.js"; import "components/saved_annotations/saved_annotation_input"; @@ -210,7 +210,7 @@ export class AnnotationForm extends watchMixin(DodonaElement) { this.inputRef.value.focus(); } - updated(changedProperties: Map): void { + updated(changedProperties: PropertyValues): void { // Focus the newly shown title input if the user wants to save the annotation. if (changedProperties.has("saveAnnotation") && this.saveAnnotation) { this.titleRef.value.focus(); diff --git a/app/assets/javascripts/components/annotations/annotations_cell.ts b/app/assets/javascripts/components/annotations/annotations_cell.ts index 29c07a6f51..43834060ee 100644 --- a/app/assets/javascripts/components/annotations/annotations_cell.ts +++ b/app/assets/javascripts/components/annotations/annotations_cell.ts @@ -61,7 +61,7 @@ export class AnnotationsCell extends DodonaElement { const mode = annotationState.isQuestionMode ? "question" : "annotation"; await userAnnotationState.create(annotationData, submissionState.id, mode, e.detail.saveAnnotation, e.detail.savedAnnotationTitle); this.closeForm(); - } catch (err) { + } catch { this.annotationFormRef.value.hasErrors = true; this.annotationFormRef.value.disabled = false; } diff --git a/app/assets/javascripts/components/annotations/thread.ts b/app/assets/javascripts/components/annotations/thread.ts index 5df88873bf..e428bd769a 100644 --- a/app/assets/javascripts/components/annotations/thread.ts +++ b/app/assets/javascripts/components/annotations/thread.ts @@ -56,7 +56,7 @@ export class Thread extends DodonaElement { const mode = annotationState.isQuestionMode ? "question" : "annotation"; await userAnnotationState.create(annotationData, submissionState.id, mode, e.detail.saveAnnotation, e.detail.savedAnnotationTitle); this.formShown = false; - } catch (err) { + } catch { this.annotationFormRef.value.hasErrors = true; this.annotationFormRef.value.disabled = false; } diff --git a/app/assets/javascripts/components/annotations/user_annotation.ts b/app/assets/javascripts/components/annotations/user_annotation.ts index a3972db558..6df71d4f2c 100644 --- a/app/assets/javascripts/components/annotations/user_annotation.ts +++ b/app/assets/javascripts/components/annotations/user_annotation.ts @@ -116,7 +116,7 @@ export class UserAnnotationComponent extends DodonaElement { }); } this.editing = false; - } catch (e) { + } catch { this.annotationFormRef.value.hasErrors = true; this.annotationFormRef.value.disabled = false; } @@ -128,7 +128,7 @@ export class UserAnnotationComponent extends DodonaElement { try { // Ask MathJax to search for math in the annotations window.MathJax.typeset([this]); - } catch (e) { + } catch { // MathJax is not loaded console.warn("MathJax is not loaded"); } diff --git a/app/assets/javascripts/components/meta/i18n_mixin.ts b/app/assets/javascripts/components/meta/i18n_mixin.ts index c33dc58759..313e55bdac 100644 --- a/app/assets/javascripts/components/meta/i18n_mixin.ts +++ b/app/assets/javascripts/components/meta/i18n_mixin.ts @@ -1,6 +1,7 @@ import { LitElement } from "lit"; import { ready } from "utilities"; +// eslint-disable-next-line @typescript-eslint/no-explicit-any type Constructor = new (...args: any[]) => LitElement; export function i18nMixin(superClass: T): T { @@ -9,6 +10,7 @@ export function i18nMixin(superClass: T): T { * It also makes sure that the component is rerendered when the language becomes available */ class I18nMixinClass extends superClass { + // eslint-disable-next-line @typescript-eslint/no-explicit-any constructor(...args: any[]) { super(args); // Reload when I18n is available diff --git a/app/assets/javascripts/components/meta/watch_mixin.ts b/app/assets/javascripts/components/meta/watch_mixin.ts index 9941716eb2..b8f5897b5c 100644 --- a/app/assets/javascripts/components/meta/watch_mixin.ts +++ b/app/assets/javascripts/components/meta/watch_mixin.ts @@ -1,5 +1,6 @@ -import { LitElement } from "lit"; +import { LitElement, PropertyValues } from "lit"; +// eslint-disable-next-line @typescript-eslint/no-explicit-any type Constructor = abstract new (...args: any[]) => LitElement; export function watchMixin(superClass: T): T { @@ -9,7 +10,7 @@ export function watchMixin(superClass: T): T { abstract class WatchMixinClass extends superClass { abstract get watch(): {[key: string]: (old: unknown) => void}; - update(changedProperties: Map): void { + update(changedProperties: PropertyValues): void { for (const [key, f] of Object.entries(this.watch)) { if (changedProperties.has(key)) { f.bind(this); diff --git a/app/assets/javascripts/components/modal_mixin.ts b/app/assets/javascripts/components/modal_mixin.ts index 2f4ea62c4c..4a830f144c 100644 --- a/app/assets/javascripts/components/modal_mixin.ts +++ b/app/assets/javascripts/components/modal_mixin.ts @@ -1,4 +1,4 @@ -import { html, TemplateResult, render } from "lit"; +import { html, TemplateResult, render, PropertyValues } from "lit"; import { ref } from "lit/directives/ref.js"; import { Modal as Modal } from "bootstrap"; import { DodonaElement } from "components/meta/dodona_element"; @@ -20,6 +20,7 @@ export declare abstract class ModalMixinInterface { hideModal(): void; } +// eslint-disable-next-line @typescript-eslint/no-explicit-any type Constructor = abstract new (...args: any[]) => T; export function modalMixin>(superClass: T): Constructor & T { @@ -60,7 +61,7 @@ export function modalMixin>(superClass: T): // This can cause unexpected behaviour if update is triggered on a modal component which is different from the currently active modalcomponent // (As there is only one real html modal, the wrong `filledModalTemplate` will be displayed) // This could be solved by tracking which modalcomponent is currently active - update(changedProperties: Map): void { + update(changedProperties: PropertyValues): void { super.update(changedProperties); this.renderModal(); } diff --git a/app/assets/javascripts/components/progress_bar.ts b/app/assets/javascripts/components/progress_bar.ts index f60d40acc1..98ab17d9c2 100644 --- a/app/assets/javascripts/components/progress_bar.ts +++ b/app/assets/javascripts/components/progress_bar.ts @@ -1,6 +1,6 @@ -import { html, TemplateResult } from "lit"; +import { html, PropertyValues, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators.js"; -import { initTooltips, ready } from "../utilities"; +import { initTooltips } from "../utilities"; import { i18n } from "i18n/i18n"; import { DodonaElement } from "components/meta/dodona_element"; @@ -38,7 +38,7 @@ export class ProgressBar extends DodonaElement { return i18n.t(this.titleKey + i18n.t(this.titleKey + ".key", index), { index: index, smart_count: value }); } - updated(changedProperties: Map): void { + updated(changedProperties: PropertyValues): void { initTooltips(this); super.updated(changedProperties); } diff --git a/app/assets/javascripts/components/search/filter_collection_element.ts b/app/assets/javascripts/components/search/filter_collection_element.ts index 63a4607ba7..d90dc2acf1 100644 --- a/app/assets/javascripts/components/search/filter_collection_element.ts +++ b/app/assets/javascripts/components/search/filter_collection_element.ts @@ -67,7 +67,7 @@ export class FilterCollectionElement extends DodonaElement { searchQueryState.arrayQueryParams.set(this.param, [...this.multiSelected, this.str(label)]); } - private singleUnSelect(label: Label): void { + private singleUnSelect(): void { searchQueryState.queryParams.set(this.param, undefined); } @@ -80,7 +80,7 @@ export class FilterCollectionElement extends DodonaElement { } isSelected = this.singleIsSelected; - unSelect = this.singleUnSelect; + unSelect: (label: Label) => void = this.singleUnSelect; select = this.singleSelect; toggle(label: Label): void { diff --git a/app/assets/javascripts/components/search/loading_bar.ts b/app/assets/javascripts/components/search/loading_bar.ts index e56b9e19af..80c60bb739 100644 --- a/app/assets/javascripts/components/search/loading_bar.ts +++ b/app/assets/javascripts/components/search/loading_bar.ts @@ -1,4 +1,4 @@ -import { html, PropertyValues, TemplateResult } from "lit"; +import { html, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators.js"; import { search } from "search"; import { DodonaElement } from "components/meta/dodona_element"; diff --git a/app/assets/javascripts/components/search/search_option.ts b/app/assets/javascripts/components/search/search_option.ts index 5b57a878c6..cf27df7663 100644 --- a/app/assets/javascripts/components/search/search_option.ts +++ b/app/assets/javascripts/components/search/search_option.ts @@ -2,7 +2,6 @@ import { customElement, property } from "lit/decorators.js"; import { DodonaElement } from "components/meta/dodona_element"; import { searchQueryState } from "state/SearchQuery"; import { html, TemplateResult } from "lit"; -import { i18n } from "i18n/i18n"; export type Option = {param: string, label: string}; diff --git a/app/assets/javascripts/components/sign_in_search_bar.ts b/app/assets/javascripts/components/sign_in_search_bar.ts index 4737d229fb..b5b151ea8d 100644 --- a/app/assets/javascripts/components/sign_in_search_bar.ts +++ b/app/assets/javascripts/components/sign_in_search_bar.ts @@ -1,7 +1,6 @@ import { customElement, property } from "lit/decorators.js"; import { html, TemplateResult } from "lit"; import { Option } from "components/datalist_input"; -import { ready } from "utilities"; import "components/datalist_input"; import { DodonaElement } from "components/meta/dodona_element"; import { i18n } from "i18n/i18n"; diff --git a/app/assets/javascripts/course.ts b/app/assets/javascripts/course.ts index 77fad7ade5..15417ea95c 100644 --- a/app/assets/javascripts/course.ts +++ b/app/assets/javascripts/course.ts @@ -226,18 +226,20 @@ function initCourseNew(): void { const formCollapse = new bootstrap.Collapse(formCollapseElement, { toggle: false }); function initPanelLogic(): void { - document.getElementById("new-course").addEventListener("click", function () { + const newCourseButton = document.getElementById("new-course"); + newCourseButton.addEventListener("click", function () { choosePanel.classList.add("hidden"); formPanel.querySelector(".step-circle").innerHTML = "2"; - this.closest(".panel") + newCourseButton.closest(".panel") .querySelector(".answer") - .textContent = this.dataset.answer; + .textContent = newCourseButton.dataset.answer; fetch("/courses/new.js") .then(req => req.text()) .then(resp => eval(resp)); }); - document.getElementById("copy-course").addEventListener("click", function () { + const copyCourseButton = document.getElementById("copy-course"); + copyCourseButton.addEventListener("click", function () { choosePanel.classList.remove("hidden"); chooseCollapse.show(); choosePanel.querySelectorAll(`input[type="radio"]`).forEach(el => { @@ -245,20 +247,20 @@ function initCourseNew(): void { }); formPanel.classList.add("hidden"); formPanel.querySelector(".step-circle").innerHTML = "3"; - this.closest(".panel") + copyCourseButton.closest(".panel") .querySelector(".answer") - .textContent = this.dataset.answer; + .textContent = copyCourseButton.dataset.answer; }); } function copyCoursesLoaded(): void { - document.querySelectorAll("[data-course_id]").forEach(el => { + document.querySelectorAll("[data-course_id]").forEach((el: HTMLElement) => { el.addEventListener("click", function () { - this.querySelector(`input[type="radio"]`).checked = true; - this.closest(".panel") + (el.querySelector(`input[type="radio"]`) as HTMLInputElement).checked = true; + el.closest(".panel") .querySelector(".answer") - .textContent = this.dataset.answer; - fetch(`/courses/new.js?copy_options[base_id]=${this.dataset.course_id}`) + .textContent = el.dataset.answer; + fetch(`/courses/new.js?copy_options[base_id]=${el.dataset.course_id}`) .then(req => req.text()) .then(resp => eval(resp)); }); diff --git a/app/assets/javascripts/drag_and_drop.ts b/app/assets/javascripts/drag_and_drop.ts index 4e69f6f897..5eed937707 100644 --- a/app/assets/javascripts/drag_and_drop.ts +++ b/app/assets/javascripts/drag_and_drop.ts @@ -31,12 +31,12 @@ function initDragAndDrop(args: DragAndDropArguments): void { const tableBody = document.querySelectorAll(args.table_selector)[0]; dragula([tableBody], { - moves: (el, source, handle, sibling) => { + moves: (el, source, handle) => { return handle.classList.contains("drag-handle") || getParentByClassName(handle, "drag-handle") !== null; }, mirrorContainer: tableBody, }) - .on("cloned", (clone, original, type) => { + .on("cloned", (clone, original) => { copyWidth(clone, original, "td"); }) .on("drop", () => { diff --git a/app/assets/javascripts/exercise.ts b/app/assets/javascripts/exercise.ts index a5ff82c5ca..8f0006649b 100644 --- a/app/assets/javascripts/exercise.ts +++ b/app/assets/javascripts/exercise.ts @@ -17,7 +17,7 @@ function showLightbox(content): void { // MathJax to search for new math (but only in the captions). try { window.MathJax.typeset( Array.from(document.querySelectorAll(".gslide-description"))); - } catch (e) { + } catch { // MathJax is not loaded console.warn("MathJax is not loaded"); } @@ -410,7 +410,7 @@ async function initExerciseShow(options: { } else if (errors.exercise && errors.exercise[0] === "not permitted") { message = i18n.t("js.submission-not-allowed"); } - } catch (e) { + } catch { message = i18n.t("js.submission-failed"); } } diff --git a/app/assets/javascripts/favorite_course_buttons.ts b/app/assets/javascripts/favorite_course_buttons.ts index 086701b27f..eb4d1fa1f8 100644 --- a/app/assets/javascripts/favorite_course_buttons.ts +++ b/app/assets/javascripts/favorite_course_buttons.ts @@ -6,14 +6,14 @@ import { SeriesIcon } from "components/series_icon"; function initFavoriteButtons(doc: Document | HTMLElement = document): void { function init(): void { doc.querySelectorAll(".favorite-button") - .forEach(btn => btn.addEventListener("click", toggleFavorite)); + .forEach((btn: HTMLElement) => btn.addEventListener("click", () => toggleFavorite(btn))); } - function toggleFavorite(): void { - if (this.classList.contains("favorited")) { - unfavoriteCourse(this); + function toggleFavorite(btn: HTMLElement): void { + if (btn.classList.contains("favorited")) { + unfavoriteCourse(btn); } else { - favoriteCourse(this); + favoriteCourse(btn); } } @@ -44,7 +44,7 @@ function initFavoriteButtons(doc: Document | HTMLElement = document): void { const cloneFavButton = clone.querySelector(".favorite-button"); cloneFavButton.setAttribute("title", i18n.t("js.unfavorite-course-do")); new bootstrap.Tooltip(cloneFavButton); // is enabled by default - cloneFavButton.addEventListener("click", toggleFavorite); + cloneFavButton.addEventListener("click", () => toggleFavorite(cloneFavButton)); // hack to fix double rendering of content of lit element 'd-series-icon' clone.querySelectorAll("d-series-icon").forEach((el: SeriesIcon) => { el.replaceChildren(); diff --git a/app/assets/javascripts/feedback/actions.ts b/app/assets/javascripts/feedback/actions.ts index 7dd8c675b9..69b3089f31 100644 --- a/app/assets/javascripts/feedback/actions.ts +++ b/app/assets/javascripts/feedback/actions.ts @@ -253,7 +253,7 @@ export default class FeedbackActions { }); const values = this.scoreForms.map(f => f.getDataForNested()); this.update({ - // eslint-disable-next-line camelcase + scores_attributes: values }); }); @@ -266,7 +266,7 @@ export default class FeedbackActions { }); const values = this.scoreForms.map(f => f.getDataForNested()); this.update({ - // eslint-disable-next-line camelcase + scores_attributes: values }); }); diff --git a/app/assets/javascripts/feedback/score.ts b/app/assets/javascripts/feedback/score.ts index 293f0c6d0e..54687d8462 100644 --- a/app/assets/javascripts/feedback/score.ts +++ b/app/assets/javascripts/feedback/score.ts @@ -130,7 +130,7 @@ export default class ScoreForm { } else { return { score: this.input.value, - // eslint-disable-next-line camelcase + score_item_id: this.scoreItemId }; } @@ -148,15 +148,15 @@ export default class ScoreForm { if (this.existing) { data = { score: this.input.value, - // eslint-disable-next-line camelcase + expected_score: this.expectedScore.value }; } else { data = { score: this.input.value, - // eslint-disable-next-line camelcase + feedback_id: this.parent.options.feedbackId, - // eslint-disable-next-line camelcase + score_item_id: this.scoreItemId }; } @@ -173,7 +173,7 @@ export default class ScoreForm { private delete(): void { this.doRequest("delete", { - // eslint-disable-next-line camelcase + expected_score: this.expectedScore.value }); } diff --git a/app/assets/javascripts/iframe.ts b/app/assets/javascripts/iframe.ts index 35f5424401..a86fc8a501 100644 --- a/app/assets/javascripts/iframe.ts +++ b/app/assets/javascripts/iframe.ts @@ -6,7 +6,7 @@ export function isInIframe(): boolean { try { return window.self !== window.top; - } catch (e) { + } catch { return true; } } diff --git a/app/assets/javascripts/lti.ts b/app/assets/javascripts/lti.ts index 29e4655bcb..784252b1dc 100644 --- a/app/assets/javascripts/lti.ts +++ b/app/assets/javascripts/lti.ts @@ -115,7 +115,7 @@ export function initLtiContentSelection(payloadUrl: string, activities: activities, series: seriesSelect ? seriesSelect.value : null, course: courseSelect.value, - // eslint-disable-next-line camelcase + decoded_token: decodedToken }; const responseRaw = await fetch(payloadUrl, { diff --git a/app/assets/javascripts/punchcard.ts b/app/assets/javascripts/punchcard.ts index 595e55759a..9a2d75fb04 100644 --- a/app/assets/javascripts/punchcard.ts +++ b/app/assets/javascripts/punchcard.ts @@ -4,7 +4,7 @@ import { i18n } from "i18n/i18n"; const containerSelector = "#punchcard-container"; const margin = { top: 10, right: 10, bottom: 20, left: 70 }; -type chartType = d3.Selection; +type chartType = d3.Selection; function initPunchcard(url: string): void { // If this is defined outside of a function, the locale always defaults to "en". diff --git a/app/assets/javascripts/question_table.ts b/app/assets/javascripts/question_table.ts index 36b0cc7e92..2e3447e021 100644 --- a/app/assets/javascripts/question_table.ts +++ b/app/assets/javascripts/question_table.ts @@ -110,7 +110,7 @@ export class QuestionTable { body: JSON.stringify({ from: from, question: { - // eslint-disable-next-line camelcase + question_state: to } }) diff --git a/app/assets/javascripts/score_item.ts b/app/assets/javascripts/score_item.ts index 6b140eb7f7..5a5b331f08 100644 --- a/app/assets/javascripts/score_item.ts +++ b/app/assets/javascripts/score_item.ts @@ -35,9 +35,9 @@ function commonCheckboxInit( function initTotalVisibilityCheckboxes(element: HTMLElement): void { commonCheckboxInit(element, ".total-visibility-checkbox", checked => { return { - // eslint-disable-next-line camelcase + evaluation_exercise: { - // eslint-disable-next-line camelcase + visible_score: checked } }; @@ -47,7 +47,7 @@ function initTotalVisibilityCheckboxes(element: HTMLElement): void { function initItemVisibilityCheckboxes(element: HTMLElement): void { commonCheckboxInit(element, ".visibility-checkbox", checked => { return { - // eslint-disable-next-line camelcase + score_item: { visible: checked } diff --git a/app/assets/javascripts/search.ts b/app/assets/javascripts/search.ts index 20869e73c3..879fbacda4 100644 --- a/app/assets/javascripts/search.ts +++ b/app/assets/javascripts/search.ts @@ -1,4 +1,4 @@ -import { createDelayer, fetch, getURLParameter, updateArrayURLParameter, updateURLParameter } from "utilities"; +import { createDelayer, fetch, getURLParameter, updateURLParameter } from "utilities"; import { InactiveTimeout } from "auto_reload"; import { LoadingBar } from "components/search/loading_bar"; import { searchQueryState } from "state/SearchQuery"; diff --git a/app/assets/javascripts/state/state_system/CreateStateFromInterface.ts b/app/assets/javascripts/state/state_system/CreateStateFromInterface.ts index 1bd9dbd1d8..be1468a941 100644 --- a/app/assets/javascripts/state/state_system/CreateStateFromInterface.ts +++ b/app/assets/javascripts/state/state_system/CreateStateFromInterface.ts @@ -14,7 +14,7 @@ export const createStateFromInterface = (): new (data: T) => (T & State) => { constructor(data: T) { super(); Object.keys(data).forEach(key => { - (this as any)[key] = data[key]; + this[key] = data[key]; }); } } diff --git a/app/assets/javascripts/state/state_system/StateMap.ts b/app/assets/javascripts/state/state_system/StateMap.ts index e419ec270b..114af21aa9 100644 --- a/app/assets/javascripts/state/state_system/StateMap.ts +++ b/app/assets/javascripts/state/state_system/StateMap.ts @@ -22,7 +22,7 @@ export class StateMap extends State implements Map { return this.map.delete(key); } - public forEach(callbackfn: (value: V, key: K, map: Map) => void, thisArg?: any): void { + public forEach(callbackfn: (value: V, key: K, map: Map) => void, thisArg?: never): void { this.recordRead(); this.map.forEach(callbackfn, thisArg); } diff --git a/app/assets/javascripts/tutor.ts b/app/assets/javascripts/tutor.ts index 56d727e8f3..3536ceefcd 100644 --- a/app/assets/javascripts/tutor.ts +++ b/app/assets/javascripts/tutor.ts @@ -1,5 +1,5 @@ import { initPapyros, OFFCANVAS_ID } from "coding_scratchpad"; -import { InputMode, ProgrammingLanguage, RunState } from "@dodona/papyros"; +import { InputMode, ProgrammingLanguage } from "@dodona/papyros"; import { BatchInputHandler } from "@dodona/papyros/dist/input/BatchInputHandler"; import { Offcanvas } from "bootstrap"; import { RunMode } from "@dodona/papyros/dist/Backend"; diff --git a/app/assets/javascripts/visualisations/cumulative_timeseries.ts b/app/assets/javascripts/visualisations/cumulative_timeseries.ts index 72f30bf71e..b0ff8238b7 100644 --- a/app/assets/javascripts/visualisations/cumulative_timeseries.ts +++ b/app/assets/javascripts/visualisations/cumulative_timeseries.ts @@ -22,16 +22,16 @@ export class CTimeseriesGraph extends SeriesGraph { // tooltips things private tooltip: d3.Selection; private tooltipIndex = -1; // used to prevent unnecessary tooltip updates - private tooltipLine: d3.Selection; + private tooltipLine: d3.Selection; private tooltipDots: d3.Selection< Element | SVGCircleElement | d3.EnterElement | Document | Window | null, unknown, SVGGElement, - any + unknown >; // data - // eslint-disable-next-line camelcase + private data: { ex_id: string, ex_data: { bin: d3.Bin, cSum: number }[] }[] = []; private studentCount: number; // amount of subscribed students private maxSum = 0; // largest y-value == max value @@ -187,7 +187,7 @@ export class CTimeseriesGraph extends SeriesGraph { // eslint-disable-next-line camelcase protected override processData({ data, exercises, student_count, deadline }: RawData): void { this.data = []; - // eslint-disable-next-line camelcase + data as { ex_id: number, ex_data: (string | Date)[] }[]; this.parseExercises(exercises, data.map(ex => ex.ex_id)); diff --git a/app/assets/javascripts/visualisations/series_exercise_graph.ts b/app/assets/javascripts/visualisations/series_exercise_graph.ts index 8b207749be..ea4ce51c3c 100644 --- a/app/assets/javascripts/visualisations/series_exercise_graph.ts +++ b/app/assets/javascripts/visualisations/series_exercise_graph.ts @@ -11,9 +11,9 @@ export abstract class SeriesExerciseGraph extends SeriesGraph { "time limit exceeded", "memory limit exceeded", "output limit exceeded", ]; - protected override draw(animation=true): void { + protected override draw(): void { this.height = 60 * this.exOrder.length + this.margin.top + this.margin.bottom; - super.draw(animation); + super.draw(); // y-scale for exercises this.y = d3.scaleBand() diff --git a/app/assets/javascripts/visualisations/series_graph.ts b/app/assets/javascripts/visualisations/series_graph.ts index 009105059c..27963fe026 100644 --- a/app/assets/javascripts/visualisations/series_graph.ts +++ b/app/assets/javascripts/visualisations/series_graph.ts @@ -6,10 +6,8 @@ import { themeState } from "state/Theme"; import { i18n } from "i18n/i18n"; export type RawData = { - // eslint-disable-next-line camelcase data: { ex_id: number, ex_data: unknown[] }[], exercises: [number, string][], - // eslint-disable-next-line camelcase student_count: number, } @@ -107,7 +105,7 @@ export abstract class SeriesGraph { } - protected draw(animation=true): void { + protected draw(): void { console.log("Drawing graph"); this.innerWidth = this.width - this.margin.left - this.margin.right; this.innerHeight = this.height - this.margin.top - this.margin.bottom; diff --git a/app/assets/javascripts/visualisations/violin.ts b/app/assets/javascripts/visualisations/violin.ts index 1a5b1ddd6a..2f82462cc0 100644 --- a/app/assets/javascripts/visualisations/violin.ts +++ b/app/assets/javascripts/visualisations/violin.ts @@ -1,4 +1,4 @@ -/* eslint-disable max-len */ + // eslint-disable-next-line // @ts-nocheck @@ -15,13 +15,13 @@ export class ViolinGraph extends SeriesExerciseGraph { // tooltips things private tooltipIndex = -1; // used to prevent unnecessary tooltip updates - private tooltipLine: d3.Selection; - private tooltipLabel: d3.Selection; + private tooltipLine: d3.Selection; + private tooltipLabel: d3.Selection; private tooltipLabels: d3.Selection< Element | SVGTextElement | d3.EnterElement | Document | Window | null, unknown, SVGGElement, - any + unknown >; // data diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..194cbec9a0 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,88 @@ +import noJquery from 'eslint-plugin-no-jquery'; +import ts_eslint from 'typescript-eslint'; +import eslint from "@eslint/js"; +import globals from "globals"; +import google_eslint from "eslint-config-google"; +import jest_eslint from "eslint-plugin-jest" + +import { FlatCompat } from "@eslint/eslintrc"; + +const compat = new FlatCompat(); + +export default ts_eslint.config( + eslint.configs.recommended, + ...ts_eslint.configs.recommended, + google_eslint, + ...compat.extends( // old eslintrc style configs, converted to new style by the compat object + "plugin:no-jquery/all", + "plugin:wc/recommended", + "plugin:lit/recommended", + ), + { + plugins: { + "no-jquery": noJquery + }, + languageOptions: { + globals: { + ...globals.browser, + ...globals.es2020, + ...globals.jest, + d3: "readonly", + dodona: "readonly" + }, + }, + rules: { + "arrow-parens": ["error", "as-needed"], + "comma-dangle": ["error", { + "arrays": "only-multiline", + "objects": "only-multiline", + "imports": "only-multiline", + "exports": "only-multiline", + "functions": "never" + }], + "indent": "off", + "max-len": "off", + "no-invalid-this": "warn", + "no-param-reassign": ["error", { "props": false }], + "object-curly-spacing": ["error", "always"], + "quotes": ["error", "double", { "allowTemplateLiterals": true }], + "require-jsdoc": "off", + "valid-jsdoc": "off", + "space-before-function-paren": [ + "error", + { "anonymous": "always", "named": "never", "asyncArrow": "always" } + ], + "@typescript-eslint/explicit-member-accessibility": "off", + "@typescript-eslint/explicit-function-return-type": [ + "error", + { "allowExpressions": true } + ], + "@typescript-eslint/no-parameter-properties": "off", + "@typescript-eslint/indent": [ + "error", + 4, + { + "ignoredNodes": [ + "FunctionExpression > .params[decorators.length > 0]", + "FunctionExpression > .params > :matches(Decorator, :not(:first-child))", + "ClassBody.body > PropertyDefinition[decorators.length > 0] > .key", + "TSTypeParameterInstantiation", + "PropertyDefinition" + ] + } + ], + "@typescript-eslint/no-unused-vars": "warn", + "no-unused-vars": "warn", + }, + },{ + ignores: [ + "app/assets/config/manifest.js", + "app/assets/javascripts/i18n/translations.js", + "app/assets/javascripts/types/index.d.ts", + "app/assets/javascripts/inputServiceWorker.js", + ] + }, { + files: ['test/**'], + ...jest_eslint.configs['flat/recommended'], + } +); diff --git a/package.json b/package.json index 32a2c39088..642a0bbac4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "dodona", "private": true, "scripts": { - "lint": "eslint --ext '.js' --ext '.ts' app/javascript app/assets/javascripts", + "lint": "eslint app/javascript app/assets/javascripts test/javascript", "lint:css": "stylelint app/assets/stylesheets", "test": "jest", "build:css": "./bin/build-css", @@ -61,6 +61,8 @@ "webpack-cli": "^5.1.4" }, "devDependencies": { + "@eslint/eslintrc": "^3.0.2", + "@eslint/js": "^9.0.0", "@open-wc/testing-helpers": "^3.0.1", "@testing-library/dom": "^9.3.4", "@testing-library/user-event": "^14.5.2", @@ -68,18 +70,20 @@ "@typescript-eslint/parser": "^5.62.0", "@webcomponents/scoped-custom-element-registry": "^0.0.9", "babel-plugin-istanbul": "^7.0.0", - "eslint": "^8.57.0", + "eslint": "^9.0.0", "eslint-config-google": "^0.14.0", - "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jest": "^28.2.0", "eslint-plugin-lit": "^1.11.0", "eslint-plugin-no-jquery": "^2.7.0", "eslint-plugin-wc": "^2.0.4", + "globals": "^15.0.0", "jest": "^26.6.3", "jest-junit": "^16.0.0", "nyc": "^15.1.0", "stylelint": "^15.11.0", "stylelint-config-standard": "^34.0.0", "stylelint-config-standard-scss": "^11.1.0", + "typescript-eslint": "^7.6.0", "ts-jest": "^26.5.6", "webpack-bundle-analyzer": "^4.10.2" } diff --git a/test/javascript/components/search/filter_tabs.test.ts b/test/javascript/components/search/filter_tabs.test.ts index 76be6bf39a..80e3b1f74e 100644 --- a/test/javascript/components/search/filter_tabs.test.ts +++ b/test/javascript/components/search/filter_tabs.test.ts @@ -1,15 +1,13 @@ import "components/search/filter_tabs"; -import { FilterTabs } from "components/search/filter_tabs"; import { fixture, nextFrame } from "@open-wc/testing-helpers"; import userEvent from "@testing-library/user-event"; import { screen } from "@testing-library/dom"; import { searchQueryState } from "state/SearchQuery"; describe("FilterTabs", () => { - let filterTabs: FilterTabs; beforeEach(async () => { searchQueryState.queryParams.clear(); - filterTabs = await fixture(``); }); diff --git a/test/javascript/components/search/search_actions.test.ts b/test/javascript/components/search/search_actions.test.ts index b2a4e9898c..a49d48cca4 100644 --- a/test/javascript/components/search/search_actions.test.ts +++ b/test/javascript/components/search/search_actions.test.ts @@ -1,5 +1,5 @@ import "components/search/search_actions"; -import { SearchAction, SearchActions } from "components/search/search_actions"; +import { SearchAction } from "components/search/search_actions"; import { fixture, nextFrame } from "@open-wc/testing-helpers"; import userEvent from "@testing-library/user-event"; import { screen } from "@testing-library/dom"; @@ -8,7 +8,6 @@ import * as util from "utilities"; import { searchQueryState } from "state/SearchQuery"; describe("SearchActions", () => { - let searchActions: SearchActions; beforeEach(async () => { searchQueryState.queryParams.clear(); searchQueryState.arrayQueryParams.clear(); @@ -19,7 +18,7 @@ describe("SearchActions", () => { { icon: "play", text: "bars", filterValue: "bar", url: "https://test.dodona.be" }, ]; await fixture(`
`); - searchActions = await fixture(html` + await fixture(html` `); @@ -32,7 +31,6 @@ describe("SearchActions", () => { }); test("clicking a js action should execute the js", async () => { - // eslint-disable-next-line @typescript-eslint/no-empty-function jest.spyOn(window, "alert").mockImplementation(() => {}); await userEvent.click(screen.queryByText("js-test")); expect(window.alert).toHaveBeenCalledWith("test"); @@ -62,7 +60,7 @@ describe("SearchActions", () => { jest.spyOn(util, "fetch").mockImplementation(() => Promise.resolve({ json: () => Promise.resolve({ js: "window.alert('test')" }), } as Response)); - // eslint-disable-next-line @typescript-eslint/no-empty-function + jest.spyOn(window, "alert").mockImplementation(() => {}); await userEvent.click(screen.queryByText("bar")); expect(util.fetch).toHaveBeenCalledWith("https://test.dodona.be/destroy", { diff --git a/test/javascript/components/search/search_options.ts b/test/javascript/components/search/search_options.ts index 197339a646..1aaa4c3b5a 100644 --- a/test/javascript/components/search/search_options.ts +++ b/test/javascript/components/search/search_options.ts @@ -1,5 +1,4 @@ import "components/search/search_options"; -import { SearchOptions } from "components/search/search_option"; import { fixture, nextFrame } from "@open-wc/testing-helpers"; import userEvent from "@testing-library/user-event"; import { screen } from "@testing-library/dom"; @@ -8,7 +7,6 @@ import { searchQueryState } from "state/SearchQuery"; import { Option } from "components/search/search_option"; describe("SearchOptions", () => { - let searchOptions: SearchOptions; beforeEach(async () => { searchQueryState.queryParams.clear(); searchQueryState.arrayQueryParams.clear(); @@ -17,7 +15,7 @@ describe("SearchOptions", () => { { param: "bar", label: "fool" }, ]; await fixture(`
`); - searchOptions = await fixture(html` + await fixture(html` `); }); diff --git a/test/javascript/components/search/standalone-dropdown-filter.test.ts b/test/javascript/components/search/standalone-dropdown-filter.test.ts index f60b4b3b16..181f02d932 100644 --- a/test/javascript/components/search/standalone-dropdown-filter.test.ts +++ b/test/javascript/components/search/standalone-dropdown-filter.test.ts @@ -1,5 +1,4 @@ import "components/search/standalone-dropdown-filter"; -import { StandaloneDropdownFilter } from "components/search/standalone-dropdown-filter"; import { fixture } from "@open-wc/testing-helpers"; import userEvent from "@testing-library/user-event"; import { getByText, queryByText, screen } from "@testing-library/dom"; @@ -8,12 +7,11 @@ import { searchQueryState } from "state/SearchQuery"; describe("DropdownFilter", () => { - let standaloneDropdownFilter: StandaloneDropdownFilter; let dropdownMenu: HTMLElement; let dropdownButton: HTMLElement; beforeEach(async () => { searchQueryState.queryParams.clear(); - standaloneDropdownFilter = await fixture(html` + await fixture(html` diff --git a/test/javascript/inactive_timeout.test.ts b/test/javascript/inactive_timeout.test.ts index cfac74915c..20cc470084 100644 --- a/test/javascript/inactive_timeout.test.ts +++ b/test/javascript/inactive_timeout.test.ts @@ -35,13 +35,13 @@ test("does not schedule before start", () => { const tracked = document.getElementById("tracked"); const timeout = new InactiveTimeout(tracked, 2000, callback); jest.advanceTimersByTime(3000); - expect(callback).not.toBeCalled(); + expect(callback).not.toHaveBeenCalled(); timeout.start(); jest.advanceTimersByTime(2000); - expect(callback).toBeCalledTimes(1); + expect(callback).toHaveBeenCalledTimes(1); timeout.end(); jest.advanceTimersByTime(2000); - expect(callback).toBeCalledTimes(1); + expect(callback).toHaveBeenCalledTimes(1); }); test("callback is called", () => { @@ -50,9 +50,9 @@ test("callback is called", () => { const time = new InactiveTimeout(tracked, 2000, callback); time.start(); jest.advanceTimersByTime(1000); - expect(callback).not.toBeCalled(); + expect(callback).not.toHaveBeenCalled(); jest.advanceTimersByTime(2000); - expect(callback).toBeCalled(); + expect(callback).toHaveBeenCalled(); }); test("scrolling prevents callback", () => { @@ -61,12 +61,12 @@ test("scrolling prevents callback", () => { const time = new InactiveTimeout(tracked, 2000, callback); time.start(); jest.advanceTimersByTime(1000); - expect(callback).not.toBeCalled(); + expect(callback).not.toHaveBeenCalled(); document.dispatchEvent(new window.Event("scroll")); jest.advanceTimersByTime(1500); - expect(callback).not.toBeCalled(); + expect(callback).not.toHaveBeenCalled(); jest.advanceTimersByTime(1000); - expect(callback).toBeCalled(); + expect(callback).toHaveBeenCalled(); }); describe("backoff works", () => { diff --git a/test/javascript/setup-jest.ts b/test/javascript/setup-jest.ts index 65752c637e..5c81794633 100644 --- a/test/javascript/setup-jest.ts +++ b/test/javascript/setup-jest.ts @@ -1,6 +1,2 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -declare let global: any; - import { i18n } from "i18n/i18n"; jest.spyOn(i18n, "t").mockImplementation((key: string) => key); diff --git a/test/javascript/utilities.test.js b/test/javascript/utilities.test.js index 5f73cbae4a..33cba86807 100644 --- a/test/javascript/utilities.test.js +++ b/test/javascript/utilities.test.js @@ -12,7 +12,7 @@ describe("Url functions", () => { const oneParameterURL = "https://example.com/test_functions?param1=paramVal1"; const twoParameterURL = "https://example.com/test_functions?param1=paramVal1¶m2=paramVal2"; // "[]" is converted to "%5B%5D" in a URL - // eslint-disable-next-line max-len + const multipleValueUrl = "https://example.com/test_functions?param%5B%5D=paramVal1¶m%5B%5D=paramVal2¶m%5B%5D=paramVal3"; test("return correct parameter value", () => { @@ -53,12 +53,12 @@ describe("Url functions", () => { test("update array URL parameter", () => { let updatedURL = updateArrayURLParameter(relativePath, "param", ["paramVal1", "paramVal1", "paramVal2"]); - // eslint-disable-next-line max-len + expect(updatedURL).toEqual(`${window.location.origin}${relativePath}?param%5B%5D=paramVal1¶m%5B%5D=paramVal2`); updatedURL = updateArrayURLParameter(noParameterURL, "param", ["paramVal1", "paramVal1", "paramVal2", "paramVal3"]); - // eslint-disable-next-line max-len + expect(updatedURL).toEqual(`${noParameterURL}?param%5B%5D=paramVal1¶m%5B%5D=paramVal2¶m%5B%5D=paramVal3`); updatedURL = updateArrayURLParameter(oneParameterURL, "param2", ["paramVal2"]); diff --git a/yarn.lock b/yarn.lock index bf0e3ba501..91140c3f04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1393,44 +1393,49 @@ "@jsplumb/browser-ui" "^6.2.10" lit "^3.1.4" -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" +"@eslint-community/regexpp@^4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": version "4.8.1" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== +"@eslint/eslintrc@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.0.2.tgz#36180f8e85bf34d2fe3ccc2261e8e204a411ab4e" + integrity sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg== 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" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@9.0.0", "@eslint/js@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.0.0.tgz#1a9e4b4c96d8c7886e0110ed310a0135144a1691" + integrity sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.12.3": + version "0.12.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.12.3.tgz#a6216d90f81a30bedd1d4b5d799b47241f318072" + integrity sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -1439,10 +1444,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -2443,6 +2448,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/minimist@^1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" @@ -2483,6 +2493,11 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== +"@types/semver@^7.5.0", "@types/semver@^7.5.8": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + "@types/serviceworker@^0.0.89": version "0.0.89" resolved "https://registry.yarnpkg.com/@types/serviceworker/-/serviceworker-0.0.89.tgz#5b15c32d8dc719438dbea7805c715ff8f8a45ca8" @@ -2510,6 +2525,23 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz#1f5df5cda490a0bcb6fbdd3382e19f1241024242" + integrity sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.6.0" + "@typescript-eslint/type-utils" "7.6.0" + "@typescript-eslint/utils" "7.6.0" + "@typescript-eslint/visitor-keys" "7.6.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + semver "^7.6.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/eslint-plugin@^5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" @@ -2526,6 +2558,17 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/parser@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.6.0.tgz#0aca5de3045d68b36e88903d15addaf13d040a95" + integrity sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg== + dependencies: + "@typescript-eslint/scope-manager" "7.6.0" + "@typescript-eslint/types" "7.6.0" + "@typescript-eslint/typescript-estree" "7.6.0" + "@typescript-eslint/visitor-keys" "7.6.0" + debug "^4.3.4" + "@typescript-eslint/parser@^5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" @@ -2544,6 +2587,22 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/scope-manager@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz#1e9972f654210bd7500b31feadb61a233f5b5e9d" + integrity sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w== + dependencies: + "@typescript-eslint/types" "7.6.0" + "@typescript-eslint/visitor-keys" "7.6.0" + "@typescript-eslint/type-utils@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" @@ -2554,11 +2613,31 @@ debug "^4.3.4" tsutils "^3.21.0" +"@typescript-eslint/type-utils@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz#644f75075f379827d25fe0713e252ccd4e4a428c" + integrity sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw== + dependencies: + "@typescript-eslint/typescript-estree" "7.6.0" + "@typescript-eslint/utils" "7.6.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/types@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.6.0.tgz#53dba7c30c87e5f10a731054266dd905f1fbae38" + integrity sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -2572,7 +2651,35 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0": +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/typescript-estree@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz#112a3775563799fd3f011890ac8322f80830ac17" + integrity sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw== + dependencies: + "@typescript-eslint/types" "7.6.0" + "@typescript-eslint/visitor-keys" "7.6.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== @@ -2586,6 +2693,32 @@ eslint-scope "^5.1.1" semver "^7.3.7" +"@typescript-eslint/utils@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.6.0.tgz#e400d782280b6f724c8a1204269d984c79202282" + integrity sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.15" + "@types/semver" "^7.5.8" + "@typescript-eslint/scope-manager" "7.6.0" + "@typescript-eslint/types" "7.6.0" + "@typescript-eslint/typescript-estree" "7.6.0" + semver "^7.6.0" + +"@typescript-eslint/utils@^6.0.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -2594,10 +2727,21 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@typescript-eslint/visitor-keys@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz#d1ce13145844379021e1f9bd102c1d78946f4e76" + integrity sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw== + dependencies: + "@typescript-eslint/types" "7.6.0" + eslint-visitor-keys "^3.4.3" "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": version "1.12.1" @@ -2788,7 +2932,7 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.0.4, acorn@^8.11.3, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -4072,13 +4216,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - dom-accessibility-api@^0.5.9: version "0.5.16" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" @@ -4290,12 +4427,12 @@ eslint-config-google@^0.14.0: resolved "https://registry.yarnpkg.com/eslint-config-google/-/eslint-config-google-0.14.0.tgz#4f5f8759ba6e11b424294a219dbfa18c508bcc1a" integrity sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw== -eslint-plugin-jest@^27.9.0: - version "27.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz#7c98a33605e1d8b8442ace092b60e9919730000b" - integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== +eslint-plugin-jest@^28.2.0: + version "28.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.2.0.tgz#863e2b2bda95eb41981ba9bcf4c44f57dce40a73" + integrity sha512-yRDti/a+f+SMSmNTiT9/M/MzXGkitl8CfzUxnpoQcTyfq8gUrXMriVcWU36W1X6BZSUoyUCJrDAWWUA2N4hE5g== dependencies: - "@typescript-eslint/utils" "^5.10.0" + "@typescript-eslint/utils" "^6.0.0" eslint-plugin-lit@^1.11.0: version "1.11.0" @@ -4327,10 +4464,10 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +eslint-scope@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.1.tgz#a9601e4b81a0b9171657c343fb13111688963cfc" + integrity sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -4340,41 +4477,42 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.57.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + +eslint@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.0.0.tgz#6270548758e390343f78c8afd030566d86927d40" + integrity sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q== 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/eslintrc" "^3.0.2" + "@eslint/js" "9.0.0" + "@humanwhocodes/config-array" "^0.12.3" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" 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" + eslint-scope "^8.0.1" + eslint-visitor-keys "^4.0.0" + espree "^10.0.1" esquery "^1.4.2" 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" @@ -4384,14 +4522,14 @@ eslint@^8.57.0: strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== +espree@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.0.1.tgz#600e60404157412751ba4a6f3a2ee1a42433139f" + integrity sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww== dependencies: - acorn "^8.9.0" + acorn "^8.11.3" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" + eslint-visitor-keys "^4.0.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -4569,13 +4707,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - file-entry-cache@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-7.0.1.tgz#c71b3509badb040f362255a53e21f15a4e74fc0f" @@ -4583,6 +4714,13 @@ file-entry-cache@^7.0.0: dependencies: flat-cache "^3.1.1" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + file-loader@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -4649,15 +4787,6 @@ find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" -flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== - dependencies: - flatted "^3.2.7" - keyv "^4.5.3" - rimraf "^3.0.2" - flat-cache@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" @@ -4667,16 +4796,19 @@ flat-cache@^3.1.1: keyv "^4.5.3" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flatpickr@^4.6.13: version "4.6.13" resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.13.tgz#8a029548187fd6e0d670908471e43abe9ad18d94" integrity sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw== -flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - flatted@^3.2.9: version "3.2.9" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" @@ -4882,12 +5014,15 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== - dependencies: - type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.0.0.tgz#9c6cd4e54327ceaab563b4c17ee5e9d181c03fd2" + integrity sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw== globalthis@^1.0.3: version "1.0.3" @@ -5123,6 +5258,11 @@ ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +ignore@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + immutable@^4.0.0: version "4.3.4" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" @@ -6150,7 +6290,7 @@ json5@2.x, json5@^2.1.2, json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -keyv@^4.5.3: +keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -6485,6 +6625,13 @@ min-indent@^1.0.1: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -6499,6 +6646,13 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -7524,6 +7678,13 @@ semver@^7.5.4: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +semver@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + serialize-javascript@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" @@ -8161,6 +8322,11 @@ trim-newlines@^4.0.2: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-4.1.1.tgz#28c88deb50ed10c7ba6dc2474421904a00139125" integrity sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ== +ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + ts-jest@^26.5.6: version "26.5.6" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.6.tgz#c32e0746425274e1dfe333f43cd3c800e014ec35" @@ -8212,11 +8378,6 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -8283,6 +8444,15 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typescript-eslint@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.6.0.tgz#12dd1de864bedc39df8180ea44a585571586291b" + integrity sha512-LY6vH6F1l5jpGqRtU+uK4+mOecIb4Cd4kaz1hAiJrgnNiHUA8wiw8BkJyYS+MRLM69F1QuSKwtGlQqnGl1Rc6w== + dependencies: + "@typescript-eslint/eslint-plugin" "7.6.0" + "@typescript-eslint/parser" "7.6.0" + "@typescript-eslint/utils" "7.6.0" + typescript@^5.5.3: version "5.5.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa"