diff options
| author | Adam Soltys <[email protected]> | 2026-02-11 20:10:43 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-02-11 20:10:43 -0800 |
| commit | 56a04684c1fb77ea7b21afc6b0d2e1c4773906f6 (patch) | |
| tree | d6bc2557c56b93177bb14aa376847c6e123a4862 | |
| parent | 13466248004327e9a026cb89f94926f9b060d1c1 (diff) | |
| download | coinos-ui-56a04684c1fb77ea7b21afc6b0d2e1c4773906f6.tar.gz coinos-ui-56a04684c1fb77ea7b21afc6b0d2e1c4773906f6.zip | |
format
161 files changed, 6709 insertions, 2397 deletions
diff --git a/package.json b/package.json index 9690a942..72cee9d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,32 @@ { "name": "coinos", "version": "1.0.9", + "type": "module", + "scripts": { + "dev": "vite dev --host 0.0.0.0", + "build": "vite build", + "builddev": "vite build --mode development", + "buildstaging": "vite build --mode staging", + "docker": "docker build . -t coinos-ui", + "preview": "vite preview", + "test:e2e": "playwright test", + "test:e2e:ark": "ENABLE_E2E_TEST_ENDPOINTS=true E2E_TEST_SECRET=local-e2e-secret ARK_SERVER_WALLET_PRIVATE_KEY=0ebe9a690651e9e08d7c2f4db106d8ec264725241fdb34c57aedb26155b0e027 playwright test test/e2e/ark-receive-from-server-wallet.spec.ts --project=chromium --workers=1", + "test:e2e:ark:headed": "ENABLE_E2E_TEST_ENDPOINTS=true E2E_TEST_SECRET=local-e2e-secret ARK_SERVER_WALLET_PRIVATE_KEY=0ebe9a690651e9e08d7c2f4db106d8ec264725241fdb34c57aedb26155b0e027 playwright test test/e2e/ark-receive-from-server-wallet.spec.ts --project=chromium --headed --workers=1", + "test:e2e:ark:watch": "ENABLE_E2E_TEST_ENDPOINTS=true E2E_TEST_SECRET=local-e2e-secret ARK_SERVER_WALLET_PRIVATE_KEY=0ebe9a690651e9e08d7c2f4db106d8ec264725241fdb34c57aedb26155b0e027 E2E_SLOWMO=350 E2E_PAUSE_AT_END=true playwright test test/e2e/ark-receive-from-server-wallet.spec.ts --project=chromium --headed --workers=1 --retries=0 --timeout=120000 --global-timeout=180000", + "test:e2e:ark:debug": "ENABLE_E2E_TEST_ENDPOINTS=true E2E_TEST_SECRET=local-e2e-secret ARK_SERVER_WALLET_PRIVATE_KEY=0ebe9a690651e9e08d7c2f4db106d8ec264725241fdb34c57aedb26155b0e027 PWDEBUG=1 playwright test test/e2e/ark-receive-from-server-wallet.spec.ts --project=chromium --headed --workers=1", + "lint": "oxlint . && oxfmt --check .", + "lint:fix": "oxlint --fix . && oxfmt .", + "format": "oxfmt ." + }, + "dependencies": { + "@arkade-os/sdk": "^0.3.12", + "@capacitor/status-bar": "^8.0.0", + "@tailwindcss/postcss": "^4.1.18", + "@tailwindcss/vite": "^4.1.18", + "canvas": "^3.2.1", + "cordova-plugin-android-notch": "^1.0.3", + "qrcode": "^1.5.4" + }, "devDependencies": { "@capacitor/android": "^8.0.2", "@capacitor/assets": "^3.0.5", @@ -28,10 +54,9 @@ "iconify-icon": "^3.0.2", "js-cookie": "^3.0.5", "nostr-tools": "^2.23.0", + "oxfmt": "file:../oxc/npm/oxfmt", "oxlint": "^1.35.0", "playwright": "^1.58.2", - "prettier": "^3.8.1", - "prettier-plugin-svelte": "^3.4.1", "qr-scanner": "^1.4.2", "qrcode-base64": "^1.0.1", "rollup": "^4.57.1", @@ -52,31 +77,5 @@ "uuid": "^13.0.0", "vite": "^7.3.1", "ws": "^8.19.0" - }, - "scripts": { - "dev": "vite dev --host 0.0.0.0", - "build": "vite build", - "builddev": "vite build --mode development", - "buildstaging": "vite build --mode staging", - "docker": "docker build . -t coinos-ui", - "preview": "vite preview", - "test:e2e": "playwright test", - "test:e2e:ark": "ENABLE_E2E_TEST_ENDPOINTS=true E2E_TEST_SECRET=local-e2e-secret ARK_SERVER_WALLET_PRIVATE_KEY=0ebe9a690651e9e08d7c2f4db106d8ec264725241fdb34c57aedb26155b0e027 playwright test test/e2e/ark-receive-from-server-wallet.spec.ts --project=chromium --workers=1", - "test:e2e:ark:headed": "ENABLE_E2E_TEST_ENDPOINTS=true E2E_TEST_SECRET=local-e2e-secret ARK_SERVER_WALLET_PRIVATE_KEY=0ebe9a690651e9e08d7c2f4db106d8ec264725241fdb34c57aedb26155b0e027 playwright test test/e2e/ark-receive-from-server-wallet.spec.ts --project=chromium --headed --workers=1", - "test:e2e:ark:watch": "ENABLE_E2E_TEST_ENDPOINTS=true E2E_TEST_SECRET=local-e2e-secret ARK_SERVER_WALLET_PRIVATE_KEY=0ebe9a690651e9e08d7c2f4db106d8ec264725241fdb34c57aedb26155b0e027 E2E_SLOWMO=350 E2E_PAUSE_AT_END=true playwright test test/e2e/ark-receive-from-server-wallet.spec.ts --project=chromium --headed --workers=1 --retries=0 --timeout=120000 --global-timeout=180000", - "test:e2e:ark:debug": "ENABLE_E2E_TEST_ENDPOINTS=true E2E_TEST_SECRET=local-e2e-secret ARK_SERVER_WALLET_PRIVATE_KEY=0ebe9a690651e9e08d7c2f4db106d8ec264725241fdb34c57aedb26155b0e027 PWDEBUG=1 playwright test test/e2e/ark-receive-from-server-wallet.spec.ts --project=chromium --headed --workers=1", - "lint": "oxlint . && prettier --check .", - "lint:fix": "oxlint --fix . && prettier --write .", - "format": "prettier --write ." - }, - "type": "module", - "dependencies": { - "@arkade-os/sdk": "^0.3.12", - "@capacitor/status-bar": "^8.0.0", - "@tailwindcss/postcss": "^4.1.18", - "@tailwindcss/vite": "^4.1.18", - "canvas": "^3.2.1", - "cordova-plugin-android-notch": "^1.0.3", - "qrcode": "^1.5.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..0b810920 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5984 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@arkade-os/sdk': + specifier: ^0.3.12 + version: 0.3.13 + '@capacitor/status-bar': + specifier: ^8.0.0 + version: 8.0.0(@capacitor/[email protected]) + '@tailwindcss/postcss': + specifier: ^4.1.18 + version: 4.1.18 + '@tailwindcss/vite': + specifier: ^4.1.18 + version: 4.1.18([email protected](@types/[email protected])([email protected])([email protected])) + canvas: + specifier: ^3.2.1 + version: 3.2.1 + cordova-plugin-android-notch: + specifier: ^1.0.3 + version: 1.0.3 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + devDependencies: + '@capacitor/android': + specifier: ^8.0.2 + version: 8.1.0(@capacitor/[email protected]) + '@capacitor/assets': + specifier: ^3.0.5 + version: 3.0.5(@types/[email protected])([email protected]) + '@capacitor/cli': + specifier: ^8.0.2 + version: 8.1.0 + '@capacitor/core': + specifier: ^8.0.2 + version: 8.1.0 + '@capacitor/ios': + specifier: ^8.0.2 + version: 8.1.0(@capacitor/[email protected]) + '@iconify/iconify': + specifier: ^3.1.1 + version: 3.1.1 + '@playwright/test': + specifier: ^1.54.2 + version: 1.58.2 + '@scure/base': + specifier: ^2.0.0 + version: 2.0.0 + '@scure/bip39': + specifier: ^2.0.1 + version: 2.0.1 + '@scure/btc-signer': + specifier: ^2.0.1 + version: 2.0.1 + '@sveltejs/adapter-node': + specifier: ^5.5.2 + version: 5.5.2(@sveltejs/[email protected](@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected]))) + '@sveltejs/kit': + specifier: ^2.50.2 + version: 2.50.2(@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected])) + '@sveltejs/vite-plugin-svelte': + specifier: ^6.2.4 + version: 6.2.4([email protected])([email protected](@types/[email protected])([email protected])([email protected])) + '@types/uuid': + specifier: ^11.0.0 + version: 11.0.0 + '@zerodevx/svelte-toast': + specifier: ^0.9.6 + version: 0.9.6([email protected]) + barcode-detector: + specifier: ^3.0.8 + version: 3.0.8(@types/[email protected]) + bech32: + specifier: ^2.0.0 + version: 2.0.0 + bip21: + specifier: ^3.0.0 + version: 3.0.0 + bitcoin-address-validation: + specifier: ^3.0.0 + version: 3.0.0 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + daisyui: + specifier: ^5.5.17 + version: 5.5.18 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 + esptool-js: + specifier: ^0.5.7 + version: 0.5.7 + iconify-icon: + specifier: ^3.0.2 + version: 3.0.2 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + nostr-tools: + specifier: ^2.23.0 + version: 2.23.0([email protected]) + oxfmt: + specifier: file:../oxc/npm/oxfmt + version: file:../oxc/npm/oxfmt + oxlint: + specifier: ^1.35.0 + version: 1.46.0 + playwright: + specifier: ^1.58.2 + version: 1.58.2 + qr-scanner: + specifier: ^1.4.2 + version: 1.4.2 + qrcode-base64: + specifier: ^1.0.1 + version: 1.0.1 + rollup: + specifier: ^4.57.1 + version: 4.57.1 + rollup-plugin-visualizer: + specifier: ^6.0.5 + version: 6.0.5([email protected])([email protected]) + screenfull: + specifier: ^6.0.2 + version: 6.0.2 + svelte: + specifier: ^5.49.1 + version: 5.50.2 + svelte-adapter-bun: + specifier: ^1.0.1 + version: 1.0.1(@sveltejs/[email protected](@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected]) + svelte-confetti: + specifier: ^2.3.2 + version: 2.3.2([email protected]) + svelte-dnd-action: + specifier: ^0.9.69 + version: 0.9.69([email protected]) + svelte-outclick: + specifier: ^4.2.0 + version: 4.2.0([email protected]) + svelte-preprocess: + specifier: ^6.0.3 + sveltekit-i18n: + specifier: ^2.4.2 + version: 2.4.2([email protected]) + tailwind-scrollbar: + specifier: ^4.0.2 + version: 4.0.2([email protected])([email protected]) + tailwindcss: + specifier: ^4.1.18 + version: 4.1.18 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + uint8array-extras: + specifier: ^1.5.0 + version: 1.5.0 + unique-names-generator: + specifier: ^4.7.1 + version: 4.7.1 + uuid: + specifier: ^13.0.0 + version: 13.0.0 + vite: + specifier: ^7.3.1 + ws: + specifier: ^8.19.0 + version: 8.19.0 + +packages: + + '@alloc/[email protected]': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@arkade-os/[email protected]': + resolution: {integrity: sha512-eC6XGifqVf2Xu+sf/3T2duUgLiXlgh/IQXHD+v09wsu8ik/CZedH4gvQpetTjRMKti3DdY/QVLC1OQTKKWgvqQ==} + engines: {node: '>=20.0.0'} + + '@babel/[email protected]': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/[email protected]': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@capacitor/[email protected]': + resolution: {integrity: sha512-z0acTPxj5DCy/U2FU7w+GA93oC+wdyKnsOcRg5rutDmSYa8Do1tzYqApKgf+hnuTNPbtrCTHp0Zy1cLiK/4MEw==} + peerDependencies: + '@capacitor/core': ^8.1.0 + + '@capacitor/[email protected]': + resolution: {integrity: sha512-ohz/OUq61Y1Fc6aVSt0uDrUdeOA7oTH4pkWDbv/8I3UrPjH7oPkzYhShuDRUjekNp9RBi198VSFdt0CetpEOzw==} + engines: {node: '>=10.3.0'} + hasBin: true + + '@capacitor/[email protected]': + resolution: {integrity: sha512-qN8LDlREMhrYhOvVXahoJVNkP8LP55/YPRJrzTAFrMqlNJC18L3CzgWYIblFPnuwfbH/RxbfoZT/ydkwgVpMrw==} + engines: {node: '>=16.0.0'} + hasBin: true + + '@capacitor/[email protected]': + resolution: {integrity: sha512-JAzA/ckPgTCjZz6YumBLV2dNCFEVXAuR1oOKLD7AJ4LAI5pF5RtRZrf5FoaxvJVb0S4CouZT5cD+7NwsNJX/nw==} + engines: {node: '>=22.0.0'} + hasBin: true + + '@capacitor/[email protected]': + resolution: {integrity: sha512-UfMBMWc1v7J+14AhH03QmeNwV3HZx3qnOWhpwnHfzALEwAwlV/itQOQqcasMQYhOHWL0tiymc5ByaLTn7KKQxw==} + + '@capacitor/[email protected]': + resolution: {integrity: sha512-wPaQ8ayL0UY+SxydZbrmfzPs8TryZVEB6hrL/XBnXxQtb6rpEmIy/3GIltPwM+/T4m/IuaSDZOToWK65ruC00g==} + peerDependencies: + '@capacitor/core': ^8.1.0 + + '@capacitor/[email protected]': + resolution: {integrity: sha512-aIj3bc7z8lfPgOen8HlrBrkfnxpFnh21OCx6jCUx4Mvv+B6eEkUQ49b32DOddgVfr+igRHLX2SYi7duqIsNDXg==} + peerDependencies: + '@capacitor/core': '>=8.0.0' + + '@cspotcode/[email protected]': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@emnapi/[email protected]': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/[email protected]': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/[email protected]': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/[email protected]': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/[email protected]': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@hutson/[email protected]': + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + + '@iconify/[email protected]': + resolution: {integrity: sha512-1nemfyD/OJzh9ALepH7YfuuP8BdEB24Skhd8DXWh0hzcOxImbb1ZizSZkpCzAwSZSGcJFmscIBaBQu+yLyWaxQ==} + deprecated: no longer maintained, switch to modern iconify-icon web component + + '@iconify/[email protected]': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@ionic/[email protected]': + resolution: {integrity: sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-Uavxn+x8j3rDlZEk1X7YnaN6wCgbCwYQOeIjv/m94i1dzslqWhqIHEqxEyeE8HsT5Negboagg7GtQiABy+BLbA==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-4+Kitey1lTA1yGtnigeYNhV/0tggI3lWBMjC7tBs1K9GXa/q7q4CtOISppdh8QgtOhrhAXS2Igp8rbko/Cj+lA==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-nGYvyGVjU0kjPUcSRFr4ROTraT3w/7r502f5QJEsMRKTqa4eEzCshtwRk+/mpASm0kgBN5rrjYA5A/OZg8ahqg==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==} + engines: {node: '>=16.0.0'} + + '@ionic/[email protected]': + resolution: {integrity: sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==} + engines: {node: '>=16.0.0'} + + '@isaacs/[email protected]': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/[email protected]': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} + engines: {node: 20 || >=22} + + '@isaacs/[email protected]': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/[email protected]': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/[email protected]': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/[email protected]': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/[email protected]': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/[email protected]': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jridgewell/[email protected]': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@marcbachmann/[email protected]': + resolution: {integrity: sha512-P6o26TvjStT8V8+8EF+yq9Pp7ZFV00bpiUMbssr76XbIZGxaB+NNWeBp6WNxOrR9gp0JPzvJueCKHpOs5LE9PQ==} + engines: {node: '>=20.19.0'} + hasBin: true + + '@napi-rs/[email protected]': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + + '@noble/[email protected]': + resolution: {integrity: sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==} + engines: {node: '>= 20.19.0'} + + '@noble/[email protected]': + resolution: {integrity: sha512-RiwZZeJnsTnhT+/gg2KvITJZhK5oagQrpZo+yQyd3mv3D5NAG2qEeEHpw7IkXRlpkoD45wl2o4ydHAvY9wyEfw==} + engines: {node: '>= 20.19.0'} + + '@noble/[email protected]': + resolution: {integrity: sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==} + engines: {node: '>= 20.19.0'} + + '@noble/[email protected]': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@noble/[email protected]': + resolution: {integrity: sha512-h8VUBlE8R42+XIDO229cgisD287im3kdY6nbNZJFjc6ZvKIXPYXe6Vc/t+kyjFdMFyt5JpapzTsEg8n63w5/lw==} + engines: {node: '>= 20.19.0'} + + '@noble/[email protected]': + resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + engines: {node: '>= 20.19.0'} + + '@noble/[email protected]': + resolution: {integrity: sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg==} + + '@nodelib/[email protected]': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/[email protected]': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/[email protected]': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oxc-project/[email protected]': + resolution: {integrity: sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==} + + '@oxlint/[email protected]': + resolution: {integrity: sha512-vLPcE+HcZ/W/0cVA1KLuAnoUSejGougDH/fDjBFf0Q+rbBIyBNLevOhgx3AnBNAt3hcIGY7U05ISbJCKZeVa3w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-b8IqCczUsirdtJ3R/be4cRm64I5pMPafMO/9xyTAZvc+R/FxZHMQuhw0iNT9hQwRn+Uo5rNAoA8QS7QurG2QeA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-CfC/KGnNMhI01dkfCMjquKnW4zby3kqD5o/9XA7+pgo9I4b+Nipm+JVFyZPWMNwKqLXNmi35GTLWjs9svPxlew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-m38mKPsV3rBdWOJ4TAGZiUjWU8RGrBxsmdSeMQ0bPr/8O6CUOm/RJkPBf0GAfPms2WRVcbkfEXvIiPshAeFkeA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-YaFRKslSAfuMwn7ejS1/wo9jENqQigpGBjjThX+mrpmEROLYGky+zIC5xSVGRng28U92VEDVbSNJ/sguz3dUAA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-Nlw+5mSZQtkg1Oj0N8ulxzG8ATpmSDz5V2DNaGhaYAVlcdR8NYSm/xTOnweOXc/UOOv3LwkPPYzqcfPhu2lEkA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-d3Y5y4ukMqAGnWLMKpwqj8ftNUaac7pA0NrId4AZ77JvHzezmxEcm2gswaBw2HW8y1pnq6KDB0vEPPvpTfDLrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-jkjx+XSOPuFR+C458prQmehO+v0VK19/3Hj2mOYDF4hHUf3CzmtA4fTmQUtkITZiGHnky7Oao6JeJX24mrX7WQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-X/aPB1rpJUdykjWSeeGIbjk6qbD8VDulgLuTSMWgr/t6m1ljcAjqHb1g49pVG9bZl55zjECgzvlpPLWnfb4FMQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-AymyOxGWwKY2KJa8b+h8iLrYJZbWKYCjqctSc2q6uIAkYPrCsxcWlge1JP6XZ14Sa80DVMwI/QvktbytSV+xVw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-PkeVdPKCDA59rlMuucsel2LjlNEpslQN5AhkMMorIJZItbbqi/0JSuACCzaiIcXYv0oNfbeQ8rbOBikv+aT6cg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-snQaRLO/X+Ry/CxX1px1g8GUbmXzymdRs+/RkP2bySHWZFhFDtbLm2hA1ujX/jKlTLMJDZn4hYzFGLDwG/Rh2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-kZhDMwUe/sgDTluGao9c0Dqc1JzV6wPzfGo0l/FLQdh5Zmp39Yg1FbBsCgsJfVKmKl1fNqsHyFLTShWMOlOEhA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-n5a7VtQTxHZ13cNAKQc3ziARv5bE1Fx868v/tnhZNVUjaRNYe5uiUrRJ/LZghdAzOxVuQGarjjq/q4QM2+9OPA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-KpsDU/BhdVn3iKCLxMXAOZIpO8fS0jEA5iluRoK1rhHPwKtpzEm/OCwERsu/vboMSZm66qnoTUVXRPJ8M+iKVQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-jtbqUyEXlsDlRmMtTZqNbw49+1V/WxqNAR5l0S3OEkdat9diI5I+eqq9IT+jb5cSDdszTGcXpn7S3+gUYSydxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-EE8NjpqEZPwHQVigNvdyJ11dZwWIfsfn4VeBAuiJeAdrnY4HFX27mIjJINJgP5ZdBYEFV1OWH/eb9fURCYel8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-BHyk3H/HRdXs+uImGZ/2+qCET+B8lwGHOm7m54JiJEEUWf3zYCFX/Df1SPqtozWWmnBvioxoTG1J3mPRAr8KUA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/[email protected]': + resolution: {integrity: sha512-DJbQsSJUr4KSi9uU0QqOgI7PX2C+fKGZX+YDprt3vM2sC0dWZsgVTLoN2vtkNyEWJSY2mnvRFUshWXT3bmo0Ug==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@paralleldrive/[email protected]': + resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + + '@playwright/[email protected]': + resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} + engines: {node: '>=18'} + hasBin: true + + '@polka/[email protected]': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@prettier/[email protected]': + resolution: {integrity: sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==} + + '@rolldown/[email protected]': + resolution: {integrity: sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-JXmaOJGsL/+rsmMfutcDjxWM2fTaVgCHGoXS7nE8Z3c9NAYjGqHvXrAhMUZvMpHS/k7Mg+X7n/MVKb7NYWKKww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-ep3Catd6sPnHTM0P4hNEvIv5arnDvk01PfyJIJ+J3wVCG1eEaPo09tvFqdtcaTrkwQy0VWR24uz+cb4IsK53Qw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-LwA5ayKIpnsgXJEwWc3h8wPiS33NMIHd9BhsV92T8VetVAbGe2qXlJwNVDGHN5cOQ22R9uYvbrQir2AB+ntT2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-AC1WsGdlV1MtGay/OQ4J9T7GRadVnpYRzTcygV1hKnypbYN20Yh4t6O1Sa2qRBMqv1etulUknqXjc3CTIsBu6A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-lU+6rgXXViO61B4EudxtVMXSOfiZONR29Sys5VGSetUY7X8mg9FCKIIjcPPj8xNDeYzKl+H8F/qSKOBVFJChCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-DZaN1f0PGp/bSvKhtw50pPsnln4T13ycDq1FrDWRiHmWt1JeW+UtYg9touPFf8yt993p8tS2QjybpzKNTxYEwg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-RnGxwZLN7fhMMAItnD6dZ7lvy+TI7ba+2V54UF4dhaWa/p8I/ys1E73KO6HmPmgz92ZkfD8TXS1IMV8+uhbR9g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-6lcI79+X8klGiGd8yHuTgQRjuuJYNggmEml+RsyN596P23l/zf9FVmJ7K0KVKkFAeYEdg0iMUKyIxiV5vebDNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-wz7ohsKCAIWy91blZ/1FlpPdqrsm1xpcEOQVveWoL6+aSPKL4VUcoYmmzuLTssyZxRpEwzuIxL/GDsvpjaBtOw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-cfiMrfuWCIgsFmcVG0IPuO6qTRHvF7NuG3wngX1RZzc6dU8FuBFb+J3MIR5WrdTNozlumfgL4cvz+R4ozBCvsQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-p6UeR9y7ht82AH57qwGuFYn69S6CZ7LLKdCKy/8T3zS9VTrJei2/CGsTUV45Da4Z9Rbhc7G4gyWQ/Ioamqn09g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/[email protected]': + resolution: {integrity: sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==} + + '@rollup/[email protected]': + resolution: {integrity: sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/[email protected]': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/[email protected]': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/[email protected]': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/[email protected]': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + + '@rollup/[email protected]': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + + '@rollup/[email protected]': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + + '@rollup/[email protected]': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + + '@rollup/[email protected]': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/[email protected]': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/[email protected]': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + + '@rollup/[email protected]': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/[email protected]': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/[email protected]': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + + '@rollup/[email protected]': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + + '@rollup/[email protected]': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/[email protected]': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + + '@scure/[email protected]': + resolution: {integrity: sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==} + + '@scure/[email protected]': + resolution: {integrity: sha512-4Md1NI5BzoVP+bhyJaY3K6yMesEFzNS1sE/cP+9nuvE7p/b0kx9XbpDHHFl8dHtufcbdHRUUQdRqLIPHN/s7yA==} + + '@scure/[email protected]': + resolution: {integrity: sha512-PsxdFj/d2AcJcZDX1FXN3dDgitDDTmwf78rKZq1a6c1P1Nan1X/Sxc7667zU3U+AN60g7SxxP0YCVw2H/hBycg==} + + '@scure/[email protected]': + resolution: {integrity: sha512-vk5a/16BbSFZkhh1JIJ0+4H9nceZVo5WzKvJGGWiPp3sQOExeW+L53z3dI6u0adTPoE8ZbL+XEb6hEGzVZSvvQ==} + + '@standard-schema/[email protected]': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@sveltejs/[email protected]': + resolution: {integrity: sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/[email protected]': + resolution: {integrity: sha512-L15Djwpr7HrSAPj/Z8PYfc0pa9A1tllrr18phKI0WJHJeoWw45yinPf0IGgVTmakqx1B3JQ+C/OFl9ZwmxHU1Q==} + peerDependencies: + '@sveltejs/kit': ^2.4.0 + + '@sveltejs/[email protected]': + resolution: {integrity: sha512-875hTUkEbz+MyJIxWbQjfMaekqdmEKUUfR7JyKcpfMRZqcGyrO9Gd+iS1D/Dx8LpE5FEtutWGOtlAh4ReSAiOA==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ^5.3.3 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + typescript: + optional: true + + '@sveltejs/[email protected]': + resolution: {integrity: sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltejs/[email protected]': + resolution: {integrity: sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltekit-i18n/[email protected]': + resolution: {integrity: sha512-kg1kql1/ro/lIudwFiWrv949Q07gmweln87tflUZR51MNdXXzK4fiJQv5Mw50K/CdQ5BOk/dJ0WOH2vOtBI6yw==} + peerDependencies: + svelte: '>=3.49.0' + + '@sveltekit-i18n/[email protected]': + resolution: {integrity: sha512-/gtzLlqm/sox7EoPKD56BxGZktK/syGc79EbJAPWY5KVitQD9SM0TP8yJCqDxTVPk7Lk0WJhrBGUE2Nn0f5M1w==} + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==} + + '@tailwindcss/[email protected]': + resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@trapezedev/[email protected]': + resolution: {integrity: sha512-WQVF5pEJ5o/mUyvfGTG9nBKx9Te/ilKM3r2IT69GlbaooItT5ao7RyF1MUTBNjHLPk/xpGUY3c6PyVnjDlz0Vw==} + + '@trapezedev/[email protected]': + resolution: {integrity: sha512-GANh8Ey73MechZrryfJoILY9hBnWqzS6AdB53zuWBCBbaiImyblXT41fWdN6pB2f5+cNI2FAUxGfVhl+LeEVbQ==} + + '@tsconfig/[email protected]': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/[email protected]': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/[email protected]': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/[email protected]': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tybys/[email protected]': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/[email protected]': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/[email protected]': + resolution: {integrity: sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==} + + '@types/[email protected]': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/[email protected]': + resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} + + '@types/[email protected]': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/[email protected]': + resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} + + '@types/[email protected]': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/[email protected]': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + + '@types/[email protected]': + resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==} + + '@types/[email protected]': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/[email protected]': + resolution: {integrity: sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==} + + '@types/[email protected]': + resolution: {integrity: sha512-HVyk8nj2m+jcFRNazzqyVKiZezyhDKrGUA3jlEcg/nZ6Ms+qHwocba1Y/AaVaznJTAM9xpdFSh+ptbNrhOGvZA==} + deprecated: This is a stub types definition. uuid provides its own type definitions, so you do not need this installed. + + '@xml-tools/[email protected]': + resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} + + '@xmldom/[email protected]': + resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} + engines: {node: '>=10.0.0'} + deprecated: this version is no longer supported, please update to at least 0.8.* + + '@xmldom/[email protected]': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + engines: {node: '>=10.0.0'} + + '@zerodevx/[email protected]': + resolution: {integrity: sha512-nHlTrCjverlPK9yukK6fqbG3e/R+f10ldrc4nJHOe2qNDScuPTuYVSFEk2dDDtzWAwTN5pmdEXgA3M2RbT8jiw==} + peerDependencies: + svelte: ^3.57.0 || ^4.0.0 || ^5.0.0 + + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + resolution: {integrity: sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==} + + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + resolution: {integrity: sha512-Z9jzzE8ngEDyN9EU7lWdGgV07mcnEQnrX8W9WecXDqD2v+5CcVjt9+a134a5zb+kICvpsrDx6NYA6ay4LGFs8A==} + + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + resolution: {integrity: sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + engines: {bare: '>=1.14.0'} + + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + + resolution: {integrity: sha512-3hf42BysHnUqmZO7mK6e5X/hs1AvyEJIhdVLbG/Mxn/fhFnhGxOO37mWbMHg1RT4TxqcPKXgqj9/bp1YG0GBXA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} + + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + resolution: {integrity: sha512-uJ3opZiOUs9x+Q+D6ezcIQje3ymIXyFFEbx1C8wRVSERxQ0rXTG4FJuj8neYUDNJhwsvTy9f2dYMaUMq+3/fIw==} + + resolution: {integrity: sha512-O1htyufFTYy3EO0JkHg2CLykdXEtV2ssqw47Gq9A0WByp662xpJnMEB9m43LZjsSDjIAOozWRExlFQk2hlV1XQ==} + engines: {node: '>=4.5.0'} + + resolution: {integrity: sha512-R1X1c9EdgjgjTpjshjk5e16TbgF7HYasxBcu7l5ScWMxVs53845vMUg5PvnQ/R/3h8Grly6Y52DgH6/77gazLQ==} + + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} + + resolution: {integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==} + engines: {node: '>= 5.10.0'} + + resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} + engines: {node: '>= 5.10.0'} + + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-ej1sPFR5+0YWtaVp6S1N1FVz69TQCqmrkGeRvQxZeAB1nAIcjNTHVwrZtYtWFFBmQsF40/uDLehsW5KuYC99mg==} + engines: {node: ^18.12.0 || >= 20.9.0} + + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==} + + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + resolution: {integrity: sha512-4Nsqzrl26wzUAH4zSFY/RxLemxSqmi2Uppw1/Gyt0d2JMtJOW6aj9ZNLVUpFF8tqGmBsUJQi33/Z8JIpah9NDg==} + engines: {cordovaDependencies: {0.1.0: {cordova: '>=3.0.0'}, 3.0.0: {cordova: '>100'}}} + + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + resolution: {integrity: sha512-VVzjpOitMGB6DWIBeRSapbjdOevFqyzpk9u5Um6a4tyId3JFrU5pbtF0vgjXDth76mJZbueN/j9Ok03SPrh/og==} + + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} + + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} + + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==} + engines: {node: '>= 0.4.0'} + + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + engines: {node: '>=10.13.0'} + + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + resolution: {integrity: sha512-k3pkXU9OTySCd58OUDjuJWNnFjM+QpPWAghxyWPm3zNfaLiP4ex2jNd7Rj0jWPu3/fgvwau236tetsTZrh4x5g==} + + resolution: {integrity: sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==} + + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} + + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} + + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + resolution: {integrity: sha512-035InabNu/c1lW0tzPhAgapKctblppqsKKG9ZaNzbr+gXwWMjXoiyGSyB9sArzrjG7jY+zntRq5ZSUYemrnWVQ==} + engines: {node: 20 || >=22} + + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting [email protected] + + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting [email protected] + + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + resolution: {integrity: sha512-is3hDn9zb8XXnjbEeAEIqxTpLHUiGBqjegLmXPuyMBfKAggpadWFku4/AP8iYAGBX6qR9/5UIUIp47V0XI3aMw==} + hasBin: true + + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-DYPAumiUeUeT/GHT8x2wrAVKn1FqZJqFH0Y5pBefapWRreV1BBvqBVMb0020YQ2njmbR59r/IathL2d2OrDrxA==} + + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} + + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + resolution: {integrity: sha512-yiOlDqcVCz7AG1eSboonc18FTlfqDEKYfGoAV3Lul98u6YRV/s0kjtf4bjk47t0hLTFJR0BSYMd6BpmX3xDjNQ==} + + resolution: {integrity: sha512-AKb8znIvg9sooythbXzyFeChEY0SkW0C6iXECpy/ls0e5BtwXO45J9wD9SLzBztnS4XmF/5kwZknsq+jyynd/A==} + engines: {node: '>= 20.19.0'} + + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} + engines: {node: 20 || >=22} + + resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} + + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + resolution: {integrity: sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==} + engines: {node: '>=16.0.0'} + hasBin: true + + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} + + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-TcjR+HOxzf3sceLo9ceFekCwaQEamigaPllG7LTu3dLkJiPTw5vF0ekO8n7msWUG/G4D9cV8aqpoR0M3L9Bjwg==} + peerDependencies: + typescript: '>=5.0.0' + peerDependenciesMeta: + typescript: + optional: true + + resolution: {integrity: sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA==} + + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + oxfmt@file:../oxc/npm/oxfmt: + resolution: {directory: ../oxc/npm/oxfmt, type: directory} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + resolution: {integrity: sha512-I9h42QDtAVsRwoueJ4PL/7qN5jFzIUXvbO4Z5ddtII92ZCiD7uiS/JW2V4viBSfGLsbZkQp3YEs6Ls4I8q+8tA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.11.2' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} + engines: {node: '>=18'} + hasBin: true + + resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} + engines: {node: '>=18'} + hasBin: true + + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} + peerDependencies: + react: '>=16.0.0' + + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + + resolution: {integrity: sha512-kV1yQUe2FENvn59tMZW6mOVfpq9mGxGf8l6+EGaXUOd4RBOLg7tRC83OrirM5AtDvZRpdjdlXURsHreAOSPOUw==} + + resolution: {integrity: sha512-B0BDmnRSvbj47Nq/+IeZjj22afNrf4rwIloNrSXN6OwnkoO+Q0hsUa53gCEfqNQjx+OcytF3azvQhi6wV2Tk6g==} + + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + resolution: {integrity: sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw==} + engines: {node: '>=18'} + + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} + + resolution: {integrity: sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==} + engines: {node: '>= 6'} + hasBin: true + + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} + engines: {node: 20 || >=22} + hasBin: true + + resolution: {integrity: sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + resolution: {integrity: sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x || ^1.0.0-beta + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + resolution: {integrity: sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==} + + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} + + resolution: {integrity: sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==} + engines: {node: ^14.13.1 || >=16.0.0} + + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + resolution: {integrity: sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==} + + resolution: {integrity: sha512-1Q6JQU4tX9NqsDGodej6pkrUVQVNapLZnvkwIhddH/JqzBZF1fSaxSWNY6sziXBE8aEa2twtGkXUrwzGeZCMpQ==} + + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} + + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} + engines: {node: '>=12'} + + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} + engines: {node: '>= 0.10.0'} + + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + resolution: {integrity: sha512-tNOvfm8BGgG+rmEA7hkmqtq07v7zoo4skLQc+hIoQ79J+1fkEMpJEA2RzCIe3aPc8JdrsMJkv3mpiZPMsgahjA==} + peerDependencies: + '@sveltejs/kit': ^2.4.0 + typescript: ^5 + + resolution: {integrity: sha512-cfIwoGqMPYWRYDUz2g7mG1uHYWy7VBepelQdzCC3j/M42UrAqaBYmIi9xaoQfow4fbINHO9WuARnTyK2bjjGQg==} + peerDependencies: + svelte: '>=5.0.0' + + resolution: {integrity: sha512-NAmSOH7htJoYraTQvr+q5whlIuVoq88vEuHr4NcFgscDRUxfWPPxgie2OoxepBCQCikrXZV4pqV86aun60wVyw==} + peerDependencies: + svelte: '>=3.23.0 || ^5.0.0-next.0' + + resolution: {integrity: sha512-rQ5u8mSdAAQVfDuxLKMAfoRfwpji1HJksGqiyx8vsjn0z41/GB0Qdqn75sII9WefdwhtjuC6wr7qjFYEqQ/UQw==} + peerDependencies: + svelte: '>= 5' + + resolution: {integrity: sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==} + engines: {node: '>= 18.0.0'} + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: '>=3' + pug: ^3.0.0 + sass: ^1.26.8 + stylus: '>=0.55' + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^4.0.0 || ^5.0.0-next.100 || ^5.0.0 + typescript: ^5.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + + resolution: {integrity: sha512-WCxzm3BBf+Ase6RwiDPR4G36cM4Kb0NuhmLK6x44I+D6reaxizDDg8kBkk4jT/19+Rgmc44eZkOvMO6daoSFIw==} + engines: {node: '>=18'} + + resolution: {integrity: sha512-hjRWn4V4DBL8JQKJoJa3MRvn6d32Zo+rWkoSP5bsQ/XIAguPdQUZJ8LMe6Nc1rST8WEVdu9+vZI3aFdKYGR3+Q==} + peerDependencies: + svelte: '>=3.49.0' + + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + resolution: {integrity: sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==} + engines: {node: '>=12.13.0'} + peerDependencies: + tailwindcss: 4.x + + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} + + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting [email protected] + + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + engines: {node: '>=18'} + + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} + engines: {node: '>=20'} + + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + resolution: {integrity: sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + hasBin: true + + resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + hasBin: true + + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==} + engines: {node: '>=10.0.0'} + + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + resolution: {integrity: sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==} + engines: {node: '>=0.6.0'} + + resolution: {integrity: sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==} + engines: {node: '>=0.6.0'} + + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + + resolution: {integrity: sha512-1gq5zs4wuNTs5umWLypzNNeuJoluFvwmvjiiT3L9z/TMlVveeJRWy7h90xyUqCe+Qq0zL0w7o5zkdDMWDr9aZA==} + peerDependencies: + '@types/emscripten': '>=1.39.6' + +snapshots: + + '@alloc/[email protected]': {} + + '@arkade-os/[email protected]': + dependencies: + '@marcbachmann/cel-js': 7.3.1 + '@noble/curves': 2.0.0 + '@noble/secp256k1': 3.0.0 + '@scure/base': 2.0.0 + '@scure/btc-signer': 2.0.1 + bip68: 1.0.4 + + '@babel/[email protected]': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/[email protected]': {} + + '@capacitor/[email protected](@capacitor/[email protected])': + dependencies: + '@capacitor/core': 8.1.0 + + dependencies: + '@capacitor/cli': 5.7.8 + '@ionic/utils-array': 2.1.6 + '@ionic/utils-fs': 3.1.7 + '@trapezedev/project': 7.1.3(@types/[email protected])([email protected]) + commander: 8.3.0 + debug: 4.3.4 + fs-extra: 10.1.0 + node-fetch: 2.7.0 + node-html-parser: 5.4.2 + sharp: 0.32.6 + tslib: 2.6.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bare-abort-controller + - bare-buffer + - encoding + - react-native-b4a + - supports-color + - typescript + + '@capacitor/[email protected]': + dependencies: + '@ionic/cli-framework-output': 2.2.8 + '@ionic/utils-fs': 3.1.7 + '@ionic/utils-subprocess': 2.1.14 + '@ionic/utils-terminal': 2.3.5 + commander: 9.5.0 + debug: 4.3.4 + env-paths: 2.2.1 + kleur: 4.1.5 + native-run: 2.0.3 + open: 8.4.2 + plist: 3.1.0 + prompts: 2.4.2 + rimraf: 4.4.1 + semver: 7.7.4 + tar: 6.2.1 + tslib: 2.6.2 + xml2js: 0.5.0 + transitivePeerDependencies: + - supports-color + + '@capacitor/[email protected]': + dependencies: + '@ionic/cli-framework-output': 2.2.8 + '@ionic/utils-subprocess': 3.0.1 + '@ionic/utils-terminal': 2.3.5 + commander: 12.1.0 + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 11.3.3 + kleur: 4.1.5 + native-run: 2.0.3 + open: 8.4.2 + plist: 3.1.0 + prompts: 2.4.2 + rimraf: 6.1.2 + semver: 7.7.4 + tar: 7.5.7 + tslib: 2.8.1 + xml2js: 0.6.2 + transitivePeerDependencies: + - supports-color + + '@capacitor/[email protected]': + dependencies: + tslib: 2.8.1 + + '@capacitor/[email protected](@capacitor/[email protected])': + dependencies: + '@capacitor/core': 8.1.0 + + '@capacitor/[email protected](@capacitor/[email protected])': + dependencies: + '@capacitor/core': 8.1.0 + + '@cspotcode/[email protected]': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emnapi/[email protected]': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/[email protected]': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/[email protected]': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@esbuild/[email protected]': + optional: true + + '@hutson/[email protected]': {} + + '@iconify/[email protected]': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/[email protected]': {} + + '@ionic/[email protected]': + dependencies: + '@ionic/utils-terminal': 2.3.5 + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + debug: 4.3.4 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + '@types/fs-extra': 8.1.5 + debug: 4.3.4 + fs-extra: 9.1.0 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + '@ionic/utils-object': 2.1.6 + '@ionic/utils-terminal': 2.3.4 + debug: 4.3.4 + signal-exit: 3.0.7 + tree-kill: 1.2.2 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + '@ionic/utils-object': 2.1.6 + '@ionic/utils-terminal': 2.3.5 + debug: 4.4.3 + signal-exit: 3.0.7 + tree-kill: 1.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + debug: 4.3.4 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + '@ionic/utils-array': 2.1.6 + '@ionic/utils-fs': 3.1.7 + '@ionic/utils-process': 2.1.11 + '@ionic/utils-stream': 3.1.6 + '@ionic/utils-terminal': 2.3.4 + cross-spawn: 7.0.6 + debug: 4.3.4 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + '@ionic/utils-array': 2.1.6 + '@ionic/utils-fs': 3.1.7 + '@ionic/utils-process': 2.1.12 + '@ionic/utils-stream': 3.1.7 + '@ionic/utils-terminal': 2.3.5 + cross-spawn: 7.0.6 + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + '@types/slice-ansi': 4.0.0 + debug: 4.3.4 + signal-exit: 3.0.7 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tslib: 2.6.2 + untildify: 4.0.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - supports-color + + '@ionic/[email protected]': + dependencies: + '@types/slice-ansi': 4.0.0 + debug: 4.4.3 + signal-exit: 3.0.7 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tslib: 2.8.1 + untildify: 4.0.0 + wrap-ansi: 7.0.0 + transitivePeerDependencies: + - supports-color + + '@isaacs/[email protected]': {} + + '@isaacs/[email protected]': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/[email protected]': + dependencies: + minipass: 7.1.2 + + '@jridgewell/[email protected]': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/[email protected]': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/[email protected]': {} + + '@jridgewell/[email protected]': {} + + '@jridgewell/[email protected]': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/[email protected]': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@marcbachmann/[email protected]': {} + + '@napi-rs/[email protected]': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@noble/[email protected]': {} + + '@noble/[email protected]': + dependencies: + '@noble/hashes': 2.0.0 + + '@noble/[email protected]': + dependencies: + '@noble/hashes': 2.0.1 + + '@noble/[email protected]': {} + + '@noble/[email protected]': {} + + '@noble/[email protected]': {} + + '@noble/[email protected]': {} + + '@nodelib/[email protected]': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/[email protected]': {} + + '@nodelib/[email protected]': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@oxc-project/[email protected]': {} + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@oxlint/[email protected]': + optional: true + + '@paralleldrive/[email protected]': + dependencies: + '@noble/hashes': 1.8.0 + + '@playwright/[email protected]': + dependencies: + playwright: 1.58.2 + + '@polka/[email protected]': {} + + '@prettier/[email protected]': + dependencies: + '@xml-tools/parser': 1.0.11 + prettier: 2.8.8 + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': + optional: true + + '@rolldown/[email protected]': {} + + '@rollup/[email protected]([email protected])': + dependencies: + '@rollup/pluginutils': 5.3.0([email protected]) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0([email protected]) + is-reference: 1.2.1 + magic-string: 0.30.21 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.57.1 + + '@rollup/[email protected]([email protected])': + dependencies: + '@rollup/pluginutils': 5.3.0([email protected]) + optionalDependencies: + rollup: 4.57.1 + + '@rollup/[email protected]([email protected])': + dependencies: + '@rollup/pluginutils': 5.3.0([email protected]) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.11 + optionalDependencies: + rollup: 4.57.1 + + '@rollup/[email protected]([email protected])': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.57.1 + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@rollup/[email protected]': + optional: true + + '@scure/[email protected]': {} + + '@scure/[email protected]': + dependencies: + '@noble/curves': 2.0.1 + '@noble/hashes': 2.0.1 + '@scure/base': 2.0.0 + + '@scure/[email protected]': + dependencies: + '@noble/hashes': 2.0.1 + '@scure/base': 2.0.0 + + '@scure/[email protected]': + dependencies: + '@noble/curves': 2.0.1 + '@noble/hashes': 2.0.1 + '@scure/base': 2.0.0 + micro-packed: 0.8.0 + + '@standard-schema/[email protected]': {} + + '@sveltejs/[email protected]([email protected])': + dependencies: + acorn: 8.15.0 + + '@sveltejs/[email protected](@sveltejs/[email protected](@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected])))': + dependencies: + '@rollup/plugin-commonjs': 28.0.9([email protected]) + '@rollup/plugin-json': 6.1.0([email protected]) + '@rollup/plugin-node-resolve': 16.0.3([email protected]) + '@sveltejs/kit': 2.50.2(@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected])) + rollup: 4.57.1 + + '@sveltejs/[email protected](@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected]))': + dependencies: + '@standard-schema/spec': 1.1.0 + '@sveltejs/acorn-typescript': 1.0.9([email protected]) + '@sveltejs/vite-plugin-svelte': 6.2.4([email protected])([email protected](@types/[email protected])([email protected])([email protected])) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.6.2 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 3.0.1 + sirv: 3.0.2 + svelte: 5.50.2 + optionalDependencies: + typescript: 5.9.3 + + '@sveltejs/[email protected](@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected])([email protected](@types/[email protected])([email protected])([email protected]))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.2.4([email protected])([email protected](@types/[email protected])([email protected])([email protected])) + obug: 2.1.1 + svelte: 5.50.2 + + '@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected]))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected])([email protected](@types/[email protected])([email protected])([email protected])) + deepmerge: 4.3.1 + magic-string: 0.30.21 + obug: 2.1.1 + svelte: 5.50.2 + + '@sveltekit-i18n/[email protected]([email protected])': + dependencies: + svelte: 5.50.2 + + '@sveltekit-i18n/[email protected]': {} + + '@tailwindcss/[email protected]': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.19.0 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optional: true + + '@tailwindcss/[email protected]': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + + '@tailwindcss/[email protected]': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + postcss: 8.5.6 + tailwindcss: 4.1.18 + + '@tailwindcss/[email protected]([email protected](@types/[email protected])([email protected])([email protected]))': + dependencies: + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + tailwindcss: 4.1.18 + + '@trapezedev/[email protected]': {} + + dependencies: + '@ionic/utils-fs': 3.1.7 + '@ionic/utils-subprocess': 2.1.14 + '@prettier/plugin-xml': 2.2.0 + '@trapezedev/gradle-parse': 7.1.3 + '@xmldom/xmldom': 0.7.13 + conventional-changelog: 3.1.25 + cross-spawn: 7.0.6 + diff: 5.2.2 + env-paths: 3.0.0 + gradle-to-js: 2.0.1 + ini: 2.0.0 + kleur: 4.1.5 + lodash: 4.17.23 + mergexml: 1.2.4 + plist: 3.1.0 + prettier: 2.8.8 + prompts: 2.4.2 + replace: 1.2.2 + tempy: 1.0.1 + tmp: 0.2.5 + ts-node: 10.9.2(@types/[email protected])([email protected]) + xcode: 3.0.1 + xml-js: 1.6.11 + xpath: 0.0.32 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - supports-color + - typescript + + '@tsconfig/[email protected]': {} + + '@tsconfig/[email protected]': {} + + '@tsconfig/[email protected]': {} + + '@tsconfig/[email protected]': {} + + '@tybys/[email protected]': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/[email protected]': {} + + '@types/[email protected]': {} + + '@types/[email protected]': {} + + '@types/[email protected]': + dependencies: + '@types/node': 25.2.3 + + '@types/[email protected]': {} + + '@types/[email protected]': + dependencies: + undici-types: 7.16.0 + + '@types/[email protected]': {} + + '@types/[email protected]': {} + + '@types/[email protected]': {} + + '@types/[email protected]': {} + + '@types/[email protected]': {} + + '@types/[email protected]': + dependencies: + uuid: 13.0.0 + + '@xml-tools/[email protected]': + dependencies: + chevrotain: 7.1.1 + + '@xmldom/[email protected]': {} + + '@xmldom/[email protected]': {} + + '@zerodevx/[email protected]([email protected])': + dependencies: + svelte: 5.50.2 + + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + dependencies: + acorn: 8.15.0 + + [email protected]: {} + + [email protected]: {} + + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + [email protected]: {} + + dependencies: + color-convert: 1.9.3 + + dependencies: + color-convert: 2.0.1 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected](@types/[email protected]): + dependencies: + zxing-wasm: 2.2.4(@types/[email protected]) + transitivePeerDependencies: + - '@types/emscripten' + + [email protected]: {} + + dependencies: + bare-events: 2.8.2 + bare-path: 3.0.0 + bare-stream: 2.7.0([email protected]) + bare-url: 2.3.2 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + optional: true + + dependencies: + bare-os: 3.6.2 + optional: true + + dependencies: + streamx: 2.23.0 + optionalDependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + dependencies: + bare-path: 3.0.0 + optional: true + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + query-string: 9.3.1 + + [email protected]: {} + + dependencies: + base58-js: 3.0.3 + bech32: 2.0.0 + sha256-uint8array: 0.10.7 + + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + [email protected]: {} + + dependencies: + stream-buffers: 2.2.0 + + dependencies: + big-integer: 1.6.52 + + dependencies: + big-integer: 1.6.52 + + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + dependencies: + balanced-match: 1.0.2 + + dependencies: + fill-range: 7.1.1 + + [email protected]: {} + + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + [email protected]: {} + + dependencies: + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + dependencies: + regexp-to-ast: 0.5.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + [email protected]: {} + + dependencies: + color-name: 1.1.3 + + dependencies: + color-name: 1.1.4 + + [email protected]: {} + + [email protected]: {} + + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + [email protected]: {} + + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + dependencies: + q: 1.5.1 + + dependencies: + q: 1.5.1 + + dependencies: + compare-func: 2.0.0 + lodash: 4.17.23 + q: 1.5.1 + + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.23 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + + dependencies: + q: 1.5.1 + + dependencies: + q: 1.5.1 + + dependencies: + q: 1.5.1 + + dependencies: + q: 1.5.1 + + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + [email protected]: {} + + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.8 + json-stringify-safe: 5.0.1 + lodash: 4.17.23 + meow: 8.1.2 + semver: 6.3.1 + split: 1.0.1 + through2: 4.0.2 + + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.23 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + [email protected]: {} + + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + ms: 2.1.2 + + dependencies: + ms: 2.1.3 + + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + [email protected]: {} + + [email protected]: {} + + dependencies: + mimic-response: 3.1.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + + [email protected]: {} + + [email protected]: {} + + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + path-type: 4.0.0 + + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + [email protected]: {} + + dependencies: + domelementtype: 2.3.0 + + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dependencies: + is-obj: 2.0.0 + + dependencies: + sax: 1.1.4 + + [email protected]: {} + + dependencies: + once: 1.4.0 + + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + is-arrayish: 0.2.1 + + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + atob-lite: 2.0.0 + pako: 2.1.0 + tslib: 2.8.1 + + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + [email protected]: {} + + dependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + + [email protected]: {} + + [email protected]: {} + + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + dependencies: + reusify: 1.1.0 + + dependencies: + pend: 1.2.0 + + optionalDependencies: + picomatch: 4.0.3 + + dependencies: + to-regex-range: 5.0.1 + + [email protected]: {} + + dependencies: + locate-path: 2.0.0 + + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + dependencies: + '@paralleldrive/cuid2': 2.3.1 + dezalgo: 1.0.4 + once: 1.4.0 + + [email protected]: {} + + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + dependencies: + minipass: 3.3.6 + + [email protected]: {} + + optional: true + + optional: true + + [email protected]: {} + + [email protected]: {} + + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + + dependencies: + dargs: 7.0.0 + lodash: 4.17.23 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + + dependencies: + meow: 8.1.2 + semver: 6.3.1 + + dependencies: + ini: 1.3.8 + + [email protected]: {} + + dependencies: + is-glob: 4.0.3 + + dependencies: + minimatch: 10.1.2 + minipass: 7.1.2 + path-scurry: 2.0.1 + + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.11.1 + + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + [email protected]: {} + + dependencies: + lodash.merge: 4.6.2 + + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + [email protected]: {} + + [email protected]: {} + + dependencies: + function-bind: 1.1.2 + + [email protected]: {} + + [email protected]: {} + + dependencies: + lru-cache: 6.0.0 + + dependencies: + '@iconify/types': 2.0.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + hasown: 2.0.2 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + is-extglob: 2.1.1 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + '@types/estree': 1.0.8 + + dependencies: + '@types/estree': 1.0.8 + + [email protected]: {} + + dependencies: + text-extensions: 1.9.0 + + dependencies: + is-docker: 2.2.1 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + optional: true + + optional: true + + optional: true + + optional: true + + optional: true + + optional: true + + optional: true + + optional: true + + optional: true + + optional: true + + optional: true + + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + [email protected]: {} + + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + + [email protected]: {} + + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + + dependencies: + p-locate: 4.1.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + yallist: 4.0.0 + + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + [email protected]: {} + + dependencies: + '@xmldom/xmldom': 0.7.13 + formidable: 3.5.4 + xpath: 0.0.27 + + dependencies: + '@scure/base': 2.0.0 + + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + [email protected]: {} + + [email protected]: {} + + dependencies: + '@isaacs/brace-expansion': 5.0.1 + + dependencies: + brace-expansion: 1.1.12 + + dependencies: + brace-expansion: 1.1.12 + + dependencies: + brace-expansion: 2.0.2 + + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + [email protected]: {} + + dependencies: + yallist: 4.0.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + dependencies: + minipass: 7.1.2 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + '@ionic/utils-fs': 3.1.7 + '@ionic/utils-terminal': 2.3.5 + bplist-parser: 0.3.2 + debug: 4.4.3 + elementtree: 0.1.7 + ini: 4.1.3 + plist: 3.1.0 + split2: 4.2.0 + through2: 4.0.2 + tslib: 2.8.1 + yauzl: 2.10.0 + transitivePeerDependencies: + - supports-color + + [email protected]: {} + + dependencies: + semver: 7.7.4 + + [email protected]: {} + + [email protected]: {} + + dependencies: + whatwg-url: 5.0.0 + + dependencies: + css-select: 4.3.0 + he: 1.2.0 + + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.11 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.16.1 + semver: 7.7.4 + validate-npm-package-license: 3.0.4 + + dependencies: + '@noble/ciphers': 2.1.1 + '@noble/curves': 2.0.1 + '@noble/hashes': 2.0.1 + '@scure/base': 2.0.0 + '@scure/bip32': 2.0.1 + '@scure/bip39': 2.0.1 + nostr-wasm: 0.1.0 + optionalDependencies: + typescript: 5.9.3 + + [email protected]: {} + + dependencies: + boolbase: 1.0.0 + + [email protected]: {} + + dependencies: + wrappy: 1.0.2 + + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + oxfmt@file:../oxc/npm/oxfmt: + dependencies: + tinypool: 2.1.0 + + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.46.0 + '@oxlint/binding-android-arm64': 1.46.0 + '@oxlint/binding-darwin-arm64': 1.46.0 + '@oxlint/binding-darwin-x64': 1.46.0 + '@oxlint/binding-freebsd-x64': 1.46.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.46.0 + '@oxlint/binding-linux-arm-musleabihf': 1.46.0 + '@oxlint/binding-linux-arm64-gnu': 1.46.0 + '@oxlint/binding-linux-arm64-musl': 1.46.0 + '@oxlint/binding-linux-ppc64-gnu': 1.46.0 + '@oxlint/binding-linux-riscv64-gnu': 1.46.0 + '@oxlint/binding-linux-riscv64-musl': 1.46.0 + '@oxlint/binding-linux-s390x-gnu': 1.46.0 + '@oxlint/binding-linux-x64-gnu': 1.46.0 + '@oxlint/binding-linux-x64-musl': 1.46.0 + '@oxlint/binding-openharmony-arm64': 1.46.0 + '@oxlint/binding-win32-arm64-msvc': 1.46.0 + '@oxlint/binding-win32-ia32-msvc': 1.46.0 + '@oxlint/binding-win32-x64-msvc': 1.46.0 + + dependencies: + p-try: 1.0.0 + + dependencies: + p-try: 2.2.0 + + dependencies: + p-limit: 1.3.0 + + dependencies: + p-limit: 2.3.0 + + dependencies: + aggregate-error: 3.1.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + error-ex: 1.3.4 + json-parse-better-errors: 1.0.2 + + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + dependencies: + lru-cache: 11.2.6 + minipass: 7.1.2 + + dependencies: + pify: 3.0.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + playwright-core: 1.58.2 + optionalDependencies: + fsevents: 2.3.2 + + dependencies: + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + [email protected]: {} + + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + dependencies: + detect-libc: 2.1.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.87.0 + pump: 3.0.3 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.4 + tunnel-agent: 0.6.0 + + [email protected]: {} + + dependencies: + '@types/prismjs': 1.26.6 + clsx: 2.1.1 + react: 19.2.4 + + [email protected]: {} + + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + [email protected]: {} + + dependencies: + '@types/offscreencanvas': 2019.7.3 + + [email protected]: {} + + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + dependencies: + decode-uri-component: 0.4.1 + filter-obj: 5.1.0 + split-on-first: 3.0.0 + + [email protected]: {} + + [email protected]: {} + + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + [email protected]: {} + + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + [email protected]: {} + + dependencies: + chalk: 2.4.2 + minimatch: 3.0.5 + yargs: 15.4.1 + + [email protected]: {} + + [email protected]: {} + + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + [email protected]: {} + + dependencies: + glob: 7.2.3 + + dependencies: + glob: 9.3.5 + + dependencies: + glob: 13.0.2 + package-json-from-dist: 1.0.1 + + dependencies: + '@oxc-project/types': 0.113.0 + '@rolldown/pluginutils': 1.0.0-rc.4 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.4 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.4 + '@rolldown/binding-darwin-x64': 1.0.0-rc.4 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.4 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.4 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.4 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.4 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.4 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.4 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.4 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.4 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.4 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.4 + + dependencies: + open: 8.4.2 + picomatch: 4.0.3 + source-map: 0.7.6 + yargs: 17.7.2 + optionalDependencies: + rolldown: 1.0.0-rc.4 + rollup: 4.57.1 + + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + + dependencies: + queue-microtask: 1.2.3 + + dependencies: + mri: 1.2.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + color: 4.2.3 + detect-libc: 2.1.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.3 + semver: 7.7.4 + simple-get: 4.0.1 + tar-fs: 3.1.1 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + dependencies: + shebang-regex: 3.0.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + dependencies: + bplist-creator: 0.1.0 + bplist-parser: 0.3.1 + plist: 3.1.0 + + dependencies: + is-arrayish: 0.3.4 + + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + [email protected]: {} + + [email protected]: {} + + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + [email protected]: {} + + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + [email protected]: {} + + [email protected]: {} + + dependencies: + readable-stream: 3.6.2 + + [email protected]: {} + + dependencies: + through: 2.3.8 + + [email protected]: {} + + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + dependencies: + safe-buffer: 5.1.2 + + dependencies: + safe-buffer: 5.2.1 + + dependencies: + ansi-regex: 5.0.1 + + [email protected]: {} + + dependencies: + min-indent: 1.0.1 + + [email protected]: {} + + dependencies: + has-flag: 3.0.0 + + [email protected]: {} + + [email protected](@sveltejs/[email protected](@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected]): + dependencies: + '@sveltejs/kit': 2.50.2(@sveltejs/[email protected]([email protected])([email protected](@types/[email protected])([email protected])([email protected])))([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected])) + rolldown: 1.0.0-rc.4 + typescript: 5.9.3 + + dependencies: + svelte: 5.50.2 + + dependencies: + svelte: 5.50.2 + + dependencies: + svelte: 5.50.2 + + dependencies: + svelte: 5.50.2 + optionalDependencies: + postcss: 8.5.6 + typescript: 5.9.3 + + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.9([email protected]) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.6.2 + esm-env: 1.2.2 + esrap: 2.2.3 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + + dependencies: + '@sveltekit-i18n/base': 1.3.7([email protected]) + '@sveltekit-i18n/parser-default': 1.1.1 + svelte: 5.50.2 + + [email protected]: {} + + dependencies: + prism-react-renderer: 2.4.1([email protected]) + tailwindcss: 4.1.18 + transitivePeerDependencies: + - react + + [email protected]: {} + + [email protected]: {} + + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.3 + tar-stream: 2.2.0 + + dependencies: + pump: 3.0.3 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.5.3 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + dependencies: + b4a: 1.7.3 + fast-fifo: 1.3.2 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + [email protected]: {} + + dependencies: + del: 6.1.1 + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + + dependencies: + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a + + [email protected]: {} + + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + dependencies: + readable-stream: 3.6.2 + + [email protected]: {} + + dependencies: + fdir: 6.5.0([email protected]) + picomatch: 4.0.3 + + [email protected]: {} + + [email protected]: {} + + dependencies: + is-number: 7.0.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 25.2.3 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + [email protected]: {} + + [email protected]: {} + + dependencies: + safe-buffer: 5.2.1 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + tagged-tag: 1.0.0 + + [email protected]: {} + + optional: true + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + crypto-random-string: 2.0.0 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0([email protected]) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.2.3 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + + [email protected]([email protected](@types/[email protected])([email protected])([email protected])): + optionalDependencies: + + [email protected]: {} + + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + [email protected]: {} + + dependencies: + isexe: 2.0.0 + + [email protected]: {} + + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + [email protected]: {} + + [email protected]: {} + + dependencies: + simple-plist: 1.3.1 + uuid: 7.0.3 + + dependencies: + sax: 1.4.4 + + dependencies: + sax: 1.4.4 + xmlbuilder: 11.0.1 + + dependencies: + sax: 1.4.4 + xmlbuilder: 11.0.1 + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + [email protected]: {} + + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + [email protected]: {} + + [email protected]: {} + + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + [email protected]: {} + + [email protected]: {} + + [email protected](@types/[email protected]): + dependencies: + '@types/emscripten': 1.41.5 + type-fest: 5.4.4 diff --git a/src/app.css b/src/app.css index 62997d50..168ea02a 100644 --- a/src/app.css +++ b/src/app.css @@ -38,8 +38,7 @@ @font-face { font-family: "PublicSans"; - src: url("/fonts/Public_Sans/static/PublicSans-Regular.ttf") - format("truetype"); + src: url("/fonts/Public_Sans/static/PublicSans-Regular.ttf") format("truetype"); } :root { diff --git a/src/app.html b/src/app.html index 32cbd31e..e3206d6f 100644 --- a/src/app.html +++ b/src/app.html @@ -7,10 +7,7 @@ name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> - <meta - name="description" - content="The easiest way to get started with bitcoin" - /> + <meta name="description" content="The easiest way to get started with bitcoin" /> <meta name="keywords" content="open source bitcoin lightning web wallet" /> <meta name="theme-color" content="#fff" /> <meta name="mobile-web-app-capable" content="yes" /> diff --git a/src/components/404.svelte b/src/components/404.svelte index d5fdfa38..5a7ba663 100644 --- a/src/components/404.svelte +++ b/src/components/404.svelte @@ -5,12 +5,10 @@ <div class="flex justify-center items-center mt-20"> <div class="space-y-5 text-center"> <a href="/"> - <iconify-icon noobserver icon="coinos:logo" width="224" class="mx-auto" - ></iconify-icon> + <iconify-icon noobserver icon="coinos:logo" width="224" class="mx-auto"></iconify-icon> </a> - <iconify-icon noobserver icon="ph:question-bold" class="mx-auto w-56" - ></iconify-icon> + <iconify-icon noobserver icon="ph:question-bold" class="mx-auto w-56"></iconify-icon> <h1 class="font-bold text-5xl">{$t("404.404")}</h1> <p>{$t("404.pageNotFound")}</p> diff --git a/src/components/About.svelte b/src/components/About.svelte index 0c8be717..dbcf7854 100644 --- a/src/components/About.svelte +++ b/src/components/About.svelte @@ -33,10 +33,7 @@ <div class="flex w-full"> <div class="md:flex 2xl:items-start md:max-w-2xl mx-auto"> <div class="w-[220px] mx-auto"> - <Image - image={member.name} - style="rounded-full mx-auto w-40 h-40 mb-5 object-cover" - /> + <Image image={member.name} style="rounded-full mx-auto w-40 h-40 mb-5 object-cover" /> <div class="space-y-2"> <span class="text-2xl text-center font-semibold block" @@ -69,9 +66,7 @@ <h3 class="text-5xl font-medium mb-5 text-center"> {$t("about.locations.header")} </h3> - <p - class="text-secondary text-xl w-full md:w-10/12 lg:w-2/3 2xl:w-[800px] mx-auto mb-10" - > + <p class="text-secondary text-xl w-full md:w-10/12 lg:w-2/3 2xl:w-[800px] mx-auto mb-10"> {@html $t("about.locations.description")} </p> diff --git a/src/components/Account.svelte b/src/components/Account.svelte index c88c1118..88b944b3 100644 --- a/src/components/Account.svelte +++ b/src/components/Account.svelte @@ -9,21 +9,10 @@ import { t } from "$lib/translations"; import { versions } from "$lib/utils"; import { arkkey } from "$lib/ark"; - import { - getRememberedWalletPassword, - forgetWalletPassword, - } from "$lib/passwordCache"; + import { getRememberedWalletPassword, forgetWalletPassword } from "$lib/passwordCache"; let { user, rate, account }: any = $props(); - let { - name, - seed, - fingerprint, - balance, - id, - type: accountType, - arkAddress, - } = $derived(account); + let { name, seed, fingerprint, balance, id, type: accountType, arkAddress } = $derived(account); let arkBalance = $state(0); let arkLoading = $state(false); @@ -45,12 +34,11 @@ $arkkey = hex.encode(decrypt(seed, cached) as Uint8Array); } else if (user.seed) { // Master seed: derive m/86'/0'/0'/0/0 - const [{ HDKey }, { entropyToMnemonic, mnemonicToSeed }, { wordlist }] = - await Promise.all([ - import("@scure/bip32"), - import("@scure/bip39"), - import("@scure/bip39/wordlists/english.js"), - ]); + const [{ HDKey }, { entropyToMnemonic, mnemonicToSeed }, { wordlist }] = await Promise.all([ + import("@scure/bip32"), + import("@scure/bip39"), + import("@scure/bip39/wordlists/english.js"), + ]); let entropy = await decrypt(user.seed, cached); let mnemonic = entropyToMnemonic(entropy, wordlist); let s = await mnemonicToSeed(mnemonic, cached); @@ -91,12 +79,11 @@ if (seed) { $arkkey = hex.encode(decrypt(seed, password!) as Uint8Array); } else if (user.seed) { - const [{ HDKey }, { entropyToMnemonic, mnemonicToSeed }, { wordlist }] = - await Promise.all([ - import("@scure/bip32"), - import("@scure/bip39"), - import("@scure/bip39/wordlists/english.js"), - ]); + const [{ HDKey }, { entropyToMnemonic, mnemonicToSeed }, { wordlist }] = await Promise.all([ + import("@scure/bip32"), + import("@scure/bip39"), + import("@scure/bip39/wordlists/english.js"), + ]); let entropy = await decrypt(user.seed, password!); let mnemonic = entropyToMnemonic(entropy, wordlist); let s = await mnemonicToSeed(mnemonic, password!); @@ -153,14 +140,9 @@ onclick={goSettings} > {#if isArk} - <img - src="/images/ark.png" - class="w-8 h-8 rounded-full object-cover" - alt="Ark" - /> + <img src="/images/ark.png" class="w-8 h-8 rounded-full object-cover" alt="Ark" /> {:else if seed || (user.seed && fingerprint)} - <iconify-icon noobserver icon="cryptocurrency-color:btc" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="cryptocurrency-color:btc" width="32"></iconify-icon> {:else} <img src="/images/icon.png" class="w-8 h-8" /> {/if} @@ -169,20 +151,9 @@ </div> <div class="flex w-full text-xl gap-2"> - <a - href={"/invoice"} - class="contents" - onclick={(e) => setAccount(e, "/invoice")} - > - <button - class="btn !w-auto flex-1 !bg-base-300" - data-testid="account-receive" - > - <iconify-icon - noobserver - icon="ph:hand-coins-bold" - width="32" - flip="horizontal" + <a href={"/invoice"} class="contents" onclick={(e) => setAccount(e, "/invoice")}> + <button class="btn !w-auto flex-1 !bg-base-300" data-testid="account-receive"> + <iconify-icon noobserver icon="ph:hand-coins-bold" width="32" flip="horizontal" ></iconify-icon> <div class="my-auto hidden sm:block"> {$t("user.dashboard.receive")} @@ -192,8 +163,7 @@ <a href={`/send`} class="contents" onclick={(e) => setAccount(e, "/send")}> <button type="button" class="btn !w-auto flex-1 !bg-base-300"> - <iconify-icon noobserver icon="ph:paper-plane-right-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:paper-plane-right-bold" width="32"></iconify-icon> <div class="my-auto hidden sm:block">{$t("user.dashboard.send")}</div> </button> </a> diff --git a/src/components/Amount.svelte b/src/components/Amount.svelte index 8cfb9942..f368e96c 100644 --- a/src/components/Amount.svelte +++ b/src/components/Amount.svelte @@ -34,8 +34,7 @@ aria-label="Toggle currency display" > {#if !canShowFiat} - <iconify-icon noobserver {icon} class="text-yellow-300" - ></iconify-icon> + <iconify-icon noobserver {icon} class="text-yellow-300"></iconify-icon> {/if} {#if canShowFiat} {f(toFiat(amount, rate), currency, locale)} diff --git a/src/components/AmountField.svelte b/src/components/AmountField.svelte index 21c36631..b5c4261e 100644 --- a/src/components/AmountField.svelte +++ b/src/components/AmountField.svelte @@ -38,13 +38,10 @@ <button type="button" class="flex w-full" onclick={startSetting}> <div class="p-4 border rounded-2xl rounded-r-none border-r-0 bg-base-200"> - <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300" - ></iconify-icon> + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon> </div> - <div - class="border-l-0 rounded-l-none pl-2 w-full p-4 border rounded-2xl text-left" - > + <div class="border-l-0 rounded-l-none pl-2 w-full p-4 border rounded-2xl text-left"> {amount || none} </div> <input type="hidden" {name} bind:value={amount} /> @@ -52,24 +49,14 @@ </div> {#if setting} - <div - class="fixed bg-base-100/90 inset-0 overflow-y-auto h-full w-full z-50 max-w-lg mx-auto" - > + <div class="fixed bg-base-100/90 inset-0 overflow-y-auto h-full w-full z-50 max-w-lg mx-auto"> <div class="relative p-5 border shadow-lg rounded-md bg-base-100 space-y-5"> <h1 class="text-center text-2xl font-semibold"> {label} </h1> - <Numpad - bind:amount - {currency} - {rate} - bind:submit={done} - bind:element={numpad} - /> + <Numpad bind:amount {currency} {rate} bind:submit={done} bind:element={numpad} /> - <button bind:this={done} type="button" onclick={set} class="btn" - >Ok</button - > + <button bind:this={done} type="button" onclick={set} class="btn">Ok</button> </div> </div> {/if} diff --git a/src/components/AppForm.svelte b/src/components/AppForm.svelte index 2f65372c..2fedca47 100644 --- a/src/components/AppForm.svelte +++ b/src/components/AppForm.svelte @@ -16,17 +16,7 @@ PUBLIC_COINOS_RELAY as relayUrl, } from "$env/static/public"; - let { - rate, - user, - name, - max_fee, - max_amount, - budget_renewal, - pubkey, - secret, - notify, - } = $props(); + let { rate, user, name, max_fee, max_amount, budget_renewal, pubkey, secret, notify } = $props(); let { currency } = $derived(user); onMount(() => { @@ -95,9 +85,7 @@ /> <div> - <label for="name" class="font-bold mb-1 block" - >{$t("accounts.renewal")}</label - > + <label for="name" class="font-bold mb-1 block">{$t("accounts.renewal")}</label> <select name="budget_renewal" bind:value={budget_renewal}> <option value="never" selected>{$t("accounts.never")}</option> <option value="daily">{$t("accounts.daily")}</option> @@ -108,9 +96,7 @@ </div> <div> - <label for="notify" class="font-bold mb-1 block" - >{$t("accounts.notifications")}</label - > + <label for="notify" class="font-bold mb-1 block">{$t("accounts.notifications")}</label> <select name="notify" bind:value={notify}> <option value={false} selected>{$t("accounts.off")}</option> <option value={true}>{$t("accounts.on")}</option> @@ -118,16 +104,9 @@ </div> <div> - <label for="pubkey" class="font-bold mb-1 block" - >{$t("accounts.pubkey")}</label - > + <label for="pubkey" class="font-bold mb-1 block">{$t("accounts.pubkey")}</label> <div class="flex gap-1 items-center"> - <textarea - rows={3} - name="pubkey" - bind:value={pubkey} - class="grow" - readonly={secret} + <textarea rows={3} name="pubkey" bind:value={pubkey} class="grow" readonly={secret} ></textarea> <button type="button" @@ -142,29 +121,15 @@ {#if !pubkey || secret} <div> - <label for="secret" class="font-bold mb-1 block" - >{$t("accounts.secret")}</label - > + <label for="secret" class="font-bold mb-1 block">{$t("accounts.secret")}</label> <div class="flex gap-1 items-center"> - <textarea rows={3} name="secret" bind:value={secret} class="grow" - ></textarea> + <textarea rows={3} name="secret" bind:value={secret} class="grow"></textarea> <div class="space-y-2 w-24"> - <button - type="button" - onclick={generate} - class="btn" - aria-label="Generate secret" - > - <iconify-icon noobserver icon="ph:dice-three-bold" width="32" - ></iconify-icon> + <button type="button" onclick={generate} class="btn" aria-label="Generate secret"> + <iconify-icon noobserver icon="ph:dice-three-bold" width="32"></iconify-icon> </button> - <button - type="button" - onclick={() => copy(secret)} - class="btn" - aria-label="Copy secret" - > + <button type="button" onclick={() => copy(secret)} class="btn" aria-label="Copy secret"> <iconify-icon icon="ph:copy-bold" width="32"></iconify-icon> </button> </div> @@ -173,8 +138,7 @@ {/if} <div class="space-y-2"> - <button type="submit" class="btn btn-accent">{$t("payments.submit")}</button - > + <button type="submit" class="btn btn-accent">{$t("payments.submit")}</button> {#if pubkey} <button type="button" class="btn" onclick={del}> <iconify-icon icon="ph:trash-bold" width="32"></iconify-icon> diff --git a/src/components/AppHeader.svelte b/src/components/AppHeader.svelte index f45f4d0c..daeedcdb 100644 --- a/src/components/AppHeader.svelte +++ b/src/components/AppHeader.svelte @@ -56,9 +56,7 @@ ]); let opacity = $derived((href) => - $page.url.pathname === href - ? "opacity-100" - : "opacity-90 hover:opacity-none", + $page.url.pathname === href ? "opacity-100" : "opacity-90 hover:opacity-none", ); </script> @@ -74,8 +72,7 @@ {#each links as { href, icon, label }} <a {href} data-sveltekit-preload-code="eager" aria-label={label}> <button class="btn-menu {opacity(href)}" aria-label={label}> - <iconify-icon noobserver {icon} width={(w ?? 0) > 640 ? 32 : 24} - ></iconify-icon> + <iconify-icon noobserver {icon} width={(w ?? 0) > 640 ? 32 : 24}></iconify-icon> </button> </a> {/each} diff --git a/src/components/Avatar.svelte b/src/components/Avatar.svelte index c9bacf65..c56b7486 100644 --- a/src/components/Avatar.svelte +++ b/src/components/Avatar.svelte @@ -9,29 +9,16 @@ class?: string; } - let { - user, - size = 32, - disabled = false, - class: className = "", - }: Props = $props(); + let { user, size = 32, disabled = false, class: className = "" }: Props = $props(); let s = $derived(size.toString()); - let link = $derived( - user ? (user.anon ? `/${user.pubkey}` : `/${user.username}`) : undefined, - ); + let link = $derived(user ? (user.anon ? `/${user.pubkey}` : `/${user.username}`) : undefined); let base = "/api/public"; - let profile = $derived( - user?.profile ? `${base}/${user.profile}.webp` : user?.picture, - ); - let fallback = $derived( - `${base}/punks/` + punk(user?.pubkey || user?.id || "aa"), - ); + let profile = $derived(user?.profile ? `${base}/${user.profile}.webp` : user?.picture); + let fallback = $derived(`${base}/punks/` + punk(user?.pubkey || user?.id || "aa")); let tmp = $derived( - ($avatar as any)?.id && - ($avatar as any).id === user?.id && - ($avatar as any).src, + ($avatar as any)?.id && ($avatar as any).id === user?.id && ($avatar as any).src, ); let src = $derived(tmp || profile || fallback); </script> diff --git a/src/components/Balance.svelte b/src/components/Balance.svelte index 41b55c7a..440c260d 100644 --- a/src/components/Balance.svelte +++ b/src/components/Balance.svelte @@ -27,13 +27,8 @@ <div> {#if user.haspin && !$pin} - <button - onclick={toggleShow} - class="flex gap-2 text-xl" - data-testid="balance-show" - > - <iconify-icon noobserver icon="ph:eye-slash-bold" width="32" - ></iconify-icon> + <button onclick={toggleShow} class="flex gap-2 text-xl" data-testid="balance-show"> + <iconify-icon noobserver icon="ph:eye-slash-bold" width="32"></iconify-icon> <div class="my-auto">{$t("user.showBalance")}</div> </button> {:else if !isNaN(rate)} @@ -47,14 +42,7 @@ /> {#if locked && id === user.id} <div class="text-red-600"> - <Amount - amount={locked} - {rate} - {currency} - {locale} - align="left" - locked={true} - /> + <Amount amount={locked} {rate} {currency} {locale} align="left" locked={true} /> </div> {/if} </div> diff --git a/src/components/Code.svelte b/src/components/Code.svelte index 4f182ff2..48c132b0 100644 --- a/src/components/Code.svelte +++ b/src/components/Code.svelte @@ -5,12 +5,7 @@ </script> {#snippet cp(something)} - <button - type="button" - class="ml-auto" - onclick={() => copy(something)} - aria-label="Copy value" - > + <button type="button" class="ml-auto" onclick={() => copy(something)} aria-label="Copy value"> <iconify-icon noobserver icon="ph:copy-bold" width="42"></iconify-icon> </button> {/snippet} diff --git a/src/components/DarkToggle.svelte b/src/components/DarkToggle.svelte index ebeaf762..78506c88 100644 --- a/src/components/DarkToggle.svelte +++ b/src/components/DarkToggle.svelte @@ -7,10 +7,7 @@ }; </script> -<button - class="flex justify-center items-center hover:opacity-80 gap-2 font-bold" - onclick={dark} -> +<button class="flex justify-center items-center hover:opacity-80 gap-2 font-bold" onclick={dark}> <iconify-icon noobserver icon={$theme === "dark" ? "ph:sun-bold" : "ph:moon-stars-bold"} diff --git a/src/components/Event.svelte b/src/components/Event.svelte index 3ecf00fc..03b93695 100644 --- a/src/components/Event.svelte +++ b/src/components/Event.svelte @@ -43,11 +43,7 @@ </div> {#if author.lud16} <div class="flex items-center"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" - ></iconify-icon> + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon> {author.lud16} </div> {/if} @@ -75,8 +71,7 @@ {:else if type === "link"} <Media {value} {minimal} /> {:else if type.match(/^nostr:np(rofile|ub)$/)} - <a href={`/${value.pubkey}`} class="font-bold">@{names[value.pubkey]}</a - > + <a href={`/${value.pubkey}`} class="font-bold">@{names[value.pubkey]}</a> {/if} {/each} </div> @@ -99,11 +94,7 @@ <div class="justify-center flex"> <button type="button" onclick={zap} class="btn btn-accent items-center"> <div class="flex gap-1 items-center"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" - width={32} + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300" width={32} ></iconify-icon> <div>Zap</div> </div> diff --git a/src/components/Footer.svelte b/src/components/Footer.svelte index 92930300..5bf7b461 100644 --- a/src/components/Footer.svelte +++ b/src/components/Footer.svelte @@ -18,9 +18,7 @@ ]; </script> -<footer - class="space-y-10 md:space-y-0 text-xl block md:flex justify-around pb-8 px-4" -> +<footer class="space-y-10 md:space-y-0 text-xl block md:flex justify-around pb-8 px-4"> <div class="space-y-5"> <div class="text-center w-full"> <a href="/" aria-label="Home"> @@ -36,9 +34,7 @@ </a> </div> </div> - <div - class="w-full flex flex-wrap sm:flex-nowrap gap-2 justify-center items-center" - > + <div class="w-full flex flex-wrap sm:flex-nowrap gap-2 justify-center items-center"> <DarkToggle /> <LocaleSelector /> </div> @@ -49,11 +45,8 @@ <ul class="mt-5 text-secondary space-y-3 font-medium"> {#each followLinks as link} <li> - <a - href={link.url} - target="_blank" - rel="noreferrer" - class="hover:opacity-80">{$t("footer." + link.titleID)}</a + <a href={link.url} target="_blank" rel="noreferrer" class="hover:opacity-80" + >{$t("footer." + link.titleID)}</a > </li> {/each} @@ -65,18 +58,12 @@ <ul class="mt-5 text-secondary space-y-3"> {#each companyLinks as link} <li> - <a href={link.url} class="hover:opacity-80" - >{$t("footer." + link.titleID)}</a - > + <a href={link.url} class="hover:opacity-80">{$t("footer." + link.titleID)}</a> </li> {/each} </ul> </div> - <iconify-icon - noobserver - icon="coinos:shield" - class="flex justify-center" - width="96" + <iconify-icon noobserver icon="coinos:shield" class="flex justify-center" width="96" ></iconify-icon> </footer> diff --git a/src/components/HowItWorksCard.svelte b/src/components/HowItWorksCard.svelte index 1012af46..33a39e08 100644 --- a/src/components/HowItWorksCard.svelte +++ b/src/components/HowItWorksCard.svelte @@ -4,8 +4,7 @@ </script> <div class="space-y-5"> - <iconify-icon noobserver icon={image} class="mx-auto" width="128" - ></iconify-icon> + <iconify-icon noobserver icon={image} class="mx-auto" width="128"></iconify-icon> <p class="text-2xl font-medium">{$t("howItWorks." + stepID + ".header")}</p> <p class="text-secondary text-xl font-medium w-full md:w-2/3 mx-auto"> {$t("howItWorks." + stepID + ".description")} diff --git a/src/components/InvoiceActions.svelte b/src/components/InvoiceActions.svelte index 7cc62698..c6ae7249 100644 --- a/src/components/InvoiceActions.svelte +++ b/src/components/InvoiceActions.svelte @@ -48,23 +48,20 @@ <div class="flex flex-wrap gap-2 justify-around text-secondary w-full"> {#if user?.id === invoice?.user?.id} <button class="btn grow !w-auto" onclick={toggleAmount}> - <iconify-icon noobserver icon="ph:pencil-simple-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:pencil-simple-bold" width="32"></iconify-icon> <div class="my-auto">{t("payments.setAmount")}</div> </button> {:else} <a href={link} class="block"> <button class="btn grow !w-auto"> - <iconify-icon noobserver icon="ph:arrow-square-out-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:arrow-square-out-bold" width="32"></iconify-icon> <div class="my-auto">{t("payments.openLink")}</div> </button> </a> {/if} <button class="btn grow !w-auto" onclick={toggleMemo}> - <iconify-icon noobserver icon="ph:chat-centered-text-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:chat-centered-text-bold" width="32"></iconify-icon> <div class="my-auto"> {t("invoice.setMemo")} </div> @@ -80,8 +77,7 @@ </button> <button class="btn grow !w-auto" onclick={() => goto("/receive")}> - <iconify-icon noobserver icon="ph:clipboard-text-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:clipboard-text-bold" width="32"></iconify-icon> <div class="my-auto text-lg">{t("user.send.paste")}</div> </button> @@ -95,11 +91,9 @@ <div class="w-full flex justify-center gap-2 flex-wrap"> <button class="btn" onclick={() => (showQr = !showQr)}> {#if showQr} - <iconify-icon noobserver icon="ph:text-align-center-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:text-align-center-bold" width="32"></iconify-icon> {:else} - <iconify-icon noobserver icon="ph:qr-code-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:qr-code-bold" width="32"></iconify-icon> {/if} <div class="my-auto"> {showQr ? t("payments.showText") : t("payments.showQr")} @@ -120,14 +114,9 @@ setType(types.lightning); }} > - <div - class="bg-black rounded-full w-8 h-8 items-center justify-center flex" - > + <div class="bg-black rounded-full w-8 h-8 items-center justify-center flex"> <div class="m-auto"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300 text-2xl" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300 text-2xl" ></iconify-icon> </div> </div> diff --git a/src/components/InvoiceData.svelte b/src/components/InvoiceData.svelte index 51f7b396..142755f0 100644 --- a/src/components/InvoiceData.svelte +++ b/src/components/InvoiceData.svelte @@ -39,12 +39,7 @@ {#if invoice.type === types.liquid} <div class="flex justify-center p-4 shadow items-center gap-2"> - <iconify-icon - noobserver - icon="ph:warning-bold" - width="48" - class="text-warning" - ></iconify-icon> + <iconify-icon noobserver icon="ph:warning-bold" width="48" class="text-warning"></iconify-icon> <div> <div class="my-auto text-xl text-center text-secondary"> {t("payments.onlyLbtc")} diff --git a/src/components/InvoiceTypes.svelte b/src/components/InvoiceTypes.svelte index 9aa1330a..cfde1285 100644 --- a/src/components/InvoiceTypes.svelte +++ b/src/components/InvoiceTypes.svelte @@ -22,8 +22,7 @@ class="btn flex-nowrap !w-auto grow" class:bg-base-300={type === types.bitcoin && address_type === "bech32"} class:text-secondary={type === types.bitcoin && address_type === "bech32"} - class:hidden={activeOnly && - (type !== types.bitcoin || address_type !== "bech32")} + class:hidden={activeOnly && (type !== types.bitcoin || address_type !== "bech32")} onclick={() => (activeOnly ? toggleType() : setType(types.bitcoin))} > <img src="/images/bitcoin.svg" class="w-8" alt="Bitcoin" /> @@ -34,10 +33,8 @@ class="btn flex-nowrap !w-auto grow" class:bg-base-300={type === types.bitcoin && address_type === "bech32m"} class:text-secondary={type === types.bitcoin && address_type === "bech32m"} - class:hidden={activeOnly && - (type !== types.bitcoin || address_type !== "bech32m")} - onclick={() => - activeOnly ? toggleType() : setType(types.bitcoin, "bech32m")} + class:hidden={activeOnly && (type !== types.bitcoin || address_type !== "bech32m")} + onclick={() => (activeOnly ? toggleType() : setType(types.bitcoin, "bech32m"))} > <img src="/images/bitcoin.svg" class="w-8" alt="Bitcoin" /> <div class="my-auto text-lg">Taproot</div> @@ -47,10 +44,8 @@ class="btn flex-nowrap !w-auto grow" class:bg-base-300={type === types.bitcoin && address_type === "legacy"} class:text-secondary={type === types.bitcoin && address_type === "legacy"} - class:hidden={activeOnly && - (type !== types.bitcoin || address_type !== "legacy")} - onclick={() => - activeOnly ? toggleType() : setType(types.bitcoin, "legacy")} + class:hidden={activeOnly && (type !== types.bitcoin || address_type !== "legacy")} + onclick={() => (activeOnly ? toggleType() : setType(types.bitcoin, "legacy"))} > <img src="/images/bitcoin.svg" class="w-8" alt="Bitcoin" /> <div class="my-auto text-lg">Legacy</div> @@ -62,10 +57,8 @@ <div class="flex flex-wrap gap-2"> <button class="btn flex-nowrap !w-auto grow" - class:bg-base-300={type === types.lightning && - $page.url.pathname.includes("/receive")} - class:text-secondary={type === types.lightning && - $page.url.pathname.includes("/receive")} + class:bg-base-300={type === types.lightning && $page.url.pathname.includes("/receive")} + class:text-secondary={type === types.lightning && $page.url.pathname.includes("/receive")} class:hidden={activeOnly && (type !== types.lightning || !$page.url.pathname.includes("/receive"))} onclick={() => { @@ -77,14 +70,9 @@ } }} > - <div - class="bg-black rounded-full w-8 h-8 items-center justify-center flex" - > + <div class="bg-black rounded-full w-8 h-8 items-center justify-center flex"> <div class="m-auto"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300 text-2xl" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300 text-2xl" ></iconify-icon> </div> </div> @@ -97,14 +85,9 @@ class:hidden={activeOnly && type !== types.bolt12} onclick={() => (activeOnly ? toggleType() : setType(types.bolt12))} > - <div - class="bg-black rounded-full w-8 h-8 items-center justify-center flex" - > + <div class="bg-black rounded-full w-8 h-8 items-center justify-center flex"> <div class="m-auto"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300 text-2xl" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300 text-2xl" ></iconify-icon> </div> </div> @@ -113,10 +96,8 @@ <button class="btn flex-nowrap !w-auto grow" - class:bg-base-300={type === types.lightning && - !$page.url.pathname.includes("/receive")} - class:text-secondary={type === types.lightning && - !$page.url.pathname.includes("/receive")} + class:bg-base-300={type === types.lightning && !$page.url.pathname.includes("/receive")} + class:text-secondary={type === types.lightning && !$page.url.pathname.includes("/receive")} class:hidden={activeOnly && (type !== types.lightning || $page.url.pathname.includes("/receive"))} onclick={() => { @@ -128,14 +109,9 @@ } }} > - <div - class="bg-black rounded-full w-8 h-8 items-center justify-center flex" - > + <div class="bg-black rounded-full w-8 h-8 items-center justify-center flex"> <div class="m-auto"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300 text-2xl" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300 text-2xl" ></iconify-icon> </div> </div> diff --git a/src/components/ItemForm.svelte b/src/components/ItemForm.svelte index 7215a239..a64cb7ee 100644 --- a/src/components/ItemForm.svelte +++ b/src/components/ItemForm.svelte @@ -17,10 +17,7 @@ let src: string | undefined = $state(); let tooLarge: Record<string, boolean> = {}; - let handleFile = async ( - { target }: { target: EventTarget | null }, - type: string, - ) => { + let handleFile = async ({ target }: { target: EventTarget | null }, type: string) => { tooLarge[type] = false; file = (target as HTMLInputElement).files![0]; if (!file) return; @@ -42,9 +39,7 @@ if (src) { try { - let { hash } = JSON.parse( - (await upload(file, "item", progress)) as string, - ); + let { hash } = JSON.parse((await upload(file, "item", progress)) as string); data.set("image", hash); @@ -91,11 +86,7 @@ <div> <label for="price" class="font-bold mb-1 block">{$t("items.price")}</label> <div class="flex"> - <input - name="price" - bind:value={item.price} - class="border-r-none rounded-r-none" - /> + <input name="price" bind:value={item.price} class="border-r-none rounded-r-none" /> <div class="text-gray-600 rounded-r-2xl p-4 my-auto rounded-l-none rounded border bg-gray-100" > diff --git a/src/components/LandingHeader.svelte b/src/components/LandingHeader.svelte index f1b6a2b4..9d8b92cf 100644 --- a/src/components/LandingHeader.svelte +++ b/src/components/LandingHeader.svelte @@ -22,10 +22,7 @@ }; </script> -<header - class="w-full lg:w-5/6 p-4 mx-auto fixed sticky z-10 top-0 bg-base-100" - bind:this={header} -> +<header class="w-full lg:w-5/6 p-4 mx-auto fixed sticky z-10 top-0 bg-base-100" bind:this={header}> <nav class="block lg:flex justify-between items-center"> <div class="flex justify-start lg:justify-center items-center lg:space-x-5"> <a href="/" onclick={() => scroll(header)} aria-label="Home"> @@ -39,35 +36,21 @@ <button class="hover:opacity-80" onclick={() => scroll(howItWorks)} >{$t("howItWorks.header")}</button > - <button class="hover:opacity-80" onclick={() => scroll(faq)} - >{$t("faq.header")}</button - > - <button class="hover:opacity-80" onclick={() => scroll(about)} - >{$t("about.header")}</button - > + <button class="hover:opacity-80" onclick={() => scroll(faq)}>{$t("faq.header")}</button> + <button class="hover:opacity-80" onclick={() => scroll(about)}>{$t("about.header")}</button> {/if} {#if user} - <button - class="btn !w-auto !rounded-full" - onclick={() => goto(`/${user.username}`)} + <button class="btn !w-auto !rounded-full" onclick={() => goto(`/${user.username}`)} >{$t("nav.home")} </button> - <button - class="btn !w-auto !rounded-full" - onclick={() => goto("/logout")} - > + <button class="btn !w-auto !rounded-full" onclick={() => goto("/logout")}> {$t("nav.signOut")} </button> {:else} - <button - class="btn btn-accent !w-auto !rounded-full" - onclick={() => goto("/register")} + <button class="btn btn-accent !w-auto !rounded-full" onclick={() => goto("/register")} >{$t("nav.register")} </button> - <button - class="btn !w-auto !rounded-full" - onclick={() => goto("/login")} - > + <button class="btn !w-auto !rounded-full" onclick={() => goto("/login")}> {$t("nav.signIn")} </button> {/if} @@ -78,10 +61,7 @@ class="block lg:hidden absolute top-[34.5px] right-10 z" onclick={() => (showMobileMenu = !showMobileMenu)} > - <iconify-icon - noobserver - icon={!showMobileMenu ? "ph:list-bold" : "ph:x-bold"} - width="32" + <iconify-icon noobserver icon={!showMobileMenu ? "ph:list-bold" : "ph:x-bold"} width="32" ></iconify-icon> </button> @@ -96,9 +76,7 @@ <button onclick={() => mobileMenuButtonClick(howItWorks)} class="block" >{$t("howItWorks.header")}</button > - <button onclick={() => mobileMenuButtonClick(faq)} class="block" - >{$t("faq.header")}</button - > + <button onclick={() => mobileMenuButtonClick(faq)} class="block">{$t("faq.header")}</button> <button onclick={() => mobileMenuButtonClick(about)} class="block" >{$t("about.header")}</button > diff --git a/src/components/LandingInfoCard.svelte b/src/components/LandingInfoCard.svelte index cb16c5dd..8b85518c 100644 --- a/src/components/LandingInfoCard.svelte +++ b/src/components/LandingInfoCard.svelte @@ -1,13 +1,7 @@ <script lang="ts"> import Image from "./Image.svelte"; - let { - image, - title, - description = undefined, - order = undefined, - children, - } = $props(); + let { image, title, description = undefined, order = undefined, children } = $props(); </script> <div class="block lg:flex justify-center lg:space-x-20 items-center"> @@ -17,14 +11,10 @@ 'reverse' && 'order-last'}" /> <div class="w-full lg:w-1/2 max-w-3xl space-y-10 mx-auto lg:mx-0"> - <h3 - class="text-5xl font-medium text-left w-full mx-auto lg:mx-0 md:w-[500px]" - > + <h3 class="text-5xl font-medium text-left w-full mx-auto lg:mx-0 md:w-[500px]"> {title} </h3> - <p - class="text-secondary text-xl font-medium w-full md:w-[500px] mx-auto lg:mx-0" - > + <p class="text-secondary text-xl font-medium w-full md:w-[500px] mx-auto lg:mx-0"> {#if description} {description} {:else} diff --git a/src/components/Lnurlp.svelte b/src/components/Lnurlp.svelte index c735c5a8..360c05db 100644 --- a/src/components/Lnurlp.svelte +++ b/src/components/Lnurlp.svelte @@ -9,8 +9,7 @@ let { data, form, send = $bindable(), comment = $bindable() } = $props(); let { currency } = data.user; - let { minSendable, maxSendable, commentAllowed, callback, metadata, rate } = - data; + let { minSendable, maxSendable, commentAllowed, callback, metadata, rate } = data; let amount = $state(Math.round(minSendable / 1000)), loading = $state(); diff --git a/src/components/Lnurlw.svelte b/src/components/Lnurlw.svelte index 006fda8b..9b374fcd 100644 --- a/src/components/Lnurlw.svelte +++ b/src/components/Lnurlw.svelte @@ -11,14 +11,7 @@ let { data, form } = $props(); let { currency, username } = data.user; - let { - defaultDescription, - minWithdrawable, - maxWithdrawable, - k1, - callback, - rate, - } = data; + let { defaultDescription, minWithdrawable, maxWithdrawable, k1, callback, rate } = data; let amount = $state(Math.round(minWithdrawable / 1000)); let amountFiat = $derived(parseFloat(((amount * rate) / sats).toFixed(2))); @@ -56,9 +49,7 @@ <div>{f(amountFiat, currency)}</div> {:else} <div> - <span class="text-secondary font-normal text-xl" - >⚡️{`${s(amount)}`}</span - > + <span class="text-secondary font-normal text-xl">⚡️{`${s(amount)}`}</span> </div> {/if} </div> @@ -66,12 +57,7 @@ <Numpad bind:amount {currency} {rate} /> {/if} - <form - use:enhance={handler(toggle)} - action="?/withdraw" - method="POST" - class="space-y-5" - > + <form use:enhance={handler(toggle)} action="?/withdraw" method="POST" class="space-y-5"> <input name="amount" value={amount} type="hidden" /> <input name="username" value={username} type="hidden" /> <input name="currency" value={currency} type="hidden" /> @@ -89,22 +75,14 @@ disabled={submitting} onkeydown={setMax} >{#if $fiat} - Max {f( - (Math.floor(maxWithdrawable / 1000) * rate) / sats, - currency, - )} + Max {f((Math.floor(maxWithdrawable / 1000) * rate) / sats, currency)} {:else} Max ⚡️{s(Math.floor(maxWithdrawable / 1000))} {/if}</button > {/if} - <button - use:focus - bind:this={submit} - type="submit" - class="btn btn-accent !w-auto grow" - > + <button use:focus bind:this={submit} type="submit" class="btn btn-accent !w-auto grow"> {#if submitting} <Spinner /> {:else} diff --git a/src/components/LoadingSplash.svelte b/src/components/LoadingSplash.svelte index e629a494..8ed0429f 100644 --- a/src/components/LoadingSplash.svelte +++ b/src/components/LoadingSplash.svelte @@ -1,8 +1,4 @@ <div class="flex justify-center items-center"> - <iconify-icon - noobserver - icon="coinos:logo" - width="224" - class="mt-[calc(50vh-72px)]" + <iconify-icon noobserver icon="coinos:logo" width="224" class="mt-[calc(50vh-72px)]" ></iconify-icon> </div> diff --git a/src/components/LocationsMap.svelte b/src/components/LocationsMap.svelte index 3ec50e38..23da473e 100644 --- a/src/components/LocationsMap.svelte +++ b/src/components/LocationsMap.svelte @@ -181,11 +181,8 @@ maplibrePromise = new Promise((resolve, reject) => { const existing = document.querySelector("script[data-maplibre]"); if (existing) { - if ((window as any).maplibregl) - return resolve((window as any).maplibregl); - existing.addEventListener("load", () => - resolve((window as any).maplibregl), - ); + if ((window as any).maplibregl) return resolve((window as any).maplibregl); + existing.addEventListener("load", () => resolve((window as any).maplibregl)); existing.addEventListener("error", reject); return; } @@ -285,27 +282,20 @@ onDestroy(() => map && map.remove()); let list = $derived( search - ? markers.filter((m) => - m.tags.name.toLowerCase().includes(search.toLowerCase()), - ) + ? markers.filter((m) => m.tags.name.toLowerCase().includes(search.toLowerCase())) : inview, ); </script> <div class="w-screen h-dvh flex" id="map" bind:this={mapWrapper}> - <div - id="map-container" - class="mx-auto h-full w-full z-0" - bind:this={mapContainer} - ></div> + <div id="map-container" class="mx-auto h-full w-full z-0" bind:this={mapContainer}></div> <div class="absolute flex top-2 left-2 gap-2"> <button aria-label="Back" class="rounded-full border-2 border-black bg-base-100/80 w-16 h-16 flex items-center justify-center" onclick={back} > - <iconify-icon noobserver icon="ph:arrow-left-bold" width="24" - ></iconify-icon> + <iconify-icon noobserver icon="ph:arrow-left-bold" width="24"></iconify-icon> </button> </div> <div class="relative"> @@ -318,12 +308,10 @@ <div class="flex gap-1 absolute right-6 top-3"> {#if search} <button type="button" onclick={clearSearch} aria-label="Clear"> - <iconify-icon noobserver icon="ph:x-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:x-bold" width="32"></iconify-icon> </button> {:else} - <iconify-icon noobserver icon="ph:search-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:search-bold" width="32"></iconify-icon> {/if} </div> </div> @@ -354,11 +342,9 @@ aria-label={timeout ? "Resume map" : "Pause map"} > {#if timeout} - <iconify-icon noobserver icon="ph:pause-bold" width="24" - ></iconify-icon> + <iconify-icon noobserver icon="ph:pause-bold" width="24"></iconify-icon> {:else} - <iconify-icon noobserver icon="ph:play-bold" width="24" - ></iconify-icon> + <iconify-icon noobserver icon="ph:play-bold" width="24"></iconify-icon> {/if} </button> </div> diff --git a/src/components/Media.svelte b/src/components/Media.svelte index 9c2c21f8..6471d190 100644 --- a/src/components/Media.svelte +++ b/src/components/Media.svelte @@ -1,8 +1,6 @@ <script lang="ts"> - export const isImage = (url: string) => - url?.match(/^.*\.(jpg|jpeg|png|webp|gif|avif|svg)/gi); - export const isVideo = (url: string) => - url?.match(/^.*\.(mov|mkv|mp4|avi|m4v|webm)/gi); + export const isImage = (url: string) => url?.match(/^.*\.(jpg|jpeg|png|webp|gif|avif|svg)/gi); + export const isVideo = (url: string) => url?.match(/^.*\.(mov|mkv|mp4|avi|m4v|webm)/gi); export const isAudio = (url: string) => url?.match(/^.*\.(ogg|mp3|wav)/gi); // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/components/Menu.svelte b/src/components/Menu.svelte index 9b49a263..1c09bd54 100644 --- a/src/components/Menu.svelte +++ b/src/components/Menu.svelte @@ -27,13 +27,8 @@ <div> <OutClick onOutClick={hideMenu}> - <button - class="btn-menu {opacity('/support')}" - onclick={toggleMenu} - aria-label="Open menu" - > - <iconify-icon noobserver icon="ph:list-bold" width={w > 640 ? 32 : 24} - ></iconify-icon> + <button class="btn-menu {opacity('/support')}" onclick={toggleMenu} aria-label="Open menu"> + <iconify-icon noobserver icon="ph:list-bold" width={w > 640 ? 32 : 24}></iconify-icon> </button> <div @@ -66,8 +61,7 @@ </ul> <hr class="my-4" /> <a href="/?stay=true" aria-label="Coinos home" - ><iconify-icon noobserver icon="coinos:logo" width="160" - ></iconify-icon></a + ><iconify-icon noobserver icon="coinos:logo" width="160"></iconify-icon></a > </div> </OutClick> diff --git a/src/components/Nostr.svelte b/src/components/Nostr.svelte index 74e85faf..529dd6e7 100644 --- a/src/components/Nostr.svelte +++ b/src/components/Nostr.svelte @@ -32,8 +32,7 @@ let connectUrl: string | undefined = $state(); let nostrConnect = async () => { const { Relay } = await import("nostr-tools/relay"); - const { nip04, generateSecretKey, getPublicKey } = - await import("nostr-tools"); + const { nip04, generateSecretKey, getPublicKey } = await import("nostr-tools"); const { getConversationKey, decrypt } = await import("nostr-tools/nip44"); let connectionSecret = crypto.randomUUID(); @@ -49,9 +48,7 @@ try { let result; try { - ({ result } = JSON.parse( - await nip04.decrypt(sk, pk, event.content), - )); + ({ result } = JSON.parse(await nip04.decrypt(sk, pk, event.content))); } catch (e) { let ck = await getConversationKey(sk, pk); ({ result } = JSON.parse(await decrypt(event.content, ck))); @@ -119,9 +116,7 @@ {#if $eventToSign && !$signer?.ready} <div class="fixed inset-0 bg-base-100/90 overflow-y-auto h-full w-full z-50"> - <div - class="relative mx-auto mt-10 p-5 border w-96 shadow-lg rounded-md bg-base-100 space-y-5" - > + <div class="relative mx-auto mt-10 p-5 border w-96 shadow-lg rounded-md bg-base-100 space-y-5"> <h1 class="text-center text-2xl font-semibold">Nostr sign</h1> {#if ($eventToSign as any).sig && !hadSigner} @@ -140,16 +135,11 @@ </div> </a> <a href={connectUrl} class="btn"> - <iconify-icon - noobserver - icon="ph:arrow-square-out-bold" - width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:arrow-square-out-bold" width="32"></iconify-icon> {$t("payments.openLink")}</a > <button class="btn" onclick={() => copy(connectUrl!)}> - <iconify-icon noobserver icon="ph:copy-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:copy-bold" width="32"></iconify-icon> {$t("payments.copy")}</button > </div> @@ -157,8 +147,7 @@ {#if $signer?.method === "nsec"} <input bind:value={nsec} placeholder="nsec..." /> <button type="button" class="btn btn-accent" onclick={nsecSign}> - <iconify-icon icon="ph:paper-plane-right-bold" width="32" - ></iconify-icon> + <iconify-icon icon="ph:paper-plane-right-bold" width="32"></iconify-icon> <div class="my-auto">Submit</div> </button> {/if} @@ -166,10 +155,7 @@ {#if !$signer} {#if extensionAvailable} <button type="button" class="btn" onclick={extensionSign}> - <iconify-icon - icon="lucide-lab:bee" - width="32" - class="text-yellow-400" + <iconify-icon icon="lucide-lab:bee" width="32" class="text-yellow-400" ></iconify-icon> <div class="my-auto">Browser extension</div> </button> diff --git a/src/components/Numpad.svelte b/src/components/Numpad.svelte index 57e8dd24..4f04fbaa 100644 --- a/src/components/Numpad.svelte +++ b/src/components/Numpad.svelte @@ -29,8 +29,7 @@ function getCurrencyInfo(locale: any = "en-US", currency: string) { const l = typeof locale === "function" ? locale() : locale || "en-US"; const region = l.length >= 2 ? l.slice(-2) : ""; - const currencyDisplay = - region && currency.startsWith(region) ? "narrowSymbol" : "symbol"; + const currencyDisplay = region && currency.startsWith(region) ? "narrowSymbol" : "symbol"; const formatter = new Intl.NumberFormat(l, { style: "currency", currency, @@ -75,11 +74,8 @@ const updateByMode = () => { if (fiat) { - const numericFiat = - parseFloat((fiatDigits || "0").replace(/\D/g, "")) / 100; - amountFiat = isFinite(numericFiat) - ? numericFiat.toFixed(2) - : ("0.00" as any); + const numericFiat = parseFloat((fiatDigits || "0").replace(/\D/g, "")) / 100; + amountFiat = isFinite(numericFiat) ? numericFiat.toFixed(2) : ("0.00" as any); amount = numericFiat ? Math.round((numericFiat * sats) / rate) : 0; } else { // integer-only sats, already normalized @@ -201,8 +197,7 @@ if (!html) html = fiat ? formatFiatFromDigits("0", decimalChar) : "0"; }; - const keydown = (e) => - e.key === "Enter" && (e.preventDefault() || submit?.click?.()); + const keydown = (e) => e.key === "Enter" && (e.preventDefault() || submit?.click?.()); // CHANGED: make swap set html for the new mode immediately and keep DOM in sync const swap = () => { @@ -213,9 +208,7 @@ element && (element.innerHTML = html); } else { // going -> fiat - const cents = Math.round( - (parseFloat(String(amountFiat) || "0") || 0) * 100, - ); + const cents = Math.round((parseFloat(String(amountFiat) || "0") || 0) * 100); fiatDigits = Math.max(0, cents).toString(); fiat = true; html = formatFiatFromDigits(fiatDigits, decimalChar); @@ -241,27 +234,12 @@ }; const arrow = "<"; - const numPad = [ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "00", - "0", - arrow, - ]; + const numPad = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "00", "0", arrow]; onMount(() => { fiat = $fiatStore; if (fiat) { - const cents = Math.round( - (parseFloat(String(amountFiat) || "0") || 0) * 100, - ); + const cents = Math.round((parseFloat(String(amountFiat) || "0") || 0) * 100); fiatDigits = Math.max(0, cents).toString(); html = formatFiatFromDigits(fiatDigits, decimalChar); // keep html in sync on mount } else { @@ -275,17 +253,12 @@ <div class="flex justify-center items-center"> <div class="space-y-5 w-full"> <div class="text-center"> - <div - class="text-5xl md:text-6xl font-semibold tracking-widest flex justify-center" - > + <div class="text-5xl md:text-6xl font-semibold tracking-widest flex justify-center"> <div class="my-auto" class:text-5xl={!fiat}> {#if fiat} {#if position === "before"}{symbol}{/if} {:else} - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300" ></iconify-icon> {/if} </div> @@ -330,11 +303,7 @@ }} > {#if fiat} - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" - ></iconify-icon> + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon> {s(amount, locale)} {:else} {f(amountFiat, currency, locale)} diff --git a/src/components/Password.svelte b/src/components/Password.svelte index 2c2319f6..3a7d71fe 100644 --- a/src/components/Password.svelte +++ b/src/components/Password.svelte @@ -24,24 +24,17 @@ </script> <div class="fixed inset-0 bg-base-100/90 overflow-y-auto h-full w-full z-50"> - <div - class="relative top-1/3 mx-auto p-5 border w-96 shadow-lg rounded-md bg-base-100 space-y-5" - > + <div class="relative top-1/3 mx-auto p-5 border w-96 shadow-lg rounded-md bg-base-100 space-y-5"> <h1 class="text-center text-2xl font-semibold"> {$t("user.settings.pleaseEnterYourPassword")} </h1> <form onsubmit={submit} class="space-y-2"> <PasswordInput bind:value={password} {focus} /> <div class="w-full flex gap-2"> - <button - type="button" - class="btn !w-auto grow" - onclick={cancel} - onkeydown={cancel}>{$t("payments.cancel")}</button - > - <button type="submit" class="btn btn-accent !w-auto grow" - >{$t("payments.submit")}</button + <button type="button" class="btn !w-auto grow" onclick={cancel} onkeydown={cancel} + >{$t("payments.cancel")}</button > + <button type="submit" class="btn btn-accent !w-auto grow">{$t("payments.submit")}</button> </div> </form> </div> diff --git a/src/components/PasswordInput.svelte b/src/components/PasswordInput.svelte index 3f784290..8d16aad6 100644 --- a/src/components/PasswordInput.svelte +++ b/src/components/PasswordInput.svelte @@ -15,21 +15,11 @@ let icon = $derived(show ? "ph:eye-bold" : "ph:eye-slash-bold"); </script> -<label - for="password" - class="input flex items-center justify-center gap-2 w-full" -> +<label for="password" class="input flex items-center justify-center gap-2 w-full"> {#if show} <input {name} type="text" bind:value class="clean" {placeholder} /> {:else} - <input - {name} - type="password" - bind:value - class="clean" - use:focus - {placeholder} - /> + <input {name} type="password" bind:value class="clean" use:focus {placeholder} /> {/if} <button type="button" aria-label="Toggle" onclick={toggle} class="contents"> <iconify-icon noobserver {icon} width="32"></iconify-icon> diff --git a/src/components/Payments.svelte b/src/components/Payments.svelte index 046356ca..ddbee1e0 100644 --- a/src/components/Payments.svelte +++ b/src/components/Payments.svelte @@ -18,8 +18,7 @@ class:border-b-0={i === payments.length - 1} class:text-error={amount < 0} onclick={() => goto(`/payment/${p.id}`)} - onkeydown={(e) => - (e.key === "Enter" || e.key === " ") && goto(`/payment/${p.id}`)} + onkeydown={(e) => (e.key === "Enter" || e.key === " ") && goto(`/payment/${p.id}`)} role="button" tabindex="0" > @@ -31,11 +30,7 @@ {f(Math.abs(amount) * (p.rate / sats), p.currency, locale)} </div> {:else} - <iconify-icon - noobserver - icon="ph:lightning-fill" - width="24" - class="text-yellow-300" + <iconify-icon noobserver icon="ph:lightning-fill" width="24" class="text-yellow-300" ></iconify-icon> <div>{s(Math.abs(amount), locale)}</div> {/if} @@ -49,9 +44,7 @@ {/if} </div> - <div - class="flex my-auto col-span-6 truncate text-ellipsis overflow-hidden mx-auto" - > + <div class="flex my-auto col-span-6 truncate text-ellipsis overflow-hidden mx-auto"> {#if p.type === types.fund} {#if fund} <div class="flex"> @@ -65,10 +58,7 @@ {:else} <a href={`/fund/${p.memo}`}> <div class="text-secondary flex"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300 text-3xl" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300 text-3xl" ></iconify-icon> <div class="my-auto">{$t("payments.fund")}</div> @@ -87,16 +77,12 @@ {:else} <div class="text-secondary flex items-center gap-1"> {#if p.type === types.lightning || p.type === types.bolt12} - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300 text-3xl" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300 text-3xl" ></iconify-icon> {:else if p.type === types.ecash} <img src="/images/cash.png" class="w-12" alt="Ecash" /> {:else if p.type === types.bitcoin} - <iconify-icon noobserver icon="logos:bitcoin" class="text-3xl" - ></iconify-icon> + <iconify-icon noobserver icon="logos:bitcoin" class="text-3xl"></iconify-icon> {:else if p.type === types.liquid} <div class="my-auto"> <img @@ -106,11 +92,7 @@ /> </div> {:else if p.type === types.ark} - <img - src="/images/ark.png" - class="w-10 h-10 rounded-full object-cover" - alt="Ark" - /> + <img src="/images/ark.png" class="w-10 h-10 rounded-full object-cover" alt="Ark" /> {/if} <div class="my-auto"> diff --git a/src/components/Pin.svelte b/src/components/Pin.svelte index 9c5d8664..72bbf78d 100644 --- a/src/components/Pin.svelte +++ b/src/components/Pin.svelte @@ -55,16 +55,12 @@ aria-labelledby="title" tabindex="-1" > - <div - class="mx-auto p-5 border shadow-lg rounded-md bg-base-100 space-y-5 max-w-lg" - > + <div class="mx-auto p-5 border shadow-lg rounded-md bg-base-100 space-y-5 max-w-lg"> <h1 id="title" class="text-center text-2xl font-semibold">{title}</h1> <Pinpad bind:v={p} {cancel} /> <div> - <label for="locktime" class="font-bold" - >{$t("user.settings.rememberFor")}</label - > + <label for="locktime" class="font-bold">{$t("user.settings.rememberFor")}</label> <select name="locktime" bind:value={locktime}> <option value={30}>30 {$t("user.settings.seconds")}</option> <option value={5 * 60}>5 {$t("user.settings.minutes")}</option> diff --git a/src/components/Pinpad.svelte b/src/components/Pinpad.svelte index 15dbc53e..3e9c490b 100644 --- a/src/components/Pinpad.svelte +++ b/src/components/Pinpad.svelte @@ -24,11 +24,7 @@ let validate = (e) => { let k = e.key || e.code; if (k === "Escape") cancel(); - if ( - e.key.length <= 1 && - !(e.metaKey || e.ctrlKey || e.altKey) && - !(k >= "0" && k <= "9") - ) { + if (e.key.length <= 1 && !(e.metaKey || e.ctrlKey || e.altKey) && !(k >= "0" && k <= "9")) { if (e.preventDefault) e.preventDefault(); else e.returnValue = false; } @@ -43,9 +39,7 @@ }; </script> -<label - class="input input-bordered border-primary input-lg rounded-2xl flex items-center gap-2" -> +<label class="input input-bordered border-primary input-lg rounded-2xl flex items-center gap-2"> {#if hide} <input onkeydown={validate} @@ -73,10 +67,7 @@ onclick={toggle} aria-label={hide ? "Show PIN" : "Hide PIN"} > - <iconify-icon - noobserver - icon={hide ? "ph:eye-slash-bold" : "ph:eye-bold"} - width="32" + <iconify-icon noobserver icon={hide ? "ph:eye-slash-bold" : "ph:eye-bold"} width="32" ></iconify-icon></button > </label> @@ -88,9 +79,7 @@ <Left /> </button> {:else} - <button type="button" class="btn" onclick={(e) => handleInput(e, value)} - >{value}</button - > + <button type="button" class="btn" onclick={(e) => handleInput(e, value)}>{value}</button> {/if} {/each} </div> diff --git a/src/components/Popup.svelte b/src/components/Popup.svelte index e696c5cc..58b37eae 100644 --- a/src/components/Popup.svelte +++ b/src/components/Popup.svelte @@ -4,11 +4,7 @@ let { tags } = $props(); let addr = (tags) => { - let { - "addr:housenumber": house, - "addr:street": street, - "addr:city": city, - } = tags; + let { "addr:housenumber": house, "addr:street": street, "addr:city": city } = tags; if (house) return `${house} ${street}`; return ""; }; diff --git a/src/components/Qr.svelte b/src/components/Qr.svelte index 37b1708c..c2014348 100644 --- a/src/components/Qr.svelte +++ b/src/components/Qr.svelte @@ -22,8 +22,7 @@ class="w-72 sm:w-80 mx-auto cursor-pointer" bind:this={qr} onclick={() => screenfull?.toggle?.(qr)} - onkeydown={(e) => - (e.key === "Enter" || e.key === " ") && screenfull?.toggle?.(qr)} + onkeydown={(e) => (e.key === "Enter" || e.key === " ") && screenfull?.toggle?.(qr)} role="button" tabindex="0" aria-label="Toggle fullscreen QR" diff --git a/src/components/SetAmount.svelte b/src/components/SetAmount.svelte index ce58e146..c339aa7d 100644 --- a/src/components/SetAmount.svelte +++ b/src/components/SetAmount.svelte @@ -21,33 +21,14 @@ {#if settingAmount} <div class="fixed inset-0 bg-base-100/90 overflow-y-auto h-full w-full z-50"> - <div - class="relative mx-auto p-12 max-w-xl shadow-lg rounded-md bg-base-100 space-y-5" - > + <div class="relative mx-auto p-12 max-w-xl shadow-lg rounded-md bg-base-100 space-y-5"> <form onsubmit={setAmount} class="space-y-5"> - <Numpad - bind:amount={newAmount} - bind:fiat - {currency} - {rate} - {submit} - {locale} - /> + <Numpad bind:amount={newAmount} bind:fiat {currency} {rate} {submit} {locale} /> <div class="w-full flex flex-wrap gap-2"> - <button - bind:this={submit} - type="submit" - onclick={setAmount} - class="btn btn-accent" - > + <button bind:this={submit} type="submit" onclick={setAmount} class="btn btn-accent"> <div class="my-auto">{t("payments.ok")}</div> </button> - <button - type="button" - class="btn" - onclick={toggleAmount} - onkeydown={toggleAmount} - > + <button type="button" class="btn" onclick={toggleAmount} onkeydown={toggleAmount}> <div class="my-auto">{t("payments.cancel")}</div> </button> </div> diff --git a/src/components/SetMemo.svelte b/src/components/SetMemo.svelte index 54921f56..e9f2524b 100644 --- a/src/components/SetMemo.svelte +++ b/src/components/SetMemo.svelte @@ -1,38 +1,19 @@ <script lang="ts"> import { focus } from "$lib/utils"; - let { - submit = $bindable(), - settingMemo, - setMemo, - memo = $bindable(), - toggleMemo, - t, - } = $props(); + let { submit = $bindable(), settingMemo, setMemo, memo = $bindable(), toggleMemo, t } = $props(); </script> {#if settingMemo} <div class="fixed inset-0 bg-base-100/90 overflow-y-auto h-full w-full z-50"> - <div - class="relative mx-auto p-12 max-w-xl shadow-lg rounded-md bg-base-100 space-y-5" - > + <div class="relative mx-auto p-12 max-w-xl shadow-lg rounded-md bg-base-100 space-y-5"> <form onsubmit={setMemo} class="space-y-5"> <input use:focus placeholder={t("invoice.memo")} bind:value={memo} /> <div class="w-full flex flex-wrap gap-2"> - <button - bind:this={submit} - type="submit" - onclick={setMemo} - class="btn btn-accent" - > + <button bind:this={submit} type="submit" onclick={setMemo} class="btn btn-accent"> <div class="my-auto">{t("payments.ok")}</div> </button> - <button - type="button" - class="btn" - onclick={toggleMemo} - onkeydown={toggleMemo} - > + <button type="button" class="btn" onclick={toggleMemo} onkeydown={toggleMemo}> <div class="my-auto">{t("payments.cancel")}</div> </button> </div> diff --git a/src/components/SetType.svelte b/src/components/SetType.svelte index d06ca345..5794700d 100644 --- a/src/components/SetType.svelte +++ b/src/components/SetType.svelte @@ -18,18 +18,8 @@ {#if settingType} <div class="fixed inset-0 bg-base-100/90 overflow-y-auto h-full w-full z-50"> - <div - class="relative mx-auto p-12 max-w-xl shadow-lg rounded-md bg-base-100 space-y-2" - > - <InvoiceTypes - bind:newAmount - {setAmount} - {invoice} - {user} - {setType} - {toggleType} - {t} - /> + <div class="relative mx-auto p-12 max-w-xl shadow-lg rounded-md bg-base-100 space-y-2"> + <InvoiceTypes bind:newAmount {setAmount} {invoice} {user} {setType} {toggleType} {t} /> </div> </div> {/if} diff --git a/src/components/Slider.svelte b/src/components/Slider.svelte index 846d32a6..946878ee 100644 --- a/src/components/Slider.svelte +++ b/src/components/Slider.svelte @@ -9,12 +9,4 @@ let { value = $bindable(), handle, min = 0, max = 100 }: Props = $props(); </script> -<input - id="slider" - type="range" - {min} - {max} - bind:value - class="range w-full" - oninput={handle} -/> +<input id="slider" type="range" {min} {max} bind:value class="range w-full" oninput={handle} /> diff --git a/src/components/Spinner.svelte b/src/components/Spinner.svelte index e9c3348f..f08cb3f3 100644 --- a/src/components/Spinner.svelte +++ b/src/components/Spinner.svelte @@ -4,14 +4,7 @@ fill="none" viewBox="0 0 24 24" > - <circle - class="opacity-25" - cx="12" - cy="12" - r="10" - stroke="currentColor" - stroke-width="4" - /> + <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4" /> <path class="opacity-75" fill="currentColor" diff --git a/src/components/Success.svelte b/src/components/Success.svelte index ae54b6c1..bd3214ce 100644 --- a/src/components/Success.svelte +++ b/src/components/Success.svelte @@ -2,14 +2,7 @@ import { browser } from "$app/environment"; import { scale } from "svelte/transition"; import Amount from "$comp/Amount.svelte"; - const { - amount, - tip = undefined, - rate, - currency, - locale, - title = "", - }: any = $props(); + const { amount, tip = undefined, rate, currency, locale, title = "" }: any = $props(); let ConfettiComp: any = $state(null); let loaded = $state(false); diff --git a/src/components/Toggle.svelte b/src/components/Toggle.svelte index 3f725d08..8aee2829 100644 --- a/src/components/Toggle.svelte +++ b/src/components/Toggle.svelte @@ -3,13 +3,7 @@ </script> <label for={id} class="inline-flex relative items-center mr-5 cursor-pointer"> - <input - type="checkbox" - bind:checked={value} - {id} - name={id} - class="sr-only peer" - /> + <input type="checkbox" bind:checked={value} {id} name={id} class="sr-only peer" /> <div class="w-11 h-6 bg-gray-200 rounded-full peer dark:bg-gray-700 peer-focus:ring-4 peer-focus:ring-gray-300 dark:peer-focus:ring-gray-800 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-green-500" ></div> diff --git a/src/components/WalletPass.svelte b/src/components/WalletPass.svelte index 9e0b6cd2..cc9e2bbd 100644 --- a/src/components/WalletPass.svelte +++ b/src/components/WalletPass.svelte @@ -24,9 +24,7 @@ </script> <div class="fixed inset-0 bg-gray-600/50 overflow-y-auto h-full w-full z-20"> - <div - class="relative top-1/3 mx-auto p-5 border w-96 shadow-lg rounded-md bg-white space-y-5" - > + <div class="relative top-1/3 mx-auto p-5 border w-96 shadow-lg rounded-md bg-white space-y-5"> <h1 class="text-center text-2xl font-semibold"> {$t("payments.enterWalletPass")} </h1> @@ -66,15 +64,12 @@ </button> </div> <div class="mb-5 space-y-2"> - <label for="rememberFor" class="text-sm text-gray-500"> - Remember for - </label> + <label for="rememberFor" class="text-sm text-gray-500"> Remember for </label> <select id="rememberFor" class="w-full" value={rememberForMs} - onchange={(e) => - (rememberForMs = Number((e.target as HTMLSelectElement).value))} + onchange={(e) => (rememberForMs = Number((e.target as HTMLSelectElement).value))} > {#each rememberForOptions as option} <option value={option.ms}>{option.label}</option> diff --git a/src/lib/ark.ts b/src/lib/ark.ts index 51e378c3..61668c3a 100644 --- a/src/lib/ark.ts +++ b/src/lib/ark.ts @@ -95,14 +95,11 @@ export const syncTransactions = async (aid: string) => { return post("/post/ark/sync", { transactions, aid }); }; -export const vtxoKey = (v: { txid: string; vout: number }) => - `${v.txid}:${v.vout}`; +export const vtxoKey = (v: { txid: string; vout: number }) => `${v.txid}:${v.vout}`; export const getProcessedVtxos = (): Set<string> => { try { - return new Set( - JSON.parse(localStorage.getItem("processedArkVtxos") || "[]"), - ); + return new Set(JSON.parse(localStorage.getItem("processedArkVtxos") || "[]")); } catch { return new Set(); } diff --git a/src/lib/bip21.ts b/src/lib/bip21.ts index 842782a5..674fa714 100644 --- a/src/lib/bip21.ts +++ b/src/lib/bip21.ts @@ -12,10 +12,7 @@ export function decode(uri, allowedSchemes = ["bitcoin", "liquidnetwork"]) { // Extract address and query string const queryStart = uri.indexOf("?"); - const address = uri.slice( - split + 1, - queryStart === -1 ? undefined : queryStart, - ); + const address = uri.slice(split + 1, queryStart === -1 ? undefined : queryStart); const query = queryStart === -1 ? "" : uri.slice(queryStart + 1); const options = Object.fromEntries(new URLSearchParams(query)); @@ -28,11 +25,7 @@ export function decode(uri, allowedSchemes = ["bitcoin", "liquidnetwork"]) { return { scheme: urnScheme, address, options }; } -export function encode( - address, - options = { amount: "" }, - urnScheme = "bitcoin", -) { +export function encode(address, options = { amount: "" }, urnScheme = "bitcoin") { if (!address || typeof address !== "string") { throw new TypeError("Invalid address"); } diff --git a/src/lib/invoice.ts b/src/lib/invoice.ts index 015f2837..25741639 100644 --- a/src/lib/invoice.ts +++ b/src/lib/invoice.ts @@ -30,8 +30,7 @@ export default async ({ cookies, request }) => { invoice = await post("/invoice", { invoice, user }, auth(cookies)); const { id } = invoice; - if (invoice.prompt && invoice.tip === null) - redirect(307, `/invoice/${id}/tip`); + if (invoice.prompt && invoice.tip === null) redirect(307, `/invoice/${id}/tip`); if (invoice.memoPrompt && !invoice.memo) { redirect(307, `/invoice/${id}/memo`); diff --git a/src/lib/nip07.ts b/src/lib/nip07.ts index 4b32512f..c26226d9 100644 --- a/src/lib/nip07.ts +++ b/src/lib/nip07.ts @@ -15,16 +15,9 @@ export const signEvent = async (event: any, user: any): Promise<any> => { }; // Encrypts an event in NIP-44 using NIP-07 if available, otherwise getPrivateKey() -export const encrypt = async ( - json: any, - user: any, - receiverPK: string, -): Promise<string> => { +export const encrypt = async (json: any, user: any, receiverPK: string): Promise<string> => { if ((await (window as any).nostr.getPublicKey()) === user.pubkey) { - return (window as any).nostr.nip44.encrypt( - receiverPK, - JSON.stringify(json), - ); + return (window as any).nostr.nip44.encrypt(receiverPK, JSON.stringify(json)); } else { const senderSK = await getPrivateKey(user); const senderSKString = bytesToHex(senderSK); @@ -34,15 +27,9 @@ export const encrypt = async ( }; // Decrypts an event in NIP-44 using NIP-07 if available, otherwise getPrivateKey() -export const decrypt = async ( - encrypted: string, - user: any, - receiverPK: string, -): Promise<any> => { +export const decrypt = async (encrypted: string, user: any, receiverPK: string): Promise<any> => { if ((await (window as any).nostr.getPublicKey()) === user.pubkey) { - return JSON.parse( - await (window as any).nostr.nip44.decrypt(receiverPK, encrypted), - ); + return JSON.parse(await (window as any).nostr.nip44.decrypt(receiverPK, encrypted)); } else { const senderSK = await getPrivateKey(user); const senderSKString = bytesToHex(senderSK); diff --git a/src/lib/nip17.ts b/src/lib/nip17.ts index 32a18bd8..49312783 100644 --- a/src/lib/nip17.ts +++ b/src/lib/nip17.ts @@ -1,11 +1,6 @@ import { bytesToHex, hexToBytes } from "@noble/hashes/utils.js"; -import { - finalizeEvent, - getEventHash, - generateSecretKey, - getPublicKey, -} from "nostr-tools/pure"; +import { finalizeEvent, getEventHash, generateSecretKey, getPublicKey } from "nostr-tools/pure"; import { SimplePool } from "nostr-tools/pool"; import { Relay } from "nostr-tools/relay"; import { unwrapEvent } from "nostr-tools/nip17"; @@ -17,8 +12,7 @@ import { eventToSign, signer } from "$lib/store"; import { get } from "svelte/store"; const TWO_DAYS = 2 * 24 * 60 * 60; -const randomTimestamp = () => - Math.floor(Date.now() / 1000 - Math.random() * TWO_DAYS); +const randomTimestamp = () => Math.floor(Date.now() / 1000 - Math.random() * TWO_DAYS); const pool = new SimplePool(); let relayListCache = new Map(); @@ -43,11 +37,7 @@ const ensureSigner = async (userPubkey: string): Promise<Uint8Array | null> => { // Check if signer already has a valid sk (64 hex chars = 32 bytes) const currentSigner: any = get(signer); - if ( - currentSigner?.ready && - currentSigner?.params?.sk && - currentSigner.params.sk.length === 64 - ) { + if (currentSigner?.ready && currentSigner?.params?.sk && currentSigner.params.sk.length === 64) { return hexToBytes(currentSigner.params.sk); } @@ -112,12 +102,7 @@ export const createNIP17MessageSK = ( expiryDays: number | null = null, ) => { const rumour = createRumour(text, getPublicKey(senderSK), receiverPK); - const sealed = sealRumourSK( - rumour, - senderSK, - wrapPK || receiverPK, - expiryDays, - ); + const sealed = sealRumourSK(rumour, senderSK, wrapPK || receiverPK, expiryDays); return giftWrap(sealed, wrapPK || receiverPK, expiryDays); }; @@ -136,11 +121,7 @@ export const createNIP17MessageNIP07 = async ( expiryDays: number | null = null, ) => { const rumour = createRumour(text, senderPK, receiverPK); - const sealed = await sealRumourNip07( - rumour, - wrapPK || receiverPK, - expiryDays, - ); + const sealed = await sealRumourNip07(rumour, wrapPK || receiverPK, expiryDays); return giftWrap(sealed, wrapPK || receiverPK, expiryDays); }; @@ -207,16 +188,9 @@ const sealRumourNip07 = async ( return (window as any).nostr.signEvent(sealEvent); }; -const giftWrap = ( - event: any, - receiverPK: string, - expiryDays: number | null = null, -) => { +const giftWrap = (event: any, receiverPK: string, expiryDays: number | null = null) => { const secretKey = generateSecretKey(); - const conversationKey = u.getConversationKey( - bytesToHex(secretKey), - receiverPK, - ); + const conversationKey = u.getConversationKey(bytesToHex(secretKey), receiverPK); const encryptedEvent = encrypt(JSON.stringify(event), conversationKey); const created = randomTimestamp(); @@ -236,15 +210,9 @@ const giftWrap = ( }; const decryptNIP17MessageNIP07 = async (wrapped: any): Promise<any> => { - const sealedText = await (window as any).nostr.nip44.decrypt( - wrapped.pubkey, - wrapped.content, - ); + const sealedText = await (window as any).nostr.nip44.decrypt(wrapped.pubkey, wrapped.content); const sealed = JSON.parse(sealedText); - const rumourText = await (window as any).nostr.nip44.decrypt( - sealed.pubkey, - sealed.content, - ); + const rumourText = await (window as any).nostr.nip44.decrypt(sealed.pubkey, sealed.content); return JSON.parse(rumourText); }; @@ -373,9 +341,7 @@ const publishToPreferred = async ( throw new Error("No relays available to publish to"); } - const promises = preferredRelays.map((url) => - publishWithAuth(url, event, currentSk), - ); + const promises = preferredRelays.map((url) => publishWithAuth(url, event, currentSk)); try { return await (Promise as any).any(promises); } catch (e) { @@ -387,12 +353,7 @@ const publishToPreferred = async ( // Sends a NIP-17 message from `user` to `recipient`. // If expiryDays is set, messages will expire after that many days. -export const send = async ( - message: string, - user: any, - recipient: any, - expiryDays?: number, -) => { +export const send = async (message: string, user: any, recipient: any, expiryDays?: number) => { let event1, event2; const sk = await ensureSigner(user.pubkey); @@ -416,20 +377,8 @@ export const send = async ( expiryDays, ); } else { - event1 = createNIP17MessageSK( - message, - sk, - recipient.pubkey, - recipient.pubkey, - expiryDays, - ); - event2 = createNIP17MessageSK( - message, - sk, - recipient.pubkey, - user.pubkey, - expiryDays, - ); + event1 = createNIP17MessageSK(message, sk, recipient.pubkey, recipient.pubkey, expiryDays); + event2 = createNIP17MessageSK(message, sk, recipient.pubkey, user.pubkey, expiryDays); } const p1 = publishToPreferred(event1, recipient.pubkey, expiryDays != null); diff --git a/src/lib/nip44.ts b/src/lib/nip44.ts index e05fc685..f1f872b5 100644 --- a/src/lib/nip44.ts +++ b/src/lib/nip44.ts @@ -5,10 +5,7 @@ import { chacha20 } from "@noble/ciphers/chacha.js"; import { equalBytes } from "@noble/ciphers/utils.js"; import { secp256k1 } from "@noble/curves/secp256k1.js"; -import { - extract as hkdf_extract, - expand as hkdf_expand, -} from "@noble/hashes/hkdf.js"; +import { extract as hkdf_extract, expand as hkdf_expand } from "@noble/hashes/hkdf.js"; import { hmac } from "@noble/hashes/hmac.js"; import { sha256 } from "@noble/hashes/sha2.js"; import { concatBytes, randomBytes, utf8ToBytes } from "@noble/hashes/utils.js"; @@ -27,9 +24,7 @@ export const u = { }, getConversationKey(privkeyA: string, pubkeyB: string): Uint8Array { - const sharedX = secp256k1 - .getSharedSecret(privkeyA, "02" + pubkeyB) - .subarray(1, 33); + const sharedX = secp256k1.getSharedSecret(privkeyA, "02" + pubkeyB).subarray(1, 33); return hkdf_extract(sha256, sharedX, "nip44-v2"); }, @@ -45,8 +40,7 @@ export const u = { }, calcPaddedLen(len: number): number { - if (!Number.isSafeInteger(len) || len < 1) - throw new Error("expected positive integer"); + if (!Number.isSafeInteger(len) || len < 1) throw new Error("expected positive integer"); if (len <= 32) return 32; const nextPower = 1 << (Math.floor(Math.log2(len - 1)) + 1); const chunk = nextPower <= 256 ? 32 : nextPower / 8; @@ -54,14 +48,8 @@ export const u = { }, writeU16BE(num: number) { - if ( - !Number.isSafeInteger(num) || - num < u.minPlaintextSize || - num > u.maxPlaintextSize - ) - throw new Error( - "invalid plaintext size: must be between 1 and 65535 bytes", - ); + if (!Number.isSafeInteger(num) || num < u.minPlaintextSize || num > u.maxPlaintextSize) + throw new Error("invalid plaintext size: must be between 1 and 65535 bytes"); const arr = new Uint8Array(2); new DataView(arr.buffer).setUint16(0, num, false); return arr; @@ -89,8 +77,7 @@ export const u = { }, hmacAad(key: Uint8Array, message: Uint8Array, aad: Uint8Array) { - if (aad.length !== 32) - throw new Error("AAD associated data must be 32 bytes"); + if (aad.length !== 32) throw new Error("AAD associated data must be 32 bytes"); const combined = concatBytes(aad, message); return hmac(sha256, key, combined); }, @@ -102,11 +89,9 @@ export const u = { // raw payload: 99 (65+32+2) to 65603 (65+0xffff+2) // compressed payload (base64): 132b to 87472b decodePayload(payload: string) { - if (typeof payload !== "string") - throw new Error("payload must be a valid string"); + if (typeof payload !== "string") throw new Error("payload must be a valid string"); const plen = payload.length; - if (plen < 132 || plen > 87472) - throw new Error("invalid payload length: " + plen); + if (plen < 132 || plen > 87472) throw new Error("invalid payload length: " + plen); if (payload[0] === "#") throw new Error("unknown encryption version"); let data: Uint8Array; try { @@ -115,8 +100,7 @@ export const u = { throw new Error("invalid base64: " + (error as any).message); } const dlen = data.length; - if (dlen < 99 || dlen > 65603) - throw new Error("invalid data length: " + dlen); + if (dlen < 99 || dlen > 65603) throw new Error("invalid data length: " + dlen); const vers = data[0]; if (vers !== 2) throw new Error("unknown encryption version " + vers); return { @@ -132,24 +116,16 @@ export function encrypt( conversationKey: Uint8Array, nonce = randomBytes(32), ): string { - const { chacha_key, chacha_nonce, hmac_key } = u.getMessageKeys( - conversationKey, - nonce, - ); + const { chacha_key, chacha_nonce, hmac_key } = u.getMessageKeys(conversationKey, nonce); const padded = u.pad(plaintext); const ciphertext = chacha20(chacha_key, chacha_nonce, padded); const mac = u.hmacAad(hmac_key, ciphertext, nonce); - return base64.encode( - concatBytes(new Uint8Array([2]), nonce, ciphertext, mac), - ); + return base64.encode(concatBytes(new Uint8Array([2]), nonce, ciphertext, mac)); } export function decrypt(payload: string, conversationKey: Uint8Array): string { const { nonce, ciphertext, mac } = u.decodePayload(payload); - const { chacha_key, chacha_nonce, hmac_key } = u.getMessageKeys( - conversationKey, - nonce, - ); + const { chacha_key, chacha_nonce, hmac_key } = u.getMessageKeys(conversationKey, nonce); const calculatedMac = u.hmacAad(hmac_key, ciphertext, nonce); if (!equalBytes(calculatedMac, mac)) throw new Error("invalid MAC"); const padded = chacha20(chacha_key, chacha_nonce, ciphertext); diff --git a/src/lib/nip51.ts b/src/lib/nip51.ts index 7560dd3d..05de1947 100644 --- a/src/lib/nip51.ts +++ b/src/lib/nip51.ts @@ -57,17 +57,11 @@ const getMuteLists = async (user: any): Promise<any> => { return { shown: listEvents[0].tags, hidden: - listEvents[0].content == "" - ? [] - : await decrypt(listEvents[0].content, user, user.pubkey), + listEvents[0].content == "" ? [] : await decrypt(listEvents[0].content, user, user.pubkey), }; }; -const publishMuteList = async ( - user: any, - shown: string[], - hidden: string[], -) => { +const publishMuteList = async (user: any, shown: string[], hidden: string[]) => { const event = await signEvent( { kind: 10000, diff --git a/src/lib/nostr.ts b/src/lib/nostr.ts index 50df6408..2a8975ec 100644 --- a/src/lib/nostr.ts +++ b/src/lib/nostr.ts @@ -46,11 +46,7 @@ export const decrypt = async ({ event, user }: { event: any; user: any }) => { if (pubkey === user.pubkey) pubkey = event.tags[0][1]; const { nip04 } = await loadNostrTools(); - const message = await nip04.decrypt( - await getPrivateKey(user), - pubkey, - content, - ); + const message = await nip04.decrypt(await getPrivateKey(user), pubkey, content); cache[id] = Buffer.from(message).toString("utf8"); decrypted.set(cache); @@ -151,10 +147,7 @@ const getPassword = async (): Promise<string> => { export const nostrConnectRelay = "wss://relay.nsec.app"; -const signingMethods: Record< - string, - (event: any, params: any) => Promise<any> -> = { +const signingMethods: Record<string, (event: any, params: any) => Promise<any>> = { async connect(event: any, { sk, pk, pubkey }: any) { const id = crypto.randomUUID(); const signEvent = { @@ -191,8 +184,7 @@ const signingMethods: Record< const { nip04 } = await loadNostrTools(); response = JSON.parse(await nip04.decrypt(sk, pk, event.content)); } catch { - const { getConversationKey, decrypt: nip44decrypt } = - await loadNip44(); + const { getConversationKey, decrypt: nip44decrypt } = await loadNip44(); const ck = await getConversationKey(sk, pk); response = JSON.parse(await nip44decrypt(event.content, ck)); } diff --git a/src/lib/parse.ts b/src/lib/parse.ts index 38c32a54..2af661a3 100644 --- a/src/lib/parse.ts +++ b/src/lib/parse.ts @@ -3,11 +3,8 @@ import { decode } from "$lib/bip21"; import { auth, get, isLiquid, post, sats } from "$lib/utils"; import { redirect } from "@sveltejs/kit"; -let validatePromise: - | Promise<typeof import("bitcoin-address-validation")> - | undefined; -const loadValidate = () => - (validatePromise ||= import("bitcoin-address-validation")); +let validatePromise: Promise<typeof import("bitcoin-address-validation")> | undefined; +const loadValidate = () => (validatePromise ||= import("bitcoin-address-validation")); export default async (s, host, cookies) => { if (!s) return; @@ -16,8 +13,7 @@ export default async (s, host, cookies) => { let invoice; let user; - if (t.startsWith("ark") || t.startsWith("tark")) - redirect(307, `/send/ark/${t}`); + if (t.startsWith("ark") || t.startsWith("tark")) redirect(307, `/send/ark/${t}`); if (t.startsWith("http")) redirect(307, t); if (t.startsWith(host)) redirect(307, `http://${t}`); @@ -44,10 +40,7 @@ export default async (s, host, cookies) => { if (["nprofile", "npub"].some((p) => t.startsWith(p))) redirect(307, `/${t}`); // bitcoin - if ( - t.toLowerCase().startsWith("bitcoin:") || - t.toLowerCase().startsWith("liquidnetwork:") - ) { + if (t.toLowerCase().startsWith("bitcoin:") || t.toLowerCase().startsWith("liquidnetwork:")) { ({ address: t, options: { amount }, @@ -62,8 +55,7 @@ export default async (s, host, cookies) => { } // lightning - if (t.toLowerCase().startsWith("lightning:")) - t = t.toLowerCase().replace("lightning:", ""); + if (t.toLowerCase().startsWith("lightning:")) t = t.toLowerCase().replace("lightning:", ""); if (t.toLowerCase().startsWith("lnurl")) redirect(307, `/ln/${t}`); if (t.includes(":")) t = t.split(":")[1]; diff --git a/src/lib/passwordCache.ts b/src/lib/passwordCache.ts index a67113e3..5a2a4796 100644 --- a/src/lib/passwordCache.ts +++ b/src/lib/passwordCache.ts @@ -34,14 +34,9 @@ const loadStoredPassword = () => { return password; }; -export const walletPassword = writable<string | undefined>( - loadStoredPassword(), -); +export const walletPassword = writable<string | undefined>(loadStoredPassword()); -export const rememberWalletPassword = ( - password: string, - durationMs: number, -) => { +export const rememberWalletPassword = (password: string, durationMs: number) => { if (!browser) return; if (!durationMs) { clearStoredPassword(); diff --git a/src/lib/random.ts b/src/lib/random.ts index 605471ac..4c8dbda3 100644 --- a/src/lib/random.ts +++ b/src/lib/random.ts @@ -1,9 +1,4 @@ -import { - NumberDictionary, - animals, - colors, - uniqueNamesGenerator, -} from "unique-names-generator"; +import { NumberDictionary, animals, colors, uniqueNamesGenerator } from "unique-names-generator"; export const randomName = () => uniqueNamesGenerator({ diff --git a/src/lib/store.ts b/src/lib/store.ts index e14d107f..3d688535 100644 --- a/src/lib/store.ts +++ b/src/lib/store.ts @@ -3,9 +3,7 @@ import { writable } from "svelte/store"; export const persistSession = (key, defaultValue = undefined) => { const s = writable( - browser && - sessionStorage.getItem(key) && - sessionStorage.getItem(key) !== "undefined" + browser && sessionStorage.getItem(key) && sessionStorage.getItem(key) !== "undefined" ? JSON.parse(sessionStorage.getItem(key) || "") : defaultValue, ); @@ -19,9 +17,7 @@ export const persistSession = (key, defaultValue = undefined) => { export const persistLocal = (key, defaultValue: any = undefined) => { const s = writable( - browser && - localStorage.getItem(key) && - localStorage.getItem(key) !== "undefined" + browser && localStorage.getItem(key) && localStorage.getItem(key) !== "undefined" ? JSON.parse(localStorage.getItem(key) || "") : defaultValue, ); @@ -46,9 +42,7 @@ export const persistLocal = (key, defaultValue: any = undefined) => { export const persistLocalValue = (key, defaultValue: any = undefined) => { const s = writable( - browser && - localStorage.getItem(key) && - localStorage.getItem(key) !== "undefined" + browser && localStorage.getItem(key) && localStorage.getItem(key) !== "undefined" ? JSON.parse(localStorage.getItem(key) || "") : defaultValue, ); diff --git a/src/lib/utils.ts b/src/lib/utils.ts index ebec6caa..c1514d6b 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -31,8 +31,7 @@ const ipHeaders = (): Record<string, string> => { return ip ? { "cf-connecting-ip": ip } : {}; }; -export const punk = (k: string) => - `${Math.floor((parseInt(k.slice(-2), 16) / 256) * 64) + 1}.webp`; +export const punk = (k: string) => `${Math.floor((parseInt(k.slice(-2), 16) / 256) * 64) + 1}.webp`; export const g = (url: string, fetch: any, headers: object) => fetch(base + url, { headers: { ...ipHeaders(), ...headers } }) @@ -234,17 +233,14 @@ export const isInvalidTokenError = (e: unknown) => { ); }; -export const btc = (fiat: number, rate: number): number => - Math.round((fiat * sats) / rate); +export const btc = (fiat: number, rate: number): number => Math.round((fiat * sats) / rate); -export const toFiat = (amount: number, rate: number): number => - (amount * rate) / sats; +export const toFiat = (amount: number, rate: number): number => (amount * rate) / sats; export const fd = async (req: Request): Promise<any> => { const obj: Record<string, any> = Object.fromEntries(await req.formData()); for (const k in obj) - (obj[k] === "undefined" && (obj[k] = undefined)) || - (obj[k] === "false" && (obj[k] = false)); + (obj[k] === "undefined" && (obj[k] = undefined)) || (obj[k] === "false" && (obj[k] = false)); return obj; }; @@ -338,8 +334,7 @@ export const f = ( const l = typeof locale === "function" ? locale() : locale || "en-US"; const cur = currency || "USD"; const region = l.length >= 2 ? l.slice(-2) : ""; - const currencyDisplay = - region && cur.startsWith(region) ? "narrowSymbol" : "symbol"; + const currencyDisplay = region && cur.startsWith(region) ? "narrowSymbol" : "symbol"; return new Intl.NumberFormat(l, { style: "currency", currency: cur, @@ -356,11 +351,7 @@ export const s = (s: number, locale = "en-US"): string => { export const sat = (s: number): string => `${si(Math.abs(s)).toString()}`; -export const si = ( - n: number, - minimumFractionDigits = 1, - maximumFractionDigits = 2, -) => { +export const si = (n: number, minimumFractionDigits = 1, maximumFractionDigits = 2) => { const units = ["", "K", "M", "G", "T", "P", "E", "Z"]; let s = n; @@ -380,8 +371,7 @@ export const si = ( export const sats = 100000000; -export const back = (): any => - browser && (history.length ? history.go(-1) : goto("/")); +export const back = (): any => browser && (history.length ? history.go(-1) : goto("/")); export const focus = (el: HTMLElement): any => browser && screen.width > 1280 && setTimeout(() => el.focus(), 1); @@ -389,8 +379,7 @@ export const focus = (el: HTMLElement): any => export const select = (el: HTMLInputElement): any => browser && screen.width > 1280 && setTimeout(() => el.select(), 1); -export const sleep = (n: number): Promise<void> => - new Promise((r) => setTimeout(r, n)); +export const sleep = (n: number): Promise<void> => new Promise((r) => setTimeout(r, n)); export const wait = async ( f: () => boolean | Promise<boolean>, @@ -417,8 +406,7 @@ export const types = { bolt12: "bolt12", }; -export const ease = (t: number): number => - t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t; +export const ease = (t: number): number => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t); export function shuffleArray<T>(array: T[]): void { for (let i = array.length - 1; i > 0; i--) { @@ -428,9 +416,7 @@ export function shuffleArray<T>(array: T[]): void { } export const closest = (a: number[], n: number): number => - a.reduce((prev, curr) => - Math.abs(curr - n) < Math.abs(prev - n) ? curr : prev, - ); + a.reduce((prev, curr) => (Math.abs(curr - n) < Math.abs(prev - n) ? curr : prev)); export const isLiquid = (text: string): boolean => text.startsWith("Az") || @@ -439,8 +425,7 @@ export const isLiquid = (text: string): boolean => text.startsWith("VT") || text.startsWith("XR") || text.startsWith("XC") || - ((text.startsWith("H") || text.startsWith("G") || text.startsWith("Q")) && - text.length === 34) || + ((text.startsWith("H") || text.startsWith("G") || text.startsWith("Q")) && text.length === 34) || (text.startsWith("ert1q") && text.length === 43) || (text.startsWith("ex1q") && text.length === 42) || text.startsWith("el1qq") || diff --git a/src/routes/(app)/+layout.server.ts b/src/routes/(app)/+layout.server.ts index 3b29df70..11114ebd 100644 --- a/src/routes/(app)/+layout.server.ts +++ b/src/routes/(app)/+layout.server.ts @@ -50,11 +50,7 @@ export async function load({ cookies, request, url, params }) { redirect(307, "/migrate"); } - if ( - user && - ["/login", "/register"].includes(pathname) && - request.method === "GET" - ) { + if (user && ["/login", "/register"].includes(pathname) && request.method === "GET") { redirect(307, `/${user.username}`); } diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index 346cc93e..6ac9bed5 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -24,12 +24,7 @@ import Password from "$comp/Password.svelte"; import { s, f, toFiat, success, getCookie, warning } from "$lib/utils"; import { t, locale, loading } from "$lib/translations"; - import { - goto, - invalidate, - afterNavigate, - preloadData, - } from "$app/navigation"; + import { goto, invalidate, afterNavigate, preloadData } from "$app/navigation"; let { data, children } = $props(); @@ -63,9 +58,7 @@ if (result?.received > 0) { if ($fiat && $rateStore && user?.currency) { - success( - `Received ${f(toFiat(result.received, $rateStore), user.currency)}!`, - ); + success(`Received ${f(toFiat(result.received, $rateStore), user.currency)}!`); } else { success(`Received ⚡️${s(result.received)}!`); } diff --git a/src/routes/(app)/[username]/(profile)/+layout.svelte b/src/routes/(app)/[username]/(profile)/+layout.svelte index 1bb9447f..6e6a318f 100644 --- a/src/routes/(app)/[username]/(profile)/+layout.svelte +++ b/src/routes/(app)/[username]/(profile)/+layout.svelte @@ -37,18 +37,14 @@ let stripped = $derived(n.replace(/\s/g, "")); let username = $derived(n.length > 60 ? n.substr(0, 6) : display || stripped); let lnaddr = $derived( - subject?.anon - ? subject.lud16 || undefined - : `${stripped}@${$page.url.host}`, + subject?.anon ? subject.lud16 || undefined : `${stripped}@${$page.url.host}`, ); let profile = $derived(`${$page.url.host}/${subject.anon ? npub : stripped}`); let lnurl = $derived( encode( "lnurl", toWords( - new TextEncoder().encode( - `https://${PUBLIC_DOMAIN}/p/${subject.anon ? npub : stripped}`, - ), + new TextEncoder().encode(`https://${PUBLIC_DOMAIN}/p/${subject.anon ? npub : stripped}`), ), 20000, ), @@ -57,33 +53,19 @@ <div class="container mx-auto w-full px-4 flex flex-wrap lg:flex-nowrap"> <div class="hidden lg:block lg:w-[280px] xl:w-[360px]"></div> - <div - class="w-full lg:w-[280px] xl:w-[360px] lg:absolute space-y-2 left-20 mx-auto" - > - <div - class="flex text-3xl font-bold text-center mx-auto justify-center gap-1 items-center" - > + <div class="w-full lg:w-[280px] xl:w-[360px] lg:absolute space-y-2 left-20 mx-auto"> + <div class="flex text-3xl font-bold text-center mx-auto justify-center gap-1 items-center"> <button class="flex gap-1 items-center" onclick={toggleDetails}> <div class="break-words">{display || username}</div> <iconify-icon noobserver icon="ph:list-bold" width="32"></iconify-icon> </button> {#if subject.id === user?.id} - <a - href="/settings/profile" - class="btn contents" - aria-label="Edit profile" - > - <iconify-icon noobserver icon="ph:pencil-bold" width="32" - ></iconify-icon> + <a href="/settings/profile" class="btn contents" aria-label="Edit profile"> + <iconify-icon noobserver icon="ph:pencil-bold" width="32"></iconify-icon> </a> {:else} - <a - href="/dm?username={subject.username}" - class="btn contents" - aria-label="Direct Message" - > - <iconify-icon noobserver icon="ph:chat-bold" width="32" - ></iconify-icon> + <a href="/dm?username={subject.username}" class="btn contents" aria-label="Direct Message"> + <iconify-icon noobserver icon="ph:chat-bold" width="32"></iconify-icon> </a> {/if} <!-- <a href={`/${subject.pubkey}/notes`}> --> @@ -128,16 +110,14 @@ aria-label="Copy lightning address" onclick={() => copy(lnaddr)} > - ><iconify-icon noobserver icon="ph:copy-bold" width="32" - ></iconify-icon></button + ><iconify-icon noobserver icon="ph:copy-bold" width="32"></iconify-icon></button > <a href={`/qr/${encodeURIComponent(lnaddr)}`} class="my-auto" aria-label="Show lightning address QR" > - <iconify-icon noobserver icon="ph:qr-code-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:qr-code-bold" width="32"></iconify-icon> </a> </div> </div> @@ -156,18 +136,14 @@ aria-label="Copy profile URL" onclick={() => copy(profile)} > - ><iconify-icon noobserver icon="ph:copy-bold" width="32" - ></iconify-icon></button + ><iconify-icon noobserver icon="ph:copy-bold" width="32"></iconify-icon></button > <a - href={`/qr/${encodeURIComponent( - `${$page.url.protocol}//${profile}`, - )}`} + href={`/qr/${encodeURIComponent(`${$page.url.protocol}//${profile}`)}`} class="my-auto" aria-label="Show profile URL QR" > - <iconify-icon noobserver icon="ph:qr-code-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:qr-code-bold" width="32"></iconify-icon> </a> </div> </div> @@ -185,16 +161,14 @@ aria-label="Copy LNURL" onclick={() => copy(`lightning:${lnurl}`)} > - ><iconify-icon noobserver icon="ph:copy-bold" width="32" - ></iconify-icon></button + ><iconify-icon noobserver icon="ph:copy-bold" width="32"></iconify-icon></button > <a href={`/${n}/accepted/${encodeURIComponent(`lightning:${lnurl}`)}`} class="my-auto" aria-label="Show LNURL QR" > - <iconify-icon noobserver icon="ph:qr-code-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:qr-code-bold" width="32"></iconify-icon> </a> </div> </div> @@ -259,8 +233,7 @@ aria-label="Reset password" > <div class="mx-auto flex"> - <iconify-icon noobserver icon="ph:clock" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:clock" width="32"></iconify-icon> </div> </button> </form> @@ -269,9 +242,7 @@ </div> <div class="w-full"> - <div - class="mx-auto space-y-5 lg:max-w-xl xl:max-w-2xl lg:pl-10 mt-5 lg:mt-0" - > + <div class="mx-auto space-y-5 lg:max-w-xl xl:max-w-2xl lg:pl-10 mt-5 lg:mt-0"> {@render children?.()} </div> </div> @@ -293,20 +264,12 @@ {#if satsPerCurrency >= 1} <div>{f(1, currency, locale)} =</div> <div class="flex items-center"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" - ></iconify-icon> + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon> {s(satsPerCurrency)} </div> {:else} <div class="flex items-center"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" - ></iconify-icon> + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon> 1 </div> <div>= {f(1 / satsPerCurrency, currency, locale)}</div> diff --git a/src/routes/(app)/[username]/(profile)/+page.svelte b/src/routes/(app)/[username]/(profile)/+page.svelte index fb4d6dd9..78816e36 100644 --- a/src/routes/(app)/[username]/(profile)/+page.svelte +++ b/src/routes/(app)/[username]/(profile)/+page.svelte @@ -73,8 +73,7 @@ aria-label={$t("accounts.addAccount")} title={$t("accounts.addAccount")} > - <iconify-icon noobserver icon="ph:plus-bold" width="28" - ></iconify-icon> + <iconify-icon noobserver icon="ph:plus-bold" width="28"></iconify-icon> </button> </a> </div> @@ -88,8 +87,7 @@ {#if $installPrompt} <button class="btn btn-accent lg:hidden" onclick={install}> - <iconify-icon noobserver icon="ph:floppy-disk-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:floppy-disk-bold" width="32"></iconify-icon> {$t("user.install")} </button> {/if} @@ -106,14 +104,8 @@ : `/pay/${subject.username}`} class="contents" > - <button - class="btn btn-accent !text-2xl items-center !w-full sm:!max-w-[400px] mx-auto" - > - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" - ></iconify-icon> + <button class="btn btn-accent !text-2xl items-center !w-full sm:!max-w-[400px] mx-auto"> + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon> <div> {$t("user.pay")} {subject.username} diff --git a/src/routes/(app)/[username]/(profile)/+page.ts b/src/routes/(app)/[username]/(profile)/+page.ts index 0a6c78b2..e6a3ffeb 100644 --- a/src/routes/(app)/[username]/(profile)/+page.ts +++ b/src/routes/(app)/[username]/(profile)/+page.ts @@ -5,6 +5,5 @@ import { get } from "svelte/store"; export const ssr = false; export async function load() { const sk = cookies.get("sk"); - if (sk && !get(signer)) - signer.set({ method: "nsec", params: { sk }, ready: true }); + if (sk && !get(signer)) signer.set({ method: "nsec", params: { sk }, ready: true }); } diff --git a/src/routes/(app)/[username]/(profile)/notes/new/+page.svelte b/src/routes/(app)/[username]/(profile)/notes/new/+page.svelte index ff4524e1..a9cc3e19 100644 --- a/src/routes/(app)/[username]/(profile)/notes/new/+page.svelte +++ b/src/routes/(app)/[username]/(profile)/notes/new/+page.svelte @@ -32,10 +32,7 @@ <div class="container px-4 max-w-xl mx-auto space-y-5"> <form method="POST" class="space-y-2 text-xl" onsubmit={submit}> - <textarea use:focus bind:value={content} placeholder={$t("notes.contents")} - ></textarea> - <button type="submit" class="btn btn-accent"> - {$t("payments.submit")}</button - > + <textarea use:focus bind:value={content} placeholder={$t("notes.contents")}></textarea> + <button type="submit" class="btn btn-accent"> {$t("payments.submit")}</button> </form> </div> diff --git a/src/routes/(app)/[username]/+layout.server.ts b/src/routes/(app)/[username]/+layout.server.ts index ab755410..5e921541 100644 --- a/src/routes/(app)/[username]/+layout.server.ts +++ b/src/routes/(app)/[username]/+layout.server.ts @@ -1,12 +1,7 @@ import { get } from "$lib/utils"; import { error } from "@sveltejs/kit"; -export const load = async ({ - cookies, - depends, - params: { username }, - parent, -}) => { +export const load = async ({ cookies, depends, params: { username }, parent }) => { depends("app:user"); try { diff --git a/src/routes/(app)/[username]/accepted/[text]/+page.svelte b/src/routes/(app)/[username]/accepted/[text]/+page.svelte index 339f6c9c..3e16177c 100644 --- a/src/routes/(app)/[username]/accepted/[text]/+page.svelte +++ b/src/routes/(app)/[username]/accepted/[text]/+page.svelte @@ -14,35 +14,23 @@ let lnurl = $derived( `https://${PUBLIC_DOMAIN}/ln/${encode( "lnurl", - toWords( - new TextEncoder().encode(`https://${PUBLIC_DOMAIN}/p/${username}`), - ), + toWords(new TextEncoder().encode(`https://${PUBLIC_DOMAIN}/p/${username}`)), 20000, )}`, ); </script> <div class="px-2"> - <div - class="border-8 border-black p-8 max-w-[580px] mx-auto mt-20 space-y-2 rounded-3xl relative" - > + <div class="border-8 border-black p-8 max-w-[580px] mx-auto mt-20 space-y-2 rounded-3xl relative"> <div class="flex gap-2 mx-auto justify-center"> <!-- <img src="/images/bitcoin.png" class="w-16 h-16 my-auto" /> --> - <img - src="/images/bitcoin-logo.png" - class="my-auto w-[400px]" - alt="Bitcoin" - /> + <img src="/images/bitcoin-logo.png" class="my-auto w-[400px]" alt="Bitcoin" /> <!-- <h3 class="text-5xl font-bold text-center my-auto"> --> <!-- bitcoin --> <!-- </h3> --> </div> {#if nfc} - <img - src="/images/tap.png" - class="w-24 absolute top-52 left-4 rotate-[-10deg]" - alt="Tap" - /> + <img src="/images/tap.png" class="w-24 absolute top-52 left-4 rotate-[-10deg]" alt="Tap" /> <img src="/images/arrow.png" class="w-24 scale-x-[-1] rotate-[120deg] absolute top-52 left-32 w-20 h-52" diff --git a/src/routes/(app)/[username]/accepted/create/+page.svelte b/src/routes/(app)/[username]/accepted/create/+page.svelte index 189a734d..3a17bcc0 100644 --- a/src/routes/(app)/[username]/accepted/create/+page.svelte +++ b/src/routes/(app)/[username]/accepted/create/+page.svelte @@ -8,8 +8,7 @@ text = $state(), pasted = $state(); - let keypress = (e) => - e.key === "Enter" ? e.preventDefault() || el.click() : (pasted = false); + let keypress = (e) => (e.key === "Enter" ? e.preventDefault() || el.click() : (pasted = false)); let paste = async () => { text = await navigator.clipboard.readText(); @@ -24,9 +23,7 @@ </script> <div class="container px-4 max-w-lg mx-auto space-y-5 mt-20"> - <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold"> - Create QR - </h1> + <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold">Create QR</h1> <form onsubmit={preventDefault(submit)} class="space-y-2 text-xl"> <div class="mb-2"> @@ -48,11 +45,7 @@ class="flex border rounded-2xl px-6 py-5 font-bold hover:opacity-80 w-full bg-primary justify-center gap-2" onclick={paste} > - <iconify-icon - noobserver - icon="ph:clipboard-text-bold" - width="32" - class="my-auto" + <iconify-icon noobserver icon="ph:clipboard-text-bold" width="32" class="my-auto" ></iconify-icon> <div class="my-auto">{$t("user.send.paste")}</div> </button> @@ -62,11 +55,7 @@ type="submit" class="flex bg-black text-white border rounded-2xl px-6 py-5 w-full font-bold gap-2 justify-center" > - <iconify-icon - noobserver - icon="ph:paper-plane-right-bold" - width="32" - class="my-auto invert" + <iconify-icon noobserver icon="ph:paper-plane-right-bold" width="32" class="my-auto invert" ></iconify-icon> <div class="my-auto">{$t("user.dashboard.go")}</div> </button> diff --git a/src/routes/(app)/[username]/receive/+page.svelte b/src/routes/(app)/[username]/receive/+page.svelte index 6921d443..14489c13 100644 --- a/src/routes/(app)/[username]/receive/+page.svelte +++ b/src/routes/(app)/[username]/receive/+page.svelte @@ -1,18 +1,6 @@ <script lang="ts"> import { run } from "svelte/legacy"; - import { - btc, - loc, - post, - copy, - fail, - f, - get, - types, - sat, - s, - sats, - } from "$lib/utils"; + import { btc, loc, post, copy, fail, f, get, types, sat, s, sats } from "$lib/utils"; import { tick, onMount, onDestroy } from "svelte"; import { browser } from "$app/environment"; import { last, showQr, amountPrompt } from "$lib/store"; @@ -117,12 +105,8 @@ let settingMemo = $state(); let toggleMemo = () => (settingMemo = !settingMemo); - let link = $derived( - [types.bitcoin, types.liquid].includes(type) ? text : `lightning:${text}`, - ); - let txt = $derived( - [types.bitcoin, types.liquid].includes(type) ? hash : text, - ); + let link = $derived([types.bitcoin, types.liquid].includes(type) ? text : `lightning:${text}`); + let txt = $derived([types.bitcoin, types.liquid].includes(type) ? hash : text); onMount(() => { if ($amountPrompt && !amount) toggleAmount(); diff --git a/src/routes/(app)/account/[id]/+page.svelte b/src/routes/(app)/account/[id]/+page.svelte index 6b48bac2..43ebe508 100644 --- a/src/routes/(app)/account/[id]/+page.svelte +++ b/src/routes/(app)/account/[id]/+page.svelte @@ -8,10 +8,7 @@ import { t } from "$lib/translations"; import { entropyToMnemonic, mnemonicToSeed } from "@scure/bip39"; import { wordlist } from "@scure/bip39/wordlists/english.js"; - import { - getRememberedWalletPassword, - forgetWalletPassword, - } from "$lib/passwordCache"; + import { getRememberedWalletPassword, forgetWalletPassword } from "$lib/passwordCache"; let { data } = $props(); let { account, user } = data; @@ -94,22 +91,19 @@ <Mnemonic {mnemonic} /> <button onclick={() => copy(mnemonic)} type="button" class="btn"> - <iconify-icon noobserver icon="ph:copy-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:copy-bold" width="32"></iconify-icon> <div class="my-auto">{$t("accounts.copy")}</div></button > {:else if seed} <button onclick={requestMnemonic} type="button" class="btn"> - <iconify-icon noobserver icon="ph:eye-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:eye-bold" width="32"></iconify-icon> <div class="my-auto">{$t("accounts.revealMnemonic")}</div></button > {/if} {#if seed} <button onclick={del} type="button" class="btn"> - <iconify-icon noobserver icon="ph:trash-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:trash-bold" width="32"></iconify-icon> <div class="my-auto">{$t("accounts.deleteAccount")}</div></button > {/if} diff --git a/src/routes/(app)/account/ark/+page.svelte b/src/routes/(app)/account/ark/+page.svelte index 42329ef8..c21da0d5 100644 --- a/src/routes/(app)/account/ark/+page.svelte +++ b/src/routes/(app)/account/ark/+page.svelte @@ -165,14 +165,11 @@ {#if hasMasterSeed} <form onsubmit={preventDefault(submit)} class="space-y-5"> <p class="text-secondary"> - Your Ark wallet will be derived from your master seed. Enter your - wallet password to continue. + Your Ark wallet will be derived from your master seed. Enter your wallet password to + continue. </p> - <label - for="password" - class="input flex items-center justify-center gap-2 w-full" - > + <label for="password" class="input flex items-center justify-center gap-2 w-full"> {#if revealPassword} <input name="password" @@ -211,15 +208,12 @@ </label> <div class="space-y-2"> - <label for="rememberFor" class="text-sm text-secondary"> - Remember for - </label> + <label for="rememberFor" class="text-sm text-secondary"> Remember for </label> <select id="rememberFor" class="w-full" value={rememberForMs} - onchange={(e) => - (rememberForMs = Number((e.target as HTMLSelectElement).value))} + onchange={(e) => (rememberForMs = Number((e.target as HTMLSelectElement).value))} > {#each rememberForOptions as option} <option value={option.ms}>{option.label}</option> @@ -231,11 +225,7 @@ <a href={`/${user.username}`} class="contents"> <button type="button" class="btn !w-auto grow"> Back </button> </a> - <button - disabled={submitting} - type="submit" - class="btn btn-accent !w-auto grow" - > + <button disabled={submitting} type="submit" class="btn btn-accent !w-auto grow"> {#if submitting} <Spinner /> {:else} @@ -247,8 +237,7 @@ {:else if !confirmed} <div class="space-y-4"> <p class="text-secondary"> - Your Ark wallet is secured by a private key. Please copy it down - somewhere safe. + Your Ark wallet is secured by a private key. Please copy it down somewhere safe. </p> {#if showNsec} @@ -264,24 +253,14 @@ </div> <div class="flex gap-2"> - <button - type="button" - class="btn btn-accent flex-grow" - onclick={confirmBackup} - > - <iconify-icon noobserver icon="ph:check-bold" width="24" - ></iconify-icon> + <button type="button" class="btn btn-accent flex-grow" onclick={confirmBackup}> + <iconify-icon noobserver icon="ph:check-bold" width="24"></iconify-icon> I've backed it up </button> </div> {:else} - <button - type="button" - class="btn btn-warning w-full" - onclick={revealNsec} - > - <iconify-icon noobserver icon="ph:eye-bold" width="24" - ></iconify-icon> + <button type="button" class="btn btn-warning w-full" onclick={revealNsec}> + <iconify-icon noobserver icon="ph:eye-bold" width="24"></iconify-icon> Reveal backup key </button> {/if} @@ -289,14 +268,10 @@ {:else} <form onsubmit={preventDefault(submit)} class="space-y-5"> <p class="text-secondary"> - Set a password to encrypt your key. You'll need this password to send - funds. + Set a password to encrypt your key. You'll need this password to send funds. </p> - <label - for="password" - class="input flex items-center justify-center gap-2 w-full" - > + <label for="password" class="input flex items-center justify-center gap-2 w-full"> {#if revealPassword} <input name="password" @@ -334,10 +309,7 @@ </button> </label> - <label - for="confirm" - class="input flex items-center justify-center gap-2 w-full" - > + <label for="confirm" class="input flex items-center justify-center gap-2 w-full"> {#if revealConfirm} <input name="confirm" @@ -373,15 +345,12 @@ </label> <div class="space-y-2"> - <label for="rememberFor" class="text-sm text-secondary"> - Remember for - </label> + <label for="rememberFor" class="text-sm text-secondary"> Remember for </label> <select id="rememberFor" class="w-full" value={rememberForMs} - onchange={(e) => - (rememberForMs = Number((e.target as HTMLSelectElement).value))} + onchange={(e) => (rememberForMs = Number((e.target as HTMLSelectElement).value))} > {#each rememberForOptions as option} <option value={option.ms}>{option.label}</option> @@ -390,18 +359,10 @@ </div> <div class="flex gap-2"> - <button - type="button" - class="btn !w-auto grow" - onclick={() => (confirmed = false)} - > + <button type="button" class="btn !w-auto grow" onclick={() => (confirmed = false)}> Back </button> - <button - disabled={submitting} - type="submit" - class="btn btn-accent !w-auto grow" - > + <button disabled={submitting} type="submit" class="btn btn-accent !w-auto grow"> {#if submitting} <Spinner /> {:else} diff --git a/src/routes/(app)/account/bitcoin/+page.svelte b/src/routes/(app)/account/bitcoin/+page.svelte index 87dc32e2..ca90c758 100644 --- a/src/routes/(app)/account/bitcoin/+page.svelte +++ b/src/routes/(app)/account/bitcoin/+page.svelte @@ -11,8 +11,7 @@ <a href="/account/seed" class="block"> <div class="card card-side shadow shadow-base-300 p-8 hover:bg-base-200"> <figure class="w-20 flex items-center justify-center"> - <iconify-icon noobserver icon="ph:file-plus-bold" width="64" - ></iconify-icon> + <iconify-icon noobserver icon="ph:file-plus-bold" width="64"></iconify-icon> </figure> <div> <div class="text-xl">{$t("accounts.create")}</div> @@ -23,8 +22,7 @@ <a href="/account/import" class="block"> <div class="card card-side shadow shadow-base-300 p-8 hover:bg-base-200"> <figure class="w-20 flex items-center justify-center"> - <iconify-icon noobserver icon="ph:folder-open-bold" width="64" - ></iconify-icon> + <iconify-icon noobserver icon="ph:folder-open-bold" width="64"></iconify-icon> </figure> <div> <div class="text-xl">{$t("accounts.import")}</div> diff --git a/src/routes/(app)/account/import/+page.svelte b/src/routes/(app)/account/import/+page.svelte index 551cbb2d..09e1edb1 100644 --- a/src/routes/(app)/account/import/+page.svelte +++ b/src/routes/(app)/account/import/+page.svelte @@ -53,11 +53,7 @@ {$t("accounts.back")} </button> </a> - <button - bind:this={el} - type="submit" - class="btn btn-accent !w-auto grow" - > + <button bind:this={el} type="submit" class="btn btn-accent !w-auto grow"> <div class="my-auto">{$t("accounts.next")}</div> </button> </div> diff --git a/src/routes/(app)/account/new/+page.svelte b/src/routes/(app)/account/new/+page.svelte index 4100e001..c4045db8 100644 --- a/src/routes/(app)/account/new/+page.svelte +++ b/src/routes/(app)/account/new/+page.svelte @@ -7,9 +7,7 @@ <div class="container w-full mx-auto text-lg px-4 max-w-xl space-y-5"> <a href="/account/bitcoin" class="block"> - <div - class="card card-side shadow shadow-base-300 p-8 hover:bg-base-200 gap-4 items-center" - > + <div class="card card-side shadow shadow-base-300 p-8 hover:bg-base-200 gap-4 items-center"> <iconify-icon noobserver icon="logos:bitcoin" width={48}></iconify-icon> <div> <div class="text-xl">Bitcoin (On-chain)</div> @@ -20,14 +18,8 @@ </div> </a> <a href="/account/ark" class="block"> - <div - class="card card-side shadow shadow-base-300 p-8 hover:bg-base-200 gap-4 items-center" - > - <img - src="/images/ark.png" - class="w-12 h-12 rounded-full object-cover" - alt="Ark" - /> + <div class="card card-side shadow shadow-base-300 p-8 hover:bg-base-200 gap-4 items-center"> + <img src="/images/ark.png" class="w-12 h-12 rounded-full object-cover" alt="Ark" /> <div> <div class="text-xl">Ark (Off-chain)</div> <div class="text-secondary"> diff --git a/src/routes/(app)/account/pass/+page.svelte b/src/routes/(app)/account/pass/+page.svelte index 2f62c38c..fd58921f 100644 --- a/src/routes/(app)/account/pass/+page.svelte +++ b/src/routes/(app)/account/pass/+page.svelte @@ -5,11 +5,7 @@ import { t } from "$lib/translations"; import { mnemonic } from "$lib/store"; import Spinner from "$comp/Spinner.svelte"; - import { - mnemonicToSeed, - mnemonicToEntropy, - entropyToMnemonic, - } from "@scure/bip39"; + import { mnemonicToSeed, mnemonicToEntropy, entropyToMnemonic } from "@scure/bip39"; import { wordlist } from "@scure/bip39/wordlists/english.js"; import { focus, versions, fail, post } from "$lib/utils"; import { goto } from "$app/navigation"; @@ -46,10 +42,7 @@ try { const { encrypt } = await import("nostr-tools/nip49"); - let seed = await encrypt( - mnemonicToEntropy($mnemonic as string, wordlist), - password, - ); + let seed = await encrypt(mnemonicToEntropy($mnemonic as string, wordlist), password); // Save master seed on user await post("/post/user", { seed }); @@ -98,16 +91,11 @@ onsubmit={preventDefault(submit)} class="container w-full mx-auto text-lg px-4 max-w-xl space-y-5" > - <p - class="text-secondary p-4 bg-warning/80 rounded-2xl border-warning border-2" - > + <p class="text-secondary p-4 bg-warning/80 rounded-2xl border-warning border-2"> {$t("accounts.passwordWarning")} </p> - <label - for="password" - class="input flex items-center justify-center gap-2 w-full" - > + <label for="password" class="input flex items-center justify-center gap-2 w-full"> {#if revealPassword} <input name="password" @@ -144,10 +132,7 @@ </button> </label> - <label - for="confirm" - class="input flex items-center justify-center gap-2 w-full" - > + <label for="confirm" class="input flex items-center justify-center gap-2 w-full"> {#if revealConfirm} <input name="confirm" @@ -183,15 +168,12 @@ </label> <div class="space-y-2"> - <label for="rememberFor" class="text-sm text-secondary"> - Remember for - </label> + <label for="rememberFor" class="text-sm text-secondary"> Remember for </label> <select id="rememberFor" class="w-full" value={rememberForMs} - onchange={(e) => - (rememberForMs = Number((e.target as HTMLSelectElement).value))} + onchange={(e) => (rememberForMs = Number((e.target as HTMLSelectElement).value))} > {#each rememberForOptions as option} <option value={option.ms}>{option.label}</option> @@ -205,11 +187,7 @@ {$t("accounts.back")} </button> </a> - <button - disabled={submitting} - type="submit" - class="btn btn-accent !w-auto grow" - > + <button disabled={submitting} type="submit" class="btn btn-accent !w-auto grow"> {#if submitting} <Spinner /> {:else} diff --git a/src/routes/(app)/account/setup/+page.svelte b/src/routes/(app)/account/setup/+page.svelte index 9d747578..faab0938 100644 --- a/src/routes/(app)/account/setup/+page.svelte +++ b/src/routes/(app)/account/setup/+page.svelte @@ -19,16 +19,11 @@ </a> <a href="/account/new" class="block"> <div class="shadow p-8 rounded-xl flex gap-4 hover:bg-primary"> - <img - src="/images/keys.png" - class="w-20 my-auto" - alt="Savings account" - /> + <img src="/images/keys.png" class="w-20 my-auto" alt="Savings account" /> <div> <div class="text-xl">Savings</div> <div class="text-secondary"> - You hold the keys to the account and are responsible for - safeguarding them. + You hold the keys to the account and are responsible for safeguarding them. </div> </div> </div> diff --git a/src/routes/(app)/admin/+page.server.ts b/src/routes/(app)/admin/+page.server.ts index 7bb7d1f3..216e2606 100644 --- a/src/routes/(app)/admin/+page.server.ts +++ b/src/routes/(app)/admin/+page.server.ts @@ -5,8 +5,6 @@ export async function load({ cookies, parent }) { const { user } = await parent(); if (!user) redirect(307, "/login"); - const users = (await get("/users", auth(cookies))).sort( - (a, b) => b.balance - a.balance, - ); + const users = (await get("/users", auth(cookies))).sort((a, b) => b.balance - a.balance); return { users }; } diff --git a/src/routes/(app)/apps/new/+page.server.ts b/src/routes/(app)/apps/new/+page.server.ts index a78b9093..c221cef9 100644 --- a/src/routes/(app)/apps/new/+page.server.ts +++ b/src/routes/(app)/apps/new/+page.server.ts @@ -5,11 +5,7 @@ import { fail, redirect } from "@sveltejs/kit"; export const load = async ({ parent, url }) => { const { user } = await parent(); - if (!user) - redirect( - 307, - `/login?redirect=${encodeURIComponent(url.pathname + url.search)}`, - ); + if (!user) redirect(307, `/login?redirect=${encodeURIComponent(url.pathname + url.search)}`); let max_amount = url.searchParams.get("max_amount"); max_amount = max_amount ? Math.round(Number(max_amount) / 1000) : undefined; diff --git a/src/routes/(app)/dm/+page.svelte b/src/routes/(app)/dm/+page.svelte index 173871c1..5a908664 100644 --- a/src/routes/(app)/dm/+page.svelte +++ b/src/routes/(app)/dm/+page.svelte @@ -38,8 +38,7 @@ } const nostrUserInfo = (await getNostrUserInfo(pubkey)) || {}; - const valid = - "nip05" in nostrUserInfo && (await isValid(pubkey, nostrUserInfo.nip05)); + const valid = "nip05" in nostrUserInfo && (await isValid(pubkey, nostrUserInfo.nip05)); const username = await usernameFromPubkey(pubkey); return { coinosUsername: username, @@ -223,8 +222,7 @@ allRumours = await libnip17.getMessageRumours(user); const rumours = allRumours.filter( (r) => - (r.pubkey === user.pubkey && - pTagKeys(r).includes(selectedChat.pubkey)) || + (r.pubkey === user.pubkey && pTagKeys(r).includes(selectedChat.pubkey)) || (r.pubkey === selectedChat.pubkey && pTagKeys(r).includes(user.pubkey)), ); messageRumours = dateMap(rumours); @@ -296,19 +294,13 @@ </script> <div class="super-container"> - <div - class={"sidebar " + ($theme === "light" ? "light-sidebar" : "dark-sidebar")} - > + <div class={"sidebar " + ($theme === "light" ? "light-sidebar" : "dark-sidebar")}> <h2 class="text-xl chat-header"> {creatingNewChat ? $t("dm.newChatHeader") : $t("dm.chatHeader")} <button class={"chat-btn push-right " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn") + - (creatingNewChat - ? $theme === "light" - ? " light-selected" - : " dark-selected" - : "")} + (creatingNewChat ? ($theme === "light" ? " light-selected" : " dark-selected") : "")} on:click={() => { creatingNewChat = !creatingNewChat; selectedChat = null; @@ -336,29 +328,23 @@ : "")} on:click={() => selectChat(c)} > - <span - class={"text-xl" + - (muted && muted.has(c.pubkey) ? " secondary" : "")} + <span class={"text-xl" + (muted && muted.has(c.pubkey) ? " secondary" : "")} >{name(c)}</span > - <span class={(idValid(c) ? "" : "invalid ") + "secondary text-xs"} - >{id(c)}</span - > + <span class={(idValid(c) ? "" : "invalid ") + "secondary text-xs"}>{id(c)}</span> </button> {/if} {/each} {:else if searchQuery !== ""} <button - class={"chat-btn tall-btn " + - ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} + class={"chat-btn tall-btn " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} on:click={() => selectChatUsername(searchQuery)} > <span class="text-xl">{$t("dm.findByUsername")}</span> </button> {#if searchQuery.includes(".")} <button - class={"chat-btn tall-btn " + - ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} + class={"chat-btn tall-btn " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} on:click={() => selectChatNip05(searchQuery)} > <span class="text-xl">{$t("dm.findByNIP05")}</span> @@ -366,8 +352,7 @@ {/if} {#if searchQuery.length === 64 || searchQuery.slice(0, 4) === "npub"} <button - class={"chat-btn tall-btn " + - ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} + class={"chat-btn tall-btn " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} on:click={() => selectChatPubkey(searchQuery)} > <span class="text-xl">{$t("dm.findByPubkey")}</span> @@ -378,33 +363,26 @@ <div class="main container space-y-2 mx-auto space-y-5 lg:max-w-xl xl:max-w-2xl lg:pl-10 mt-5 lg:mt-0" > - <h1 - class="text-5xl font-medium text-left w-full mx-auto lg:mx-0 md:w-[500px]" - > + <h1 class="text-5xl font-medium text-left w-full mx-auto lg:mx-0 md:w-[500px]"> {$t("dm.header")} </h1> {#if selectedChat} <h1> {#if selectedChat.coinosUsername} - <a class="text-3xl" href="/{selectedChat.coinosUsername}" - >{name(selectedChat)}</a - > + <a class="text-3xl" href="/{selectedChat.coinosUsername}">{name(selectedChat)}</a> {:else} <span class="text-3xl">{name(selectedChat)}</span> {/if} <span - class={"secondary timestamp text-small" + - (idValid(selectedChat) ? "" : " invalid")} + class={"secondary timestamp text-small" + (idValid(selectedChat) ? "" : " invalid")} title={npubEncode(selectedChat.pubkey)}>{id(selectedChat)}</span > <button class={"small-btn push-right " + ($theme === "light" ? "light-chat-btn" : "dark-chat-btn")} on:click={() => toggleMute(selectedChat.pubkey)} - >{$t( - muted && muted.has(selectedChat.pubkey) ? "dm.unmute" : "dm.mute", - )}</button + >{$t(muted && muted.has(selectedChat.pubkey) ? "dm.unmute" : "dm.mute")}</button > </h1> @@ -418,13 +396,10 @@ {#each messageRumours.get(day) as rumour} {#if rumour.pubkey === user.pubkey && pTagKeys(rumour).includes(selectedChat.pubkey)} <li - class={(rumour.expiration && - expirationClose(rumour.expiration) + class={(rumour.expiration && expirationClose(rumour.expiration) ? "secondary " : "") + - ($theme === "light" - ? "light-message " - : "dark-message ") + + ($theme === "light" ? "light-message " : "dark-message ") + "message by-user"} > {rumour.content} @@ -434,13 +409,10 @@ </li> {:else if rumour.pubkey === selectedChat.pubkey && pTagKeys(rumour).includes(user.pubkey)} <li - class={(rumour.expiration && - expirationClose(rumour.expiration) + class={(rumour.expiration && expirationClose(rumour.expiration) ? "secondary " : "") + - ($theme === "light" - ? "light-message " - : "dark-message ") + + ($theme === "light" ? "light-message " : "dark-message ") + "message by-other"} > {rumour.content} @@ -488,12 +460,7 @@ <p class="secondary">{$t("dm.fadedWarning")}</p> {#if canSend && !canSendExpiring} <p class="warning"> - <em - >{$t("dm.cantSendExpiring").replace( - "[R]", - name(selectedChat), - )}</em - > + <em>{$t("dm.cantSendExpiring").replace("[R]", name(selectedChat))}</em> </p> {/if} {/if} @@ -506,9 +473,7 @@ <p class="warning"> <em >{$t("dm.noRelaysSet")} - <a class="link" href="/settings/nostr#dm-relays" - >{$t("dm.nostrSettingsLink")}</a - ></em + <a class="link" href="/settings/nostr#dm-relays">{$t("dm.nostrSettingsLink")}</a></em > </p> {/if} diff --git a/src/routes/(app)/ecash/[id]/[...version]/+layout.svelte b/src/routes/(app)/ecash/[id]/[...version]/+layout.svelte index bf00964b..a4cfd805 100644 --- a/src/routes/(app)/ecash/[id]/[...version]/+layout.svelte +++ b/src/routes/(app)/ecash/[id]/[...version]/+layout.svelte @@ -24,9 +24,7 @@ <div>{f(amountFiat, currency)}</div> {:else} <div> - <span class="text-secondary font-normal text-xl" - >⚡️{`${s(amount)}`}</span - > + <span class="text-secondary font-normal text-xl">⚡️{`${s(amount)}`}</span> </div> {/if} </div> @@ -46,9 +44,7 @@ </div> {:else} <div> - <span class="text-secondary font-normal text-xl" - >⚡️{`${s(spent)}`}</span - > + <span class="text-secondary font-normal text-xl">⚡️{`${s(spent)}`}</span> <span class=" text-red-600">{$t("payments.spent")}</span> </div> {/if} diff --git a/src/routes/(app)/ecash/[id]/[...version]/+page.server.ts b/src/routes/(app)/ecash/[id]/[...version]/+page.server.ts index 08efb998..9a20b85c 100644 --- a/src/routes/(app)/ecash/[id]/[...version]/+page.server.ts +++ b/src/routes/(app)/ecash/[id]/[...version]/+page.server.ts @@ -10,8 +10,7 @@ export async function load({ parent }) { export const actions = { default: async ({ cookies, request, url }) => { - if (!cookies.get("username")) - redirect(307, `/register?redirect=${url.pathname}`); + if (!cookies.get("username")) redirect(307, `/register?redirect=${url.pathname}`); const { token } = await fd(request); let claimed; diff --git a/src/routes/(app)/ecash/[id]/[...version]/+page.svelte b/src/routes/(app)/ecash/[id]/[...version]/+page.svelte index 3cfa502d..0702dcb0 100644 --- a/src/routes/(app)/ecash/[id]/[...version]/+page.svelte +++ b/src/routes/(app)/ecash/[id]/[...version]/+page.svelte @@ -51,11 +51,7 @@ {#if external} <a href={`/ecash/${id}/swap`} class="contents"> <button type="submit" class="btn"> - <iconify-icon - noobserver - icon="ph:hand-coins-bold" - width="32" - flip="horizontal" + <iconify-icon noobserver icon="ph:hand-coins-bold" width="32" flip="horizontal" ></iconify-icon> <div class="my-auto">{$t("payments.swap")}</div> </button> @@ -64,11 +60,7 @@ <form method="POST" use:enhance class="w-full"> <input type="hidden" name="token" bind:value={token} /> <button type="submit" class="btn"> - <iconify-icon - noobserver - icon="ph:hand-coins-bold" - width="32" - flip="horizontal" + <iconify-icon noobserver icon="ph:hand-coins-bold" width="32" flip="horizontal" ></iconify-icon> <div class="my-auto">{$t("payments.redeem")}</div> </button> @@ -76,10 +68,7 @@ {/if} {/if} - <button - class="btn break-all !h-auto py-5 font-normal leading-normal" - onclick={() => copy(token)} - > + <button class="btn break-all !h-auto py-5 font-normal leading-normal" onclick={() => copy(token)}> {token} </button> </div> diff --git a/src/routes/(app)/ecash/[id]/[...version]/swap/+page.svelte b/src/routes/(app)/ecash/[id]/[...version]/swap/+page.svelte index f05a7297..77f631af 100644 --- a/src/routes/(app)/ecash/[id]/[...version]/swap/+page.svelte +++ b/src/routes/(app)/ecash/[id]/[...version]/swap/+page.svelte @@ -2,6 +2,4 @@ let { data } = $props(); </script> -<div class="text-center"> - Support for swapping in cash from other mints is coming soon -</div> +<div class="text-center">Support for swapping in cash from other mints is coming soon</div> diff --git a/src/routes/(app)/firehose/+page.svelte b/src/routes/(app)/firehose/+page.svelte index 2fdaa4d0..a11d15d1 100644 --- a/src/routes/(app)/firehose/+page.svelte +++ b/src/routes/(app)/firehose/+page.svelte @@ -35,9 +35,7 @@ </script> <div class="container px-4 max-w-xl mx-auto space-y-5"> - <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold"> - Events - </h1> + <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold">Events</h1> <div onpointerenter={pause} onpointerleave={unpause}> {#each events as event} diff --git a/src/routes/(app)/fund/[id]/+page.svelte b/src/routes/(app)/fund/[id]/+page.svelte index 34e0d503..8d83038b 100644 --- a/src/routes/(app)/fund/[id]/+page.svelte +++ b/src/routes/(app)/fund/[id]/+page.svelte @@ -36,16 +36,10 @@ <div class="container px-4 max-w-4xl mx-auto mt-10 space-y-5"> <div class="flex justify-center items-center"> - <div - class="md:shadow-xl rounded-3xl md:px-10 pt-5 pb-10 space-y-5 w-full md:mx-5" - > + <div class="md:shadow-xl rounded-3xl md:px-10 pt-5 pb-10 space-y-5 w-full md:mx-5"> {#if show} <div class="max-w-[360px] mx-auto"> - <img - src={`/qr/${href}/raw`} - class="z-10 border-4 border-white w-" - alt="URL" - /> + <img src={`/qr/${href}/raw`} class="z-10 border-4 border-white w-" alt="URL" /> </div> {/if} <div class="flex justify-center gap-4"> @@ -72,10 +66,7 @@ </div> {#if (user && !managers.length) || managers.some((m) => m.id === user?.id)} - <a - href={`/fund/${id}/access`} - class="btn !w-auto ml-auto text-secondary grow" - > + <a href={`/fund/${id}/access`} class="btn !w-auto ml-auto text-secondary grow"> <iconify-icon icon="ph:gear-bold" width={32}></iconify-icon> {$t("funds.manage")} </a> @@ -85,8 +76,7 @@ <div class="grow"> <a href={`/send/fund/${id}`}> <button class="btn"> - <iconify-icon noobserver icon="ph:plus-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:plus-bold" width="32"></iconify-icon> {$t("payments.addFunds")} </button> </a> @@ -95,11 +85,7 @@ <div class="grow"> <a href={`/fund/${id}/withdraw`}> <button class="btn"> - <iconify-icon - noobserver - icon="ph:hand-coins-bold" - width="32" - flip="horizontal" + <iconify-icon noobserver icon="ph:hand-coins-bold" width="32" flip="horizontal" ></iconify-icon> {$t("payments.takeFunds")} </button> @@ -109,13 +95,11 @@ </div> <div class="flex gap-2" data-sveltekit-prefetch="off"> <a href={`/qr/${href}`} class="btn !w-auto grow"> - <iconify-icon noobserver icon="ph:link-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:link-bold" width="32"></iconify-icon> <div class="my-auto">{$t("payments.shareLink")}</div> </a> <a href={`${$page.url.pathname}/gift`} class="btn !w-auto grow"> - <iconify-icon noobserver icon="ph:gift-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:gift-bold" width="32"></iconify-icon> <div class="my-auto">{$t("payments.giftLink")}</div> </a> <!-- <a href={`/qr/${lnurlw}`} class="btn !w-auto grow"> --> diff --git a/src/routes/(app)/fund/[id]/access/+page.svelte b/src/routes/(app)/fund/[id]/access/+page.svelte index 24ded54e..9920fa5b 100644 --- a/src/routes/(app)/fund/[id]/access/+page.svelte +++ b/src/routes/(app)/fund/[id]/access/+page.svelte @@ -23,12 +23,8 @@ <div class="container px-4 max-w-4xl mx-auto mt-10 space-y-5"> <div class="flex justify-center items-center"> - <div - class="md:shadow-xl rounded-3xl md:px-10 pt-5 pb-10 space-y-5 w-full md:mx-5" - > - <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold"> - Fund managers - </h1> + <div class="md:shadow-xl rounded-3xl md:px-10 pt-5 pb-10 space-y-5 w-full md:mx-5"> + <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold">Fund managers</h1> {#each m as c} <a href={`/${c.username}`} class="contents"> @@ -51,12 +47,7 @@ <form method="post" use:enhance class="space-y-2"> <input type="hidden" name="id" value={id} /> - <input - use:focus - name="username" - bind:value={username} - placeholder={$t("funds.username")} - /> + <input use:focus name="username" bind:value={username} placeholder={$t("funds.username")} /> <button type="submit" class="btn"> <iconify-icon icon="ph:plus-bold" width="32"></iconify-icon> {$t("funds.addManager")} diff --git a/src/routes/(app)/fund/[id]/gift/+page.svelte b/src/routes/(app)/fund/[id]/gift/+page.svelte index 9bef9c64..ff05575d 100644 --- a/src/routes/(app)/fund/[id]/gift/+page.svelte +++ b/src/routes/(app)/fund/[id]/gift/+page.svelte @@ -32,11 +32,7 @@ <div class="my-auto break-all min-w-0 !w-auto max-w-full">{text}</div> </button> - <a - href={`/qr/${encodeURIComponent(text)}`} - class="btn !w-auto" - aria-label="Show gift QR" - > + <a href={`/qr/${encodeURIComponent(text)}`} class="btn !w-auto" aria-label="Show gift QR"> <iconify-icon icon="ph:qr-code-bold" width={32}></iconify-icon> </a> </div> diff --git a/src/routes/(app)/fund/[id]/sweep/[...amount]/+page.svelte b/src/routes/(app)/fund/[id]/sweep/[...amount]/+page.svelte index 451fc128..b67a024b 100644 --- a/src/routes/(app)/fund/[id]/sweep/[...amount]/+page.svelte +++ b/src/routes/(app)/fund/[id]/sweep/[...amount]/+page.svelte @@ -15,13 +15,7 @@ </script> <div class="container px-4 text-center mx-auto"> - <Success - {amount} - {rate} - {currency} - {locale} - title={$t("payments.received")} - /> + <Success {amount} {rate} {currency} {locale} title={$t("payments.received")} /> </div> <a href={`/${user.username}`} aria-label="Continue"> diff --git a/src/routes/(app)/fund/[id]/withdraw/+page.svelte b/src/routes/(app)/fund/[id]/withdraw/+page.svelte index 9b53824d..b8ccd5af 100644 --- a/src/routes/(app)/fund/[id]/withdraw/+page.svelte +++ b/src/routes/(app)/fund/[id]/withdraw/+page.svelte @@ -62,12 +62,7 @@ {/if}</button > - <button - use:focus - bind:this={submit} - type="submit" - class="btn btn-accent !w-auto grow" - > + <button use:focus bind:this={submit} type="submit" class="btn btn-accent !w-auto grow"> {#if submitting} <Spinner /> {:else} diff --git a/src/routes/(app)/invoice/[id]/+layout.server.ts b/src/routes/(app)/invoice/[id]/+layout.server.ts index d6ee4246..a0d7d676 100644 --- a/src/routes/(app)/invoice/[id]/+layout.server.ts +++ b/src/routes/(app)/invoice/[id]/+layout.server.ts @@ -31,8 +31,7 @@ export async function load({ cookies, depends, params, url, parent }) { !(url.pathname.includes("tip") || url.pathname.includes("memo")) && !options ) { - if (invoice.prompt && invoice.tip === null) - redirect(307, `/invoice/${id}/tip`); + if (invoice.prompt && invoice.tip === null) redirect(307, `/invoice/${id}/tip`); else { redirect(307, `/send/invoice/${id}`); } diff --git a/src/routes/(app)/invoice/[id]/+page.svelte b/src/routes/(app)/invoice/[id]/+page.svelte index bf62a062..2810b39c 100644 --- a/src/routes/(app)/invoice/[id]/+page.svelte +++ b/src/routes/(app)/invoice/[id]/+page.svelte @@ -2,20 +2,7 @@ import { getWallet } from "$lib/ark"; import { enhance } from "$app/forms"; import { send } from "$lib/socket"; - import { - btc, - loc, - post, - copy, - f, - fail, - success, - get, - types, - sat, - s, - sats, - } from "$lib/utils"; + import { btc, loc, post, copy, f, fail, success, get, types, sat, s, sats } from "$lib/utils"; import { tick, onMount, onDestroy } from "svelte"; import { browser } from "$app/environment"; import { last, showQr, amountPrompt } from "$lib/store"; @@ -149,13 +136,9 @@ let fiat = $state(true); let amountFiat = $derived(parseFloat(((amount * rate) / sats).toFixed(2))); let tipAmount = $derived(((tip * rate) / sats).toFixed(2)); - let link = $derived( - [types.bitcoin, types.liquid].includes(type) ? text : `lightning:${text}`, - ); + let link = $derived([types.bitcoin, types.liquid].includes(type) ? text : `lightning:${text}`); - let txt = $derived( - [types.bitcoin, types.liquid].includes(type) ? hash : text, - ); + let txt = $derived([types.bitcoin, types.liquid].includes(type) ? hash : text); </script> <div class="invoice container mx-auto max-w-xl px-4 space-y-2"> diff --git a/src/routes/(app)/invoice/[id]/paid/+page.svelte b/src/routes/(app)/invoice/[id]/paid/+page.svelte index 30679ac3..1a09653f 100644 --- a/src/routes/(app)/invoice/[id]/paid/+page.svelte +++ b/src/routes/(app)/invoice/[id]/paid/+page.svelte @@ -5,9 +5,7 @@ import { loc } from "$lib/utils"; let { data } = $props(); - let { amount, currency, rate, received, pending, tip, user, id } = $derived( - data.invoice, - ); + let { amount, currency, rate, received, pending, tip, user, id } = $derived(data.invoice); let locale = $derived(loc(user)); // toast.pop(0); @@ -15,12 +13,7 @@ <div class="container px-4 text-center mx-auto"> {#if pending} - <iconify-icon - noobserver - icon="ph:clock-bold" - class="text-warning" - width="160" - ></iconify-icon> + <iconify-icon noobserver icon="ph:clock-bold" class="text-warning" width="160"></iconify-icon> <h1 class="text-3xl md:text-4xl font-bold mb-6">Payment detected</h1> diff --git a/src/routes/(app)/invoice/[id]/tip/+page.server.ts b/src/routes/(app)/invoice/[id]/tip/+page.server.ts index 16cc22fa..91ccebca 100644 --- a/src/routes/(app)/invoice/[id]/tip/+page.server.ts +++ b/src/routes/(app)/invoice/[id]/tip/+page.server.ts @@ -44,11 +44,7 @@ export const actions = { tip: form.tip ?? null, }; - const { id } = await post( - `/invoice/${form.id}`, - { invoice }, - auth(cookies), - ); + const { id } = await post(`/invoice/${form.id}`, { invoice }, auth(cookies)); redirect(307, `/invoice/${id}`); }, diff --git a/src/routes/(app)/invoice/[id]/tip/+page.svelte b/src/routes/(app)/invoice/[id]/tip/+page.svelte index 1183093e..32ba78a2 100644 --- a/src/routes/(app)/invoice/[id]/tip/+page.svelte +++ b/src/routes/(app)/invoice/[id]/tip/+page.svelte @@ -107,18 +107,13 @@ <div> <span class="mr-1"> {f(amountFiat, currency, locale)} - <span class="font-semibold" - >+{f(tipAmount, currency, locale)}</span - > + <span class="font-semibold">+{f(tipAmount, currency, locale)}</span> </span> </div> {:else} <div class="ml-auto text-lg flex gap-2"> <div class="flex items-center"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300" ></iconify-icon> <div>{s(amount, locale)}</div> </div> @@ -134,12 +129,8 @@ <div class="space-y-2"> {#if tip} - <button type="button" class="btn" onclick={() => submit.click()} - >Next</button - > - <button type="button" class="btn" onclick={() => (tipPercent = 0)} - >Reset</button - > + <button type="button" class="btn" onclick={() => submit.click()}>Next</button> + <button type="button" class="btn" onclick={() => (tipPercent = 0)}>Reset</button> {:else} {#each tipAmounts as amount, i} {#if i === 0} @@ -163,10 +154,7 @@ </div> <div class="space-y-2"> - <button - type="button" - class="btn" - onclick={() => (showCustomAmount = true)} + <button type="button" class="btn" onclick={() => (showCustomAmount = true)} >{$t("payments.custom")}</button > <a href={`/invoice/${id}`} class="btn">{$t("payments.cancel")}</a> @@ -186,9 +174,7 @@ placeholder={$t("payments.amount")} use:focus /> - <button type="submit" class="btn" disabled={!customTipAmount} - >Apply</button - > + <button type="submit" class="btn" disabled={!customTipAmount}>Apply</button> </form> {/if} </div> diff --git a/src/routes/(app)/invoices/+page.svelte b/src/routes/(app)/invoices/+page.svelte index 35a81a3e..418dfaf3 100644 --- a/src/routes/(app)/invoices/+page.svelte +++ b/src/routes/(app)/invoices/+page.svelte @@ -7,9 +7,7 @@ <div class="container w-full mx-auto text-lg px-2 space-y-2"> <div class="mx-auto flex justify-center w-full gap-1"> - <div - class="grid md:grid-cols-12 w-full text-center text-lg break-all gap-x-2" - > + <div class="grid md:grid-cols-12 w-full text-center text-lg break-all gap-x-2"> {#each invoices as i} <div class="md:col-span-2 whitespace-nowrap mt-8 md:mt-0">{i.type}</div> {#if show[i.id]} diff --git a/src/routes/(app)/ln/[lnurl]/+page.server.ts b/src/routes/(app)/ln/[lnurl]/+page.server.ts index ae784401..912ed07c 100644 --- a/src/routes/(app)/ln/[lnurl]/+page.server.ts +++ b/src/routes/(app)/ln/[lnurl]/+page.server.ts @@ -62,15 +62,12 @@ export const actions = { pay: async ({ fetch, request }) => { let error; - let { callback, amount, minSendable, maxSendable, comment } = - await fd(request); + let { callback, amount, minSendable, maxSendable, comment } = await fd(request); minSendable = Math.round(minSendable / 1000); maxSendable = Math.round(maxSendable / 1000); - if (amount < minSendable) - error = `Amount must be at least ${minSendable} sats`; - if (amount > maxSendable) - error = `Amount must be at most ${maxSendable} sats`; + if (amount < minSendable) error = `Amount must be at least ${minSendable} sats`; + if (amount > maxSendable) error = `Amount must be at most ${maxSendable} sats`; if (error) return fail(400, { error }); let url = `${callback}?amount=${amount * 1000}`; @@ -86,33 +83,20 @@ export const actions = { withdraw: async ({ cookies, fetch, request }) => { let error; - let { - callback, - amount, - username, - currency, - minWithdrawable, - maxWithdrawable, - k1, - } = await fd(request); + let { callback, amount, username, currency, minWithdrawable, maxWithdrawable, k1 } = + await fd(request); minWithdrawable = Math.round(minWithdrawable / 1000); maxWithdrawable = Math.round(maxWithdrawable / 1000); - if (amount < minWithdrawable) - error = `Amount must be at least ${minWithdrawable} sats`; - if (amount > maxWithdrawable) - error = `Amount must be at most ${maxWithdrawable} sats`; + if (amount < minWithdrawable) error = `Amount must be at least ${minWithdrawable} sats`; + if (amount > maxWithdrawable) error = `Amount must be at most ${maxWithdrawable} sats`; if (error) return fail(400, { error }); const invoice = { amount, type: "lightning" }; const user = { username, currency }; - const { text: pr } = await post( - "/invoice", - { invoice, user }, - auth(cookies), - ); + const { text: pr } = await post("/invoice", { invoice, user }, auth(cookies)); const url = new URL(callback); url.searchParams.append("k1", k1); diff --git a/src/routes/(app)/ln/withdrawal/sent/+page.svelte b/src/routes/(app)/ln/withdrawal/sent/+page.svelte index fa888fc1..3f0b8711 100644 --- a/src/routes/(app)/ln/withdrawal/sent/+page.svelte +++ b/src/routes/(app)/ln/withdrawal/sent/+page.svelte @@ -9,14 +9,8 @@ </script> <div class="text-center mt-20 md:mt-0"> - <div - class="flex w-full max-w-[200px] mx-auto py-20" - in:scale={{ start: 0.5 }} - > - <iconify-icon - noobserver - icon="ph:check-bold" - class="mx-auto w-full text-[#7ACC8F]" + <div class="flex w-full max-w-[200px] mx-auto py-20" in:scale={{ start: 0.5 }}> + <iconify-icon noobserver icon="ph:check-bold" class="mx-auto w-full text-[#7ACC8F]" ></iconify-icon> </div> <h1 class="text-3xl md:text-4xl font-bold mb-6">Request Sent!</h1> diff --git a/src/routes/(app)/messages/+page.server.ts b/src/routes/(app)/messages/+page.server.ts index ec83bede..20ba5f39 100644 --- a/src/routes/(app)/messages/+page.server.ts +++ b/src/routes/(app)/messages/+page.server.ts @@ -22,9 +22,7 @@ export async function load({ params, parent }) { const { pubkey } = user; try { messages = await get(`/${pubkey}/${since}/messages`); - messages = messages.sort( - (a: Message, b: Message) => b.created_at - a.created_at, - ); + messages = messages.sort((a: Message, b: Message) => b.created_at - a.created_at); } catch (e) { console.log("failed to fetch nostr messages", e); } diff --git a/src/routes/(app)/messages/+page.svelte b/src/routes/(app)/messages/+page.svelte index 3e97398f..2aaede8b 100644 --- a/src/routes/(app)/messages/+page.svelte +++ b/src/routes/(app)/messages/+page.svelte @@ -9,10 +9,8 @@ let { data } = $props(); - let { messages, notes, invoices, sent, received, subject, user }: any = - $state(data); - let refresh = (d: any) => - ({ messages, notes, invoices, sent, received, subject, user } = d); + let { messages, notes, invoices, sent, received, subject, user }: any = $state(data); + let refresh = (d: any) => ({ messages, notes, invoices, sent, received, subject, user } = d); let keys = new Set(); let latest: any[] = $state([]); @@ -20,10 +18,7 @@ e.subscribe(async (event: any) => { if (!(browser && event && ready)) return; - if ( - event.recipient?.id === user.id && - !~latest.findIndex((m: any) => m.id === event.id) - ) { + if (event.recipient?.id === user.id && !~latest.findIndex((m: any) => m.id === event.id)) { event.content = await decrypt({ event, user }); let i = latest.findIndex((m: any) => m.pubkey === event.pubkey); @@ -46,10 +41,7 @@ if (!(event.author && event.recipient)) continue; - let k = - event.author.id === user.id - ? event.recipient?.pubkey - : event.author.pubkey; + let k = event.author.id === user.id ? event.recipient?.pubkey : event.author.pubkey; if (!keys.has(k)) { keys.add(k); diff --git a/src/routes/(app)/messages/[recipient]/+page.server.ts b/src/routes/(app)/messages/[recipient]/+page.server.ts index 85deabbb..d9a9c54f 100644 --- a/src/routes/(app)/messages/[recipient]/+page.server.ts +++ b/src/routes/(app)/messages/[recipient]/+page.server.ts @@ -12,10 +12,7 @@ export async function load({ params, parent }) { messages = await get(`/${user.pubkey}/${since}/messages`); messages = messages - .filter( - (m: Message) => - m.recipient?.id === recipient.id || m.author?.id === recipient.id, - ) + .filter((m: Message) => m.recipient?.id === recipient.id || m.author?.id === recipient.id) .sort((a, b) => a.created_at - b.created_at); } catch (e) { console.log("failed to fetch nostr messages", e); diff --git a/src/routes/(app)/messages/[recipient]/+page.svelte b/src/routes/(app)/messages/[recipient]/+page.svelte index 654ddcca..f828bde2 100644 --- a/src/routes/(app)/messages/[recipient]/+page.svelte +++ b/src/routes/(app)/messages/[recipient]/+page.svelte @@ -28,9 +28,7 @@ duration, css: (t) => { const eased = easing(t); - return `opacity: ${eased * o}; transform: scale(${ - eased * s * is + baseScale - })`; + return `opacity: ${eased * o}; transform: scale(${eased * s * is + baseScale})`; }, }; } @@ -41,9 +39,7 @@ let initialize = async (p: any) => { await Promise.all( - messages.map( - async (event) => (event.message = await decrypt({ event, user })), - ), + messages.map(async (event) => (event.message = await decrypt({ event, user }))), ); messages = messages; @@ -117,14 +113,8 @@ </script> <div class="container max-w-xl mx-auto px-4 space-y-5"> - <button - type="button" - class="hover:opacity-80" - data-sveltekit-preload-data="false" - onclick={back} - > - <iconify-icon noobserver icon="ph:arrow-left-bold" width="40" - ></iconify-icon> + <button type="button" class="hover:opacity-80" data-sveltekit-preload-data="false" onclick={back}> + <iconify-icon noobserver icon="ph:arrow-left-bold" width="40"></iconify-icon> </button> <div @@ -145,11 +135,7 @@ baseScale: 0.5, }} > - <div - class="rounded-2xl px-4 py-2 max-w-[300px] mb-1 text-lg" - class:ours - class:theirs - > + <div class="rounded-2xl px-4 py-2 max-w-[300px] mb-1 text-lg" class:ours class:theirs> {message} </div> <div class="mt-auto"> @@ -184,8 +170,7 @@ tabindex="0" ></div> <button type="submit" class="my-auto shrink-0"> - <iconify-icon noobserver icon="ph:paper-plane-right-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:paper-plane-right-bold" width="32"></iconify-icon> </button> </form> </div> diff --git a/src/routes/(app)/pay/[username]/[...amount]/+page.svelte b/src/routes/(app)/pay/[username]/[...amount]/+page.svelte index 9807313a..6cae555c 100644 --- a/src/routes/(app)/pay/[username]/[...amount]/+page.svelte +++ b/src/routes/(app)/pay/[username]/[...amount]/+page.svelte @@ -54,23 +54,14 @@ <div class="container px-4 mt-20 max-w-xl mx-auto space-y-2"> <Numpad bind:amount bind:fiat {currency} {locale} {rate} submit={next} /> - <form - method="POST" - use:enhance - class="flex gap-2 justify-center" - bind:this={formElement} - > + <form method="POST" use:enhance class="flex gap-2 justify-center" bind:this={formElement}> <input name="amount" bind:value={amount} type="hidden" /> <input name="rate" value={rate} type="hidden" /> <input name="username" value={subject.username} type="hidden" /> <input name="prompt" value={subject.prompt} type="hidden" /> {#if user?.balance} - <button - type="button" - class="btn !w-auto grow" - onclick={setMax} - onkeydown={setMax} + <button type="button" class="btn !w-auto grow" onclick={setMax} onkeydown={setMax} >{#if $fiatStore} Max {f((user.balance * rate) / sats, currency, locale)} {:else} diff --git a/src/routes/(app)/payment/[id]/+page.svelte b/src/routes/(app)/payment/[id]/+page.svelte index 436a7ab6..b8a4223d 100644 --- a/src/routes/(app)/payment/[id]/+page.svelte +++ b/src/routes/(app)/payment/[id]/+page.svelte @@ -2,18 +2,7 @@ import { browser } from "$app/environment"; import { onMount, tick } from "svelte"; import { t, loading } from "$lib/translations"; - import { - copy, - f, - s, - loc, - toFiat, - post, - sats, - fail, - success, - types, - } from "$lib/utils"; + import { copy, f, s, loc, toFiat, post, sats, fail, success, types } from "$lib/utils"; import { fiat } from "$lib/store"; const toggleFiat = (e) => { @@ -77,9 +66,7 @@ if (type === types.fund) a = 0 - a; direction = a > 0 ? $t("payments.from") : $t("payments.to"); - if (direction) - direction = - direction[0].toUpperCase() + direction.substr(1, direction.length); + if (direction) direction = direction[0].toUpperCase() + direction.substr(1, direction.length); }); </script> @@ -98,11 +85,7 @@ </div> {:else} <div class="flex items-center gap-1"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" - ></iconify-icon> + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon> {s(amount, userLocale)} </div> {/if} @@ -152,11 +135,7 @@ </div> <div class="text-secondary flex"> <div class="flex items-center"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" - ></iconify-icon> + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon> {s((1 * sats) / rate)} = {f(1, currency, userLocale, 0, 0)} </div> @@ -179,15 +158,17 @@ </a> {:else if type === types.fund} <a href={`/fund/${memo}`} class="btn btn-accent"> - <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300" - ></iconify-icon>{$t("payments.viewFund")} + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon>{$t( + "payments.viewFund", + )} </a> {:else if memo?.includes("9734")} {@const eid = JSON.parse(memo).tags.find((t) => t[0] === "e")[1]} <a href={`/e/${eid}`} class="btn btn-accent"> <img src="/images/nostr.png" class="w-8" alt="Nostr" /> - <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300" - ></iconify-icon>{$t("payments.zappedEvent")} + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon>{$t( + "payments.zappedEvent", + )} </a> {:else if memo} <div> @@ -220,10 +201,7 @@ rel="noreferrer">{txid}</a > </div> - <button - class="flex font-bold hover:opacity-80 mb-auto my-auto" - onclick={() => copy(txid)} - > + <button class="flex font-bold hover:opacity-80 mb-auto my-auto" onclick={() => copy(txid)}> </button> </div> </div> @@ -234,10 +212,7 @@ <span class="text-lg text-secondary">Path</span> <div class="flex"> <div>{path}</div> - <button - class="flex font-bold hover:opacity-80 mb-auto my-auto" - onclick={() => copy(path)} - > + <button class="flex font-bold hover:opacity-80 mb-auto my-auto" onclick={() => copy(path)}> </button> </div> </div> diff --git a/src/routes/(app)/payment/[id]/plain/+page.svelte b/src/routes/(app)/payment/[id]/plain/+page.svelte index 46197260..87ad2207 100644 --- a/src/routes/(app)/payment/[id]/plain/+page.svelte +++ b/src/routes/(app)/payment/[id]/plain/+page.svelte @@ -3,17 +3,7 @@ import { onMount } from "svelte"; import { browser } from "$app/environment"; import { t } from "$lib/translations"; - import { - back, - copy, - f, - s, - toFiat, - post, - sats, - success, - types, - } from "$lib/utils"; + import { back, copy, f, s, toFiat, post, sats, success, types } from "$lib/utils"; import { fiat } from "$lib/store"; import Avatar from "$comp/Avatar.svelte"; import { format } from "date-fns"; diff --git a/src/routes/(app)/payments/[...page]/+page.server.ts b/src/routes/(app)/payments/[...page]/+page.server.ts index bf280937..9a81993a 100644 --- a/src/routes/(app)/payments/[...page]/+page.server.ts +++ b/src/routes/(app)/payments/[...page]/+page.server.ts @@ -25,10 +25,7 @@ export async function load({ cookies, depends, params }) { if (start) q.set("start", str(start * 1000)); if (end) q.set("end", str(end * 1000)); - const { count, payments, incoming, outgoing } = await get( - `/payments?${str(q)}`, - auth(cookies), - ); + const { count, payments, incoming, outgoing } = await get(`/payments?${str(q)}`, auth(cookies)); const pages = Array.from({ length: Math.ceil(count / limit) }); diff --git a/src/routes/(app)/payments/[...page]/+page.svelte b/src/routes/(app)/payments/[...page]/+page.svelte index 7d73a0b1..f6cbcba8 100644 --- a/src/routes/(app)/payments/[...page]/+page.svelte +++ b/src/routes/(app)/payments/[...page]/+page.svelte @@ -11,16 +11,7 @@ import { goto, invalidate } from "$app/navigation"; let { data } = $props(); - let { - start, - end, - user, - payments, - incoming, - outgoing, - pages, - page: p, - } = $derived(data); + let { start, end, user, payments, incoming, outgoing, pages, page: p } = $derived(data); let locale = $derived(loc(user)); @@ -55,9 +46,7 @@ ]); let selection = $derived( - presets.findIndex( - (p) => Math.abs(differenceInDays(new Date(start * 1000), p.start)) < 1, - ), + presets.findIndex((p) => Math.abs(differenceInDays(new Date(start * 1000), p.start)) < 1), ); $effect(() => { @@ -88,9 +77,7 @@ platform_fee: p.ourfee, amount_fiat: f((p.amount * p.rate) / sats, p.currency), fee_fiat: p.fee ? f((p.fee * p.rate) / sats, p.currency) : null, - platform_fee_fiat: p.ourfee - ? f((p.ourfee * p.rate) / sats, p.currency) - : null, + platform_fee_fiat: p.ourfee ? f((p.ourfee * p.rate) / sats, p.currency) : null, tip_fiat: p.tip ? f((p.tip * p.rate) / sats, p.currency) : null, total_fiat: f( ((p.amount + ((p.amount > 0 ? p.tip : -p.tip) || 0)) * p.rate) / sats, @@ -120,9 +107,7 @@ let csv = keys.map((k) => `"${k}"`).join(",") + "\n" + - payments - .map((r) => keys.map((k) => `"${r[k] || ""}"`).join(",")) - .join("\n"); + payments.map((r) => keys.map((k) => `"${r[k] || ""}"`).join(",")).join("\n"); let filename = "payments.csv"; let blob = new Blob([csv], { type: "text/csv;charset=utf-8;" }); @@ -148,10 +133,7 @@ if (i === 0 || i === pages.length - 1) return true; - let start = Math.max( - 1, - currentPage - Math.floor((maxVisiblePages - 4) / 2), - ); + let start = Math.max(1, currentPage - Math.floor((maxVisiblePages - 4) / 2)); let end = start + maxVisiblePages - 5; if (end >= pages.length - 1) { @@ -162,8 +144,7 @@ return i >= start && i <= end; }; - let isEllipsis = (i) => - (i === 1 && !showPage(i)) || (i === pages.length - 2 && !showPage(i)); + let isEllipsis = (i) => (i === 1 && !showPage(i)) || (i === pages.length - 2 && !showPage(i)); </script> <div class="space-y-5"> @@ -189,19 +170,12 @@ {#each pages as _, i} {#if showPage(i)} <a href={`${path}/${i + 1}`}> - <div - class="join-item btn !btn-sm" - class:btn-active={parseInt(p) === i + 1} - > + <div class="join-item btn !btn-sm" class:btn-active={parseInt(p) === i + 1}> {i + 1} </div> </a> {:else if isEllipsis(i)} - <div - class="join-item btn !w-auto !btn-sm btn-disabled !bg-base-200" - > - ... - </div> + <div class="join-item btn !w-auto !btn-sm btn-disabled !bg-base-200">...</div> {/if} {/each} {/if} @@ -218,9 +192,7 @@ <span class="text-base text-secondary"> {#if tipsIn > 0 || tipsOut > 0}{$t("payments.tips")}{/if} </span> - <span class="text-base text-secondary text-right" - >{$t("payments.total")}</span - > + <span class="text-base text-secondary text-right">{$t("payments.total")}</span> {@const totalIn = incoming[c]?.fiat || 0} {@const tipsIn = incoming[c]?.fiatTips || 0} @@ -231,25 +203,17 @@ {@const subtotalOut = totalOut - tipsOut} {#if totalIn > 0} - <span class="text-left text-base text-secondary" - >{$t("payments.income")}</span - > + <span class="text-left text-base text-secondary">{$t("payments.income")}</span> <!-- <span><b>{subtotalIn ? f(subtotalIn, c) : "-"}</b></span> --> <span><b>{tipsIn > 0 ? f(tipsIn, c, locale) : ""}</b></span> - <span class="text-right" - ><b>{totalIn > 0 ? f(totalIn, c, locale) : "-"}</b></span - > + <span class="text-right"><b>{totalIn > 0 ? f(totalIn, c, locale) : "-"}</b></span> {/if} {#if totalOut > 0} - <span class="text-left text-base text-secondary" - >{$t("payments.expenditure")}</span - > + <span class="text-left text-base text-secondary">{$t("payments.expenditure")}</span> <!-- <span><b>{subtotalOut ? f(subtotalOut, c) : "-"}</b></span> --> <span><b>{tipsOut > 0 ? f(tipsOut, c, locale) : "-"}</b></span> - <span class="text-right" - ><b>{totalOut > 0 ? f(totalOut, c, locale) : "-"}</b></span - > + <span class="text-right"><b>{totalOut > 0 ? f(totalOut, c, locale) : "-"}</b></span> {/if} {/each} </div> @@ -258,8 +222,7 @@ {#if payments.length} <div class="flex justify-center"> <button class="btn !w-auto" onclick={csv}> - <iconify-icon noobserver icon="ph:floppy-disk-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:floppy-disk-bold" width="32"></iconify-icon> <div class="my-auto">{$t("payments.export")}</div> </button> </div> diff --git a/src/routes/(app)/pos/+page.svelte b/src/routes/(app)/pos/+page.svelte index 056a9254..0b29608d 100644 --- a/src/routes/(app)/pos/+page.svelte +++ b/src/routes/(app)/pos/+page.svelte @@ -63,9 +63,7 @@ chip = await esploader.main(); connected = true; - portInfo = (await device.getInfo?.()) - ? JSON.stringify(await device.getInfo()) - : "Connected"; + portInfo = (await device.getInfo?.()) ? JSON.stringify(await device.getInfo()) : "Connected"; } catch (e) { console.log(e); connected = false; @@ -148,9 +146,7 @@ </script> <div class="container px-4 max-w-lg mx-auto space-y-5 mt-20"> - <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold"> - ESP32-C3 Flasher - </h1> + <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold">ESP32-C3 Flasher</h1> {#if !connected} <div class="text-center"> @@ -162,15 +158,11 @@ {#if connected} <!-- Tabs --> <div class="flex gap-2 justify-center"> - <button - class="btn" - class:btn-neutral={tab === "config"} - onclick={() => (tab = "config")}>Flash config</button + <button class="btn" class:btn-neutral={tab === "config"} onclick={() => (tab = "config")} + >Flash config</button > - <button - class="btn" - class:btn-neutral={tab === "firmware"} - onclick={() => (tab = "firmware")}>Flash firmware</button + <button class="btn" class:btn-neutral={tab === "firmware"} onclick={() => (tab = "firmware")} + >Flash firmware</button > </div> @@ -181,15 +173,12 @@ <div class="text-center text-2xl">Config written ✔</div> {:else} <div>Generated config file (<b>{bytes.length} bytes</b>)</div> - <label class="label mt-2" for="littlefs-address" - >LittleFS address (hex)</label - > + <label class="label mt-2" for="littlefs-address">LittleFS address (hex)</label> <input id="littlefs-address" class="input" bind:value={littlefsAddress} - onchange={(e) => - (littlefsAddress = Number((e.target as HTMLInputElement).value))} + onchange={(e) => (littlefsAddress = Number((e.target as HTMLInputElement).value))} /> <div class="mt-3"> <button class="btn" onclick={flashConfig}>Flash config</button> @@ -202,21 +191,14 @@ <form method="POST" use:enhance class="space-y-2"> <input name="ssid" placeholder="Wifi SSID" class="input" /> <input name="key" placeholder="Wifi password" class="input" /> - <input - name="token" - bind:value={token} - placeholder="Coinos API token" - class="input" - /> + <input name="token" bind:value={token} placeholder="Coinos API token" class="input" /> <button type="submit" class="btn">Generate Config</button> </form> {/if} {:else} <!-- NEW FIRMWARE FLOW --> <div class="space-y-3"> - <label class="label" for="firmware-file" - >Select .ino.bin (firmware)</label - > + <label class="label" for="firmware-file">Select .ino.bin (firmware)</label> <input id="firmware-file" type="file" @@ -225,15 +207,12 @@ onchange={onPickFw} /> - <label class="label" for="firmware-address" - >Firmware address (hex, default 0x10000)</label - > + <label class="label" for="firmware-address">Firmware address (hex, default 0x10000)</label> <input id="firmware-address" class="input" bind:value={fwAddress} - onchange={(e) => - (fwAddress = Number((e.target as HTMLInputElement).value))} + onchange={(e) => (fwAddress = Number((e.target as HTMLInputElement).value))} /> <label class="flex items-center gap-2 mt-2"> @@ -242,9 +221,7 @@ </label> <div class="mt-3"> - <button class="btn" disabled={!fwBytes} onclick={flashFirmware} - >Flash firmware</button - > + <button class="btn" disabled={!fwBytes} onclick={flashFirmware}>Flash firmware</button> </div> {#if fwProgress > 0 && !fwDone} diff --git a/src/routes/(app)/printer/+page.svelte b/src/routes/(app)/printer/+page.svelte index 28a3dfb1..108af3b5 100644 --- a/src/routes/(app)/printer/+page.svelte +++ b/src/routes/(app)/printer/+page.svelte @@ -69,9 +69,7 @@ </script> <div class="container px-4 max-w-lg mx-auto space-y-5 mt-20"> - <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold"> - Printer - </h1> + <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold">Printer</h1> {#if esploader} {#if data} @@ -85,16 +83,8 @@ <form method="POST" use:enhance class="space-y-2"> <input name="ssid" bind:value={ssid} placeholder="wifi ssid" /> <input name="key" bind:value={key} placeholder="wifi pass" /> - <input - name="username" - bind:value={username} - placeholder="coinos username" - /> - <input - name="password" - bind:value={password} - placeholder="coinos password" - /> + <input name="username" bind:value={username} placeholder="coinos username" /> + <input name="password" bind:value={password} placeholder="coinos password" /> <button type="submit" class="btn">Generate Config</button> </form> {/if} diff --git a/src/routes/(app)/qr/[text]/[icon]/+server.ts b/src/routes/(app)/qr/[text]/[icon]/+server.ts index 4a1bb78e..85311a8f 100644 --- a/src/routes/(app)/qr/[text]/[icon]/+server.ts +++ b/src/routes/(app)/qr/[text]/[icon]/+server.ts @@ -15,13 +15,7 @@ export async function GET({ params }) { const logo = await loadImage(`static/images/${icon}`); const logoSize = size * 0.3; - ctx.drawImage( - logo, - (size - logoSize) / 2, - (size - logoSize) / 2, - logoSize, - logoSize, - ); + ctx.drawImage(logo, (size - logoSize) / 2, (size - logoSize) / 2, logoSize, logoSize); const buffer = canvas.toBuffer("image/png"); return new Response(buffer, { diff --git a/src/routes/(app)/qr/create/+page.svelte b/src/routes/(app)/qr/create/+page.svelte index 189a734d..3a17bcc0 100644 --- a/src/routes/(app)/qr/create/+page.svelte +++ b/src/routes/(app)/qr/create/+page.svelte @@ -8,8 +8,7 @@ text = $state(), pasted = $state(); - let keypress = (e) => - e.key === "Enter" ? e.preventDefault() || el.click() : (pasted = false); + let keypress = (e) => (e.key === "Enter" ? e.preventDefault() || el.click() : (pasted = false)); let paste = async () => { text = await navigator.clipboard.readText(); @@ -24,9 +23,7 @@ </script> <div class="container px-4 max-w-lg mx-auto space-y-5 mt-20"> - <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold"> - Create QR - </h1> + <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold">Create QR</h1> <form onsubmit={preventDefault(submit)} class="space-y-2 text-xl"> <div class="mb-2"> @@ -48,11 +45,7 @@ class="flex border rounded-2xl px-6 py-5 font-bold hover:opacity-80 w-full bg-primary justify-center gap-2" onclick={paste} > - <iconify-icon - noobserver - icon="ph:clipboard-text-bold" - width="32" - class="my-auto" + <iconify-icon noobserver icon="ph:clipboard-text-bold" width="32" class="my-auto" ></iconify-icon> <div class="my-auto">{$t("user.send.paste")}</div> </button> @@ -62,11 +55,7 @@ type="submit" class="flex bg-black text-white border rounded-2xl px-6 py-5 w-full font-bold gap-2 justify-center" > - <iconify-icon - noobserver - icon="ph:paper-plane-right-bold" - width="32" - class="my-auto invert" + <iconify-icon noobserver icon="ph:paper-plane-right-bold" width="32" class="my-auto invert" ></iconify-icon> <div class="my-auto">{$t("user.dashboard.go")}</div> </button> diff --git a/src/routes/(app)/receive/[...token]/+page.svelte b/src/routes/(app)/receive/[...token]/+page.svelte index 1f4c81fc..bea32277 100644 --- a/src/routes/(app)/receive/[...token]/+page.svelte +++ b/src/routes/(app)/receive/[...token]/+page.svelte @@ -43,9 +43,7 @@ {#if form?.error} <div class="mb-5"> <div class="text-red-600"> - {form.error === "default" - ? $t("error.unrecognizedInput") - : form.error} + {form.error === "default" ? $t("error.unrecognizedInput") : form.error} </div> </div> {/if} @@ -66,15 +64,13 @@ <div class="flex gap-2"> <a href="/scan" class="contents"> <button type="button" class="btn !w-auto flex-grow"> - <iconify-icon noobserver icon="ph:camera-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:camera-bold" width="32"></iconify-icon> <div class="my-auto">{$t("user.send.scan")}</div> </button> </a> <button type="button" class="btn !w-auto flex-grow" onclick={paste}> - <iconify-icon noobserver icon="ph:clipboard-text-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:clipboard-text-bold" width="32"></iconify-icon> <div class="my-auto">{$t("user.send.paste")}</div> </button> </div> diff --git a/src/routes/(app)/reset/[code]/+page.svelte b/src/routes/(app)/reset/[code]/+page.svelte index 93fdf8f9..deade18a 100644 --- a/src/routes/(app)/reset/[code]/+page.svelte +++ b/src/routes/(app)/reset/[code]/+page.svelte @@ -19,8 +19,7 @@ onMount(() => { if (!isTor && recaptchaSiteKey) { let s = document.createElement("script"); - s.src = - "https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey; + s.src = "https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey; document.head.appendChild(s); } }); @@ -28,13 +27,9 @@ const getRecaptchaToken = () => new Promise((resolve, reject) => { if (isTor) return resolve(""); - if (!browser || !grecaptcha) - return reject(new Error("captcha unavailable")); + if (!browser || !grecaptcha) return reject(new Error("captcha unavailable")); grecaptcha.ready(() => { - grecaptcha - .execute(recaptchaSiteKey, { action: "reset" }) - .then(resolve) - .catch(reject); + grecaptcha.execute(recaptchaSiteKey, { action: "reset" }).then(resolve).catch(reject); }); }); @@ -59,9 +54,7 @@ } const scriptSelector = - "script[src='https://www.google.com/recaptcha/api.js?render=" + - recaptchaSiteKey + - "']"; + "script[src='https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey + "']"; const script = document.querySelector(scriptSelector); if (script) { script.remove(); @@ -77,9 +70,7 @@ </div> <div class="flex justify-center items-center"> - <div - class="shadow-xl rounded-3xl p-10 pb-12 space-y-5 w-full mx-5 md:mx-0 md:w-[400px]" - > + <div class="shadow-xl rounded-3xl p-10 pb-12 space-y-5 w-full mx-5 md:mx-0 md:w-[400px]"> <h1 class="text-2xl font-bold text-center">{$t("login.reset")}</h1> {#if form?.error} @@ -90,15 +81,11 @@ <form class="space-y-5" method="POST" onsubmit={handleSubmit}> <input type="hidden" name="recaptcha" value={recaptchaToken} /> - <PasswordInput - bind:value={$password} - placeholder={$t("login.password")} - /> + <PasswordInput bind:value={$password} placeholder={$t("login.password")} /> <div class="text-secondary"> - A new seed phrase will be generated for your account. You'll need to - import your old seed phrase if you want to use the same nostr profile - and savings account as before. + A new seed phrase will be generated for your account. You'll need to import your old seed + phrase if you want to use the same nostr profile and savings account as before. </div> <button diff --git a/src/routes/(app)/scan/+page.svelte b/src/routes/(app)/scan/+page.svelte index 90e0e79c..5fd49a43 100644 --- a/src/routes/(app)/scan/+page.svelte +++ b/src/routes/(app)/scan/+page.svelte @@ -32,8 +32,7 @@ highlightCodeOutline: true, qrEngine: BarcodeDetector, }; - let cb = ({ data }) => - scanner.stop() || goto(`/send/${encodeURIComponent(data)}`); + let cb = ({ data }) => scanner.stop() || goto(`/send/${encodeURIComponent(data)}`); scanner = new QrScanner(vid, cb, options); await tick(); scanner.start(); @@ -47,9 +46,7 @@ <div class="flex w-full mb-4 p-4"> <div class="mx-auto rounded-3xl"> - <video - bind:this={vid} - class="border-4 rounded-3xl border-black max-h-[calc(100vh*0.7)]" + <video bind:this={vid} class="border-4 rounded-3xl border-black max-h-[calc(100vh*0.7)]" ></video> </div> </div> diff --git a/src/routes/(app)/send/+layout.server.ts b/src/routes/(app)/send/+layout.server.ts index 38ed57cf..4917ea20 100644 --- a/src/routes/(app)/send/+layout.server.ts +++ b/src/routes/(app)/send/+layout.server.ts @@ -1,6 +1,5 @@ import { redirect } from "@sveltejs/kit"; export async function load({ cookies, url }) { - if (!cookies.get("token")) - redirect(307, `/register?redirect=${url.pathname}`); + if (!cookies.get("token")) redirect(307, `/register?redirect=${url.pathname}`); } diff --git a/src/routes/(app)/send/[...text]/+page.svelte b/src/routes/(app)/send/[...text]/+page.svelte index 58db231a..28332f6b 100644 --- a/src/routes/(app)/send/[...text]/+page.svelte +++ b/src/routes/(app)/send/[...text]/+page.svelte @@ -27,8 +27,7 @@ pasted = $state(), w: number | undefined = $state(); - let keypress = (e) => - e.key === "Enter" ? e.preventDefault() || el.click() : (pasted = false); + let keypress = (e) => (e.key === "Enter" ? e.preventDefault() || el.click() : (pasted = false)); let paste = async () => { text = await navigator.clipboard.readText(); @@ -80,9 +79,7 @@ {#if form?.error} <div class="mb-5"> <div class="text-red-600"> - {form.error === "default" - ? $t("error.unrecognizedInput") - : form.error} + {form.error === "default" ? $t("error.unrecognizedInput") : form.error} </div> </div> {/if} @@ -90,15 +87,13 @@ <div class="flex gap-2"> <a href="/scan" class="contents"> <button type="button" class="btn !w-auto flex-grow"> - <iconify-icon noobserver icon="ph:camera-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:camera-bold" width="32"></iconify-icon> {$t("user.send.scan")} </button> </a> <button type="button" class="btn !w-auto flex-grow" onclick={paste}> - <iconify-icon noobserver icon="ph:clipboard-text-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:clipboard-text-bold" width="32"></iconify-icon> {$t("user.send.paste")} </button> </div> @@ -115,17 +110,13 @@ ></textarea> <button bind:this={el} type="submit" class="btn btn-accent"> - <iconify-icon noobserver icon="ph:paper-plane-right-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:paper-plane-right-bold" width="32"></iconify-icon> <div class="my-auto">{$t("user.send.next")}</div> </button> <a href="/send/fund" class="block"> <button type="button" class="btn"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300 text-2xl" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300 text-2xl" ></iconify-icon> <div class="my-auto">{$t("payments.createFund")}</div> </button> @@ -151,9 +142,7 @@ onclick={(e) => pin(e, c)} aria-label={c.pinned ? "Unpin contact" : "Pin contact"} > - <iconify-icon - icon={c.pinned ? "ph:push-pin-fill" : "ph:push-pin-bold"} - width={32} + <iconify-icon icon={c.pinned ? "ph:push-pin-fill" : "ph:push-pin-bold"} width={32} ></iconify-icon> </button> <button @@ -162,9 +151,7 @@ onclick={(e) => trust(e, c)} aria-label={c.trusted ? "Untrust contact" : "Trust contact"} > - <iconify-icon - icon={c.trusted ? "ph:star-fill" : "ph:star-bold"} - width={32} + <iconify-icon icon={c.trusted ? "ph:star-fill" : "ph:star-bold"} width={32} ></iconify-icon> </button> </div> @@ -176,8 +163,6 @@ {/if} {#if !loaded && contacts.length > 0} - <button onclick={loadMore} type="button" class="btn" - >{$t("user.loadMore")}</button - > + <button onclick={loadMore} type="button" class="btn">{$t("user.loadMore")}</button> {/if} </div> diff --git a/src/routes/(app)/send/ark/[address]/+layout.server.ts b/src/routes/(app)/send/ark/[address]/+layout.server.ts index bb167d2d..6381463a 100644 --- a/src/routes/(app)/send/ark/[address]/+layout.server.ts +++ b/src/routes/(app)/send/ark/[address]/+layout.server.ts @@ -18,8 +18,7 @@ export async function load({ cookies, params, parent }) { const recipient = await get(`/users/${invoice.uid}`); let r = `/pay/${recipient.username}`; if (amount) r += `/${amount}`; - if (recipient?.id !== user.id && recipient.id === invoice.aid) - redirect(307, r); + if (recipient?.id !== user.id && recipient.id === invoice.aid) redirect(307, r); } return { balance }; diff --git a/src/routes/(app)/send/ark/[address]/+page.svelte b/src/routes/(app)/send/ark/[address]/+page.svelte index 0bf9e0de..23f3a7fb 100644 --- a/src/routes/(app)/send/ark/[address]/+page.svelte +++ b/src/routes/(app)/send/ark/[address]/+page.svelte @@ -34,21 +34,10 @@ <div class="text-xl text-secondary break-all">{address}</div> - <Numpad - bind:amount={a} - bind:fiat - {currency} - {submit} - bind:rate={$rate} - {locale} - /> + <Numpad bind:amount={a} bind:fiat {currency} {submit} bind:rate={$rate} {locale} /> <div class="flex justify-center gap-2"> - <button - type="button" - class="btn !w-auto grow" - onclick={setMax} - onkeydown={setMax} + <button type="button" class="btn !w-auto grow" onclick={setMax} onkeydown={setMax} >{#if $fiatStore} Max {f((balance * $rate) / sats, currency, locale)} {:else} @@ -57,11 +46,7 @@ > <form action={`/send/ark/${address}/${amount}`} class="contents"> - <button - bind:this={submit} - type="submit" - class="btn !w-auto grow btn-accent" - > + <button bind:this={submit} type="submit" class="btn !w-auto grow btn-accent"> {$t("payments.next")} </button> </form> diff --git a/src/routes/(app)/send/ark/[address]/[amount]/[...feeRate]/+page.server.ts b/src/routes/(app)/send/ark/[address]/[amount]/[...feeRate]/+page.server.ts index 07972e6c..10a6a737 100644 --- a/src/routes/(app)/send/ark/[address]/[amount]/[...feeRate]/+page.server.ts +++ b/src/routes/(app)/send/ark/[address]/[amount]/[...feeRate]/+page.server.ts @@ -36,19 +36,11 @@ export async function load({ params: { address, amount }, cookies, parent }) { } export const actions = { - default: async ({ - cookies, - params: { address, amount, feeRate }, - request, - }) => { + default: async ({ cookies, params: { address, amount, feeRate }, request }) => { let p; try { const body = await fd(request); - p = await post( - "/ark/send", - { ...body, address, amount: parseInt(amount) }, - auth(cookies), - ); + p = await post("/ark/send", { ...body, address, amount: parseInt(amount) }, auth(cookies)); } catch (e) { console.log("problem sending bitcoin", e); const { message } = e as Error; diff --git a/src/routes/(app)/send/ark/[address]/[amount]/[...feeRate]/+page.svelte b/src/routes/(app)/send/ark/[address]/[amount]/[...feeRate]/+page.svelte index f5bc3bc6..c7c08772 100644 --- a/src/routes/(app)/send/ark/[address]/[amount]/[...feeRate]/+page.svelte +++ b/src/routes/(app)/send/ark/[address]/[amount]/[...feeRate]/+page.svelte @@ -68,9 +68,7 @@ submit = $state(); </script> -<div - class="container px-4 max-w-xl mx-auto space-y-5 text-center no-transition" -> +<div class="container px-4 max-w-xl mx-auto space-y-5 text-center no-transition"> <h1 class="text-3xl md:text-4xl font-semibold mb-2">{$t("payments.send")}</h1> {#if form?.message || message || error} diff --git a/src/routes/(app)/send/bitcoin/[address]/+page.svelte b/src/routes/(app)/send/bitcoin/[address]/+page.svelte index 6c49ad6c..76ac093e 100644 --- a/src/routes/(app)/send/bitcoin/[address]/+page.svelte +++ b/src/routes/(app)/send/bitcoin/[address]/+page.svelte @@ -34,21 +34,10 @@ <div class="text-xl text-secondary break-all">{address}</div> - <Numpad - bind:amount={a} - bind:fiat - {currency} - {submit} - bind:rate={$rate} - {locale} - /> + <Numpad bind:amount={a} bind:fiat {currency} {submit} bind:rate={$rate} {locale} /> <div class="flex justify-center gap-2"> - <button - type="button" - class="btn !w-auto grow" - onclick={setMax} - onkeydown={setMax} + <button type="button" class="btn !w-auto grow" onclick={setMax} onkeydown={setMax} >{#if $fiatStore} Max {f((balance * $rate) / sats, currency, locale)} {:else} @@ -57,12 +46,7 @@ > <form action={`/send/bitcoin/${address}/${amount}`} class="contents"> - <button - use:focus - bind:this={submit} - type="submit" - class="btn !w-auto grow btn-accent" - > + <button use:focus bind:this={submit} type="submit" class="btn !w-auto grow btn-accent"> {$t("payments.next")} </button> </form> diff --git a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.server.ts b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.server.ts index 7cdd86f5..c5149a93 100644 --- a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.server.ts +++ b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.server.ts @@ -2,11 +2,7 @@ import getRates from "$lib/rates"; import { auth, fd, get, post } from "$lib/utils"; import { fail, redirect } from "@sveltejs/kit"; -export async function load({ - params: { address, amount, feeRate }, - cookies, - parent, -}) { +export async function load({ params: { address, amount, feeRate }, cookies, parent }) { const rates = await getRates(); const { user } = await parent(); const aid = cookies.get("aid") || user.id; @@ -50,11 +46,7 @@ export async function load({ } export const actions = { - default: async ({ - cookies, - params: { address, amount, feeRate }, - request, - }) => { + default: async ({ cookies, params: { address, amount, feeRate }, request }) => { let p; try { const body = await fd(request); diff --git a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte index 6581e12f..49dbe7c6 100644 --- a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte +++ b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte @@ -14,10 +14,7 @@ import { hex as hexUtil } from "@scure/base"; import * as btc from "@scure/btc-signer"; import { decrypt } from "nostr-tools/nip49"; - import { - getRememberedWalletPassword, - forgetWalletPassword, - } from "$lib/passwordCache"; + import { getRememberedWalletPassword, forgetWalletPassword } from "$lib/passwordCache"; import { sendArkViaForward } from "$lib/ark"; import Amount from "$comp/Amount.svelte"; @@ -78,8 +75,7 @@ return; } - if ((account.seed || data.user.seed) && !signed) - (cancel(), void togglePassword()); + if ((account.seed || data.user.seed) && !signed) (cancel(), void togglePassword()); return async ({ result }) => { if (result.type === "redirect") { goto(result.location); @@ -92,29 +88,21 @@ let signTx = async () => { const { decrypt } = await import("nostr-tools/nip49"); - const [ - { Transaction }, - { HDKey }, - { entropyToMnemonic, mnemonicToSeed }, - { wordlist }, - ] = await Promise.all([ - import("@scure/btc-signer"), - import("@scure/bip32"), - import("@scure/bip39"), - import("@scure/bip39/wordlists/english.js"), - ]); - let entropy = await decrypt( - account.seed || data.user.seed, - password as string, - ); + const [{ Transaction }, { HDKey }, { entropyToMnemonic, mnemonicToSeed }, { wordlist }] = + await Promise.all([ + import("@scure/btc-signer"), + import("@scure/bip32"), + import("@scure/bip39"), + import("@scure/bip39/wordlists/english.js"), + ]); + let entropy = await decrypt(account.seed || data.user.seed, password as string); let mnemonic = entropyToMnemonic(entropy, wordlist); let seed = await mnemonicToSeed(mnemonic, password as string); let master = HDKey.fromMasterSeed(seed, network as any); let child = master.derive(`m/84'/0'/${account.accountIndex ?? 0}'`); let raw = decode(hex); - let isPSBT = - raw[0] === 0x70 && raw[1] === 0x73 && raw[2] === 0x62 && raw[3] === 0x74; + let isPSBT = raw[0] === 0x70 && raw[1] === 0x73 && raw[2] === 0x62 && raw[3] === 0x74; let tx: any = isPSBT ? Transaction.fromPSBT(raw) : Transaction.fromRaw(raw); for (let [i, input] of tx.inputs.entries()) { @@ -137,27 +125,15 @@ let toggle = () => (submitting = !submitting); - let { - account, - amount, - address, - message, - fee, - fees, - subtract, - ourfee, - hex, - inputs, - } = $derived(data); + let { account, amount, address, message, fee, fees, subtract, ourfee, hex, inputs } = + $derived(data); let { feeRate }: any = $state(data); $effect(() => { if (fees) { delete fees.minimumFee; - feeRate = feeRate - ? closest(Object.values(fees), feeRate) - : fees.halfHourFee; + feeRate = feeRate ? closest(Object.values(fees), feeRate) : fees.halfHourFee; } }); @@ -182,9 +158,7 @@ let goBack = () => goto(`/send/bitcoin/${address}`); </script> -<div - class="container px-4 max-w-xl mx-auto space-y-5 text-center no-transition" -> +<div class="container px-4 max-w-xl mx-auto space-y-5 text-center no-transition"> <h1 class="text-3xl md:text-4xl font-semibold mb-2">{$t("payments.send")}</h1> {#if form?.message || message || error} @@ -194,11 +168,7 @@ {:else} <div class="text-xl text-secondary break-all">{address}</div> - <Amount - amount={subtract ? amount - fee - ourfee : amount} - rate={$rate} - {currency} - /> + <Amount amount={subtract ? amount - fee - ourfee : amount} rate={$rate} {currency} /> {#if fees} <div class="text-center"> diff --git a/src/routes/(app)/send/fund/[...name]/[...amount]/+page.svelte b/src/routes/(app)/send/fund/[...name]/[...amount]/+page.svelte index 58d4812f..d0cf6743 100644 --- a/src/routes/(app)/send/fund/[...name]/[...amount]/+page.svelte +++ b/src/routes/(app)/send/fund/[...name]/[...amount]/+page.svelte @@ -52,12 +52,7 @@ <div class="container px-4 mt-20 max-w-xl mx-auto"> <Numpad bind:amount {currency} {rate} {fiat} {submit} {locale} /> - <form - use:enhance={handler(toggle)} - method="POST" - class="space-y-5" - bind:this={formElement} - > + <form use:enhance={handler(toggle)} method="POST" class="space-y-5" bind:this={formElement}> <input name="fund" value={name} type="hidden" /> <input name="amount" value={amount} type="hidden" /> <input name="pin" value={$pin} type="hidden" /> @@ -76,12 +71,7 @@ {/if}</button > - <button - use:focus - bind:this={submit} - type="submit" - class="btn btn-accent !w-auto grow" - > + <button use:focus bind:this={submit} type="submit" class="btn btn-accent !w-auto grow"> {#if submitting} <Spinner /> {:else} diff --git a/src/routes/(app)/send/invoice/[id]/+page.server.ts b/src/routes/(app)/send/invoice/[id]/+page.server.ts index 2e268b99..59add224 100644 --- a/src/routes/(app)/send/invoice/[id]/+page.server.ts +++ b/src/routes/(app)/send/invoice/[id]/+page.server.ts @@ -32,21 +32,13 @@ export async function load({ cookies, depends, params: { id }, parent }) { if (p) redirect(307, `/sent/${p.id}`); } - if (invoice.amount && invoice.prompt && invoice.tip === null) - redirect(307, `/invoice/${id}/tip`); + if (invoice.amount && invoice.prompt && invoice.tip === null) redirect(307, `/invoice/${id}/tip`); - if (invoice.memoPrompt && invoice.memo === null) - redirect(307, `/invoice/${id}/memo`); + if (invoice.memoPrompt && invoice.memo === null) redirect(307, `/invoice/${id}/memo`); - if (user && invoice.aid === aid) - error(500, { message: "Cannot send to self" }); + if (user && invoice.aid === aid) error(500, { message: "Cannot send to self" }); else if (user && ![types.lightning, types.bolt12].includes(invoice.type)) - redirect( - 307, - `/send/${invoice.type === types.ecash ? "ecash" : "bitcoin"}/${ - invoice.hash - }`, - ); + redirect(307, `/send/${invoice.type === types.ecash ? "ecash" : "bitcoin"}/${invoice.hash}`); if (!user) redirect(307, `/invoice/${id}`); diff --git a/src/routes/(app)/send/invoice/[id]/+page.svelte b/src/routes/(app)/send/invoice/[id]/+page.svelte index f3f2f618..9174cf4c 100644 --- a/src/routes/(app)/send/invoice/[id]/+page.svelte +++ b/src/routes/(app)/send/invoice/[id]/+page.svelte @@ -11,18 +11,7 @@ import Numpad from "$comp/Numpad.svelte"; import Spinner from "$comp/Spinner.svelte"; import { page } from "$app/stores"; - import { - btc, - sat, - post, - back, - f, - toFiat, - s, - sats, - focus, - loc, - } from "$lib/utils"; + import { btc, sat, post, back, f, toFiat, s, sats, focus, loc } from "$lib/utils"; let { data, form }: any = $props(); let { trusted, balance, invoice, user } = $state(data); @@ -156,14 +145,7 @@ {/each} {/if} {:else} - <Numpad - bind:amount={a} - bind:amountFiat={af} - bind:fiat - {currency} - {rate} - {submit} - /> + <Numpad bind:amount={a} bind:amountFiat={af} bind:fiat {currency} {rate} {submit} /> {/if} <form method="POST" use:enhance={handler(toggle)} class="space-y-2"> @@ -175,12 +157,7 @@ <div class="flex w-full text-xl"> {#if amount} - <button - use:focus - type="submit" - class="btn btn-primary" - disabled={submitting} - > + <button use:focus type="submit" class="btn btn-primary" disabled={submitting}> {#if submitting} <Spinner /> {:else} @@ -188,11 +165,7 @@ {/if} </button> {:else} - <button - type="button" - class="btn !w-auto grow" - onclick={setMax} - onkeydown={setMax} + <button type="button" class="btn !w-auto grow" onclick={setMax} onkeydown={setMax} >{#if $fiatStore} Max {f((balance * rate) / sats, currency, locale)} {:else} @@ -210,9 +183,7 @@ </button> {/if} </div> - <button type="button" class="btn" onclick={external} - >{$t("payments.moreOptions")}</button - > + <button type="button" class="btn" onclick={external}>{$t("payments.moreOptions")}</button> {#if !trusted} <button type="button" class="btn" onclick={toggleTrust}> diff --git a/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte b/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte index 718f3ee2..fbafd7d4 100644 --- a/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte +++ b/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte @@ -34,9 +34,7 @@ let show = $state(false); let toggle = () => (show = !show); let amount = $derived(form?.amount || data.amount); - let maxfee = $state( - Math.max(5, Math.round(untrack(() => amount) * 0.02 || 0)), - ); + let maxfee = $state(Math.max(5, Math.round(untrack(() => amount) * 0.02 || 0))); $effect(() => { maxfee = Math.max(5, Math.round(amount * 0.02) || 0); }); @@ -144,9 +142,7 @@ {#if form?.message || showMax} <div class="mx-auto space-y-2"> - <label for="maxfee" class="text-lg text-secondary" - >{$t("payments.maxfee")}</label - > + <label for="maxfee" class="text-lg text-secondary">{$t("payments.maxfee")}</label> <div class="text-secondary"> {$t("payments.maxFeeDesc")} @@ -155,23 +151,13 @@ <label class="input input-bordered border-primary input-lg rounded-2xl flex items-center gap-2 text-left" > - <input - id="maxfee" - name="fee" - bind:value={maxfee} - class="clean !grow" - /> + <input id="maxfee" name="fee" bind:value={maxfee} class="clean !grow" /> <div class="ml-auto">⚡️</div> </label> </div> {/if} - <button - type="submit" - class="btn btn-primary" - disabled={loading} - use:focus - > + <button type="submit" class="btn btn-primary" disabled={loading} use:focus> {#if loading} <Spinner /> {:else} @@ -199,9 +185,7 @@ submit={next} element={undefined} /> - <button type="submit" class="btn" bind:this={next} - >{$t("payments.next")}</button - > + <button type="submit" class="btn" bind:this={next}>{$t("payments.next")}</button> </form> {/if} </div> diff --git a/src/routes/(app)/send/zap/[id]/[...amount]/+page.server.ts b/src/routes/(app)/send/zap/[id]/[...amount]/+page.server.ts index a658a5c1..2886f00a 100644 --- a/src/routes/(app)/send/zap/[id]/[...amount]/+page.server.ts +++ b/src/routes/(app)/send/zap/[id]/[...amount]/+page.server.ts @@ -8,8 +8,7 @@ export async function load({ cookies, params, parent }) { const rates = await getRates(); let request; - if (amount) - request = await post("/zapRequest", { amount, id }, auth(cookies)); + if (amount) request = await post("/zapRequest", { amount, id }, auth(cookies)); const rate = rates[user.currency]; return { amount, id, rates, rate, request }; diff --git a/src/routes/(app)/send/zap/[id]/[...amount]/+page.svelte b/src/routes/(app)/send/zap/[id]/[...amount]/+page.svelte index 3d0d144c..bf5f5202 100644 --- a/src/routes/(app)/send/zap/[id]/[...amount]/+page.svelte +++ b/src/routes/(app)/send/zap/[id]/[...amount]/+page.svelte @@ -70,8 +70,6 @@ submit={next} element={undefined} /> - <button type="submit" class="btn" bind:this={next} - >{$t("payments.next")}</button - > + <button type="submit" class="btn" bind:this={next}>{$t("payments.next")}</button> </form> </div> diff --git a/src/routes/(app)/sent/[id]/+page.svelte b/src/routes/(app)/sent/[id]/+page.svelte index ba2b7366..3dde854f 100644 --- a/src/routes/(app)/sent/[id]/+page.svelte +++ b/src/routes/(app)/sent/[id]/+page.svelte @@ -10,14 +10,7 @@ let locale = $derived(loc(user)); </script> -<Success - {amount} - {rate} - {tip} - {currency} - {locale} - title={`${$t("payments.sent")}!`} -/> +<Success {amount} {rate} {tip} {currency} {locale} title={`${$t("payments.sent")}!`} /> <a href={`/${username}`} use:focus aria-label="Continue"> <div class="opacity-0 w-screen h-screen fixed top-0 left-0 z-50"></div> </a> diff --git a/src/routes/(app)/settings/+layout.svelte b/src/routes/(app)/settings/+layout.svelte index b670737f..b14f59d4 100644 --- a/src/routes/(app)/settings/+layout.svelte +++ b/src/routes/(app)/settings/+layout.svelte @@ -49,9 +49,7 @@ import { PUBLIC_DM_RELAYS } from "$env/static/public"; const DM_RELAYS_LIST = PUBLIC_DM_RELAYS.split(","); const updateRelaysIfAvailable = async () => { - const relayEntry = document.getElementById( - "dmRelays", - ) as HTMLTextAreaElement | null; + const relayEntry = document.getElementById("dmRelays") as HTMLTextAreaElement | null; if (!relayEntry || relayEntry.value.length === 0) return; const newRelays = relayEntry.value.split(/[ \r\n\t]+/).filter(isValidURL); @@ -233,8 +231,7 @@ } }); $effect(() => { - if (!$loading && $page.url.searchParams.get("verified")) - success($t("user.settings.verified")); + if (!$loading && $page.url.searchParams.get("verified")) success($t("user.settings.verified")); }); </script> @@ -242,12 +239,7 @@ <Pin /> {/if} -<form - method="POST" - class="mb-[154px] settings" - onsubmit={handleSubmit} - bind:this={formElement} -> +<form method="POST" class="mb-[154px] settings" onsubmit={handleSubmit} bind:this={formElement}> <input type="hidden" name="pin" value={$pin} /> <input type="hidden" name="tab" value={tab} /> diff --git a/src/routes/(app)/settings/account/+page.svelte b/src/routes/(app)/settings/account/+page.svelte index fb182887..7a1bbab1 100644 --- a/src/routes/(app)/settings/account/+page.svelte +++ b/src/routes/(app)/settings/account/+page.svelte @@ -20,8 +20,7 @@ let fiats = Object.keys(rates).sort((a, b) => a.localeCompare(b)); let el: any; - let keypress = (e: any) => - e.key === "Enter" && (e.preventDefault() || el.click()); + let keypress = (e: any) => e.key === "Enter" && (e.preventDefault() || el.click()); let editingReserve = $state(), editingThreshold = $state(), @@ -56,9 +55,7 @@ onMount(async () => { if (!browser) return; - pm = - navigator?.serviceWorker && - (await navigator.serviceWorker.getRegistration())?.pushManager; + pm = navigator?.serviceWorker && (await navigator.serviceWorker.getRegistration())?.pushManager; permission = await pm.permissionState({ userVisibleOnly: true, @@ -105,16 +102,12 @@ </script> <div> - <label for="language" class="font-bold block mb-1" - >{$t("user.settings.locale")}</label - > + <label for="language" class="font-bold block mb-1">{$t("user.settings.locale")}</label> <LocaleSelector style="select-styles block py-3 w-full" /> </div> <div> - <label for="currency" class="font-bold block mb-1" - >{$t("user.settings.localCurrency")}</label - > + <label for="currency" class="font-bold block mb-1">{$t("user.settings.localCurrency")}</label> <select name="currency" value={currency}> {#each fiats as fiat} <option value={fiat}>{fiat}</option> @@ -128,23 +121,13 @@ {$t("user.settings.emailDescription")} </p> - <label - class="input input-bordered border-primary input-lg rounded-2xl flex items-center gap-2" - > + <label class="input input-bordered border-primary input-lg rounded-2xl flex items-center gap-2"> <input type="text" name="email" class="clean" bind:value={email} /> {#if verified} - <iconify-icon - noobserver - icon="ph:check-bold" - class="text-success ml-auto" - width="32" + <iconify-icon noobserver icon="ph:check-bold" class="text-success ml-auto" width="32" ></iconify-icon> {:else if email} - <iconify-icon - noobserver - icon="ph:clock-bold" - class="text-warning ml-auto" - width="32" + <iconify-icon noobserver icon="ph:clock-bold" class="text-warning ml-auto" width="32" ></iconify-icon> {/if} </label> @@ -192,9 +175,7 @@ {$t("user.settings.tipDesc")} </p> - <label - class="input input-bordered border-primary input-lg rounded-2xl flex items-center gap-2" - > + <label class="input input-bordered border-primary input-lg rounded-2xl flex items-center gap-2"> <input type="text" name="tip" class="clean" bind:value={tip} /> </label> </div> @@ -211,9 +192,7 @@ <div class:hidden={!user.autowithdraw}> <div class="mb-2"> - <label for="display" class="font-bold mb-1 block" - >{$t("user.settings.destination")}</label - > + <label for="display" class="font-bold mb-1 block">{$t("user.settings.destination")}</label> <textarea name="destination" placeholder={$t("user.settings.destinationPlaceholder")} @@ -224,20 +203,12 @@ </div> <div> - <label for="display" class="font-bold mb-1 block" - >{$t("user.settings.threshold")}</label - > + <label for="display" class="font-bold mb-1 block">{$t("user.settings.threshold")}</label> <button type="button" class="flex w-full" onclick={editThreshold}> <div class="p-4 border rounded-2xl rounded-r-none border-r-0 bg-base-200"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" - ></iconify-icon> + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon> </div> - <div - class="border-l-0 rounded-l-none pl-2 w-full p-4 border rounded-2xl text-left" - > + <div class="border-l-0 rounded-l-none pl-2 w-full p-4 border rounded-2xl text-left"> {user.threshold} </div> <input type="hidden" name="threshold" bind:value={user.threshold} /> @@ -248,20 +219,12 @@ </div> <div> - <label for="display" class="font-bold mb-1 block" - >{$t("user.settings.reserve")}</label - > + <label for="display" class="font-bold mb-1 block">{$t("user.settings.reserve")}</label> <button type="button" class="flex w-full" onclick={editReserve}> <div class="p-4 border rounded-2xl rounded-r-none border-r-0 bg-base-200"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" - ></iconify-icon> + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"></iconify-icon> </div> - <div - class="border-l-0 rounded-l-none pl-2 w-full p-4 border rounded-2xl text-left" - > + <div class="border-l-0 rounded-l-none pl-2 w-full p-4 border rounded-2xl text-left"> {user.reserve} </div> <input type="hidden" name="reserve" bind:value={user.reserve} /> @@ -273,9 +236,7 @@ </div> {#if editingThreshold} - <div - class="fixed bg-base-100/90 inset-0 overflow-y-auto h-full w-full z-50 max-w-lg mx-auto" - > + <div class="fixed bg-base-100/90 inset-0 overflow-y-auto h-full w-full z-50 max-w-lg mx-auto"> <div class="relative p-5 border shadow-lg rounded-md bg-base-100 space-y-5"> <h1 class="text-center text-2xl font-semibold"> {$t("user.settings.threshold")} @@ -288,23 +249,14 @@ bind:element={thresholdEl} /> - <button - bind:this={doneReserve} - type="button" - onclick={doneEditing} - class="btn">Ok</button - > + <button bind:this={doneReserve} type="button" onclick={doneEditing} class="btn">Ok</button> </div> </div> {/if} {#if editingReserve} - <div - class="fixed bg-base-100/90 inset-0 overflow-y-auto h-full w-full z-50 mx-auto max-w-lg" - > - <div - class="relative mx-auto p-5 border shadow-lg rounded-md bg-base-100 space-y-5 text-center" - > + <div class="fixed bg-base-100/90 inset-0 overflow-y-auto h-full w-full z-50 mx-auto max-w-lg"> + <div class="relative mx-auto p-5 border shadow-lg rounded-md bg-base-100 space-y-5 text-center"> <h1 class="text-2xl font-semibold"> {$t("user.settings.reserve")} </h1> @@ -315,12 +267,7 @@ bind:submit={doneReserve} bind:element={reserveEl} /> - <button - bind:this={doneReserve} - type="button" - onclick={doneEditing} - class="btn">Ok</button - > + <button bind:this={doneReserve} type="button" onclick={doneEditing} class="btn">Ok</button> </div> </div> {/if} @@ -332,12 +279,7 @@ > {:else} <button type="button" onclick={revoke} class="btn"> - <img - src="/images/square.svg" - class="w-12" - class:invert={$theme === "dark"} - alt="Square" - /> + <img src="/images/square.svg" class="w-12" class:invert={$theme === "dark"} alt="Square" /> <div>{$t("user.settings.revokeSquare")}</div> </button> {/if} diff --git a/src/routes/(app)/settings/nostr/+page.svelte b/src/routes/(app)/settings/nostr/+page.svelte index c91150a3..35ae2b92 100644 --- a/src/routes/(app)/settings/nostr/+page.svelte +++ b/src/routes/(app)/settings/nostr/+page.svelte @@ -46,9 +46,7 @@ const DM_RELAYS_LIST = PUBLIC_DM_RELAYS.split(","); const pool = new SimplePool(); getPreferredRelays(user.pubkey).then((relays) => { - const relayEntry = document.getElementById( - "dmRelays", - ) as HTMLTextAreaElement | null; + const relayEntry = document.getElementById("dmRelays") as HTMLTextAreaElement | null; if (relayEntry) relayEntry.value = relays.join("\n"); }); </script> @@ -74,22 +72,11 @@ {#if app.max_amount > 0} <div class="flex gap-1 text-base"> <div class="flex items-center"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300" ></iconify-icon> {#if $fiat && $rate} - {f( - (app.spent * ($rate as number)) / sats, - user.currency, - locale, - )} / - {f( - (app.max_amount * ($rate as number)) / sats, - user.currency, - locale, - )} + {f((app.spent * ($rate as number)) / sats, user.currency, locale)} / + {f((app.max_amount * ($rate as number)) / sats, user.currency, locale)} {:else} {s(app.spent, locale)} / {s(app.max_amount, locale)} @@ -152,8 +139,7 @@ class:btn-disabled={!app.secret} aria-label="Open nostr" > - <iconify-icon icon="ph:arrow-square-out-bold" width="32" - ></iconify-icon> + <iconify-icon icon="ph:arrow-square-out-bold" width="32"></iconify-icon> <div>{$t("accounts.connect")}</div> </a> </div> @@ -202,8 +188,7 @@ class="my-auto btn btn-circle !w-auto grow" aria-label="QR" > - <iconify-icon noobserver icon="ph:qr-code-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:qr-code-bold" width="32"></iconify-icon> {$t("accounts.qr")} </a> </div> @@ -219,9 +204,7 @@ {#if user.nsec} <div class="space-y-2"> - <label for="seedphrase" class="font-bold" - >{$t("user.settings.nostrKeys")}</label - > + <label for="seedphrase" class="font-bold">{$t("user.settings.nostrKeys")}</label> <p class="text-secondary mb-1"> {$t("user.settings.nostrDescription")} @@ -230,12 +213,10 @@ <div class="flex flex-wrap sm:flex-nowrap gap-2"> <button type="button" class="btn !w-auto flex-grow" onclick={toggleNsec}> {#if revealNsec} - <iconify-icon noobserver icon="ph:eye-slash-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:eye-slash-bold" width="32"></iconify-icon> {$t("user.settings.hideNsec")} {:else} - <iconify-icon noobserver icon="ph:warning-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:warning-bold" width="32"></iconify-icon> {$t("user.settings.revealNsec")} {/if} </button> diff --git a/src/routes/(app)/settings/profile/+page.svelte b/src/routes/(app)/settings/profile/+page.svelte index 5cb4f7ae..e56f8a70 100644 --- a/src/routes/(app)/settings/profile/+page.svelte +++ b/src/routes/(app)/settings/profile/+page.svelte @@ -71,9 +71,7 @@ </script> <div> - <label for="username" class="font-bold mb-1 block" - >{$t("user.settings.username")}</label - > + <label for="username" class="font-bold mb-1 block">{$t("user.settings.username")}</label> <div class="flex mb-2"> <input type="text" name="username" bind:value={username} /> </div> @@ -82,20 +80,13 @@ <input type="hidden" name="confirm" bind:value={password} /> <div> - <label for="password" class="block font-bold block mb-1" - >{$t("user.settings.newPassword")}</label - > + <label for="password" class="block font-bold block mb-1">{$t("user.settings.newPassword")}</label> - <PasswordInput - bind:value={password} - placeholder="(Leave blank to keep unchanged)" - /> + <PasswordInput bind:value={password} placeholder="(Leave blank to keep unchanged)" /> </div> <div> - <label for="display" class="font-bold mb-1 block" - >{$t("user.settings.displayName")}</label - > + <label for="display" class="font-bold mb-1 block">{$t("user.settings.displayName")}</label> <input type="text" name="display" bind:value={display} /> </div> @@ -107,8 +98,7 @@ <div class="relative rounded-full overflow-hidden text-center w-20 h-20 my-auto hover:opacity-80 cursor-pointer" onclick={selectAvatar} - onkeydown={(e) => - (e.key === "Enter" || e.key === " ") && selectAvatar()} + onkeydown={(e) => (e.key === "Enter" || e.key === " ") && selectAvatar()} role="button" tabindex="0" > @@ -122,19 +112,15 @@ <div class="rounded-full border-4 border-base-100 p-4 bg-base-200 w-24 h-24 my-auto hover:opacity-80 cursor-pointer" onclick={selectAvatar} - onkeydown={(e) => - (e.key === "Enter" || e.key === " ") && selectAvatar()} + onkeydown={(e) => (e.key === "Enter" || e.key === " ") && selectAvatar()} role="button" tabindex="0" ></div> {/if} <div class="ml-2 p-2"> <!-- found missing translation --> - <button - type="button" - class="btn" - onclick={selectAvatar} - onkeydown={selectAvatar}>{$t("user.settings.select")}</button + <button type="button" class="btn" onclick={selectAvatar} onkeydown={selectAvatar} + >{$t("user.settings.select")}</button > <input type="file" @@ -156,12 +142,7 @@ </div> {#if $bannerStore || banner} - <button - type="button" - class="w-full" - onclick={selectBanner} - aria-label="Select banner" - > + <button type="button" class="w-full" onclick={selectBanner} aria-label="Select banner"> <img src={$bannerStore ? ($bannerStore as any).src : banner} class="w-full object-cover object-center visible overflow-hidden h-48 mb-4 hover:opacity-80" @@ -178,11 +159,8 @@ ></div> {/if} - <button - type="button" - class="btn !w-auto" - onclick={selectBanner} - onkeydown={selectBanner}>{$t("user.settings.select")}</button + <button type="button" class="btn !w-auto" onclick={selectBanner} onkeydown={selectBanner} + >{$t("user.settings.select")}</button > <input type="file" @@ -197,12 +175,7 @@ </div> <div> - <label for="about" class="font-bold mb-1 block" - >{$t("user.settings.about")}</label - > - <textarea - name="about" - bind:value={about} - placeholder={$t("user.settings.aboutPlaceholder")} + <label for="about" class="font-bold mb-1 block">{$t("user.settings.about")}</label> + <textarea name="about" bind:value={about} placeholder={$t("user.settings.aboutPlaceholder")} ></textarea> </div> diff --git a/src/routes/(app)/settings/security/+page.svelte b/src/routes/(app)/settings/security/+page.svelte index 193cd91b..cb9897a1 100644 --- a/src/routes/(app)/settings/security/+page.svelte +++ b/src/routes/(app)/settings/security/+page.svelte @@ -164,9 +164,7 @@ <div> <span class="font-bold mb-1" - >{verifying - ? $t("user.settings.verifyPIN") - : $t("user.settings.securityPIN")}</span + >{verifying ? $t("user.settings.verifyPIN") : $t("user.settings.securityPIN")}</span > <p class="text-secondary mb-1"> {$t("user.settings.securityPINDescription")} @@ -174,12 +172,7 @@ {#if verifying} <Pin bind:value={verify} {cancel} notify={false} /> {:else if settingPin} - <Pin - bind:value={pin} - title={$t("user.settings.setPIN")} - {cancel} - notify={false} - /> + <Pin bind:value={pin} title={$t("user.settings.setPIN")} {cancel} notify={false} /> {:else} <button type="button" class="btn" onclick={togglePin}> <iconify-icon @@ -187,9 +180,7 @@ icon={haspin ? "ph:lock-key-open-bold" : "ph:lock-key-bold"} width="32" ></iconify-icon> - {haspin - ? $t("user.settings.disablePIN") - : $t("user.settings.enablePIN")}</button + {haspin ? $t("user.settings.disablePIN") : $t("user.settings.enablePIN")}</button > {/if} </div> @@ -216,14 +207,12 @@ </button> {:else if user.twofa} <button type="button" class="btn" onclick={startDisabling2fa}> - <iconify-icon noobserver icon="ph:device-mobile-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:device-mobile-bold" width="32"></iconify-icon> <div class="my-auto">{$t("user.settings.twofaDisable")}</div> </button> {:else} <button type="button" class="btn" onclick={startEnabling2fa}> - <iconify-icon noobserver icon="ph:device-mobile-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:device-mobile-bold" width="32"></iconify-icon> <div class="my-auto">{$t("user.settings.twofaSetup")}</div> </button> {/if} @@ -236,8 +225,7 @@ <div> <a href={`/account/new`} class="contents"> <button class="btn btn-lg w-full rounded-2xl whitespace-nowrap"> - <iconify-icon noobserver icon="ph:plus-circle-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:plus-circle-bold" width="32"></iconify-icon> {$t("accounts.addAccount")} </button> </a> diff --git a/src/routes/(app)/thread/[id]/+page.svelte b/src/routes/(app)/thread/[id]/+page.svelte index a77e6e36..70397e17 100644 --- a/src/routes/(app)/thread/[id]/+page.svelte +++ b/src/routes/(app)/thread/[id]/+page.svelte @@ -6,9 +6,7 @@ </script> <div class="container px-4 max-w-xl mx-auto space-y-5"> - <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold"> - Thread - </h1> + <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold">Thread</h1> {#each thread as event} <Event {event} minimal={true} /> diff --git a/src/routes/(app)/verify/[code]/+page.svelte b/src/routes/(app)/verify/[code]/+page.svelte index 17ff858a..813c29e6 100644 --- a/src/routes/(app)/verify/[code]/+page.svelte +++ b/src/routes/(app)/verify/[code]/+page.svelte @@ -8,24 +8,14 @@ <div class="container px-4 text-center mx-auto"> {#if error} - <h1 class="text-3xl md:text-4xl font-bold mb-6"> - Email verification failed - </h1> + <h1 class="text-3xl md:text-4xl font-bold mb-6">Email verification failed</h1> {:else if user.verified} - <div - class="flex w-full py-5 max-w-[200px] mx-auto" - in:scale={{ start: 0.5 }} - > - <iconify-icon - noobserver - icon="ph:check-bold" - class="mx-auto w-full text-[#7ACC8F]" + <div class="flex w-full py-5 max-w-[200px] mx-auto" in:scale={{ start: 0.5 }}> + <iconify-icon noobserver icon="ph:check-bold" class="mx-auto w-full text-[#7ACC8F]" ></iconify-icon> </div> - <h1 class="text-3xl md:text-4xl font-bold mb-6"> - Email verified successfully! - </h1> + <h1 class="text-3xl md:text-4xl font-bold mb-6">Email verified successfully!</h1> {/if} </div> diff --git a/src/routes/(static)/+layout.svelte b/src/routes/(static)/+layout.svelte index a6f6d858..9c7f5e5e 100644 --- a/src/routes/(static)/+layout.svelte +++ b/src/routes/(static)/+layout.svelte @@ -16,10 +16,7 @@ <SvelteToast options={{ reversed: true, intro: { y: 192 } }} /> <LandingHeader {user} /> <Nostr /> -<main - class="container flex px-4 md:px-40 mx-auto min-h-[600px]" - data-theme={theme} -> +<main class="container flex px-4 md:px-40 mx-auto min-h-[600px]" data-theme={theme}> {@render children?.()} </main> <Footer /> diff --git a/src/routes/(static)/bounties/+page.svelte b/src/routes/(static)/bounties/+page.svelte index 3cc269dc..fad8c041 100644 --- a/src/routes/(static)/bounties/+page.svelte +++ b/src/routes/(static)/bounties/+page.svelte @@ -41,10 +41,7 @@ <div class="flex max-w-xs sm:max-w-xl"> <div>First {b}</div> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300 ml-auto" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300 ml-auto" ></iconify-icon>{s(100000, "en-CA")} </div> {/each} @@ -57,10 +54,7 @@ <div class="flex max-w-xs sm:max-w-xl"> <div>{b.type}</div> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300 ml-auto" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300 ml-auto" ></iconify-icon>{s(b.amount, "en-CA")} </div> {/each} @@ -85,9 +79,7 @@ class="whitespace-wrap text-base font-semibold max-w-[150px] truncate sm:max-w-full" title={merchant.display || merchant.username} > - <a href={`/${merchant.username}`} - >{merchant.display || merchant.username}</a - > + <a href={`/${merchant.username}`}>{merchant.display || merchant.username}</a> </h3> <span @@ -102,17 +94,12 @@ class="mt-2 flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-300 min-w-0" > <Avatar {user} size={8} class="shrink-0" /> - <span class="truncate max-w-full" - >Referred by @{user.username}</span - > + <span class="truncate max-w-full">Referred by @{user.username}</span> </div> </div> <div class="ml-auto flex shrink-0 items-center gap-1 whitespace"> - <iconify-icon - noobserver - icon="ph:lightning-fill" - class="text-yellow-300" + <iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300" ></iconify-icon> <span class="text-sm font-semibold tabular-nums"> {s(amount, "en-CA")} @@ -145,38 +132,32 @@ </ul> <p> - 25% of the bounty will be awarded once the business is ready to take - payments and has been announced + 25% of the bounty will be awarded once the business is ready to take payments and has been + announced </p> - <p> - The rest will be awarded once they've been accepting Bitcoin for 6 months - </p> + <p>The rest will be awarded once they've been accepting Bitcoin for 6 months</p> <p>Bounties will be awarded at our discretion</p> - <p> - We reserve the right to refuse applicants and change these terms without - cause or notice - </p> + <p>We reserve the right to refuse applicants and change these terms without cause or notice</p> <h2 class="text-2xl font-bold">Get Started!</h2> <p> - Reach out to <a - href="mailto:[email protected]" - class="text-blue-600 hover:underline">[email protected]</a + Reach out to <a href="mailto:[email protected]" class="text-blue-600 hover:underline" + >[email protected]</a > and let us know who we should contact </p> <p> - We'll update this page as the bounties are claimed so you'll be able to see - which ones are still available. + We'll update this page as the bounties are claimed so you'll be able to see which ones are still + available. </p> <p> - Have a lead or idea for something that's not on the list? Reach out! We - offer sats for all sorts of referrals! + Have a lead or idea for something that's not on the list? Reach out! We offer sats for all sorts + of referrals! </p> <p>Thanks for participating and helping to orange pill Vancouver!</p> diff --git a/src/routes/(static)/docs/+page.svelte b/src/routes/(static)/docs/+page.svelte index 51b1f54e..fc803158 100644 --- a/src/routes/(static)/docs/+page.svelte +++ b/src/routes/(static)/docs/+page.svelte @@ -11,20 +11,13 @@ ? `${PUBLIC_COINOS_URL}` : `https://${PUBLIC_DOMAIN}/api`; - let tokenSample = token - ? `export token="${token}"` - : `export token=<your auth token>`; + let tokenSample = token ? `export token="${token}"` : `export token=<your auth token>`; let roSample = `export token="${ro}"`; </script> {#snippet cp(something)} - <button - type="button" - class="ml-auto" - onclick={() => copy(something)} - aria-label="Copy value" - > + <button type="button" class="ml-auto" onclick={() => copy(something)} aria-label="Copy value"> <iconify-icon noobserver icon="ph:copy-bold" width="42"></iconify-icon> </button> {/snippet} @@ -40,17 +33,15 @@ </p> <p class="text-secondary"> - Coinos has a REST API that can be used to register accounts and make - payments. The following examples show how you can call the API with <a + Coinos has a REST API that can be used to register accounts and make payments. The following + examples show how you can call the API with <a href="https://curl.se/" class="text-secondary underline">curl</a > </p> <h2 class="text-2xl">API Base URL</h2> - <div - class="bg-primary text-primary-content rounded-lg p-4 flex gap-4 items-center" - > + <div class="bg-primary text-primary-content rounded-lg p-4 flex gap-4 items-center"> <div>{api}</div> {@render cp(api)} </div> @@ -60,38 +51,32 @@ {#if user && token} This token authorizes you to use the API as <b>{user.username}</b>. {:else} - <a href="/login" class="font-bold">Sign in</a> to view your auth token here, - or get one from the /login endpoint. + <a href="/login" class="font-bold">Sign in</a> to view your auth token here, or get one from the + /login endpoint. {/if} - Save it in a variable called <b>$token</b> to run the examples. It gives full - access to your account so keep it safe. + Save it in a variable called <b>$token</b> to run the examples. It gives full access to your account + so keep it safe. </p> - <div - class="bg-primary text-primary-content rounded-lg p-4 flex gap-4 items-center" - > + <div class="bg-primary text-primary-content rounded-lg p-4 flex gap-4 items-center"> <div class="w-full break-all">{tokenSample}</div> {@render cp(tokenSample)} </div> {#if ro} <p class="text-secondary"> - This read-only token has permission to create invoices and fetch payments - but can't be used to make withdrawals + This read-only token has permission to create invoices and fetch payments but can't be used to + make withdrawals </p> - <div - class="bg-primary text-primary-content rounded-lg p-4 flex gap-4 items-center" - > + <div class="bg-primary text-primary-content rounded-lg p-4 flex gap-4 items-center"> <div class="w-full break-all">{roSample}</div> {@render cp(roSample)} </div> {/if} <h2 class="text-2xl">POST /register</h2> - <p class="text-secondary"> - Register a new user account with a username and password - </p> + <p class="text-secondary">Register a new user account with a username and password</p> <Code sample="register" /> <h2 class="text-2xl">POST /login</h2> @@ -111,13 +96,9 @@ <div class="font-bold">display</div> <div class="col-span-2">string - spaces allowed</div> <div class="font-bold">currency</div> - <div class="col-span-2"> - string - three-letter ISO currency code e.g. CAD or USD - </div> + <div class="col-span-2">string - three-letter ISO currency code e.g. CAD or USD</div> <div class="font-bold">language</div> - <div class="col-span-2"> - string - two-letter language code e.g. en, fr, es - </div> + <div class="col-span-2">string - two-letter language code e.g. en, fr, es</div> </div> <Code sample="update" /> @@ -131,19 +112,13 @@ <div class="font-bold">type (string, default: lightning)</div> <div class="col-span-2">bitcoin or lightning</div> <div class="font-bold">fiat (boolean, default: false)</div> - <div class="col-span-2"> - whether the amount is denominated in satoshis or local currency - </div> + <div class="col-span-2">whether the amount is denominated in satoshis or local currency</div> <div class="font-bold">amount (numeric)</div> <div class="col-span-2">amount to be paid</div> <div class="font-bold">webhook (string, optional)</div> - <div class="col-span-2"> - remote endpoint to call when the invoice is paid - </div> + <div class="col-span-2">remote endpoint to call when the invoice is paid</div> <div class="font-bold">secret (string, optional)</div> - <div class="col-span-2"> - a secret value passed to the webhook to authenticate the request - </div> + <div class="col-span-2">a secret value passed to the webhook to authenticate the request</div> </div> </div> @@ -178,9 +153,7 @@ <Code sample="bitcoin" /> <h2 class="text-2xl">GET /payments</h2> - <p class="text-secondary"> - Get all payments sent or received by the current user - </p> + <p class="text-secondary">Get all payments sent or received by the current user</p> <div class="text-secondary"> <div>Query params</div> diff --git a/src/routes/(static)/forgot/+page.svelte b/src/routes/(static)/forgot/+page.svelte index 711c5568..82ea75a3 100644 --- a/src/routes/(static)/forgot/+page.svelte +++ b/src/routes/(static)/forgot/+page.svelte @@ -8,9 +8,7 @@ let loading; </script> -<div - class="mx-auto md:shadow-xl rounded-3xl max-w-xl w-full md:w-[480px] md:p-8 mb-20 space-y-5" -> +<div class="mx-auto md:shadow-xl rounded-3xl max-w-xl w-full md:w-[480px] md:p-8 mb-20 space-y-5"> <h1 class="text-2xl font-bold text-center">{$t("login.reset")}</h1> <div class="text-secondary"> diff --git a/src/routes/(static)/login/+page.svelte b/src/routes/(static)/login/+page.svelte index 08694cd8..7c9c29fc 100644 --- a/src/routes/(static)/login/+page.svelte +++ b/src/routes/(static)/login/+page.svelte @@ -45,8 +45,7 @@ onMount(() => { if (!isTor && recaptchaSiteKey) { let s = document.createElement("script"); - s.src = - "https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey; + s.src = "https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey; document.head.appendChild(s); } }); @@ -72,13 +71,9 @@ const getRecaptchaToken = () => new Promise((resolve, reject) => { if (isTor || !recaptchaSiteKey) return resolve(""); - if (!browser || !grecaptcha) - return reject(new Error("captcha unavailable")); + if (!browser || !grecaptcha) return reject(new Error("captcha unavailable")); grecaptcha.ready(() => { - grecaptcha - .execute(recaptchaSiteKey, { action: "login" }) - .then(resolve) - .catch(reject); + grecaptcha.execute(recaptchaSiteKey, { action: "login" }).then(resolve).catch(reject); }); }); @@ -108,9 +103,7 @@ }); }); - let redirect = $derived( - $loginRedirect || $page.url.searchParams.get("redirect"), - ); + let redirect = $derived($loginRedirect || $page.url.searchParams.get("redirect")); let nostrLogin = async () => { let event = { @@ -157,9 +150,7 @@ } const scriptSelector = - "script[src='https://www.google.com/recaptcha/api.js?render=" + - recaptchaSiteKey + - "']"; + "script[src='https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey + "']"; const script = document.querySelector(scriptSelector); if (script) { script.remove(); @@ -167,9 +158,7 @@ }); </script> -<div - class="mx-auto md:shadow-xl rounded-3xl max-w-xl w-full md:w-[480px] md:p-8 mb-20 space-y-5" -> +<div class="mx-auto md:shadow-xl rounded-3xl max-w-xl w-full md:w-[480px] md:p-8 mb-20 space-y-5"> <h1 class="text-2xl font-bold text-center">{$t("login.signIn")}</h1> {#if form?.error && !form?.message.includes("2fa")} <div class="text-red-600 text-center" in:fly> @@ -177,12 +166,7 @@ </div> {/if} - <form - use:enhance={enhanceLogin} - class="space-y-5" - method="POST" - action="?/login" - > + <form use:enhance={enhanceLogin} class="space-y-5" method="POST" action="?/login"> <input type="hidden" name="loginRedirect" value={redirect} /> <input type="hidden" name="token" value={token} /> @@ -205,12 +189,7 @@ > </div> - <button - type="submit" - class="btn btn-accent" - bind:this={btn} - data-testid="login-submit" - > + <button type="submit" class="btn btn-accent" bind:this={btn} data-testid="login-submit"> {$t("login.signIn")} </button> @@ -246,9 +225,7 @@ aria-labelledby="title" tabindex="-1" > - <div - class="mx-auto p-5 border shadow-lg rounded-md bg-base-100 space-y-5 max-w-lg" - > + <div class="mx-auto p-5 border shadow-lg rounded-md bg-base-100 space-y-5 max-w-lg"> <h1 id="title" class="text-center text-2xl font-semibold">2FA</h1> <Pinpad bind:v={token} {cancel} /> diff --git a/src/routes/(static)/privacy/+page.svelte b/src/routes/(static)/privacy/+page.svelte index 7b21a5be..ccbe8a92 100644 --- a/src/routes/(static)/privacy/+page.svelte +++ b/src/routes/(static)/privacy/+page.svelte @@ -2,15 +2,14 @@ <div class="text-2xl font-bold">Privacy Policy</div> <div> - The only personal information we require to create an account is a username - and password. Some users may provide an email address for notification or - password reset purposes. We will not share your email with anyone or use it - for anything other than the purposes stated. + The only personal information we require to create an account is a username and password. Some + users may provide an email address for notification or password reset purposes. We will not + share your email with anyone or use it for anything other than the purposes stated. </div> <div> - We keep records of payment history associated to accounts and may be - obligated to share our records with financial authorities. You may request - that your account be deleted by visiting https://coinos.io/removal + We keep records of payment history associated to accounts and may be obligated to share our + records with financial authorities. You may request that your account be deleted by visiting + https://coinos.io/removal </div> </div> diff --git a/src/routes/(static)/register/+page.svelte b/src/routes/(static)/register/+page.svelte index 0200b15b..f594244c 100644 --- a/src/routes/(static)/register/+page.svelte +++ b/src/routes/(static)/register/+page.svelte @@ -18,12 +18,7 @@ import { avatar, signer, password, pin, loginRedirect } from "$lib/store"; import { t } from "$lib/translations"; import { page } from "$app/stores"; - import { - NumberDictionary, - uniqueNamesGenerator, - colors, - animals, - } from "unique-names-generator"; + import { NumberDictionary, uniqueNamesGenerator, colors, animals } from "unique-names-generator"; import { sign } from "$lib/nostr"; let { form, data }: any = $props(); @@ -34,8 +29,7 @@ onMount(() => { if (!isTor && recaptchaSiteKey) { let s = document.createElement("script"); - s.src = - "https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey; + s.src = "https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey; document.head.appendChild(s); } }); @@ -109,13 +103,9 @@ const getRecaptchaToken = () => new Promise((resolve, reject) => { if (isTor) return resolve(""); - if (!browser || !grecaptcha) - return reject(new Error("captcha unavailable")); + if (!browser || !grecaptcha) return reject(new Error("captcha unavailable")); grecaptcha.ready(() => { - grecaptcha - .execute(recaptchaSiteKey, { action: "register" }) - .then(resolve) - .catch(reject); + grecaptcha.execute(recaptchaSiteKey, { action: "register" }).then(resolve).catch(reject); }); }); @@ -260,9 +250,7 @@ } const scriptSelector = - "script[src='https://www.google.com/recaptcha/api.js?render=" + - recaptchaSiteKey + - "']"; + "script[src='https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey + "']"; const script = document.querySelector(scriptSelector); if (script) { script.remove(); @@ -274,16 +262,9 @@ <Pin bind:value={token} title="Enter 2FA Code" {cancel} notify={false} /> {/if} -<div - class="mx-auto md:shadow-xl rounded-3xl max-w-xl w-full md:w-[480px] md:p-8 space-y-5 mb-20" -> +<div class="mx-auto md:shadow-xl rounded-3xl max-w-xl w-full md:w-[480px] md:p-8 space-y-5 mb-20"> <h1 class="text-2xl font-bold text-center">{$t("login.createAccount")}</h1> - <input - type="file" - class="hidden!" - bind:this={avatarInput} - onchange={(e: any) => handleFile(e)} - /> + <input type="file" class="hidden!" bind:this={avatarInput} onchange={(e: any) => handleFile(e)} /> <div class="relative"> <button @@ -291,8 +272,7 @@ onclick={decr} aria-label="Previous" > - <iconify-icon noobserver icon="ph:caret-left-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:caret-left-bold" width="32"></iconify-icon> </button> <button class="block relative w-32 mx-auto" onclick={selectAvatar}> <div @@ -304,11 +284,8 @@ alt={username} /> </div> - <div - class="absolute bg-base-100 rounded-full p-2 mx-auto right-0 bottom-0 z-10 w-12" - > - <iconify-icon noobserver icon="ph:upload-simple-bold" width="24" - ></iconify-icon> + <div class="absolute bg-base-100 rounded-full p-2 mx-auto right-0 bottom-0 z-10 w-12"> + <iconify-icon noobserver icon="ph:upload-simple-bold" width="24"></iconify-icon> </div> </button> <button @@ -316,8 +293,7 @@ onclick={incr} aria-label="Next" > - <iconify-icon noobserver icon="ph:caret-right-bold" width="32" - ></iconify-icon> + <iconify-icon noobserver icon="ph:caret-right-bold" width="32"></iconify-icon> </button> </div> @@ -337,10 +313,7 @@ <input type="hidden" name="token" value={token} /> <input type="hidden" name="challenge" value={challenge} /> - <label - for="username" - class="input flex items-center justify-center gap-2 w-full" - > + <label for="username" class="input flex items-center justify-center gap-2 w-full"> <input class="clean" use:focus @@ -352,15 +325,8 @@ autocapitalize="none" placeholder={$t("login.username")} /> - <button - type="button" - tabindex="-1" - onclick={refresh} - aria-label="Randomize" - class="contents" - > - <iconify-icon noobserver icon="ph:dice-three-bold" width="32" - ></iconify-icon></button + <button type="button" tabindex="-1" onclick={refresh} aria-label="Randomize" class="contents"> + <iconify-icon noobserver icon="ph:dice-three-bold" width="32"></iconify-icon></button > </label> @@ -370,12 +336,7 @@ bind:show={revealPassword} /> - <button - type="submit" - class="btn btn-accent" - disabled={loading} - bind:this={btn} - > + <button type="submit" class="btn btn-accent" disabled={loading} bind:this={btn}> {#if loading} <Spinner /> {:else} diff --git a/src/routes/(static)/removal/+page.svelte b/src/routes/(static)/removal/+page.svelte index 9ce4eab1..6cfc6d82 100644 --- a/src/routes/(static)/removal/+page.svelte +++ b/src/routes/(static)/removal/+page.svelte @@ -2,8 +2,8 @@ <div class="text-2xl font-bold">Data Removal</div> <div> - If you wish to delete your account and have your data removed, please add a - verified email address to your account and send an email from it to + If you wish to delete your account and have your data removed, please add a verified email + address to your account and send an email from it to <b>[email protected]</b> requesting that we delete your account data. </div> </div> diff --git a/src/routes/(static)/support/+page.svelte b/src/routes/(static)/support/+page.svelte index dd5439d5..8a7f55bf 100644 --- a/src/routes/(static)/support/+page.svelte +++ b/src/routes/(static)/support/+page.svelte @@ -23,8 +23,7 @@ onMount(() => { if (!isTor && recaptchaSiteKey) { let s = document.createElement("script"); - s.src = - "https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey; + s.src = "https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey; document.head.appendChild(s); } }); @@ -64,9 +63,7 @@ } const scriptSelector = - "script[src='https://www.google.com/recaptcha/api.js?render=" + - recaptchaSiteKey + - "']"; + "script[src='https://www.google.com/recaptcha/api.js?render=" + recaptchaSiteKey + "']"; const script = document.querySelector(scriptSelector); if (script) { script.remove(); @@ -77,9 +74,7 @@ <div class="container max-w-lg mx-auto space-y-8 p-4 pb-20"> {#if sent} <h1 class="text-center text-3xl lg:text-4xl font-semibold">Thank you!</h1> - <div class="text-center text-lg text-secondary"> - Someone will be in touch shortly. - </div> + <div class="text-center text-lg text-secondary">Someone will be in touch shortly.</div> <div> <a href={user ? `/${user.username}` : "/"}> @@ -102,25 +97,18 @@ <form onsubmit={submit}> <div class="mb-4"> - <label for="username" class="font-semibold" - >{$t("user.support.accountName")}</label - > + <label for="username" class="font-semibold">{$t("user.support.accountName")}</label> <input type="text" name="username" required bind:value={username} /> </div> <div class="mb-4"> - <label for="email" class="font-semibold" - >{$t("user.support.email")}</label - > + <label for="email" class="font-semibold">{$t("user.support.email")}</label> <input type="email" name="email" bind:value={email} required /> </div> <div class="mb-4"> - <label for="message" class="font-semibold" - >{$t("user.support.message")}</label - > - <textarea rows={5} name="message" bind:value={message} required - ></textarea> + <label for="message" class="font-semibold">{$t("user.support.message")}</label> + <textarea rows={5} name="message" bind:value={message} required></textarea> </div> <button diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index 9997183d..5e2c7fbd 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -1,8 +1,4 @@ -import { - defaultLocale, - loadTranslations, - locales, -} from "$lib/translations/index"; +import { defaultLocale, loadTranslations, locales } from "$lib/translations/index"; import { auth, get, isInvalidTokenError, sleep } from "$lib/utils"; import { redirect } from "@sveltejs/kit"; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 88454d85..71613871 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -63,10 +63,7 @@ window.AndroidNotch.getInsetBottom( (px) => { - document.documentElement.style.setProperty( - "--safe-area-inset-bottom", - 24 + "px", - ); + document.documentElement.style.setProperty("--safe-area-inset-bottom", 24 + "px"); }, (err) => { console.error("Failed to get bottom inset:", err); diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts index 1feee3e6..eee702d1 100644 --- a/src/routes/+layout.ts +++ b/src/routes/+layout.ts @@ -23,9 +23,7 @@ export const load = async ({ data }) => { let theme = cookies.get("theme"); if (!theme) { - theme = matchMedia("(prefers-color-scheme: dark)").matches - ? "dark" - : "light"; + theme = matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; cookies.set("theme", theme, opts); diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index ee73adfb..eee8e40c 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -34,11 +34,7 @@ description={$t("landing.info1.description")} /> - <LandingInfoCard - image="phone-checkout" - title={$t("landing.info2.title")} - order="reverse" - > + <LandingInfoCard image="phone-checkout" title={$t("landing.info2.title")} order="reverse"> {$t("landing.info2.description1")} <br /><br /> {$t("landing.info2.description2")} diff --git a/src/routes/phtest/+page.svelte b/src/routes/phtest/+page.svelte index f526d546..625f0465 100644 --- a/src/routes/phtest/+page.svelte +++ b/src/routes/phtest/+page.svelte @@ -1,3 +1 @@ -<a href="bitcoin:lnurl1dp68gurn8ghj7cm0d9hx7uewd9hj7up0v9kxjcm9lgkapg" - >Bitcoin link</a -> +<a href="bitcoin:lnurl1dp68gurn8ghj7cm0d9hx7uewd9hj7up0v9kxjcm9lgkapg">Bitcoin link</a> diff --git a/src/service-worker.js b/src/service-worker.js index 383f62d0..9d33d322 100644 --- a/src/service-worker.js +++ b/src/service-worker.js @@ -19,17 +19,15 @@ self.addEventListener("notificationclick", (event) => { const url = event.notification.data.url || "/"; event.waitUntil( - clients - .matchAll({ type: "window", includeUncontrolled: true }) - .then((clientList) => { - for (const client of clientList) { - if (client.url === url && "focus" in client) { - return client.focus(); - } + clients.matchAll({ type: "window", includeUncontrolled: true }).then((clientList) => { + for (const client of clientList) { + if (client.url === url && "focus" in client) { + return client.focus(); } - if (clients.openWindow) { - return clients.openWindow(url); - } - }), + } + if (clients.openWindow) { + return clients.openWindow(url); + } + }), ); }); diff --git a/svelte.config.js b/svelte.config.js index e8f19123..f39dc5d4 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -18,8 +18,7 @@ const config = { }, }, onwarn: (warning, handler) => { - if (warning.code.includes("caption") || warning.filename.includes("Toast")) - return; + if (warning.code.includes("caption") || warning.filename.includes("Toast")) return; handler(warning); }, }; diff --git a/test-ark-addr.mjs b/test-ark-addr.mjs index a980f75a..ff792d09 100644 --- a/test-ark-addr.mjs +++ b/test-ark-addr.mjs @@ -1,8 +1,7 @@ import { chromium } from "playwright"; const BASE = "http://172.18.0.9:3000"; -const ARK_KEY = - "1fed5c62c46ea3f72757e0baf1b83573ffd125eaba69a61c0f847c0d26d7b924"; +const ARK_KEY = "1fed5c62c46ea3f72757e0baf1b83573ffd125eaba69a61c0f847c0d26d7b924"; (async () => { const browser = await chromium.launch({ headless: true }); diff --git a/test-ark-create.mjs b/test-ark-create.mjs index 7fc9b24e..5e339b04 100644 --- a/test-ark-create.mjs +++ b/test-ark-create.mjs @@ -9,17 +9,13 @@ const API_KEY = "test-playwright-key"; const context = await browser.newContext({ ignoreHTTPSErrors: true }); const page = await context.newPage(); - page.on("console", (msg) => - console.log(`[browser:${msg.type()}]`, msg.text()), - ); + page.on("console", (msg) => console.log(`[browser:${msg.type()}]`, msg.text())); page.on("pageerror", (err) => console.log("[page error]", err.message)); page.on("request", (req) => { const u = req.url(); if (u.includes("account") || u.includes("arkade.computer")) { - console.log( - `[req] ${req.method()} ${u} ${req.postData()?.substring(0, 500) || ""}`, - ); + console.log(`[req] ${req.method()} ${u} ${req.postData()?.substring(0, 500) || ""}`); } }); page.on("response", (resp) => { @@ -27,9 +23,7 @@ const API_KEY = "test-playwright-key"; if (u.includes("account") && !u.includes("__data")) { resp .text() - .then((t) => - console.log(`[resp] ${resp.status()} ${u} -> ${t.substring(0, 500)}`), - ) + .then((t) => console.log(`[resp] ${resp.status()} ${u} -> ${t.substring(0, 500)}`)) .catch(() => {}); } }); @@ -45,9 +39,7 @@ const API_KEY = "test-playwright-key"; if (h.name.toLowerCase() === "set-cookie") { const m = h.value.match(/token=([^;]+)/); if (m) - await context.addCookies([ - { name: "token", value: m[1], domain: "172.18.0.9", path: "/" }, - ]); + await context.addCookies([{ name: "token", value: m[1], domain: "172.18.0.9", path: "/" }]); } } @@ -106,9 +98,7 @@ const API_KEY = "test-playwright-key"; console.log("\n--- Checking accounts ---"); const acctResp = await page.request.get(`${API}/accounts`, { headers: { - cookie: (await context.cookies()) - .map((c) => `${c.name}=${c.value}`) - .join("; "), + cookie: (await context.cookies()).map((c) => `${c.name}=${c.value}`).join("; "), }, }); const accounts = await acctResp.json(); diff --git a/test-ark-invoice.mjs b/test-ark-invoice.mjs index 887691ea..5bd59abb 100644 --- a/test-ark-invoice.mjs +++ b/test-ark-invoice.mjs @@ -9,20 +9,13 @@ const API_KEY = "test-playwright-key"; const context = await browser.newContext({ ignoreHTTPSErrors: true }); const page = await context.newPage(); - page.on("console", (msg) => - console.log(`[browser:${msg.type()}]`, msg.text()), - ); + page.on("console", (msg) => console.log(`[browser:${msg.type()}]`, msg.text())); page.on("pageerror", (err) => console.log("[page error]", err.message)); // Monitor relevant requests page.on("request", (req) => { const u = req.url(); - if ( - u.includes("ark") || - u.includes("sync") || - u.includes("invoice") || - u.includes("ws") - ) { + if (u.includes("ark") || u.includes("sync") || u.includes("invoice") || u.includes("ws")) { if ( !u.includes("__data") && !u.includes(".png") && @@ -35,16 +28,11 @@ const API_KEY = "test-playwright-key"; }); page.on("response", (resp) => { const u = resp.url(); - if ( - u.includes("ark/sync") || - (u.includes("invoice") && !u.includes("__data")) - ) { + if (u.includes("ark/sync") || (u.includes("invoice") && !u.includes("__data"))) { resp .text() .then((t) => - console.log( - `[resp] ${resp.status()} ${u.substring(0, 80)} -> ${t.substring(0, 300)}`, - ), + console.log(`[resp] ${resp.status()} ${u.substring(0, 80)} -> ${t.substring(0, 300)}`), ) .catch(() => {}); } diff --git a/test-ark-receive.mjs b/test-ark-receive.mjs index 44447c23..4e3fdc48 100644 --- a/test-ark-receive.mjs +++ b/test-ark-receive.mjs @@ -3,25 +3,20 @@ import { chromium } from "playwright"; const BASE = "http://172.18.0.9:3000"; const API = "http://172.18.0.12:3119"; const API_KEY = "test-playwright-key"; -const ARK_KEY = - "02b3ef049246a14b8a31e66f877dcb32be34945f270054ad97534af8e5ff75f0"; +const ARK_KEY = "02b3ef049246a14b8a31e66f877dcb32be34945f270054ad97534af8e5ff75f0"; (async () => { const browser = await chromium.launch({ headless: true }); const context = await browser.newContext({ ignoreHTTPSErrors: true }); const page = await context.newPage(); - page.on("console", (msg) => - console.log(`[browser:${msg.type()}]`, msg.text()), - ); + page.on("console", (msg) => console.log(`[browser:${msg.type()}]`, msg.text())); page.on("pageerror", (err) => console.log("[page error]", err.message)); page.on("request", (req) => { const u = req.url(); if (u.includes("ark") || u.includes("indexer") || u.includes("sync")) { - console.log( - `[req] ${req.method()} ${u} ${req.postData()?.substring(0, 500) || ""}`, - ); + console.log(`[req] ${req.method()} ${u} ${req.postData()?.substring(0, 500) || ""}`); } }); page.on("response", (resp) => { @@ -33,9 +28,7 @@ const ARK_KEY = ) { resp .text() - .then((t) => - console.log(`[resp] ${resp.status()} ${u} -> ${t.substring(0, 500)}`), - ) + .then((t) => console.log(`[resp] ${resp.status()} ${u} -> ${t.substring(0, 500)}`)) .catch(() => {}); } }); @@ -51,9 +44,7 @@ const ARK_KEY = if (h.name.toLowerCase() === "set-cookie") { const m = h.value.match(/token=([^;]+)/); if (m) - await context.addCookies([ - { name: "token", value: m[1], domain: "172.18.0.9", path: "/" }, - ]); + await context.addCookies([{ name: "token", value: m[1], domain: "172.18.0.9", path: "/" }]); } } @@ -76,9 +67,7 @@ const ARK_KEY = console.log("\n--- Checking accounts ---"); const acctResp = await page.request.get(`${API}/accounts`, { headers: { - cookie: (await context.cookies()) - .map((c) => `${c.name}=${c.value}`) - .join("; "), + cookie: (await context.cookies()).map((c) => `${c.name}=${c.value}`).join("; "), }, }); const accounts = await acctResp.json(); @@ -93,9 +82,7 @@ const ARK_KEY = console.log("\n--- Checking payments ---"); const payResp = await page.request.get(`${API}/payments`, { headers: { - cookie: (await context.cookies()) - .map((c) => `${c.name}=${c.value}`) - .join("; "), + cookie: (await context.cookies()).map((c) => `${c.name}=${c.value}`).join("; "), }, }); const payments = await payResp.json(); diff --git a/test-ark-sync.mjs b/test-ark-sync.mjs index b5b3655f..ce318e03 100644 --- a/test-ark-sync.mjs +++ b/test-ark-sync.mjs @@ -3,26 +3,21 @@ import { chromium } from "playwright"; const BASE = "http://172.18.0.9:3000"; const API = "http://172.18.0.12:3119"; const API_KEY = "test-playwright-key"; -const ARK_KEY = - "1fed5c62c46ea3f72757e0baf1b83573ffd125eaba69a61c0f847c0d26d7b924"; +const ARK_KEY = "1fed5c62c46ea3f72757e0baf1b83573ffd125eaba69a61c0f847c0d26d7b924"; (async () => { const browser = await chromium.launch({ headless: true }); const context = await browser.newContext({ ignoreHTTPSErrors: true }); const page = await context.newPage(); - page.on("console", (msg) => - console.log(`[browser:${msg.type()}]`, msg.text()), - ); + page.on("console", (msg) => console.log(`[browser:${msg.type()}]`, msg.text())); page.on("pageerror", (err) => console.log("[page error]", err.message)); // Monitor ALL arkade.computer requests page.on("request", (req) => { const u = req.url(); if (u.includes("arkade.computer")) { - console.log( - `[req] ${req.method()} ${u} ${req.postData()?.substring(0, 300) || ""}`, - ); + console.log(`[req] ${req.method()} ${u} ${req.postData()?.substring(0, 300) || ""}`); } }); page.on("response", (resp) => { @@ -30,9 +25,7 @@ const ARK_KEY = if (u.includes("arkade.computer") && !u.includes("subscription/")) { resp .text() - .then((t) => - console.log(`[resp] ${resp.status()} ${u} -> ${t.substring(0, 500)}`), - ); + .then((t) => console.log(`[resp] ${resp.status()} ${u} -> ${t.substring(0, 500)}`)); } }); @@ -48,18 +41,13 @@ const ARK_KEY = if (h.name.toLowerCase() === "set-cookie") { const m = h.value.match(/token=([^;]+)/); if (m) - await context.addCookies([ - { name: "token", value: m[1], domain: "172.18.0.9", path: "/" }, - ]); + await context.addCookies([{ name: "token", value: m[1], domain: "172.18.0.9", path: "/" }]); } } // 2. Go to bob's page, set arkkey await page.goto(`${BASE}/bob`, { waitUntil: "domcontentloaded" }); - await page.evaluate( - (key) => localStorage.setItem("arkkey", JSON.stringify(key)), - ARK_KEY, - ); + await page.evaluate((key) => localStorage.setItem("arkkey", JSON.stringify(key)), ARK_KEY); // 3. Reload — don't wait for networkidle since SSE subscription stays open console.log("--- Reloading with arkkey ---"); @@ -74,9 +62,7 @@ const ARK_KEY = const accountsData = await page.request.get(`${API}/accounts`, { headers: { "x-api-key": API_KEY, - cookie: (await context.cookies()) - .map((c) => `${c.name}=${c.value}`) - .join("; "), + cookie: (await context.cookies()).map((c) => `${c.name}=${c.value}`).join("; "), }, }); console.log("Accounts:", (await accountsData.text()).substring(0, 500)); diff --git a/test/e2e/ark-receive-from-server-wallet.spec.ts b/test/e2e/ark-receive-from-server-wallet.spec.ts index 066e776e..bb7acb7b 100644 --- a/test/e2e/ark-receive-from-server-wallet.spec.ts +++ b/test/e2e/ark-receive-from-server-wallet.spec.ts @@ -6,9 +6,7 @@ const testSecret = process.env.E2E_TEST_SECRET; const apiBaseUrl = process.env.E2E_API_BASE_URL || "http://localhost:3119"; const pauseAtEnd = process.env.E2E_PAUSE_AT_END === "true"; -test("bob receives 1000 sats in ark vault after server wallet send", async ({ - page, -}) => { +test("bob receives 1000 sats in ark vault after server wallet send", async ({ page }) => { test.setTimeout(90_000); test.skip(!testSecret, "E2E_TEST_SECRET is required for /test/ark/send"); @@ -19,9 +17,7 @@ test("bob receives 1000 sats in ark vault after server wallet send", async ({ await expect(page).toHaveURL(new RegExp(`/${username}(?:[/?#]|$)`)); - const arkAccountCard = page.locator( - '[data-testid="account-card"][data-account-type="ark"]', - ); + const arkAccountCard = page.locator('[data-testid="account-card"][data-account-type="ark"]'); const arkAccountCount = await arkAccountCard.count(); expect(arkAccountCount).toBeGreaterThan(0); @@ -32,10 +28,7 @@ test("bob receives 1000 sats in ark vault after server wallet send", async ({ for (let i = 0; i < arkAccountCount; i++) { const card = arkAccountCard.nth(i); await card.scrollIntoViewIfNeeded(); - const accountHref = await card - .locator('a[href^="/account/"]') - .first() - .getAttribute("href"); + const accountHref = await card.locator('a[href^="/account/"]').first().getAttribute("href"); const accountId = accountHref?.split("/account/")[1]; await card.locator('a[href="/invoice"]').first().click(); @@ -84,9 +77,7 @@ test("bob receives 1000 sats in ark vault after server wallet send", async ({ expect(invoiceOpened).toBeTruthy(); await expect(page).toHaveURL(/\/invoice\/[^/?#]+/); - const invoiceText = ( - await page.getByTestId("invoice-text").first().innerText() - ).trim(); + const invoiceText = (await page.getByTestId("invoice-text").first().innerText()).trim(); const addressMatch = invoiceText.match(/t?ark1[a-z0-9]+/i); expect(addressMatch).toBeTruthy(); const address = addressMatch![0]; @@ -118,9 +109,7 @@ test("bob receives 1000 sats in ark vault after server wallet send", async ({ let status: any; for (let i = 0; i < 30; i++) { - const statusResponse = await page.request.get( - `${apiBaseUrl}/invoice/${invoiceId}`, - ); + const statusResponse = await page.request.get(`${apiBaseUrl}/invoice/${invoiceId}`); if (statusResponse.ok()) { status = await statusResponse.json(); if ((status?.received || 0) >= 1000 || (status?.pending || 0) >= 1000) { diff --git a/test/unified-seed.test.ts b/test/unified-seed.test.ts index e3c4dd31..4410dbea 100644 --- a/test/unified-seed.test.ts +++ b/test/unified-seed.test.ts @@ -95,9 +95,7 @@ describe("unified master seed", () => { const btcChild = master.derive("m/84'/0'/0'"); const arkChild = master.derive("m/86'/0'/0'/0/0"); - expect(bytesToHex(btcChild.privateKey!)).not.toBe( - bytesToHex(arkChild.privateKey!), - ); + expect(bytesToHex(btcChild.privateKey!)).not.toBe(bytesToHex(arkChild.privateKey!)); }); }); @@ -127,9 +125,7 @@ describe("full encrypt-derive-sign flow", () => { const recoveredChild = recoveredMaster.derive("m/84'/0'/0'"); expect(recoveredChild.publicExtendedKey).toBe(pubkey); - expect(bytesToHex(recoveredChild.privateKey!)).toBe( - bytesToHex(btcChild.privateKey!), - ); + expect(bytesToHex(recoveredChild.privateKey!)).toBe(bytesToHex(btcChild.privateKey!)); }); it("simulates Ark unlock from user.seed", async () => { @@ -187,9 +183,7 @@ describe("full encrypt-derive-sign flow", () => { describe("backward compatibility", () => { it("legacy per-account seed (raw hex) decrypts differently than mnemonic entropy", async () => { // Legacy: encrypt raw 32-byte hex key - const rawKey = hexToBytes( - "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - ); + const rawKey = hexToBytes("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); const legacySeed = await encrypt(rawKey, password); // Decrypt legacy seed — get raw bytes back diff --git a/vite.config.js b/vite.config.js index 1ab49ed2..e567872e 100644 --- a/vite.config.js +++ b/vite.config.js @@ -49,9 +49,7 @@ export default defineConfig(({ mode }) => { manualChunks(id) { if (id.includes("node_modules")) { const parts = id.split("node_modules/")[1].split("/"); - const pkg = parts[0].startsWith("@") - ? `${parts[0].slice(1)}-${parts[1]}` - : parts[0]; + const pkg = parts[0].startsWith("@") ? `${parts[0].slice(1)}-${parts[1]}` : parts[0]; return `vendor-${pkg}`; } }, |
