Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
12de365
plugin
Miodec Oct 31, 2025
01012ec
brrr
Miodec Nov 20, 2025
04e3279
update rule
Miodec Nov 20, 2025
ee4f0d1
update comment
Miodec Nov 20, 2025
7a0908b
yeet eslint
Miodec Nov 20, 2025
bec7945
root dep
Miodec Nov 20, 2025
303042b
move to dev
Miodec Nov 20, 2025
a4ce60c
i
Miodec Nov 20, 2025
3eeffee
Merge branch 'master' into oxc-no-testing-access
Miodec Nov 21, 2025
9e6266d
ignore in tests
Miodec Nov 21, 2025
3be2a92
remove test code
Miodec Nov 21, 2025
95b081f
Merge branch 'master' into tsgolint
Miodec Nov 23, 2025
e5b234f
cleanup
Miodec Nov 23, 2025
7548fbb
refactor
Miodec Nov 23, 2025
aaa1bbf
Merge branch 'oxc-no-testing-access' into tsgolint
Miodec Nov 23, 2025
d787450
pnpm i
Miodec Nov 23, 2025
08d2e46
move
Miodec Nov 23, 2025
b2dda96
disable ts rules in base config
Miodec Nov 23, 2025
d27f7b1
missing typeaware
Miodec Nov 23, 2025
175d2b2
move test overrides to root config
Miodec Nov 23, 2025
eb944b7
remove exlint from readme
Miodec Nov 23, 2025
1a2cf67
revert
Miodec Nov 23, 2025
e317613
revert
Miodec Nov 23, 2025
ec4c70d
Merge branch 'master' into tsgolint
Miodec Nov 24, 2025
ef3acff
fix
Miodec Nov 24, 2025
6971ee9
add root config
Miodec Nov 24, 2025
facbd8a
ocd
Miodec Nov 24, 2025
3a4b368
upgrade
Miodec Dec 1, 2025
b33dbd8
use type-check, fix tsconfig
Miodec Dec 1, 2025
0c03e17
type check
Miodec Dec 1, 2025
5718d54
remove ts-check from full-check
Miodec Dec 1, 2025
52c78ab
full fix
Miodec Dec 1, 2025
8822670
add lint-fast
Miodec Dec 1, 2025
371e27b
lint fast first
Miodec Dec 1, 2025
c097e52
bring back eslint for json linting
Miodec Dec 1, 2025
065f007
enable typeaware in workspace settings
Miodec Dec 2, 2025
777683c
move oxc plugin config
Miodec Dec 2, 2025
4a44eb6
remove directory
Miodec Dec 2, 2025
64b233a
split up oxc config
Miodec Dec 2, 2025
6be9d29
Merge branch 'master' into tsgolint
Miodec Dec 3, 2025
1df600e
fix ignore
Miodec Dec 3, 2025
f074e00
use lint json
Miodec Dec 3, 2025
bc83dfe
use script
Miodec Dec 3, 2025
a40dbf3
remove
Miodec Dec 3, 2025
5fa9f66
inline oxlint scripts, remove them
Miodec Dec 3, 2025
c25c0eb
remove eslintignore
Miodec Dec 3, 2025
23e3e2e
revert
Miodec Dec 3, 2025
03d21f3
bump lint version
Miodec Dec 8, 2025
e7fa3b4
enable no-deprecated, prefer-includes
Miodec Dec 9, 2025
a7c2396
Merge branch 'master' into tsgolint
Miodec Dec 9, 2025
b40d71c
Merge branch 'master' into tsgolint
Miodec Dec 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions .eslintignore

This file was deleted.

6 changes: 3 additions & 3 deletions .github/workflows/monkey-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ jobs:
run: pnpm install

- name: Check lint
run: npm run lint-be
run: npm run lint-fast-be && npm run lint-be

- name: Build
run: npm run build-be
Expand Down Expand Up @@ -214,7 +214,7 @@ jobs:
run: pnpm install

- name: Check lint
run: npm run lint-fe
run: npm run lint-fast-fe && npm run lint-fe

- name: Build
run: npm run build-fe
Expand Down Expand Up @@ -330,7 +330,7 @@ jobs:
run: pnpm install

- name: Check lint
run: npm run lint-pkg
run: npm run lint-fast-pkg && npm run lint-pkg

- name: Build
run: npm run build-pkg
Expand Down
7 changes: 7 additions & 0 deletions .oxlintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"ignorePatterns": ["node_modules", "dist", ".turbo"],
"extends": [
"./packages/oxlint-config/index.jsonc"
// "@monkeytype/oxlint-config"
]
}
16 changes: 0 additions & 16 deletions backend/.eslintrc.cjs

