From 5a2a9a2cd25fe8bcdd61a290a5b286180d909fd3 Mon Sep 17 00:00:00 2001 From: Silberengel Date: Tue, 3 Feb 2026 08:48:34 +0100 Subject: [PATCH] refactor --- httpd.conf.template | 2 +- package-lock.json | 334 ++++++++-------- package.json | 8 +- public/healthz.json | 4 +- .../content/MarkdownRenderer.svelte | 114 +++--- src/lib/components/layout/Header.svelte | 26 -- .../modals/KeyboardShortcutsModal.svelte | 194 --------- src/lib/components/modals/SearchModal.svelte | 370 ------------------ src/lib/modules/feed/CreateFeedForm.svelte | 148 ------- src/lib/modules/feed/FeedPage.svelte | 99 +---- src/lib/modules/feed/ReplyToKind1Form.svelte | 141 ------- .../reactions/FeedReactionButtons.svelte | 6 +- .../modules/reactions/ReactionButtons.svelte | 6 +- .../modules/threads/CreateThreadForm.svelte | 184 --------- src/lib/services/cache/event-cache.ts | 23 -- src/lib/services/cache/search-index.ts | 46 --- src/lib/services/event-filter.ts | 8 +- src/lib/services/keyboard-shortcuts.ts | 126 ------ src/lib/services/security/bech32-utils.ts | 50 --- src/lib/services/security/event-validator.ts | 55 --- src/routes/+layout.svelte | 20 - src/routes/+page.svelte | 28 -- svelte.config.js | 2 +- 23 files changed, 249 insertions(+), 1745 deletions(-) delete mode 100644 src/lib/components/modals/KeyboardShortcutsModal.svelte delete mode 100644 src/lib/components/modals/SearchModal.svelte delete mode 100644 src/lib/modules/feed/CreateFeedForm.svelte delete mode 100644 src/lib/modules/feed/ReplyToKind1Form.svelte delete mode 100644 src/lib/modules/threads/CreateThreadForm.svelte delete mode 100644 src/lib/services/cache/search-index.ts delete mode 100644 src/lib/services/keyboard-shortcuts.ts delete mode 100644 src/lib/services/security/bech32-utils.ts delete mode 100644 src/lib/services/security/event-validator.ts diff --git a/httpd.conf.template b/httpd.conf.template index f91863b..f025271 100644 --- a/httpd.conf.template +++ b/httpd.conf.template @@ -19,7 +19,7 @@ RewriteRule ^healthz$ /healthz.json [L] RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d -RewriteRule . /index.html [L] +RewriteRule . /200.html [L] Header set Service-Worker-Allowed "/" diff --git a/package-lock.json b/package-lock.json index d9f2978..4e5a5a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@sveltejs/kit": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@sveltejs/vite-plugin-svelte": "^4.0.0-next.6", "dompurify": "^3.0.6", "idb": "^8.0.0", "marked": "^11.1.1", @@ -32,7 +32,7 @@ "prettier-plugin-svelte": "^3.2.2", "tailwindcss": "^3.4.1", "typescript": "^5.3.3", - "vite": "^5.1.0" + "vite": "^5.4.21" } }, "node_modules/@alloc/quick-lru": { @@ -49,9 +49,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -61,13 +61,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -77,13 +77,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -93,13 +93,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -109,13 +109,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -125,13 +125,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -141,13 +141,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -157,13 +157,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -173,13 +173,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -189,13 +189,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -205,13 +205,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -221,13 +221,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -237,13 +237,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -253,13 +253,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -269,13 +269,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -285,13 +285,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -301,13 +301,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -317,13 +317,29 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -333,13 +349,29 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -349,13 +381,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -365,13 +397,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -381,13 +413,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -397,13 +429,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -413,7 +445,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1122,56 +1154,43 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz", - "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-4.0.4.tgz", + "integrity": "sha512-0ba1RQ/PHen5FGpdSrW7Y3fAMQjrXantECALeOiOdBdzR5+5vPP6HVZRLmZaQL+W8m++o+haIAKq5qT+MiZ7VA==", "license": "MIT", "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", - "debug": "^4.3.4", + "@sveltejs/vite-plugin-svelte-inspector": "^3.0.0-next.0||^3.0.0", + "debug": "^4.3.7", "deepmerge": "^4.3.1", "kleur": "^4.1.5", - "magic-string": "^0.30.10", - "svelte-hmr": "^0.16.0", - "vitefu": "^0.2.5" + "magic-string": "^0.30.12", + "vitefu": "^1.0.3" }, "engines": { - "node": "^18.0.0 || >=20" + "node": "^18.0.0 || ^20.0.0 || >=22" }, "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", + "svelte": "^5.0.0-next.96 || ^5.0.0", "vite": "^5.0.0" } }, "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", - "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-3.0.1.tgz", + "integrity": "sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==", "license": "MIT", "dependencies": { - "debug": "^4.3.4" + "debug": "^4.3.7" }, "engines": { - "node": "^18.0.0 || >=20" + "node": "^18.0.0 || ^20.0.0 || >=22" }, "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", + "@sveltejs/vite-plugin-svelte": "^4.0.0-next.0||^4.0.0", + "svelte": "^5.0.0-next.96 || ^5.0.0", "vite": "^5.0.0" } }, - "node_modules/@sveltejs/vite-plugin-svelte/node_modules/svelte-hmr": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", - "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", - "license": "ISC", - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.19.0 || ^4.0.0" - } - }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -1969,41 +1988,43 @@ "license": "ISC" }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "hasInstallScript": true, "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -4222,12 +4243,17 @@ } }, "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "peerDependenciesMeta": { "vite": { diff --git a/package.json b/package.json index 7f6b921..401aada 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ }, "dependencies": { "@sveltejs/kit": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@sveltejs/vite-plugin-svelte": "^4.0.0-next.6", "dompurify": "^3.0.6", "idb": "^8.0.0", "marked": "^11.1.1", @@ -46,6 +46,10 @@ "prettier-plugin-svelte": "^3.2.2", "tailwindcss": "^3.4.1", "typescript": "^5.3.3", - "vite": "^5.1.0" + "vite": "^5.4.21" + }, + "overrides": { + "@sveltejs/vite-plugin-svelte": "^4.0.0-next.6", + "esbuild": "^0.24.2" } } diff --git a/public/healthz.json b/public/healthz.json index 32db4f4..6375592 100644 --- a/public/healthz.json +++ b/public/healthz.json @@ -2,7 +2,7 @@ "status": "ok", "service": "aitherboard", "version": "0.1.0", - "buildTime": "2026-02-03T06:34:16.073Z", + "buildTime": "2026-02-03T07:39:15.977Z", "gitCommit": "unknown", - "timestamp": 1770100456074 + "timestamp": 1770104355977 } \ No newline at end of file diff --git a/src/lib/components/content/MarkdownRenderer.svelte b/src/lib/components/content/MarkdownRenderer.svelte index 5d4b781..282e9ae 100644 --- a/src/lib/components/content/MarkdownRenderer.svelte +++ b/src/lib/components/content/MarkdownRenderer.svelte @@ -1,5 +1,5 @@
@@ -67,14 +51,6 @@ {:else} Login {/if} - @@ -82,8 +58,6 @@
- (showShortcuts = false)} /> - diff --git a/src/lib/components/modals/SearchModal.svelte b/src/lib/components/modals/SearchModal.svelte deleted file mode 100644 index 234f726..0000000 --- a/src/lib/components/modals/SearchModal.svelte +++ /dev/null @@ -1,370 +0,0 @@ - - -{#if open} -
{ - if (e.target === e.currentTarget) onClose(); - }} - onkeydown={(e) => { - if (e.key === 'Escape') { - e.preventDefault(); - onClose(); - } - }} - role="dialog" - aria-modal="true" - aria-labelledby="search-title" - tabindex="-1" - > -
-
-

