diff --git a/.eslintignore b/.eslintignore index 3f1becbb7..f1a1b31d3 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,3 +4,4 @@ docker backend/scripts backend/private **/vitest.config.ts +node_modules \ No newline at end of file diff --git a/backend/src/dal/leaderboards.ts b/backend/src/dal/leaderboards.ts index 5711c735d..42594eb1b 100644 --- a/backend/src/dal/leaderboards.ts +++ b/backend/src/dal/leaderboards.ts @@ -226,7 +226,7 @@ export async function update( //update speedStats const boundaries = [...Array(32).keys()].map((it) => it * 10); const statsKey = `${language}_${mode}_${mode2}`; - const src = await db.collection(lbCollectionName); + const src = db.collection(lbCollectionName); const histogram = src.aggregate( [ { diff --git a/backend/src/dal/new-quotes.ts b/backend/src/dal/new-quotes.ts index c562e47bc..23ce4831d 100644 --- a/backend/src/dal/new-quotes.ts +++ b/backend/src/dal/new-quotes.ts @@ -187,6 +187,7 @@ export async function approve( if (compareTwoStrings(old.text, quote.text) > 0.8) { throw new MonkeyError(409, "Duplicate quote"); } + return true; }); let maxid = 0; quoteObject.quotes.map(function (q) { diff --git a/frontend/src/ts/controllers/ad-controller.ts b/frontend/src/ts/controllers/ad-controller.ts index cbbab0201..9dd7cd258 100644 --- a/frontend/src/ts/controllers/ad-controller.ts +++ b/frontend/src/ts/controllers/ad-controller.ts @@ -316,7 +316,7 @@ BannerEvent.subscribe(() => { updateVerticalMargin(); }); -$(document).ready(() => { +$(() => { updateBreakpoint(true); updateBreakpoint2(); }); diff --git a/frontend/src/ts/controllers/input-controller.ts b/frontend/src/ts/controllers/input-controller.ts index d308a71d5..6e0b30c96 100644 --- a/frontend/src/ts/controllers/input-controller.ts +++ b/frontend/src/ts/controllers/input-controller.ts @@ -72,10 +72,7 @@ function updateUI(): void { if (Config.keymapMode === "next" && Config.mode !== "zen") { if (!Config.language.startsWith("korean")) { void KeymapEvent.highlight( - TestWords.words - .getCurrent() - .charAt(TestInput.input.current.length) - .toString() + TestWords.words.getCurrent().charAt(TestInput.input.current.length) ); } else { //word [가다] @@ -1194,10 +1191,7 @@ $(document).on("keydown", async (event) => { if ( Config.layout !== "default" && - !( - event.ctrlKey || - (event.altKey && window.navigator.platform.search("Linux") > -1) - ) + !(event.ctrlKey || (event.altKey && Misc.isLinux())) ) { const char: string | null = await LayoutEmulator.getCharFromEvent(event); if (char !== null) { @@ -1217,6 +1211,8 @@ $("#wordsInput").on("keydown", (event) => { "spacing debug keydown STOPPED - repeat", event.key, event.code, + //ignore for logging + // eslint-disable-next-line @typescript-eslint/no-deprecated event.which ); return; @@ -1236,7 +1232,7 @@ $("#wordsInput").on("keydown", (event) => { const now = performance.now(); setTimeout(() => { const eventCode = - event.code === "" || event.which === 231 ? "NoCode" : event.code; + event.code === "" || event.key === "Unidentified" ? "NoCode" : event.code; TestInput.recordKeydownTime(now, eventCode); }, 0); }); @@ -1247,6 +1243,8 @@ $("#wordsInput").on("keyup", (event) => { "spacing debug keydown STOPPED - repeat", event.key, event.code, + //ignore for logging + // eslint-disable-next-line @typescript-eslint/no-deprecated event.which ); return; @@ -1265,7 +1263,7 @@ $("#wordsInput").on("keyup", (event) => { const now = performance.now(); setTimeout(() => { const eventCode = - event.code === "" || event.which === 231 ? "NoCode" : event.code; + event.code === "" || event.key === "Unidentified" ? "NoCode" : event.code; TestInput.recordKeyupTime(now, eventCode); }, 0); }); diff --git a/frontend/src/ts/controllers/route-controller.ts b/frontend/src/ts/controllers/route-controller.ts index 3a7f6e7ad..7843eb6ba 100644 --- a/frontend/src/ts/controllers/route-controller.ts +++ b/frontend/src/ts/controllers/route-controller.ts @@ -171,7 +171,8 @@ export async function navigate( Notifications.add("No quit funbox is active. Please finish the test.", 0, { important: true, }); - event?.preventDefault(); + //todo: figure out if this was ever used + // event?.preventDefault(); return; } diff --git a/frontend/src/ts/elements/account/result-filters.ts b/frontend/src/ts/elements/account/result-filters.ts index 0eb625d0c..6e1b43cae 100644 --- a/frontend/src/ts/elements/account/result-filters.ts +++ b/frontend/src/ts/elements/account/result-filters.ts @@ -697,7 +697,7 @@ function selectBeforeChangeFn( group: ResultFiltersGroup, selectedOptions: Option[], oldSelectedOptions: Option[] -): void | boolean { +): boolean { const includesAllNow = selectedOptions.some( (option) => option.value === "all" ); @@ -819,7 +819,7 @@ export async function appendButtons( closeOnSelect: false, }, events: { - beforeChange: (selectedOptions, oldSelectedOptions): void | boolean => { + beforeChange: (selectedOptions, oldSelectedOptions): boolean => { return selectBeforeChangeFn( "language", selectedOptions, @@ -851,7 +851,7 @@ export async function appendButtons( closeOnSelect: false, }, events: { - beforeChange: (selectedOptions, oldSelectedOptions): void | boolean => { + beforeChange: (selectedOptions, oldSelectedOptions): boolean => { return selectBeforeChangeFn( "funbox", selectedOptions, @@ -889,10 +889,7 @@ export async function appendButtons( closeOnSelect: false, }, events: { - beforeChange: ( - selectedOptions, - oldSelectedOptions - ): void | boolean => { + beforeChange: (selectedOptions, oldSelectedOptions): boolean => { return selectBeforeChangeFn( "tags", selectedOptions, diff --git a/frontend/src/ts/elements/keymap.ts b/frontend/src/ts/elements/keymap.ts index 41c48d2f9..75c24099d 100644 --- a/frontend/src/ts/elements/keymap.ts +++ b/frontend/src/ts/elements/keymap.ts @@ -477,7 +477,7 @@ export async function refresh(): Promise { } } -const isMacLike = /Mac|iPod|iPhone|iPad/.test(navigator.platform); +const isMacLike = Misc.isMacLike(); const symbolsPattern = /^[^\p{L}\p{N}]{1}$/u; type KeymapLegendStates = [letters: 0 | 1 | 2 | 3, symbols: 0 | 1 | 2 | 3]; let keymapLegendStates: KeymapLegendStates = [0, 0]; diff --git a/frontend/src/ts/firebase.ts b/frontend/src/ts/firebase.ts index 54207263a..91b1649b3 100644 --- a/frontend/src/ts/firebase.ts +++ b/frontend/src/ts/firebase.ts @@ -172,7 +172,7 @@ export async function createUserWithEmailAndPassword( } export async function getIdToken(): Promise { - const user = await getAuthenticatedUser(); + const user = getAuthenticatedUser(); if (user === null) return null; return firebaseGetIdToken(user); } diff --git a/frontend/src/ts/modals/custom-text.ts b/frontend/src/ts/modals/custom-text.ts index 976dd67b4..f0fe3408d 100644 --- a/frontend/src/ts/modals/custom-text.ts +++ b/frontend/src/ts/modals/custom-text.ts @@ -555,21 +555,21 @@ async function setup(modalEl: HTMLElement): Promise { }); modalEl.querySelector(".button.wordfilter")?.addEventListener("click", () => { void WordFilterPopup.show({ - modalChain: modal as AnimatedModal, + modalChain: modal as AnimatedModal, }); }); modalEl .querySelector(".button.showSavedTexts") ?.addEventListener("click", () => { void SavedTextsPopup.show({ - modalChain: modal as AnimatedModal, + modalChain: modal as AnimatedModal, }); }); modalEl .querySelector(".button.saveCustomText") ?.addEventListener("click", () => { void SaveCustomTextPopup.show({ - modalChain: modal as AnimatedModal, + modalChain: modal as AnimatedModal, modalChainData: { text: cleanUpText() }, }); }); diff --git a/frontend/src/ts/modals/edit-profile.ts b/frontend/src/ts/modals/edit-profile.ts index 3b0c1ae02..d4e9a1395 100644 --- a/frontend/src/ts/modals/edit-profile.ts +++ b/frontend/src/ts/modals/edit-profile.ts @@ -199,10 +199,7 @@ async function updateProfile(): Promise { hide(); } -function addValidation( - element: JQuery, - schema: Zod.Schema -): InputIndicator { +function addValidation(element: JQuery, schema: Zod.Schema): InputIndicator { const indicator = new InputIndicator(element, { valid: { icon: "fa-check", diff --git a/frontend/src/ts/modals/saved-texts.ts b/frontend/src/ts/modals/saved-texts.ts index 4fb77bbc6..e2bd4de6a 100644 --- a/frontend/src/ts/modals/saved-texts.ts +++ b/frontend/src/ts/modals/saved-texts.ts @@ -55,7 +55,7 @@ async function fill(): Promise { return; } showPopup("deleteCustomText", [name], { - modalChain: modal as AnimatedModal, + modalChain: modal as AnimatedModal, }); }); @@ -70,7 +70,7 @@ async function fill(): Promise { return; } showPopup("deleteCustomTextLong", [name], { - modalChain: modal as AnimatedModal, + modalChain: modal as AnimatedModal, }); } ); @@ -86,7 +86,7 @@ async function fill(): Promise { return; } showPopup("resetProgressCustomTextLong", [name], { - modalChain: modal as AnimatedModal, + modalChain: modal as AnimatedModal, }); } ); diff --git a/frontend/src/ts/pages/leaderboards.ts b/frontend/src/ts/pages/leaderboards.ts index bdf511ae9..6409a14f4 100644 --- a/frontend/src/ts/pages/leaderboards.ts +++ b/frontend/src/ts/pages/leaderboards.ts @@ -1022,8 +1022,8 @@ function convertRuleOption(rule: string): string[] { } async function updateValidDailyLeaderboards(): Promise { - const dailyRulesConfig = await ServerConfiguration.get()?.dailyLeaderboards - .validModeRules; + const dailyRulesConfig = + ServerConfiguration.get()?.dailyLeaderboards.validModeRules; if (dailyRulesConfig === undefined) { throw new Error( diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 8b92d328d..aa0c6760d 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -1,7 +1,7 @@ import Config from "../config"; +import * as Misc from "../utils/misc"; const el = document.querySelector("#capsWarning") as HTMLElement; -const isMacOs = navigator.platform.startsWith("Mac"); export let capsState = false; @@ -39,5 +39,5 @@ function update(event: JQuery.KeyDownEvent | JQuery.KeyUpEvent): void { $(document).on("keyup", update); $(document).on("keydown", (event) => { - if (isMacOs) update(event); + if (Misc.isMac()) update(event); }); diff --git a/frontend/src/ts/test/funbox/funbox-functions.ts b/frontend/src/ts/test/funbox/funbox-functions.ts index 8e93f7c1f..b834ced5b 100644 --- a/frontend/src/ts/test/funbox/funbox-functions.ts +++ b/frontend/src/ts/test/funbox/funbox-functions.ts @@ -386,10 +386,7 @@ const list: Partial> = { } setTimeout(() => { void KeymapEvent.highlight( - TestWords.words - .getCurrent() - .charAt(TestInput.input.current.length) - .toString() + TestWords.words.getCurrent().charAt(TestInput.input.current.length) ); }, 1); } @@ -407,7 +404,6 @@ const list: Partial> = { TestInput.input.current.length, TestInput.input.current.length + 1 ) - .toString() ); }, 1); }, diff --git a/frontend/src/ts/test/lazy-mode.ts b/frontend/src/ts/test/lazy-mode.ts index a957b5920..e227dd3fa 100644 --- a/frontend/src/ts/test/lazy-mode.ts +++ b/frontend/src/ts/test/lazy-mode.ts @@ -43,6 +43,8 @@ const accents: Accents = [ ]; const accentsMap = new Map( + // ignoring for now but this might need a different approach + // eslint-disable-next-line @typescript-eslint/no-misused-spread accents.flatMap((rule) => [...rule[0]].map((accent) => [accent, rule[1]])) ); @@ -72,6 +74,8 @@ export function replaceAccents( ): string { if (!word) return word; const uppercased = word.toUpperCase(); + // ignoring for now but this might need a different approach + // eslint-disable-next-line @typescript-eslint/no-misused-spread const cases = [...word].map((it, i) => it === uppercased[i]); const newWordArray: string[] = []; diff --git a/frontend/src/ts/test/test-logic.ts b/frontend/src/ts/test/test-logic.ts index e08a4c79d..9c05a08bd 100644 --- a/frontend/src/ts/test/test-logic.ts +++ b/frontend/src/ts/test/test-logic.ts @@ -169,17 +169,17 @@ export function restart(options = {} as RestartOptions): void { Notifications.add("No quit funbox is active. Please finish the test.", 0, { important: true, }); - event?.preventDefault(); + options.event?.preventDefault(); return; } if (TestUI.testRestarting || TestUI.resultCalculating) { - event?.preventDefault(); + options.event?.preventDefault(); return; } if (ActivePage.get() === "test") { if (!ManualRestart.get()) { - if (Config.mode !== "zen") event?.preventDefault(); + if (Config.mode !== "zen") options.event?.preventDefault(); if ( !canQuickRestart( Config.mode, @@ -354,7 +354,7 @@ export function restart(options = {} as RestartOptions): void { TestState.setTestInitSuccess(true); const initResult = await init(); - if (initResult === null) { + if (!initResult) { TestUI.setTestRestarting(false); return; } @@ -405,7 +405,8 @@ export function restart(options = {} as RestartOptions): void { let lastInitError: Error | null = null; let rememberLazyMode: boolean; let testReinitCount = 0; -export async function init(): Promise { + +export async function init(): Promise { console.debug("Initializing test"); testReinitCount++; if (testReinitCount > 3) { @@ -426,7 +427,7 @@ export async function init(): Promise { // important: true, // } // ); - return null; + return false; } MonkeyPower.reset(); @@ -561,6 +562,8 @@ export async function init(): Promise { if (Config.keymapMode === "next" && Config.mode !== "zen") { void KeymapEvent.highlight( + // ignoring for now but this might need a different approach + // eslint-disable-next-line @typescript-eslint/no-misused-spread Arrays.nthElementFromArray([...TestWords.words.getCurrent()], 0) as string ); } @@ -573,6 +576,7 @@ export async function init(): Promise { "Test initialized with section indexes", generatedSectionIndexes ); + return true; } export function areAllTestWordsGenerated(): boolean { @@ -603,9 +607,12 @@ export async function addWord(): Promise { } let bound = 100; // how many extra words to aim for AFTER the current word - const funboxToPush = getActiveFunboxes() - .find((f) => f.properties?.find((fp) => fp.startsWith("toPush"))) - ?.properties?.find((fp) => fp.startsWith("toPush:")); + + const funboxToPush = + getActiveFunboxes() + .flatMap((fb) => fb.properties ?? []) + .find((prop) => prop.startsWith("toPush:")) ?? ""; + const toPushCount = funboxToPush?.split(":")[1]; if (toPushCount !== undefined) bound = +toPushCount - 1; @@ -1561,6 +1568,8 @@ ConfigEvent.subscribe((eventKey, eventValue, nosave) => { setTimeout(() => { void KeymapEvent.highlight( Arrays.nthElementFromArray( + // ignoring for now but this might need a different approach + // eslint-disable-next-line @typescript-eslint/no-misused-spread [...TestWords.words.getCurrent()], 0 ) as string diff --git a/frontend/src/ts/test/test-ui.ts b/frontend/src/ts/test/test-ui.ts index 1374b552d..194599273 100644 --- a/frontend/src/ts/test/test-ui.ts +++ b/frontend/src/ts/test/test-ui.ts @@ -540,7 +540,7 @@ export async function centerActiveLine(): Promise { return; } - const { resolve, promise } = Misc.promiseWithResolvers(); + const { resolve, promise } = Misc.promiseWithResolvers(); centeringActiveLine = promise; const wordElements = document.querySelectorAll("#words .word"); @@ -1128,7 +1128,7 @@ export async function lineJump( currentTop: number, force = false ): Promise { - const { resolve, promise } = Misc.promiseWithResolvers(); + const { resolve, promise } = Misc.promiseWithResolvers(); //last word of the line if (currentTestLine > 0 || force) { diff --git a/frontend/src/ts/test/test-words.ts b/frontend/src/ts/test/test-words.ts index d57c54d48..4b87130c9 100644 --- a/frontend/src/ts/test/test-words.ts +++ b/frontend/src/ts/test/test-words.ts @@ -14,7 +14,7 @@ class Words { get(i?: undefined, raw?: boolean): string[]; get(i: number, raw?: boolean): string; - get(i?: number | undefined, raw = false): string | string[] | undefined { + get(i?: number, raw = false): string | string[] | undefined { if (i === undefined) { return this.list; } else { diff --git a/frontend/src/ts/test/words-generator.ts b/frontend/src/ts/test/words-generator.ts index b3731697f..e026e17f3 100644 --- a/frontend/src/ts/test/words-generator.ts +++ b/frontend/src/ts/test/words-generator.ts @@ -391,16 +391,11 @@ function applyLazyModeToWord(word: string, language: LanguageObject): string { } export function getWordOrder(): FunboxWordOrder { - const wordOrder = - getActiveFunboxes() - .find((f) => f.properties?.find((fp) => fp.startsWith("wordOrder"))) - ?.properties?.find((fp) => fp.startsWith("wordOrder")) ?? ""; + const wordOrderProperty = getActiveFunboxes() + .flatMap((fb) => fb.properties ?? []) + .find((prop) => prop.startsWith("wordOrder:")); - if (!wordOrder) { - return "normal"; - } else { - return wordOrder.split(":")[1] as FunboxWordOrder; - } + return (wordOrderProperty?.split(":")[1] as FunboxWordOrder) ?? "normal"; } export function getLimit(): number { @@ -418,8 +413,8 @@ export function getLimit(): number { const funboxToPush = getActiveFunboxes() - .find((f) => f.properties?.find((fp) => fp.startsWith("toPush"))) - ?.properties?.find((fp) => fp.startsWith("toPush:")) ?? ""; + .flatMap((fb) => fb.properties ?? []) + .find((prop) => prop.startsWith("toPush:")) ?? ""; if (Config.showAllLines) { if (Config.mode === "custom") { diff --git a/frontend/src/ts/ui.ts b/frontend/src/ts/ui.ts index 696288d63..4d6c70392 100644 --- a/frontend/src/ts/ui.ts +++ b/frontend/src/ts/ui.ts @@ -87,7 +87,8 @@ window.addEventListener("beforeunload", (event) => { } else { if (TestState.isActive) { event.preventDefault(); - // Chrome requires returnValue to be set. + // Included for legacy support, e.g. Chrome/Edge < 119 + // eslint-disable-next-line @typescript-eslint/no-deprecated event.returnValue = ""; } } diff --git a/frontend/src/ts/utils/arrays.ts b/frontend/src/ts/utils/arrays.ts index d196251cc..8a84d8217 100644 --- a/frontend/src/ts/utils/arrays.ts +++ b/frontend/src/ts/utils/arrays.ts @@ -38,12 +38,12 @@ export function smooth( * This function mutates the input array. * @param elements */ -export function shuffle(elements: T[]): void { +export function shuffle(elements: unknown[]): void { for (let i = elements.length - 1; i > 0; --i) { const j = randomIntFromRange(0, i); const temp = elements[j]; - elements[j] = elements[i] as T; - elements[i] = temp as T; + elements[j] = elements[i]; + elements[i] = temp; } } diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index bc077b07e..0404bf33e 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -720,4 +720,27 @@ export function debounceUntilResolved( export function triggerResize(): void { $(window).trigger("resize"); } + +function isPlatform(searchTerm: string | RegExp): boolean { + // eslint-disable-next-line @typescript-eslint/no-deprecated + const platform = navigator.platform; + if (typeof searchTerm === "string") { + return platform.includes(searchTerm); + } else { + return searchTerm.test(platform); + } +} + +export function isLinux(): boolean { + return isPlatform("Linux"); +} + +export function isMac(): boolean { + return isPlatform("Mac"); +} + +export function isMacLike(): boolean { + return isPlatform(/Mac|iPod|iPhone|iPad/); +} + // DO NOT ALTER GLOBAL OBJECTSONSTRUCTOR, IT WILL BREAK RESULT HASHES diff --git a/packages/contracts/src/configuration.ts b/packages/contracts/src/configuration.ts index 7eeb5ad2a..cfb969830 100644 --- a/packages/contracts/src/configuration.ts +++ b/packages/contracts/src/configuration.ts @@ -16,6 +16,8 @@ export type GetConfigurationResponse = z.infer< typeof GetConfigurationResponseSchema >; +// marked as deprecated but zod team might reconsider according to https://github.com/colinhacks/zod/issues/2854#issuecomment-3100623150 +// eslint-disable-next-line @typescript-eslint/no-deprecated export const PartialConfigurationSchema = ConfigurationSchema.deepPartial(); export type PartialConfiguration = z.infer; diff --git a/packages/eslint-config/index.js b/packages/eslint-config/index.js index c5bf3dffb..b20782666 100644 --- a/packages/eslint-config/index.js +++ b/packages/eslint-config/index.js @@ -91,17 +91,45 @@ module.exports = { "plugin:oxlint/recommended", ], rules: { - //strict type checked - "@typescript-eslint/require-await": "off", + //not using + "@typescript-eslint/non-nullable-type-assertion-style": "off", + "import/namespace": "off", + "@typescript-eslint/no-unnecessary-condition": "off", + "@typescript-eslint/switch-exhaustiveness-check": "off", + "@typescript-eslint/no-this-alias": "off", "@typescript-eslint/unbound-method": "off", - "@typescript-eslint/await-thenable": "off", + //unnecessary, might aswell keep template strings in case a string might be added in the future "@typescript-eslint/no-unnecessary-template-expression": "off", "@typescript-eslint/prefer-promise-reject-errors": "off", - "@typescript-eslint/no-unnecessary-type-arguments": "off", - "@typescript-eslint/restrict-template-expressions": "off", - "@typescript-eslint/no-redundant-type-constituents": "off", - "@typescript-eslint/restrict-plus-operands": "off", + //todo: consider some of these? + //936, no options on this one. super strict, it doesnt allow casting to a narrower type + "@typescript-eslint/no-unsafe-type-assertion": "off", + //224 errors, very easy to fix. + // adds unnecessary promise overhead and pushing the function to the microtask queue, creating a delay + // all though performance impact probably minimal + // anything that needs to be absolutely as fast as possible should not be async (if not using await) + "@typescript-eslint/require-await": "off", + //388, when allowing numbers only 27, when also allowing arrays 12 + // could be nice to avoid some weird things showing up in templated strings + "@typescript-eslint/restrict-template-expressions": [ + "off", + { + allowNumber: true, + allowArray: true, + }, + ], + //only 4 but i don't really understand this rule + "@typescript-eslint/no-redundant-type-constituents": "off", + //162, 31 when allowing numbers and strings, kinda related to restrict-template-expressions + "@typescript-eslint/restrict-plus-operands": [ + "off", + { + allowNumberAndString: true, + }, + ], + + //using "@typescript-eslint/no-unsafe-member-access": "error", "@typescript-eslint/no-unsafe-call": "error", "@typescript-eslint/no-unsafe-argument": "error", @@ -111,7 +139,6 @@ module.exports = { "error", { ignoreArrowShorthand: true }, ], - "@typescript-eslint/no-this-alias": "off", "@typescript-eslint/no-misused-promises": [ "error", { @@ -124,10 +151,26 @@ module.exports = { "error", { allowNullableBoolean: true }, ], - "@typescript-eslint/non-nullable-type-assertion-style": "off", - "@typescript-eslint/no-unnecessary-condition": "off", - "@typescript-eslint/no-invalid-void-type": "off", - "import/namespace": "off", + "@typescript-eslint/no-invalid-void-type": "error", + "@typescript-eslint/no-array-delete": "error", + "@typescript-eslint/no-base-to-string": "error", + "@typescript-eslint/no-duplicate-type-constituents": "error", + "@typescript-eslint/no-for-in-array": "error", + "@typescript-eslint/no-implied-eval": "error", + "@typescript-eslint/no-meaningless-void-operator": "error", + "@typescript-eslint/no-mixed-enums": "error", + "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", + "@typescript-eslint/no-unsafe-enum-comparison": "error", + "@typescript-eslint/no-unsafe-return": "error", + "@typescript-eslint/no-unsafe-unary-minus": "error", + "@typescript-eslint/prefer-reduce-type-parameter": "error", + "@typescript-eslint/prefer-return-this-type": "error", + "@typescript-eslint/related-getter-setter-pairs": "error", + "@typescript-eslint/require-array-sort-compare": "error", + "@typescript-eslint/return-await": "error", + "@typescript-eslint/use-unknown-in-catch-callback-variable": "error", + "@typescript-eslint/await-thenable": "error", + "@typescript-eslint/no-unnecessary-type-arguments": "error", //handled by oxlint "@typescript-eslint/no-non-null-assertion": "off", diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 351af90e9..9b58170b2 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -2,7 +2,7 @@ "name": "@monkeytype/eslint-config", "private": true, "devDependencies": { - "@typescript-eslint/eslint-plugin": "8.0.1", + "@typescript-eslint/eslint-plugin": "8.41.0", "@typescript-eslint/parser": "8.2.0", "eslint-config-prettier": "9.1.0", "eslint-import-resolver-typescript": "3.6.1", diff --git a/packages/funbox/src/validation.ts b/packages/funbox/src/validation.ts index 03f624244..f866fd959 100644 --- a/packages/funbox/src/validation.ts +++ b/packages/funbox/src/validation.ts @@ -38,8 +38,9 @@ export function checkCompatibility( f.frontendFunctions?.includes("withWords") ).length <= 1; const oneWordOrderMax = - funboxesToCheck.filter((f) => - f.properties?.find((fp) => fp.startsWith("wordOrder")) + funboxesToCheck.filter( + (f) => + f.properties?.find((fp) => fp.startsWith("wordOrder")) !== undefined ).length <= 1; const layoutUsability = funboxesToCheck.filter((f) => @@ -49,8 +50,11 @@ export function checkCompatibility( f.properties?.find((fp) => fp === "ignoresLayout" || fp === "usesLayout") ).length === 0; const oneNospaceOrToPushMax = - funboxesToCheck.filter((f) => - f.properties?.find((fp) => fp === "nospace" || fp.startsWith("toPush")) + funboxesToCheck.filter( + (f) => + f.properties?.find( + (fp) => fp === "nospace" || fp.startsWith("toPush") + ) !== undefined ).length <= 1; const oneChangesWordsVisibilityMax = funboxesToCheck.filter((f) => @@ -98,7 +102,7 @@ export function checkCompatibility( const oneToPushOrPullSectionMax = funboxesToCheck.filter( (f) => - (f.properties?.find((fp) => fp.startsWith("toPush:")) ?? "") || + f.properties?.find((fp) => fp.startsWith("toPush:")) !== undefined || f.frontendFunctions?.includes("pullSection") ).length <= 1; const onePunctuateWordMax = diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 60504a597..388991d25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -537,8 +537,8 @@ importers: packages/eslint-config: devDependencies: '@typescript-eslint/eslint-plugin': - specifier: 8.0.1 - version: 8.0.1(@typescript-eslint/parser@8.2.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) + specifier: 8.41.0 + version: 8.41.0(@typescript-eslint/parser@8.2.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) '@typescript-eslint/parser': specifier: 8.2.0 version: 8.2.0(eslint@8.57.1)(typescript@5.5.4) @@ -1717,10 +1717,20 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.11.0': resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3159,16 +3169,13 @@ packages: '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - '@typescript-eslint/eslint-plugin@8.0.1': - resolution: {integrity: sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==} + '@typescript-eslint/eslint-plugin@8.41.0': + resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.41.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/parser@8.2.0': resolution: {integrity: sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==} @@ -3180,35 +3187,45 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.0.1': - resolution: {integrity: sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==} + '@typescript-eslint/project-service@8.41.0': + resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@8.2.0': resolution: {integrity: sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.0.1': - resolution: {integrity: sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng==} + '@typescript-eslint/scope-manager@8.41.0': + resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.41.0': + resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.41.0': + resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@7.18.0': resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.0.1': - resolution: {integrity: sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.2.0': resolution: {integrity: sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.41.0': + resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@7.18.0': resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3218,15 +3235,6 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.0.1': - resolution: {integrity: sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.2.0': resolution: {integrity: sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3236,24 +3244,31 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.0.1': - resolution: {integrity: sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==} + '@typescript-eslint/typescript-estree@8.41.0': + resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.41.0': + resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@7.18.0': resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.0.1': - resolution: {integrity: sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.2.0': resolution: {integrity: sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.41.0': + resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -4931,6 +4946,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-watch@8.0.0: resolution: {integrity: sha512-piws/uE4gkZdz1pwkaEFx+kSWvoGnVX8IegFRrE1NUvlXjtU0rg7KhT1QDj/NzhAwbiLEfdRHWz5q738R4zDKA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5059,6 +5078,10 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -5701,6 +5724,14 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + immutable@4.3.7: resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} @@ -6667,6 +6698,10 @@ packages: resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -8176,6 +8211,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -8624,7 +8664,7 @@ packages: superagent@7.1.6: resolution: {integrity: sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==} engines: {node: '>=6.4.0 <13 || >=14'} - deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net superstatic@9.0.3: resolution: {integrity: sha512-e/tmW0bsnQ/33ivK6y3CapJT0Ovy4pk/ohNPGhIAGU2oasoNLRQ1cv6enua09NU9w6Y0H/fBu07cjzuiWvLXxw==} @@ -8858,6 +8898,18 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-deepmerge@6.2.1: resolution: {integrity: sha512-8CYSLazCyj0DJDpPIxOFzJG46r93uh6EynYjuey+bxcLltBeqZL7DMfaE5ZPzZNFlav7wx+2TDa/mBl8gkTYzw==} engines: {node: '>=14.13.1'} @@ -10829,8 +10881,15 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.12.1': {} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -12529,20 +12588,19 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/eslint-plugin@8.0.1(@typescript-eslint/parser@8.2.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.2.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)': dependencies: - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 8.2.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 8.0.1 - '@typescript-eslint/type-utils': 8.0.1(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/utils': 8.0.1(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.0.1 + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/type-utils': 8.41.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.41.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.41.0 eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.4) - optionalDependencies: + ts-api-utils: 2.1.0(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -12560,34 +12618,47 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.0.1': + '@typescript-eslint/project-service@8.41.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 8.0.1 - '@typescript-eslint/visitor-keys': 8.0.1 + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.5.4) + '@typescript-eslint/types': 8.41.0 + debug: 4.4.1 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color '@typescript-eslint/scope-manager@8.2.0': dependencies: '@typescript-eslint/types': 8.2.0 '@typescript-eslint/visitor-keys': 8.2.0 - '@typescript-eslint/type-utils@8.0.1(eslint@8.57.1)(typescript@5.5.4)': + '@typescript-eslint/scope-manager@8.41.0': dependencies: - '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.4) - '@typescript-eslint/utils': 8.0.1(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/visitor-keys': 8.41.0 + + '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.5.4)': + dependencies: + typescript: 5.5.4 + + '@typescript-eslint/type-utils@8.41.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.41.0(eslint@8.57.1)(typescript@5.5.4) debug: 4.4.1 - ts-api-utils: 1.3.0(typescript@5.5.4) - optionalDependencies: + eslint: 8.57.1 + ts-api-utils: 2.1.0(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - - eslint - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.0.1': {} - '@typescript-eslint/types@8.2.0': {} + '@typescript-eslint/types@8.41.0': {} + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 7.18.0 @@ -12597,22 +12668,7 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.0.1(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 8.0.1 - '@typescript-eslint/visitor-keys': 8.0.1 - debug: 4.4.1 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.4.3(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -12633,32 +12689,48 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.0.1(eslint@8.57.1)(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@8.41.0(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.0.1 - '@typescript-eslint/types': 8.0.1 - '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.4) - eslint: 8.57.1 + '@typescript-eslint/project-service': 8.41.0(typescript@5.5.4) + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.5.4) + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/visitor-keys': 8.41.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.41.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.5.4) + eslint: 8.57.1 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - - typescript '@typescript-eslint/visitor-keys@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.0.1': - dependencies: - '@typescript-eslint/types': 8.0.1 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.2.0': dependencies: '@typescript-eslint/types': 8.2.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.41.0': + dependencies: + '@typescript-eslint/types': 8.41.0 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.2.0': {} '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))': @@ -14649,6 +14721,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.1: {} + eslint-watch@8.0.0(eslint@8.57.1): dependencies: chokidar: 3.6.0 @@ -14901,6 +14975,14 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.7 + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} fast-json-stringify@2.7.13: @@ -15544,7 +15626,7 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -15811,6 +15893,10 @@ snapshots: ignore@5.3.1: {} + ignore@5.3.2: {} + + ignore@7.0.5: {} + immutable@4.3.7: {} import-fresh@3.3.0: @@ -16798,6 +16884,11 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mime-db@1.52.0: {} mime-db@1.53.0: {} @@ -18588,6 +18679,8 @@ snapshots: semver@7.6.3: {} + semver@7.7.2: {} + send@0.18.0: dependencies: debug: 2.6.9 @@ -19474,6 +19567,14 @@ snapshots: dependencies: typescript: 5.5.4 + ts-api-utils@1.4.3(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-api-utils@2.1.0(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + ts-deepmerge@6.2.1: {} ts-graphviz@2.1.2: