From 6088659cdbcefc5291384054a5a6ec84319f9be0 Mon Sep 17 00:00:00 2001 From: split Date: Wed, 10 Jul 2024 19:17:50 -0700 Subject: [PATCH] av previews --- README.md | 8 +- bun.lockb | Bin 56724 -> 76572 bytes package-lock.json | 669 +++++++++++++++++- package.json | 9 +- .../20240710223854_user_model/migration.sql | 8 + prisma/schema.prisma | 5 + src/lib/avatars.ts | 33 + src/lib/clientsingleton.ts | 2 + src/lib/configuration.ts | 16 +- src/lib/{index.ts => oidc.ts} | 4 +- src/routes/+layout.server.ts | 2 +- src/routes/+layout.svelte | 129 ++-- .../avatar/[identifier]/[[size]]/+server.ts | 11 + src/routes/logout/+page.server.ts | 2 +- src/routes/set/+page.server.ts | 8 +- src/routes/set/+page.svelte | 26 +- src/routes/set/FilePreviewSet.svelte | 20 + {src/assets => static}/default/128.png | Bin {src/assets => static}/default/256.png | Bin {src/assets => static}/default/32.png | Bin {src/assets => static}/default/512.png | Bin {src/assets => static}/default/64.png | Bin {src/assets => static}/default/index.png | Bin 23 files changed, 831 insertions(+), 121 deletions(-) create mode 100644 prisma/migrations/20240710223854_user_model/migration.sql create mode 100644 src/lib/avatars.ts create mode 100644 src/lib/clientsingleton.ts rename src/lib/{index.ts => oidc.ts} (98%) create mode 100644 src/routes/avatar/[identifier]/[[size]]/+server.ts create mode 100644 src/routes/set/FilePreviewSet.svelte rename {src/assets => static}/default/128.png (100%) rename {src/assets => static}/default/256.png (100%) rename {src/assets => static}/default/32.png (100%) rename {src/assets => static}/default/512.png (100%) rename {src/assets => static}/default/64.png (100%) rename {src/assets => static}/default/index.png (100%) diff --git a/README.md b/README.md index 95a6eeb..d2a3790 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ava -ava is a simple avatar server written in TypeScript with SvelteKit and OIDC support. +ava is a simple avatar server written in TypeScript for Bun with SvelteKit and OIDC support. This exists for a few reasons: 1. I wanted to learn SvelteKit 2. I wanted to try implementing OAuth2/OIDC @@ -11,4 +11,8 @@ This exists for a few reasons:

Screenshot of the ava homepage -

\ No newline at end of file +

+ +## Todo +- Render image in multiple formats(?) +- Set up a more secure ImageMagick policy \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 2398c2b02ab3bb260388c1452f95fc476c5cc97c..9df74ce372009629acdb3530de89313b57d724e0 100755 GIT binary patch delta 21639 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 delta 9834 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 diff --git a/package-lock.json b/package-lock.json index f912e91..cd23edf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,17 @@ "name": "ava", "version": "0.0.1", "dependencies": { - "@fontsource-variable/inter": "^5.0.18" + "@fontsource-variable/inter": "^5.0.18", + "@fontsource-variable/noto-sans-mono": "^5.0.20", + "@prisma/client": "5.16.2", + "@types/node": "^20.14.10", + "magickwand.js": "^1.1.0" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.0.0", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@types/bun": "^1.1.6", "prettier": "^3.1.1", "prettier-plugin-svelte": "^3.1.2", "prisma": "^5.16.2", @@ -37,6 +42,15 @@ "node": ">=6.0.0" } }, + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -411,6 +425,12 @@ "integrity": "sha512-V5KPpF5o0sI1uNWAdFArC87NDOb/ZJDPXLomEiKmDCYMlDUCTn2flkuAZkyME2rtGOKO7vzCuDJAND0m/5PhDA==", "license": "OFL-1.1" }, + "node_modules/@fontsource-variable/noto-sans-mono": { + "version": "5.0.20", + "resolved": "https://registry.npmjs.org/@fontsource-variable/noto-sans-mono/-/noto-sans-mono-5.0.20.tgz", + "integrity": "sha512-Mik/wbKjiir7t+KBaDZnPZ5GjDnPOXpMF7obmFeyRa528ZsrKcFiSn4ZvArrn3sJMCp/k23wakOcXOWlGNc9cw==", + "license": "OFL-1.1" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -459,24 +479,78 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.25", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", "dev": true }, + "node_modules/@prisma/client": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", + "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, "node_modules/@prisma/debug": { "version": "5.16.2", "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { "version": "5.16.2", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -490,14 +564,14 @@ "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { "version": "5.16.2", "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@prisma/debug": "5.16.2", @@ -509,7 +583,7 @@ "version": "5.16.2", "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@prisma/debug": "5.16.2" @@ -806,6 +880,16 @@ "vite": "^5.0.0" } }, + "node_modules/@types/bun": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.1.6.tgz", + "integrity": "sha512-uJgKjTdX0GkWEHZzQzFsJkWp5+43ZS7HC8sZPFnOwnSo1AsNl2q9o2bFeS23disNDqbggEgyFkKCHl/w8iZsMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bun-types": "1.1.17" + } + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -818,12 +902,37 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/node": { + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@types/pug": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz", "integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==", "dev": true }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, "node_modules/acorn": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", @@ -836,6 +945,27 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -849,6 +979,26 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", @@ -870,8 +1020,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/binary-extensions": { "version": "2.3.0", @@ -889,7 +1038,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -916,6 +1064,39 @@ "node": ">=8.0.0" } }, + "node_modules/bun-types": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.17.tgz", + "integrity": "sha512-Z4+OplcSd/YZq7ZsrfD00DKJeCwuNY96a1IDJyR73+cTBaFIS7SC6LhpY/W3AMEXO9iYq5NJ58WAwnwL1p5vKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "~20.12.8", + "@types/ws": "~8.5.10" + } + }, + "node_modules/bun-types/node_modules/@types/node": { + "version": "20.12.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.14.tgz", + "integrity": "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -940,6 +1121,15 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/code-red": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", @@ -953,11 +1143,25 @@ "periscopic": "^3.1.0" } }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" }, "node_modules/cookie": { "version": "0.6.0", @@ -985,7 +1189,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1007,6 +1210,12 @@ "node": ">=0.10.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1025,12 +1234,41 @@ "node": ">=8" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/devalue": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.0.0.tgz", "integrity": "sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==", "dev": true }, + "node_modules/emnapi": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/emnapi/-/emnapi-1.2.0.tgz", + "integrity": "sha512-rcq+dJCcfr08I0XM/57LPRqaUokGfni/+SvhO7NaJthTTjRdohhIy0FQwyC5rR1enAsjkldQg83th8J5hURv0Q==", + "license": "MIT", + "peerDependencies": { + "node-addon-api": ">= 6.1.0" + }, + "peerDependenciesMeta": { + "node-addon-api": { + "optional": true + } + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -1102,11 +1340,34 @@ "node": ">=8" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -1122,12 +1383,32 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1173,6 +1454,25 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/import-meta-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", @@ -1188,7 +1488,6 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1197,8 +1496,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -1221,6 +1519,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1275,6 +1582,47 @@ "@jridgewell/sourcemap-codec": "^1.4.15" } }, + "node_modules/magickwand.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/magickwand.js/-/magickwand.js-1.1.0.tgz", + "integrity": "sha512-39GIX3de3lZ++SQ8xhjnnAt6rGLVI7suXdLDpcqDFpZqUTdhvfto4LfNt5IFmQZbpIp56cbETyxyOHgW80Es8A==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "@emnapi/runtime": "^1.0.0", + "@mapbox/node-pre-gyp": "^1.0.11", + "chalk": "^5.3.0", + "emnapi": "^1.0.0", + "node-addon-api": "^8.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -1294,7 +1642,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1311,6 +1658,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -1344,8 +1725,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { "version": "3.3.7", @@ -1365,6 +1745,50 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-addon-api": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.1.0.tgz", + "integrity": "sha512-yBY+qqWSv3dWKGODD6OGE6GnTX7Q2r+4+DfpqxHSHh8x0B4EKP9+wVGLS6U/AM1vxSNNmUEuIV5EGhYwPpfOwQ==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1374,11 +1798,32 @@ "node": ">=0.10.0" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -1387,7 +1832,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1478,7 +1922,7 @@ "version": "5.16.2", "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -1491,6 +1935,20 @@ "node": ">=16.13" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1563,6 +2021,26 @@ "node": ">=6" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/sander": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", @@ -1575,12 +2053,36 @@ "rimraf": "^2.5.2" } }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, "node_modules/set-cookie-parser": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", "dev": true }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -1619,6 +2121,41 @@ "node": ">=0.10.0" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -1750,6 +2287,35 @@ } } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", @@ -1781,11 +2347,16 @@ "node": ">=6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/typescript": { "version": "5.5.2", @@ -1800,6 +2371,18 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, "node_modules/vite": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", @@ -1869,11 +2452,41 @@ } } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" } } } diff --git a/package.json b/package.json index 042b28e..fa40232 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@sveltejs/adapter-auto": "^3.0.0", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@types/bun": "^1.1.6", "prettier": "^3.1.1", "prettier-plugin-svelte": "^3.1.2", "prisma": "^5.16.2", @@ -28,6 +29,10 @@ "dependencies": { "@fontsource-variable/inter": "^5.0.18", "@fontsource-variable/noto-sans-mono": "^5.0.20", - "@prisma/client": "5.16.2" - } + "@prisma/client": "5.16.2", + "magickwand.js": "^1.1.0" + }, + "trustedDependencies": [ + "magickwand.js" + ] } diff --git a/prisma/migrations/20240710223854_user_model/migration.sql b/prisma/migrations/20240710223854_user_model/migration.sql new file mode 100644 index 0000000..335cedf --- /dev/null +++ b/prisma/migrations/20240710223854_user_model/migration.sql @@ -0,0 +1,8 @@ +-- CreateTable +CREATE TABLE "User" ( + "userId" TEXT NOT NULL PRIMARY KEY, + "identifier" TEXT NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_userId_key" ON "User"("userId"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index e97eddb..5720b92 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -15,4 +15,9 @@ model Token { owner String token String refreshToken String? +} + +model User { + userId String @id @unique + identifier String } \ No newline at end of file diff --git a/src/lib/avatars.ts b/src/lib/avatars.ts new file mode 100644 index 0000000..6357bdb --- /dev/null +++ b/src/lib/avatars.ts @@ -0,0 +1,33 @@ +import { readdir } from "node:fs/promises" +import { existsSync } from "node:fs" +import { basename, join } from "node:path" +import { prisma } from "./clientsingleton" + +// todo: make customizable +export const avatarDirectory = "./.data/avatars" +export const defaultAvatarDirectory = "./static/default/" +export const renderSizes = [ 512, 256, 128, 64, 32 ] + +export async function getPathToAvatarForUid(uid?: string, size: string = "index") { + if (uid?.includes("/")) + throw Error("UID cannot include /") + + let userAvatarDirectory = uid ? join(avatarDirectory, uid) : defaultAvatarDirectory + if (!existsSync(userAvatarDirectory)) + userAvatarDirectory = defaultAvatarDirectory + + let sizes = await readdir(userAvatarDirectory) + const targetAvatar = sizes.find(s => s.match(/(.*)\..*/)?.[1] == size) + if (targetAvatar) + return join(userAvatarDirectory, targetAvatar) +} + +export async function getPathToAvatarForIdentifier(identifier: string, size: string = "index") { + let user = await prisma.user.findFirst({ + where: { + identifier + } + }) + + return getPathToAvatarForUid(user?.userId || "", size) +} \ No newline at end of file diff --git a/src/lib/clientsingleton.ts b/src/lib/clientsingleton.ts new file mode 100644 index 0000000..8cd5a62 --- /dev/null +++ b/src/lib/clientsingleton.ts @@ -0,0 +1,2 @@ +import { PrismaClient } from "@prisma/client" +export const prisma = new PrismaClient() \ No newline at end of file diff --git a/src/lib/configuration.ts b/src/lib/configuration.ts index aa5ac8f..978fe88 100644 --- a/src/lib/configuration.ts +++ b/src/lib/configuration.ts @@ -1,20 +1,20 @@ const configuration = { oauth2: { endpoints: { - authenticate: process.env.OAUTH2__AUTHENTICATE, + authenticate: process.env.OAUTH2__AUTHENTICATE!, logout: process.env.OAUTH2__LOGOUT, - token: process.env.OAUTH2__GET_TOKEN + token: process.env.OAUTH2__GET_TOKEN! }, client: { - id: process.env.OAUTH2__CLIENT_ID, - secret: process.env.OAUTH2__CLIENT_SECRET, - scopes: process.env.OAUTH2__SCOPES + id: process.env.OAUTH2__CLIENT_ID!, + secret: process.env.OAUTH2__CLIENT_SECRET!, + scopes: process.env.OAUTH2__SCOPES! } }, userinfo: { - route: process.env.USERINFO__ROUTE, - identifier: process.env.USERINFO__IDENTIFIER + route: process.env.USERINFO__ROUTE!, + identifier: process.env.USERINFO__IDENTIFIER! }, - allowed_types: process.env.ALLOWED_TYPES.split(",") + allowed_types: process.env.ALLOWED_TYPES!.split(",") } export default configuration \ No newline at end of file diff --git a/src/lib/index.ts b/src/lib/oidc.ts similarity index 98% rename from src/lib/index.ts rename to src/lib/oidc.ts index 3baee3d..32c7612 100644 --- a/src/lib/index.ts +++ b/src/lib/oidc.ts @@ -1,9 +1,7 @@ import { error, redirect, type Cookies } from "@sveltejs/kit" import configuration from "./configuration" import type { User } from "./types" -import { PrismaClient } from "@prisma/client" - -const prisma = new PrismaClient() +import { prisma } from "./clientsingleton" // Map of OAuth2 states const states = new Map }>() diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index a2b181d..2fb9686 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -1,4 +1,4 @@ -import { getRequestUser } from '$lib'; +import { getRequestUser } from '$lib/oidc'; export async function load({request, cookies}) { return { diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 3037f12..a1c0c36 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -5,73 +5,68 @@ import type { User } from "$lib/types"; export let data: { user?: User }; - - - - - - ava - - - + } + html { + background: var(--background); + } + body { + font-family: "Inter Variable", "Inter", sans-serif; + max-width: 35em; + margin: auto; + color: var(--text); + padding: 0 1em; + } + nav { + display: flex; + gap: 1em; + justify-content: center; + align-items: center; + margin: 1em 0; + } + svg { + width: .75em; + height: .75em; + } + nav svg { + width: 1.5em; + height: 1.5em; + } + nav > * { + display: flex; /* Flexbox fixes everything! */ + } + a { + color: var(--link) + } + code, pre { + font-family: "Space Mono", monospace, monospace; + } + + + - - - - - \ No newline at end of file + + + + \ No newline at end of file diff --git a/src/routes/avatar/[identifier]/[[size]]/+server.ts b/src/routes/avatar/[identifier]/[[size]]/+server.ts new file mode 100644 index 0000000..3662a11 --- /dev/null +++ b/src/routes/avatar/[identifier]/[[size]]/+server.ts @@ -0,0 +1,11 @@ +import { getPathToAvatarForIdentifier } from '$lib/avatars.js'; +import { error } from '@sveltejs/kit'; + +export async function GET({ params : { identifier, size } }) { + let avPath = await getPathToAvatarForIdentifier(identifier, size) + + if (!avPath) + throw error(404, "Avatar at this size not found") + + return new Response(Bun.file(avPath)) +} \ No newline at end of file diff --git a/src/routes/logout/+page.server.ts b/src/routes/logout/+page.server.ts index cc67892..b7d6874 100644 --- a/src/routes/logout/+page.server.ts +++ b/src/routes/logout/+page.server.ts @@ -1,5 +1,5 @@ import { invalidate } from "$app/navigation"; -import { deleteToken } from "$lib"; +import { deleteToken } from "$lib/oidc"; import configuration from "$lib/configuration.js"; import { redirect } from "@sveltejs/kit"; diff --git a/src/routes/set/+page.server.ts b/src/routes/set/+page.server.ts index e254f10..c750195 100644 --- a/src/routes/set/+page.server.ts +++ b/src/routes/set/+page.server.ts @@ -1,10 +1,12 @@ -import {launchLogin} from "$lib" +import {launchLogin} from "$lib/oidc" +import configuration from "$lib/configuration.js"; export async function load({ request, parent }) { const { user } = await parent(); if (!user) launchLogin(request) - + return { - url: request.url + url: request.url, + allowedImageTypes: configuration.allowed_types } } \ No newline at end of file diff --git a/src/routes/set/+page.svelte b/src/routes/set/+page.svelte index 5dfd951..d9808e9 100644 --- a/src/routes/set/+page.svelte +++ b/src/routes/set/+page.svelte @@ -1,7 +1,15 @@ @@ -66,7 +74,13 @@