This file was deleted.

4 changes: 4 additions & 0 deletions backend/.oxlintrc-plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"ignorePatterns": ["node_modules", "__migration__", "dist", ".turbo"],
"extends": ["../packages/oxlint-config/plugin.jsonc"]
}
28 changes: 1 addition & 27 deletions backend/.oxlintrc.json
Original file line number Diff line number Diff line change
@@ -1,33 +1,7 @@
{
"ignorePatterns": ["node_modules", "__migration__", "dist", ".turbo"],
"extends": [
"../packages/oxlint-config/index.jsonc"
// "@monkeytype/oxlint-config"
],
"overrides": [
{
"files": ["__tests__/**"],
"plugins": [
"typescript",
"unicorn",
"oxc",
"import",
"node",
"promise",
"jest",
"vitest"
],
"rules": {
"no-explicit-any": "allow",
"explicit-function-return-type": "off",
"ban-ts-comment": "off"
}
},
{
"files": ["__tests__/**/*.d.ts"],
"rules": {
"typescript/consistent-type-definitions": "off",
"typescript/no-empty-object-type": "off"
}
}
]
}
5 changes: 3 additions & 2 deletions backend/__tests__/api/controllers/admin.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import GeorgeQueue from "../../../src/queues/george-queue";
import * as AuthUtil from "../../../src/utils/auth";

import { enableRateLimitExpects } from "../../__testData__/rate-limit";
import Test from "supertest/lib/test";

const { mockApp, uid } = setup();
const configuration = Configuration.getCachedConfiguration();
Expand Down Expand Up @@ -558,12 +559,12 @@ describe("AdminController", () => {
});
});

