Compare commits

..

3 Commits

Author SHA1 Message Date
Samuel Andert
c13047e281 some minor ux impros 2023-09-02 14:10:46 +02:00
Samuel Andert
61ba4d0e4f Re-adding signing capabilities and adding better UI 2023-09-02 13:26:05 +02:00
Samuel Andert
9b9ac7d89e added Tauri native desktop app support 2023-09-02 11:31:05 +02:00
35 changed files with 4147 additions and 60 deletions

View File

@ -16,11 +16,16 @@
"devDependencies": {
"@fontsource/fira-mono": "^4.5.10",
"@neoconfetti/svelte": "^1.0.0",
"@skeletonlabs/skeleton": "^2.0.0",
"@skeletonlabs/tw-plugin": "^0.1.0",
"@sveltejs/adapter-auto": "^2.0.0",
"@sveltejs/adapter-static": "^2.0.3",
"@sveltejs/kit": "^1.5.0",
"@tauri-apps/cli": "^1.4.0",
"@types/cookie": "^0.5.1",
"@types/js-cookie": "^3.0.3",
"@types/jsonwebtoken": "^9.0.2",
"@types/node": "^20.5.8",
"autoprefixer": "^10.4.15",
"concurrently": "^7.6.0",
"postcss": "^8.4.29",
@ -33,6 +38,7 @@
"wait-on": "^7.0.1"
},
"dependencies": {
"@floating-ui/dom": "^1.5.1",
"@graphql-tools/graphql-file-loader": "^8.0.0",
"@graphql-tools/load": "^8.0.0",
"@iconify/icons-ion": "^1.2.10",

View File

@ -1,6 +1,9 @@
lockfileVersion: '6.0'
dependencies:
'@floating-ui/dom':
specifier: ^1.5.1
version: 1.5.1
'@graphql-tools/graphql-file-loader':
specifier: ^8.0.0
version: 8.0.0(graphql@16.8.0)
@ -93,12 +96,24 @@ devDependencies:
'@neoconfetti/svelte':
specifier: ^1.0.0
version: 1.0.0
'@skeletonlabs/skeleton':
specifier: ^2.0.0
version: 2.0.0(svelte@3.54.0)
'@skeletonlabs/tw-plugin':
specifier: ^0.1.0
version: 0.1.0(tailwindcss@3.3.3)
'@sveltejs/adapter-auto':
specifier: ^2.0.0
version: 2.0.0(@sveltejs/kit@1.5.0)
'@sveltejs/adapter-static':
specifier: ^2.0.3
version: 2.0.3(@sveltejs/kit@1.5.0)
'@sveltejs/kit':
specifier: ^1.5.0
version: 1.5.0(svelte@3.54.0)(vite@4.2.0)
'@tauri-apps/cli':
specifier: ^1.4.0
version: 1.4.0
'@types/cookie':
specifier: ^0.5.1
version: 0.5.1
@ -108,6 +123,9 @@ devDependencies:
'@types/jsonwebtoken':
specifier: ^9.0.2
version: 9.0.2
'@types/node':
specifier: ^20.5.8
version: 20.5.8
autoprefixer:
specifier: ^10.4.15
version: 10.4.15(postcss@8.4.29)
@ -134,7 +152,7 @@ devDependencies:
version: 5.0.2
vite:
specifier: ^4.2.0
version: 4.2.0(@types/node@16.18.46)
version: 4.2.0(@types/node@20.5.8)
wait-on:
specifier: ^7.0.1
version: 7.0.1
@ -445,6 +463,7 @@ packages:
/@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.11):
resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==}
engines: {node: '>=6.9.0'}
deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
@ -458,6 +477,7 @@ packages:
/@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.11):
resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==}
engines: {node: '>=6.9.0'}
deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
@ -480,6 +500,7 @@ packages:
/@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.11):
resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==}
engines: {node: '>=6.9.0'}
deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
@ -491,6 +512,7 @@ packages:
/@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.11):
resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==}
engines: {node: '>=6.9.0'}
deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
@ -502,6 +524,7 @@ packages:
/@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.11):
resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==}
engines: {node: '>=6.9.0'}
deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
@ -516,6 +539,7 @@ packages:
/@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.22.11):
resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==}
engines: {node: '>=6.9.0'}
deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
@ -527,6 +551,7 @@ packages:
/@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.11):
resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==}
engines: {node: '>=6.9.0'}
deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
@ -2289,6 +2314,23 @@ packages:
fastify-plugin: 4.5.1
dev: false
/@floating-ui/core@1.4.1:
resolution: {integrity: sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==}
dependencies:
'@floating-ui/utils': 0.1.1
dev: false
/@floating-ui/dom@1.5.1:
resolution: {integrity: sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==}
dependencies:
'@floating-ui/core': 1.4.1
'@floating-ui/utils': 0.1.1
dev: false
/@floating-ui/utils@0.1.1:
resolution: {integrity: sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==}
dev: false
/@fontsource/fira-mono@4.5.10:
resolution: {integrity: sha512-bxUnRP8xptGRo8YXeY073DSpfK74XpSb0ZyRNpHV9WvLnJ7TwPOjZll8hTMin7zLC6iOp59pDZ8EQDj1gzgAQQ==}
dev: true
@ -2680,7 +2722,7 @@ packages:
dependencies:
'@jest/fake-timers': 29.6.4
'@jest/types': 29.6.3
'@types/node': 20.5.6
'@types/node': 20.5.8
jest-mock: 29.6.3
dev: false
@ -2690,7 +2732,7 @@ packages:
dependencies:
'@jest/types': 29.6.3
'@sinonjs/fake-timers': 10.3.0
'@types/node': 20.5.6
'@types/node': 20.5.8
jest-message-util: 29.6.3
jest-mock: 29.6.3
jest-util: 29.6.3
@ -2709,7 +2751,7 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
'@types/node': 20.5.6
'@types/node': 20.5.8
'@types/yargs': 15.0.15
chalk: 4.1.2
dev: false
@ -2720,7 +2762,7 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
'@types/node': 20.5.6
'@types/node': 20.5.8
'@types/yargs': 16.0.5
chalk: 4.1.2
dev: false
@ -2732,7 +2774,7 @@ packages:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
'@types/node': 20.5.6
'@types/node': 20.5.8
'@types/yargs': 17.0.24
chalk: 4.1.2
dev: false
@ -4310,6 +4352,23 @@ packages:
'@sinonjs/commons': 3.0.0
dev: false
/@skeletonlabs/skeleton@2.0.0(svelte@3.54.0):
resolution: {integrity: sha512-8SaDK3kEUU57cSb/5a984EbINgnOPzShlkwPkduAhqc71SEqhRvx+RlLEpe1174NAYi00oi//LguIAYuVrSfBA==}
peerDependencies:
svelte: ^3.56.0 || ^4.0.0
dependencies:
esm-env: 1.0.0
svelte: 3.54.0
dev: true
/@skeletonlabs/tw-plugin@0.1.0(tailwindcss@3.3.3):
resolution: {integrity: sha512-ufnm4FS+s/khuho4yJ/uqfW91u2YXnH3E5N541MtX9XjmoimQzYIcxWyTIuX9AM/brIPP6M6l0et3nRx17CRoQ==}
peerDependencies:
tailwindcss: '>=3.0.0'
dependencies:
tailwindcss: 3.3.3
dev: true
/@solana/buffer-layout@4.0.1:
resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==}
engines: {node: '>=5.10'}
@ -4481,6 +4540,14 @@ packages:
import-meta-resolve: 2.2.2
dev: true
/@sveltejs/adapter-static@2.0.3(@sveltejs/kit@1.5.0):
resolution: {integrity: sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==}
peerDependencies:
'@sveltejs/kit': ^1.5.0
dependencies:
'@sveltejs/kit': 1.5.0(svelte@3.54.0)(vite@4.2.0)
dev: true
/@sveltejs/kit@1.5.0(svelte@3.54.0)(vite@4.2.0):
resolution: {integrity: sha512-AkWgCO9i2djZjTqCgIQJ5XfnSzRINowh2w2Gk9wDRuTwxKizSuYe3jNvds/HCDDGHo8XE5E0yWNC9j2XxbrX+g==}
engines: {node: ^16.14 || >=18}
@ -4504,7 +4571,7 @@ packages:
svelte: 3.54.0
tiny-glob: 0.2.9
undici: 5.18.0
vite: 4.2.0(@types/node@16.18.46)
vite: 4.2.0(@types/node@20.5.8)
transitivePeerDependencies:
- supports-color
dev: true
@ -4520,7 +4587,7 @@ packages:
'@sveltejs/vite-plugin-svelte': 2.4.5(svelte@3.54.0)(vite@4.2.0)
debug: 4.3.4
svelte: 3.54.0
vite: 4.2.0(@types/node@16.18.46)
vite: 4.2.0(@types/node@20.5.8)
transitivePeerDependencies:
- supports-color
dev: true
@ -4539,7 +4606,7 @@ packages:
magic-string: 0.30.3
svelte: 3.54.0
svelte-hmr: 0.15.3(svelte@3.54.0)
vite: 4.2.0(@types/node@16.18.46)
vite: 4.2.0(@types/node@20.5.8)
vitefu: 0.2.4(vite@4.2.0)
transitivePeerDependencies:
- supports-color
@ -4558,6 +4625,113 @@ packages:
svelte: 3.54.0
dev: false
/@tauri-apps/cli-darwin-arm64@1.4.0:
resolution: {integrity: sha512-nA/ml0SfUt6/CYLVbHmT500Y+ijqsuv5+s9EBnVXYSLVg9kbPUZJJHluEYK+xKuOj6xzyuT/+rZFMRapmJD3jQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@tauri-apps/cli-darwin-x64@1.4.0:
resolution: {integrity: sha512-ov/F6Zr+dg9B0PtRu65stFo2G0ow2TUlneqYYrkj+vA3n+moWDHfVty0raDjMLQbQt3rv3uayFMXGPMgble9OA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@tauri-apps/cli-linux-arm-gnueabihf@1.4.0:
resolution: {integrity: sha512-zwjbiMncycXDV7doovymyKD7sCg53ouAmfgpUqEBOTY3vgBi9TwijyPhJOqoG5vUVWhouNBC08akGmE4dja15g==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@tauri-apps/cli-linux-arm64-gnu@1.4.0:
resolution: {integrity: sha512-5MCBcziqXC72mMXnkZU68mutXIR6zavDxopArE2gQtK841IlE06bIgtLi0kUUhlFJk2nhPRgiDgdLbrPlyt7fw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@tauri-apps/cli-linux-arm64-musl@1.4.0:
resolution: {integrity: sha512-7J3pRB6n6uNYgIfCeKt2Oz8J7oSaz2s8GGFRRH2HPxuTHrBNCinzVYm68UhVpJrL3bnGkU0ziVZLsW/iaOGfUg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@tauri-apps/cli-linux-x64-gnu@1.4.0:
resolution: {integrity: sha512-Zh5gfAJxOv5AVWxcwuueaQ2vIAhlg0d6nZui6nMyfIJ8dbf3aZQ5ZzP38sYow5h/fbvgL+3GSQxZRBIa3c2E1w==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@tauri-apps/cli-linux-x64-musl@1.4.0:
resolution: {integrity: sha512-OLAYoICU3FaYiTdBsI+lQTKnDHeMmFMXIApN0M+xGiOkoIOQcV9CConMPjgmJQ867+NHRNgUGlvBEAh9CiJodQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@tauri-apps/cli-win32-arm64-msvc@1.4.0:
resolution: {integrity: sha512-gZ05GENFbI6CB5MlOUsLlU0kZ9UtHn9riYtSXKT6MYs8HSPRffPHaHSL0WxsJweWh9nR5Hgh/TUU8uW3sYCzCg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@tauri-apps/cli-win32-ia32-msvc@1.4.0:
resolution: {integrity: sha512-JsetT/lTx/Zq98eo8T5CiRyF1nKeX04RO8JlJrI3ZOYsZpp/A5RJvMd/szQ17iOzwiHdge+tx7k2jHysR6oBlQ==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@tauri-apps/cli-win32-x64-msvc@1.4.0:
resolution: {integrity: sha512-z8Olcnwp5aYhzqUAarFjqF+oELCjuYWnB2HAJHlfsYNfDCAORY5kct3Fklz8PSsubC3U2EugWn8n42DwnThurg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@tauri-apps/cli@1.4.0:
resolution: {integrity: sha512-VXYr2i2iVFl98etQSQsqLzXgX96bnWiNZd1YADgatqwy/qecbd6Kl5ZAPB5R4ynsgE8A1gU7Fbzh7dCEQYFfmA==}
engines: {node: '>= 10'}
hasBin: true
optionalDependencies:
'@tauri-apps/cli-darwin-arm64': 1.4.0
'@tauri-apps/cli-darwin-x64': 1.4.0
'@tauri-apps/cli-linux-arm-gnueabihf': 1.4.0
'@tauri-apps/cli-linux-arm64-gnu': 1.4.0
'@tauri-apps/cli-linux-arm64-musl': 1.4.0
'@tauri-apps/cli-linux-x64-gnu': 1.4.0
'@tauri-apps/cli-linux-x64-musl': 1.4.0
'@tauri-apps/cli-win32-arm64-msvc': 1.4.0
'@tauri-apps/cli-win32-ia32-msvc': 1.4.0
'@tauri-apps/cli-win32-x64-msvc': 1.4.0
dev: true
/@timkendall/tql@1.0.0-rc.8(graphql@16.8.0):
resolution: {integrity: sha512-uJUAYCAGqtBJ/qdF6zjS+BPH6gmgTddyEAmH6bFqRLagDBieI3+GOC1zVTOPItiqY5DVP+hnbWfnVYQOqPTTvA==}
peerDependencies:
@ -4588,7 +4762,7 @@ packages:
resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
dependencies:
'@types/connect': 3.4.35
'@types/node': 20.5.6
'@types/node': 20.5.8
dev: false
/@types/common-tags@1.8.1:
@ -4598,7 +4772,7 @@ packages:
/@types/connect@3.4.35:
resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==}
dependencies:
'@types/node': 20.5.6
'@types/node': 20.5.8
dev: false
/@types/cookie@0.5.1:
@ -4608,7 +4782,7 @@ packages:
/@types/cross-spawn@6.0.2:
resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==}
dependencies:
'@types/node': 20.5.6
'@types/node': 20.5.8
dev: false
/@types/debug@4.1.7:
@ -4620,7 +4794,7 @@ packages:
/@types/express-serve-static-core@4.17.36:
resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==}
dependencies:
'@types/node': 20.5.6
'@types/node': 20.5.8
'@types/qs': 6.9.7
'@types/range-parser': 1.2.4
'@types/send': 0.17.1
@ -4639,7 +4813,7 @@ packages:
resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
dependencies:
'@types/minimatch': 5.1.2
'@types/node': 20.5.6
'@types/node': 20.5.8
dev: false
/@types/http-errors@2.0.1:
@ -4677,7 +4851,7 @@ packages:
/@types/jsonwebtoken@9.0.2:
resolution: {integrity: sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==}
dependencies:
'@types/node': 20.5.6
'@types/node': 20.5.8
/@types/lodash@4.14.197:
resolution: {integrity: sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==}
@ -4717,13 +4891,14 @@ packages:
/@types/node@16.18.46:
resolution: {integrity: sha512-Mnq3O9Xz52exs3mlxMcQuA7/9VFe/dXcrgAyfjLkABIqxXKOgBRjyazTxUbjsxDa4BP7hhPliyjVTP9RDP14xg==}
dev: false
/@types/node@18.15.13:
resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==}
dev: false
/@types/node@20.5.6:
resolution: {integrity: sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==}
/@types/node@20.5.8:
resolution: {integrity: sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==}
/@types/prettier@2.7.3:
resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==}
@ -4745,7 +4920,7 @@ packages:
resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==}
dependencies:
'@types/mime': 1.3.2
'@types/node': 20.5.6
'@types/node': 20.5.8
dev: false
/@types/serve-static@1.15.2:
@ -4753,7 +4928,7 @@ packages:
dependencies:
'@types/http-errors': 2.0.1
'@types/mime': 3.0.1
'@types/node': 20.5.6
'@types/node': 20.5.8
dev: false
/@types/stack-utils@2.0.1:
@ -4767,13 +4942,13 @@ packages:
/@types/ws@7.4.7:
resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
dependencies:
'@types/node': 20.5.6
'@types/node': 20.5.8
dev: false
/@types/ws@8.5.5:
resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==}
dependencies:
'@types/node': 20.5.6
'@types/node': 20.5.8
dev: false
/@types/yargs-parser@21.0.0:
@ -8135,7 +8310,7 @@ packages:
'@jest/environment': 29.6.4
'@jest/fake-timers': 29.6.4
'@jest/types': 29.6.3
'@types/node': 20.5.6
'@types/node': 20.5.8
jest-mock: 29.6.3
jest-util: 29.6.3
dev: false
@ -8165,7 +8340,7 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@jest/types': 29.6.3
'@types/node': 20.5.6
'@types/node': 20.5.8
jest-util: 29.6.3
dev: false
@ -8179,7 +8354,7 @@ packages:
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dependencies:
'@jest/types': 27.5.1
'@types/node': 20.5.6
'@types/node': 20.5.8
chalk: 4.1.2
ci-info: 3.8.0
graceful-fs: 4.2.11
@ -8191,7 +8366,7 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@jest/types': 29.6.3
'@types/node': 20.5.6
'@types/node': 20.5.8
chalk: 4.1.2
ci-info: 3.8.0
graceful-fs: 4.2.11
@ -8214,7 +8389,7 @@ packages:
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
engines: {node: '>= 10.13.0'}
dependencies:
'@types/node': 20.5.6
'@types/node': 20.5.8
merge-stream: 2.0.0
supports-color: 8.1.1
dev: false
@ -10067,7 +10242,7 @@ packages:
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/long': 4.0.2
'@types/node': 20.5.6
'@types/node': 20.5.8
long: 4.0.0
dev: false
@ -10086,7 +10261,7 @@ packages:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/node': 20.5.6
'@types/node': 20.5.8
long: 5.2.3
dev: false
@ -11853,7 +12028,7 @@ packages:
- zod
dev: false
/vite@4.2.0(@types/node@16.18.46):
/vite@4.2.0(@types/node@20.5.8):
resolution: {integrity: sha512-AbDTyzzwuKoRtMIRLGNxhLRuv1FpRgdIw+1y6AQG73Q5+vtecmvzKo/yk8X/vrHDpETRTx01ABijqUHIzBXi0g==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@ -11878,7 +12053,7 @@ packages:
terser:
optional: true
dependencies:
'@types/node': 16.18.46
'@types/node': 20.5.8
esbuild: 0.17.19
postcss: 8.4.29
resolve: 1.22.4
@ -11895,7 +12070,7 @@ packages:
vite:
optional: true
dependencies:
vite: 4.2.0(@types/node@16.18.46)
vite: 4.2.0(@types/node@20.5.8)
dev: true
/vlq@1.0.1:

3
src-tauri/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# Generated by Cargo
# will have compiled files and executables
/target/

3510
src-tauri/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

26
src-tauri/Cargo.toml Normal file
View File

@ -0,0 +1,26 @@
[package]
name = "app"
version = "0.1.0"
description = "A Tauri App"
authors = ["you"]
license = ""
repository = ""
default-run = "app"
edition = "2021"
rust-version = "1.60"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies]
tauri-build = { version = "1.4.0", features = [] }
[dependencies]
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
tauri = { version = "1.4.0", features = [] }
[features]
# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled.
# If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes.
# DO NOT REMOVE!!
custom-protocol = [ "tauri/custom-protocol" ]

3
src-tauri/build.rs Normal file
View File

@ -0,0 +1,3 @@
fn main() {
tauri_build::build()
}

BIN
src-tauri/icons/128x128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
src-tauri/icons/32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
src-tauri/icons/icon.icns Normal file

Binary file not shown.

BIN
src-tauri/icons/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
src-tauri/icons/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

8
src-tauri/src/main.rs Normal file
View File

@ -0,0 +1,8 @@
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() {
tauri::Builder::default()
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

66
src-tauri/tauri.conf.json Normal file
View File

@ -0,0 +1,66 @@
{
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"build": {
"beforeBuildCommand": "pnpm run build",
"beforeDevCommand": "pnpm run dev",
"devPath": "http://localhost:3001",
"distDir": "../build"
},
"package": {
"productName": "°",
"version": "0.1.0"
},
"tauri": {
"allowlist": {
"all": false
},
"bundle": {
"active": true,
"category": "DeveloperTool",
"copyright": "",
"deb": {
"depends": []
},
"externalBin": [],
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
],
"identifier": "com.tauri.dev",
"longDescription": "",
"macOS": {
"entitlements": null,
"exceptionDomain": "",
"frameworks": [],
"providerShortName": null,
"signingIdentity": null
},
"resources": [],
"shortDescription": "",
"targets": "all",
"windows": {
"certificateThumbprint": null,
"digestAlgorithm": "sha256",
"timestampUrl": ""
}
},
"security": {
"csp": null
},
"updater": {
"active": false
},
"windows": [
{
"fullscreen": false,
"height": 600,
"resizable": true,
"title": "wundergraph-sveltekit°",
"width": 800
}
]
}
}

View File

@ -14,7 +14,7 @@
}
}
</script>
<body data-sveltekit-preload-data="hover">
<body data-theme="wintry" data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>

62
src/lib/Signer.svelte Normal file
View File

@ -0,0 +1,62 @@
<script lang="ts">
import { signMessageWithPKP } from "$lib/services/signMessage";
import { walletState, signRequest } from "$lib/stores.js";
let currentPKP;
let sessionSigs;
let message;
let signature;
let status = "WAITING FOR SIGNATURE";
walletState.subscribe((value) => {
currentPKP = value.pkps[0];
sessionSigs = value.sessionSigs;
});
signRequest.subscribe((value) => {
message = value.messageToSign;
signature = value.signature;
});
async function signMessage() {
const result = await signMessageWithPKP(sessionSigs, currentPKP, message);
if (result.error) {
console.error(result.error);
} else {
(status = "SIGNED"),
signRequest.set({
messageToSign: message,
signature: result.messageSignature,
drawer: true,
});
}
}
function declineSign() {
signRequest.set({
messageToSign: {},
signature: null,
drawer: false,
});
}
</script>
<div class="flex flex-col items-center justify-center h-full space-y-4">
<p class="text-sm font-bold">{status}</p>
<p class="text-lg break-words max-w-2/3">{JSON.stringify(message)}</p>
{#if signature}
<p class="text-sm font-bold break-words">
Signature: {JSON.stringify(signature)}
</p>
{/if}
<div
class="absolute bottom-0 flex items-center justify-center w-full pb-4 space-x-4"
>
<button on:click={declineSign} class="btn variant-filled-error"
>Decline</button
>
<button on:click={signMessage} class="btn variant-filled-success"
>Sign</button
>
</div>
</div>

120
src/lib/SignerOLD.svelte Normal file
View File

@ -0,0 +1,120 @@
<!-- SignVerifyMessage.svelte -->
<script lang="ts">
import { ethers } from "ethers";
import { onMount } from "svelte";
import { signRequest, signedMessages } from "./stores.js";
let messageToSign = {};
let currentPKP;
let sessionSigs;
let status = "";
let litNodeClient;
let messageSignature;
onMount(async () => {
litNodeClient = new LitNodeClient({ litNetwork: "serrano" });
await litNodeClient.connect();
const sessionSigsLocalStorage = localStorage.getItem("google-session");
const currentPKPLocalStorage = localStorage.getItem("current-pkp");
if (sessionSigsLocalStorage && currentPKPLocalStorage) {
sessionSigs = JSON.parse(sessionSigsLocalStorage);
currentPKP = JSON.parse(currentPKPLocalStorage);
}
});
async function signMessageWithPKP() {
const userConfirmed = window.confirm(
"Do you want to sign the following message?\n\n" +
JSON.stringify(messageToSign, null, 2)
);
if (!userConfirmed) {
status = "User did not allow to sign the message.";
dispatch("status", status);
return;
}
try {
// Create a specific JSON object
const jsonString = JSON.stringify(messageToSign);
// Convert the JSON string to an array of character codes
const toSign = ethers.getBytes(ethers.hashMessage(jsonString));
const litActionCode = `
const go = async () => {
const sigShare = await LitActions.signEcdsa({ toSign, publicKey, sigName });
};
go();
`;
// Sign message
const results = await litNodeClient.executeJs({
code: litActionCode,
sessionSigs: sessionSigs,
jsParams: {
toSign: toSign,
publicKey: currentPKP.publicKey,
sigName: "sig1",
},
});
// Get signature
const result = results.signatures["sig1"];
messageSignature = ethers.Signature.from({
r: "0x" + result.r,
s: "0x" + result.s,
v: result.recid,
});
signedMessages.update((messages) => [
...messages,
{ json: messageToSign, signature: messageSignature },
]);
// verify();
} catch (err) {
console.error(err);
}
}
async function verify() {
const response = await fetch("/api/verify", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
messageToSign,
messageSignature,
currentPKP,
}),
});
if (!response.ok) {
alert("verify failed");
} else {
let json = await response.json();
alert(json.verified ? "Signature valid" : "! Signature NOT valid !");
}
}
signRequest.subscribe(({ json }) => {
if (messageToSign && Object.keys(json).length > 0) {
signRequest.set({ json: {} });
messageToSign = json;
signMessageWithPKP(json);
}
});
</script>
{#if status}
<div class="mt-4 text-center">
<p>Status: {status}</p>
</div>
{/if}
{#if messageSignature}
<div class="mt-4 text-center">
<p>Signature</p>
<pre>{JSON.stringify(messageSignature)}</pre>
</div>
<button on:click={verify}>Verify</button><br />
{/if}

View File

@ -3,13 +3,18 @@
import walletMachine from "./machines/walletMachine";
import { onMount } from "svelte";
import Icon from "@iconify/svelte";
import { walletState, signRequest } from "./stores";
import {
signInWithGoogle,
startSignIn as startSignInService,
} from "./services/signInWithGoogle";
import { getDrawerStore } from "@skeletonlabs/skeleton";
const { state, send } = useMachine(walletMachine);
const drawerStore = getDrawerStore();
$: walletState.set($state.context);
$: {
if ($state.context.pkps && $state.context.sessionSigs) {
@ -33,17 +38,35 @@
startSignInService.set(true);
await signInWithGoogle();
}
function clearSession() {
send("LOGOUT");
}
function signRequestTrigger() {
signRequest.set({
status: "SIGN REQUEST",
messageToSign: { hello: "test" },
signature: null,
drawer: true,
});
}
$: if ($signRequest.drawer) {
const settings = { position: "bottom", id: "signMessage" };
drawerStore.open(settings);
} else {
drawerStore.close();
}
</script>
<!-- ... existing markup ... -->
{#if $state.matches("sessionAvailable") || $state.matches("creatingSession") || $state.matches("signIn")}
{#if $state.matches("signIn")}
<div class="w-1/3">
<button
on:click={startSignIn}
class="w-full py-2 text-white bg-blue-500 rounded hover:bg-blue-700 flex items-center justify-center"
class="flex items-center justify-center w-full py-2 text-white bg-blue-500 rounded hover:bg-blue-700"
>
<span class="mr-2"><Icon icon="flat-color-icons:google" /></span>
<span>Sign in with Google</span>
@ -51,9 +74,9 @@
</div>
{:else if $state.context.pkps}
<div
class="fixed bottom-0 left-0 right-0 p-3 bg-white bg-opacity-75 rounded-t-lg shadow-md flex flex-col items-center space-y-4"
class="fixed bottom-0 left-0 right-0 flex flex-col items-center p-3 space-y-4 bg-white bg-opacity-75 rounded-t-lg shadow-md"
>
<div class="w-full flex items-center justify-between space-x-4">
<div class="flex items-center justify-between w-full space-x-4">
<div class="flex items-center space-x-2">
<div>
<p class="text-sm">
@ -67,22 +90,24 @@
</div>
</div>
<button
on:click={clearSession}
class="py-1 px-2 text-white bg-red-500 rounded hover:bg-red-700"
on:click={signRequestTrigger}
type="button"
class="btn variant-filled">SignRequest</button
>
<button type="button" class="btn variant-filled" on:click={clearSession}
>Logout</button
>
Logout
</button>
</div>
</div>
{:else if $state.matches("sessionExpired")}
<div class="bg-white p-10">
<div class="p-10 bg-white">
<p>Error creating session. Please try again.</p>
<pre>{JSON.stringify($state.context.error, null, 2)}</pre>
</div>
{/if}
{:else}
<div class="bg-white p-10 rounded-full">
<div class="bg-white rounded-full p-5 animate-spin">
<div class="p-10 bg-white rounded-full">
<div class="p-5 bg-white rounded-full animate-spin">
<Icon icon="la:spinner" width="100" height="100" />
</div>
</div>

View File

@ -0,0 +1,41 @@
// $lib/services/signMessage.ts
import { ethers } from "ethers";
export async function signMessageWithPKP(sessionSigs, currentPKP, messageToSign) {
try {
const jsonString = JSON.stringify(messageToSign);
const toSign = ethers.getBytes(ethers.hashMessage(jsonString));
const litActionCode = `
const go = async () => {
const sigShare = await LitActions.signEcdsa({ toSign, publicKey, sigName });
};
go();
`;
const litNodeClient = new LitNodeClient({ litNetwork: "serrano" });
await litNodeClient.connect();
const results = await litNodeClient.executeJs({
code: litActionCode,
sessionSigs: sessionSigs,
jsParams: {
toSign: toSign,
publicKey: currentPKP.publicKey,
sigName: "sig1",
},
});
const result = results.signatures["sig1"];
const messageSignature = ethers.Signature.from({
r: "0x" + result.r,
s: "0x" + result.s,
v: result.recid,
});
return { messageSignature };
} catch (err) {
console.error(err);
return { error: err };
}
}

View File

@ -1,11 +1,15 @@
import { writable } from 'svelte/store';
export const signRequest = writable({json: {}});
export const signedMessages = writable([])
export const redirectStore = writable(false);
export const walletState = writable(null);
export const signRequest = writable({
messageToSign: {},
signature: null,
drawer: false
});
export const googleSession = writable({
activeSession: false
});

View File

@ -8,6 +8,13 @@
import { initChainProvider } from "$lib/setupChainProvider";
import { googleSession } from "$lib/stores.js";
import Wallet from "$lib/Wallet.svelte";
import { Drawer, initializeStores } from "@skeletonlabs/skeleton";
import { getDrawerStore } from "@skeletonlabs/skeleton";
import Signer from "$lib/Signer.svelte";
initializeStores();
const drawerStore = getDrawerStore();
let activeSession = false;
@ -28,8 +35,16 @@
}
</script>
<Drawer>
{#if $drawerStore.id === "signMessage"}
<Signer messageToSign={{ hello: "me" }} />
{:else}
<!-- (fallback contents) -->
{/if}</Drawer
>
<div
class="flex items-center justify-center h-screen bg-cover bg-center"
class="flex items-center justify-center h-screen bg-center bg-cover"
style="background-image: url('lake.jpeg');"
>
<QueryClientProvider client={data.queryClient}>

View File

@ -1,6 +1,8 @@
import { browser } from '$app/environment';
import { QueryClient } from '@tanstack/svelte-query';
import type { LayoutLoad } from './$types';
export const prerender = true
export const ssr = false
export const load: LayoutLoad = async () => {
const queryClient = new QueryClient({

View File

@ -1,4 +1,4 @@
import adapter from '@sveltejs/adapter-auto';
import adapter from '@sveltejs/adapter-static'
import { vitePreprocess } from '@sveltejs/kit/vite';
/** @type {import('@sveltejs/kit').Config} */

View File

@ -1,9 +0,0 @@
/** @type {import('tailwindcss').Config} */
export default {
content: ['./src/**/*.{html,js,svelte,ts}'],
theme: {
extend: {},
},
plugins: [],
}

30
tailwind.config.ts Normal file
View File

@ -0,0 +1,30 @@
import { join } from 'path';
import type { Config } from 'tailwindcss';
// 1. Import the Skeleton plugin
import { skeleton } from '@skeletonlabs/tw-plugin';
const config = {
// 2. Opt for dark mode to be handled via the class method
darkMode: 'class',
content: [
'./src/**/*.{html,js,svelte,ts}',
// 3. Append the path to the Skeleton package
join(require.resolve(
'@skeletonlabs/skeleton'),
'../**/*.{html,js,svelte,ts}'
)
],
theme: {
extend: {},
},
plugins: [
// 4. Append the Skeleton plugin (after other plugins)
skeleton({
themes: { preset: ["wintry"] }
})
]
} satisfies Config;
export default config;