aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-03-06 15:07:08 -0800
committerAdam Soltys <[email protected]>2026-03-06 15:07:08 -0800
commitd14c03e3f2e3806e17852a440d2a39f377570758 (patch)
tree38138c52e23a642d0b2c9853e59afb638a87d1e5
parent0020101f8f1d83fb323c77d0620af821be9d4e66 (diff)
downloadcoinos-ui-d14c03e3f2e3806e17852a440d2a39f377570758.tar.gz
coinos-ui-d14c03e3f2e3806e17852a440d2a39f377570758.zip
lint
-rw-r--r--.oxlintrc.json2
-rw-r--r--package-lock.json55
-rw-r--r--package.json2
-rw-r--r--perf-test.ts3
-rw-r--r--src/components/AppHeader.svelte19
-rw-r--r--src/lib/keyWrapping.ts4
-rw-r--r--src/lib/nip07.ts2
-rw-r--r--src/lib/nip17.ts2
-rw-r--r--src/routes/(app)/[username]/(profile)/+layout.server.ts3
-rw-r--r--src/routes/(app)/[username]/(profile)/+page.server.ts4
-rw-r--r--src/routes/(app)/send/bitcoin/[address]/+layout.server.ts2
-rw-r--r--src/routes/(app)/settings/+layout.server.ts2
-rw-r--r--src/routes/(app)/settings/+layout.svelte2
-rw-r--r--src/routes/(app)/settings/security/+page.svelte2
-rw-r--r--src/routes/(static)/register/auth/+page.server.ts2
-rw-r--r--test/e2e/custodial-receive-bitcoin.spec.ts1
-rw-r--r--test/e2e/custodial-receive-lightning.spec.ts1
-rw-r--r--test/e2e/custodial-send-external-ln.spec.ts1
-rw-r--r--test/e2e/custodial-send-lightning.spec.ts1
-rw-r--r--test/e2e/helpers.ts4
-rw-r--r--test/e2e/mls-messaging.spec.ts2
-rw-r--r--test/e2e/vault-receive-bitcoin.spec.ts1
-rw-r--r--test/e2e/vault-send-bob-btc.spec.ts1
-rw-r--r--test/e2e/vault-send-to-custodial-btc.spec.ts2
24 files changed, 81 insertions, 39 deletions
diff --git a/.oxlintrc.json b/.oxlintrc.json
index eb548825..e2a4d331 100644
--- a/.oxlintrc.json
+++ b/.oxlintrc.json
@@ -2,7 +2,7 @@
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": ["typescript", "unicorn", "oxc"],
"categories": {
- "correctness": "warn"
+ "correctness": "error"
},
"rules": {
"no-self-assign": "off",
diff --git a/package-lock.json b/package-lock.json
index 30ae0c97..3cc58dae 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -52,6 +52,7 @@
"rollup-plugin-visualizer": "^6.0.5",
"svelte": "^5.49.1",
"svelte-adapter-bun": "^1.0.1",
+ "svelte-check": "^4.4.4",
"svelte-confetti": "^2.3.2",
"svelte-preprocess": "^6.0.3",
"sveltekit-i18n": "^2.4.2",
@@ -3342,6 +3343,22 @@
"regexp-to-ast": "0.5.0"
}
},
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/chownr": {
"version": "3.0.0",
"dev": true,
@@ -7115,6 +7132,20 @@
"node": ">= 6"
}
},
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/redent": {
"version": "3.0.0",
"dev": true,
@@ -7932,6 +7963,30 @@
"typescript": "^5"
}
},
+ "node_modules/svelte-check": {
+ "version": "4.4.4",
+ "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.4.tgz",
+ "integrity": "sha512-F1pGqXc710Oi/wTI4d/x7d6lgPwwfx1U6w3Q35n4xsC2e8C/yN2sM1+mWxjlMcpAfWucjlq4vPi+P4FZ8a14sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "chokidar": "^4.0.1",
+ "fdir": "^6.2.0",
+ "picocolors": "^1.0.0",
+ "sade": "^1.7.4"
+ },
+ "bin": {
+ "svelte-check": "bin/svelte-check"
+ },
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "peerDependencies": {
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "typescript": ">=5.0.0"
+ }
+ },
"node_modules/svelte-confetti": {
"version": "2.3.2",
"dev": true,
diff --git a/package.json b/package.json
index d23caca3..fc9f4398 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,7 @@
"test:e2e:ark:headed": "test/e2e/run.sh headed",
"test:e2e:ark:watch": "test/e2e/run.sh watch",
"test:e2e:ark:debug": "test/e2e/run.sh debug",
+ "check": "svelte-check --tsconfig ./tsconfig.json",
"lint": "oxlint . && oxfmt --check .",
"lint:fix": "oxlint --fix . && oxfmt .",
"format": "oxfmt .",
@@ -64,6 +65,7 @@
"rollup-plugin-visualizer": "^6.0.5",
"svelte": "^5.49.1",
"svelte-adapter-bun": "^1.0.1",
+ "svelte-check": "^4.4.4",
"svelte-confetti": "^2.3.2",
"svelte-preprocess": "^6.0.3",
"sveltekit-i18n": "^2.4.2",
diff --git a/perf-test.ts b/perf-test.ts
index 082d9113..74bde919 100644
--- a/perf-test.ts
+++ b/perf-test.ts
@@ -7,9 +7,6 @@ const BASE = "http://localhost:5173";
const context = await browser.newContext();
const page = await context.newPage();
- // Collect all network requests during navigation
- const requests: { url: string; duration: number; size: number }[] = [];
-
// Login as bob
console.log("=== Logging in as bob ===");
await page.goto(`${BASE}/login`);
diff --git a/src/components/AppHeader.svelte b/src/components/AppHeader.svelte
index 0d70bf49..9b8eb3c5 100644
--- a/src/components/AppHeader.svelte
+++ b/src/components/AppHeader.svelte
@@ -24,16 +24,15 @@
let isHome = $derived($page.url.pathname === `/${user?.username}`);
- const links = $derived([
- ...(!isHome
- ? [
- {
- href: `/${user?.username}`,
- icon: PhHouseBold,
- label: "Home",
- },
- ]
- : []),
+ const links = $derived(!isHome
+ ? [
+ {
+ href: `/${user?.username}`,
+ icon: PhHouseBold,
+ label: "Home",
+ },
+ ]
+ : [
// {
// href: `/scan`,
// icon: "ph:camera-bold",
diff --git a/src/lib/keyWrapping.ts b/src/lib/keyWrapping.ts
index 971b929c..31cb1e5c 100644
--- a/src/lib/keyWrapping.ts
+++ b/src/lib/keyWrapping.ts
@@ -1,5 +1,5 @@
import { prfEncrypt, prfDecrypt } from "$lib/crypto";
-import { rememberPrfKey, defaultRememberForMs, getCachedPrfKey } from "$lib/passwordCache";
+import { rememberPrfKey, defaultRememberForMs } from "$lib/passwordCache";
import { post } from "$lib/utils";
export function generateCanonicalKey(): ArrayBuffer {
@@ -36,7 +36,7 @@ export async function resolveCanonicalKey(
// Migration: old PRF key becomes canonical key
const canonicalKey = oldPrfKey;
const wrapped = await wrapCanonicalKey(wrappingKey, canonicalKey);
- const updated = { ...(encryptedKeys || {}), [methodId]: wrapped };
+ const updated = { ...encryptedKeys, [methodId]: wrapped };
await saveEncryptedKeys(updated);
rememberPrfKey(canonicalKey, defaultRememberForMs);
return { canonicalKey, encryptedKeys: updated };
diff --git a/src/lib/nip07.ts b/src/lib/nip07.ts
index 691e3bcd..dc774186 100644
--- a/src/lib/nip07.ts
+++ b/src/lib/nip07.ts
@@ -65,7 +65,7 @@ export const ensureSigner = async (userPubkey: string): Promise<Uint8Array | nul
if (extPubkey === userPubkey) {
return null; // Use NIP-07
}
- } catch (e) {
+ } catch {
// Extension didn't work, fall through to signer modal
}
}
diff --git a/src/lib/nip17.ts b/src/lib/nip17.ts
index c6021339..d4718e48 100644
--- a/src/lib/nip17.ts
+++ b/src/lib/nip17.ts
@@ -1,4 +1,4 @@
-import { bytesToHex, hexToBytes } from "@noble/hashes/utils.js";
+import { bytesToHex } from "@noble/hashes/utils.js";
import { finalizeEvent, getEventHash, generateSecretKey, getPublicKey } from "nostr-tools/pure";
import { SimplePool } from "nostr-tools/pool";
diff --git a/src/routes/(app)/[username]/(profile)/+layout.server.ts b/src/routes/(app)/[username]/(profile)/+layout.server.ts
index 9fd42861..7accc930 100644
--- a/src/routes/(app)/[username]/(profile)/+layout.server.ts
+++ b/src/routes/(app)/[username]/(profile)/+layout.server.ts
@@ -1,10 +1,9 @@
import getRates from "$lib/rates";
-export async function load({ depends, parent }) {
+export async function load({ depends }) {
depends("app:user");
const rates = await getRates();
- const { subject } = await parent();
return { rates };
}
diff --git a/src/routes/(app)/[username]/(profile)/+page.server.ts b/src/routes/(app)/[username]/(profile)/+page.server.ts
index f5be6aae..ee3c8ba3 100644
--- a/src/routes/(app)/[username]/(profile)/+page.server.ts
+++ b/src/routes/(app)/[username]/(profile)/+page.server.ts
@@ -1,12 +1,10 @@
import getRates from "$lib/rates";
import { auth, get } from "$lib/utils";
-export async function load({ cookies, depends, parent }) {
+export async function load({ cookies, depends }) {
depends("app:payments");
depends("app:items");
- const { subject } = await parent();
-
let accounts = [];
if (cookies.get("token")) accounts = await get("/accounts", auth(cookies));
diff --git a/src/routes/(app)/send/bitcoin/[address]/+layout.server.ts b/src/routes/(app)/send/bitcoin/[address]/+layout.server.ts
index acf6a370..e69956dc 100644
--- a/src/routes/(app)/send/bitcoin/[address]/+layout.server.ts
+++ b/src/routes/(app)/send/bitcoin/[address]/+layout.server.ts
@@ -4,7 +4,7 @@ import { redirect } from "@sveltejs/kit";
export async function load({ cookies, params, parent }) {
const { user } = await parent();
const aid = cookies.get("aid") || user.id;
- const { address, amount } = params;
+ const { address } = params;
const account = await get(`/account/${aid}`, auth(cookies));
const senderIsVault = account.pubkey || account.seed;
diff --git a/src/routes/(app)/settings/+layout.server.ts b/src/routes/(app)/settings/+layout.server.ts
index 9a1b38ee..746d2abd 100644
--- a/src/routes/(app)/settings/+layout.server.ts
+++ b/src/routes/(app)/settings/+layout.server.ts
@@ -1,7 +1,7 @@
import { auth, get } from "$lib/utils";
import { redirect } from "@sveltejs/kit";
-export async function load({ cookies, params, parent, url }) {
+export async function load({ cookies, parent, url }) {
const { user } = await parent();
if (!user) redirect(307, `/register?redirect=${url.pathname}`);
const tab = url.pathname.split("/").filter(Boolean).pop();
diff --git a/src/routes/(app)/settings/+layout.svelte b/src/routes/(app)/settings/+layout.svelte
index d447f9e3..99471c8b 100644
--- a/src/routes/(app)/settings/+layout.svelte
+++ b/src/routes/(app)/settings/+layout.svelte
@@ -217,7 +217,7 @@
const canonicalKey = getCachedPrfKey();
if (canonicalKey) {
const wrapped = await wrapCanonicalKey(sk.buffer as ArrayBuffer, canonicalKey);
- pendingEncryptedKeys = { ...(user.encryptedKeys || {}), [passwordMethodId()]: wrapped };
+ pendingEncryptedKeys = { ...user.encryptedKeys, [passwordMethodId()]: wrapped };
}
} catch (e) {
console.log("Failed to derive authPubkey for password change", e);
diff --git a/src/routes/(app)/settings/security/+page.svelte b/src/routes/(app)/settings/security/+page.svelte
index 6e779eb8..80d09ace 100644
--- a/src/routes/(app)/settings/security/+page.svelte
+++ b/src/routes/(app)/settings/security/+page.svelte
@@ -169,7 +169,7 @@
const canonicalKey = getCachedPrfKey();
if (canonicalKey) {
const wrapped = await wrapCanonicalKey(prfKey, canonicalKey);
- const updated = { ...(user.encryptedKeys || {}), [passkeyMethodId(credentialId)]: wrapped };
+ const updated = { ...user.encryptedKeys, [passkeyMethodId(credentialId)]: wrapped };
await saveEncryptedKeys(updated);
user.encryptedKeys = updated;
} else {
diff --git a/src/routes/(static)/register/auth/+page.server.ts b/src/routes/(static)/register/auth/+page.server.ts
index 282081f9..25de32ae 100644
--- a/src/routes/(static)/register/auth/+page.server.ts
+++ b/src/routes/(static)/register/auth/+page.server.ts
@@ -36,7 +36,7 @@ export const actions = {
if (ip) headers["cf-connecting-ip"] = ip;
try {
- const { sk, token } = await post("/register", { user }, headers);
+ const { sk } = await post("/register", { user }, headers);
// Log the user in and set cookies
await login(user, cookies, ip, host);
diff --git a/test/e2e/custodial-receive-bitcoin.spec.ts b/test/e2e/custodial-receive-bitcoin.spec.ts
index 508a440e..c12e99ef 100644
--- a/test/e2e/custodial-receive-bitcoin.spec.ts
+++ b/test/e2e/custodial-receive-bitcoin.spec.ts
@@ -7,7 +7,6 @@ import {
bitcoinSend,
mineBlocks,
waitForInvoicePaid,
- waitForPaidRedirect,
} from "./helpers";
test("custodial receives external bitcoin payment from bitcoind", async ({ page }) => {
diff --git a/test/e2e/custodial-receive-lightning.spec.ts b/test/e2e/custodial-receive-lightning.spec.ts
index 5c35b557..5c1bfdc5 100644
--- a/test/e2e/custodial-receive-lightning.spec.ts
+++ b/test/e2e/custodial-receive-lightning.spec.ts
@@ -6,7 +6,6 @@ import {
login,
lightningPay,
waitForInvoicePaid,
- waitForPaidRedirect,
} from "./helpers";
test("custodial receives external lightning payment from clb", async ({ page }) => {
diff --git a/test/e2e/custodial-send-external-ln.spec.ts b/test/e2e/custodial-send-external-ln.spec.ts
index 6142d9c8..baaa4c1b 100644
--- a/test/e2e/custodial-send-external-ln.spec.ts
+++ b/test/e2e/custodial-send-external-ln.spec.ts
@@ -5,7 +5,6 @@ import {
loginNewContext,
lightningInvoice,
pasteAndSend,
- clickSendButton,
waitForSentRedirect,
} from "./helpers";
diff --git a/test/e2e/custodial-send-lightning.spec.ts b/test/e2e/custodial-send-lightning.spec.ts
index 62bf9415..88f87f40 100644
--- a/test/e2e/custodial-send-lightning.spec.ts
+++ b/test/e2e/custodial-send-lightning.spec.ts
@@ -7,7 +7,6 @@ import {
apiBaseUrl,
loginNewContext,
pasteAndSend,
- clickSendButton,
waitForSentRedirect,
waitForPaidRedirect,
} from "./helpers";
diff --git a/test/e2e/helpers.ts b/test/e2e/helpers.ts
index 28b2d4c4..e8d4d6f6 100644
--- a/test/e2e/helpers.ts
+++ b/test/e2e/helpers.ts
@@ -84,7 +84,7 @@ export async function apiGetInvoice(page: Page, invoiceId: string) {
// --- Invoice creation via UI ---
-export async function createBitcoinInvoiceViaUI(page: Page, username: string) {
+export async function createBitcoinInvoiceViaUI(page: Page, _username: string) {
await page.goto(`/invoice?type=bitcoin&address_type=bech32`);
await page.waitForURL(/\/invoice\/[^/?#]+/, { timeout: 15_000 });
@@ -101,7 +101,7 @@ export async function createBitcoinInvoiceViaUI(page: Page, username: string) {
return { invoiceId: invoiceId!, address };
}
-export async function createLightningInvoiceViaUI(page: Page, username: string) {
+export async function createLightningInvoiceViaUI(page: Page, _username: string) {
await page.goto(`/invoice`);
await page.waitForURL(/\/invoice\/[^/?#]+/, { timeout: 15_000 });
diff --git a/test/e2e/mls-messaging.spec.ts b/test/e2e/mls-messaging.spec.ts
index 94955950..b73b90aa 100644
--- a/test/e2e/mls-messaging.spec.ts
+++ b/test/e2e/mls-messaging.spec.ts
@@ -99,7 +99,7 @@ test.describe("MLS messaging", () => {
});
test("Messages appear in the chat list on /messages", async ({ browser }) => {
- const { context: aliceCtx, page: alicePage, pubkey: alicePubkey } = await loginWithNsec(browser, aliceUsername, alicePassword);
+ const { context: aliceCtx, page: alicePage } = await loginWithNsec(browser, aliceUsername, alicePassword);
const bobRes = await alicePage.request.get(`${apiBaseUrl}/users/${bobUsername}`);
const bobPubkey = (await bobRes.json()).pubkey;
diff --git a/test/e2e/vault-receive-bitcoin.spec.ts b/test/e2e/vault-receive-bitcoin.spec.ts
index 0759d4c0..32fc9be4 100644
--- a/test/e2e/vault-receive-bitcoin.spec.ts
+++ b/test/e2e/vault-receive-bitcoin.spec.ts
@@ -10,7 +10,6 @@ import {
bitcoinSend,
mineBlocks,
waitForInvoicePaid,
- waitForPaidRedirect,
} from "./helpers";
test("bitcoin vault receives external bitcoin payment from bitcoind", async ({ page }) => {
diff --git a/test/e2e/vault-send-bob-btc.spec.ts b/test/e2e/vault-send-bob-btc.spec.ts
index 3d375b7b..f8daa0fb 100644
--- a/test/e2e/vault-send-bob-btc.spec.ts
+++ b/test/e2e/vault-send-bob-btc.spec.ts
@@ -7,7 +7,6 @@ import {
fillNumpadAmount,
waitForSendComplete,
setActiveAccount,
- apiBaseUrl,
apiLogin,
ensureVaultAccount,
fundVaultAccount,
diff --git a/test/e2e/vault-send-to-custodial-btc.spec.ts b/test/e2e/vault-send-to-custodial-btc.spec.ts
index aa52213c..c963b786 100644
--- a/test/e2e/vault-send-to-custodial-btc.spec.ts
+++ b/test/e2e/vault-send-to-custodial-btc.spec.ts
@@ -5,10 +5,8 @@ import {
bobUsername,
bobPassword,
apiBaseUrl,
- login,
loginNewContext,
setActiveAccount,
- createBitcoinInvoiceViaUI,
pasteAndSend,
} from "./helpers";