Search

- -
- -
- - -
- - {#if loading} -
-

- Searching... -

-
- {:else if results.length > 0} -
-

- Found {results.length} {results.length === 1 ? 'result' : 'results'} -

-
- {#each results as event (event.id)} - - {/each} -
-
- {:else if query.trim() && !loading} -
-

- No results found -

-
- {/if} -
-
-{/if} - - diff --git a/src/lib/modules/feed/CreateFeedForm.svelte b/src/lib/modules/feed/CreateFeedForm.svelte deleted file mode 100644 index 52b6b31..0000000 --- a/src/lib/modules/feed/CreateFeedForm.svelte +++ /dev/null @@ -1,148 +0,0 @@ - - -
- {#if parentEvent} -
- Replying to: {parentEvent.content.slice(0, 100)}... -
- {/if} - - - -
- - -
- {#if onCancel} - - {/if} - -
-
-
- - diff --git a/src/lib/modules/feed/FeedPage.svelte b/src/lib/modules/feed/FeedPage.svelte index 0c423ea..d6533d3 100644 --- a/src/lib/modules/feed/FeedPage.svelte +++ b/src/lib/modules/feed/FeedPage.svelte @@ -1,10 +1,8 @@ - -
-
- Replying to: {parentEvent.content.slice(0, 100)}... -
- - - -
- - -
- {#if onCancel} - - {/if} - -
-
-
- - diff --git a/src/lib/modules/reactions/FeedReactionButtons.svelte b/src/lib/modules/reactions/FeedReactionButtons.svelte index 82e35ee..42aaff8 100644 --- a/src/lib/modules/reactions/FeedReactionButtons.svelte +++ b/src/lib/modules/reactions/FeedReactionButtons.svelte @@ -116,10 +116,12 @@ await signAndPublish(reactionEvent, [...config.defaultRelays]); userReaction = content; + const currentPubkey = sessionManager.getCurrentPubkey()!; if (!reactions.has(content)) { - reactions.set(content, { content, pubkeys: new Set() }); + reactions.set(content, { content, pubkeys: new Set([currentPubkey]) }); + } else { + reactions.get(content)!.pubkeys.add(currentPubkey); } - reactions.get(content)!.pubkeys.add(sessionManager.getCurrentPubkey()!); } catch (error) { console.error('Error publishing reaction:', error); alert('Error publishing reaction'); diff --git a/src/lib/modules/reactions/ReactionButtons.svelte b/src/lib/modules/reactions/ReactionButtons.svelte index d26e34e..cf6b36b 100644 --- a/src/lib/modules/reactions/ReactionButtons.svelte +++ b/src/lib/modules/reactions/ReactionButtons.svelte @@ -137,10 +137,12 @@ // Update local state userReaction = content; + const currentPubkey = sessionManager.getCurrentPubkey()!; if (!reactions.has(content)) { - reactions.set(content, { content, pubkeys: new Set() }); + reactions.set(content, { content, pubkeys: new Set([currentPubkey]) }); + } else { + reactions.get(content)!.pubkeys.add(currentPubkey); } - reactions.get(content)!.pubkeys.add(sessionManager.getCurrentPubkey()!); } catch (error) { console.error('Error publishing reaction:', error); alert('Error publishing reaction'); diff --git a/src/lib/modules/threads/CreateThreadForm.svelte b/src/lib/modules/threads/CreateThreadForm.svelte deleted file mode 100644 index 939c05a..0000000 --- a/src/lib/modules/threads/CreateThreadForm.svelte +++ /dev/null @@ -1,184 +0,0 @@ - - -
{ e.preventDefault(); publish(); }} class="create-thread-form"> -
- - -
- -
- - -
- -
- -
- e.key === 'Enter' && (e.preventDefault(), addTopic())} - class="flex-1 p-2 border border-fog-border bg-fog-post text-fog-text" - disabled={topics.length >= 3} - /> - -
-
- {#each topics as topic, i} - - {topic} - - - {/each} -
-
- -
- -
- -
-

Target Relays

-
- {#each Array.from(selectedRelays) as relay} - - {/each} - {#if selectedRelays.size === 0} -

No relays selected. At least one relay is required.

- {/if} -
-
- - -
- - - - diff --git a/src/lib/services/cache/event-cache.ts b/src/lib/services/cache/event-cache.ts index 4ce7ad9..cd1dd62 100644 --- a/src/lib/services/cache/event-cache.ts +++ b/src/lib/services/cache/event-cache.ts @@ -3,7 +3,6 @@ */ import { getDB } from './indexeddb-store.js'; -import { indexEvent } from './search-index.js'; import type { NostrEvent } from '../../types/nostr.js'; export interface CachedEvent extends NostrEvent { @@ -20,16 +19,6 @@ export async function cacheEvent(event: NostrEvent): Promise { cached_at: Date.now() }; await db.put('events', cached); - - // Index for search (only for events with content) - if (event.content) { - try { - await indexEvent(event.id, event.content); - } catch (error) { - // Don't fail caching if indexing fails - console.error('Error indexing event for search:', error); - } - } } /** @@ -46,18 +35,6 @@ export async function cacheEvents(events: NostrEvent[]): Promise { await tx.store.put(cached); } await tx.done; - - // Index events for search (in background) - for (const event of events) { - if (event.content) { - try { - await indexEvent(event.id, event.content); - } catch (error) { - // Don't fail caching if indexing fails - console.error('Error indexing event for search:', error); - } - } - } } /** diff --git a/src/lib/services/cache/search-index.ts b/src/lib/services/cache/search-index.ts deleted file mode 100644 index e486c7e..0000000 --- a/src/lib/services/cache/search-index.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Full-text search index (deferred implementation) - */ - -import { getDB } from './indexeddb-store.js'; - -/** - * Index event content for search - */ -export async function indexEvent(eventId: string, content: string): Promise { - // Placeholder - full implementation would: - // 1. Tokenize content - // 2. Create inverted index - // 3. Store in IndexedDB - const db = await getDB(); - await db.put('search', { - id: eventId, - content: content.toLowerCase() - }); -} - -/** - * Search events by query - */ -export async function searchEvents(query: string, limit: number = 50): Promise { - // Placeholder - full implementation would: - // 1. Tokenize query - // 2. Look up in inverted index - // 3. Rank results - // 4. Return event IDs - const db = await getDB(); - const results: string[] = []; - const lowerQuery = query.toLowerCase(); - const tx = db.transaction('search', 'readonly'); - - for await (const cursor of tx.store.iterate()) { - if (results.length >= limit) break; - const content = (cursor.value as { content: string }).content; - if (content.includes(lowerQuery)) { - results.push(cursor.key as string); - } - } - - await tx.done; - return results; -} diff --git a/src/lib/services/event-filter.ts b/src/lib/services/event-filter.ts index 3c64063..f817595 100644 --- a/src/lib/services/event-filter.ts +++ b/src/lib/services/event-filter.ts @@ -3,24 +3,24 @@ * Handles content filtering, mute lists, and NSFW detection */ -import type { NostrEvent } from '../../types/nostr.js'; +import type { NostrEvent } from '../types/nostr.js'; import { getMuteList } from './nostr/auth-handler.js'; /** * Check if event should be hidden (content filtering + mute list) */ export function shouldHideEvent(event: NostrEvent): boolean { - // Check mute list + // Check mute list const muteList = getMuteList(); if (muteList.has(event.pubkey)) return true; // Check for content-warning or sensitive tags - const hasContentWarning = event.tags.some((t) => t[0] === 'content-warning' || t[0] === 'sensitive'); + const hasContentWarning = event.tags.some((t: string[]) => t[0] === 'content-warning' || t[0] === 'sensitive'); if (hasContentWarning) return true; // Check for #NSFW in content or tags const content = event.content.toLowerCase(); - const hasNSFW = content.includes('#nsfw') || event.tags.some((t) => t[1]?.toLowerCase() === 'nsfw'); + const hasNSFW = content.includes('#nsfw') || event.tags.some((t: string[]) => t[1]?.toLowerCase() === 'nsfw'); if (hasNSFW) return true; return false; diff --git a/src/lib/services/keyboard-shortcuts.ts b/src/lib/services/keyboard-shortcuts.ts deleted file mode 100644 index 76142c5..0000000 --- a/src/lib/services/keyboard-shortcuts.ts +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Global keyboard shortcuts handler - * Handles j/k navigation, r reply, z zap, / search, etc. - */ - -export interface KeyboardShortcut { - key: string; - ctrl?: boolean; - shift?: boolean; - alt?: boolean; - meta?: boolean; - handler: (e: KeyboardEvent) => void; - description?: string; -} - -class KeyboardShortcutsManager { - private shortcuts: Map = new Map(); - private enabled = true; - - /** - * Register a keyboard shortcut - */ - register(shortcut: KeyboardShortcut): () => void { - const key = this.getKeyString(shortcut); - this.shortcuts.set(key, shortcut); - - // Return unregister function - return () => { - this.shortcuts.delete(key); - }; - } - - /** - * Unregister a keyboard shortcut - */ - unregister(key: string, modifiers?: { ctrl?: boolean; shift?: boolean; alt?: boolean; meta?: boolean }): void { - const keyString = this.getKeyString({ key, ...modifiers, handler: () => {} }); - this.shortcuts.delete(keyString); - } - - /** - * Enable/disable shortcuts - */ - setEnabled(enabled: boolean): void { - this.enabled = enabled; - } - - /** - * Check if shortcuts are enabled - */ - isEnabled(): boolean { - return this.enabled; - } - - /** - * Handle keyboard event - */ - handleKeydown(e: KeyboardEvent): void { - if (!this.enabled) return; - - // Ignore if user is typing in an input, textarea, or contenteditable - const target = e.target as HTMLElement; - if ( - target.tagName === 'INPUT' || - target.tagName === 'TEXTAREA' || - target.isContentEditable - ) { - // Allow / for search even in inputs - if (e.key === '/' && !e.ctrlKey && !e.metaKey) { - // Let it through - } else { - return; - } - } - - const keyString = this.getKeyString({ - key: e.key.toLowerCase(), - ctrl: e.ctrlKey, - shift: e.shiftKey, - alt: e.altKey, - meta: e.metaKey, - handler: () => {} - }); - - const shortcut = this.shortcuts.get(keyString); - if (shortcut) { - e.preventDefault(); - e.stopPropagation(); - shortcut.handler(e); - } - } - - /** - * Get key string for shortcut lookup - */ - private getKeyString(shortcut: KeyboardShortcut): string { - const parts: string[] = []; - if (shortcut.ctrl || shortcut.meta) parts.push('ctrl'); - if (shortcut.shift) parts.push('shift'); - if (shortcut.alt) parts.push('alt'); - parts.push(shortcut.key.toLowerCase()); - return parts.join('+'); - } - - /** - * Initialize global keyboard handler - */ - initialize(): void { - if (typeof window === 'undefined') return; - - const handler = (e: KeyboardEvent) => this.handleKeydown(e); - window.addEventListener('keydown', handler); - - // Return cleanup function - return () => { - window.removeEventListener('keydown', handler); - }; - } -} - -export const keyboardShortcuts = new KeyboardShortcutsManager(); - -// Initialize on module load (browser only) -if (typeof window !== 'undefined') { - keyboardShortcuts.initialize(); -} diff --git a/src/lib/services/security/bech32-utils.ts b/src/lib/services/security/bech32-utils.ts deleted file mode 100644 index fcbeaa1..0000000 --- a/src/lib/services/security/bech32-utils.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Bech32 utilities for NIP-19 encoding/decoding - */ - -export interface DecodedBech32 { - type: 'npub' | 'nsec' | 'note' | 'nevent' | 'naddr' | 'nprofile'; - data: Uint8Array; - relay?: string; -} - -/** - * Decode a bech32 string (simplified - full implementation would use bech32 library) - * This is a placeholder - in production, use a proper bech32 library - */ -export function decodeBech32(bech32: string): DecodedBech32 | null { - try { - const prefix = bech32.split('1')[0]; - if (!prefix) return null; - - // Basic validation - full implementation needed - if (prefix === 'npub' || prefix === 'nsec' || prefix === 'note') { - return { - type: prefix as 'npub' | 'nsec' | 'note', - data: new Uint8Array(32) // Placeholder - }; - } - - return null; - } catch { - return null; - } -} - -/** - * Encode data to bech32 format - */ -export function encodeBech32(type: string, data: Uint8Array, relay?: string): string { - // Placeholder - full implementation needed with bech32 library - // For now, return hex representation - return `${type}1${Array.from(data) - .map((b) => b.toString(16).padStart(2, '0')) - .join('')}`; -} - -/** - * Validate bech32 string format - */ -export function isValidBech32(bech32: string): boolean { - return /^(npub|nsec|note|nevent|naddr|nprofile)1[a-z0-9]+$/.test(bech32); -} diff --git a/src/lib/services/security/event-validator.ts b/src/lib/services/security/event-validator.ts deleted file mode 100644 index be1332b..0000000 --- a/src/lib/services/security/event-validator.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Event validation utilities - */ - -import type { NostrEvent } from '../../types/nostr.js'; - -/** - * Validate event structure - */ -export function isValidEvent(event: unknown): event is NostrEvent { - if (!event || typeof event !== 'object') return false; - - const e = event as Record; - - return ( - typeof e.kind === 'number' && - typeof e.pubkey === 'string' && - typeof e.created_at === 'number' && - typeof e.content === 'string' && - typeof e.id === 'string' && - typeof e.sig === 'string' && - Array.isArray(e.tags) && - e.pubkey.length === 64 && - e.id.length === 64 && - e.sig.length === 128 - ); -} - -/** - * Check if event has required tags for a kind - */ -export function hasRequiredTags(event: NostrEvent, kind: number): boolean { - switch (kind) { - case 0: - // Kind 0 can have tags or JSON content - return true; - case 11: - // Thread - should have title tag - return true; - case 1111: - // Comment - should have K and E tags - return event.tags.some((t) => t[0] === 'K' || t[0] === 'E'); - default: - return true; - } -} - -/** - * Validate event signature (placeholder - would need crypto library) - */ -export function isValidSignature(event: NostrEvent): boolean { - // Placeholder - full implementation would verify signature - // using secp256k1 cryptography - return event.sig.length === 128; -} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index fbbbc41..787a0a6 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,12 +1,8 @@ - - (showSearch = false)} /> diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 1f821c8..fbfefb6 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,23 +1,9 @@