From 30101cfd5b2515c77f5dd5fe8c5c77131305e52c Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Sat, 13 Nov 2021 12:08:36 +1300 Subject: [PATCH 01/15] switch to main commit --- .gitignore | 1 + package-lock.json | 421 +++++++- package.json | 11 +- pnpm-lock.yaml | 1090 +++++++++++++++++++++ src/lib/bta.ts | 35 + src/routes/login.svelte | 19 + src/routes/you/[user].svelte | 76 ++ src/routes/you/supa/fsauth/auth.ts | 35 + src/routes/you/supa/you_api/[user].ts | 38 + src/routes/you/supa/you_api/set/[user].ts | 29 + 10 files changed, 1744 insertions(+), 11 deletions(-) create mode 100644 pnpm-lock.yaml create mode 100644 src/lib/bta.ts create mode 100644 src/routes/login.svelte create mode 100644 src/routes/you/[user].svelte create mode 100644 src/routes/you/supa/fsauth/auth.ts create mode 100644 src/routes/you/supa/you_api/[user].ts create mode 100644 src/routes/you/supa/you_api/set/[user].ts diff --git a/.gitignore b/.gitignore index dad6f80..65624f5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules /build /.svelte-kit /package +.env \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fabd88d..cdb3753 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,13 +8,14 @@ "name": "scratchinfo", "version": "1.2.0", "dependencies": { + "@supabase/supabase-js": "^1.27.0", "@sveltejs/adapter-vercel": "^1.0.0-next.31" }, "devDependencies": { "@sveltejs/kit": "next", - "svelte": "^3.43.2", - "svelte-check": "^2.2.7", - "svelte-preprocess": "^4.9.4", + "svelte": "^3.44.1", + "svelte-check": "^2.2.8", + "svelte-preprocess": "^4.9.8", "tslib": "^2.3.1", "typescript": "^4.4.4" } @@ -67,6 +68,50 @@ "node": ">= 8.0.0" } }, + "node_modules/@supabase/gotrue-js": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.20.0.tgz", + "integrity": "sha512-udv6o44JPqQWc8dh9bJnvvUpPKFtzVpSpsTKiS541gjR9kNCgdxkMMYBh5653W9gKfcmqN5mYf9/hYzDOoB6ww==", + "dependencies": { + "cross-fetch": "^3.0.6" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-0.35.0.tgz", + "integrity": "sha512-z+XKJ2oXuGEAEBVXseeQUXaM3ekQZK4XF0Kc399Glyg+rZaBTwNeJtY+Q/23NcIE5uNMYbTnEXm80jZbLBnWdw==", + "dependencies": { + "cross-fetch": "^3.0.6" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.2.1.tgz", + "integrity": "sha512-nhwSvizonT8hiMoQHOqs+2MZNV8qkhKn552g7NIJktVmqpz//O1dGjdcXyjhbAurW18z0Y7Qa9G7UXfEYJKRPQ==", + "dependencies": { + "@types/websocket": "^1.0.3", + "websocket": "^1.0.34" + } + }, + "node_modules/@supabase/storage-js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-1.5.0.tgz", + "integrity": "sha512-ki2HT9FrCYRN3yoqWqX+u47TUHQ8lgSStAqV/97kMov1z2d+iIlqGBGVcaGDqq4NvK8CipG8IJARYM72oX+afA==", + "dependencies": { + "cross-fetch": "^3.1.0" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.27.0.tgz", + "integrity": "sha512-oAm111Y1t7X+S5GeJWw9NdzAn1A1Cz5WAB/evYjM4ut7ZVWpeaEAlQ2p34MAjDrRVAcCfEr75rQwLTCqPcmMMQ==", + "dependencies": { + "@supabase/gotrue-js": "^1.20.0", + "@supabase/postgrest-js": "^0.35.0", + "@supabase/realtime-js": "^1.2.1", + "@supabase/storage-js": "^1.5.0" + } + }, "node_modules/@sveltejs/adapter-vercel": { "version": "1.0.0-next.31", "resolved": "https://registry.npmjs.org/@sveltejs/adapter-vercel/-/adapter-vercel-1.0.0-next.31.tgz", @@ -126,8 +171,7 @@ "node_modules/@types/node": { "version": "16.11.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", - "dev": true + "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" }, "node_modules/@types/pug": { "version": "2.0.5", @@ -144,6 +188,14 @@ "@types/node": "*" } }, + "node_modules/@types/websocket": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.4.tgz", + "integrity": "sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -218,6 +270,18 @@ "node": "*" } }, + "node_modules/bufferutil": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", + "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -297,6 +361,23 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "dependencies": { + "node-fetch": "2.6.1" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "node_modules/debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -323,12 +404,41 @@ "node": ">=8" } }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", "dev": true }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "node_modules/esbuild": { "version": "0.13.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.12.tgz", @@ -567,6 +677,19 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + }, "node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -775,6 +898,11 @@ "node": ">=0.12.0" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, "node_modules/kleur": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", @@ -881,6 +1009,29 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1294,6 +1445,19 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/typescript": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", @@ -1307,6 +1471,18 @@ "node": ">=4.2.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", + "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/vite": { "version": "2.6.13", "resolved": "https://registry.npmjs.org/vite/-/vite-2.6.13.tgz", @@ -1344,11 +1520,48 @@ } } }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", + "engines": { + "node": ">=0.10.32" + } } }, "dependencies": { @@ -1388,6 +1601,50 @@ "picomatch": "^2.2.2" } }, + "@supabase/gotrue-js": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.20.0.tgz", + "integrity": "sha512-udv6o44JPqQWc8dh9bJnvvUpPKFtzVpSpsTKiS541gjR9kNCgdxkMMYBh5653W9gKfcmqN5mYf9/hYzDOoB6ww==", + "requires": { + "cross-fetch": "^3.0.6" + } + }, + "@supabase/postgrest-js": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-0.35.0.tgz", + "integrity": "sha512-z+XKJ2oXuGEAEBVXseeQUXaM3ekQZK4XF0Kc399Glyg+rZaBTwNeJtY+Q/23NcIE5uNMYbTnEXm80jZbLBnWdw==", + "requires": { + "cross-fetch": "^3.0.6" + } + }, + "@supabase/realtime-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.2.1.tgz", + "integrity": "sha512-nhwSvizonT8hiMoQHOqs+2MZNV8qkhKn552g7NIJktVmqpz//O1dGjdcXyjhbAurW18z0Y7Qa9G7UXfEYJKRPQ==", + "requires": { + "@types/websocket": "^1.0.3", + "websocket": "^1.0.34" + } + }, + "@supabase/storage-js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-1.5.0.tgz", + "integrity": "sha512-ki2HT9FrCYRN3yoqWqX+u47TUHQ8lgSStAqV/97kMov1z2d+iIlqGBGVcaGDqq4NvK8CipG8IJARYM72oX+afA==", + "requires": { + "cross-fetch": "^3.1.0" + } + }, + "@supabase/supabase-js": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.27.0.tgz", + "integrity": "sha512-oAm111Y1t7X+S5GeJWw9NdzAn1A1Cz5WAB/evYjM4ut7ZVWpeaEAlQ2p34MAjDrRVAcCfEr75rQwLTCqPcmMMQ==", + "requires": { + "@supabase/gotrue-js": "^1.20.0", + "@supabase/postgrest-js": "^0.35.0", + "@supabase/realtime-js": "^1.2.1", + "@supabase/storage-js": "^1.5.0" + } + }, "@sveltejs/adapter-vercel": { "version": "1.0.0-next.31", "resolved": "https://registry.npmjs.org/@sveltejs/adapter-vercel/-/adapter-vercel-1.0.0-next.31.tgz", @@ -1425,8 +1682,7 @@ "@types/node": { "version": "16.11.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", - "dev": true + "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" }, "@types/pug": { "version": "2.0.5", @@ -1443,6 +1699,14 @@ "@types/node": "*" } }, + "@types/websocket": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.4.tgz", + "integrity": "sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==", + "requires": { + "@types/node": "*" + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1499,6 +1763,14 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, + "bufferutil": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", + "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", + "requires": { + "node-gyp-build": "^4.3.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1558,6 +1830,23 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "requires": { + "node-fetch": "2.6.1" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -1573,12 +1862,41 @@ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", "dev": true }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "esbuild": { "version": "0.13.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.12.tgz", @@ -1711,6 +2029,21 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, "fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -1870,6 +2203,11 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, "kleur": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", @@ -1949,6 +2287,21 @@ "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2206,12 +2559,33 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", "dev": true }, + "utf-8-validate": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", + "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", + "requires": { + "node-gyp-build": "^4.3.0" + } + }, "vite": { "version": "2.6.13", "resolved": "https://registry.npmjs.org/vite/-/vite-2.6.13.tgz", @@ -2225,11 +2599,44 @@ "rollup": "^2.57.0" } }, + "websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" } } } diff --git a/package.json b/package.json index 7e2bb09..508adca 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,17 @@ }, "devDependencies": { "@sveltejs/kit": "next", - "svelte": "^3.43.2", - "svelte-check": "^2.2.7", - "svelte-preprocess": "^4.9.4", + "svelte": "^3.44.1", + "svelte-check": "^2.2.8", + "svelte-preprocess": "^4.9.8", "tslib": "^2.3.1", "typescript": "^4.4.4" }, "type": "module", "dependencies": { - "@sveltejs/adapter-vercel": "^1.0.0-next.31" + "@supabase/supabase-js": "^1.27.0", + "@sveltejs/adapter-vercel": "^1.0.0-next.31", + "dotenv": "^10.0.0", + "jsonwebtoken": "^8.5.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..c580b9b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1090 @@ +lockfileVersion: 5.3 + +specifiers: + '@supabase/supabase-js': ^1.27.0 + '@sveltejs/adapter-vercel': ^1.0.0-next.31 + '@sveltejs/kit': next + dotenv: ^10.0.0 + jsonwebtoken: ^8.5.1 + svelte: ^3.44.1 + svelte-check: ^2.2.8 + svelte-preprocess: ^4.9.8 + tslib: ^2.3.1 + typescript: ^4.4.4 + +dependencies: + '@supabase/supabase-js': 1.27.0 + '@sveltejs/adapter-vercel': 1.0.0-next.31 + dotenv: 10.0.0 + jsonwebtoken: 8.5.1 + +devDependencies: + '@sveltejs/kit': 1.0.0-next.196_svelte@3.44.1 + svelte: 3.44.1 + svelte-check: 2.2.8_svelte@3.44.1 + svelte-preprocess: 4.9.8_svelte@3.44.1+typescript@4.4.4 + tslib: 2.3.1 + typescript: 4.4.4 + +packages: + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@rollup/pluginutils/4.1.1: + resolution: {integrity: sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.0 + dev: true + + /@supabase/gotrue-js/1.20.0: + resolution: {integrity: sha512-udv6o44JPqQWc8dh9bJnvvUpPKFtzVpSpsTKiS541gjR9kNCgdxkMMYBh5653W9gKfcmqN5mYf9/hYzDOoB6ww==} + dependencies: + cross-fetch: 3.1.4 + dev: false + + /@supabase/postgrest-js/0.35.0: + resolution: {integrity: sha512-z+XKJ2oXuGEAEBVXseeQUXaM3ekQZK4XF0Kc399Glyg+rZaBTwNeJtY+Q/23NcIE5uNMYbTnEXm80jZbLBnWdw==} + dependencies: + cross-fetch: 3.1.4 + dev: false + + /@supabase/realtime-js/1.2.1: + resolution: {integrity: sha512-nhwSvizonT8hiMoQHOqs+2MZNV8qkhKn552g7NIJktVmqpz//O1dGjdcXyjhbAurW18z0Y7Qa9G7UXfEYJKRPQ==} + dependencies: + '@types/websocket': 1.0.4 + websocket: 1.0.34 + dev: false + + /@supabase/storage-js/1.5.0: + resolution: {integrity: sha512-ki2HT9FrCYRN3yoqWqX+u47TUHQ8lgSStAqV/97kMov1z2d+iIlqGBGVcaGDqq4NvK8CipG8IJARYM72oX+afA==} + dependencies: + cross-fetch: 3.1.4 + dev: false + + /@supabase/supabase-js/1.27.0: + resolution: {integrity: sha512-oAm111Y1t7X+S5GeJWw9NdzAn1A1Cz5WAB/evYjM4ut7ZVWpeaEAlQ2p34MAjDrRVAcCfEr75rQwLTCqPcmMMQ==} + dependencies: + '@supabase/gotrue-js': 1.20.0 + '@supabase/postgrest-js': 0.35.0 + '@supabase/realtime-js': 1.2.1 + '@supabase/storage-js': 1.5.0 + dev: false + + /@sveltejs/adapter-vercel/1.0.0-next.31: + resolution: {integrity: sha512-W8p/U00B6ihVrDpwMkgEexfVUzaLmn4MRtXj//Gw4NDFfsrZR4P5wBidrOAIkCYBMvqCOHD+vbAvIiAMOaN23g==} + dependencies: + esbuild: 0.13.12 + dev: false + + /@sveltejs/kit/1.0.0-next.196_svelte@3.44.1: + resolution: {integrity: sha512-z7sA/2/3Il5biibjPXCYXJC11TyFhgCvMaJvvbtMnu2l3EmOmJBMS+r2djGptzfFsugSVNwGQFn8+ldWQWq3jA==} + engines: {node: '>=14.13'} + hasBin: true + peerDependencies: + svelte: ^3.44.0 + dependencies: + '@sveltejs/vite-plugin-svelte': 1.0.0-next.30_svelte@3.44.1+vite@2.6.13 + cheap-watch: 1.0.4 + sade: 1.7.4 + svelte: 3.44.1 + vite: 2.6.13 + transitivePeerDependencies: + - diff-match-patch + - less + - sass + - stylus + - supports-color + dev: true + + /@sveltejs/vite-plugin-svelte/1.0.0-next.30_svelte@3.44.1+vite@2.6.13: + resolution: {integrity: sha512-YQqdMxjL1VgSFk4/+IY3yLwuRRapPafPiZTiaGEq1psbJYSNYUWx9F1zMm32GMsnogg3zn99mGJOqe3ld3HZSg==} + engines: {node: ^14.13.1 || >= 16} + peerDependencies: + diff-match-patch: ^1.0.5 + svelte: ^3.44.0 + vite: ^2.6.0 + peerDependenciesMeta: + diff-match-patch: + optional: true + dependencies: + '@rollup/pluginutils': 4.1.1 + debug: 4.3.2 + kleur: 4.1.4 + magic-string: 0.25.7 + require-relative: 0.8.7 + svelte: 3.44.1 + svelte-hmr: 0.14.7_svelte@3.44.1 + vite: 2.6.13 + transitivePeerDependencies: + - supports-color + dev: true + + /@types/node/16.11.7: + resolution: {integrity: sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==} + + /@types/pug/2.0.5: + resolution: {integrity: sha512-LOnASQoeNZMkzexRuyqcBBDZ6rS+rQxUMkmj5A0PkhhiSZivLIuz6Hxyr1mkGoEZEkk66faROmpMi4fFkrKsBA==} + dev: true + + /@types/sass/1.43.0: + resolution: {integrity: sha512-DPSXNJ1rYLo88GyF9tuB4bsYGfpKI1a4+wOQmc+LI1SUoocm9QLRSpz0GxxuyjmJsYFIQo/dDlRSSpIXngff+w==} + dependencies: + '@types/node': 16.11.7 + dev: true + + /@types/websocket/1.0.4: + resolution: {integrity: sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==} + dependencies: + '@types/node': 16.11.7 + dev: false + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.0 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-crc32/0.2.13: + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + dev: true + + /buffer-equal-constant-time/1.0.1: + resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} + dev: false + + /bufferutil/4.0.5: + resolution: {integrity: sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.3.0 + dev: false + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /cheap-watch/1.0.4: + resolution: {integrity: sha512-QR/9FrtRL5fjfUJBhAKCdi0lSRQ3rVRRum3GF9wDKp2TJbEIMGhUEr2yU8lORzm9Isdjx7/k9S0DFDx+z5VGtw==} + engines: {node: '>=8'} + dev: true + + /chokidar/3.5.2: + resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + dev: true + + /cross-fetch/3.1.4: + resolution: {integrity: sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==} + dependencies: + node-fetch: 2.6.1 + dev: false + + /d/1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.53 + type: 1.2.0 + dev: false + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + dependencies: + ms: 2.0.0 + dev: false + + /debug/4.3.2: + resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /dotenv/10.0.0: + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} + dev: false + + /ecdsa-sig-formatter/1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /es5-ext/0.10.53: + resolution: {integrity: sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==} + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.0.0 + dev: false + + /es6-iterator/2.0.3: + resolution: {integrity: sha1-p96IkUGgWpSwhUQDstCg+/qY87c=} + dependencies: + d: 1.0.1 + es5-ext: 0.10.53 + es6-symbol: 3.1.3 + dev: false + + /es6-promise/3.3.1: + resolution: {integrity: sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=} + dev: true + + /es6-symbol/3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.6.0 + dev: false + + /esbuild-android-arm64/0.13.12: + resolution: {integrity: sha512-TSVZVrb4EIXz6KaYjXfTzPyyRpXV5zgYIADXtQsIenjZ78myvDGaPi11o4ZSaHIwFHsuwkB6ne5SZRBwAQ7maw==} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /esbuild-darwin-64/0.13.12: + resolution: {integrity: sha512-c51C+N+UHySoV2lgfWSwwmlnLnL0JWj/LzuZt9Ltk9ub1s2Y8cr6SQV5W3mqVH1egUceew6KZ8GyI4nwu+fhsw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /esbuild-darwin-arm64/0.13.12: + resolution: {integrity: sha512-JvAMtshP45Hd8A8wOzjkY1xAnTKTYuP/QUaKp5eUQGX+76GIie3fCdUUr2ZEKdvpSImNqxiZSIMziEiGB5oUmQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /esbuild-freebsd-64/0.13.12: + resolution: {integrity: sha512-r6On/Skv9f0ZjTu6PW5o7pdXr8aOgtFOEURJZYf1XAJs0IQ+gW+o1DzXjVkIoT+n1cm3N/t1KRJfX71MPg/ZUA==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /esbuild-freebsd-arm64/0.13.12: + resolution: {integrity: sha512-F6LmI2Q1gii073kmBE3NOTt/6zLL5zvZsxNLF8PMAwdHc+iBhD1vzfI8uQZMJA1IgXa3ocr3L3DJH9fLGXy6Yw==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /esbuild-linux-32/0.13.12: + resolution: {integrity: sha512-U1UZwG3UIwF7/V4tCVAo/nkBV9ag5KJiJTt+gaCmLVWH3bPLX7y+fNlhIWZy8raTMnXhMKfaTvWZ9TtmXzvkuQ==} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-64/0.13.12: + resolution: {integrity: sha512-YpXSwtu2NxN3N4ifJxEdsgd6Q5d8LYqskrAwjmoCT6yQnEHJSF5uWcxv783HWN7lnGpJi9KUtDvYsnMdyGw71Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-arm/0.13.12: + resolution: {integrity: sha512-SyiT/JKxU6J+DY2qUiSLZJqCAftIt3uoGejZ0HDnUM2MGJqEGSGh7p1ecVL2gna3PxS4P+j6WAehCwgkBPXNIw==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-arm64/0.13.12: + resolution: {integrity: sha512-sgDNb8kb3BVodtAlcFGgwk+43KFCYjnFOaOfJibXnnIojNWuJHpL6aQJ4mumzNWw8Rt1xEtDQyuGK9f+Y24jGA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-mips64le/0.13.12: + resolution: {integrity: sha512-qQJHlZBG+QwVIA8AbTEtbvF084QgDi4DaUsUnA+EolY1bxrG+UyOuGflM2ZritGhfS/k7THFjJbjH2wIeoKA2g==} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-ppc64le/0.13.12: + resolution: {integrity: sha512-2dSnm1ldL7Lppwlo04CGQUpwNn5hGqXI38OzaoPOkRsBRWFBozyGxTFSee/zHFS+Pdh3b28JJbRK3owrrRgWNw==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-netbsd-64/0.13.12: + resolution: {integrity: sha512-D4raxr02dcRiQNbxOLzpqBzcJNFAdsDNxjUbKkDMZBkL54Z0vZh4LRndycdZAMcIdizC/l/Yp/ZsBdAFxc5nbA==} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /esbuild-openbsd-64/0.13.12: + resolution: {integrity: sha512-KuLCmYMb2kh05QuPJ+va60bKIH5wHL8ypDkmpy47lzwmdxNsuySeCMHuTv5o2Af1RUn5KLO5ZxaZeq4GEY7DaQ==} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /esbuild-sunos-64/0.13.12: + resolution: {integrity: sha512-jBsF+e0woK3miKI8ufGWKG3o3rY9DpHvCVRn5eburMIIE+2c+y3IZ1srsthKyKI6kkXLvV4Cf/E7w56kLipMXw==} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /esbuild-windows-32/0.13.12: + resolution: {integrity: sha512-L9m4lLFQrFeR7F+eLZXG82SbXZfUhyfu6CexZEil6vm+lc7GDCE0Q8DiNutkpzjv1+RAbIGVva9muItQ7HVTkQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /esbuild-windows-64/0.13.12: + resolution: {integrity: sha512-k4tX4uJlSbSkfs78W5d9+I9gpd+7N95W7H2bgOMFPsYREVJs31+Q2gLLHlsnlY95zBoPQMIzHooUIsixQIBjaQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /esbuild-windows-arm64/0.13.12: + resolution: {integrity: sha512-2tTv/BpYRIvuwHpp2M960nG7uvL+d78LFW/ikPItO+2GfK51CswIKSetSpDii+cjz8e9iSPgs+BU4o8nWICBwQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /esbuild/0.13.12: + resolution: {integrity: sha512-vTKKUt+yoz61U/BbrnmlG9XIjwpdIxmHB8DlPR0AAW6OdS+nBQBci6LUHU2q9WbBobMEIQxxDpKbkmOGYvxsow==} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-arm64: 0.13.12 + esbuild-darwin-64: 0.13.12 + esbuild-darwin-arm64: 0.13.12 + esbuild-freebsd-64: 0.13.12 + esbuild-freebsd-arm64: 0.13.12 + esbuild-linux-32: 0.13.12 + esbuild-linux-64: 0.13.12 + esbuild-linux-arm: 0.13.12 + esbuild-linux-arm64: 0.13.12 + esbuild-linux-mips64le: 0.13.12 + esbuild-linux-ppc64le: 0.13.12 + esbuild-netbsd-64: 0.13.12 + esbuild-openbsd-64: 0.13.12 + esbuild-sunos-64: 0.13.12 + esbuild-windows-32: 0.13.12 + esbuild-windows-64: 0.13.12 + esbuild-windows-arm64: 0.13.12 + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /ext/1.6.0: + resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==} + dependencies: + type: 2.5.0 + dev: false + + /fast-glob/3.2.7: + resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} + engines: {node: '>=8'} + 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.4 + dev: true + + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /graceful-fs/4.2.8: + resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module/2.8.0: + resolution: {integrity: sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-typedarray/1.0.0: + resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} + dev: false + + /jsonwebtoken/8.5.1: + resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} + engines: {node: '>=4', npm: '>=1.4.28'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.2 + semver: 5.7.1 + dev: false + + /jwa/1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws/3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /kleur/4.1.4: + resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} + engines: {node: '>=6'} + dev: true + + /lodash.includes/4.3.0: + resolution: {integrity: sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=} + dev: false + + /lodash.isboolean/3.0.3: + resolution: {integrity: sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=} + dev: false + + /lodash.isinteger/4.0.4: + resolution: {integrity: sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=} + dev: false + + /lodash.isnumber/3.0.3: + resolution: {integrity: sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=} + dev: false + + /lodash.isplainobject/4.0.6: + resolution: {integrity: sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=} + dev: false + + /lodash.isstring/4.0.1: + resolution: {integrity: sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=} + dev: false + + /lodash.once/4.1.1: + resolution: {integrity: sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=} + dev: false + + /magic-string/0.25.7: + resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.4: + resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.0 + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.0.4: + resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist/1.2.5: + resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} + dev: true + + /mkdirp/0.5.5: + resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} + hasBin: true + dependencies: + minimist: 1.2.5 + dev: true + + /mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /ms/2.0.0: + resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} + dev: false + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /nanoid/3.1.30: + resolution: {integrity: sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /next-tick/1.0.0: + resolution: {integrity: sha1-yobR/ogoFpsBICCOPchCS524NCw=} + dev: false + + /node-fetch/2.6.1: + resolution: {integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==} + engines: {node: 4.x || >=6.0.0} + dev: false + + /node-gyp-build/4.3.0: + resolution: {integrity: sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==} + hasBin: true + dev: false + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /once/1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + dependencies: + wrappy: 1.0.2 + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.0: + resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} + engines: {node: '>=8.6'} + dev: true + + /postcss/8.3.11: + resolution: {integrity: sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.1.30 + picocolors: 1.0.0 + source-map-js: 0.6.2 + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.0 + dev: true + + /require-relative/0.8.7: + resolution: {integrity: sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve/1.20.0: + resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} + dependencies: + is-core-module: 2.8.0 + path-parse: 1.0.7 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: true + + /rollup/2.59.0: + resolution: {integrity: sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /sade/1.7.4: + resolution: {integrity: sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==} + engines: {node: '>= 6'} + dependencies: + mri: 1.2.0 + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /sander/0.5.1: + resolution: {integrity: sha1-dB4kXiMfB8r7b98PEzrfohalAq0=} + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.8 + mkdirp: 0.5.5 + rimraf: 2.7.1 + dev: true + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: false + + /sorcery/0.10.0: + resolution: {integrity: sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=} + hasBin: true + dependencies: + buffer-crc32: 0.2.13 + minimist: 1.2.5 + sander: 0.5.1 + sourcemap-codec: 1.4.8 + dev: true + + /source-map-js/0.6.2: + resolution: {integrity: sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map/0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + engines: {node: '>= 8'} + dev: true + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /svelte-check/2.2.8_svelte@3.44.1: + resolution: {integrity: sha512-y8BmSf3v+jOoVwKY0K3wAiIt3hupLiUS4HYqXSZPXJZrChKddp+N8fyNeClsDChLt2sLUo6sOAhlnok/RJ+iIw==} + hasBin: true + peerDependencies: + svelte: ^3.24.0 + dependencies: + chalk: 4.1.2 + chokidar: 3.5.2 + fast-glob: 3.2.7 + import-fresh: 3.3.0 + minimist: 1.2.5 + sade: 1.7.4 + source-map: 0.7.3 + svelte: 3.44.1 + svelte-preprocess: 4.9.8_svelte@3.44.1+typescript@4.4.4 + typescript: 4.4.4 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - node-sass + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + dev: true + + /svelte-hmr/0.14.7_svelte@3.44.1: + resolution: {integrity: sha512-pDrzgcWSoMaK6AJkBWkmgIsecW0GChxYZSZieIYfCP0v2oPyx2CYU/zm7TBIcjLVUPP714WxmViE9Thht4etog==} + peerDependencies: + svelte: '>=3.19.0' + dependencies: + svelte: 3.44.1 + dev: true + + /svelte-preprocess/4.9.8_svelte@3.44.1+typescript@4.4.4: + resolution: {integrity: sha512-EQS/oRZzMtYdAprppZxY3HcysKh11w54MgA63ybtL+TAZ4hVqYOnhw41JVJjWN9dhPnNjjLzvbZ2tMhTsla1Og==} + engines: {node: '>= 9.11.2'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 + node-sass: '*' + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.54.7 + sugarss: ^2.0.0 + svelte: ^3.23.0 + typescript: ^3.9.5 || ^4.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + node-sass: + 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 + dependencies: + '@types/pug': 2.0.5 + '@types/sass': 1.43.0 + detect-indent: 6.1.0 + magic-string: 0.25.7 + sorcery: 0.10.0 + strip-indent: 3.0.0 + svelte: 3.44.1 + typescript: 4.4.4 + dev: true + + /svelte/3.44.1: + resolution: {integrity: sha512-4DrCEJoBvdR689efHNSxIQn2pnFwB7E7j2yLEJtHE/P8hxwZWIphCtJ8are7bjl/iVMlcEf5uh5pJ68IwR09vQ==} + engines: {node: '>= 8'} + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tslib/2.3.1: + resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + dev: true + + /type/1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: false + + /type/2.5.0: + resolution: {integrity: sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==} + dev: false + + /typedarray-to-buffer/3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: false + + /typescript/4.4.4: + resolution: {integrity: sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /utf-8-validate/5.0.7: + resolution: {integrity: sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.3.0 + dev: false + + /vite/2.6.13: + resolution: {integrity: sha512-+tGZ1OxozRirTudl4M3N3UTNJOlxdVo/qBl2IlDEy/ZpTFcskp+k5ncNjayR3bRYTCbqSOFz2JWGN1UmuDMScA==} + engines: {node: '>=12.2.0'} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + dependencies: + esbuild: 0.13.12 + postcss: 8.3.11 + resolve: 1.20.0 + rollup: 2.59.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /websocket/1.0.34: + resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} + engines: {node: '>=4.0.0'} + dependencies: + bufferutil: 4.0.5 + debug: 2.6.9 + es5-ext: 0.10.53 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.7 + yaeti: 0.0.6 + dev: false + + /wrappy/1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + dev: true + + /yaeti/0.0.6: + resolution: {integrity: sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=} + engines: {node: '>=0.10.32'} + dev: false diff --git a/src/lib/bta.ts b/src/lib/bta.ts new file mode 100644 index 0000000..1b44b84 --- /dev/null +++ b/src/lib/bta.ts @@ -0,0 +1,35 @@ +// Thanks to https://gist.github.com/oeon/0ada0457194ebf70ec2428900ba76255 for the code! +const b2a = (a) => { + var c, + d, + e, + f, + g, + h, + i, + j, + o, + b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + k = 0, + l = 0, + m = "", + n = []; + if (!a) return a; + do + (c = a.charCodeAt(k++)), + (d = a.charCodeAt(k++)), + (e = a.charCodeAt(k++)), + (j = (c << 16) | (d << 8) | e), + (f = 63 & (j >> 18)), + (g = 63 & (j >> 12)), + (h = 63 & (j >> 6)), + (i = 63 & j), + (n[l++] = b.charAt(f) + b.charAt(g) + b.charAt(h) + b.charAt(i)); + while (k < a.length); + return ( + (m = n.join("")), + (o = a.length % 3), + (o ? m.slice(0, o - 3) : m) + "===".slice(o || 3) + ); +}; +export default b2a; diff --git a/src/routes/login.svelte b/src/routes/login.svelte new file mode 100644 index 0000000..4520514 --- /dev/null +++ b/src/routes/login.svelte @@ -0,0 +1,19 @@ + + +

Log in with FluffyScratch Auth

+
+ +

+

Your username will automatically be retrieved when you authenticate with FluffyScratch.

diff --git a/src/routes/you/[user].svelte b/src/routes/you/[user].svelte new file mode 100644 index 0000000..f275582 --- /dev/null +++ b/src/routes/you/[user].svelte @@ -0,0 +1,76 @@ + + + + +

{username} | You Page

+
+{#if loading == true} +

Loading...

+
+ Loading... +
+{:else if ok == true && loading == false} +

Featured Studio

+
+ Studio thumbnail +
+
{responseResult.studio.title}
+

{responseResult.studio.description}

+ Go to studio +
+
+{:else} + + + + +

An error has occured. This user may not exist.

+{/if} + + + \ No newline at end of file diff --git a/src/routes/you/supa/fsauth/auth.ts b/src/routes/you/supa/fsauth/auth.ts new file mode 100644 index 0000000..9b4854e --- /dev/null +++ b/src/routes/you/supa/fsauth/auth.ts @@ -0,0 +1,35 @@ +/** + * @type {import('@sveltejs/kit').RequestHandler} + */ +import jwt from "jsonwebtoken"; +export async function get({ query }) { + try { + const privateCode = query.get("privateCode"); + const fluffyFetch = await fetch( + `https://fluffyscratch.hampton.pw/auth/verify/v2/${privateCode}` + ); + const ffc = await fluffyFetch.json(); + console.log(ffc) + if (ffc.valid == null) { + throw new Error("Authentication not valid."); + } + const myJWT = await jwt.sign( + { username: ffc.username }, + process.env.SUPABASE_JWT_SECRET + ); + return { + body: { + works: true, + token: myJWT, + }, + }; + } catch (err) { + console.error(err) + return { + status: 500, + body: { + works: false, + }, + }; + } +} diff --git a/src/routes/you/supa/you_api/[user].ts b/src/routes/you/supa/you_api/[user].ts new file mode 100644 index 0000000..0227bd6 --- /dev/null +++ b/src/routes/you/supa/you_api/[user].ts @@ -0,0 +1,38 @@ +/** + * @type {import('@sveltejs/kit').RequestHandler} + */ +import { createClient } from "@supabase/supabase-js"; +export async function get({ params }) { + const { user } = params; + try { + const supabase = createClient( + // @ts-expect-error + import.meta.env.VITE_SUPABASE_URL, + import.meta.env.VITE_SUPABASE_ANON_KEY + ); + const { data, error } = await supabase + .from("users") + .select() + .eq("username", user); + if (error || data.length == 0) { + throw new Error("No user found with this username.") + } + const studioAPI = await (await fetch(`https://api.scratch.mit.edu/studios/${data[0].studio}/`)).json() + return { + body: { + data, + studio: studioAPI, + studio_url: `https://scratch.mit.edu/studios/${data[0].studio}`, + isError: false, + }, + }; + } catch (err) { + console.error(err); + return { + status: 500, + body: { + iserror: true, + }, + }; + } +} diff --git a/src/routes/you/supa/you_api/set/[user].ts b/src/routes/you/supa/you_api/set/[user].ts new file mode 100644 index 0000000..9e3995c --- /dev/null +++ b/src/routes/you/supa/you_api/set/[user].ts @@ -0,0 +1,29 @@ +/** + * @type {import('@sveltejs/kit').RequestHandler} + */ +import { createClient } from "@supabase/supabase-js"; +// this part is because process.env sometimes breaks +import dotenv from "dotenv"; +dotenv.config(); + +export async function post(request) { + try { + const supabase = createClient( + process.env["SUPABASE_URL"], + process.env["SUPABASE_ANON_KEY"] + ); + console.log(process.env) + supabase.auth.setAuth(request.body.token); + return { + iserror: false, + }; + } catch (err) { + console.error(err); + return { + status: 500, + body: { + iserror: true, + }, + }; + } +} From 1214986a6634f2276bed0686f9ebca46331edbce Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Sun, 14 Nov 2021 16:23:48 +1300 Subject: [PATCH 02/15] More changes --- src/routes/__layout.svelte | 3 + src/routes/dashboard.svelte | 58 +++++++++++++++++++ src/routes/login.svelte | 8 ++- src/routes/logout.svelte | 16 +++++ src/routes/you/supa/fsauth/auth.ts | 9 ++- src/routes/you/supa/fsauth/checkAuth.svelte | 21 +++++++ .../you/supa/fsauth/getUserFromToken.ts | 36 ++++++++++++ src/routes/you/supa/you_api/[user].ts | 8 ++- src/routes/you/supa/you_api/set/[user].ts | 31 ++++++++-- 9 files changed, 178 insertions(+), 12 deletions(-) create mode 100644 src/routes/dashboard.svelte create mode 100644 src/routes/logout.svelte create mode 100644 src/routes/you/supa/fsauth/checkAuth.svelte create mode 100644 src/routes/you/supa/fsauth/getUserFromToken.ts diff --git a/src/routes/__layout.svelte b/src/routes/__layout.svelte index 8baff80..1496e1c 100644 --- a/src/routes/__layout.svelte +++ b/src/routes/__layout.svelte @@ -48,6 +48,9 @@ + diff --git a/src/routes/dashboard.svelte b/src/routes/dashboard.svelte new file mode 100644 index 0000000..d065ade --- /dev/null +++ b/src/routes/dashboard.svelte @@ -0,0 +1,58 @@ + + +

Scratchinfo Dashboard

+
+

Your You Page

+{#if loading} +

Loading...

+
+ Loading... +
+{:else} + + +{/if} + + diff --git a/src/routes/login.svelte b/src/routes/login.svelte index 4520514..5ca46da 100644 --- a/src/routes/login.svelte +++ b/src/routes/login.svelte @@ -2,11 +2,15 @@ import { onMount } from "svelte"; import b2a from "$lib/bta"; let submitFunction: Function = function () {}; - + let isLoggedIn = false; onMount(() => { + isLoggedIn = !!window.localStorage.getItem("authToken") + if (isLoggedIn) { + window.location.href = "/" + } submitFunction = function () { console.log("Sending user to FluffyScratch for authentication..."); - const urlEncode = b2a(`${window.location.host}/you/supa/fsauth/auth`); + const urlEncode = b2a(`${window.location.host}/you/supa/fsauth/checkAuth`); window.location.href = `https://fluffyscratch.hampton.pw/auth/getKeys/v2?redirect=${urlEncode}`; }; }); diff --git a/src/routes/logout.svelte b/src/routes/logout.svelte new file mode 100644 index 0000000..8ec2d39 --- /dev/null +++ b/src/routes/logout.svelte @@ -0,0 +1,16 @@ + + +

Log out

+
+

Are you sure that you want to log out?

+ + diff --git a/src/routes/you/supa/fsauth/auth.ts b/src/routes/you/supa/fsauth/auth.ts index 9b4854e..74127f5 100644 --- a/src/routes/you/supa/fsauth/auth.ts +++ b/src/routes/you/supa/fsauth/auth.ts @@ -2,6 +2,9 @@ * @type {import('@sveltejs/kit').RequestHandler} */ import jwt from "jsonwebtoken"; +// this part is because process.env sometimes breaks +import dotenv from "dotenv"; +dotenv.config(); export async function get({ query }) { try { const privateCode = query.get("privateCode"); @@ -9,13 +12,13 @@ export async function get({ query }) { `https://fluffyscratch.hampton.pw/auth/verify/v2/${privateCode}` ); const ffc = await fluffyFetch.json(); - console.log(ffc) - if (ffc.valid == null) { + if (ffc.valid == false) { throw new Error("Authentication not valid."); } const myJWT = await jwt.sign( { username: ffc.username }, - process.env.SUPABASE_JWT_SECRET + process.env["SUPABASE_JWT_SECRET"], + { expiresIn: "2h", audience: "scratchinfo" } ); return { body: { diff --git a/src/routes/you/supa/fsauth/checkAuth.svelte b/src/routes/you/supa/fsauth/checkAuth.svelte new file mode 100644 index 0000000..c50cd19 --- /dev/null +++ b/src/routes/you/supa/fsauth/checkAuth.svelte @@ -0,0 +1,21 @@ + +

Checking authentication status...

+

You should be redirected to the homepage automatically once you have authenticated with FluffyScratch.

+

Status: {status}

\ No newline at end of file diff --git a/src/routes/you/supa/fsauth/getUserFromToken.ts b/src/routes/you/supa/fsauth/getUserFromToken.ts new file mode 100644 index 0000000..e3c8214 --- /dev/null +++ b/src/routes/you/supa/fsauth/getUserFromToken.ts @@ -0,0 +1,36 @@ +/** + * @type {import('@sveltejs/kit').RequestHandler} + */ + import jwt from "jsonwebtoken"; + // this part is because process.env sometimes breaks + import dotenv from "dotenv"; + dotenv.config(); + export async function post(request) { + try { + try { + const jwtContent = jwt.verify(JSON.parse(request.body).token, process.env["SUPABASE_JWT_SECRET"], { + maxAge: "2h", + }); + return { + body: jwtContent + } + } catch { + return { + status: 500, + body: { + iserror: true, + msg: "Token not valid." + }, + }; + } + } catch (err) { + console.error(err) + return { + status: 500, + body: { + works: false, + }, + }; + } + } + \ No newline at end of file diff --git a/src/routes/you/supa/you_api/[user].ts b/src/routes/you/supa/you_api/[user].ts index 0227bd6..fa2df1a 100644 --- a/src/routes/you/supa/you_api/[user].ts +++ b/src/routes/you/supa/you_api/[user].ts @@ -2,13 +2,15 @@ * @type {import('@sveltejs/kit').RequestHandler} */ import { createClient } from "@supabase/supabase-js"; +import dotenv from "dotenv"; +dotenv.config(); + export async function get({ params }) { const { user } = params; try { const supabase = createClient( - // @ts-expect-error - import.meta.env.VITE_SUPABASE_URL, - import.meta.env.VITE_SUPABASE_ANON_KEY + process.env["SUPABASE_URL"], + process.env["SUPABASE_ANON_KEY"] ); const { data, error } = await supabase .from("users") diff --git a/src/routes/you/supa/you_api/set/[user].ts b/src/routes/you/supa/you_api/set/[user].ts index 9e3995c..0b6754b 100644 --- a/src/routes/you/supa/you_api/set/[user].ts +++ b/src/routes/you/supa/you_api/set/[user].ts @@ -2,20 +2,42 @@ * @type {import('@sveltejs/kit').RequestHandler} */ import { createClient } from "@supabase/supabase-js"; -// this part is because process.env sometimes breaks +import jwt from "jsonwebtoken"; import dotenv from "dotenv"; dotenv.config(); export async function post(request) { + const { user } = request.params; try { + try { + jwt.verify(request.body.token, process.env["SUPABASE_JWT_SECRET"], { + maxAge: "2h", + }); + } catch { + return { + status: 500, + body: { + iserror: true, + msg: "Token not valid." + }, + }; + } const supabase = createClient( process.env["SUPABASE_URL"], process.env["SUPABASE_ANON_KEY"] ); - console.log(process.env) - supabase.auth.setAuth(request.body.token); + const userExists = await supabase + .from("users") + .select() + .eq("username", user); + if (userExists.error || userExists.data.length == 0) { + throw new Error("No user found with this username."); + } return { - iserror: false, + body: { + username: user, + iserror: false, + }, }; } catch (err) { console.error(err); @@ -23,6 +45,7 @@ export async function post(request) { status: 500, body: { iserror: true, + msg: "Error unknown." }, }; } From deecfc86eccf025b92c60b93c0a3e4a9860c2933 Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Sun, 14 Nov 2021 20:40:47 +1300 Subject: [PATCH 03/15] commit --- src/routes/dashboard.svelte | 10 +++++++++- src/routes/you/supa/you_api/set/[user].ts | 6 ++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/routes/dashboard.svelte b/src/routes/dashboard.svelte index d065ade..30e9a33 100644 --- a/src/routes/dashboard.svelte +++ b/src/routes/dashboard.svelte @@ -3,11 +3,15 @@ let loggedOut = false; let loading = true; let studioID = 0; + let saveChanges = async function() {}; onMount(async () => { loggedOut = !!!window.localStorage.getItem("authToken"); if (loggedOut) { - window.location.href = "/"; + window.location.href = "/login"; } + saveChanges = async function() { + + } // CUD = current user data const CUDFetch = await fetch("/you/supa/fsauth/getUserFromToken", { method: "POST", @@ -32,6 +36,7 @@

Scratchinfo Dashboard

+Log out

Your You Page

{#if loading} @@ -42,6 +47,9 @@ {:else} + +
+ {/if} diff --git a/src/routes/privacy.svelte b/src/routes/privacy.svelte new file mode 100644 index 0000000..9830a4e --- /dev/null +++ b/src/routes/privacy.svelte @@ -0,0 +1,41 @@ + +Last modified: 15 November 2021 +
+

+ All Scratchinfo pages are hosted through Vercel. +

+

+ When you use the Scratchinfo User searching service, the username of the user + you are searching may be accessible to our data sources. This information is + necessary to provide you with Scratchinfo. +

+

Some of our data sources are

+ +

+ All requests to these services are taken through our servers to minimise the + exposure of potentially sensitive information to these sources, such as your + IP address. +

+
+

+ When you are using Scratchinfo You, your Scratch account is verified by the FluffyScratch authentication platform. FluffyScratch allows Scratchinfo to verify your Scratch account. +

+

+ Our PostgreSQL database is provided by Supabase. All of the data used to provide Scratchinfo You is on Supabase. +

+

+ Scratchinfo is open source on our GitHub repository and is licensed under the MIT License. +

diff --git a/src/routes/you/supa/you_api/func/set.ts b/src/routes/you/supa/you_api/func/set.ts new file mode 100644 index 0000000..22264f9 --- /dev/null +++ b/src/routes/you/supa/you_api/func/set.ts @@ -0,0 +1,79 @@ +/** + * @type {import('@sveltejs/kit').RequestHandler} + */ +import { createClient } from "@supabase/supabase-js"; +import jwt from "jsonwebtoken"; +import dotenv from "dotenv"; +dotenv.config(); + +export async function post(request) { + const parsedBody = JSON.parse(request.body); + try { + let jwtv = undefined; + try { + // jwt.verify returns a decoded object so we can use this to check the JWT + jwtv = jwt.verify(parsedBody.token, process.env["SUPABASE_JWT_SECRET"], { + maxAge: "2h", + }); + } catch { + return { + status: 500, + body: { + iserror: true, + msg: "Token not valid.", + }, + }; + } + const user = jwtv.username; + if (isNaN(parsedBody.studio)) { + return { + status: 500, + body: { + iserror: true, + msg: "Studio is not a number.", + }, + }; + } + const studioSet = Math.round(Number(parsedBody.studio)); + const supabase = createClient( + process.env["SUPABASE_URL"], + process.env["SUPABASE_ANON_KEY"] + ); + const userExists = await supabase + .from("users") + .select() + .eq("username", user); + if (userExists.error || userExists.data.length == 0) { + const createUser = await supabase + .from("users") + .insert([{ username: user, studio: studioSet }]); + if (createUser.error) { + throw new Error("An error has occured.1"); + } + } else { + const setUser = await supabase + .from("users") + .update({ username: user, studio: studioSet }) + .eq("username", user); + console.log(setUser) + if (setUser.error) { + throw new Error(setUser.error.toString()); + } + } + return { + body: { + username: user, + iserror: false, + }, + }; + } catch (err) { + console.error(err); + return { + status: 500, + body: { + iserror: true, + msg: "Error unknown.", + }, + }; + } +} diff --git a/src/routes/you/supa/you_api/set/[user].ts b/src/routes/you/supa/you_api/set/[user].ts deleted file mode 100644 index e12f9c2..0000000 --- a/src/routes/you/supa/you_api/set/[user].ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @type {import('@sveltejs/kit').RequestHandler} - */ -import { createClient } from "@supabase/supabase-js"; -import jwt from "jsonwebtoken"; -import dotenv from "dotenv"; -dotenv.config(); - -export async function post(request) { - try { - let jwtv = undefined; - try { - // jwt.verify returns a decoded object so we can use this to check the JWT - jwtv = jwt.verify(request.body.token, process.env["SUPABASE_JWT_SECRET"], { - maxAge: "2h", - }); - } catch { - return { - status: 500, - body: { - iserror: true, - msg: "Token not valid." - }, - }; - } - const user = jwtv.username; - const supabase = createClient( - process.env["SUPABASE_URL"], - process.env["SUPABASE_ANON_KEY"] - ); - const userExists = await supabase - .from("users") - .select() - .eq("username", user); - if (userExists.error || userExists.data.length == 0) { - throw new Error("No user found with this username."); - } - return { - body: { - username: user, - iserror: false, - }, - }; - } catch (err) { - console.error(err); - return { - status: 500, - body: { - iserror: true, - msg: "Error unknown." - }, - }; - } -} From 12ea5e7c5cbd18b54bf378503285cb49e7eb4770 Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Mon, 15 Nov 2021 15:13:10 +1300 Subject: [PATCH 05/15] remove console log --- src/routes/api/[user].ts | 5 ++--- src/routes/dashboard.svelte | 2 -- src/routes/leaderboards/forums.svelte | 3 --- src/routes/you/supa/you_api/func/set.ts | 1 - 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/routes/api/[user].ts b/src/routes/api/[user].ts index 0d35efc..00a2772 100644 --- a/src/routes/api/[user].ts +++ b/src/routes/api/[user].ts @@ -7,14 +7,13 @@ export async function get({ params }) { const api_official_user = await ( await fetch(`https://api.scratch.mit.edu/users/${user}/`) ).json(); - console.log(1) let scratchdb, scratchdb_forum_user = {"counts": undefined}; scratchdb = await ( await fetch(`https://scratchdb.lefty.one/v3/user/info/${user}`) - ).json();console.log(1); + ).json(); scratchdb_forum_user = await ( await fetch(`https://scratchdb.lefty.one/v3/forum/user/info/${user}`) - ).json();console.log(1); + ).json(); let ocular = {"status": undefined, "color": undefined} try { ocular = await ( diff --git a/src/routes/dashboard.svelte b/src/routes/dashboard.svelte index 796e437..0d47c7e 100644 --- a/src/routes/dashboard.svelte +++ b/src/routes/dashboard.svelte @@ -20,12 +20,10 @@ }); if (scf.ok) { problem = false; - console.log("no error") // continue on with scripts } else { // an error has occured so handle it appropriately problem = true; - console.log(await scf.text()) } }; // CUD = current user data diff --git a/src/routes/leaderboards/forums.svelte b/src/routes/leaderboards/forums.svelte index ce02c48..d7042de 100644 --- a/src/routes/leaderboards/forums.svelte +++ b/src/routes/leaderboards/forums.svelte @@ -23,11 +23,9 @@ .then((data) => { postList[fetchedForum] = data; loading = false; - console.log(postList); }); }; totalmodify = function() { - console.log("check modified") if(total == false && typeof postList[forum] == "undefined") { modified(); } @@ -43,7 +41,6 @@ .then((data) => { postList["total"] = data; loading = false; - console.log(postList); }); }); diff --git a/src/routes/you/supa/you_api/func/set.ts b/src/routes/you/supa/you_api/func/set.ts index 22264f9..38bff9f 100644 --- a/src/routes/you/supa/you_api/func/set.ts +++ b/src/routes/you/supa/you_api/func/set.ts @@ -55,7 +55,6 @@ export async function post(request) { .from("users") .update({ username: user, studio: studioSet }) .eq("username", user); - console.log(setUser) if (setUser.error) { throw new Error(setUser.error.toString()); } From f99348c07c63e5a01297180ab67795e12f38e382 Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Mon, 15 Nov 2021 15:20:08 +1300 Subject: [PATCH 06/15] you --- src/routes/users/[user].svelte | 75 +++++++++++++++++----------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/src/routes/users/[user].svelte b/src/routes/users/[user].svelte index 90f980e..3796b19 100644 --- a/src/routes/users/[user].svelte +++ b/src/routes/users/[user].svelte @@ -152,44 +152,43 @@

Joined on {new Date(info.joinDate).toLocaleString()}

Latest User Agent: {info.user_agent}

-

- Visit on Scratch - Visit on ScratchStats - Visit on ocular - Visit on PostPercent - Visit on Magnifier - Visit on Scratory -

+ Visit on Scratchinfo You + + Visit on Scratch + Visit on ScratchStats + Visit on ocular + Visit on PostPercent + Visit on Magnifier + Visit on Scratory
From 5a60e18e46264c72bf40190710b144f65b8c7c94 Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Mon, 15 Nov 2021 15:28:51 +1300 Subject: [PATCH 07/15] formatting wheeeee --- src/lib/bta.ts | 62 ++++---- src/lib/forumlist.ts | 76 +++++----- src/routes/api/[user].ts | 112 +++++++-------- src/routes/leaderboards/api/[type].ts | 38 ++--- src/routes/leaderboards/api/forum-[forum].ts | 38 ++--- src/routes/you/supa/fsauth/auth.ts | 54 +++---- .../you/supa/fsauth/getUserFromToken.ts | 41 +++--- src/routes/you/supa/you_api/[user].ts | 56 ++++---- src/routes/you/supa/you_api/func/set.ts | 136 +++++++++--------- 9 files changed, 306 insertions(+), 307 deletions(-) diff --git a/src/lib/bta.ts b/src/lib/bta.ts index 1b44b84..91fde50 100644 --- a/src/lib/bta.ts +++ b/src/lib/bta.ts @@ -1,35 +1,35 @@ // Thanks to https://gist.github.com/oeon/0ada0457194ebf70ec2428900ba76255 for the code! const b2a = (a) => { - var c, - d, - e, - f, - g, - h, - i, - j, - o, - b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", - k = 0, - l = 0, - m = "", - n = []; - if (!a) return a; - do - (c = a.charCodeAt(k++)), - (d = a.charCodeAt(k++)), - (e = a.charCodeAt(k++)), - (j = (c << 16) | (d << 8) | e), - (f = 63 & (j >> 18)), - (g = 63 & (j >> 12)), - (h = 63 & (j >> 6)), - (i = 63 & j), - (n[l++] = b.charAt(f) + b.charAt(g) + b.charAt(h) + b.charAt(i)); - while (k < a.length); - return ( - (m = n.join("")), - (o = a.length % 3), - (o ? m.slice(0, o - 3) : m) + "===".slice(o || 3) - ); + var c, + d, + e, + f, + g, + h, + i, + j, + o, + b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + k = 0, + l = 0, + m = "", + n = []; + if (!a) return a; + do + (c = a.charCodeAt(k++)), + (d = a.charCodeAt(k++)), + (e = a.charCodeAt(k++)), + (j = (c << 16) | (d << 8) | e), + (f = 63 & (j >> 18)), + (g = 63 & (j >> 12)), + (h = 63 & (j >> 6)), + (i = 63 & j), + (n[l++] = b.charAt(f) + b.charAt(g) + b.charAt(h) + b.charAt(i)); + while (k < a.length); + return ( + (m = n.join("")), + (o = a.length % 3), + (o ? m.slice(0, o - 3) : m) + "===".slice(o || 3) + ); }; export default b2a; diff --git a/src/lib/forumlist.ts b/src/lib/forumlist.ts index 4734de8..0f4329f 100644 --- a/src/lib/forumlist.ts +++ b/src/lib/forumlist.ts @@ -1,40 +1,40 @@ let forumlist = [ - "New Scratchers", - "Announcements", - "Requests", - "Show and Tell", - "Collaboration", - "Help with Scripts", - "Project Ideas", - "Bugs and Glitches", - "Other Languages", - "Questions about Scratch", - "Things I'm Making and Creating", - "Advanced Topics", - "Things I'm Reading and Playing", - "Suggestions", - "Open Source Projects", - "Connecting to the Physical World", - "Developing Scratch Extensions", - "Africa", - "Bahasa Indonesia", - "Català", - "Deutsch", - "Ελληνικά", - "Español", - "فارسی", - "Français", - "עברית", - "한국어", - "Italiano", - "Nederlands", - "日本語", - "Norsk", - "Polski", - "Português", - "Pусский", - "Türkçe", - "中文", - "Translating Scratch" - ]; + "New Scratchers", + "Announcements", + "Requests", + "Show and Tell", + "Collaboration", + "Help with Scripts", + "Project Ideas", + "Bugs and Glitches", + "Other Languages", + "Questions about Scratch", + "Things I'm Making and Creating", + "Advanced Topics", + "Things I'm Reading and Playing", + "Suggestions", + "Open Source Projects", + "Connecting to the Physical World", + "Developing Scratch Extensions", + "Africa", + "Bahasa Indonesia", + "Català", + "Deutsch", + "Ελληνικά", + "Español", + "فارسی", + "Français", + "עברית", + "한국어", + "Italiano", + "Nederlands", + "日本語", + "Norsk", + "Polski", + "Português", + "Pусский", + "Türkçe", + "中文", + "Translating Scratch" +]; export default forumlist; \ No newline at end of file diff --git a/src/routes/api/[user].ts b/src/routes/api/[user].ts index 00a2772..37d7add 100644 --- a/src/routes/api/[user].ts +++ b/src/routes/api/[user].ts @@ -2,19 +2,19 @@ * @type {import('@sveltejs/kit').RequestHandler} */ export async function get({ params }) { - const { user } = params; - try { - const api_official_user = await ( - await fetch(`https://api.scratch.mit.edu/users/${user}/`) - ).json(); - let scratchdb, scratchdb_forum_user = {"counts": undefined}; - scratchdb = await ( - await fetch(`https://scratchdb.lefty.one/v3/user/info/${user}`) - ).json(); - scratchdb_forum_user = await ( - await fetch(`https://scratchdb.lefty.one/v3/forum/user/info/${user}`) - ).json(); - let ocular = {"status": undefined, "color": undefined} + const { user } = params; + try { + const api_official_user = await ( + await fetch(`https://api.scratch.mit.edu/users/${user}/`) + ).json(); + let scratchdb, scratchdb_forum_user = { "counts": undefined }; + scratchdb = await ( + await fetch(`https://scratchdb.lefty.one/v3/user/info/${user}`) + ).json(); + scratchdb_forum_user = await ( + await fetch(`https://scratchdb.lefty.one/v3/forum/user/info/${user}`) + ).json(); + let ocular = { "status": undefined, "color": undefined } try { ocular = await ( await fetch(`https://my-ocular.jeffalo.net/api/user/${user}/`) @@ -22,52 +22,52 @@ export async function get({ params }) { } catch (error) { ocular.status = "(Scratchinfo Message) Ocular seems to be down."; } - if (ocular.status == undefined || ocular.color == undefined) { - ocular.status = "No ocular status found."; - } - const user_projects = await ( - await fetch(`https://api.scratch.mit.edu/users/${user}/projects/?limit=1`) - ).json(); - let agent = "(Scratchinfo) An error has occured!"; - if (user_projects.length === 0) { - agent = "(Scratchinfo) No projects have been shared by this user."; - } else { - const project_to_fetch = user_projects[0].id; - const project = await ( - await fetch(`https://projects.scratch.mit.edu/${project_to_fetch}/`) - ).json(); + if (ocular.status == undefined || ocular.color == undefined) { + ocular.status = "No ocular status found."; + } + const user_projects = await ( + await fetch(`https://api.scratch.mit.edu/users/${user}/projects/?limit=1`) + ).json(); + let agent = "(Scratchinfo) An error has occured!"; + if (user_projects.length === 0) { + agent = "(Scratchinfo) No projects have been shared by this user."; + } else { + const project_to_fetch = user_projects[0].id; + const project = await ( + await fetch(`https://projects.scratch.mit.edu/${project_to_fetch}/`) + ).json(); try { agent = project["meta"]["agent"]; } catch (error) { agent = "(Scratchinfo) An error has occured in getting the user agent." } - - } - return { - body: { - username: api_official_user.username, - user_agent: agent, - scratchteam: api_official_user.scratchteam, - history: { - joined: api_official_user.history.joined, - }, - ocular: { - status: ocular.status, - color: ocular.color, - }, - scratchdb, - counts: scratchdb_forum_user.counts, - images: api_official_user.profile.images, - iserror: false, - }, - }; - } catch (err) { - console.error(err); - return { - body: { - iserror: true, - error_msg: err.toString(), - }, - }; - } + + } + return { + body: { + username: api_official_user.username, + user_agent: agent, + scratchteam: api_official_user.scratchteam, + history: { + joined: api_official_user.history.joined, + }, + ocular: { + status: ocular.status, + color: ocular.color, + }, + scratchdb, + counts: scratchdb_forum_user.counts, + images: api_official_user.profile.images, + iserror: false, + }, + }; + } catch (err) { + console.error(err); + return { + body: { + iserror: true, + error_msg: err.toString(), + }, + }; + } } diff --git a/src/routes/leaderboards/api/[type].ts b/src/routes/leaderboards/api/[type].ts index c265bb5..5086582 100644 --- a/src/routes/leaderboards/api/[type].ts +++ b/src/routes/leaderboards/api/[type].ts @@ -2,23 +2,23 @@ * @type {import('@sveltejs/kit').RequestHandler} */ export async function get({ params }) { - const { type } = params; - try { - let leaderboard = {}; - leaderboard = await ( - await fetch(`https://scratchdb.lefty.one/v3/user/rank/global/${type}`) - ).json(); - return { - body: leaderboard, - }; - } catch (err) { - console.error(err); - return { - status: 500, - body: { - iserror: true, - error_msg: err.toString(), - }, - }; - } + const { type } = params; + try { + let leaderboard = {}; + leaderboard = await ( + await fetch(`https://scratchdb.lefty.one/v3/user/rank/global/${type}`) + ).json(); + return { + body: leaderboard, + }; + } catch (err) { + console.error(err); + return { + status: 500, + body: { + iserror: true, + error_msg: err.toString(), + }, + }; + } } diff --git a/src/routes/leaderboards/api/forum-[forum].ts b/src/routes/leaderboards/api/forum-[forum].ts index f5962f6..dd3e7db 100644 --- a/src/routes/leaderboards/api/forum-[forum].ts +++ b/src/routes/leaderboards/api/forum-[forum].ts @@ -1,24 +1,24 @@ /** * @type {import('@sveltejs/kit').RequestHandler} */ - export async function get({ params }) { - const { forum } = params; - try { - let leaderboard = {}; - leaderboard = await ( - await fetch(`https://scratchdb.lefty.one/v3/forum/category/rank/${forum}`) - ).json(); - return { - body: leaderboard, - }; - } catch (err) { - console.error(err); - return { +export async function get({ params }) { + const { forum } = params; + try { + let leaderboard = {}; + leaderboard = await ( + await fetch(`https://scratchdb.lefty.one/v3/forum/category/rank/${forum}`) + ).json(); + return { + body: leaderboard, + }; + } catch (err) { + console.error(err); + return { status: 500, - body: { - iserror: true, - error_msg: err.toString(), - }, - }; - } + body: { + iserror: true, + error_msg: err.toString(), + }, + }; + } } diff --git a/src/routes/you/supa/fsauth/auth.ts b/src/routes/you/supa/fsauth/auth.ts index 74127f5..a893389 100644 --- a/src/routes/you/supa/fsauth/auth.ts +++ b/src/routes/you/supa/fsauth/auth.ts @@ -6,33 +6,33 @@ import jwt from "jsonwebtoken"; import dotenv from "dotenv"; dotenv.config(); export async function get({ query }) { - try { - const privateCode = query.get("privateCode"); - const fluffyFetch = await fetch( - `https://fluffyscratch.hampton.pw/auth/verify/v2/${privateCode}` - ); - const ffc = await fluffyFetch.json(); - if (ffc.valid == false) { - throw new Error("Authentication not valid."); - } - const myJWT = await jwt.sign( - { username: ffc.username }, - process.env["SUPABASE_JWT_SECRET"], + try { + const privateCode = query.get("privateCode"); + const fluffyFetch = await fetch( + `https://fluffyscratch.hampton.pw/auth/verify/v2/${privateCode}` + ); + const ffc = await fluffyFetch.json(); + if (ffc.valid == false) { + throw new Error("Authentication not valid."); + } + const myJWT = await jwt.sign( + { username: ffc.username }, + process.env["SUPABASE_JWT_SECRET"], { expiresIn: "2h", audience: "scratchinfo" } - ); - return { - body: { - works: true, - token: myJWT, - }, - }; - } catch (err) { + ); + return { + body: { + works: true, + token: myJWT, + }, + }; + } catch (err) { console.error(err) - return { - status: 500, - body: { - works: false, - }, - }; - } + return { + status: 500, + body: { + works: false, + }, + }; + } } diff --git a/src/routes/you/supa/fsauth/getUserFromToken.ts b/src/routes/you/supa/fsauth/getUserFromToken.ts index e3c8214..13c60f2 100644 --- a/src/routes/you/supa/fsauth/getUserFromToken.ts +++ b/src/routes/you/supa/fsauth/getUserFromToken.ts @@ -1,20 +1,20 @@ /** * @type {import('@sveltejs/kit').RequestHandler} */ - import jwt from "jsonwebtoken"; - // this part is because process.env sometimes breaks - import dotenv from "dotenv"; - dotenv.config(); - export async function post(request) { - try { +import jwt from "jsonwebtoken"; +// this part is because process.env sometimes breaks +import dotenv from "dotenv"; +dotenv.config(); +export async function post(request) { + try { try { - const jwtContent = jwt.verify(JSON.parse(request.body).token, process.env["SUPABASE_JWT_SECRET"], { - maxAge: "2h", - }); + const jwtContent = jwt.verify(JSON.parse(request.body).token, process.env["SUPABASE_JWT_SECRET"], { + maxAge: "2h", + }); return { body: jwtContent } - } catch { + } catch { return { status: 500, body: { @@ -23,14 +23,13 @@ }, }; } - } catch (err) { - console.error(err) - return { - status: 500, - body: { - works: false, - }, - }; - } - } - \ No newline at end of file + } catch (err) { + console.error(err) + return { + status: 500, + body: { + works: false, + }, + }; + } +} diff --git a/src/routes/you/supa/you_api/[user].ts b/src/routes/you/supa/you_api/[user].ts index fa2df1a..9499677 100644 --- a/src/routes/you/supa/you_api/[user].ts +++ b/src/routes/you/supa/you_api/[user].ts @@ -6,35 +6,35 @@ import dotenv from "dotenv"; dotenv.config(); export async function get({ params }) { - const { user } = params; - try { - const supabase = createClient( - process.env["SUPABASE_URL"], - process.env["SUPABASE_ANON_KEY"] - ); - const { data, error } = await supabase - .from("users") - .select() - .eq("username", user); - if (error || data.length == 0) { - throw new Error("No user found with this username.") - } + const { user } = params; + try { + const supabase = createClient( + process.env["SUPABASE_URL"], + process.env["SUPABASE_ANON_KEY"] + ); + const { data, error } = await supabase + .from("users") + .select() + .eq("username", user); + if (error || data.length == 0) { + throw new Error("No user found with this username.") + } const studioAPI = await (await fetch(`https://api.scratch.mit.edu/studios/${data[0].studio}/`)).json() - return { - body: { - data, + return { + body: { + data, studio: studioAPI, studio_url: `https://scratch.mit.edu/studios/${data[0].studio}`, - isError: false, - }, - }; - } catch (err) { - console.error(err); - return { - status: 500, - body: { - iserror: true, - }, - }; - } + isError: false, + }, + }; + } catch (err) { + console.error(err); + return { + status: 500, + body: { + iserror: true, + }, + }; + } } diff --git a/src/routes/you/supa/you_api/func/set.ts b/src/routes/you/supa/you_api/func/set.ts index 38bff9f..4f2cefc 100644 --- a/src/routes/you/supa/you_api/func/set.ts +++ b/src/routes/you/supa/you_api/func/set.ts @@ -7,72 +7,72 @@ import dotenv from "dotenv"; dotenv.config(); export async function post(request) { - const parsedBody = JSON.parse(request.body); - try { - let jwtv = undefined; - try { - // jwt.verify returns a decoded object so we can use this to check the JWT - jwtv = jwt.verify(parsedBody.token, process.env["SUPABASE_JWT_SECRET"], { - maxAge: "2h", - }); - } catch { - return { - status: 500, - body: { - iserror: true, - msg: "Token not valid.", - }, - }; - } - const user = jwtv.username; - if (isNaN(parsedBody.studio)) { - return { - status: 500, - body: { - iserror: true, - msg: "Studio is not a number.", - }, - }; - } - const studioSet = Math.round(Number(parsedBody.studio)); - const supabase = createClient( - process.env["SUPABASE_URL"], - process.env["SUPABASE_ANON_KEY"] - ); - const userExists = await supabase - .from("users") - .select() - .eq("username", user); - if (userExists.error || userExists.data.length == 0) { - const createUser = await supabase - .from("users") - .insert([{ username: user, studio: studioSet }]); - if (createUser.error) { - throw new Error("An error has occured.1"); - } - } else { - const setUser = await supabase - .from("users") - .update({ username: user, studio: studioSet }) - .eq("username", user); - if (setUser.error) { - throw new Error(setUser.error.toString()); - } - } - return { - body: { - username: user, - iserror: false, - }, - }; - } catch (err) { - console.error(err); - return { - status: 500, - body: { - iserror: true, - msg: "Error unknown.", - }, - }; - } + const parsedBody = JSON.parse(request.body); + try { + let jwtv = undefined; + try { + // jwt.verify returns a decoded object so we can use this to check the JWT + jwtv = jwt.verify(parsedBody.token, process.env["SUPABASE_JWT_SECRET"], { + maxAge: "2h", + }); + } catch { + return { + status: 500, + body: { + iserror: true, + msg: "Token not valid.", + }, + }; + } + const user = jwtv.username; + if (isNaN(parsedBody.studio)) { + return { + status: 500, + body: { + iserror: true, + msg: "Studio is not a number.", + }, + }; + } + const studioSet = Math.round(Number(parsedBody.studio)); + const supabase = createClient( + process.env["SUPABASE_URL"], + process.env["SUPABASE_ANON_KEY"] + ); + const userExists = await supabase + .from("users") + .select() + .eq("username", user); + if (userExists.error || userExists.data.length == 0) { + const createUser = await supabase + .from("users") + .insert([{ username: user, studio: studioSet }]); + if (createUser.error) { + throw new Error("An error has occured.1"); + } + } else { + const setUser = await supabase + .from("users") + .update({ username: user, studio: studioSet }) + .eq("username", user); + if (setUser.error) { + throw new Error(setUser.error.toString()); + } + } + return { + body: { + username: user, + iserror: false, + }, + }; + } catch (err) { + console.error(err); + return { + status: 500, + body: { + iserror: true, + msg: "Error unknown.", + }, + }; + } } From 2c1d2e7b5b832048609b907981423d708f74b260 Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Mon, 15 Nov 2021 15:31:17 +1300 Subject: [PATCH 08/15] Thanks dhuls for telling me that it is myocular --- src/routes/privacy.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/privacy.svelte b/src/routes/privacy.svelte index 9830a4e..7f71072 100644 --- a/src/routes/privacy.svelte +++ b/src/routes/privacy.svelte @@ -14,7 +14,7 @@

Some of our data sources are

From 4274c8d3373e60ca3538aed4e3ceffa0687f323e Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Mon, 15 Nov 2021 16:02:42 +1300 Subject: [PATCH 09/15] fix spelling mistake --- src/routes/you/[user].svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/you/[user].svelte b/src/routes/you/[user].svelte index f275582..6e52a3d 100644 --- a/src/routes/you/[user].svelte +++ b/src/routes/you/[user].svelte @@ -64,7 +64,7 @@ d="M4.285 12.433a.5.5 0 0 0 .683-.183A3.498 3.498 0 0 1 8 10.5c1.295 0 2.426.703 3.032 1.75a.5.5 0 0 0 .866-.5A4.498 4.498 0 0 0 8 9.5a4.5 4.5 0 0 0-3.898 2.25.5.5 0 0 0 .183.683zM7 6.5C7 7.328 6.552 8 6 8s-1-.672-1-1.5S5.448 5 6 5s1 .672 1 1.5zm4 0c0 .828-.448 1.5-1 1.5s-1-.672-1-1.5S9.448 5 10 5s1 .672 1 1.5z" /> -

An error has occured. This user may not exist.

+

An error has occurred. This user may not exist.

{/if} From c3323f3dd2cdec670e6529fa04c5110534a1ed37 Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Mon, 15 Nov 2021 18:54:45 +1300 Subject: [PATCH 10/15] add busy users --- src/routes/dashboard.svelte | 32 ++++++++---- src/routes/you/[user].svelte | 68 ++++++++++++++----------- src/routes/you/supa/you_api/func/set.ts | 5 +- 3 files changed, 65 insertions(+), 40 deletions(-) diff --git a/src/routes/dashboard.svelte b/src/routes/dashboard.svelte index 0d47c7e..8339f4c 100644 --- a/src/routes/dashboard.svelte +++ b/src/routes/dashboard.svelte @@ -2,10 +2,14 @@ import { onMount } from "svelte"; let loggedOut = false; let loading = true; - let problem = false; + let problem = false; + let isBusy = false; let studioID: number = 0; let saveChanges = async function () {}; onMount(async () => { + loading = true; + problem = false; + isBusy = false; loggedOut = !!!window.localStorage.getItem("authToken"); if (loggedOut) { window.location.href = "/login"; @@ -15,16 +19,17 @@ method: "POST", body: JSON.stringify({ token: window.localStorage.getItem("authToken").toString(), - studio: Number(studioID) + studio: Number(studioID), + busy: !!isBusy, }), }); - if (scf.ok) { - problem = false; - // continue on with scripts - } else { - // an error has occured so handle it appropriately - problem = true; - } + if (scf.ok) { + problem = false; + // continue on with scripts + } else { + // an error has occured so handle it appropriately + problem = true; + } }; // CUD = current user data const CUDFetch = await fetch("/you/supa/fsauth/getUserFromToken", { @@ -44,6 +49,7 @@ const userData = await userDataFetch.json(); studioID = userData.data[0].studio; + isBusy = userData.data[0].isBusy; } else { } }); @@ -60,6 +66,14 @@ Loading... {:else} + + +
diff --git a/src/routes/you/[user].svelte b/src/routes/you/[user].svelte index 6e52a3d..c2ee5f2 100644 --- a/src/routes/you/[user].svelte +++ b/src/routes/you/[user].svelte @@ -13,41 +13,51 @@ export let username; let responseResult: any = {}; let getResults: Function = function () {}; - let loading, ok = true; + let loading, + ok = true; onMount(async () => { - loading = true; - let youfetch = await fetch(`/you/supa/you_api/${username}`); - if (youfetch.ok) { - // the user exists so we can continue with displaying results - responseResult = await youfetch.json(); - loading = false; - } else { - // either the server has a code error, function timeout, or the user doesn't exist - responseResult.resultOk = false; - loading = false; - ok = false; - throw new Error("User not found"); - } + loading = true; + let youfetch = await fetch(`/you/supa/you_api/${username}`); + if (youfetch.ok) { + // the user exists so we can continue with displaying results + responseResult = await youfetch.json(); + loading = false; + } else { + // either the server has a code error, function timeout, or the user doesn't exist + responseResult.resultOk = false; + loading = false; + ok = false; + throw new Error("User not found"); + } });

{username} | You Page

-
+
{#if loading == true}

Loading...

Loading...
{:else if ok == true && loading == false} + {#if responseResult.data[0].busy} + This user is currently busy. + {/if}

Featured Studio

-
- Studio thumbnail -
-
{responseResult.studio.title}
-

{responseResult.studio.description}

- Go to studio -
-
+
+ Studio thumbnail +
+
{responseResult.studio.title}
+

{responseResult.studio.description}

+ Go to studio +
+
{:else} An error has occurred. This user may not exist.

{/if} - \ No newline at end of file + .card-title, + .card-text { + max-height: 100px; + overflow: scroll; + } + diff --git a/src/routes/you/supa/you_api/func/set.ts b/src/routes/you/supa/you_api/func/set.ts index 4f2cefc..db1b3a1 100644 --- a/src/routes/you/supa/you_api/func/set.ts +++ b/src/routes/you/supa/you_api/func/set.ts @@ -35,6 +35,7 @@ export async function post(request) { }; } const studioSet = Math.round(Number(parsedBody.studio)); + const isBusy = !!parsedBody.busy; const supabase = createClient( process.env["SUPABASE_URL"], process.env["SUPABASE_ANON_KEY"] @@ -46,14 +47,14 @@ export async function post(request) { if (userExists.error || userExists.data.length == 0) { const createUser = await supabase .from("users") - .insert([{ username: user, studio: studioSet }]); + .insert([{ username: user, studio: studioSet, busy: isBusy }]); if (createUser.error) { throw new Error("An error has occured.1"); } } else { const setUser = await supabase .from("users") - .update({ username: user, studio: studioSet }) + .update({ username: user, studio: studioSet, busy: isBusy }) .eq("username", user); if (setUser.error) { throw new Error(setUser.error.toString()); From 364c02d3d8b0c872fb94794f54d9452df8ce3764 Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Mon, 15 Nov 2021 19:05:36 +1300 Subject: [PATCH 11/15] oops --- src/routes/users/[user].svelte | 38 ---------------------------------- 1 file changed, 38 deletions(-) diff --git a/src/routes/users/[user].svelte b/src/routes/users/[user].svelte index c7e3b24..348c27e 100644 --- a/src/routes/users/[user].svelte +++ b/src/routes/users/[user].svelte @@ -195,44 +195,6 @@ href={`https://scratory.vercel.app/user/${info.username}`} >Visit on Scratory -

- Visit on Scratch - Visit on ScratchStats - Visit on ocular - Visit on PostPercent - Visit on Magnifier - Visit on Scratory -


From 9eb77119b1a6c6367cf971f78a50fad145cf09ec Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Mon, 15 Nov 2021 20:08:44 +1300 Subject: [PATCH 12/15] bring user to dashboard instead of homepage --- src/routes/you/supa/fsauth/checkAuth.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/you/supa/fsauth/checkAuth.svelte b/src/routes/you/supa/fsauth/checkAuth.svelte index c50cd19..1babf72 100644 --- a/src/routes/you/supa/fsauth/checkAuth.svelte +++ b/src/routes/you/supa/fsauth/checkAuth.svelte @@ -9,7 +9,7 @@ status = "Authentication valid." const afsjson = await authFetchStatus.json(); window.localStorage.setItem("authToken", afsjson.token) - window.location.href = "/" + window.location.href = "/dashboard" } else { status = "Authentication not valid. Redirecting to login menu..." window.location.href = "/login" From 25fa86cfc2c6d92150614736493d4bdabf5ec3a3 Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Mon, 15 Nov 2021 21:09:40 +1300 Subject: [PATCH 13/15] fix bug --- src/routes/dashboard.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/dashboard.svelte b/src/routes/dashboard.svelte index 8339f4c..ac7f1b0 100644 --- a/src/routes/dashboard.svelte +++ b/src/routes/dashboard.svelte @@ -49,7 +49,7 @@ const userData = await userDataFetch.json(); studioID = userData.data[0].studio; - isBusy = userData.data[0].isBusy; + isBusy = userData.data[0].busy; } else { } }); From 381351960af9abab5894fb2e88b419d42c165586 Mon Sep 17 00:00:00 2001 From: webdev03 <75148774+webdev03@users.noreply.github.com> Date: Mon, 15 Nov 2021 21:28:01 +1300 Subject: [PATCH 14/15] unnecessary step --- src/routes/dashboard.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/dashboard.svelte b/src/routes/dashboard.svelte index ac7f1b0..f75a42f 100644 --- a/src/routes/dashboard.svelte +++ b/src/routes/dashboard.svelte @@ -75,7 +75,7 @@ />
- +