diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 5d8248473e09..cb5dbed86917 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -27,13 +27,13 @@ }, "experimentalSortImports": { "groups": [ - ["side-effect"], - ["builtin"], - ["external", "external-type"], - ["internal", "internal-type"], - ["parent", "parent-type"], - ["sibling", "sibling-type"], - ["index", "index-type"] + "type-import", + ["value-builtin", "value-external"], + "type-internal", + "value-internal", + ["type-parent", "type-sibling", "type-index"], + ["value-parent", "value-sibling", "value-index"], + "unknown" ] } } diff --git a/backend/.oxlintrc-plugin.json b/backend/.oxlintrc-plugin.json deleted file mode 100644 index e388d426ec0a..000000000000 --- a/backend/.oxlintrc-plugin.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "ignorePatterns": ["node_modules", "__migration__", "dist", ".turbo"], - "extends": ["../packages/oxlint-config/plugin.jsonc"] -} diff --git a/backend/.oxlintrc.json b/backend/.oxlintrc.json index 10e1703b16a0..fb6e2feff187 100644 --- a/backend/.oxlintrc.json +++ b/backend/.oxlintrc.json @@ -1,7 +1,8 @@ { "ignorePatterns": ["node_modules", "__migration__", "dist", ".turbo"], "extends": [ - "../packages/oxlint-config/index.jsonc" + "../packages/oxlint-config/index.jsonc", + "../packages/oxlint-config/plugin.jsonc" // "@monkeytype/oxlint-config" ], "overrides": [ diff --git a/backend/__tests__/__integration__/dal/leaderboards.isolated.spec.ts b/backend/__tests__/__integration__/dal/leaderboards.isolated.spec.ts index 09c8b1852f81..9baeb166033f 100644 --- a/backend/__tests__/__integration__/dal/leaderboards.isolated.spec.ts +++ b/backend/__tests__/__integration__/dal/leaderboards.isolated.spec.ts @@ -123,7 +123,7 @@ describe("LeaderboardsDal", () => { //GIVEN const stats = pb(100, 90, 2); //@ts-ignore - stats["consistency"] = undefined; + stats.consistency = undefined; await createUser(lbBests(stats)); diff --git a/backend/__tests__/utils/pb.spec.ts b/backend/__tests__/utils/pb.spec.ts index 762c922ea9c4..7db56bf7fb35 100644 --- a/backend/__tests__/utils/pb.spec.ts +++ b/backend/__tests__/utils/pb.spec.ts @@ -69,7 +69,7 @@ describe("Pb Utils", () => { ); expect(run.isPb).toBe(true); - expect(run.personalBests?.["time"]?.["15"]?.[0]).not.toBe(undefined); + expect(run.personalBests.time?.["15"]?.[0]).not.toBe(undefined); expect(run.lbPersonalBests).not.toBe({}); }); it("should not override default pb when saving numbers test", () => { @@ -113,7 +113,7 @@ describe("Pb Utils", () => { expect(run.isPb).toBe(true); - expect(run.personalBests?.["time"]?.["15"]).toEqual( + expect(run.personalBests.time?.["15"]).toEqual( expect.arrayContaining([ expect.objectContaining({ numbers: false, wpm: 100 }), expect.objectContaining({ numbers: true, wpm: 110 }), diff --git a/backend/package.json b/backend/package.json index 8f6fe12b8753..497a2a860794 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,7 +4,7 @@ "private": true, "license": "GPL-3.0", "scripts": { - "lint": "oxlint . --type-aware --type-check && oxlint -c .oxlintrc-plugin.json", + "lint": "oxlint . --type-aware --type-check", "lint-fast": "oxlint .", "build": "npm run gen-docs && tsc --build", "watch": "tsc --build --watch", @@ -80,8 +80,8 @@ "@vitest/coverage-v8": "4.0.15", "concurrently": "8.2.2", "openapi3-ts": "2.0.2", - "oxlint": "1.47.0", - "oxlint-tsgolint": "0.12.2", + "oxlint": "1.50.0", + "oxlint-tsgolint": "0.14.2", "readline-sync": "1.4.10", "supertest": "7.1.4", "testcontainers": "11.11.0", diff --git a/backend/src/api/controllers/result.ts b/backend/src/api/controllers/result.ts index 4e7cacdaaf2b..996e1746b69b 100644 --- a/backend/src/api/controllers/result.ts +++ b/backend/src/api/controllers/result.ts @@ -726,7 +726,7 @@ async function calculateXp( } else if (correctedEverything) { // corrected everything bonus modifier += 0.25; - breakdown["corrected"] = Math.round(baseXp * 0.25); + breakdown.corrected = Math.round(baseXp * 0.25); } if (mode === "quote") { @@ -779,9 +779,9 @@ async function calculateXp( let incompleteXp = 0; if (incompleteTests !== undefined && incompleteTests.length > 0) { incompleteTests.forEach((it: { acc: number; seconds: number }) => { - let modifier = (it.acc - 50) / 50; - if (modifier < 0) modifier = 0; - incompleteXp += Math.round(it.seconds * modifier); + let mod = (it.acc - 50) / 50; + if (mod < 0) mod = 0; + incompleteXp += Math.round(it.seconds * mod); }); breakdown.incomplete = incompleteXp; } else if (incompleteTestSeconds && incompleteTestSeconds > 0) { diff --git a/backend/src/api/routes/index.ts b/backend/src/api/routes/index.ts index 61a3ff2f5b98..d8f9e69262fa 100644 --- a/backend/src/api/routes/index.ts +++ b/backend/src/api/routes/index.ts @@ -188,8 +188,8 @@ function applyApiRoutes(app: Application): void { ); }); - for (const [route, router] of Object.entries(API_ROUTE_MAP)) { + for (const [route, mapRouter] of Object.entries(API_ROUTE_MAP)) { const apiRoute = `${BASE_ROUTE}${route}`; - app.use(apiRoute, router); + app.use(apiRoute, mapRouter); } } diff --git a/backend/src/init/configuration.ts b/backend/src/init/configuration.ts index 63e6eab0f976..3a74361025f3 100644 --- a/backend/src/init/configuration.ts +++ b/backend/src/init/configuration.ts @@ -104,13 +104,15 @@ export async function getLiveConfiguration(): Promise { return configuration; } -async function pushConfiguration(configuration: Configuration): Promise { +async function pushConfiguration( + configurationToPush: Configuration, +): Promise { if (serverConfigurationUpdated) { return; } try { - await db.collection("configuration").replaceOne({}, configuration); + await db.collection("configuration").replaceOne({}, configurationToPush); serverConfigurationUpdated = true; } catch (error) { const errorMessage = getErrorMessage(error) ?? "Unknown error"; diff --git a/backend/src/middlewares/auth.ts b/backend/src/middlewares/auth.ts index d90003c43748..a7deffd2c991 100644 --- a/backend/src/middlewares/auth.ts +++ b/backend/src/middlewares/auth.ts @@ -51,8 +51,7 @@ export function authenticateTsRestRequest< ): Promise => { const options = { ...DEFAULT_OPTIONS, - ...((getMetadata(req)["authenticationOptions"] ?? - {}) as EndpointMetadata), + ...((getMetadata(req).authenticationOptions ?? {}) as EndpointMetadata), }; const startTime = performance.now(); diff --git a/backend/src/middlewares/rate-limit.ts b/backend/src/middlewares/rate-limit.ts index 34a8e3964d8b..da5a5a8fa729 100644 --- a/backend/src/middlewares/rate-limit.ts +++ b/backend/src/middlewares/rate-limit.ts @@ -102,21 +102,23 @@ export function rateLimitRequest< res: Response, next: NextFunction, ): Promise => { - const rateLimit = getMetadata(req).rateLimit; - if (rateLimit === undefined) { + const metadataRateLimit = getMetadata(req).rateLimit; + if (metadataRateLimit === undefined) { next(); return; } - const hasApeKeyLimiterId = typeof rateLimit === "object"; + const hasApeKeyLimiterId = typeof metadataRateLimit === "object"; let rateLimiterId: RateLimiterId; if (req.ctx.decodedToken.type === "ApeKey") { rateLimiterId = hasApeKeyLimiterId - ? rateLimit.apeKey + ? metadataRateLimit.apeKey : "defaultApeRateLimit"; } else { - rateLimiterId = hasApeKeyLimiterId ? rateLimit.normal : rateLimit; + rateLimiterId = hasApeKeyLimiterId + ? metadataRateLimit.normal + : metadataRateLimit; } const rateLimiter = requestLimiters[rateLimiterId]; diff --git a/backend/src/workers/later-worker.ts b/backend/src/workers/later-worker.ts index d1a039910f61..3467a0fa1bd8 100644 --- a/backend/src/workers/later-worker.ts +++ b/backend/src/workers/later-worker.ts @@ -135,6 +135,8 @@ async function handleWeeklyXpLeaderboardResults( }[] = []; allResults?.entries.forEach((entry) => { + // just in case, gonna ignore this error + // oxlint-disable-next-line typescript/no-useless-default-assignment const { uid, name, rank = maxRankToGet, totalXp, timeTypedSeconds } = entry; const xp = Math.round(totalXp); diff --git a/frontend/.oxlintrc-plugin.json b/frontend/.oxlintrc-plugin.json deleted file mode 100644 index d3762817b51d..000000000000 --- a/frontend/.oxlintrc-plugin.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "ignorePatterns": ["node_modules", "dist", "coverage", ".firebase", ".turbo"], - "extends": ["../packages/oxlint-config/plugin.jsonc"], - "jsPlugins": ["eslint-plugin-compat"], - "rules": { - "compat/compat": "error" - }, - "overrides": [ - { - "jsPlugins": ["eslint-plugin-solid", "@tanstack/eslint-plugin-query"], - "files": ["src/**/*.tsx", "src/**/*.ts"], - "rules": { - "solid/components-return-once": "error", - "solid/event-handlers": "error", - "solid/imports": "error", - "solid/jsx-no-duplicate-props": "error", - "solid/jsx-no-script-url": "error", - "solid/jsx-no-undef": "error", - "solid/no-array-handlers": "error", - "solid/no-destructure": "error", - "solid/no-innerhtml": "error", - "solid/no-react-deps": "error", - "solid/no-react-specific-props": "error", - "solid/no-unknown-namespaces": "error", - "solid/prefer-classlist": "error", - "solid/prefer-for": "error", - "solid/prefer-show": "error", - "solid/reactivity": "error", - "solid/self-closing-comp": [ - "error", - { - "html": "void" - } - ], - "solid/style-prop": "error", - "@tanstack/query/exhaustive-deps": "error", - "@tanstack/query/no-rest-destructuring": "error", - "@tanstack/query/stable-query-client": "error", - "@tanstack/query/no-unstable-deps": "error", - "@tanstack/query/infinite-query-property-order": "error", - "@tanstack/query/no-void-query-fn": "error", - "@tanstack/query/mutation-property-order": "error" - } - } - ] -} diff --git a/frontend/.oxlintrc.json b/frontend/.oxlintrc.json index 6796d4851155..f1df75a3016d 100644 --- a/frontend/.oxlintrc.json +++ b/frontend/.oxlintrc.json @@ -1,7 +1,57 @@ { "ignorePatterns": ["node_modules", "dist", "coverage", ".firebase", ".turbo"], "extends": [ - "../packages/oxlint-config/index.jsonc" + "../packages/oxlint-config/index.jsonc", + "../packages/oxlint-config/plugin.jsonc" // "@monkeytype/oxlint-config" + ], + "jsPlugins": ["eslint-plugin-compat"], + "rules": { + "compat/compat": "error" + }, + "overrides": [ + { + "files": ["src/**/*.ts"], + "rules": { + // + } + }, + { + "jsPlugins": ["eslint-plugin-solid", "@tanstack/eslint-plugin-query"], + "files": ["src/**/*.tsx", "src/**/*.ts"], + "rules": { + "explicit-function-return-type": "off", + "solid/components-return-once": "error", + "solid/event-handlers": "error", + "solid/imports": "error", + "solid/jsx-no-duplicate-props": "error", + "solid/jsx-no-script-url": "error", + "solid/jsx-no-undef": "error", + "solid/no-array-handlers": "error", + "solid/no-destructure": "error", + "solid/no-innerhtml": "error", + "solid/no-react-deps": "error", + "solid/no-react-specific-props": "error", + "solid/no-unknown-namespaces": "error", + "solid/prefer-classlist": "error", + "solid/prefer-for": "error", + "solid/prefer-show": "error", + "solid/reactivity": "error", + "solid/self-closing-comp": [ + "error", + { + "html": "void" + } + ], + "solid/style-prop": "error", + "@tanstack/query/exhaustive-deps": "error", + "@tanstack/query/no-rest-destructuring": "error", + "@tanstack/query/stable-query-client": "error", + "@tanstack/query/no-unstable-deps": "error", + "@tanstack/query/infinite-query-property-order": "error", + "@tanstack/query/no-void-query-fn": "error", + "@tanstack/query/mutation-property-order": "error" + } + } ] } diff --git a/frontend/package.json b/frontend/package.json index 4028f57d8353..73180d0afa0f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -4,7 +4,7 @@ "license": "GPL-3.0", "type": "module", "scripts": { - "lint": "oxlint . --type-aware --type-check && oxlint . -c .oxlintrc-plugin.json", + "lint": "oxlint . --type-aware --type-check", "lint-fast": "oxlint .", "lint-json": "eslint static/**/*.json", "check-assets": "tsx ./scripts/check-assets.ts", @@ -93,8 +93,8 @@ "madge": "8.0.0", "magic-string": "0.30.17", "normalize.css": "8.0.1", - "oxlint": "1.47.0", - "oxlint-tsgolint": "0.12.2", + "oxlint": "1.50.0", + "oxlint-tsgolint": "0.14.2", "postcss": "8.4.31", "sass": "1.70.0", "solid-js": "1.9.10", diff --git a/frontend/src/ts/commandline/lists/custom-background.ts b/frontend/src/ts/commandline/lists/custom-background.ts index 93353f40c4e9..11eb6c5fa704 100644 --- a/frontend/src/ts/commandline/lists/custom-background.ts +++ b/frontend/src/ts/commandline/lists/custom-background.ts @@ -42,7 +42,7 @@ const customBackgroundCommand: Command = { } // check type - if (!file.type.match(/image\/(jpeg|jpg|png|gif|webp)/)) { + if (!/image\/(jpeg|jpg|png|gif|webp)/.exec(file.type)) { Notifications.add("Unsupported image format", 0); cleanup(); return; diff --git a/frontend/src/ts/commandline/lists/font-family.ts b/frontend/src/ts/commandline/lists/font-family.ts index 9b8141b1b17d..0342ba5ed682 100644 --- a/frontend/src/ts/commandline/lists/font-family.ts +++ b/frontend/src/ts/commandline/lists/font-family.ts @@ -60,8 +60,8 @@ if (fromMeta.subgroup) { // check type if ( - !file.type.match(/font\/(woff|woff2|ttf|otf)/) && - !file.name.match(/\.(woff|woff2|ttf|otf)$/i) + !/font\/(woff|woff2|ttf|otf)/.exec(file.type) && + !/\.(woff|woff2|ttf|otf)$/i.exec(file.name) ) { Notifications.add( "Unsupported font format, must be woff, woff2, ttf or otf.", diff --git a/frontend/src/ts/components/common/AsyncContent.tsx b/frontend/src/ts/components/common/AsyncContent.tsx index 13438a7e70ec..25217f7eaf8d 100644 --- a/frontend/src/ts/components/common/AsyncContent.tsx +++ b/frontend/src/ts/components/common/AsyncContent.tsx @@ -10,7 +10,6 @@ import { import * as Notifications from "../../elements/notifications"; import { createErrorMessage, typedKeys } from "../../utils/misc"; - import { Conditional } from "./Conditional"; import { LoadingCircle } from "./LoadingCircle"; diff --git a/frontend/src/ts/components/common/DiscordAvatar.tsx b/frontend/src/ts/components/common/DiscordAvatar.tsx index 2251bacb303d..6e585508bae7 100644 --- a/frontend/src/ts/components/common/DiscordAvatar.tsx +++ b/frontend/src/ts/components/common/DiscordAvatar.tsx @@ -2,7 +2,6 @@ import { createSignal, JSXElement, Show } from "solid-js"; import { createStore } from "solid-js/store"; import { FaSolidIcon } from "../../types/font-awesome"; - import { Fa } from "./Fa"; //cache successful and missing avatars diff --git a/frontend/src/ts/components/common/Headers.tsx b/frontend/src/ts/components/common/Headers.tsx index 62302a3fa8f2..0421e9a8668d 100644 --- a/frontend/src/ts/components/common/Headers.tsx +++ b/frontend/src/ts/components/common/Headers.tsx @@ -1,7 +1,6 @@ import { JSXElement, Show } from "solid-js"; import { cn } from "../../utils/cn"; - import { Fa, FaProps } from "./Fa"; export function H2(props: { diff --git a/frontend/src/ts/components/common/LoadingCircle.tsx b/frontend/src/ts/components/common/LoadingCircle.tsx index 50469a57bcb8..29739bf5dbb8 100644 --- a/frontend/src/ts/components/common/LoadingCircle.tsx +++ b/frontend/src/ts/components/common/LoadingCircle.tsx @@ -1,7 +1,6 @@ import { JSXElement } from "solid-js"; import { cn } from "../../utils/cn"; - import { Fa } from "./Fa"; export function LoadingCircle(props: { class?: string }): JSXElement { return ( diff --git a/frontend/src/ts/components/common/User.tsx b/frontend/src/ts/components/common/User.tsx index 8a3b8268b0f1..2bde5ae96d86 100644 --- a/frontend/src/ts/components/common/User.tsx +++ b/frontend/src/ts/components/common/User.tsx @@ -11,7 +11,6 @@ import { UserFlag, UserFlagOptions, } from "../../controllers/user-flag-controller"; - import { Button } from "./Button"; import { DiscordAvatar } from "./DiscordAvatar"; import { Fa } from "./Fa"; diff --git a/frontend/src/ts/components/core/Theme.tsx b/frontend/src/ts/components/core/Theme.tsx index 3f624f3b4de6..7f5e6a08ec4a 100644 --- a/frontend/src/ts/components/core/Theme.tsx +++ b/frontend/src/ts/components/core/Theme.tsx @@ -7,7 +7,6 @@ import { createDebouncedEffectOn } from "../../hooks/effects"; import { useRefWithUtils } from "../../hooks/useRefWithUtils"; import { hideLoaderBar, showLoaderBar } from "../../signals/loader-bar"; import { getTheme } from "../../signals/theme"; - import { FavIcon } from "./FavIcon"; export function Theme(): JSXElement { diff --git a/frontend/src/ts/components/layout/footer/Footer.tsx b/frontend/src/ts/components/layout/footer/Footer.tsx index 1e713a4862b0..2609656e015b 100644 --- a/frontend/src/ts/components/layout/footer/Footer.tsx +++ b/frontend/src/ts/components/layout/footer/Footer.tsx @@ -4,7 +4,6 @@ import { getFocus, getIsScreenshotting } from "../../../signals/core"; import { showModal } from "../../../stores/modals"; import { cn } from "../../../utils/cn"; import { Button } from "../../common/Button"; - import { Keytips } from "./Keytips"; import { ThemeIndicator } from "./ThemeIndicator"; import { VersionButton } from "./VersionButton"; diff --git a/frontend/src/ts/components/layout/overlays/Overlays.tsx b/frontend/src/ts/components/layout/overlays/Overlays.tsx index d6b28b46d091..80df879f0a7e 100644 --- a/frontend/src/ts/components/layout/overlays/Overlays.tsx +++ b/frontend/src/ts/components/layout/overlays/Overlays.tsx @@ -5,7 +5,6 @@ import { showModal } from "../../../stores/modals"; import { cn } from "../../../utils/cn"; import { Fa } from "../../common/Fa"; import { ScrollToTop } from "../footer/ScrollToTop"; - import { Banners } from "./Banners"; import { FpsCounter } from "./FpsCounter"; import { LoaderBar } from "./LoaderBar"; diff --git a/frontend/src/ts/components/mount.tsx b/frontend/src/ts/components/mount.tsx index a4dae541c9c4..91cf364064e3 100644 --- a/frontend/src/ts/components/mount.tsx +++ b/frontend/src/ts/components/mount.tsx @@ -4,7 +4,6 @@ import { render } from "solid-js/web"; import { queryClient } from "../queries"; import { qsa } from "../utils/dom"; - import { DevTools } from "./core/DevTools"; import { Theme } from "./core/Theme"; import { Footer } from "./layout/footer/Footer"; diff --git a/frontend/src/ts/components/ui/table/DataTable.tsx b/frontend/src/ts/components/ui/table/DataTable.tsx index f022003ec0a8..2b7dc28532ec 100644 --- a/frontend/src/ts/components/ui/table/DataTable.tsx +++ b/frontend/src/ts/components/ui/table/DataTable.tsx @@ -25,7 +25,6 @@ import { useLocalStorage } from "../../../hooks/useLocalStorage"; import { bp } from "../../../signals/breakpoints"; import { Conditional } from "../../common/Conditional"; import { Fa } from "../../common/Fa"; - import { Table, TableBody, diff --git a/frontend/src/ts/components/ui/table/Table.tsx b/frontend/src/ts/components/ui/table/Table.tsx index 42a6d0c107c3..517f61be3cd0 100644 --- a/frontend/src/ts/components/ui/table/Table.tsx +++ b/frontend/src/ts/components/ui/table/Table.tsx @@ -1,4 +1,5 @@ import type { Component, ComponentProps } from "solid-js"; + import { splitProps } from "solid-js"; import { cn } from "../../../utils/cn"; diff --git a/frontend/src/ts/db.ts b/frontend/src/ts/db.ts index 0d69d9c62ab7..679d01326628 100644 --- a/frontend/src/ts/db.ts +++ b/frontend/src/ts/db.ts @@ -38,10 +38,8 @@ let dbSnapshot: Snapshot | undefined; const firstDayOfTheWeek = getFirstDayOfTheWeek(); export class SnapshotInitError extends Error { - constructor( - message: string, - public responseCode: number, - ) { + public responseCode: number; + constructor(message: string, responseCode: number) { super(message); this.name = "SnapshotInitError"; // TODO INVESTIGATE diff --git a/frontend/src/ts/elements/profile.ts b/frontend/src/ts/elements/profile.ts index 65ea20773bb6..5d9ba62570f8 100644 --- a/frontend/src/ts/elements/profile.ts +++ b/frontend/src/ts/elements/profile.ts @@ -270,7 +270,7 @@ export async function update( //regular expression to get website name from url const regex = /^https?:\/\/(?:www\.)?([^/]+)/; - const websiteName = website?.match(regex)?.[1] ?? website; + const websiteName = regex.exec(website)?.[1] ?? website; if (website) { socialsEl?.appendHtml( diff --git a/frontend/src/ts/elements/psa.tsx b/frontend/src/ts/elements/psa.tsx index 46b5bab1c548..e14c7e470e45 100644 --- a/frontend/src/ts/elements/psa.tsx +++ b/frontend/src/ts/elements/psa.tsx @@ -11,7 +11,6 @@ import { addBanner } from "../stores/banners"; import { secondsToString } from "../utils/date-and-time"; import { LocalStorageWithSchema } from "../utils/local-storage-with-schema"; import { isDevEnvironment } from "../utils/misc"; - import * as Alerts from "./alerts"; const confirmedPSAs = new LocalStorageWithSchema({ diff --git a/frontend/src/ts/elements/settings/custom-background-picker.ts b/frontend/src/ts/elements/settings/custom-background-picker.ts index 025eccca1c86..47a86490f81c 100644 --- a/frontend/src/ts/elements/settings/custom-background-picker.ts +++ b/frontend/src/ts/elements/settings/custom-background-picker.ts @@ -52,7 +52,7 @@ uploadContainerEl } // check type - if (!file.type.match(/image\/(jpeg|jpg|png|gif|webp)/)) { + if (!/image\/(jpeg|jpg|png|gif|webp)/.exec(file.type)) { Notifications.add("Unsupported image format", 0); fileInput.value = ""; return; diff --git a/frontend/src/ts/elements/settings/custom-font-picker.ts b/frontend/src/ts/elements/settings/custom-font-picker.ts index 07d807c85b60..a24dc509b466 100644 --- a/frontend/src/ts/elements/settings/custom-font-picker.ts +++ b/frontend/src/ts/elements/settings/custom-font-picker.ts @@ -53,8 +53,8 @@ uploadContainerEl // check type if ( - !file.type.match(/font\/(woff|woff2|ttf|otf)/) && - !file.name.match(/\.(woff|woff2|ttf|otf)$/i) + !/font\/(woff|woff2|ttf|otf)/.exec(file.type) && + !/\.(woff|woff2|ttf|otf)$/i.exec(file.name) ) { Notifications.add( "Unsupported font format, must be woff, woff2, ttf or otf.", diff --git a/frontend/src/ts/modals/edit-result-tags.ts b/frontend/src/ts/modals/edit-result-tags.ts index 50240766463f..89650c41b061 100644 --- a/frontend/src/ts/modals/edit-result-tags.ts +++ b/frontend/src/ts/modals/edit-result-tags.ts @@ -42,10 +42,10 @@ export function show( return; } - state["resultId"] = resultId; - state["startingTags"] = [...tags]; - state["tags"] = [...tags]; - state["source"] = source; + state.resultId = resultId; + state.startingTags = [...tags]; + state.tags = [...tags]; + state.source = source; void modal.show({ beforeAnimation: async (): Promise => { diff --git a/frontend/src/ts/pages/account.ts b/frontend/src/ts/pages/account.ts index a80d2f66d7f3..19a245d4dd6f 100644 --- a/frontend/src/ts/pages/account.ts +++ b/frontend/src/ts/pages/account.ts @@ -1120,7 +1120,7 @@ qs(".pageAccount")?.onChild( (it) => it._id === result._id, ); if (dbResult !== undefined) { - dbResult["chartData"] = result.chartData; + dbResult.chartData = result.chartData; } if (response.body.data.chartData === "toolong") { diff --git a/frontend/src/ts/test/british-english.ts b/frontend/src/ts/test/british-english.ts index d90449ce4ce5..4c7c51a4948d 100644 --- a/frontend/src/ts/test/british-english.ts +++ b/frontend/src/ts/test/british-english.ts @@ -720,6 +720,7 @@ export async function replace( RegExp(`^(?:([\\W]*)(${cleanedWord})([\\W]*))$`, "gi"), (_, $1, $2, $3) => $1 + + // oxlint-disable-next-line typescript/prefer-string-starts-ends-with (($2 as string).charAt(0) === ($2 as string).charAt(0).toUpperCase() ? $2 === ($2 as string).toUpperCase() ? britishWord.toUpperCase() diff --git a/frontend/src/ts/test/english-punctuation.ts b/frontend/src/ts/test/english-punctuation.ts index 5af77d47ede4..6084c95e4d5c 100644 --- a/frontend/src/ts/test/english-punctuation.ts +++ b/frontend/src/ts/test/english-punctuation.ts @@ -57,6 +57,7 @@ export async function replace(word: string): Promise { RegExp(`^(?:([\\W]*)(${replacement[0]})([\\W]*))$`, "gi"), (_, $1, $2, $3) => $1 + + // oxlint-disable-next-line typescript/prefer-string-starts-ends-with (($2 as string).charAt(0) === ($2 as string).charAt(0).toUpperCase() ? shouldWholeReplacementWordBeCapitalised($2 as string) ? randomReplacement.toUpperCase() diff --git a/frontend/src/ts/test/funbox/funbox-functions.ts b/frontend/src/ts/test/funbox/funbox-functions.ts index 564881d3644d..748f42ac73cd 100644 --- a/frontend/src/ts/test/funbox/funbox-functions.ts +++ b/frontend/src/ts/test/funbox/funbox-functions.ts @@ -654,8 +654,8 @@ const list: Partial> = { ); if (isSafari) { //Workaround for bug https://bugs.webkit.org/show_bug.cgi?id=256171 in Safari 16.5 or earlier - const versionMatch = navigator.userAgent.match( - /.*Version\/([0-9]*)\.([0-9]*).*/, + const versionMatch = /.*Version\/([0-9]*)\.([0-9]*).*/.exec( + navigator.userAgent, ); const mainVersion = versionMatch !== null ? parseInt(versionMatch[1] ?? "0") : 0; diff --git a/frontend/src/ts/test/result.ts b/frontend/src/ts/test/result.ts index d30d136573c1..db6b5919db7c 100644 --- a/frontend/src/ts/test/result.ts +++ b/frontend/src/ts/test/result.ts @@ -107,7 +107,7 @@ async function updateChartData(): Promise { } const chartData1 = [ - ...result.chartData["wpm"].map((a) => + ...result.chartData.wpm.map((a) => Numbers.roundTo2(typingSpeedUnit.fromWpm(a)), ), ]; @@ -118,9 +118,9 @@ async function updateChartData(): Promise { ), ]; - const valueWindow = Math.max(...result.chartData["burst"]) * 0.25; + const valueWindow = Math.max(...result.chartData.burst) * 0.25; let smoothedBurst = Arrays.smoothWithValueWindow( - result.chartData["burst"], + result.chartData.burst, 1, useSmoothedBurst ? valueWindow : 0, ); @@ -223,19 +223,19 @@ function applyFakeChartData(): void { const typingSpeedUnit = getTypingSpeedUnit(Config.typingSpeedUnit); const chartData1 = [ - ...fakeChartData["wpm"].map((a) => + ...fakeChartData.wpm.map((a) => Numbers.roundTo2(typingSpeedUnit.fromWpm(a)), ), ]; const chartData2 = [ - ...fakeChartData["raw"].map((a) => + ...fakeChartData.raw.map((a) => Numbers.roundTo2(typingSpeedUnit.fromWpm(a)), ), ]; const chartData3 = [ - ...fakeChartData["burst"].map((a) => + ...fakeChartData.burst.map((a) => Numbers.roundTo2(typingSpeedUnit.fromWpm(a)), ), ]; diff --git a/frontend/src/ts/test/test-ui.ts b/frontend/src/ts/test/test-ui.ts index fbdeda0f09a6..0153061d91b7 100644 --- a/frontend/src/ts/test/test-ui.ts +++ b/frontend/src/ts/test/test-ui.ts @@ -1345,7 +1345,7 @@ async function loadWordsHistory(): Promise { Config.mode === "time" || (Config.mode === "custom" && CustomText.getLimitMode() === "time") || (Config.mode === "custom" && CustomText.getLimitValue() === 0); - const isPartiallyCorrect = word.substring(0, input.length) === input; + const isPartiallyCorrect = word.startsWith(input); const shouldShowError = Config.mode !== "zen" && diff --git a/frontend/src/ts/utils/colors.ts b/frontend/src/ts/utils/colors.ts index 2a5d0b1ef294..aa51ff6a1795 100644 --- a/frontend/src/ts/utils/colors.ts +++ b/frontend/src/ts/utils/colors.ts @@ -285,8 +285,8 @@ export function convertStringToHex(color: string): string { } const rgbMatch = - input.match(/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/) ?? - input.match(/^(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})$/); + /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/.exec(input) ?? + /^(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})$/.exec(input); if (rgbMatch !== null) { const clamp = (n: string): number => @@ -299,8 +299,8 @@ export function convertStringToHex(color: string): string { } const hslMatch = - input.match(/^hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)$/) ?? - input.match(/^(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%$/); + /^hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)$/.exec(input) ?? + /^(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%$/.exec(input); if (hslMatch) { const clamp = (n: string): number => diff --git a/frontend/src/ts/utils/date-and-time.ts b/frontend/src/ts/utils/date-and-time.ts index a3f061b17753..e0da811395e1 100644 --- a/frontend/src/ts/utils/date-and-time.ts +++ b/frontend/src/ts/utils/date-and-time.ts @@ -234,7 +234,7 @@ export function getFirstDayOfTheWeek(): Day { if ("getWeekInfo" in locale) { // @ts-expect-error getWeekInfo is not in the type definition // oxlint-disable-next-line no-unsafe-member-access - return (locale.getWeekInfo().firstDay as number) % 7; + return locale.getWeekInfo().firstDay % 7; } //use fallback generated from date-fns for browsers like firefox diff --git a/frontend/src/ts/utils/format.ts b/frontend/src/ts/utils/format.ts index c8ebab24b644..33eec36832d6 100644 --- a/frontend/src/ts/utils/format.ts +++ b/frontend/src/ts/utils/format.ts @@ -21,8 +21,9 @@ export type FallbackOptions = { }; export class Formatting { - constructor(private config: ConfigType) { - // + private config: ConfigType; + constructor(config: ConfigType) { + this.config = config; } typingSpeed( diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index 8666e9eece3a..0d4939206bb7 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -429,9 +429,9 @@ export async function sleep(ms: number): Promise { } export function isPasswordStrong(password: string): boolean { - const hasCapital = !!password.match(/[A-Z]/); - const hasNumber = !!password.match(/[\d]/); - const hasSpecial = !!password.match(/[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/); + const hasCapital = !!/[A-Z]/.exec(password); + const hasNumber = !!/[\d]/.exec(password); + const hasSpecial = !!/[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.exec(password); const isLong = password.length >= 8; const isShort = password.length <= 64; return hasCapital && hasNumber && hasSpecial && isLong && isShort; diff --git a/frontend/vite-plugins/env-config.ts b/frontend/vite-plugins/env-config.ts index c0088a7d0bd7..3e5cf6554178 100644 --- a/frontend/vite-plugins/env-config.ts +++ b/frontend/vite-plugins/env-config.ts @@ -4,6 +4,11 @@ import { EnvConfig } from "virtual:env-config"; const virtualModuleId = "virtual:env-config"; const resolvedVirtualModuleId = "\0" + virtualModuleId; +function fallback(value: string | undefined | null, fallback: string): string { + if (value === null || value === undefined || value === "") return fallback; + return value; +} + export function envConfig(options: { isDevelopment: boolean; clientVersion: string; @@ -50,8 +55,3 @@ export function envConfig(options: { }, }; } - -function fallback(value: string | undefined | null, fallback: string): string { - if (value === null || value === undefined || value === "") return fallback; - return value; -} diff --git a/frontend/vite-plugins/font-preview.ts b/frontend/vite-plugins/font-preview.ts index 100cb50ea698..5b0ee3ab1abc 100644 --- a/frontend/vite-plugins/font-preview.ts +++ b/frontend/vite-plugins/font-preview.ts @@ -10,27 +10,16 @@ import { KnownFontName } from "@monkeytype/schemas/fonts"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -/** - * Generate a preview file from each font in `static/webfonts` into `static/webfonts-preview`. - * A preview file only contains the characters needed to show the preview. - * @returns - */ -export function fontPreview(): Plugin { - return { - name: "vite-plugin-webfonts-preview", - apply: "build", - async buildStart() { - const start = performance.now(); - console.log("\nCreating webfonts preview..."); - - await generatePreviewFonts(); - - const end = performance.now(); - console.log( - `Creating webfonts preview took ${Math.round(end - start)} ms`, - ); - }, - }; +async function generateSubset( + source: string, + target: string, + includedCharacters: string, +): Promise { + const font = fs.readFileSync(source); + const subset = await subsetFont(font, includedCharacters, { + targetFormat: "woff2", + }); + fs.writeFileSync(target, subset); } async function generatePreviewFonts(debug: boolean = false): Promise { @@ -60,17 +49,29 @@ async function generatePreviewFonts(debug: boolean = false): Promise { } } -async function generateSubset( - source: string, - target: string, - includedCharacters: string, -): Promise { - const font = fs.readFileSync(source); - const subset = await subsetFont(font, includedCharacters, { - targetFormat: "woff2", - }); - fs.writeFileSync(target, subset); +/** + * Generate a preview file from each font in `static/webfonts` into `static/webfonts-preview`. + * A preview file only contains the characters needed to show the preview. + * @returns + */ +export function fontPreview(): Plugin { + return { + name: "vite-plugin-webfonts-preview", + apply: "build", + async buildStart() { + const start = performance.now(); + console.log("\nCreating webfonts preview..."); + + await generatePreviewFonts(); + + const end = performance.now(); + console.log( + `Creating webfonts preview took ${Math.round(end - start)} ms`, + ); + }, + }; } + //detect if we run this as a main if (import.meta.url.endsWith(process.argv[1] as string)) { void generatePreviewFonts(true); diff --git a/frontend/vite-plugins/fontawesome-subset.ts b/frontend/vite-plugins/fontawesome-subset.ts index 49b0e1f2cbec..7038d1719919 100644 --- a/frontend/vite-plugins/fontawesome-subset.ts +++ b/frontend/vite-plugins/fontawesome-subset.ts @@ -4,34 +4,16 @@ import { createRequire } from "module"; import * as path from "path"; import { fontawesomeSubset as createFontawesomeSubset } from "fontawesome-subset"; -/** - * Detect fontawesome icons used by the application and creates subset font files only containing the used icons. - * @param options - * @returns - */ -export function fontawesomeSubset(): Plugin { - return { - name: "vite-plugin-fontawesome-subset", - apply: "build", - async buildStart() { - const start = performance.now(); - console.log("\nCreating fontawesome subset..."); - - const fontawesomeClasses = getFontawesomeConfig(); - await createFontawesomeSubset( - fontawesomeClasses, - "src/webfonts-generated", - { - targetFormats: ["woff2"], - }, - ); +function parseIcons(iconSet: string): string[] { + const require = createRequire(import.meta.url); + const path = require.resolve( + `@fortawesome/fontawesome-free/js/${iconSet}.js`, + ); + const file: string | null = fs.readFileSync(path).toString(); - const end = performance.now(); - console.log( - `Creating fontawesome subset took ${Math.round(end - start)} ms`, - ); - }, - }; + return file + ?.match(/"(.*)": \[.*\],/g) + ?.map((it) => it.substring(1, it.indexOf(":") - 1)) as string[]; } type FontawesomeConfig = { @@ -83,6 +65,31 @@ const modules2 = { stacked: ["stack", "stack-1x", "stack-2x", "inverse"], }; +function toFileAndDir(dir: string, file: string): FileObject { + const name = path.join(dir, file); + return { name, isDirectory: fs.statSync(name).isDirectory() }; +} + +function findAllFiles( + dir: string, + filter: (filename: string) => boolean = (_it): boolean => true, +): string[] { + const files = fs + .readdirSync(dir) + .map((it) => toFileAndDir(dir, it)) + .filter((file) => file.isDirectory || filter(file.name)); + + const out: string[] = []; + for (const file of files) { + if (file.isDirectory) { + out.push(...findAllFiles(file.name, filter)); + } else { + out.push(file.name); + } + } + return out; +} + /** * Detect used fontawesome icons in the directories `src/**` and `static/**{.html|.css}` * @param {boolean} debug - Enable debug output @@ -164,44 +171,37 @@ function getFontawesomeConfig(debug = false): FontawesomeConfig { }; } -//detect if we run this as a main -if (import.meta.url.endsWith(process.argv[1] as string)) { - getFontawesomeConfig(true); -} - -function toFileAndDir(dir: string, file: string): FileObject { - const name = path.join(dir, file); - return { name, isDirectory: fs.statSync(name).isDirectory() }; -} +/** + * Detect fontawesome icons used by the application and creates subset font files only containing the used icons. + * @param options + * @returns + */ +export function fontawesomeSubset(): Plugin { + return { + name: "vite-plugin-fontawesome-subset", + apply: "build", + async buildStart() { + const start = performance.now(); + console.log("\nCreating fontawesome subset..."); -function findAllFiles( - dir: string, - filter: (filename: string) => boolean = (_it): boolean => true, -): string[] { - const files = fs - .readdirSync(dir) - .map((it) => toFileAndDir(dir, it)) - .filter((file) => file.isDirectory || filter(file.name)); + const fontawesomeClasses = getFontawesomeConfig(); + await createFontawesomeSubset( + fontawesomeClasses, + "src/webfonts-generated", + { + targetFormats: ["woff2"], + }, + ); - const out: string[] = []; - for (const file of files) { - if (file.isDirectory) { - out.push(...findAllFiles(file.name, filter)); - } else { - out.push(file.name); - } - } - return out; + const end = performance.now(); + console.log( + `Creating fontawesome subset took ${Math.round(end - start)} ms`, + ); + }, + }; } -function parseIcons(iconSet: string): string[] { - const require = createRequire(import.meta.url); - const path = require.resolve( - `@fortawesome/fontawesome-free/js/${iconSet}.js`, - ); - const file: string | null = fs.readFileSync(path).toString(); - - return file - ?.match(/"(.*)": \[.*\],/g) - ?.map((it) => it.substring(1, it.indexOf(":") - 1)) as string[]; +//detect if we run this as a main +if (import.meta.url.endsWith(process.argv[1] as string)) { + getFontawesomeConfig(true); } diff --git a/frontend/vite-plugins/language-hashes.ts b/frontend/vite-plugins/language-hashes.ts index 936b40b5f8f0..a7a51f2de52c 100644 --- a/frontend/vite-plugins/language-hashes.ts +++ b/frontend/vite-plugins/language-hashes.ts @@ -6,6 +6,35 @@ import { createHash } from "crypto"; const virtualModuleId = "virtual:language-hashes"; const resolvedVirtualModuleId = "\0" + virtualModuleId; +function calcHash(file: string): string { + const currentLanguage = JSON.stringify( + JSON.parse(readFileSync("./static/languages/" + file).toString()), + null, + 0, + ); + const encoder = new TextEncoder(); + const data = encoder.encode(currentLanguage); + return createHash("sha256").update(data).digest("hex"); +} + +function getHashes(): Record { + const start = performance.now(); + + console.log("\nHashing languages..."); + + const hashes = Object.fromEntries( + readdirSync("./static/languages").map((file) => { + return [file.slice(0, -5), calcHash(file)]; + }), + ); + + const end = performance.now(); + + console.log(`Creating language hashes took ${Math.round(end - start)} ms`); + + return hashes; +} + export function languageHashes(options?: { skip: boolean }): Plugin { return { name: "virtual-language-hashes", @@ -29,35 +58,6 @@ export function languageHashes(options?: { skip: boolean }): Plugin { }; } -function getHashes(): Record { - const start = performance.now(); - - console.log("\nHashing languages..."); - - const hashes = Object.fromEntries( - readdirSync("./static/languages").map((file) => { - return [file.slice(0, -5), calcHash(file)]; - }), - ); - - const end = performance.now(); - - console.log(`Creating language hashes took ${Math.round(end - start)} ms`); - - return hashes; -} - -function calcHash(file: string): string { - const currentLanguage = JSON.stringify( - JSON.parse(readFileSync("./static/languages/" + file).toString()), - null, - 0, - ); - const encoder = new TextEncoder(); - const data = encoder.encode(currentLanguage); - return createHash("sha256").update(data).digest("hex"); -} - if (import.meta.url.endsWith(process.argv[1] as string)) { console.log(JSON.stringify(getHashes(), null, 4)); } diff --git a/frontend/vite-plugins/oxlint-checker.ts b/frontend/vite-plugins/oxlint-checker.ts index 877f4a70f647..a34afe0feb56 100644 --- a/frontend/vite-plugins/oxlint-checker.ts +++ b/frontend/vite-plugins/oxlint-checker.ts @@ -7,8 +7,6 @@ export type OxlintCheckerOptions = { debounceDelay?: number; /** Run type-aware checks (slower but more thorough). @default true */ typeAware?: boolean; - /** Run plugin checks with custom config. @default true */ - plugin?: boolean; /** Show browser overlay with lint status. @default true */ overlay?: boolean; /** File extensions to watch for changes. @default ['.ts', '.tsx', '.js', '.jsx'] */ @@ -29,7 +27,6 @@ export function oxlintChecker(options: OxlintCheckerOptions = {}): Plugin { const { debounceDelay = 125, typeAware = true, - plugin = true, overlay = true, extensions = [".ts", ".tsx", ".js", ".jsx"], } = options; @@ -65,7 +62,7 @@ export function oxlintChecker(options: OxlintCheckerOptions = {}): Plugin { const parseLintOutput = ( output: string, ): Pick => { - const summaryMatch = output.match(OXLINT_SUMMARY_REGEX); + const summaryMatch = OXLINT_SUMMARY_REGEX.exec(output); if (summaryMatch?.[1] !== undefined && summaryMatch?.[2] !== undefined) { return { warningCount: parseInt(summaryMatch[1], 10), @@ -188,34 +185,6 @@ export function oxlintChecker(options: OxlintCheckerOptions = {}): Plugin { } } - // First pass clean - run plugin check if enabled - if (plugin) { - console.log("\x1b[36mRunning plugin checks...\x1b[0m"); - sendLintResult({ running: true }); - const pluginResult = await runLintProcess([ - "-c", - ".oxlintrc-plugin.json", - ]); - - // Check if we were superseded by a newer run - if (runId !== currentRunId) { - return; - } - - if (pluginResult.output) { - console.log(pluginResult.output); - } - - // If plugin check had errors, send them and return (fail fast) - if (pluginResult.code !== 0) { - const counts = parseLintOutput(pluginResult.output); - if (counts.errorCount > 0 || counts.warningCount > 0) { - sendLintResult({ ...counts, running: false }); - return; - } - } - } - // Run type-aware check if enabled if (!typeAware) { sendLintResult({ errorCount: 0, warningCount: 0, running: false }); @@ -307,9 +276,6 @@ export function oxlintChecker(options: OxlintCheckerOptions = {}): Plugin { try { const commands = ["npx oxlint ."]; - if (plugin) { - commands.push("npx oxlint . -c .oxlintrc-plugin.json"); - } if (typeAware) { commands.push("npx oxlint . --type-aware --type-check"); } diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 7998f5712112..7875bcf167ae 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -29,42 +29,66 @@ import { KnownFontName } from "@monkeytype/schemas/fonts"; import solidPlugin from "vite-plugin-solid"; import tailwindcss from "@tailwindcss/vite"; -export default defineConfig(({ mode }): UserConfig => { - const env = loadEnv(mode, process.cwd(), ""); - const useSentry = env["SENTRY"] !== undefined; - const isDevelopment = mode !== "production"; +function getFontsConfig(): string { + return ( + "\n" + + Object.keys(Fonts) + .sort() + .map((name: string) => { + const config = Fonts[name as KnownFontName]; + if (config.systemFont === true) return ""; + return `"${name.replaceAll("_", " ")}": ( + "src": "${config.fileName}", + "weight": ${config.weight ?? 400}, + ),`; + }) + .join("\n") + + "\n" + ); +} - if (!isDevelopment) { - if (env["RECAPTCHA_SITE_KEY"] === undefined) { - throw new Error(`${mode}: RECAPTCHA_SITE_KEY is not defined`); - } - if (useSentry && env["SENTRY_AUTH_TOKEN"] === undefined) { - throw new Error(`${mode}: SENTRY_AUTH_TOKEN is not defined`); - } +function pad( + numbers: number[], + maxLength: number, + fillString: string, +): string[] { + return numbers.map((number) => + number.toString().padStart(maxLength, fillString), + ); +} + +function getClientVersion(isDevelopment: boolean): string { + if (isDevelopment) { + return "DEVELOPMENT_CLIENT"; + } + const date = new Date(); + const versionPrefix = pad( + [date.getFullYear(), date.getMonth() + 1, date.getDate()], + 2, + "0", + ).join("."); + const versionSuffix = pad([date.getHours(), date.getMinutes()], 2, "0").join( + ".", + ); + const version = [versionPrefix, versionSuffix].join("_"); + + try { + const commitHash = childProcess + .execSync("git rev-parse --short HEAD") + .toString(); + + return `${version}_${commitHash}`.replace(/\n/g, ""); + } catch (e) { + return `${version}_unknown-hash`; } +} - return { - plugins: getPlugins({ isDevelopment, useSentry: useSentry, env }), - build: getBuildOptions({ enableSourceMaps: useSentry }), - css: getCssOptions({ isDevelopment }), - server: { - open: env["SERVER_OPEN"] !== "false", - port: 3000, - host: env["BACKEND_URL"] !== undefined, - watch: { - //we rebuild the whole contracts package when a file changes - //so we only want to watch one file - ignored: [/.*\/packages\/contracts\/dist\/(?!configs).*/], - }, - }, - clearScreen: false, - root: "src", - publicDir: "../static", - optimizeDeps: { - exclude: ["@fortawesome/fontawesome-free"], - }, - }; -}); +/** Enable for font awesome v6 */ +/* +function sassList(values) { + return values.map((it) => `"${it}"`).join(","); +} +*/ function getPlugins({ isDevelopment, @@ -303,63 +327,39 @@ function getCssOptions({ }; } -function getFontsConfig(): string { - return ( - "\n" + - Object.keys(Fonts) - .sort() - .map((name: string) => { - const config = Fonts[name as KnownFontName]; - if (config.systemFont === true) return ""; - return `"${name.replaceAll("_", " ")}": ( - "src": "${config.fileName}", - "weight": ${config.weight ?? 400}, - ),`; - }) - .join("\n") + - "\n" - ); -} - -function pad( - numbers: number[], - maxLength: number, - fillString: string, -): string[] { - return numbers.map((number) => - number.toString().padStart(maxLength, fillString), - ); -} - -/** Enable for font awesome v6 */ -/* -function sassList(values) { - return values.map((it) => `"${it}"`).join(","); -} -*/ +export default defineConfig(({ mode }): UserConfig => { + const env = loadEnv(mode, process.cwd(), ""); + const useSentry = env["SENTRY"] !== undefined; + const isDevelopment = mode !== "production"; -function getClientVersion(isDevelopment: boolean): string { - if (isDevelopment) { - return "DEVELOPMENT_CLIENT"; + if (!isDevelopment) { + if (env["RECAPTCHA_SITE_KEY"] === undefined) { + throw new Error(`${mode}: RECAPTCHA_SITE_KEY is not defined`); + } + if (useSentry && env["SENTRY_AUTH_TOKEN"] === undefined) { + throw new Error(`${mode}: SENTRY_AUTH_TOKEN is not defined`); + } } - const date = new Date(); - const versionPrefix = pad( - [date.getFullYear(), date.getMonth() + 1, date.getDate()], - 2, - "0", - ).join("."); - const versionSuffix = pad([date.getHours(), date.getMinutes()], 2, "0").join( - ".", - ); - const version = [versionPrefix, versionSuffix].join("_"); - - try { - const commitHash = childProcess - .execSync("git rev-parse --short HEAD") - .toString(); - return `${version}_${commitHash}`.replace(/\n/g, ""); - } catch (e) { - return `${version}_unknown-hash`; - } -} + return { + plugins: getPlugins({ isDevelopment, useSentry: useSentry, env }), + build: getBuildOptions({ enableSourceMaps: useSentry }), + css: getCssOptions({ isDevelopment }), + server: { + open: env["SERVER_OPEN"] !== "false", + port: 3000, + host: env["BACKEND_URL"] !== undefined, + watch: { + //we rebuild the whole contracts package when a file changes + //so we only want to watch one file + ignored: [/.*\/packages\/contracts\/dist\/(?!configs).*/], + }, + }, + clearScreen: false, + root: "src", + publicDir: "../static", + optimizeDeps: { + exclude: ["@fortawesome/fontawesome-free"], + }, + }; +}); diff --git a/package.json b/package.json index 69e345450624..d412191b7ab6 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "lint-be": "turbo run lint --filter @monkeytype/backend", "lint-fe": "turbo run lint --filter @monkeytype/frontend", "lint-pkg": "turbo run lint --filter=\"./packages/*\"", + "lint-fix": "turbo run lint -- --fix", "lint-fast": "turbo run lint-fast", "lint-fast-be": "turbo run lint-fast --filter @monkeytype/backend", "lint-fast-fe": "turbo run lint-fast --filter @monkeytype/frontend", @@ -65,9 +66,9 @@ "knip": "2.19.2", "lint-staged": "13.2.3", "only-allow": "1.2.1", - "oxfmt": "0.32.0", - "oxlint": "1.47.0", - "oxlint-tsgolint": "0.12.2", + "oxfmt": "0.35.0", + "oxlint": "1.50.0", + "oxlint-tsgolint": "0.14.2", "prettier": "3.7.1", "turbo": "2.5.6", "vitest": "4.0.15" diff --git a/packages/contracts/package.json b/packages/contracts/package.json index a356cbf4671e..f7c029f4ff69 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -29,8 +29,8 @@ "@monkeytype/tsup-config": "workspace:*", "@monkeytype/typescript-config": "workspace:*", "madge": "8.0.0", - "oxlint": "1.47.0", - "oxlint-tsgolint": "0.12.2", + "oxlint": "1.50.0", + "oxlint-tsgolint": "0.14.2", "tsup": "8.4.0", "typescript": "6.0.0-beta", "vitest": "4.0.15" diff --git a/packages/contracts/src/util/api.ts b/packages/contracts/src/util/api.ts index 3bd5c92d7bcd..a083ebdc743b 100644 --- a/packages/contracts/src/util/api.ts +++ b/packages/contracts/src/util/api.ts @@ -44,12 +44,12 @@ export type EndpointMetadata = { /** * - * @param meta Ensure the type of metadata is `EndpointMetadata`. + * @param metadata Ensure the type of metadata is `EndpointMetadata`. * Ts-rest does not allow to specify the type of `metadata`. * @returns */ -export function meta(meta: EndpointMetadata): EndpointMetadata { - return meta; +export function meta(metadata: EndpointMetadata): EndpointMetadata { + return metadata; } export type RequestAuthenticationOptions = { diff --git a/packages/funbox/package.json b/packages/funbox/package.json index b6cd045fbfe5..c2c1193d8124 100644 --- a/packages/funbox/package.json +++ b/packages/funbox/package.json @@ -25,8 +25,8 @@ "@monkeytype/tsup-config": "workspace:*", "@monkeytype/typescript-config": "workspace:*", "madge": "8.0.0", - "oxlint": "1.47.0", - "oxlint-tsgolint": "0.12.2", + "oxlint": "1.50.0", + "oxlint-tsgolint": "0.14.2", "tsup": "8.4.0", "typescript": "6.0.0-beta", "vitest": "4.0.15" diff --git a/packages/funbox/src/list.ts b/packages/funbox/src/list.ts index f43ab93e8c80..c3dc3b72bddf 100644 --- a/packages/funbox/src/list.ts +++ b/packages/funbox/src/list.ts @@ -484,6 +484,22 @@ const list: Record = { }, }; +export function getObject(): Record { + return list; +} + +export function getFunboxNames(): FunboxName[] { + return Object.keys(list) as FunboxName[]; +} + +export function getList(): FunboxMetadata[] { + const out: FunboxMetadata[] = []; + for (const name of getFunboxNames()) { + out.push(list[name]); + } + return out; +} + export function getFunbox(name: FunboxName): FunboxMetadata; export function getFunbox(names: FunboxName[]): FunboxMetadata[]; export function getFunbox( @@ -511,19 +527,3 @@ export function getFunbox( return out; } } - -export function getObject(): Record { - return list; -} - -export function getList(): FunboxMetadata[] { - const out: FunboxMetadata[] = []; - for (const name of getFunboxNames()) { - out.push(list[name]); - } - return out; -} - -export function getFunboxNames(): FunboxName[] { - return Object.keys(list) as FunboxName[]; -} diff --git a/packages/oxlint-config/overrides.jsonc b/packages/oxlint-config/overrides.jsonc index e2d9cb72af14..3714373425a7 100644 --- a/packages/oxlint-config/overrides.jsonc +++ b/packages/oxlint-config/overrides.jsonc @@ -78,8 +78,16 @@ "no-empty-object-type": "off", //2 "typescript/strict-boolean-expressions": "off", //1 "typescript/no-unnecessary-type-assertion": "off", //1 + "typescript/strict-void-return": "off", "prefer-nullish-coalescing": "off", + "no-shadow": "off", + }, + }, + { + "files": ["private/script.js"], + "rules": { + "no-shadow": "off", }, }, ], diff --git a/packages/oxlint-config/rules/ts-enabled.jsonc b/packages/oxlint-config/rules/ts-enabled.jsonc index 4a0dadc00de5..664cbba3f846 100644 --- a/packages/oxlint-config/rules/ts-enabled.jsonc +++ b/packages/oxlint-config/rules/ts-enabled.jsonc @@ -51,5 +51,14 @@ "typescript/no-deprecated": "error", "typescript/prefer-includes": "error", "typescript/prefer-nullish-coalescing": "error", + "typescript/no-invalid-void-type": "error", + "typescript/unified-signatures": "error", + "typescript/parameter-properties": "error", + "typescript/dot-notation": "error", + "typescript/no-useless-default-assignment": "error", + "typescript/prefer-string-starts-ends-with": "error", + "typescript/prefer-regexp-exec": "error", + "typescript/prefer-find": "error", + "typescript/consistent-type-exports": "error", }, } diff --git a/packages/release/package.json b/packages/release/package.json index 3a694352d15b..aa51c1ab91c6 100644 --- a/packages/release/package.json +++ b/packages/release/package.json @@ -20,7 +20,7 @@ }, "devDependencies": { "nodemon": "3.1.4", - "oxlint": "1.47.0", - "oxlint-tsgolint": "0.12.2" + "oxlint": "1.50.0", + "oxlint-tsgolint": "0.14.2" } } diff --git a/packages/schemas/package.json b/packages/schemas/package.json index 36b68f0b788e..d75944a6139d 100644 --- a/packages/schemas/package.json +++ b/packages/schemas/package.json @@ -26,8 +26,8 @@ "@monkeytype/tsup-config": "workspace:*", "@monkeytype/typescript-config": "workspace:*", "madge": "8.0.0", - "oxlint": "1.47.0", - "oxlint-tsgolint": "0.12.2", + "oxlint": "1.50.0", + "oxlint-tsgolint": "0.14.2", "tsup": "8.4.0", "typescript": "6.0.0-beta", "vitest": "4.0.15" diff --git a/packages/schemas/src/validation/validation.ts b/packages/schemas/src/validation/validation.ts index 3e3e289ffcbf..9ceb06fb1b4c 100644 --- a/packages/schemas/src/validation/validation.ts +++ b/packages/schemas/src/validation/validation.ts @@ -1,54 +1,6 @@ import { replaceHomoglyphs } from "./homoglyphs"; import { ZodEffects, ZodString } from "zod"; -export function containsProfanity( - text: string, - mode: "word" | "substring", -): boolean { - const normalizedText = text - .toLowerCase() - .split(/[.,"/#!?$%^&*;:{}=\-_`~()\s\n]+/g) - .map((str) => { - return replaceHomoglyphs(sanitizeString(str) ?? ""); - }); - - const hasProfanity = profanities.some((profanity) => { - return normalizedText.some((word) => { - return mode === "word" - ? word.startsWith(profanity) - : word.includes(profanity); - }); - }); - - return hasProfanity; -} - -function sanitizeString(str: string | undefined): string | undefined { - if (str === undefined || str === "") { - return str; - } - - return str - .replace(/[\u0300-\u036F]/g, "") - .trim() - .replace(/\n{3,}/g, "\n\n") - .replace(/\s{3,}/g, " "); -} - -export function doesNotContainProfanity( - mode: "word" | "substring", - schema: ZodString, -): ZodEffects { - return schema.refine( - (val) => { - return !containsProfanity(val, mode); - }, - (val) => ({ - message: `Profanity detected. Please remove it. If you believe this is a mistake, please contact us. (${val})`, - }), - ); -} - // Sorry for the bad words const profanities = [ "miodec", @@ -438,3 +390,51 @@ const profanities = [ "wichser", "zabourah", ]; + +function sanitizeString(str: string | undefined): string | undefined { + if (str === undefined || str === "") { + return str; + } + + return str + .replace(/[\u0300-\u036F]/g, "") + .trim() + .replace(/\n{3,}/g, "\n\n") + .replace(/\s{3,}/g, " "); +} + +export function containsProfanity( + text: string, + mode: "word" | "substring", +): boolean { + const normalizedText = text + .toLowerCase() + .split(/[.,"/#!?$%^&*;:{}=\-_`~()\s\n]+/g) + .map((str) => { + return replaceHomoglyphs(sanitizeString(str) ?? ""); + }); + + const hasProfanity = profanities.some((profanity) => { + return normalizedText.some((word) => { + return mode === "word" + ? word.startsWith(profanity) + : word.includes(profanity); + }); + }); + + return hasProfanity; +} + +export function doesNotContainProfanity( + mode: "word" | "substring", + schema: ZodString, +): ZodEffects { + return schema.refine( + (val) => { + return !containsProfanity(val, mode); + }, + (val) => ({ + message: `Profanity detected. Please remove it. If you believe this is a mistake, please contact us. (${val})`, + }), + ); +} diff --git a/packages/tsup-config/package.json b/packages/tsup-config/package.json index 8d29d8b200ac..c94a6c0d4fec 100644 --- a/packages/tsup-config/package.json +++ b/packages/tsup-config/package.json @@ -17,8 +17,8 @@ }, "devDependencies": { "@monkeytype/typescript-config": "workspace:*", - "oxlint": "1.47.0", - "oxlint-tsgolint": "0.12.2", + "oxlint": "1.50.0", + "oxlint-tsgolint": "0.14.2", "typescript": "6.0.0-beta" }, "peerDependencies": { diff --git a/packages/util/package.json b/packages/util/package.json index 1f85236f644d..7d4445b717c2 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -20,8 +20,8 @@ "@monkeytype/tsup-config": "workspace:*", "@monkeytype/typescript-config": "workspace:*", "madge": "8.0.0", - "oxlint": "1.47.0", - "oxlint-tsgolint": "0.12.2", + "oxlint": "1.50.0", + "oxlint-tsgolint": "0.14.2", "tsup": "8.4.0", "typescript": "6.0.0-beta", "vitest": "4.0.15", diff --git a/packages/util/src/date-and-time.ts b/packages/util/src/date-and-time.ts index 6287b8827a97..f104b1821309 100644 --- a/packages/util/src/date-and-time.ts +++ b/packages/util/src/date-and-time.ts @@ -1,17 +1,6 @@ export const MILISECONDS_IN_HOUR = 3600000; export const MILLISECONDS_IN_DAY = 86400000; -/** - * Returns the current day's start timestamp adjusted by the hour offset. - * @param hourOffset The offset in hours. Default is 0. - * @returns The timestamp of the start of the current day adjusted by the hour offset. - */ -export function getCurrentDayTimestamp(hourOffset = 0): number { - const offsetMilis = hourOffset * MILISECONDS_IN_HOUR; - const currentTime = Date.now(); - return getStartOfDayTimestamp(currentTime, offsetMilis); -} - /** * Returns the timestamp of the start of the day for the given timestamp adjusted by the offset. * @param timestamp The timestamp for which to get the start of the day. @@ -25,6 +14,17 @@ export function getStartOfDayTimestamp( return timestamp - ((timestamp - offsetMilis) % MILLISECONDS_IN_DAY); } +/** + * Returns the current day's start timestamp adjusted by the hour offset. + * @param hourOffset The offset in hours. Default is 0. + * @returns The timestamp of the start of the current day adjusted by the hour offset. + */ +export function getCurrentDayTimestamp(hourOffset = 0): number { + const offsetMilis = hourOffset * MILISECONDS_IN_HOUR; + const currentTime = Date.now(); + return getStartOfDayTimestamp(currentTime, offsetMilis); +} + /** * Checks if the given timestamp is from yesterday, adjusted by the hour offset. * @param timestamp The timestamp to check. diff --git a/packages/util/src/json.ts b/packages/util/src/json.ts index abda9f1112bd..8f2dae029ab0 100644 --- a/packages/util/src/json.ts +++ b/packages/util/src/json.ts @@ -1,6 +1,12 @@ import { z, ZodIssue } from "zod"; import { tryCatchSync } from "./trycatch"; +function prettyErrorMessage(issue: ZodIssue | undefined): string { + if (issue === undefined) return ""; + const path = issue.path.length > 0 ? `"${issue.path.join(".")}" ` : ""; + return `${path}${issue.message.toLowerCase()}`; +} + /** * Parse a JSON string into an object and validate it against a schema * @param json JSON string @@ -67,9 +73,3 @@ export function parseWithSchema( return safeParseMigrated.data as T; } - -function prettyErrorMessage(issue: ZodIssue | undefined): string { - if (issue === undefined) return ""; - const path = issue.path.length > 0 ? `"${issue.path.join(".")}" ` : ""; - return `${path}${issue.message.toLowerCase()}`; -} diff --git a/packages/util/src/numbers.ts b/packages/util/src/numbers.ts index 14445a3fdfd9..ce29b3cb313e 100644 --- a/packages/util/src/numbers.ts +++ b/packages/util/src/numbers.ts @@ -22,16 +22,14 @@ export function roundTo2(num: number): number { } /** - * Calculates the standard deviation of an array of numbers. + * Calculates the mean (average) of an array of numbers. * @param array An array of numbers. - * @returns The standard deviation of the input array. + * @returns The mean of the input array. */ -export function stdDev(array: number[]): number { +export function mean(array: number[]): number { try { - const n = array.length; - const mean = array.reduce((a, b) => a + b) / n; - return Math.sqrt( - array.map((x) => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n, + return ( + array.reduce((previous, current) => (current += previous)) / array.length ); } catch (e) { return 0; @@ -39,14 +37,16 @@ export function stdDev(array: number[]): number { } /** - * Calculates the mean (average) of an array of numbers. + * Calculates the standard deviation of an array of numbers. * @param array An array of numbers. - * @returns The mean of the input array. + * @returns The standard deviation of the input array. */ -export function mean(array: number[]): number { +export function stdDev(array: number[]): number { try { - return ( - array.reduce((previous, current) => (current += previous)) / array.length + const n = array.length; + const meanValue = mean(array); + return Math.sqrt( + array.map((x) => Math.pow(x - meanValue, 2)).reduce((a, b) => a + b) / n, ); } catch (e) { return 0; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a64e0fb37411..1a63eaa93366 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,14 +36,14 @@ importers: specifier: 1.2.1 version: 1.2.1 oxfmt: - specifier: 0.32.0 - version: 0.32.0 + specifier: 0.35.0 + version: 0.35.0 oxlint: - specifier: 1.47.0 - version: 1.47.0(oxlint-tsgolint@0.12.2) + specifier: 1.50.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: - specifier: 0.12.2 - version: 0.12.2 + specifier: 0.14.2 + version: 0.14.2 prettier: specifier: 3.7.1 version: 3.7.1 @@ -224,7 +224,7 @@ importers: version: 10.0.0 '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) + version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) concurrently: specifier: 8.2.2 version: 8.2.2 @@ -232,11 +232,11 @@ importers: specifier: 2.0.2 version: 2.0.2 oxlint: - specifier: 1.47.0 - version: 1.47.0(oxlint-tsgolint@0.12.2) + specifier: 1.50.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: - specifier: 0.12.2 - version: 0.12.2 + specifier: 0.14.2 + version: 0.14.2 readline-sync: specifier: 1.4.10 version: 1.4.10 @@ -429,7 +429,7 @@ importers: version: 5.0.2 '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) + version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.31) @@ -467,11 +467,11 @@ importers: specifier: 8.0.1 version: 8.0.1 oxlint: - specifier: 1.47.0 - version: 1.47.0(oxlint-tsgolint@0.12.2) + specifier: 1.50.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: - specifier: 0.12.2 - version: 0.12.2 + specifier: 0.14.2 + version: 0.14.2 postcss: specifier: 8.4.31 version: 8.4.31 @@ -501,7 +501,7 @@ importers: version: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) vite-bundle-visualizer: specifier: 1.2.1 - version: 1.2.1(rollup@2.79.2) + version: 1.2.1(rollup@2.80.0) vite-plugin-filter-replace: specifier: 0.1.14 version: 0.1.14 @@ -546,11 +546,11 @@ importers: specifier: 8.0.0 version: 8.0.0(typescript@6.0.0-beta) oxlint: - specifier: 1.47.0 - version: 1.47.0(oxlint-tsgolint@0.12.2) + specifier: 1.50.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: - specifier: 0.12.2 - version: 0.12.2 + specifier: 0.14.2 + version: 0.14.2 tsup: specifier: 8.4.0 version: 8.4.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.16.2)(typescript@6.0.0-beta)(yaml@2.8.1) @@ -580,11 +580,11 @@ importers: specifier: 8.0.0 version: 8.0.0(typescript@6.0.0-beta) oxlint: - specifier: 1.47.0 - version: 1.47.0(oxlint-tsgolint@0.12.2) + specifier: 1.50.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: - specifier: 0.12.2 - version: 0.12.2 + specifier: 0.14.2 + version: 0.14.2 tsup: specifier: 8.4.0 version: 8.4.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.16.2)(typescript@6.0.0-beta)(yaml@2.8.1) @@ -617,11 +617,11 @@ importers: specifier: 3.1.4 version: 3.1.4 oxlint: - specifier: 1.47.0 - version: 1.47.0(oxlint-tsgolint@0.12.2) + specifier: 1.50.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: - specifier: 0.12.2 - version: 0.12.2 + specifier: 0.14.2 + version: 0.14.2 packages/schemas: dependencies: @@ -639,11 +639,11 @@ importers: specifier: 8.0.0 version: 8.0.0(typescript@6.0.0-beta) oxlint: - specifier: 1.47.0 - version: 1.47.0(oxlint-tsgolint@0.12.2) + specifier: 1.50.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: - specifier: 0.12.2 - version: 0.12.2 + specifier: 0.14.2 + version: 0.14.2 tsup: specifier: 8.4.0 version: 8.4.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.16.2)(typescript@6.0.0-beta)(yaml@2.8.1) @@ -664,11 +664,11 @@ importers: specifier: workspace:* version: link:../typescript-config oxlint: - specifier: 1.47.0 - version: 1.47.0(oxlint-tsgolint@0.12.2) + specifier: 1.50.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: - specifier: 0.12.2 - version: 0.12.2 + specifier: 0.14.2 + version: 0.14.2 typescript: specifier: 6.0.0-beta version: 6.0.0-beta @@ -687,11 +687,11 @@ importers: specifier: 8.0.0 version: 8.0.0(typescript@6.0.0-beta) oxlint: - specifier: 1.47.0 - version: 1.47.0(oxlint-tsgolint@0.12.2) + specifier: 1.50.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: - specifier: 0.12.2 - version: 0.12.2 + specifier: 0.14.2 + version: 0.14.2 tsup: specifier: 8.4.0 version: 8.4.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.16.2)(typescript@6.0.0-beta)(yaml@2.8.1) @@ -721,7 +721,7 @@ packages: resolution: {integrity: sha512-q0qHfnuNYVKu0Swrnnvfj9971AEyW7c8v9jCOZGCl5ZbyGMNG4RPyJkRcMi/JC8CRfdOe0IDfNm1nNsi2avprg==} peerDependencies: openapi3-ts: ^2.0.0 || ^3.0.0 - zod: 3.23.8 + zod: ^3.20.0 '@apideck/better-ajv-errors@0.3.6': resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} @@ -2731,260 +2731,260 @@ packages: resolution: {integrity: sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA==} engines: {node: '>=14'} - '@oxfmt/binding-android-arm-eabi@0.32.0': - resolution: {integrity: sha512-DpVyuVzgLH6/MvuB/YD3vXO9CN/o9EdRpA0zXwe/tagP6yfVSFkFWkPqTROdqp0mlzLH5Yl+/m+hOrcM601EbA==} + '@oxfmt/binding-android-arm-eabi@0.35.0': + resolution: {integrity: sha512-BaRKlM3DyG81y/xWTsE6gZiv89F/3pHe2BqX2H4JbiB8HNVlWWtplzgATAE5IDSdwChdeuWLDTQzJ92Lglw3ZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.32.0': - resolution: {integrity: sha512-w1cmNXf9zs0vKLuNgyUF3hZ9VUAS1hBmQGndYJv1OmcVqStBtRTRNxSWkWM0TMkrA9UbvIvM9gfN+ib4Wy6lkQ==} + '@oxfmt/binding-android-arm64@0.35.0': + resolution: {integrity: sha512-/O+EbuAJYs6nde/anv+aID6uHsGQApyE9JtYBo/79KyU8e6RBN3DMbT0ix97y1SOnCglurmL2iZ+hlohjP2PnQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.32.0': - resolution: {integrity: sha512-m6wQojz/hn94XdZugFPtdFbOvXbOSYEqPsR2gyLyID3BvcrC2QsJyT1o3gb4BZEGtZrG1NiKVGwDRLM0dHd2mg==} + '@oxfmt/binding-darwin-arm64@0.35.0': + resolution: {integrity: sha512-pGqRtqlNdn9d4VrmGUWVyQjkw79ryhI6je9y2jfqNUIZCfqceob+R97YYAoG7C5TFyt8ILdLVoN+L2vw/hSFyA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.32.0': - resolution: {integrity: sha512-hN966Uh6r3Erkg2MvRcrJWaB6QpBzP15rxWK/QtkUyD47eItJLsAQ2Hrm88zMIpFZ3COXZLuN3hqgSlUtvB0Xw==} + '@oxfmt/binding-darwin-x64@0.35.0': + resolution: {integrity: sha512-8GmsDcSozTPjrCJeGpp+sCmS9+9V5yRrdEZ1p/sTWxPG5nYeAfSLuS0nuEYjXSO+CtdSbStIW6dxa+4NM58yRw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.32.0': - resolution: {integrity: sha512-g5UZPGt8tJj263OfSiDGdS54HPa0KgFfspLVAUivVSdoOgsk6DkwVS9nO16xQTDztzBPGxTvrby8WuufF0g86Q==} + '@oxfmt/binding-freebsd-x64@0.35.0': + resolution: {integrity: sha512-QyfKfTe0ytHpFKHAcHCGQEzN45QSqq1AHJOYYxQMgLM3KY4xu8OsXHpCnINjDsV4XGnQzczJDU9e04Zmd8XqIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.32.0': - resolution: {integrity: sha512-F4ZY83/PVQo9ZJhtzoMqbmjqEyTVEZjbaw4x1RhzdfUhddB41ZB2Vrt4eZi7b4a4TP85gjPRHgQBeO0c1jbtaw==} + '@oxfmt/binding-linux-arm-gnueabihf@0.35.0': + resolution: {integrity: sha512-u+kv3JD6P3J38oOyUaiCqgY5TNESzBRZJ5lyZQ6c2czUW2v5SIN9E/KWWa9vxoc+P8AFXQFUVrdzGy1tK+nbPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.32.0': - resolution: {integrity: sha512-olR37eG16Lzdj9OBSvuoT5RxzgM5xfQEHm1OEjB3M7Wm4KWa5TDWIT13Aiy74GvAN77Hq1+kUKcGVJ/0ynf75g==} + '@oxfmt/binding-linux-arm-musleabihf@0.35.0': + resolution: {integrity: sha512-1NiZroCiV57I7Pf8kOH4XGR366kW5zir3VfSMBU2D0V14GpYjiYmPYFAoJboZvp8ACnZKUReWyMkNKSa5ad58A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.32.0': - resolution: {integrity: sha512-eZhk6AIjRCDeLoXYBhMW7qq/R1YyVi+tGnGfc3kp7AZQrMsFaWtP/bgdCJCTNXMpbMwymtVz0qhSQvR5w2sKcg==} + '@oxfmt/binding-linux-arm64-gnu@0.35.0': + resolution: {integrity: sha512-7Q0Xeg7ZnW2nxnZ4R7aF6DEbCFls4skgHZg+I63XitpNvJCbVIU8MFOTZlvZGRsY9+rPgWPQGeUpLHlyx0wvMA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxfmt/binding-linux-arm64-musl@0.32.0': - resolution: {integrity: sha512-UYiqO9MlipntFbdbUKOIo84vuyzrK4TVIs7Etat91WNMFSW54F6OnHq08xa5ZM+K9+cyYMgQPXvYCopuP+LyKw==} + '@oxfmt/binding-linux-arm64-musl@0.35.0': + resolution: {integrity: sha512-5Okqi+uhYFxwKz8hcnUftNNwdm8BCkf6GSCbcz9xJxYMm87k1E4p7PEmAAbhLTk7cjSdDre6TDL0pDzNX+Y22Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxfmt/binding-linux-ppc64-gnu@0.32.0': - resolution: {integrity: sha512-IDH/fxMv+HmKsMtsjEbXqhScCKDIYp38sgGEcn0QKeXMxrda67PPZA7HMfoUwEtFUG+jsO1XJxTrQsL+kQ90xQ==} + '@oxfmt/binding-linux-ppc64-gnu@0.35.0': + resolution: {integrity: sha512-9k66pbZQXM/lBJWys3Xbc5yhl4JexyfqkEf/tvtq8976VIJnLAAL3M127xHA3ifYSqxdVHfVGTg84eiBHCGcNw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@oxfmt/binding-linux-riscv64-gnu@0.32.0': - resolution: {integrity: sha512-bQFGPDa0buYWJFeK2I7ah8wRZjrAgamaG2OAGv+Ua5UMYEnHxmHcv+r8lWUUrwP2oqQGvp1SB8JIVtBbYuAueQ==} + '@oxfmt/binding-linux-riscv64-gnu@0.35.0': + resolution: {integrity: sha512-aUcY9ofKPtjO52idT6t0SAQvEF6ctjzUQa1lLp7GDsRpSBvuTrBQGeq0rYKz3gN8dMIQ7mtMdGD9tT4LhR8jAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxfmt/binding-linux-riscv64-musl@0.32.0': - resolution: {integrity: sha512-3vFp9DW1ItEKWltADzCFqG5N7rYFToT4ztlhg8wALoo2E2VhveLD88uAF4FF9AxD9NhgHDGmPCV+WZl/Qlj8cQ==} + '@oxfmt/binding-linux-riscv64-musl@0.35.0': + resolution: {integrity: sha512-C6yhY5Hvc2sGM+mCPek9ZLe5xRUOC/BvhAt2qIWFAeXMn4il04EYIjl3DsWiJr0xDMTJhvMOmD55xTRPlNp39w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxfmt/binding-linux-s390x-gnu@0.32.0': - resolution: {integrity: sha512-Fub2y8S9ImuPzAzpbgkoz/EVTWFFBolxFZYCMRhRZc8cJZI2gl/NlZswqhvJd/U0Jopnwgm/OJ2x128vVzFFWA==} + '@oxfmt/binding-linux-s390x-gnu@0.35.0': + resolution: {integrity: sha512-RG2hlvOMK4OMZpO3mt8MpxLQ0AAezlFqhn5mI/g5YrVbPFyoCv9a34AAvbSJS501ocOxlFIRcKEuw5hFvddf9g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - '@oxfmt/binding-linux-x64-gnu@0.32.0': - resolution: {integrity: sha512-XufwsnV3BF81zO2ofZvhT4FFaMmLTzZEZnC9HpFz/quPeg9C948+kbLlZnsfjmp+1dUxKMCpfmRMqOfF4AOLsA==} + '@oxfmt/binding-linux-x64-gnu@0.35.0': + resolution: {integrity: sha512-wzmh90Pwvqj9xOKHJjkQYBpydRkaXG77ZvDz+iFDRRQpnqIEqGm5gmim2s6vnZIkDGsvKCuTdtxm0GFmBjM1+w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxfmt/binding-linux-x64-musl@0.32.0': - resolution: {integrity: sha512-u2f9tC2qYfikKmA2uGpnEJgManwmk0ZXWs5BB4ga4KDu2JNLdA3i634DGHeMLK9wY9+iRf3t7IYpgN3OVFrvDw==} + '@oxfmt/binding-linux-x64-musl@0.35.0': + resolution: {integrity: sha512-+HCqYCJPCUy5I+b2cf+gUVaApfgtoQT3HdnSg/l7NIcLHOhKstlYaGyrFZLmUpQt4WkFbpGKZZayG6zjRU0KFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxfmt/binding-openharmony-arm64@0.32.0': - resolution: {integrity: sha512-5ZXb1wrdbZ1YFXuNXNUCePLlmLDy4sUt4evvzD4Cgumbup5wJgS9PIe5BOaLywUg9f1wTH6lwltj3oT7dFpIGA==} + '@oxfmt/binding-openharmony-arm64@0.35.0': + resolution: {integrity: sha512-kFYmWfR9YL78XyO5ws+1dsxNvZoD973qfVMNFOS4e9bcHXGF7DvGC2tY5UDFwyMCeB33t3sDIuGONKggnVNSJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.32.0': - resolution: {integrity: sha512-IGSMm/Agq+IA0++aeAV/AGPfjcBdjrsajB5YpM3j7cMcwoYgUTi/k2YwAmsHH3ueZUE98pSM/Ise2J7HtyRjOA==} + '@oxfmt/binding-win32-arm64-msvc@0.35.0': + resolution: {integrity: sha512-uD/NGdM65eKNCDGyTGdO8e9n3IHX+wwuorBvEYrPJXhDXL9qz6gzddmXH8EN04ejUXUujlq4FsoSeCfbg0Y+Jg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.32.0': - resolution: {integrity: sha512-H/9gsuqXmceWMsVoCPZhtJG2jLbnBeKr7xAXm2zuKpxLVF7/2n0eh7ocOLB6t+L1ARE76iORuUsRMnuGjj8FjQ==} + '@oxfmt/binding-win32-ia32-msvc@0.35.0': + resolution: {integrity: sha512-oSRD2k8J2uxYDEKR2nAE/YTY9PobOEnhZgCmspHu0+yBQ665yH8lFErQVSTE7fcGJmJp/cC6322/gc8VFuQf7g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.32.0': - resolution: {integrity: sha512-fF8VIOeligq+mA6KfKvWtFRXbf0EFy73TdR6ZnNejdJRM8VWN1e3QFhYgIwD7O8jBrQsd7EJbUpkAr/YlUOokg==} + '@oxfmt/binding-win32-x64-msvc@0.35.0': + resolution: {integrity: sha512-WCDJjlS95NboR0ugI2BEwzt1tYvRDorDRM9Lvctls1SLyKYuNRCyrPwp1urUPFBnwgBNn9p2/gnmo7gFMySRoQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint-tsgolint/darwin-arm64@0.12.2': - resolution: {integrity: sha512-XIfavTqkJPGYi/98z7ZCkZvXq2AccMAAB0iwvKDRTQqiweMXVUyeUdx46phCHHH1PgmIVJtVfysThkHq2xCyrw==} + '@oxlint-tsgolint/darwin-arm64@0.14.2': + resolution: {integrity: sha512-03WxIXguCXf1pTmoG2C6vqRcbrU9GaJCW6uTIiQdIQq4BrJnVWZv99KEUQQRkuHK78lOLa9g7B4K58NcVcB54g==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@0.12.2': - resolution: {integrity: sha512-tytsvP6zmNShRNDo4GgQartOXmd4GPd+TylCUMdO/iWl9PZVOgRyswWbYVTNgn85Cib/aY2q3Uu+jOw+QlbxvQ==} + '@oxlint-tsgolint/darwin-x64@0.14.2': + resolution: {integrity: sha512-ksMLl1cIWz3Jw+U79BhyCPdvohZcJ/xAKri5bpT6oeEM2GVnQCHBk/KZKlYrd7hZUTxz0sLnnKHE11XFnLASNQ==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@0.12.2': - resolution: {integrity: sha512-3W38yJuF7taEquhEuD6mYQyCeWNAlc1pNPjFkspkhLKZVgbrhDA4V6fCxLDDRvrTHde0bXPmFvuPlUq5pSePgA==} + '@oxlint-tsgolint/linux-arm64@0.14.2': + resolution: {integrity: sha512-2BgR535w7GLxBCyQD5DR3dBzbAgiBbG5QX1kAEVzOmWxJhhGxt5lsHdHebRo7ilukYLpBDkerz0mbMErblghCQ==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@0.12.2': - resolution: {integrity: sha512-EjcEspeeV0NmaopEp4wcN5ntQP9VCJJDrTvzOjMP4W6ajz18M+pni9vkKvmcPIpRa/UmWobeFgKoVd/KGueeuQ==} + '@oxlint-tsgolint/linux-x64@0.14.2': + resolution: {integrity: sha512-TUHFyVHfbbGtnTQZbUFgwvv3NzXBgzNLKdMUJw06thpiC7u5OW5qdk4yVXIC/xeVvdl3NAqTfcT4sA32aiMubg==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@0.12.2': - resolution: {integrity: sha512-a9L7iA5K/Ht/i8d9+7RTp6hbPa4cyXP0MdySVXAO6vczpL/4ildfY9Hr2m2wqL12uK6xe/uVABpVTrqay/wV+g==} + '@oxlint-tsgolint/win32-arm64@0.14.2': + resolution: {integrity: sha512-OfYHa/irfVggIFEC4TbawsI7Hwrttppv//sO/e00tu4b2QRga7+VHAwtCkSFWSr0+BsO4InRYVA0+pun5BinpQ==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@0.12.2': - resolution: {integrity: sha512-Cvt40UbTf5ib12DjGN+mMGOnjWa4Bc6Y7KEaXXp9qzckvs3HpNk2wSwMV3gnuR8Ipx4hkzkzrgzD0BAUsySAfA==} + '@oxlint-tsgolint/win32-x64@0.14.2': + resolution: {integrity: sha512-5gxwbWYE2pP+pzrO4SEeYvLk4N609eAe18rVXUx+en3qtHBkU8VM2jBmMcZdIHn+G05leu4pYvwAvw6tvT9VbA==} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.47.0': - resolution: {integrity: sha512-UHqo3te9K/fh29brCuQdHjN+kfpIi9cnTPABuD5S9wb9ykXYRGTOOMVuSV/CK43sOhU4wwb2nT1RVjcbrrQjFw==} + '@oxlint/binding-android-arm-eabi@1.50.0': + resolution: {integrity: sha512-G7MRGk/6NCe+L8ntonRdZP7IkBfEpiZ/he3buLK6JkLgMHgJShXZ+BeOwADmspXez7U7F7L1Anf4xLSkLHiGTg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.47.0': - resolution: {integrity: sha512-xh02lsTF1TAkR+SZrRMYHR/xCx8Wg2MAHxJNdHVpAKELh9/yE9h4LJeqAOBbIb3YYn8o/D97U9VmkvkfJfrHfw==} + '@oxlint/binding-android-arm64@1.50.0': + resolution: {integrity: sha512-GeSuMoJWCVpovJi/e3xDSNgjeR8WEZ6MCXL6EtPiCIM2NTzv7LbflARINTXTJy2oFBYyvdf/l2PwHzYo6EdXvg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.47.0': - resolution: {integrity: sha512-OSOfNJqabOYbkyQDGT5pdoL+05qgyrmlQrvtCO58M4iKGEQ/xf3XkkKj7ws+hO+k8Y4VF4zGlBsJlwqy7qBcHA==} + '@oxlint/binding-darwin-arm64@1.50.0': + resolution: {integrity: sha512-w3SY5YtxGnxCHPJ8Twl3KmS9oja1gERYk3AMoZ7Hv8P43ZtB6HVfs02TxvarxfL214Tm3uzvc2vn+DhtUNeKnw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.47.0': - resolution: {integrity: sha512-hP2bOI4IWNS+F6pVXWtRshSTuJ1qCRZgDgVUg6EBUqsRy+ExkEPJkx+YmIuxgdCduYK1LKptLNFuQLJP8voPbQ==} + '@oxlint/binding-darwin-x64@1.50.0': + resolution: {integrity: sha512-hNfogDqy7tvmllXKBSlHo6k5x7dhTUVOHbMSE15CCAcXzmqf5883aPvBYPOq9AE7DpDUQUZ1kVE22YbiGW+tuw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.47.0': - resolution: {integrity: sha512-F55jIEH5xmGu7S661Uho8vGiLFk0bY3A/g4J8CTKiLJnYu/PSMZ2WxFoy5Hji6qvFuujrrM9Q8XXbMO0fKOYPg==} + '@oxlint/binding-freebsd-x64@1.50.0': + resolution: {integrity: sha512-ykZevOWEyu0nsxolA911ucxpEv0ahw8jfEeGWOwwb/VPoE4xoexuTOAiPNlWZNJqANlJl7yp8OyzCtXTUAxotw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.47.0': - resolution: {integrity: sha512-wxmOn/wns/WKPXUC1fo5mu9pMZPVOu8hsynaVDrgmmXMdHKS7on6bA5cPauFFN9tJXNdsjW26AK9lpfu3IfHBQ==} + '@oxlint/binding-linux-arm-gnueabihf@1.50.0': + resolution: {integrity: sha512-hif3iDk7vo5GGJ4OLCCZAf2vjnU9FztGw4L0MbQL0M2iY9LKFtDMMiQAHmkF0PQGQMVbTYtPdXCLKVgdkiqWXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.47.0': - resolution: {integrity: sha512-KJTmVIA/GqRlM2K+ZROH30VMdydEU7bDTY35fNg3tOPzQRIs2deLZlY/9JWwdWo1F/9mIYmpbdCmPqtKhWNOPg==} + '@oxlint/binding-linux-arm-musleabihf@1.50.0': + resolution: {integrity: sha512-dVp9iSssiGAnTNey2Ruf6xUaQhdnvcFOJyRWd/mu5o2jVbFK15E5fbWGeFRfmuobu5QXuROtFga44+7DOS3PLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.47.0': - resolution: {integrity: sha512-PF7ELcFg1GVlS0X0ZB6aWiXobjLrAKer3T8YEkwIoO8RwWiAMkL3n3gbleg895BuZkHVlJ2kPRUwfrhHrVkD1A==} + '@oxlint/binding-linux-arm64-gnu@1.50.0': + resolution: {integrity: sha512-1cT7yz2HA910CKA9NkH1ZJo50vTtmND2fkoW1oyiSb0j6WvNtJ0Wx2zoySfXWc/c+7HFoqRK5AbEoL41LOn9oA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxlint/binding-linux-arm64-musl@1.47.0': - resolution: {integrity: sha512-4BezLRO5cu0asf0Jp1gkrnn2OHiXrPPPEfBTxq1k5/yJ2zdGGTmZxHD2KF2voR23wb8Elyu3iQawXo7wvIZq0Q==} + '@oxlint/binding-linux-arm64-musl@1.50.0': + resolution: {integrity: sha512-++B3k/HEPFVlj89cOz8kWfQccMZB/aWL9AhsW7jPIkG++63Mpwb2cE9XOEsd0PATbIan78k2Gky+09uWM1d/gQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxlint/binding-linux-ppc64-gnu@1.47.0': - resolution: {integrity: sha512-aI5ds9jq2CPDOvjeapiIj48T/vlWp+f4prkxs+FVzrmVN9BWIj0eqeJ/hV8WgXg79HVMIz9PU6deI2ki09bR1w==} + '@oxlint/binding-linux-ppc64-gnu@1.50.0': + resolution: {integrity: sha512-Z9b/KpFMkx66w3gVBqjIC1AJBTZAGoI9+U+K5L4QM0CB/G0JSNC1es9b3Y0Vcrlvtdn8A+IQTkYjd/Q0uCSaZw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@oxlint/binding-linux-riscv64-gnu@1.47.0': - resolution: {integrity: sha512-mO7ycp9Elvgt5EdGkQHCwJA6878xvo9tk+vlMfT1qg++UjvOMB8INsOCQIOH2IKErF/8/P21LULkdIrocMw9xA==} + '@oxlint/binding-linux-riscv64-gnu@1.50.0': + resolution: {integrity: sha512-jvmuIw8wRSohsQlFNIST5uUwkEtEJmOQYr33bf/K2FrFPXHhM4KqGekI3ShYJemFS/gARVacQFgBzzJKCAyJjg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxlint/binding-linux-riscv64-musl@1.47.0': - resolution: {integrity: sha512-24D0wsYT/7hDFn3Ow32m3/+QT/1ZwrUhShx4/wRDAmz11GQHOZ1k+/HBuK/MflebdnalmXWITcPEy4BWTi7TCA==} + '@oxlint/binding-linux-riscv64-musl@1.50.0': + resolution: {integrity: sha512-x+UrN47oYNh90nmAAyql8eQaaRpHbDPu5guasDg10+OpszUQ3/1+1J6zFMmV4xfIEgTcUXG/oI5fxJhF4eWCNA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxlint/binding-linux-s390x-gnu@1.47.0': - resolution: {integrity: sha512-8tPzPne882mtML/uy3mApvdCyuVOpthJ7xUv3b67gVfz63hOOM/bwO0cysSkPyYYFDFRn6/FnUb7Jhmsesntvg==} + '@oxlint/binding-linux-s390x-gnu@1.50.0': + resolution: {integrity: sha512-i/JLi2ljLUIVfekMj4ISmdt+Hn11wzYUdRRrkVUYsCWw7zAy5xV7X9iA+KMyM156LTFympa7s3oKBjuCLoTAUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - '@oxlint/binding-linux-x64-gnu@1.47.0': - resolution: {integrity: sha512-q58pIyGIzeffEBhEgbRxLFHmHfV9m7g1RnkLiahQuEvyjKNiJcvdHOwKH2BdgZxdzc99Cs6hF5xTa86X40WzPw==} + '@oxlint/binding-linux-x64-gnu@1.50.0': + resolution: {integrity: sha512-/C7brhn6c6UUPccgSPCcpLQXcp+xKIW/3sji/5VZ8/OItL3tQ2U7KalHz887UxxSQeEOmd1kY6lrpuwFnmNqOA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxlint/binding-linux-x64-musl@1.47.0': - resolution: {integrity: sha512-e7DiLZtETZUCwTa4EEHg9G+7g3pY+afCWXvSeMG7m0TQ29UHHxMARPaEQUE4mfKgSqIWnJaUk2iZzRPMRdga5g==} + '@oxlint/binding-linux-x64-musl@1.50.0': + resolution: {integrity: sha512-oDR1f+bGOYU8LfgtEW8XtotWGB63ghtcxk5Jm6IDTCk++rTA/IRMsjOid2iMd+1bW+nP9Mdsmcdc7VbPD3+iyQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxlint/binding-openharmony-arm64@1.47.0': - resolution: {integrity: sha512-3AFPfQ0WKMleT/bKd7zsks3xoawtZA6E/wKf0DjwysH7wUiMMJkNKXOzYq1R/00G98JFgSU1AkrlOQrSdNNhlg==} + '@oxlint/binding-openharmony-arm64@1.50.0': + resolution: {integrity: sha512-4CmRGPp5UpvXyu4jjP9Tey/SrXDQLRvZXm4pb4vdZBxAzbFZkCyh0KyRy4txld/kZKTJlW4TO8N1JKrNEk+mWw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.47.0': - resolution: {integrity: sha512-cLMVVM6TBxp+N7FldQJ2GQnkcLYEPGgiuEaXdvhgvSgODBk9ov3jed+khIXSAWtnFOW0wOnG3RjwqPh0rCuheA==} + '@oxlint/binding-win32-arm64-msvc@1.50.0': + resolution: {integrity: sha512-Fq0M6vsGcFsSfeuWAACDhd5KJrO85ckbEfe1EGuBj+KPyJz7KeWte2fSFrFGmNKNXyhEMyx4tbgxiWRujBM2KQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.47.0': - resolution: {integrity: sha512-VpFOSzvTnld77/Edje3ZdHgZWnlTb5nVWXyTgjD3/DKF/6t5bRRbwn3z77zOdnGy44xAMvbyAwDNOSeOdVUmRA==} + '@oxlint/binding-win32-ia32-msvc@1.50.0': + resolution: {integrity: sha512-qTdWR9KwY/vxJGhHVIZG2eBOhidOQvOwzDxnX+jhW/zIVacal1nAhR8GLkiywW8BIFDkQKXo/zOfT+/DY+ns/w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.47.0': - resolution: {integrity: sha512-+q8IWptxXx2HMTM6JluR67284t0h8X/oHJgqpxH1siowxPMqZeIpAcWCUq+tY+Rv2iQK8TUugjZnSBQAVV5CmA==} + '@oxlint/binding-win32-x64-msvc@1.50.0': + resolution: {integrity: sha512-682t7npLC4G2Ca+iNlI9fhAKTcFPYYXJjwoa88H4q+u5HHHlsnL/gHULapX3iqp+A8FIJbgdylL5KMYo2LaluQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -4027,6 +4027,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} @@ -4299,6 +4304,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + balloon-css@1.2.0: resolution: {integrity: sha512-urXwkHgwp6GsXVF+it01485Z2Cj4pnW02ICnM0TemOlkKmCNnDLmyy+ZZiRXBpwldUXO+aRNr7Hdia4CBvXJ5A==} @@ -4335,12 +4344,13 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.11: - resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + baseline-browser-mapping@2.10.0: + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + engines: {node: '>=6.0.0'} hasBin: true - baseline-browser-mapping@2.9.19: - resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + baseline-browser-mapping@2.9.11: + resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true basic-auth-connect@1.0.0: @@ -4414,6 +4424,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.3: + resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -4549,8 +4563,8 @@ packages: caniuse-lite@1.0.30001762: resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==} - caniuse-lite@1.0.30001769: - resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} + caniuse-lite@1.0.30001774: + resolution: {integrity: sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==} canvas-confetti@1.5.1: resolution: {integrity: sha512-Ncz+oZJP6OvY7ti4E1slxVlyAV/3g7H7oQtcCDXgwGgARxPnwYY9PW5Oe+I8uvspYNtuHviAdgA0LfcKFWJfpg==} @@ -5387,8 +5401,8 @@ packages: electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} - electron-to-chromium@1.5.286: - resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + electron-to-chromium@1.5.302: + resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} electron-to-chromium@1.5.5: resolution: {integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==} @@ -5751,8 +5765,9 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.5: + resolution: {integrity: sha512-ct/ckWBV/9Dg3MlvCXsLcSUyoWwv9mCKqlhLNB2DAuXR/NZolSXlQqP5dyy6guWlPXBhodZyZ5lGPQcbQDxrEQ==} + engines: {node: 20 || >=22} filesize@6.4.0: resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} @@ -7372,6 +7387,10 @@ packages: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} + minimatch@10.2.2: + resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -7963,21 +7982,21 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - oxfmt@0.32.0: - resolution: {integrity: sha512-KArQhGzt/Y8M1eSAX98Y8DLtGYYDQhkR55THUPY5VNcpFQ+9nRZkL3ULXhagHMD2hIvjy8JSeEQEP5/yYJSrLA==} + oxfmt@0.35.0: + resolution: {integrity: sha512-QYeXWkP+aLt7utt5SLivNIk09glWx9QE235ODjgcEZ3sd1VMaUBSpLymh6ZRCA76gD2rMP4bXanUz/fx+nLM9Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - oxlint-tsgolint@0.12.2: - resolution: {integrity: sha512-IFiOhYZfSgiHbBznTZOhFpEHpsZFSP0j7fVRake03HEkgH0YljnTFDNoRkGWsTrnrHr7nRIomSsF4TnCI/O+kQ==} + oxlint-tsgolint@0.14.2: + resolution: {integrity: sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==} hasBin: true - oxlint@1.47.0: - resolution: {integrity: sha512-v7xkK1iv1qdvTxJGclM97QzN8hHs5816AneFAQ0NGji1BMUquhiDAhXpMwp8+ls16uRVJtzVHxP9pAAXblDeGA==} + oxlint@1.50.0: + resolution: {integrity: sha512-iSJ4IZEICBma8cZX7kxIIz9PzsYLF2FaLAYN6RKu7VwRVKdu7RIgpP99bTZaGl//Yao7fsaGZLSEo5xBrI5ReQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.11.2' + oxlint-tsgolint: '>=0.14.1' peerDependenciesMeta: oxlint-tsgolint: optional: true @@ -8702,8 +8721,8 @@ packages: rollup: optional: true - rollup@2.79.2: - resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + rollup@2.80.0: + resolution: {integrity: sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==} engines: {node: '>=10.0.0'} hasBin: true @@ -12720,136 +12739,136 @@ snapshots: '@opentelemetry/semantic-conventions@1.34.0': {} - '@oxfmt/binding-android-arm-eabi@0.32.0': + '@oxfmt/binding-android-arm-eabi@0.35.0': optional: true - '@oxfmt/binding-android-arm64@0.32.0': + '@oxfmt/binding-android-arm64@0.35.0': optional: true - '@oxfmt/binding-darwin-arm64@0.32.0': + '@oxfmt/binding-darwin-arm64@0.35.0': optional: true - '@oxfmt/binding-darwin-x64@0.32.0': + '@oxfmt/binding-darwin-x64@0.35.0': optional: true - '@oxfmt/binding-freebsd-x64@0.32.0': + '@oxfmt/binding-freebsd-x64@0.35.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.32.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.35.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.32.0': + '@oxfmt/binding-linux-arm-musleabihf@0.35.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.32.0': + '@oxfmt/binding-linux-arm64-gnu@0.35.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.32.0': + '@oxfmt/binding-linux-arm64-musl@0.35.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.32.0': + '@oxfmt/binding-linux-ppc64-gnu@0.35.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.32.0': + '@oxfmt/binding-linux-riscv64-gnu@0.35.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.32.0': + '@oxfmt/binding-linux-riscv64-musl@0.35.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.32.0': + '@oxfmt/binding-linux-s390x-gnu@0.35.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.32.0': + '@oxfmt/binding-linux-x64-gnu@0.35.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.32.0': + '@oxfmt/binding-linux-x64-musl@0.35.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.32.0': + '@oxfmt/binding-openharmony-arm64@0.35.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.32.0': + '@oxfmt/binding-win32-arm64-msvc@0.35.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.32.0': + '@oxfmt/binding-win32-ia32-msvc@0.35.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.32.0': + '@oxfmt/binding-win32-x64-msvc@0.35.0': optional: true - '@oxlint-tsgolint/darwin-arm64@0.12.2': + '@oxlint-tsgolint/darwin-arm64@0.14.2': optional: true - '@oxlint-tsgolint/darwin-x64@0.12.2': + '@oxlint-tsgolint/darwin-x64@0.14.2': optional: true - '@oxlint-tsgolint/linux-arm64@0.12.2': + '@oxlint-tsgolint/linux-arm64@0.14.2': optional: true - '@oxlint-tsgolint/linux-x64@0.12.2': + '@oxlint-tsgolint/linux-x64@0.14.2': optional: true - '@oxlint-tsgolint/win32-arm64@0.12.2': + '@oxlint-tsgolint/win32-arm64@0.14.2': optional: true - '@oxlint-tsgolint/win32-x64@0.12.2': + '@oxlint-tsgolint/win32-x64@0.14.2': optional: true - '@oxlint/binding-android-arm-eabi@1.47.0': + '@oxlint/binding-android-arm-eabi@1.50.0': optional: true - '@oxlint/binding-android-arm64@1.47.0': + '@oxlint/binding-android-arm64@1.50.0': optional: true - '@oxlint/binding-darwin-arm64@1.47.0': + '@oxlint/binding-darwin-arm64@1.50.0': optional: true - '@oxlint/binding-darwin-x64@1.47.0': + '@oxlint/binding-darwin-x64@1.50.0': optional: true - '@oxlint/binding-freebsd-x64@1.47.0': + '@oxlint/binding-freebsd-x64@1.50.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.47.0': + '@oxlint/binding-linux-arm-gnueabihf@1.50.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.47.0': + '@oxlint/binding-linux-arm-musleabihf@1.50.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.47.0': + '@oxlint/binding-linux-arm64-gnu@1.50.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.47.0': + '@oxlint/binding-linux-arm64-musl@1.50.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.47.0': + '@oxlint/binding-linux-ppc64-gnu@1.50.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.47.0': + '@oxlint/binding-linux-riscv64-gnu@1.50.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.47.0': + '@oxlint/binding-linux-riscv64-musl@1.50.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.47.0': + '@oxlint/binding-linux-s390x-gnu@1.50.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.47.0': + '@oxlint/binding-linux-x64-gnu@1.50.0': optional: true - '@oxlint/binding-linux-x64-musl@1.47.0': + '@oxlint/binding-linux-x64-musl@1.50.0': optional: true - '@oxlint/binding-openharmony-arm64@1.47.0': + '@oxlint/binding-openharmony-arm64@1.50.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.47.0': + '@oxlint/binding-win32-arm64-msvc@1.50.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.47.0': + '@oxlint/binding-win32-ia32-msvc@1.50.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.47.0': + '@oxlint/binding-win32-x64-msvc@1.50.0': optional: true '@oxlint/plugins@1.43.0': {} @@ -12994,55 +13013,55 @@ snapshots: transitivePeerDependencies: - ajv - '@rollup/plugin-babel@5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.79.2)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.80.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) - rollup: 2.79.2 + '@rollup/pluginutils': 3.1.0(rollup@2.80.0) + rollup: 2.80.0 optionalDependencies: '@types/babel__core': 7.20.5 transitivePeerDependencies: - supports-color - '@rollup/plugin-node-resolve@15.3.1(rollup@2.79.2)': + '@rollup/plugin-node-resolve@15.3.1(rollup@2.80.0)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + '@rollup/pluginutils': 5.3.0(rollup@2.80.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 2.79.2 + rollup: 2.80.0 - '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': + '@rollup/plugin-replace@2.4.2(rollup@2.80.0)': dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + '@rollup/pluginutils': 3.1.0(rollup@2.80.0) magic-string: 0.25.9 - rollup: 2.79.2 + rollup: 2.80.0 - '@rollup/plugin-terser@0.4.4(rollup@2.79.2)': + '@rollup/plugin-terser@0.4.4(rollup@2.80.0)': dependencies: serialize-javascript: 6.0.2 smob: 1.6.1 terser: 5.46.0 optionalDependencies: - rollup: 2.79.2 + rollup: 2.80.0 - '@rollup/pluginutils@3.1.0(rollup@2.79.2)': + '@rollup/pluginutils@3.1.0(rollup@2.80.0)': dependencies: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: 2.79.2 + rollup: 2.80.0 - '@rollup/pluginutils@5.3.0(rollup@2.79.2)': + '@rollup/pluginutils@5.3.0(rollup@2.80.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 2.79.2 + rollup: 2.80.0 '@rollup/rollup-android-arm-eabi@4.40.0': optional: true @@ -13796,7 +13815,7 @@ snapshots: '@typescript-eslint/types': 8.52.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -13809,11 +13828,11 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) + vitest: 4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -13826,7 +13845,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) + vitest: 4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -13946,6 +13965,8 @@ snapshots: acorn@8.15.0: {} + acorn@8.16.0: {} + add-stream@1.0.0: {} agent-base@6.0.2: @@ -14240,6 +14261,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + balloon-css@1.2.0: {} bare-events@2.6.0: @@ -14269,9 +14292,9 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.9.11: {} + baseline-browser-mapping@2.10.0: {} - baseline-browser-mapping@2.9.19: {} + baseline-browser-mapping@2.9.11: {} basic-auth-connect@1.0.0: {} @@ -14392,6 +14415,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.3: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -14420,9 +14447,9 @@ snapshots: browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001769 - electron-to-chromium: 1.5.286 + baseline-browser-mapping: 2.10.0 + caniuse-lite: 1.0.30001774 + electron-to-chromium: 1.5.302 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -14551,7 +14578,7 @@ snapshots: caniuse-lite@1.0.30001762: {} - caniuse-lite@1.0.30001769: {} + caniuse-lite@1.0.30001774: {} canvas-confetti@1.5.1: {} @@ -15401,7 +15428,7 @@ snapshots: electron-to-chromium@1.5.267: {} - electron-to-chromium@1.5.286: {} + electron-to-chromium@1.5.302: {} electron-to-chromium@1.5.5: {} @@ -15989,9 +16016,9 @@ snapshots: dependencies: flat-cache: 4.0.1 - filelist@1.0.4: + filelist@1.0.5: dependencies: - minimatch: 5.1.6 + minimatch: 10.2.2 filesize@6.4.0: {} @@ -17169,7 +17196,7 @@ snapshots: jake@10.9.4: dependencies: async: 3.2.6 - filelist: 1.0.4 + filelist: 1.0.5 picocolors: 1.1.1 jest-diff@29.7.0: @@ -17840,6 +17867,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimatch@10.2.2: + dependencies: + brace-expansion: 5.0.3 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -18640,61 +18671,61 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxfmt@0.32.0: + oxfmt@0.35.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.32.0 - '@oxfmt/binding-android-arm64': 0.32.0 - '@oxfmt/binding-darwin-arm64': 0.32.0 - '@oxfmt/binding-darwin-x64': 0.32.0 - '@oxfmt/binding-freebsd-x64': 0.32.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.32.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.32.0 - '@oxfmt/binding-linux-arm64-gnu': 0.32.0 - '@oxfmt/binding-linux-arm64-musl': 0.32.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.32.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.32.0 - '@oxfmt/binding-linux-riscv64-musl': 0.32.0 - '@oxfmt/binding-linux-s390x-gnu': 0.32.0 - '@oxfmt/binding-linux-x64-gnu': 0.32.0 - '@oxfmt/binding-linux-x64-musl': 0.32.0 - '@oxfmt/binding-openharmony-arm64': 0.32.0 - '@oxfmt/binding-win32-arm64-msvc': 0.32.0 - '@oxfmt/binding-win32-ia32-msvc': 0.32.0 - '@oxfmt/binding-win32-x64-msvc': 0.32.0 - - oxlint-tsgolint@0.12.2: + '@oxfmt/binding-android-arm-eabi': 0.35.0 + '@oxfmt/binding-android-arm64': 0.35.0 + '@oxfmt/binding-darwin-arm64': 0.35.0 + '@oxfmt/binding-darwin-x64': 0.35.0 + '@oxfmt/binding-freebsd-x64': 0.35.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.35.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.35.0 + '@oxfmt/binding-linux-arm64-gnu': 0.35.0 + '@oxfmt/binding-linux-arm64-musl': 0.35.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.35.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.35.0 + '@oxfmt/binding-linux-riscv64-musl': 0.35.0 + '@oxfmt/binding-linux-s390x-gnu': 0.35.0 + '@oxfmt/binding-linux-x64-gnu': 0.35.0 + '@oxfmt/binding-linux-x64-musl': 0.35.0 + '@oxfmt/binding-openharmony-arm64': 0.35.0 + '@oxfmt/binding-win32-arm64-msvc': 0.35.0 + '@oxfmt/binding-win32-ia32-msvc': 0.35.0 + '@oxfmt/binding-win32-x64-msvc': 0.35.0 + + oxlint-tsgolint@0.14.2: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 0.12.2 - '@oxlint-tsgolint/darwin-x64': 0.12.2 - '@oxlint-tsgolint/linux-arm64': 0.12.2 - '@oxlint-tsgolint/linux-x64': 0.12.2 - '@oxlint-tsgolint/win32-arm64': 0.12.2 - '@oxlint-tsgolint/win32-x64': 0.12.2 - - oxlint@1.47.0(oxlint-tsgolint@0.12.2): + '@oxlint-tsgolint/darwin-arm64': 0.14.2 + '@oxlint-tsgolint/darwin-x64': 0.14.2 + '@oxlint-tsgolint/linux-arm64': 0.14.2 + '@oxlint-tsgolint/linux-x64': 0.14.2 + '@oxlint-tsgolint/win32-arm64': 0.14.2 + '@oxlint-tsgolint/win32-x64': 0.14.2 + + oxlint@1.50.0(oxlint-tsgolint@0.14.2): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.47.0 - '@oxlint/binding-android-arm64': 1.47.0 - '@oxlint/binding-darwin-arm64': 1.47.0 - '@oxlint/binding-darwin-x64': 1.47.0 - '@oxlint/binding-freebsd-x64': 1.47.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.47.0 - '@oxlint/binding-linux-arm-musleabihf': 1.47.0 - '@oxlint/binding-linux-arm64-gnu': 1.47.0 - '@oxlint/binding-linux-arm64-musl': 1.47.0 - '@oxlint/binding-linux-ppc64-gnu': 1.47.0 - '@oxlint/binding-linux-riscv64-gnu': 1.47.0 - '@oxlint/binding-linux-riscv64-musl': 1.47.0 - '@oxlint/binding-linux-s390x-gnu': 1.47.0 - '@oxlint/binding-linux-x64-gnu': 1.47.0 - '@oxlint/binding-linux-x64-musl': 1.47.0 - '@oxlint/binding-openharmony-arm64': 1.47.0 - '@oxlint/binding-win32-arm64-msvc': 1.47.0 - '@oxlint/binding-win32-ia32-msvc': 1.47.0 - '@oxlint/binding-win32-x64-msvc': 1.47.0 - oxlint-tsgolint: 0.12.2 + '@oxlint/binding-android-arm-eabi': 1.50.0 + '@oxlint/binding-android-arm64': 1.50.0 + '@oxlint/binding-darwin-arm64': 1.50.0 + '@oxlint/binding-darwin-x64': 1.50.0 + '@oxlint/binding-freebsd-x64': 1.50.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.50.0 + '@oxlint/binding-linux-arm-musleabihf': 1.50.0 + '@oxlint/binding-linux-arm64-gnu': 1.50.0 + '@oxlint/binding-linux-arm64-musl': 1.50.0 + '@oxlint/binding-linux-ppc64-gnu': 1.50.0 + '@oxlint/binding-linux-riscv64-gnu': 1.50.0 + '@oxlint/binding-linux-riscv64-musl': 1.50.0 + '@oxlint/binding-linux-s390x-gnu': 1.50.0 + '@oxlint/binding-linux-x64-gnu': 1.50.0 + '@oxlint/binding-linux-x64-musl': 1.50.0 + '@oxlint/binding-openharmony-arm64': 1.50.0 + '@oxlint/binding-win32-arm64-msvc': 1.50.0 + '@oxlint/binding-win32-ia32-msvc': 1.50.0 + '@oxlint/binding-win32-x64-msvc': 1.50.0 + oxlint-tsgolint: 0.14.2 p-defer@3.0.0: {} @@ -19446,16 +19477,16 @@ snapshots: dependencies: glob: 10.4.5 - rollup-plugin-visualizer@5.14.0(rollup@2.79.2): + rollup-plugin-visualizer@5.14.0(rollup@2.80.0): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rollup: 2.79.2 + rollup: 2.80.0 - rollup@2.79.2: + rollup@2.80.0: optionalDependencies: fsevents: 2.3.3 @@ -20373,7 +20404,7 @@ snapshots: terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -20870,11 +20901,11 @@ snapshots: vary@1.1.2: {} - vite-bundle-visualizer@1.2.1(rollup@2.79.2): + vite-bundle-visualizer@1.2.1(rollup@2.80.0): dependencies: cac: 6.7.14 import-from-esm: 1.3.4 - rollup-plugin-visualizer: 5.14.0(rollup@2.79.2) + rollup-plugin-visualizer: 5.14.0(rollup@2.80.0) tmp: 0.2.5 transitivePeerDependencies: - rolldown @@ -21252,10 +21283,10 @@ snapshots: '@babel/core': 7.29.0 '@babel/preset-env': 7.29.0(@babel/core@7.29.0) '@babel/runtime': 7.28.6 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.79.2) - '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) - '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) - '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.80.0) + '@rollup/plugin-node-resolve': 15.3.1(rollup@2.80.0) + '@rollup/plugin-replace': 2.4.2(rollup@2.80.0) + '@rollup/plugin-terser': 0.4.4(rollup@2.80.0) '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.18.0 common-tags: 1.8.2 @@ -21264,7 +21295,7 @@ snapshots: glob: 7.2.3 lodash: 4.17.23 pretty-bytes: 5.6.0 - rollup: 2.79.2 + rollup: 2.80.0 source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1