- - + + -
\ No newline at end of file + +{#key fileSrc} +
+ +
+ +{/key} \ No newline at end of file diff --git a/src/routes/set/FilePreviewSet.svelte b/src/routes/set/FilePreviewSet.svelte new file mode 100644 index 0000000..5abe84e --- /dev/null +++ b/src/routes/set/FilePreviewSet.svelte @@ -0,0 +1,20 @@ + + +
+ {#each [128, 64, 32] as size} + avatar at {size}x{size} + {/each} +
\ No newline at end of file diff --git a/src/assets/default/128.png b/static/default/128.png similarity index 100% rename from src/assets/default/128.png rename to static/default/128.png diff --git a/src/assets/default/256.png b/static/default/256.png similarity index 100% rename from src/assets/default/256.png rename to static/default/256.png diff --git a/src/assets/default/32.png b/static/default/32.png similarity index 100% rename from src/assets/default/32.png rename to static/default/32.png diff --git a/src/assets/default/512.png b/static/default/512.png similarity index 100% rename from src/assets/default/512.png rename to static/default/512.png diff --git a/src/assets/default/64.png b/static/default/64.png similarity index 100% rename from src/assets/default/64.png rename to static/default/64.png diff --git a/src/assets/default/index.png b/static/default/index.png similarity index 100% rename from src/assets/default/index.png rename to static/default/index.png