Enable more oxlint rules (#34189)

* Fix type imports

* Fix jsdoc

* Fixup types

* Fix stray awaits on non-thenables

* Fixup imports

* Fix splats

* Fix this-context on callbacks

* Memoise react contexts

* Prefer find/flatMap

* Make oxlint happier about our React keys

* Avoid unsafe default function params

* Fixup jsdoc

* Fixup contexts

* Switch from eslint to oxlint

* Some oxlint-related tweaks

* Iterate

* Partial revert to defer some changes and shrink diff

* Iterate

* Add eslint-plugin-element-call and enable the copyright rule

* Set strictStorePkgContentCheck

* Iterate

* Enable forwardRef oxlint rule

* Enable no-unused-vars oxlint rule

* Enable no-implied-eval oxlint rule

* Enable no-duplicate-type-constituents oxlint rule

* Enable explicit-length-check oxlint rule

* Enable prefer-number-properties oxlint rule

* Enable no-callback-in-promise oxlint rule

* Enable no-require-imports oxlint rule

* Remove disablement of most unicorn oxlint rules

* Enable no-conditional-tests oxlint rule

* Enable promise-valid-params oxlint rule

* Enable require-unicode-regexp oxlint rule

* Remove max-len comments as we use oxfmt for formatting

* Enable majority of oxlint `suspicious` rules

* Iterate

* Fix oxlint type-aware lint running without dependencies built
This commit is contained in:
Michael Telatynski
2026-07-29 08:26:07 +00:00
committed by GitHub
parent e8848e4746
commit bbec915fb0
178 changed files with 405 additions and 403 deletions
@@ -36,8 +36,4 @@ export class TestSDKContext extends SDKContextClass {
declare public _SlidingSyncManager?: SlidingSyncManager;
declare public _SpaceStore?: SpaceStore;
declare public _LegacyCallHandler?: LegacyCallHandler;
constructor() {
super();
}
}
@@ -16,9 +16,9 @@ import AskInviteAnywayDialog, {
import SettingsStore from "../../../../../src/settings/SettingsStore";
describe("AskInviteaAnywayDialog", () => {
const onFinished: jest.Mock<any, any> = jest.fn();
const onGiveUp: jest.Mock<any, any> = jest.fn();
const onInviteAnyways: jest.Mock<any, any> = jest.fn();
const onFinished = jest.fn();
const onGiveUp = jest.fn();
const onInviteAnyways = jest.fn();
function renderComponent(props: Partial<AskInviteAnywayDialogProps> = {}): RenderResult {
return render(
@@ -22,7 +22,7 @@ import { BugReportEndpointURLLocal } from "../../../../../src/IConfigOptions";
const BUG_REPORT_URL = "https://example.org/submit";
describe("BugReportDialog", () => {
const onFinished: jest.Mock<any, any> = jest.fn();
const onFinished = jest.fn();
function renderComponent(props: Partial<BugReportDialogProps> = {}): RenderResult {
return render(<BugReportDialog onFinished={onFinished} />);
@@ -13,7 +13,7 @@ import SdkConfig from "../../../../../src/SdkConfig";
import { DeclineAndBlockInviteDialog } from "../../../../../src/components/views/dialogs/DeclineAndBlockInviteDialog";
describe("ConfirmRejectInviteDialog", () => {
const onFinished: jest.Mock<any, any> = jest.fn();
const onFinished = jest.fn();
const MY_ROOM_NAME = "foo";
@@ -63,7 +63,7 @@ function makeMockSasCallbacks(): ShowSasCallbacks {
const unicorn: EmojiMapping = ["🦄", "unicorn"];
return {
sas: {
emoji: new Array<EmojiMapping>(7).fill(unicorn),
emoji: Array.from<EmojiMapping>({ length: 7 }).map(() => unicorn),
},
cancel: jest.fn(),
confirm: jest.fn(),
@@ -17,8 +17,8 @@ const ROOM_ID = "!foo:bar";
const REASON = "This room is bad!";
describe("ReportRoomDialog", () => {
const onFinished: jest.Mock<any, any> = jest.fn();
const reportRoom: jest.Mock<any, any> = jest.fn();
const onFinished: jest.Mock = jest.fn();
const reportRoom: jest.Mock = jest.fn();
beforeEach(() => {
jest.resetAllMocks();
const client = stubClient();
@@ -22,6 +22,7 @@ describe("<SyntaxHighlight />", () => {
it.each(["json", "javascript", "css"])("uses the provided language", async (lang) => {
const mock = jest.spyOn(hljs, "highlight");
// oxlint-disable-next-line react/jsx-no-comment-textnodes
const { container } = render(<SyntaxHighlight language={lang}>// Hello, World</SyntaxHighlight>);
await waitFor(() => expect(container.querySelector(`.language-${lang}`)).toBeTruthy());
@@ -70,7 +70,7 @@ describe("MLocationBody", () => {
});
describe("with error", () => {
let sdkConfigSpy: jest.SpyInstance<any>;
let sdkConfigSpy: jest.SpyInstance;
beforeEach(() => {
// eat expected errors to keep console clean
@@ -206,7 +206,7 @@ function makeMockSasCallbacks(): ShowSasCallbacks {
const unicorn: EmojiMapping = ["🦄", "unicorn"];
return {
sas: {
emoji: new Array<EmojiMapping>(7).fill(unicorn),
emoji: Array.from<EmojiMapping>({ length: 7 }).map(() => unicorn),
},
cancel: jest.fn(),
confirm: jest.fn(),
@@ -316,7 +316,7 @@ describe("editor/deserialize", function () {
});
it("escapes backticks in code blocks", () => {
const html =
"<p><code>this → ` is a backtick</code></p>" + "<pre><code>and here are 3 of them:\n```</code></pre>";
"<p><code>this → ` is a backtick</code></p><pre><code>and here are 3 of them:\n```</code></pre>";
const parts = normalize(parseEvent(htmlMessage(html), createPartCreator()));
expect(parts).toMatchSnapshot();
});
@@ -121,7 +121,7 @@ describe("RoomListStoreV3", () => {
// Let's pretend like a new timeline event came on the room in 37th index.
const room = rooms[37];
const event = mkMessage({ room: room.roomId, user: `@foo${3}:matrix.org`, ts: 1000, event: true });
const event = mkMessage({ room: room.roomId, user: "@foo3:matrix.org", ts: 1000, event: true });
jest.spyOn(room.getLiveTimeline(), "getEvents").mockReturnValue([event]);
const payload = {
@@ -1349,7 +1349,7 @@ describe("RoomListStoreV3", () => {
// Let's say that rooms 14 and 34 get new messages in that order
let ts = 1000;
for (const room of [rooms[14], rooms[34]]) {
const event = mkMessage({ room: room.roomId, user: `@foo${3}:matrix.org`, ts: 1000, event: true });
const event = mkMessage({ room: room.roomId, user: `@foo3:matrix.org`, ts: 1000, event: true });
jest.spyOn(room.getLiveTimeline(), "getEvents").mockReturnValue([event]);
const payload = {
+1 -1
View File
@@ -21,7 +21,7 @@ describe("theme", () => {
let lightCustomTheme: HTMLStyleElement;
let spyQuerySelectorAll: jest.MockInstance<NodeListOf<Element>, [selectors: string]>;
let spyClassList: jest.SpyInstance<void, string[], any>;
let spyClassList: jest.SpyInstance<void, string[]>;
beforeAll(() => {
const meta = document.createElement("meta");
@@ -57,7 +57,7 @@ const TEST_VECTORS = [
"bWnSXS9oymiqwUIGs08sXI33ZA==\n" +
"-----END MEGOLM SESSION DATA-----",
],
];
] as const;
function stringToArray(s: string): ArrayBuffer {
return new TextEncoder().encode(s).buffer as ArrayBuffer;
@@ -120,20 +120,9 @@ cissyYBxjsfsAn
);
});
// TODO find a subtlecrypto shim which doesn't break this test
it.skip("should decrypt a range of inputs", function () {
function next(i: number): Promise<string | undefined> | undefined {
if (i >= TEST_VECTORS.length) {
return;
}
const [plain, password, input] = TEST_VECTORS[i];
return MegolmExportEncryption.decryptMegolmKeyFile(stringToArray(input), password).then((decrypted) => {
expect(decrypted).toEqual(plain);
return next(i + 1);
});
}
next(0);
it.skip.each(TEST_VECTORS)("should decrypt a range of inputs", async (plain, password, input) => {
const decrypted = await MegolmExportEncryption.decryptMegolmKeyFile(stringToArray(input), password);
expect(decrypted).toEqual(plain);
});
});
@@ -647,9 +647,9 @@ describe("HTMLExport", () => {
await exporter.export();
const html = await getMessageFile(exporter).text();
expect(html).not.toContain(`${name}`);
expect(html).toContain(`${escapeHtml(name)}`);
expect(html).not.toContain(`${topic}`);
expect(html).not.toContain(name);
expect(html).toContain(escapeHtml(name));
expect(html).not.toContain(topic);
expect(html).toContain(`Topic: ${escapeHtml(topic)}`);
});