git » sdk » commit 47af911

Use oxlint

author Eric Roberts
2026-09-09 21:12:31 UTC
committer Stephen Paul Weber
2026-09-14 13:37:45 UTC
parent 0f2c33eed2e4b95a0cbd79e35585c14a37fa8099

Use oxlint

My editor alerted me to an unused variable that looked suspicious:

`const reactToMesssage`

A few lines later I saw:

`for (const [k, reacts] of reactToMessage?.reactions || []) {`

Linting saves ~lives~ reactions.

I had to add no-undef as a rule because it's not a default. I made it
warn because it seems like that's what all the other default rules are.
It fails on warn anyway.

I have another patch that fixes the reactToMessage thing so this won't
cleanly apply if that is applied first. I can update when that one is in.

.oxlintrc.json +16 -0
Makefile +8 -2
borogove/persistence/IDB.js +5 -6
borogove/persistence/MediaStoreCache.js +2 -2
npm/package.json +3 -2
test/persistence-tests.ts +2 -2

diff --git a/.oxlintrc.json b/.oxlintrc.json
new file mode 100644
index 0000000..8248ac5
--- /dev/null
+++ b/.oxlintrc.json
@@ -0,0 +1,16 @@
+{
+	"env": {
+		"browser": true,
+	},
+	"rules": {
+		"eslint/no-undef": "warn"
+	},
+	"overrides": [
+		{
+			"files": ["playwright.config.ts"],
+			"env": {
+				"node": true,
+			}
+		}
+	]
+}
diff --git a/Makefile b/Makefile
index 316505e..dd67f5a 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ all: npm libborogove.batteriesincluded.so .WAIT libborogove.so libborogove.a
 test:
 	haxe test.hxml
 
-ci: format-check test playwright
+ci: format-check lint test playwright
 	mkdir -p .cache
 	haxe testjs.hxml
 	haxe testcpp.hxml
@@ -59,7 +59,7 @@ npm/borogove.js:
 	printf "\nexport class borogove_Presence {}\n" >> npm/borogove.d.ts
 	$(RM) npm/*.bak
 
-npm: format-check npm/borogove-browser.js npm/borogove.js borogove/persistence/IDB.js borogove/persistence/MediaStoreCache.js borogove/persistence/sqlite-worker1.mjs
+npm: format-check lint npm/borogove-browser.js npm/borogove.js borogove/persistence/IDB.js borogove/persistence/MediaStoreCache.js borogove/persistence/sqlite-worker1.mjs
 	cp borogove/persistence/IDB.js npm
 	cp borogove/persistence/MediaStoreCache.js npm
 	cp borogove/persistence/sqlite-worker1.mjs npm
@@ -166,3 +166,9 @@ format:
 
 format-check:
 	npx --no-install oxfmt --check '**/*.{ts,js}' --ignore-path .gitignore
+
+lint:
+	npx --no-install oxlint
+
+lint-fix:
+	npx --no-install oxlint --fix --fix-suggestions
diff --git a/borogove/persistence/IDB.js b/borogove/persistence/IDB.js
index 4f9f424..cd245a9 100644
--- a/borogove/persistence/IDB.js
+++ b/borogove/persistence/IDB.js
@@ -15,7 +15,6 @@ import {
 	borogove_Member,
 	borogove_Role,
 	borogove_JID,
-	borogove_Presence,
 	borogove_Reaction,
 	borogove_ReactionUpdate,
 	borogove_SerializedChat,
@@ -185,7 +184,7 @@ export default async (dbname, media, tokenize, stemmer) => {
 					db.createObjectStore("chats", { keyPath: ["account", "chatId"] });
 				}
 				if (!db.objectStoreNames.contains("members")) {
-					const members = db.createObjectStore("members", {
+					db.createObjectStore("members", {
 						keyPath: ["account", "id"],
 					});
 				}
@@ -1280,7 +1279,7 @@ export default async (dbname, media, tokenize, stemmer) => {
 					),
 			);
 			if (reactionResult?.value?.append && message.html().trim() == "") {
-				const reactToMesssage = await this.getMessage(
+				const reactToMessage = await this.getMessage(
 					account,
 					message.chatId(),
 					reactionResult.value.serverId,
@@ -1812,7 +1811,7 @@ export default async (dbname, media, tokenize, stemmer) => {
 			const prekeys = [];
 			const req = store.openCursor(keyRange);
 
-			return new Promise((resolve, reject) => {
+			return new Promise((resolve) => {
 				req.onsuccess = (event) => {
 					const cursor = event.target.result;
 					if (cursor) {
@@ -1846,8 +1845,8 @@ export default async (dbname, media, tokenize, stemmer) => {
 			const tx = db.transaction(["keyvaluepairs"], "readwrite");
 			const store = tx.objectStore("keyvaluepairs");
 			await Promise.all([
-				await promisifyRequest(store.put(sm, "sm:" + account)),
-				await promisifyRequest(store.put(sortId, "sortId:" + account)),
+				promisifyRequest(store.put(sm, "sm:" + account)),
+				promisifyRequest(store.put(sortId, "sortId:" + account)),
 			]);
 			return true;
 		},
diff --git a/borogove/persistence/MediaStoreCache.js b/borogove/persistence/MediaStoreCache.js
index 222119c..04fa770 100644
--- a/borogove/persistence/MediaStoreCache.js
+++ b/borogove/persistence/MediaStoreCache.js
@@ -32,8 +32,8 @@ export default (cacheName, { routeHashPath } = { routeHashPath: null }) => {
 				new Response(
 					source.pipeThrough(
 						new TransformStream({
-							start(controller) {},
-							flush(controller) {},
+							start() {},
+							flush() {},
 							transform(chunk, controller) {
 								sha256.update(chunk);
 								sha1.update(chunk);
diff --git a/npm/package.json b/npm/package.json
index de9ff02..9479a79 100644
--- a/npm/package.json
+++ b/npm/package.json
@@ -30,8 +30,7 @@
 	"dependencies": {
 		"@xmpp/client": "^0.14.0",
 		"@xmpp/debug": "^0.14.0",
-		"@xmpp/sasl-scram-sha-1": "^0.14.0",
-		"oxfmt": "^0.67.0"
+		"@xmpp/sasl-scram-sha-1": "^0.14.0"
 	},
 	"peerDependenciesMeta": {
 		"@sqlite.org/sqlite-wasm": {
@@ -41,6 +40,8 @@
 	"devDependencies": {
 		"@playwright/test": "1.60.0",
 		"@sqlite.org/sqlite-wasm": "^3.53.0-build1",
+		"oxlint": "^1.82.0",
+		"oxfmt": "^0.67.0",
 		"typescript": "^5.4.5"
 	}
 }
diff --git a/test/persistence-tests.ts b/test/persistence-tests.ts
index 83151d2..55d3ab4 100644
--- a/test/persistence-tests.ts
+++ b/test/persistence-tests.ts
@@ -1170,7 +1170,7 @@ export function sharedPersistenceTests(test: PersistenceTest) {
 		persistence,
 	}) => {
 		const result = await page.evaluate(
-			async ({ borogove, persistence }) => {
+			async ({ persistence }) => {
 				await persistence.storeLogin(
 					"alice@example.com",
 					"client1",
@@ -1286,7 +1286,7 @@ export function sharedPersistenceTests(test: PersistenceTest) {
 		persistence,
 	}) => {
 		const result = await page.evaluate(
-			async ({ borogove, persistence }) => {
+			async ({ persistence }) => {
 				await persistence.storeLogin("alice@example.com", "", "", null); // or updating with SM may not work
 				await persistence.storeStreamManagement(
 					"alice@example.com",