diff options
| author | Adam Soltys <[email protected]> | 2026-03-06 15:07:08 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-03-06 15:07:08 -0800 |
| commit | d14c03e3f2e3806e17852a440d2a39f377570758 (patch) | |
| tree | 38138c52e23a642d0b2c9853e59afb638a87d1e5 | |
| parent | 0020101f8f1d83fb323c77d0620af821be9d4e66 (diff) | |
| download | coinos-ui-d14c03e3f2e3806e17852a440d2a39f377570758.tar.gz coinos-ui-d14c03e3f2e3806e17852a440d2a39f377570758.zip | |
lint
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"; |