async function expectFailForNonAdmin(call: SuperTest): Promise<void> {
async function expectFailForNonAdmin(call: Test): Promise<void> {
isAdminMock.mockResolvedValue(false);
const { body } = await call.expect(403);
expect(body.message).toEqual("You don't have permission to do this.");
}
async function expectFailForDisabledEndpoint(call: SuperTest): Promise<void> {
async function expectFailForDisabledEndpoint(call: Test): Promise<void> {
await enableAdminEndpoints(false);
const { body } = await call.expect(503);
expect(body.message).toEqual("Admin endpoints are currently disabled.");
Expand Down
15 changes: 7 additions & 8 deletions backend/__tests__/api/controllers/user.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,10 @@ import { mockAuthenticateWithApeKey } from "../../__testData__/auth";
import { randomUUID } from "node:crypto";
import { MonkeyMail, UserStreak } from "@monkeytype/schemas/users";
import MonkeyError, { isFirebaseError } from "../../../src/utils/error";
import { LeaderboardEntry } from "@monkeytype/schemas/leaderboards";
import * as WeeklyXpLeaderboard from "../../../src/services/weekly-xp-leaderboard";
import * as ConnectionsDal from "../../../src/dal/connections";
import { pb } from "../../__testData__/users";
import { SuperTest } from "supertest";
import Test from "supertest/lib/test";

const { mockApp, uid, mockAuth } = setup();
const configuration = Configuration.getCachedConfiguration();
Expand Down Expand Up @@ -2979,7 +2978,7 @@ describe("user controller test", () => {

getUserByNameMock.mockResolvedValue(foundUser as any);

const rank = { rank: 24 } as LeaderboardEntry;
const rank = { rank: 24 } as LeaderboardDal.DBLeaderboardEntry;
leaderboardGetRankMock.mockResolvedValue(rank);
leaderboardGetCountMock.mockResolvedValue(100);

Expand Down Expand Up @@ -3041,7 +3040,7 @@ describe("user controller test", () => {
...foundUser,
profileDetails: { showActivityOnPublicProfile: true },
} as any);
const rank = { rank: 24 } as LeaderboardEntry;
const rank = { rank: 24 } as LeaderboardDal.DBLeaderboardEntry;
leaderboardGetRankMock.mockResolvedValue(rank);
leaderboardGetCountMock.mockResolvedValue(100);

Expand All @@ -3063,7 +3062,7 @@ describe("user controller test", () => {
...foundUser,
profileDetails: { showActivityOnPublicProfile: false },
} as any);
const rank = { rank: 24 } as LeaderboardEntry;
const rank = { rank: 24 } as LeaderboardDal.DBLeaderboardEntry;
leaderboardGetRankMock.mockResolvedValue(rank);
leaderboardGetCountMock.mockResolvedValue(100);

Expand All @@ -3081,7 +3080,7 @@ describe("user controller test", () => {
banned: true,
} as any);

const rank = { rank: 24 } as LeaderboardEntry;
const rank = { rank: 24 } as LeaderboardDal.DBLeaderboardEntry;
leaderboardGetRankMock.mockResolvedValue(rank);
leaderboardGetCountMock.mockResolvedValue(100);

Expand Down Expand Up @@ -3132,7 +3131,7 @@ describe("user controller test", () => {
const uid = foundUser.uid;
getUserMock.mockResolvedValue(foundUser as any);

const rank = { rank: 24 } as LeaderboardEntry;
const rank = { rank: 24 } as LeaderboardDal.DBLeaderboardEntry;
leaderboardGetRankMock.mockResolvedValue(rank);
leaderboardGetCountMock.mockResolvedValue(100);

Expand Down Expand Up @@ -4050,7 +4049,7 @@ async function enableConnectionsEndpoints(enabled: boolean): Promise<void> {
);
}

async function expectFailForDisabledEndpoint(call: SuperTest): Promise<void> {
async function expectFailForDisabledEndpoint(call: Test): Promise<void> {
await enableConnectionsEndpoints(false);
const { body } = await call.expect(503);
expect(body.message).toEqual("Connections are not available at this time.");
Expand Down
6 changes: 5 additions & 1 deletion backend/__tests__/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
{
"extends": "@monkeytype/typescript-config/base.json",
"compilerOptions": {
"noEmit": true
"noEmit": true,
"noImplicitAny": false,
"strictFunctionTypes": false,
"useUnknownInCatchVariables": false,
"strictPropertyInitialization": false
},
"files": ["vitest.d.ts"],
"include": ["./**/*.ts", "./**/*.spec.ts", "./setup-tests.ts"]
Expand Down
11 changes: 4 additions & 7 deletions backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
"license": "GPL-3.0",
"private": true,
"scripts": {
"eslint": "eslint \"./src/**/*.ts\"",
"oxlint": "oxlint .",
"lint": "npm run oxlint && npm run eslint",
"lint": "oxlint . --type-aware --type-check && oxlint -c .oxlintrc-plugin.json",
"lint-fast": "oxlint .",
"build": "npm run gen-docs && tsc --build",
"watch": "tsc --build --watch",
"clean": "tsc --build --clean",
Expand Down Expand Up @@ -62,7 +61,6 @@
"zod": "3.23.8"
},
"devDependencies": {
"@monkeytype/eslint-config": "workspace:*",
"@monkeytype/oxlint-config": "workspace:*",
"@monkeytype/typescript-config": "workspace:*",
"@redocly/cli": "2.0.5",
Expand All @@ -84,10 +82,9 @@
"@types/uuid": "10.0.0",
"@vitest/coverage-v8": "4.0.8",
"concurrently": "8.2.2",
"eslint": "8.57.1",
"eslint-watch": "8.0.0",
"openapi3-ts": "2.0.2",
"oxlint": "1.29.0",
"oxlint": "1.32.0",
"oxlint-tsgolint": "0.8.3",
"readline-sync": "1.4.10",
"supertest": "7.1.4",
"testcontainers": "11.4.0",
Expand Down
5 changes: 3 additions & 2 deletions backend/scripts/openapi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -219,14 +219,15 @@ function addRateLimit(
metadata: EndpointMetadata | undefined,
): void {
if (metadata === undefined || metadata.rateLimit === undefined) return;
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
// oxlint-disable-next-line no-unsafe-assignment
const okResponse = operation.responses["200"];
if (okResponse === undefined) return;

operation.description += getRateLimitDescription(metadata.rateLimit);

// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
// oxlint-disable-next-line no-unsafe-assignment no-unsafe-member-access
okResponse["headers"] = {
// oxlint-disable-next-line no-unsafe-member-access
...okResponse["headers"],
"x-ratelimit-limit": {
schema: { type: "integer" },
Expand Down
2 changes: 1 addition & 1 deletion backend/src/api/controllers/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ async function updateUser(uid: string): Promise<void> {
lbPersonalBests[mode.mode][mode.mode2] = {};
}

// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
lbPersonalBests[mode.mode][mode.mode2][mode.language] = entry;
}

Expand Down
2 changes: 1 addition & 1 deletion backend/src/api/controllers/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -553,7 +553,7 @@ export async function getUser(req: MonkeyRequest): Promise<GetUserResponse> {
uid,
);
} catch (e) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
if (e.code === "auth/user-not-found") {
throw new MonkeyError(
404,
Expand Down
2 changes: 1 addition & 1 deletion backend/src/api/ts-rest-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export function callController<
TParams,
TResponse,
//ignoring as it might be used in the future
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
// oxlint-disable-next-line no-unnecessary-type-parameters
TStatus = 200,
>(
handler: MonkeyHandler<TQuery, TBody, TParams, TResponse>,
Expand Down
2 changes: 1 addition & 1 deletion backend/src/api/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { TsRestRequest as TsRestRequestGeneric } from "@ts-rest/express";
import { Request as ExpressRequest } from "express";
import { Context } from "../middlewares/context";

// eslint-disable-next-line @typescript-eslint/no-explicit-any
// oxlint-disable-next-line no-explicit-any
export type TsRestRequest = TsRestRequestGeneric<any>;

export type ExpressRequestWithContext = {
Expand Down
2 changes: 1 addition & 1 deletion backend/src/dal/connections.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export async function create(

return created;
} catch (e) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
if (e.name === "MongoServerError" && e.code === 11000) {
const existing = await getCollection().findOne(
{ key },
Expand Down
6 changes: 3 additions & 3 deletions backend/src/dal/leaderboards.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ export async function get(

return leaderboard;
} catch (e) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
if (e.error === 175) {
//QueryPlanKilled, collection was removed during the query
return false;
Expand Down Expand Up @@ -162,7 +162,7 @@ export async function getRank(
return results[0] ?? null;
}
} catch (e) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
if (e.error === 175) {
//QueryPlanKilled, collection was removed during the query
return false;
Expand Down Expand Up @@ -393,7 +393,7 @@ async function createIndex(
Logger.warning(`Index ${key} not matching, dropping and recreating...`);

const existingIndex = (await getUsersCollection().listIndexes().toArray())
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
.map((it) => it.name as string)
.find((it) => it.startsWith(key));

Expand Down
2 changes: 1 addition & 1 deletion backend/src/dal/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,7 @@ export async function getPersonalBests(
]);

if (mode2 !== undefined) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
return user.personalBests?.[mode]?.[mode2] as PersonalBest;
}

Expand Down
2 changes: 1 addition & 1 deletion backend/src/middlewares/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ async function authenticateWithBearerToken(
);
}

// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
const errorCode = error?.errorInfo?.code as string | undefined;

if (errorCode?.includes("auth/id-token-expired")) {
Expand Down
2 changes: 1 addition & 1 deletion backend/src/middlewares/utility.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export function onlyAvailableOnDev(): RequestHandler {
}

export function getMetadata(req: TsRestRequestWithContext): EndpointMetadata {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
return (req.tsRestRoute["metadata"] ?? {}) as EndpointMetadata;
}

Expand Down
2 changes: 1 addition & 1 deletion backend/src/utils/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ export async function sendForgotPasswordEmail(email: string): Promise<void> {
await emailQueue.sendForgotPasswordEmail(email, name, link);
} catch (err) {
if (isFirebaseError(err) && err.errorInfo.code !== "auth/user-not-found") {
// eslint-disable-next-line @typescript-eslint/only-throw-error
// oxlint-disable-next-line only-throw-error
throw err;
}
}
Expand Down
8 changes: 4 additions & 4 deletions backend/src/utils/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@ type FirebaseErrorParent = {
errorInfo: FirebaseError;
};

// eslint-disable-next-line @typescript-eslint/no-explicit-any
// oxlint-disable-next-line no-explicit-any
export function isFirebaseError(err: any): err is FirebaseErrorParent {
return (
typeof err === "object" &&
"code" in err &&
"errorInfo" in err &&
"codePrefix" in err &&
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
typeof err.errorInfo === "object" &&
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
"code" in err.errorInfo &&
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// oxlint-disable-next-line no-unsafe-member-access
"message" in err.errorInfo
);
}
Expand Down
2 changes: 1 addition & 1 deletion backend/src/utils/etag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export function createETagGenerator(options: {
return function generateETag(body, encoding) {
const buf = !Buffer.isBuffer(body) ? Buffer.from(body, encoding) : body;

// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
// oxlint-disable-next-line no-unsafe-assignment, no-unsafe-call
const generatedTag: string = etag(buf, options);

//custom code to add the version number
Expand Down
Loading