├── .tool-versions ├── backend ├── .gitignore ├── authentication │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── backend │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ ├── views.py │ └── wsgi.py ├── manage.py └── templates │ └── home.html ├── frontend ├── .env.local.example ├── .eslintignore ├── .eslintrc.cjs ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── .tool-versions ├── README.md ├── package.json ├── pnpm-lock.yaml ├── src │ ├── app.d.ts │ ├── app.html │ ├── auth.ts │ ├── hooks.server.ts │ ├── lib │ │ └── index.ts │ └── routes │ │ ├── +layout.server.ts │ │ ├── +layout.svelte │ │ ├── +page.svelte │ │ ├── _nav.svelte │ │ ├── link │ │ └── +page.svelte │ │ ├── login │ │ ├── +page.svelte │ │ └── +page.ts │ │ ├── profile │ │ └── +page.svelte │ │ ├── protected │ │ ├── +page.server.ts │ │ └── +page.svelte │ │ └── session │ │ └── +page.svelte ├── static │ ├── favicon.ico │ └── favicon.png ├── svelte.config.js ├── tsconfig.json └── vite.config.ts ├── poetry.lock ├── pyproject.toml └── readme.rst /.tool-versions: -------------------------------------------------------------------------------- 1 | python 3.12.1 2 | nodejs 18.14.0 3 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | # Django # 2 | db.sqlite3 3 | 4 | # Python # 5 | *.py[cod] 6 | __pycache__/ 7 | *$py.class 8 | -------------------------------------------------------------------------------- /backend/authentication/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paul-schwendenman/django-svelte-authjs/cf2e1c1cef682530f4962963f5e1149ad6a959f8/backend/authentication/__init__.py -------------------------------------------------------------------------------- /backend/authentication/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /backend/authentication/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AuthenticationConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'authentication' 7 | -------------------------------------------------------------------------------- /backend/authentication/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paul-schwendenman/django-svelte-authjs/cf2e1c1cef682530f4962963f5e1149ad6a959f8/backend/authentication/migrations/__init__.py -------------------------------------------------------------------------------- /backend/authentication/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /backend/authentication/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /backend/authentication/urls.py: -------------------------------------------------------------------------------- 1 | 2 | from django.urls import path, include 3 | from rest_framework_simplejwt.views import TokenBlacklistView 4 | from authentication.views import GithubLogin, GoogleLogin 5 | 6 | urlpatterns = [ 7 | path('', include('dj_rest_auth.urls')), 8 | path('registration/', include('dj_rest_auth.registration.urls')), 9 | path('token/blacklist/', TokenBlacklistView.as_view(), name='token_blacklist'), 10 | path("github/", GithubLogin.as_view(), name="github_login"), 11 | path("google/", GoogleLogin.as_view(), name="google_login"), 12 | ] 13 | -------------------------------------------------------------------------------- /backend/authentication/views.py: -------------------------------------------------------------------------------- 1 | from dj_rest_auth.registration.views import SocialLoginView 2 | from allauth.socialaccount.providers.google.views import GoogleOAuth2Adapter 3 | from allauth.socialaccount.providers.github.views import GitHubOAuth2Adapter 4 | from allauth.socialaccount.providers.oauth2.client import OAuth2Client 5 | 6 | 7 | class GoogleLogin(SocialLoginView): 8 | adapter_class = GoogleOAuth2Adapter 9 | callback_url = "http://127.0.0.1:5173/" 10 | client_class = OAuth2Client 11 | 12 | 13 | class GithubLogin(SocialLoginView): 14 | adapter_class = GitHubOAuth2Adapter 15 | callback_url = "http://127.0.0.1:5173/" 16 | client_class = OAuth2Client 17 | 18 | -------------------------------------------------------------------------------- /backend/backend/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paul-schwendenman/django-svelte-authjs/cf2e1c1cef682530f4962963f5e1149ad6a959f8/backend/backend/__init__.py -------------------------------------------------------------------------------- /backend/backend/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for backend project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /backend/backend/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for backend project. 3 | 4 | Generated by 'django-admin startproject' using Django 5.0.1. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/5.0/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | from datetime import timedelta 15 | import os.path 16 | 17 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 18 | BASE_DIR = Path(__file__).resolve().parent.parent 19 | 20 | SITE_ID = 1 21 | 22 | # Quick-start development settings - unsuitable for production 23 | # See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ 24 | 25 | # SECURITY WARNING: keep the secret key used in production secret! 26 | SECRET_KEY = 'django-insecure-o2dylioz@f3q+ek#3w%0(a3=rq3@pn3co)a@p))=5t%(d6s3f)' 27 | 28 | # SECURITY WARNING: don't run with debug turned on in production! 29 | DEBUG = True 30 | 31 | ALLOWED_HOSTS = [] 32 | 33 | CORS_ALLOW_ALL_ORIGINS = True 34 | 35 | 36 | # Application definition 37 | 38 | INSTALLED_APPS = [ 39 | 'django.contrib.sites', 40 | 'django.contrib.admin', 41 | 'django.contrib.auth', 42 | 'django.contrib.contenttypes', 43 | 'django.contrib.sessions', 44 | 'django.contrib.messages', 45 | 'django.contrib.staticfiles', 46 | 'authentication.apps.AuthenticationConfig', 47 | 'rest_framework', 48 | 'rest_framework.authtoken', 49 | 'rest_framework_simplejwt', 50 | 'rest_framework_simplejwt.token_blacklist', 51 | 'allauth', 52 | 'allauth.account', 53 | 'allauth.socialaccount', 54 | 'allauth.socialaccount.providers.github', 55 | 'allauth.socialaccount.providers.google', 56 | 'dj_rest_auth', 57 | 'dj_rest_auth.registration', 58 | 'corsheaders', 59 | ] 60 | 61 | MIDDLEWARE = [ 62 | 'django.middleware.security.SecurityMiddleware', 63 | 'django.contrib.sessions.middleware.SessionMiddleware', 64 | 'corsheaders.middleware.CorsMiddleware', 65 | 'django.middleware.common.CommonMiddleware', 66 | 'django.middleware.csrf.CsrfViewMiddleware', 67 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 68 | 'django.contrib.messages.middleware.MessageMiddleware', 69 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 70 | 'allauth.account.middleware.AccountMiddleware', 71 | ] 72 | 73 | ROOT_URLCONF = 'backend.urls' 74 | 75 | TEMPLATES = [ 76 | { 77 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 78 | 'DIRS': [os.path.join(BASE_DIR, 'templates')], 79 | 'APP_DIRS': True, 80 | 'OPTIONS': { 81 | 'context_processors': [ 82 | 'django.template.context_processors.debug', 83 | 'django.template.context_processors.request', 84 | 'django.contrib.auth.context_processors.auth', 85 | 'django.contrib.messages.context_processors.messages', 86 | ], 87 | }, 88 | }, 89 | ] 90 | 91 | WSGI_APPLICATION = 'backend.wsgi.application' 92 | 93 | 94 | # Database 95 | # https://docs.djangoproject.com/en/5.0/ref/settings/#databases 96 | 97 | DATABASES = { 98 | 'default': { 99 | 'ENGINE': 'django.db.backends.sqlite3', 100 | 'NAME': BASE_DIR / 'db.sqlite3', 101 | } 102 | } 103 | 104 | 105 | # Password validation 106 | # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators 107 | 108 | AUTH_PASSWORD_VALIDATORS = [ 109 | { 110 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 111 | }, 112 | { 113 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 114 | }, 115 | { 116 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 117 | }, 118 | { 119 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 120 | }, 121 | ] 122 | 123 | 124 | AUTHENTICATION_BACKENDS = ( 125 | "django.contrib.auth.backends.ModelBackend", 126 | "allauth.account.auth_backends.AuthenticationBackend", 127 | ) 128 | 129 | # Internationalization 130 | # https://docs.djangoproject.com/en/5.0/topics/i18n/ 131 | 132 | LANGUAGE_CODE = 'en-us' 133 | 134 | TIME_ZONE = 'UTC' 135 | 136 | USE_I18N = True 137 | 138 | USE_TZ = True 139 | 140 | 141 | # Static files (CSS, JavaScript, Images) 142 | # https://docs.djangoproject.com/en/5.0/howto/static-files/ 143 | 144 | STATIC_URL = 'static/' 145 | 146 | # Default primary key field type 147 | # https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field 148 | 149 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 150 | 151 | REST_FRAMEWORK = { 152 | "DEFAULT_AUTHENTICATION_CLASSES": [ 153 | "rest_framework_simplejwt.authentication.JWTAuthentication", 154 | ] 155 | } 156 | 157 | SIMPLE_JWT = { 158 | 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), 159 | 'REFRESH_TOKEN_LIFETIME': timedelta(days=7), 160 | 'ROTATE_REFRESH_TOKENS': True, 161 | 'BLACKLIST_AFTER_ROTATION': True, 162 | 'UPDATE_LAST_LOGIN': True, 163 | 'SIGNING_KEY': 'complexsigningkey', # generate a key and replace me 164 | 'ALGORITHM': 'HS512', 165 | } 166 | 167 | 168 | REST_AUTH = { 169 | "USE_JWT": True, 170 | "JWT_AUTH_HTTPONLY": False, 171 | } 172 | 173 | ACCOUNT_EMAIL_REQUIRED = False 174 | ACCOUNT_EMAIL_VERIFICATION = 'none' 175 | LOGIN_REDIRECT_URL = 'home' 176 | 177 | 178 | SOCIALACCOUNT_PROVIDERS = { 179 | "github": { 180 | # For each provider, you can choose whether or not the 181 | # email address(es) retrieved from the provider are to be 182 | # interpreted as verified. 183 | "VERIFIED_EMAIL": True 184 | }, 185 | "google": { 186 | # For each provider, you can choose whether or not the 187 | # email address(es) retrieved from the provider are to be 188 | # interpreted as verified. 189 | "VERIFIED_EMAIL": True 190 | }, 191 | } 192 | 193 | -------------------------------------------------------------------------------- /backend/backend/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URL configuration for backend project. 3 | 4 | The `urlpatterns` list routes URLs to views. For more information please see: 5 | https://docs.djangoproject.com/en/5.0/topics/http/urls/ 6 | Examples: 7 | Function views 8 | 1. Add an import: from my_app import views 9 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 10 | Class-based views 11 | 1. Add an import: from other_app.views import Home 12 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 13 | Including another URLconf 14 | 1. Import the include() function: from django.urls import include, path 15 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 16 | """ 17 | from django.contrib import admin 18 | from django.urls import path, include 19 | 20 | from .views import Home 21 | 22 | 23 | urlpatterns = [ 24 | path('api/auth/', include('authentication.urls')), 25 | path('accounts/', include('allauth.urls')), 26 | path('admin/', admin.site.urls), 27 | path('', Home.as_view(), name='home'), 28 | ] 29 | -------------------------------------------------------------------------------- /backend/backend/views.py: -------------------------------------------------------------------------------- 1 | from django.views.generic import TemplateView 2 | 3 | 4 | class Home(TemplateView): 5 | template_name = 'home.html' 6 | -------------------------------------------------------------------------------- /backend/backend/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for backend project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /backend/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /backend/templates/home.html: -------------------------------------------------------------------------------- 1 | {% load socialaccount %} 2 | 3 |

Django Allauth Tutorial

4 | {% if user.is_authenticated %} 5 |

Welcome {{ user.username }} !!!

6 | Sign Out 7 | {% else %} 8 | Google Sign Up 9 | Github Sign Up 10 | Sign In 11 | {% endif %} 12 | -------------------------------------------------------------------------------- /frontend/.env.local.example: -------------------------------------------------------------------------------- 1 | AUTH_SECRET= # Linux: `openssl rand -hex 32` 2 | 3 | AUTH_BACKEND_URL= 4 | 5 | AUTH_GITHUB_ID= 6 | AUTH_GITHUB_SECRET= 7 | 8 | AUTH_GOOGLE_ID= 9 | AUTH_GOOGLE_SECRET= 10 | -------------------------------------------------------------------------------- /frontend/.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /frontend/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | /** @type { import("eslint").Linter.Config } */ 2 | module.exports = { 3 | root: true, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:@typescript-eslint/recommended', 7 | 'plugin:svelte/recommended', 8 | 'prettier' 9 | ], 10 | parser: '@typescript-eslint/parser', 11 | plugins: ['@typescript-eslint'], 12 | parserOptions: { 13 | sourceType: 'module', 14 | ecmaVersion: 2020, 15 | extraFileExtensions: ['.svelte'] 16 | }, 17 | env: { 18 | browser: true, 19 | es2017: true, 20 | node: true 21 | }, 22 | overrides: [ 23 | { 24 | files: ['*.svelte'], 25 | parser: 'svelte-eslint-parser', 26 | parserOptions: { 27 | parser: '@typescript-eslint/parser' 28 | } 29 | } 30 | ] 31 | }; 32 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | !.env.*.example 10 | vite.config.js.timestamp-* 11 | vite.config.ts.timestamp-* 12 | -------------------------------------------------------------------------------- /frontend/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /frontend/.prettierignore: -------------------------------------------------------------------------------- 1 | # Ignore files for PNPM, NPM and YARN 2 | pnpm-lock.yaml 3 | package-lock.json 4 | yarn.lock 5 | -------------------------------------------------------------------------------- /frontend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 8 | } 9 | -------------------------------------------------------------------------------- /frontend/.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 18.18.2 2 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # create-svelte 2 | 3 | Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte). 4 | 5 | ## Creating a project 6 | 7 | If you're seeing this, you've probably already done this step. Congrats! 8 | 9 | ```bash 10 | # create a new project in the current directory 11 | npm create svelte@latest 12 | 13 | # create a new project in my-app 14 | npm create svelte@latest my-app 15 | ``` 16 | 17 | ## Developing 18 | 19 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 20 | 21 | ```bash 22 | npm run dev 23 | 24 | # or start the server and open the app in a new browser tab 25 | npm run dev -- --open 26 | ``` 27 | 28 | ## Building 29 | 30 | To create a production version of your app: 31 | 32 | ```bash 33 | npm run build 34 | ``` 35 | 36 | You can preview the production build with `npm run preview`. 37 | 38 | > To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. 39 | 40 | ## Sources 41 | 42 | I followed a couple pages and guides to get this project up and running 43 | 44 | - https://testdriven.io/blog/django-rest-authjs/ 45 | - https://docs.allauth.org/en/latest/installation/quickstart.html 46 | - https://www.freecodecamp.org/news/set-up-github-oauth-on-django-for-user-authentication/ 47 | - https://authjs.dev/reference/sveltekit 48 | - https://kit.svelte.dev/docs/modules#$env-static-public 49 | - https://authjs.dev/getting-started/typescript#module-augmentation 50 | - https://itecnote.com/tecnote/django-allauth-linking-multiple-social-accounts-to-a-single-user/ 51 | - https://next-auth.js.org/configuration/pages 52 | - https://next-auth.js.org/configuration/options#theme 53 | - https://authjs.dev/getting-started/providers/credentials-tutorial 54 | - https://medium.com/@uriser/authentication-in-sveltekit-with-auth-js-7ff505d584c4 55 | - https://dev.to/mabaranowski/nextjs-authentication-jwt-refresh-token-rotation-with-nextauthjs-5696 56 | - https://authjs.dev/guides/basics/refresh-token-rotation?frameworks=core 57 | - https://asvrada.github.io/blog/django-graphql-jwt/ 58 | - https://next-auth.js.org/configuration/options#callbacks 59 | - https://learndjango.com/tutorials/django-allauth-tutorial 60 | - https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/lib/pages/signin.tsx 61 | 62 | 63 | ## Notes 64 | 65 | AUTH_SECRET is a random string used by the library to encrypt tokens and email verification hashes: 66 | 67 | ``` 68 | openssl rand -base64 32 69 | ``` 70 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite dev", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 10 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 11 | "lint": "prettier --check . && eslint .", 12 | "format": "prettier --write ." 13 | }, 14 | "devDependencies": { 15 | "@auth/core": "^0.37.4", 16 | "@auth/sveltekit": "^1.7.4", 17 | "@sveltejs/adapter-auto": "^3.3.1", 18 | "@sveltejs/kit": "^2.8.1", 19 | "@sveltejs/vite-plugin-svelte": "^3.1.2", 20 | "@types/eslint": "8.56.0", 21 | "@typescript-eslint/eslint-plugin": "^6.21.0", 22 | "@typescript-eslint/parser": "^6.21.0", 23 | "eslint": "^8.57.1", 24 | "eslint-config-prettier": "^9.1.0", 25 | "eslint-plugin-svelte": "^2.46.0", 26 | "prettier": "^3.3.3", 27 | "prettier-plugin-svelte": "^3.2.8", 28 | "svelte": "^4.2.19", 29 | "svelte-check": "^3.8.6", 30 | "tslib": "^2.8.1", 31 | "typescript": "^5.6.3", 32 | "vite": "^5.4.11" 33 | }, 34 | "type": "module", 35 | "pnpm": { 36 | "patchedDependencies": {} 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /frontend/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@auth/core': 12 | specifier: ^0.37.4 13 | version: 0.37.4 14 | '@auth/sveltekit': 15 | specifier: ^1.7.4 16 | version: 1.7.4(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19) 17 | '@sveltejs/adapter-auto': 18 | specifier: ^3.3.1 19 | version: 3.3.1(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)(vite@5.4.11)) 20 | '@sveltejs/kit': 21 | specifier: ^2.8.1 22 | version: 2.8.1(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)(vite@5.4.11) 23 | '@sveltejs/vite-plugin-svelte': 24 | specifier: ^3.1.2 25 | version: 3.1.2(svelte@4.2.19)(vite@5.4.11) 26 | '@types/eslint': 27 | specifier: 8.56.0 28 | version: 8.56.0 29 | '@typescript-eslint/eslint-plugin': 30 | specifier: ^6.21.0 31 | version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) 32 | '@typescript-eslint/parser': 33 | specifier: ^6.21.0 34 | version: 6.21.0(eslint@8.57.1)(typescript@5.6.3) 35 | eslint: 36 | specifier: ^8.57.1 37 | version: 8.57.1 38 | eslint-config-prettier: 39 | specifier: ^9.1.0 40 | version: 9.1.0(eslint@8.57.1) 41 | eslint-plugin-svelte: 42 | specifier: ^2.46.0 43 | version: 2.46.0(eslint@8.57.1)(svelte@4.2.19) 44 | prettier: 45 | specifier: ^3.3.3 46 | version: 3.3.3 47 | prettier-plugin-svelte: 48 | specifier: ^3.2.8 49 | version: 3.2.8(prettier@3.3.3)(svelte@4.2.19) 50 | svelte: 51 | specifier: ^4.2.19 52 | version: 4.2.19 53 | svelte-check: 54 | specifier: ^3.8.6 55 | version: 3.8.6(postcss-load-config@3.1.4(postcss@8.4.49))(postcss@8.4.49)(svelte@4.2.19) 56 | tslib: 57 | specifier: ^2.8.1 58 | version: 2.8.1 59 | typescript: 60 | specifier: ^5.6.3 61 | version: 5.6.3 62 | vite: 63 | specifier: ^5.4.11 64 | version: 5.4.11 65 | 66 | packages: 67 | 68 | '@ampproject/remapping@2.3.0': 69 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 70 | engines: {node: '>=6.0.0'} 71 | 72 | '@auth/core@0.37.4': 73 | resolution: {integrity: sha512-HOXJwXWXQRhbBDHlMU0K/6FT1v+wjtzdKhsNg0ZN7/gne6XPsIrjZ4daMcFnbq0Z/vsAbYBinQhhua0d77v7qw==} 74 | peerDependencies: 75 | '@simplewebauthn/browser': ^9.0.1 76 | '@simplewebauthn/server': ^9.0.2 77 | nodemailer: ^6.8.0 78 | peerDependenciesMeta: 79 | '@simplewebauthn/browser': 80 | optional: true 81 | '@simplewebauthn/server': 82 | optional: true 83 | nodemailer: 84 | optional: true 85 | 86 | '@auth/sveltekit@1.7.4': 87 | resolution: {integrity: sha512-jerujN2T6txrVGcblhWrB75sBbtub3v2U1DM9+8W3MOOSfhFdlCLEW+Uow8qAGZzsnTE2WmvcMkXeGd7r2jl5A==} 88 | peerDependencies: 89 | '@simplewebauthn/browser': ^9.0.1 90 | '@simplewebauthn/server': ^9.0.3 91 | '@sveltejs/kit': ^1.0.0 || ^2.0.0 92 | nodemailer: ^6.6.5 93 | svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-0 94 | peerDependenciesMeta: 95 | '@simplewebauthn/browser': 96 | optional: true 97 | '@simplewebauthn/server': 98 | optional: true 99 | nodemailer: 100 | optional: true 101 | 102 | '@esbuild/aix-ppc64@0.21.5': 103 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 104 | engines: {node: '>=12'} 105 | cpu: [ppc64] 106 | os: [aix] 107 | 108 | '@esbuild/android-arm64@0.21.5': 109 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 110 | engines: {node: '>=12'} 111 | cpu: [arm64] 112 | os: [android] 113 | 114 | '@esbuild/android-arm@0.21.5': 115 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 116 | engines: {node: '>=12'} 117 | cpu: [arm] 118 | os: [android] 119 | 120 | '@esbuild/android-x64@0.21.5': 121 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 122 | engines: {node: '>=12'} 123 | cpu: [x64] 124 | os: [android] 125 | 126 | '@esbuild/darwin-arm64@0.21.5': 127 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 128 | engines: {node: '>=12'} 129 | cpu: [arm64] 130 | os: [darwin] 131 | 132 | '@esbuild/darwin-x64@0.21.5': 133 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 134 | engines: {node: '>=12'} 135 | cpu: [x64] 136 | os: [darwin] 137 | 138 | '@esbuild/freebsd-arm64@0.21.5': 139 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 140 | engines: {node: '>=12'} 141 | cpu: [arm64] 142 | os: [freebsd] 143 | 144 | '@esbuild/freebsd-x64@0.21.5': 145 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 146 | engines: {node: '>=12'} 147 | cpu: [x64] 148 | os: [freebsd] 149 | 150 | '@esbuild/linux-arm64@0.21.5': 151 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 152 | engines: {node: '>=12'} 153 | cpu: [arm64] 154 | os: [linux] 155 | 156 | '@esbuild/linux-arm@0.21.5': 157 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 158 | engines: {node: '>=12'} 159 | cpu: [arm] 160 | os: [linux] 161 | 162 | '@esbuild/linux-ia32@0.21.5': 163 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 164 | engines: {node: '>=12'} 165 | cpu: [ia32] 166 | os: [linux] 167 | 168 | '@esbuild/linux-loong64@0.21.5': 169 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 170 | engines: {node: '>=12'} 171 | cpu: [loong64] 172 | os: [linux] 173 | 174 | '@esbuild/linux-mips64el@0.21.5': 175 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 176 | engines: {node: '>=12'} 177 | cpu: [mips64el] 178 | os: [linux] 179 | 180 | '@esbuild/linux-ppc64@0.21.5': 181 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 182 | engines: {node: '>=12'} 183 | cpu: [ppc64] 184 | os: [linux] 185 | 186 | '@esbuild/linux-riscv64@0.21.5': 187 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 188 | engines: {node: '>=12'} 189 | cpu: [riscv64] 190 | os: [linux] 191 | 192 | '@esbuild/linux-s390x@0.21.5': 193 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 194 | engines: {node: '>=12'} 195 | cpu: [s390x] 196 | os: [linux] 197 | 198 | '@esbuild/linux-x64@0.21.5': 199 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 200 | engines: {node: '>=12'} 201 | cpu: [x64] 202 | os: [linux] 203 | 204 | '@esbuild/netbsd-x64@0.21.5': 205 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 206 | engines: {node: '>=12'} 207 | cpu: [x64] 208 | os: [netbsd] 209 | 210 | '@esbuild/openbsd-x64@0.21.5': 211 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 212 | engines: {node: '>=12'} 213 | cpu: [x64] 214 | os: [openbsd] 215 | 216 | '@esbuild/sunos-x64@0.21.5': 217 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 218 | engines: {node: '>=12'} 219 | cpu: [x64] 220 | os: [sunos] 221 | 222 | '@esbuild/win32-arm64@0.21.5': 223 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 224 | engines: {node: '>=12'} 225 | cpu: [arm64] 226 | os: [win32] 227 | 228 | '@esbuild/win32-ia32@0.21.5': 229 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 230 | engines: {node: '>=12'} 231 | cpu: [ia32] 232 | os: [win32] 233 | 234 | '@esbuild/win32-x64@0.21.5': 235 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 236 | engines: {node: '>=12'} 237 | cpu: [x64] 238 | os: [win32] 239 | 240 | '@eslint-community/eslint-utils@4.4.1': 241 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 242 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 243 | peerDependencies: 244 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 245 | 246 | '@eslint-community/regexpp@4.12.1': 247 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 248 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 249 | 250 | '@eslint/eslintrc@2.1.4': 251 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 252 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 253 | 254 | '@eslint/js@8.57.1': 255 | resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} 256 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 257 | 258 | '@humanwhocodes/config-array@0.13.0': 259 | resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} 260 | engines: {node: '>=10.10.0'} 261 | deprecated: Use @eslint/config-array instead 262 | 263 | '@humanwhocodes/module-importer@1.0.1': 264 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 265 | engines: {node: '>=12.22'} 266 | 267 | '@humanwhocodes/object-schema@2.0.3': 268 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 269 | deprecated: Use @eslint/object-schema instead 270 | 271 | '@jridgewell/gen-mapping@0.3.5': 272 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 273 | engines: {node: '>=6.0.0'} 274 | 275 | '@jridgewell/resolve-uri@3.1.2': 276 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 277 | engines: {node: '>=6.0.0'} 278 | 279 | '@jridgewell/set-array@1.2.1': 280 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 281 | engines: {node: '>=6.0.0'} 282 | 283 | '@jridgewell/sourcemap-codec@1.5.0': 284 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 285 | 286 | '@jridgewell/trace-mapping@0.3.25': 287 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 288 | 289 | '@nodelib/fs.scandir@2.1.5': 290 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 291 | engines: {node: '>= 8'} 292 | 293 | '@nodelib/fs.stat@2.0.5': 294 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 295 | engines: {node: '>= 8'} 296 | 297 | '@nodelib/fs.walk@1.2.8': 298 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 299 | engines: {node: '>= 8'} 300 | 301 | '@panva/hkdf@1.2.1': 302 | resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} 303 | 304 | '@polka/url@1.0.0-next.28': 305 | resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} 306 | 307 | '@rollup/rollup-android-arm-eabi@4.27.3': 308 | resolution: {integrity: sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==} 309 | cpu: [arm] 310 | os: [android] 311 | 312 | '@rollup/rollup-android-arm64@4.27.3': 313 | resolution: {integrity: sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==} 314 | cpu: [arm64] 315 | os: [android] 316 | 317 | '@rollup/rollup-darwin-arm64@4.27.3': 318 | resolution: {integrity: sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==} 319 | cpu: [arm64] 320 | os: [darwin] 321 | 322 | '@rollup/rollup-darwin-x64@4.27.3': 323 | resolution: {integrity: sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==} 324 | cpu: [x64] 325 | os: [darwin] 326 | 327 | '@rollup/rollup-freebsd-arm64@4.27.3': 328 | resolution: {integrity: sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==} 329 | cpu: [arm64] 330 | os: [freebsd] 331 | 332 | '@rollup/rollup-freebsd-x64@4.27.3': 333 | resolution: {integrity: sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==} 334 | cpu: [x64] 335 | os: [freebsd] 336 | 337 | '@rollup/rollup-linux-arm-gnueabihf@4.27.3': 338 | resolution: {integrity: sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==} 339 | cpu: [arm] 340 | os: [linux] 341 | 342 | '@rollup/rollup-linux-arm-musleabihf@4.27.3': 343 | resolution: {integrity: sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==} 344 | cpu: [arm] 345 | os: [linux] 346 | 347 | '@rollup/rollup-linux-arm64-gnu@4.27.3': 348 | resolution: {integrity: sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==} 349 | cpu: [arm64] 350 | os: [linux] 351 | 352 | '@rollup/rollup-linux-arm64-musl@4.27.3': 353 | resolution: {integrity: sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==} 354 | cpu: [arm64] 355 | os: [linux] 356 | 357 | '@rollup/rollup-linux-powerpc64le-gnu@4.27.3': 358 | resolution: {integrity: sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==} 359 | cpu: [ppc64] 360 | os: [linux] 361 | 362 | '@rollup/rollup-linux-riscv64-gnu@4.27.3': 363 | resolution: {integrity: sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==} 364 | cpu: [riscv64] 365 | os: [linux] 366 | 367 | '@rollup/rollup-linux-s390x-gnu@4.27.3': 368 | resolution: {integrity: sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==} 369 | cpu: [s390x] 370 | os: [linux] 371 | 372 | '@rollup/rollup-linux-x64-gnu@4.27.3': 373 | resolution: {integrity: sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==} 374 | cpu: [x64] 375 | os: [linux] 376 | 377 | '@rollup/rollup-linux-x64-musl@4.27.3': 378 | resolution: {integrity: sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==} 379 | cpu: [x64] 380 | os: [linux] 381 | 382 | '@rollup/rollup-win32-arm64-msvc@4.27.3': 383 | resolution: {integrity: sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==} 384 | cpu: [arm64] 385 | os: [win32] 386 | 387 | '@rollup/rollup-win32-ia32-msvc@4.27.3': 388 | resolution: {integrity: sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==} 389 | cpu: [ia32] 390 | os: [win32] 391 | 392 | '@rollup/rollup-win32-x64-msvc@4.27.3': 393 | resolution: {integrity: sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==} 394 | cpu: [x64] 395 | os: [win32] 396 | 397 | '@sveltejs/adapter-auto@3.3.1': 398 | resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==} 399 | peerDependencies: 400 | '@sveltejs/kit': ^2.0.0 401 | 402 | '@sveltejs/kit@2.8.1': 403 | resolution: {integrity: sha512-uuOfFwZ4xvnfPsiTB6a4H1ljjTUksGhWnYq5X/Y9z4x5+3uM2Md8q/YVeHL+7w+mygAwoEFdgKZ8YkUuk+VKww==} 404 | engines: {node: '>=18.13'} 405 | hasBin: true 406 | peerDependencies: 407 | '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 408 | svelte: ^4.0.0 || ^5.0.0-next.0 409 | vite: ^5.0.3 410 | 411 | '@sveltejs/vite-plugin-svelte-inspector@2.1.0': 412 | resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} 413 | engines: {node: ^18.0.0 || >=20} 414 | peerDependencies: 415 | '@sveltejs/vite-plugin-svelte': ^3.0.0 416 | svelte: ^4.0.0 || ^5.0.0-next.0 417 | vite: ^5.0.0 418 | 419 | '@sveltejs/vite-plugin-svelte@3.1.2': 420 | resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==} 421 | engines: {node: ^18.0.0 || >=20} 422 | peerDependencies: 423 | svelte: ^4.0.0 || ^5.0.0-next.0 424 | vite: ^5.0.0 425 | 426 | '@types/cookie@0.6.0': 427 | resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 428 | 429 | '@types/eslint@8.56.0': 430 | resolution: {integrity: sha512-FlsN0p4FhuYRjIxpbdXovvHQhtlG05O1GG/RNWvdAxTboR438IOTwmrY/vLA+Xfgg06BTkP045M3vpFwTMv1dg==} 431 | 432 | '@types/estree@1.0.6': 433 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 434 | 435 | '@types/json-schema@7.0.15': 436 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 437 | 438 | '@types/pug@2.0.10': 439 | resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} 440 | 441 | '@types/semver@7.5.8': 442 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 443 | 444 | '@typescript-eslint/eslint-plugin@6.21.0': 445 | resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} 446 | engines: {node: ^16.0.0 || >=18.0.0} 447 | peerDependencies: 448 | '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha 449 | eslint: ^7.0.0 || ^8.0.0 450 | typescript: '*' 451 | peerDependenciesMeta: 452 | typescript: 453 | optional: true 454 | 455 | '@typescript-eslint/parser@6.21.0': 456 | resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} 457 | engines: {node: ^16.0.0 || >=18.0.0} 458 | peerDependencies: 459 | eslint: ^7.0.0 || ^8.0.0 460 | typescript: '*' 461 | peerDependenciesMeta: 462 | typescript: 463 | optional: true 464 | 465 | '@typescript-eslint/scope-manager@6.21.0': 466 | resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} 467 | engines: {node: ^16.0.0 || >=18.0.0} 468 | 469 | '@typescript-eslint/type-utils@6.21.0': 470 | resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} 471 | engines: {node: ^16.0.0 || >=18.0.0} 472 | peerDependencies: 473 | eslint: ^7.0.0 || ^8.0.0 474 | typescript: '*' 475 | peerDependenciesMeta: 476 | typescript: 477 | optional: true 478 | 479 | '@typescript-eslint/types@6.21.0': 480 | resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} 481 | engines: {node: ^16.0.0 || >=18.0.0} 482 | 483 | '@typescript-eslint/typescript-estree@6.21.0': 484 | resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} 485 | engines: {node: ^16.0.0 || >=18.0.0} 486 | peerDependencies: 487 | typescript: '*' 488 | peerDependenciesMeta: 489 | typescript: 490 | optional: true 491 | 492 | '@typescript-eslint/utils@6.21.0': 493 | resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} 494 | engines: {node: ^16.0.0 || >=18.0.0} 495 | peerDependencies: 496 | eslint: ^7.0.0 || ^8.0.0 497 | 498 | '@typescript-eslint/visitor-keys@6.21.0': 499 | resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} 500 | engines: {node: ^16.0.0 || >=18.0.0} 501 | 502 | '@ungap/structured-clone@1.2.0': 503 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 504 | 505 | acorn-jsx@5.3.2: 506 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 507 | peerDependencies: 508 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 509 | 510 | acorn@8.14.0: 511 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 512 | engines: {node: '>=0.4.0'} 513 | hasBin: true 514 | 515 | ajv@6.12.6: 516 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 517 | 518 | ansi-regex@5.0.1: 519 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 520 | engines: {node: '>=8'} 521 | 522 | ansi-styles@4.3.0: 523 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 524 | engines: {node: '>=8'} 525 | 526 | anymatch@3.1.3: 527 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 528 | engines: {node: '>= 8'} 529 | 530 | argparse@2.0.1: 531 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 532 | 533 | aria-query@5.3.2: 534 | resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 535 | engines: {node: '>= 0.4'} 536 | 537 | array-union@2.1.0: 538 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 539 | engines: {node: '>=8'} 540 | 541 | axobject-query@4.1.0: 542 | resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 543 | engines: {node: '>= 0.4'} 544 | 545 | balanced-match@1.0.2: 546 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 547 | 548 | binary-extensions@2.3.0: 549 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 550 | engines: {node: '>=8'} 551 | 552 | brace-expansion@1.1.11: 553 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 554 | 555 | brace-expansion@2.0.1: 556 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 557 | 558 | braces@3.0.3: 559 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 560 | engines: {node: '>=8'} 561 | 562 | buffer-crc32@1.0.0: 563 | resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} 564 | engines: {node: '>=8.0.0'} 565 | 566 | callsites@3.1.0: 567 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 568 | engines: {node: '>=6'} 569 | 570 | chalk@4.1.2: 571 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 572 | engines: {node: '>=10'} 573 | 574 | chokidar@3.6.0: 575 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 576 | engines: {node: '>= 8.10.0'} 577 | 578 | code-red@1.0.4: 579 | resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} 580 | 581 | color-convert@2.0.1: 582 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 583 | engines: {node: '>=7.0.0'} 584 | 585 | color-name@1.1.4: 586 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 587 | 588 | concat-map@0.0.1: 589 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 590 | 591 | cookie@0.6.0: 592 | resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 593 | engines: {node: '>= 0.6'} 594 | 595 | cross-spawn@7.0.6: 596 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 597 | engines: {node: '>= 8'} 598 | 599 | css-tree@2.3.1: 600 | resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 601 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 602 | 603 | cssesc@3.0.0: 604 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 605 | engines: {node: '>=4'} 606 | hasBin: true 607 | 608 | debug@4.3.7: 609 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 610 | engines: {node: '>=6.0'} 611 | peerDependencies: 612 | supports-color: '*' 613 | peerDependenciesMeta: 614 | supports-color: 615 | optional: true 616 | 617 | deep-is@0.1.4: 618 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 619 | 620 | deepmerge@4.3.1: 621 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 622 | engines: {node: '>=0.10.0'} 623 | 624 | detect-indent@6.1.0: 625 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 626 | engines: {node: '>=8'} 627 | 628 | devalue@5.1.1: 629 | resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} 630 | 631 | dir-glob@3.0.1: 632 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 633 | engines: {node: '>=8'} 634 | 635 | doctrine@3.0.0: 636 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 637 | engines: {node: '>=6.0.0'} 638 | 639 | es6-promise@3.3.1: 640 | resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} 641 | 642 | esbuild@0.21.5: 643 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 644 | engines: {node: '>=12'} 645 | hasBin: true 646 | 647 | escape-string-regexp@4.0.0: 648 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 649 | engines: {node: '>=10'} 650 | 651 | eslint-compat-utils@0.5.1: 652 | resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} 653 | engines: {node: '>=12'} 654 | peerDependencies: 655 | eslint: '>=6.0.0' 656 | 657 | eslint-config-prettier@9.1.0: 658 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 659 | hasBin: true 660 | peerDependencies: 661 | eslint: '>=7.0.0' 662 | 663 | eslint-plugin-svelte@2.46.0: 664 | resolution: {integrity: sha512-1A7iEMkzmCZ9/Iz+EAfOGYL8IoIG6zeKEq1SmpxGeM5SXmoQq+ZNnCpXFVJpsxPWYx8jIVGMerQMzX20cqUl0g==} 665 | engines: {node: ^14.17.0 || >=16.0.0} 666 | peerDependencies: 667 | eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 668 | svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 669 | peerDependenciesMeta: 670 | svelte: 671 | optional: true 672 | 673 | eslint-scope@7.2.2: 674 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 675 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 676 | 677 | eslint-visitor-keys@3.4.3: 678 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 679 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 680 | 681 | eslint@8.57.1: 682 | resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} 683 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 684 | deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. 685 | hasBin: true 686 | 687 | esm-env@1.1.4: 688 | resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==} 689 | 690 | espree@9.6.1: 691 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 692 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 693 | 694 | esquery@1.6.0: 695 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 696 | engines: {node: '>=0.10'} 697 | 698 | esrecurse@4.3.0: 699 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 700 | engines: {node: '>=4.0'} 701 | 702 | estraverse@5.3.0: 703 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 704 | engines: {node: '>=4.0'} 705 | 706 | estree-walker@3.0.3: 707 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 708 | 709 | esutils@2.0.3: 710 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 711 | engines: {node: '>=0.10.0'} 712 | 713 | fast-deep-equal@3.1.3: 714 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 715 | 716 | fast-glob@3.3.2: 717 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 718 | engines: {node: '>=8.6.0'} 719 | 720 | fast-json-stable-stringify@2.1.0: 721 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 722 | 723 | fast-levenshtein@2.0.6: 724 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 725 | 726 | fastq@1.17.1: 727 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 728 | 729 | file-entry-cache@6.0.1: 730 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 731 | engines: {node: ^10.12.0 || >=12.0.0} 732 | 733 | fill-range@7.1.1: 734 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 735 | engines: {node: '>=8'} 736 | 737 | find-up@5.0.0: 738 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 739 | engines: {node: '>=10'} 740 | 741 | flat-cache@3.2.0: 742 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 743 | engines: {node: ^10.12.0 || >=12.0.0} 744 | 745 | flatted@3.3.2: 746 | resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} 747 | 748 | fs.realpath@1.0.0: 749 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 750 | 751 | fsevents@2.3.3: 752 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 753 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 754 | os: [darwin] 755 | 756 | glob-parent@5.1.2: 757 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 758 | engines: {node: '>= 6'} 759 | 760 | glob-parent@6.0.2: 761 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 762 | engines: {node: '>=10.13.0'} 763 | 764 | glob@7.2.3: 765 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 766 | deprecated: Glob versions prior to v9 are no longer supported 767 | 768 | globals@13.24.0: 769 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 770 | engines: {node: '>=8'} 771 | 772 | globalyzer@0.1.0: 773 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 774 | 775 | globby@11.1.0: 776 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 777 | engines: {node: '>=10'} 778 | 779 | globrex@0.1.2: 780 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 781 | 782 | graceful-fs@4.2.11: 783 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 784 | 785 | graphemer@1.4.0: 786 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 787 | 788 | has-flag@4.0.0: 789 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 790 | engines: {node: '>=8'} 791 | 792 | ignore@5.3.2: 793 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 794 | engines: {node: '>= 4'} 795 | 796 | import-fresh@3.3.0: 797 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 798 | engines: {node: '>=6'} 799 | 800 | import-meta-resolve@4.1.0: 801 | resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} 802 | 803 | imurmurhash@0.1.4: 804 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 805 | engines: {node: '>=0.8.19'} 806 | 807 | inflight@1.0.6: 808 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 809 | 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. 810 | 811 | inherits@2.0.4: 812 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 813 | 814 | is-binary-path@2.1.0: 815 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 816 | engines: {node: '>=8'} 817 | 818 | is-extglob@2.1.1: 819 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 820 | engines: {node: '>=0.10.0'} 821 | 822 | is-glob@4.0.3: 823 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 824 | engines: {node: '>=0.10.0'} 825 | 826 | is-number@7.0.0: 827 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 828 | engines: {node: '>=0.12.0'} 829 | 830 | is-path-inside@3.0.3: 831 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 832 | engines: {node: '>=8'} 833 | 834 | is-reference@3.0.3: 835 | resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} 836 | 837 | isexe@2.0.0: 838 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 839 | 840 | jose@5.9.6: 841 | resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} 842 | 843 | js-yaml@4.1.0: 844 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 845 | hasBin: true 846 | 847 | json-buffer@3.0.1: 848 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 849 | 850 | json-schema-traverse@0.4.1: 851 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 852 | 853 | json-stable-stringify-without-jsonify@1.0.1: 854 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 855 | 856 | keyv@4.5.4: 857 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 858 | 859 | kleur@4.1.5: 860 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 861 | engines: {node: '>=6'} 862 | 863 | known-css-properties@0.35.0: 864 | resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} 865 | 866 | levn@0.4.1: 867 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 868 | engines: {node: '>= 0.8.0'} 869 | 870 | lilconfig@2.1.0: 871 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 872 | engines: {node: '>=10'} 873 | 874 | locate-character@3.0.0: 875 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 876 | 877 | locate-path@6.0.0: 878 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 879 | engines: {node: '>=10'} 880 | 881 | lodash.merge@4.6.2: 882 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 883 | 884 | magic-string@0.30.13: 885 | resolution: {integrity: sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==} 886 | 887 | mdn-data@2.0.30: 888 | resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 889 | 890 | merge2@1.4.1: 891 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 892 | engines: {node: '>= 8'} 893 | 894 | micromatch@4.0.8: 895 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 896 | engines: {node: '>=8.6'} 897 | 898 | min-indent@1.0.1: 899 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 900 | engines: {node: '>=4'} 901 | 902 | minimatch@3.1.2: 903 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 904 | 905 | minimatch@9.0.3: 906 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 907 | engines: {node: '>=16 || 14 >=14.17'} 908 | 909 | minimist@1.2.8: 910 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 911 | 912 | mkdirp@0.5.6: 913 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 914 | hasBin: true 915 | 916 | mri@1.2.0: 917 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 918 | engines: {node: '>=4'} 919 | 920 | mrmime@2.0.0: 921 | resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} 922 | engines: {node: '>=10'} 923 | 924 | ms@2.1.3: 925 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 926 | 927 | nanoid@3.3.7: 928 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 929 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 930 | hasBin: true 931 | 932 | natural-compare@1.4.0: 933 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 934 | 935 | normalize-path@3.0.0: 936 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 937 | engines: {node: '>=0.10.0'} 938 | 939 | oauth4webapi@3.1.3: 940 | resolution: {integrity: sha512-dik5wEMdFL5p3JlijYvM7wMNCgaPhblLIDCZtdXcaZp5wgu5Iwmsu7lMzgFhIDTi5d0BJo03LVoOoFQvXMeOeQ==} 941 | 942 | once@1.4.0: 943 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 944 | 945 | optionator@0.9.4: 946 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 947 | engines: {node: '>= 0.8.0'} 948 | 949 | p-limit@3.1.0: 950 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 951 | engines: {node: '>=10'} 952 | 953 | p-locate@5.0.0: 954 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 955 | engines: {node: '>=10'} 956 | 957 | parent-module@1.0.1: 958 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 959 | engines: {node: '>=6'} 960 | 961 | path-exists@4.0.0: 962 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 963 | engines: {node: '>=8'} 964 | 965 | path-is-absolute@1.0.1: 966 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 967 | engines: {node: '>=0.10.0'} 968 | 969 | path-key@3.1.1: 970 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 971 | engines: {node: '>=8'} 972 | 973 | path-type@4.0.0: 974 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 975 | engines: {node: '>=8'} 976 | 977 | periscopic@3.1.0: 978 | resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} 979 | 980 | picocolors@1.1.1: 981 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 982 | 983 | picomatch@2.3.1: 984 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 985 | engines: {node: '>=8.6'} 986 | 987 | postcss-load-config@3.1.4: 988 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 989 | engines: {node: '>= 10'} 990 | peerDependencies: 991 | postcss: '>=8.0.9' 992 | ts-node: '>=9.0.0' 993 | peerDependenciesMeta: 994 | postcss: 995 | optional: true 996 | ts-node: 997 | optional: true 998 | 999 | postcss-safe-parser@6.0.0: 1000 | resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} 1001 | engines: {node: '>=12.0'} 1002 | peerDependencies: 1003 | postcss: ^8.3.3 1004 | 1005 | postcss-scss@4.0.9: 1006 | resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} 1007 | engines: {node: '>=12.0'} 1008 | peerDependencies: 1009 | postcss: ^8.4.29 1010 | 1011 | postcss-selector-parser@6.1.2: 1012 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 1013 | engines: {node: '>=4'} 1014 | 1015 | postcss@8.4.49: 1016 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 1017 | engines: {node: ^10 || ^12 || >=14} 1018 | 1019 | preact-render-to-string@6.5.11: 1020 | resolution: {integrity: sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==} 1021 | peerDependencies: 1022 | preact: '>=10' 1023 | 1024 | preact@10.24.3: 1025 | resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} 1026 | 1027 | prelude-ls@1.2.1: 1028 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1029 | engines: {node: '>= 0.8.0'} 1030 | 1031 | prettier-plugin-svelte@3.2.8: 1032 | resolution: {integrity: sha512-PAHmmU5cGZdnhW4mWhmvxuG2PVbbHIxUuPOdUKvfE+d4Qt2d29iU5VWrPdsaW5YqVEE0nqhlvN4eoKmVMpIF3Q==} 1033 | peerDependencies: 1034 | prettier: ^3.0.0 1035 | svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 1036 | 1037 | prettier@3.3.3: 1038 | resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 1039 | engines: {node: '>=14'} 1040 | hasBin: true 1041 | 1042 | punycode@2.3.1: 1043 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1044 | engines: {node: '>=6'} 1045 | 1046 | queue-microtask@1.2.3: 1047 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1048 | 1049 | readdirp@3.6.0: 1050 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1051 | engines: {node: '>=8.10.0'} 1052 | 1053 | resolve-from@4.0.0: 1054 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1055 | engines: {node: '>=4'} 1056 | 1057 | reusify@1.0.4: 1058 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1059 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1060 | 1061 | rimraf@2.7.1: 1062 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 1063 | deprecated: Rimraf versions prior to v4 are no longer supported 1064 | hasBin: true 1065 | 1066 | rimraf@3.0.2: 1067 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1068 | deprecated: Rimraf versions prior to v4 are no longer supported 1069 | hasBin: true 1070 | 1071 | rollup@4.27.3: 1072 | resolution: {integrity: sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==} 1073 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1074 | hasBin: true 1075 | 1076 | run-parallel@1.2.0: 1077 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1078 | 1079 | sade@1.8.1: 1080 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1081 | engines: {node: '>=6'} 1082 | 1083 | sander@0.5.1: 1084 | resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} 1085 | 1086 | semver@7.6.3: 1087 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1088 | engines: {node: '>=10'} 1089 | hasBin: true 1090 | 1091 | set-cookie-parser@2.7.1: 1092 | resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} 1093 | 1094 | shebang-command@2.0.0: 1095 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1096 | engines: {node: '>=8'} 1097 | 1098 | shebang-regex@3.0.0: 1099 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1100 | engines: {node: '>=8'} 1101 | 1102 | sirv@3.0.0: 1103 | resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} 1104 | engines: {node: '>=18'} 1105 | 1106 | slash@3.0.0: 1107 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1108 | engines: {node: '>=8'} 1109 | 1110 | sorcery@0.11.1: 1111 | resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==} 1112 | hasBin: true 1113 | 1114 | source-map-js@1.2.1: 1115 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1116 | engines: {node: '>=0.10.0'} 1117 | 1118 | strip-ansi@6.0.1: 1119 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1120 | engines: {node: '>=8'} 1121 | 1122 | strip-indent@3.0.0: 1123 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1124 | engines: {node: '>=8'} 1125 | 1126 | strip-json-comments@3.1.1: 1127 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1128 | engines: {node: '>=8'} 1129 | 1130 | supports-color@7.2.0: 1131 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1132 | engines: {node: '>=8'} 1133 | 1134 | svelte-check@3.8.6: 1135 | resolution: {integrity: sha512-ij0u4Lw/sOTREP13BdWZjiXD/BlHE6/e2e34XzmVmsp5IN4kVa3PWP65NM32JAgwjZlwBg/+JtiNV1MM8khu0Q==} 1136 | hasBin: true 1137 | peerDependencies: 1138 | svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 1139 | 1140 | svelte-eslint-parser@0.43.0: 1141 | resolution: {integrity: sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==} 1142 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1143 | peerDependencies: 1144 | svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 1145 | peerDependenciesMeta: 1146 | svelte: 1147 | optional: true 1148 | 1149 | svelte-hmr@0.16.0: 1150 | resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} 1151 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 1152 | peerDependencies: 1153 | svelte: ^3.19.0 || ^4.0.0 1154 | 1155 | svelte-preprocess@5.1.4: 1156 | resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} 1157 | engines: {node: '>= 16.0.0'} 1158 | peerDependencies: 1159 | '@babel/core': ^7.10.2 1160 | coffeescript: ^2.5.1 1161 | less: ^3.11.3 || ^4.0.0 1162 | postcss: ^7 || ^8 1163 | postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 1164 | pug: ^3.0.0 1165 | sass: ^1.26.8 1166 | stylus: ^0.55.0 1167 | sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 1168 | svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 1169 | typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' 1170 | peerDependenciesMeta: 1171 | '@babel/core': 1172 | optional: true 1173 | coffeescript: 1174 | optional: true 1175 | less: 1176 | optional: true 1177 | postcss: 1178 | optional: true 1179 | postcss-load-config: 1180 | optional: true 1181 | pug: 1182 | optional: true 1183 | sass: 1184 | optional: true 1185 | stylus: 1186 | optional: true 1187 | sugarss: 1188 | optional: true 1189 | typescript: 1190 | optional: true 1191 | 1192 | svelte@4.2.19: 1193 | resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} 1194 | engines: {node: '>=16'} 1195 | 1196 | text-table@0.2.0: 1197 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1198 | 1199 | tiny-glob@0.2.9: 1200 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 1201 | 1202 | to-regex-range@5.0.1: 1203 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1204 | engines: {node: '>=8.0'} 1205 | 1206 | totalist@3.0.1: 1207 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1208 | engines: {node: '>=6'} 1209 | 1210 | ts-api-utils@1.4.0: 1211 | resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} 1212 | engines: {node: '>=16'} 1213 | peerDependencies: 1214 | typescript: '>=4.2.0' 1215 | 1216 | tslib@2.8.1: 1217 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1218 | 1219 | type-check@0.4.0: 1220 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1221 | engines: {node: '>= 0.8.0'} 1222 | 1223 | type-fest@0.20.2: 1224 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1225 | engines: {node: '>=10'} 1226 | 1227 | typescript@5.6.3: 1228 | resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 1229 | engines: {node: '>=14.17'} 1230 | hasBin: true 1231 | 1232 | uri-js@4.4.1: 1233 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1234 | 1235 | util-deprecate@1.0.2: 1236 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1237 | 1238 | vite@5.4.11: 1239 | resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} 1240 | engines: {node: ^18.0.0 || >=20.0.0} 1241 | hasBin: true 1242 | peerDependencies: 1243 | '@types/node': ^18.0.0 || >=20.0.0 1244 | less: '*' 1245 | lightningcss: ^1.21.0 1246 | sass: '*' 1247 | sass-embedded: '*' 1248 | stylus: '*' 1249 | sugarss: '*' 1250 | terser: ^5.4.0 1251 | peerDependenciesMeta: 1252 | '@types/node': 1253 | optional: true 1254 | less: 1255 | optional: true 1256 | lightningcss: 1257 | optional: true 1258 | sass: 1259 | optional: true 1260 | sass-embedded: 1261 | optional: true 1262 | stylus: 1263 | optional: true 1264 | sugarss: 1265 | optional: true 1266 | terser: 1267 | optional: true 1268 | 1269 | vitefu@0.2.5: 1270 | resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} 1271 | peerDependencies: 1272 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 1273 | peerDependenciesMeta: 1274 | vite: 1275 | optional: true 1276 | 1277 | which@2.0.2: 1278 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1279 | engines: {node: '>= 8'} 1280 | hasBin: true 1281 | 1282 | word-wrap@1.2.5: 1283 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1284 | engines: {node: '>=0.10.0'} 1285 | 1286 | wrappy@1.0.2: 1287 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1288 | 1289 | yaml@1.10.2: 1290 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1291 | engines: {node: '>= 6'} 1292 | 1293 | yocto-queue@0.1.0: 1294 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1295 | engines: {node: '>=10'} 1296 | 1297 | snapshots: 1298 | 1299 | '@ampproject/remapping@2.3.0': 1300 | dependencies: 1301 | '@jridgewell/gen-mapping': 0.3.5 1302 | '@jridgewell/trace-mapping': 0.3.25 1303 | 1304 | '@auth/core@0.37.4': 1305 | dependencies: 1306 | '@panva/hkdf': 1.2.1 1307 | jose: 5.9.6 1308 | oauth4webapi: 3.1.3 1309 | preact: 10.24.3 1310 | preact-render-to-string: 6.5.11(preact@10.24.3) 1311 | 1312 | '@auth/sveltekit@1.7.4(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)': 1313 | dependencies: 1314 | '@auth/core': 0.37.4 1315 | '@sveltejs/kit': 2.8.1(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)(vite@5.4.11) 1316 | set-cookie-parser: 2.7.1 1317 | svelte: 4.2.19 1318 | 1319 | '@esbuild/aix-ppc64@0.21.5': 1320 | optional: true 1321 | 1322 | '@esbuild/android-arm64@0.21.5': 1323 | optional: true 1324 | 1325 | '@esbuild/android-arm@0.21.5': 1326 | optional: true 1327 | 1328 | '@esbuild/android-x64@0.21.5': 1329 | optional: true 1330 | 1331 | '@esbuild/darwin-arm64@0.21.5': 1332 | optional: true 1333 | 1334 | '@esbuild/darwin-x64@0.21.5': 1335 | optional: true 1336 | 1337 | '@esbuild/freebsd-arm64@0.21.5': 1338 | optional: true 1339 | 1340 | '@esbuild/freebsd-x64@0.21.5': 1341 | optional: true 1342 | 1343 | '@esbuild/linux-arm64@0.21.5': 1344 | optional: true 1345 | 1346 | '@esbuild/linux-arm@0.21.5': 1347 | optional: true 1348 | 1349 | '@esbuild/linux-ia32@0.21.5': 1350 | optional: true 1351 | 1352 | '@esbuild/linux-loong64@0.21.5': 1353 | optional: true 1354 | 1355 | '@esbuild/linux-mips64el@0.21.5': 1356 | optional: true 1357 | 1358 | '@esbuild/linux-ppc64@0.21.5': 1359 | optional: true 1360 | 1361 | '@esbuild/linux-riscv64@0.21.5': 1362 | optional: true 1363 | 1364 | '@esbuild/linux-s390x@0.21.5': 1365 | optional: true 1366 | 1367 | '@esbuild/linux-x64@0.21.5': 1368 | optional: true 1369 | 1370 | '@esbuild/netbsd-x64@0.21.5': 1371 | optional: true 1372 | 1373 | '@esbuild/openbsd-x64@0.21.5': 1374 | optional: true 1375 | 1376 | '@esbuild/sunos-x64@0.21.5': 1377 | optional: true 1378 | 1379 | '@esbuild/win32-arm64@0.21.5': 1380 | optional: true 1381 | 1382 | '@esbuild/win32-ia32@0.21.5': 1383 | optional: true 1384 | 1385 | '@esbuild/win32-x64@0.21.5': 1386 | optional: true 1387 | 1388 | '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': 1389 | dependencies: 1390 | eslint: 8.57.1 1391 | eslint-visitor-keys: 3.4.3 1392 | 1393 | '@eslint-community/regexpp@4.12.1': {} 1394 | 1395 | '@eslint/eslintrc@2.1.4': 1396 | dependencies: 1397 | ajv: 6.12.6 1398 | debug: 4.3.7 1399 | espree: 9.6.1 1400 | globals: 13.24.0 1401 | ignore: 5.3.2 1402 | import-fresh: 3.3.0 1403 | js-yaml: 4.1.0 1404 | minimatch: 3.1.2 1405 | strip-json-comments: 3.1.1 1406 | transitivePeerDependencies: 1407 | - supports-color 1408 | 1409 | '@eslint/js@8.57.1': {} 1410 | 1411 | '@humanwhocodes/config-array@0.13.0': 1412 | dependencies: 1413 | '@humanwhocodes/object-schema': 2.0.3 1414 | debug: 4.3.7 1415 | minimatch: 3.1.2 1416 | transitivePeerDependencies: 1417 | - supports-color 1418 | 1419 | '@humanwhocodes/module-importer@1.0.1': {} 1420 | 1421 | '@humanwhocodes/object-schema@2.0.3': {} 1422 | 1423 | '@jridgewell/gen-mapping@0.3.5': 1424 | dependencies: 1425 | '@jridgewell/set-array': 1.2.1 1426 | '@jridgewell/sourcemap-codec': 1.5.0 1427 | '@jridgewell/trace-mapping': 0.3.25 1428 | 1429 | '@jridgewell/resolve-uri@3.1.2': {} 1430 | 1431 | '@jridgewell/set-array@1.2.1': {} 1432 | 1433 | '@jridgewell/sourcemap-codec@1.5.0': {} 1434 | 1435 | '@jridgewell/trace-mapping@0.3.25': 1436 | dependencies: 1437 | '@jridgewell/resolve-uri': 3.1.2 1438 | '@jridgewell/sourcemap-codec': 1.5.0 1439 | 1440 | '@nodelib/fs.scandir@2.1.5': 1441 | dependencies: 1442 | '@nodelib/fs.stat': 2.0.5 1443 | run-parallel: 1.2.0 1444 | 1445 | '@nodelib/fs.stat@2.0.5': {} 1446 | 1447 | '@nodelib/fs.walk@1.2.8': 1448 | dependencies: 1449 | '@nodelib/fs.scandir': 2.1.5 1450 | fastq: 1.17.1 1451 | 1452 | '@panva/hkdf@1.2.1': {} 1453 | 1454 | '@polka/url@1.0.0-next.28': {} 1455 | 1456 | '@rollup/rollup-android-arm-eabi@4.27.3': 1457 | optional: true 1458 | 1459 | '@rollup/rollup-android-arm64@4.27.3': 1460 | optional: true 1461 | 1462 | '@rollup/rollup-darwin-arm64@4.27.3': 1463 | optional: true 1464 | 1465 | '@rollup/rollup-darwin-x64@4.27.3': 1466 | optional: true 1467 | 1468 | '@rollup/rollup-freebsd-arm64@4.27.3': 1469 | optional: true 1470 | 1471 | '@rollup/rollup-freebsd-x64@4.27.3': 1472 | optional: true 1473 | 1474 | '@rollup/rollup-linux-arm-gnueabihf@4.27.3': 1475 | optional: true 1476 | 1477 | '@rollup/rollup-linux-arm-musleabihf@4.27.3': 1478 | optional: true 1479 | 1480 | '@rollup/rollup-linux-arm64-gnu@4.27.3': 1481 | optional: true 1482 | 1483 | '@rollup/rollup-linux-arm64-musl@4.27.3': 1484 | optional: true 1485 | 1486 | '@rollup/rollup-linux-powerpc64le-gnu@4.27.3': 1487 | optional: true 1488 | 1489 | '@rollup/rollup-linux-riscv64-gnu@4.27.3': 1490 | optional: true 1491 | 1492 | '@rollup/rollup-linux-s390x-gnu@4.27.3': 1493 | optional: true 1494 | 1495 | '@rollup/rollup-linux-x64-gnu@4.27.3': 1496 | optional: true 1497 | 1498 | '@rollup/rollup-linux-x64-musl@4.27.3': 1499 | optional: true 1500 | 1501 | '@rollup/rollup-win32-arm64-msvc@4.27.3': 1502 | optional: true 1503 | 1504 | '@rollup/rollup-win32-ia32-msvc@4.27.3': 1505 | optional: true 1506 | 1507 | '@rollup/rollup-win32-x64-msvc@4.27.3': 1508 | optional: true 1509 | 1510 | '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)(vite@5.4.11))': 1511 | dependencies: 1512 | '@sveltejs/kit': 2.8.1(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)(vite@5.4.11) 1513 | import-meta-resolve: 4.1.0 1514 | 1515 | '@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)(vite@5.4.11)': 1516 | dependencies: 1517 | '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.11) 1518 | '@types/cookie': 0.6.0 1519 | cookie: 0.6.0 1520 | devalue: 5.1.1 1521 | esm-env: 1.1.4 1522 | import-meta-resolve: 4.1.0 1523 | kleur: 4.1.5 1524 | magic-string: 0.30.13 1525 | mrmime: 2.0.0 1526 | sade: 1.8.1 1527 | set-cookie-parser: 2.7.1 1528 | sirv: 3.0.0 1529 | svelte: 4.2.19 1530 | tiny-glob: 0.2.9 1531 | vite: 5.4.11 1532 | 1533 | '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)(vite@5.4.11)': 1534 | dependencies: 1535 | '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.11) 1536 | debug: 4.3.7 1537 | svelte: 4.2.19 1538 | vite: 5.4.11 1539 | transitivePeerDependencies: 1540 | - supports-color 1541 | 1542 | '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11)': 1543 | dependencies: 1544 | '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.11))(svelte@4.2.19)(vite@5.4.11) 1545 | debug: 4.3.7 1546 | deepmerge: 4.3.1 1547 | kleur: 4.1.5 1548 | magic-string: 0.30.13 1549 | svelte: 4.2.19 1550 | svelte-hmr: 0.16.0(svelte@4.2.19) 1551 | vite: 5.4.11 1552 | vitefu: 0.2.5(vite@5.4.11) 1553 | transitivePeerDependencies: 1554 | - supports-color 1555 | 1556 | '@types/cookie@0.6.0': {} 1557 | 1558 | '@types/eslint@8.56.0': 1559 | dependencies: 1560 | '@types/estree': 1.0.6 1561 | '@types/json-schema': 7.0.15 1562 | 1563 | '@types/estree@1.0.6': {} 1564 | 1565 | '@types/json-schema@7.0.15': {} 1566 | 1567 | '@types/pug@2.0.10': {} 1568 | 1569 | '@types/semver@7.5.8': {} 1570 | 1571 | '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)': 1572 | dependencies: 1573 | '@eslint-community/regexpp': 4.12.1 1574 | '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.3) 1575 | '@typescript-eslint/scope-manager': 6.21.0 1576 | '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.6.3) 1577 | '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.6.3) 1578 | '@typescript-eslint/visitor-keys': 6.21.0 1579 | debug: 4.3.7 1580 | eslint: 8.57.1 1581 | graphemer: 1.4.0 1582 | ignore: 5.3.2 1583 | natural-compare: 1.4.0 1584 | semver: 7.6.3 1585 | ts-api-utils: 1.4.0(typescript@5.6.3) 1586 | optionalDependencies: 1587 | typescript: 5.6.3 1588 | transitivePeerDependencies: 1589 | - supports-color 1590 | 1591 | '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3)': 1592 | dependencies: 1593 | '@typescript-eslint/scope-manager': 6.21.0 1594 | '@typescript-eslint/types': 6.21.0 1595 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) 1596 | '@typescript-eslint/visitor-keys': 6.21.0 1597 | debug: 4.3.7 1598 | eslint: 8.57.1 1599 | optionalDependencies: 1600 | typescript: 5.6.3 1601 | transitivePeerDependencies: 1602 | - supports-color 1603 | 1604 | '@typescript-eslint/scope-manager@6.21.0': 1605 | dependencies: 1606 | '@typescript-eslint/types': 6.21.0 1607 | '@typescript-eslint/visitor-keys': 6.21.0 1608 | 1609 | '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.6.3)': 1610 | dependencies: 1611 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) 1612 | '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.6.3) 1613 | debug: 4.3.7 1614 | eslint: 8.57.1 1615 | ts-api-utils: 1.4.0(typescript@5.6.3) 1616 | optionalDependencies: 1617 | typescript: 5.6.3 1618 | transitivePeerDependencies: 1619 | - supports-color 1620 | 1621 | '@typescript-eslint/types@6.21.0': {} 1622 | 1623 | '@typescript-eslint/typescript-estree@6.21.0(typescript@5.6.3)': 1624 | dependencies: 1625 | '@typescript-eslint/types': 6.21.0 1626 | '@typescript-eslint/visitor-keys': 6.21.0 1627 | debug: 4.3.7 1628 | globby: 11.1.0 1629 | is-glob: 4.0.3 1630 | minimatch: 9.0.3 1631 | semver: 7.6.3 1632 | ts-api-utils: 1.4.0(typescript@5.6.3) 1633 | optionalDependencies: 1634 | typescript: 5.6.3 1635 | transitivePeerDependencies: 1636 | - supports-color 1637 | 1638 | '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.6.3)': 1639 | dependencies: 1640 | '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) 1641 | '@types/json-schema': 7.0.15 1642 | '@types/semver': 7.5.8 1643 | '@typescript-eslint/scope-manager': 6.21.0 1644 | '@typescript-eslint/types': 6.21.0 1645 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) 1646 | eslint: 8.57.1 1647 | semver: 7.6.3 1648 | transitivePeerDependencies: 1649 | - supports-color 1650 | - typescript 1651 | 1652 | '@typescript-eslint/visitor-keys@6.21.0': 1653 | dependencies: 1654 | '@typescript-eslint/types': 6.21.0 1655 | eslint-visitor-keys: 3.4.3 1656 | 1657 | '@ungap/structured-clone@1.2.0': {} 1658 | 1659 | acorn-jsx@5.3.2(acorn@8.14.0): 1660 | dependencies: 1661 | acorn: 8.14.0 1662 | 1663 | acorn@8.14.0: {} 1664 | 1665 | ajv@6.12.6: 1666 | dependencies: 1667 | fast-deep-equal: 3.1.3 1668 | fast-json-stable-stringify: 2.1.0 1669 | json-schema-traverse: 0.4.1 1670 | uri-js: 4.4.1 1671 | 1672 | ansi-regex@5.0.1: {} 1673 | 1674 | ansi-styles@4.3.0: 1675 | dependencies: 1676 | color-convert: 2.0.1 1677 | 1678 | anymatch@3.1.3: 1679 | dependencies: 1680 | normalize-path: 3.0.0 1681 | picomatch: 2.3.1 1682 | 1683 | argparse@2.0.1: {} 1684 | 1685 | aria-query@5.3.2: {} 1686 | 1687 | array-union@2.1.0: {} 1688 | 1689 | axobject-query@4.1.0: {} 1690 | 1691 | balanced-match@1.0.2: {} 1692 | 1693 | binary-extensions@2.3.0: {} 1694 | 1695 | brace-expansion@1.1.11: 1696 | dependencies: 1697 | balanced-match: 1.0.2 1698 | concat-map: 0.0.1 1699 | 1700 | brace-expansion@2.0.1: 1701 | dependencies: 1702 | balanced-match: 1.0.2 1703 | 1704 | braces@3.0.3: 1705 | dependencies: 1706 | fill-range: 7.1.1 1707 | 1708 | buffer-crc32@1.0.0: {} 1709 | 1710 | callsites@3.1.0: {} 1711 | 1712 | chalk@4.1.2: 1713 | dependencies: 1714 | ansi-styles: 4.3.0 1715 | supports-color: 7.2.0 1716 | 1717 | chokidar@3.6.0: 1718 | dependencies: 1719 | anymatch: 3.1.3 1720 | braces: 3.0.3 1721 | glob-parent: 5.1.2 1722 | is-binary-path: 2.1.0 1723 | is-glob: 4.0.3 1724 | normalize-path: 3.0.0 1725 | readdirp: 3.6.0 1726 | optionalDependencies: 1727 | fsevents: 2.3.3 1728 | 1729 | code-red@1.0.4: 1730 | dependencies: 1731 | '@jridgewell/sourcemap-codec': 1.5.0 1732 | '@types/estree': 1.0.6 1733 | acorn: 8.14.0 1734 | estree-walker: 3.0.3 1735 | periscopic: 3.1.0 1736 | 1737 | color-convert@2.0.1: 1738 | dependencies: 1739 | color-name: 1.1.4 1740 | 1741 | color-name@1.1.4: {} 1742 | 1743 | concat-map@0.0.1: {} 1744 | 1745 | cookie@0.6.0: {} 1746 | 1747 | cross-spawn@7.0.6: 1748 | dependencies: 1749 | path-key: 3.1.1 1750 | shebang-command: 2.0.0 1751 | which: 2.0.2 1752 | 1753 | css-tree@2.3.1: 1754 | dependencies: 1755 | mdn-data: 2.0.30 1756 | source-map-js: 1.2.1 1757 | 1758 | cssesc@3.0.0: {} 1759 | 1760 | debug@4.3.7: 1761 | dependencies: 1762 | ms: 2.1.3 1763 | 1764 | deep-is@0.1.4: {} 1765 | 1766 | deepmerge@4.3.1: {} 1767 | 1768 | detect-indent@6.1.0: {} 1769 | 1770 | devalue@5.1.1: {} 1771 | 1772 | dir-glob@3.0.1: 1773 | dependencies: 1774 | path-type: 4.0.0 1775 | 1776 | doctrine@3.0.0: 1777 | dependencies: 1778 | esutils: 2.0.3 1779 | 1780 | es6-promise@3.3.1: {} 1781 | 1782 | esbuild@0.21.5: 1783 | optionalDependencies: 1784 | '@esbuild/aix-ppc64': 0.21.5 1785 | '@esbuild/android-arm': 0.21.5 1786 | '@esbuild/android-arm64': 0.21.5 1787 | '@esbuild/android-x64': 0.21.5 1788 | '@esbuild/darwin-arm64': 0.21.5 1789 | '@esbuild/darwin-x64': 0.21.5 1790 | '@esbuild/freebsd-arm64': 0.21.5 1791 | '@esbuild/freebsd-x64': 0.21.5 1792 | '@esbuild/linux-arm': 0.21.5 1793 | '@esbuild/linux-arm64': 0.21.5 1794 | '@esbuild/linux-ia32': 0.21.5 1795 | '@esbuild/linux-loong64': 0.21.5 1796 | '@esbuild/linux-mips64el': 0.21.5 1797 | '@esbuild/linux-ppc64': 0.21.5 1798 | '@esbuild/linux-riscv64': 0.21.5 1799 | '@esbuild/linux-s390x': 0.21.5 1800 | '@esbuild/linux-x64': 0.21.5 1801 | '@esbuild/netbsd-x64': 0.21.5 1802 | '@esbuild/openbsd-x64': 0.21.5 1803 | '@esbuild/sunos-x64': 0.21.5 1804 | '@esbuild/win32-arm64': 0.21.5 1805 | '@esbuild/win32-ia32': 0.21.5 1806 | '@esbuild/win32-x64': 0.21.5 1807 | 1808 | escape-string-regexp@4.0.0: {} 1809 | 1810 | eslint-compat-utils@0.5.1(eslint@8.57.1): 1811 | dependencies: 1812 | eslint: 8.57.1 1813 | semver: 7.6.3 1814 | 1815 | eslint-config-prettier@9.1.0(eslint@8.57.1): 1816 | dependencies: 1817 | eslint: 8.57.1 1818 | 1819 | eslint-plugin-svelte@2.46.0(eslint@8.57.1)(svelte@4.2.19): 1820 | dependencies: 1821 | '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) 1822 | '@jridgewell/sourcemap-codec': 1.5.0 1823 | eslint: 8.57.1 1824 | eslint-compat-utils: 0.5.1(eslint@8.57.1) 1825 | esutils: 2.0.3 1826 | known-css-properties: 0.35.0 1827 | postcss: 8.4.49 1828 | postcss-load-config: 3.1.4(postcss@8.4.49) 1829 | postcss-safe-parser: 6.0.0(postcss@8.4.49) 1830 | postcss-selector-parser: 6.1.2 1831 | semver: 7.6.3 1832 | svelte-eslint-parser: 0.43.0(svelte@4.2.19) 1833 | optionalDependencies: 1834 | svelte: 4.2.19 1835 | transitivePeerDependencies: 1836 | - ts-node 1837 | 1838 | eslint-scope@7.2.2: 1839 | dependencies: 1840 | esrecurse: 4.3.0 1841 | estraverse: 5.3.0 1842 | 1843 | eslint-visitor-keys@3.4.3: {} 1844 | 1845 | eslint@8.57.1: 1846 | dependencies: 1847 | '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) 1848 | '@eslint-community/regexpp': 4.12.1 1849 | '@eslint/eslintrc': 2.1.4 1850 | '@eslint/js': 8.57.1 1851 | '@humanwhocodes/config-array': 0.13.0 1852 | '@humanwhocodes/module-importer': 1.0.1 1853 | '@nodelib/fs.walk': 1.2.8 1854 | '@ungap/structured-clone': 1.2.0 1855 | ajv: 6.12.6 1856 | chalk: 4.1.2 1857 | cross-spawn: 7.0.6 1858 | debug: 4.3.7 1859 | doctrine: 3.0.0 1860 | escape-string-regexp: 4.0.0 1861 | eslint-scope: 7.2.2 1862 | eslint-visitor-keys: 3.4.3 1863 | espree: 9.6.1 1864 | esquery: 1.6.0 1865 | esutils: 2.0.3 1866 | fast-deep-equal: 3.1.3 1867 | file-entry-cache: 6.0.1 1868 | find-up: 5.0.0 1869 | glob-parent: 6.0.2 1870 | globals: 13.24.0 1871 | graphemer: 1.4.0 1872 | ignore: 5.3.2 1873 | imurmurhash: 0.1.4 1874 | is-glob: 4.0.3 1875 | is-path-inside: 3.0.3 1876 | js-yaml: 4.1.0 1877 | json-stable-stringify-without-jsonify: 1.0.1 1878 | levn: 0.4.1 1879 | lodash.merge: 4.6.2 1880 | minimatch: 3.1.2 1881 | natural-compare: 1.4.0 1882 | optionator: 0.9.4 1883 | strip-ansi: 6.0.1 1884 | text-table: 0.2.0 1885 | transitivePeerDependencies: 1886 | - supports-color 1887 | 1888 | esm-env@1.1.4: {} 1889 | 1890 | espree@9.6.1: 1891 | dependencies: 1892 | acorn: 8.14.0 1893 | acorn-jsx: 5.3.2(acorn@8.14.0) 1894 | eslint-visitor-keys: 3.4.3 1895 | 1896 | esquery@1.6.0: 1897 | dependencies: 1898 | estraverse: 5.3.0 1899 | 1900 | esrecurse@4.3.0: 1901 | dependencies: 1902 | estraverse: 5.3.0 1903 | 1904 | estraverse@5.3.0: {} 1905 | 1906 | estree-walker@3.0.3: 1907 | dependencies: 1908 | '@types/estree': 1.0.6 1909 | 1910 | esutils@2.0.3: {} 1911 | 1912 | fast-deep-equal@3.1.3: {} 1913 | 1914 | fast-glob@3.3.2: 1915 | dependencies: 1916 | '@nodelib/fs.stat': 2.0.5 1917 | '@nodelib/fs.walk': 1.2.8 1918 | glob-parent: 5.1.2 1919 | merge2: 1.4.1 1920 | micromatch: 4.0.8 1921 | 1922 | fast-json-stable-stringify@2.1.0: {} 1923 | 1924 | fast-levenshtein@2.0.6: {} 1925 | 1926 | fastq@1.17.1: 1927 | dependencies: 1928 | reusify: 1.0.4 1929 | 1930 | file-entry-cache@6.0.1: 1931 | dependencies: 1932 | flat-cache: 3.2.0 1933 | 1934 | fill-range@7.1.1: 1935 | dependencies: 1936 | to-regex-range: 5.0.1 1937 | 1938 | find-up@5.0.0: 1939 | dependencies: 1940 | locate-path: 6.0.0 1941 | path-exists: 4.0.0 1942 | 1943 | flat-cache@3.2.0: 1944 | dependencies: 1945 | flatted: 3.3.2 1946 | keyv: 4.5.4 1947 | rimraf: 3.0.2 1948 | 1949 | flatted@3.3.2: {} 1950 | 1951 | fs.realpath@1.0.0: {} 1952 | 1953 | fsevents@2.3.3: 1954 | optional: true 1955 | 1956 | glob-parent@5.1.2: 1957 | dependencies: 1958 | is-glob: 4.0.3 1959 | 1960 | glob-parent@6.0.2: 1961 | dependencies: 1962 | is-glob: 4.0.3 1963 | 1964 | glob@7.2.3: 1965 | dependencies: 1966 | fs.realpath: 1.0.0 1967 | inflight: 1.0.6 1968 | inherits: 2.0.4 1969 | minimatch: 3.1.2 1970 | once: 1.4.0 1971 | path-is-absolute: 1.0.1 1972 | 1973 | globals@13.24.0: 1974 | dependencies: 1975 | type-fest: 0.20.2 1976 | 1977 | globalyzer@0.1.0: {} 1978 | 1979 | globby@11.1.0: 1980 | dependencies: 1981 | array-union: 2.1.0 1982 | dir-glob: 3.0.1 1983 | fast-glob: 3.3.2 1984 | ignore: 5.3.2 1985 | merge2: 1.4.1 1986 | slash: 3.0.0 1987 | 1988 | globrex@0.1.2: {} 1989 | 1990 | graceful-fs@4.2.11: {} 1991 | 1992 | graphemer@1.4.0: {} 1993 | 1994 | has-flag@4.0.0: {} 1995 | 1996 | ignore@5.3.2: {} 1997 | 1998 | import-fresh@3.3.0: 1999 | dependencies: 2000 | parent-module: 1.0.1 2001 | resolve-from: 4.0.0 2002 | 2003 | import-meta-resolve@4.1.0: {} 2004 | 2005 | imurmurhash@0.1.4: {} 2006 | 2007 | inflight@1.0.6: 2008 | dependencies: 2009 | once: 1.4.0 2010 | wrappy: 1.0.2 2011 | 2012 | inherits@2.0.4: {} 2013 | 2014 | is-binary-path@2.1.0: 2015 | dependencies: 2016 | binary-extensions: 2.3.0 2017 | 2018 | is-extglob@2.1.1: {} 2019 | 2020 | is-glob@4.0.3: 2021 | dependencies: 2022 | is-extglob: 2.1.1 2023 | 2024 | is-number@7.0.0: {} 2025 | 2026 | is-path-inside@3.0.3: {} 2027 | 2028 | is-reference@3.0.3: 2029 | dependencies: 2030 | '@types/estree': 1.0.6 2031 | 2032 | isexe@2.0.0: {} 2033 | 2034 | jose@5.9.6: {} 2035 | 2036 | js-yaml@4.1.0: 2037 | dependencies: 2038 | argparse: 2.0.1 2039 | 2040 | json-buffer@3.0.1: {} 2041 | 2042 | json-schema-traverse@0.4.1: {} 2043 | 2044 | json-stable-stringify-without-jsonify@1.0.1: {} 2045 | 2046 | keyv@4.5.4: 2047 | dependencies: 2048 | json-buffer: 3.0.1 2049 | 2050 | kleur@4.1.5: {} 2051 | 2052 | known-css-properties@0.35.0: {} 2053 | 2054 | levn@0.4.1: 2055 | dependencies: 2056 | prelude-ls: 1.2.1 2057 | type-check: 0.4.0 2058 | 2059 | lilconfig@2.1.0: {} 2060 | 2061 | locate-character@3.0.0: {} 2062 | 2063 | locate-path@6.0.0: 2064 | dependencies: 2065 | p-locate: 5.0.0 2066 | 2067 | lodash.merge@4.6.2: {} 2068 | 2069 | magic-string@0.30.13: 2070 | dependencies: 2071 | '@jridgewell/sourcemap-codec': 1.5.0 2072 | 2073 | mdn-data@2.0.30: {} 2074 | 2075 | merge2@1.4.1: {} 2076 | 2077 | micromatch@4.0.8: 2078 | dependencies: 2079 | braces: 3.0.3 2080 | picomatch: 2.3.1 2081 | 2082 | min-indent@1.0.1: {} 2083 | 2084 | minimatch@3.1.2: 2085 | dependencies: 2086 | brace-expansion: 1.1.11 2087 | 2088 | minimatch@9.0.3: 2089 | dependencies: 2090 | brace-expansion: 2.0.1 2091 | 2092 | minimist@1.2.8: {} 2093 | 2094 | mkdirp@0.5.6: 2095 | dependencies: 2096 | minimist: 1.2.8 2097 | 2098 | mri@1.2.0: {} 2099 | 2100 | mrmime@2.0.0: {} 2101 | 2102 | ms@2.1.3: {} 2103 | 2104 | nanoid@3.3.7: {} 2105 | 2106 | natural-compare@1.4.0: {} 2107 | 2108 | normalize-path@3.0.0: {} 2109 | 2110 | oauth4webapi@3.1.3: {} 2111 | 2112 | once@1.4.0: 2113 | dependencies: 2114 | wrappy: 1.0.2 2115 | 2116 | optionator@0.9.4: 2117 | dependencies: 2118 | deep-is: 0.1.4 2119 | fast-levenshtein: 2.0.6 2120 | levn: 0.4.1 2121 | prelude-ls: 1.2.1 2122 | type-check: 0.4.0 2123 | word-wrap: 1.2.5 2124 | 2125 | p-limit@3.1.0: 2126 | dependencies: 2127 | yocto-queue: 0.1.0 2128 | 2129 | p-locate@5.0.0: 2130 | dependencies: 2131 | p-limit: 3.1.0 2132 | 2133 | parent-module@1.0.1: 2134 | dependencies: 2135 | callsites: 3.1.0 2136 | 2137 | path-exists@4.0.0: {} 2138 | 2139 | path-is-absolute@1.0.1: {} 2140 | 2141 | path-key@3.1.1: {} 2142 | 2143 | path-type@4.0.0: {} 2144 | 2145 | periscopic@3.1.0: 2146 | dependencies: 2147 | '@types/estree': 1.0.6 2148 | estree-walker: 3.0.3 2149 | is-reference: 3.0.3 2150 | 2151 | picocolors@1.1.1: {} 2152 | 2153 | picomatch@2.3.1: {} 2154 | 2155 | postcss-load-config@3.1.4(postcss@8.4.49): 2156 | dependencies: 2157 | lilconfig: 2.1.0 2158 | yaml: 1.10.2 2159 | optionalDependencies: 2160 | postcss: 8.4.49 2161 | 2162 | postcss-safe-parser@6.0.0(postcss@8.4.49): 2163 | dependencies: 2164 | postcss: 8.4.49 2165 | 2166 | postcss-scss@4.0.9(postcss@8.4.49): 2167 | dependencies: 2168 | postcss: 8.4.49 2169 | 2170 | postcss-selector-parser@6.1.2: 2171 | dependencies: 2172 | cssesc: 3.0.0 2173 | util-deprecate: 1.0.2 2174 | 2175 | postcss@8.4.49: 2176 | dependencies: 2177 | nanoid: 3.3.7 2178 | picocolors: 1.1.1 2179 | source-map-js: 1.2.1 2180 | 2181 | preact-render-to-string@6.5.11(preact@10.24.3): 2182 | dependencies: 2183 | preact: 10.24.3 2184 | 2185 | preact@10.24.3: {} 2186 | 2187 | prelude-ls@1.2.1: {} 2188 | 2189 | prettier-plugin-svelte@3.2.8(prettier@3.3.3)(svelte@4.2.19): 2190 | dependencies: 2191 | prettier: 3.3.3 2192 | svelte: 4.2.19 2193 | 2194 | prettier@3.3.3: {} 2195 | 2196 | punycode@2.3.1: {} 2197 | 2198 | queue-microtask@1.2.3: {} 2199 | 2200 | readdirp@3.6.0: 2201 | dependencies: 2202 | picomatch: 2.3.1 2203 | 2204 | resolve-from@4.0.0: {} 2205 | 2206 | reusify@1.0.4: {} 2207 | 2208 | rimraf@2.7.1: 2209 | dependencies: 2210 | glob: 7.2.3 2211 | 2212 | rimraf@3.0.2: 2213 | dependencies: 2214 | glob: 7.2.3 2215 | 2216 | rollup@4.27.3: 2217 | dependencies: 2218 | '@types/estree': 1.0.6 2219 | optionalDependencies: 2220 | '@rollup/rollup-android-arm-eabi': 4.27.3 2221 | '@rollup/rollup-android-arm64': 4.27.3 2222 | '@rollup/rollup-darwin-arm64': 4.27.3 2223 | '@rollup/rollup-darwin-x64': 4.27.3 2224 | '@rollup/rollup-freebsd-arm64': 4.27.3 2225 | '@rollup/rollup-freebsd-x64': 4.27.3 2226 | '@rollup/rollup-linux-arm-gnueabihf': 4.27.3 2227 | '@rollup/rollup-linux-arm-musleabihf': 4.27.3 2228 | '@rollup/rollup-linux-arm64-gnu': 4.27.3 2229 | '@rollup/rollup-linux-arm64-musl': 4.27.3 2230 | '@rollup/rollup-linux-powerpc64le-gnu': 4.27.3 2231 | '@rollup/rollup-linux-riscv64-gnu': 4.27.3 2232 | '@rollup/rollup-linux-s390x-gnu': 4.27.3 2233 | '@rollup/rollup-linux-x64-gnu': 4.27.3 2234 | '@rollup/rollup-linux-x64-musl': 4.27.3 2235 | '@rollup/rollup-win32-arm64-msvc': 4.27.3 2236 | '@rollup/rollup-win32-ia32-msvc': 4.27.3 2237 | '@rollup/rollup-win32-x64-msvc': 4.27.3 2238 | fsevents: 2.3.3 2239 | 2240 | run-parallel@1.2.0: 2241 | dependencies: 2242 | queue-microtask: 1.2.3 2243 | 2244 | sade@1.8.1: 2245 | dependencies: 2246 | mri: 1.2.0 2247 | 2248 | sander@0.5.1: 2249 | dependencies: 2250 | es6-promise: 3.3.1 2251 | graceful-fs: 4.2.11 2252 | mkdirp: 0.5.6 2253 | rimraf: 2.7.1 2254 | 2255 | semver@7.6.3: {} 2256 | 2257 | set-cookie-parser@2.7.1: {} 2258 | 2259 | shebang-command@2.0.0: 2260 | dependencies: 2261 | shebang-regex: 3.0.0 2262 | 2263 | shebang-regex@3.0.0: {} 2264 | 2265 | sirv@3.0.0: 2266 | dependencies: 2267 | '@polka/url': 1.0.0-next.28 2268 | mrmime: 2.0.0 2269 | totalist: 3.0.1 2270 | 2271 | slash@3.0.0: {} 2272 | 2273 | sorcery@0.11.1: 2274 | dependencies: 2275 | '@jridgewell/sourcemap-codec': 1.5.0 2276 | buffer-crc32: 1.0.0 2277 | minimist: 1.2.8 2278 | sander: 0.5.1 2279 | 2280 | source-map-js@1.2.1: {} 2281 | 2282 | strip-ansi@6.0.1: 2283 | dependencies: 2284 | ansi-regex: 5.0.1 2285 | 2286 | strip-indent@3.0.0: 2287 | dependencies: 2288 | min-indent: 1.0.1 2289 | 2290 | strip-json-comments@3.1.1: {} 2291 | 2292 | supports-color@7.2.0: 2293 | dependencies: 2294 | has-flag: 4.0.0 2295 | 2296 | svelte-check@3.8.6(postcss-load-config@3.1.4(postcss@8.4.49))(postcss@8.4.49)(svelte@4.2.19): 2297 | dependencies: 2298 | '@jridgewell/trace-mapping': 0.3.25 2299 | chokidar: 3.6.0 2300 | picocolors: 1.1.1 2301 | sade: 1.8.1 2302 | svelte: 4.2.19 2303 | svelte-preprocess: 5.1.4(postcss-load-config@3.1.4(postcss@8.4.49))(postcss@8.4.49)(svelte@4.2.19)(typescript@5.6.3) 2304 | typescript: 5.6.3 2305 | transitivePeerDependencies: 2306 | - '@babel/core' 2307 | - coffeescript 2308 | - less 2309 | - postcss 2310 | - postcss-load-config 2311 | - pug 2312 | - sass 2313 | - stylus 2314 | - sugarss 2315 | 2316 | svelte-eslint-parser@0.43.0(svelte@4.2.19): 2317 | dependencies: 2318 | eslint-scope: 7.2.2 2319 | eslint-visitor-keys: 3.4.3 2320 | espree: 9.6.1 2321 | postcss: 8.4.49 2322 | postcss-scss: 4.0.9(postcss@8.4.49) 2323 | optionalDependencies: 2324 | svelte: 4.2.19 2325 | 2326 | svelte-hmr@0.16.0(svelte@4.2.19): 2327 | dependencies: 2328 | svelte: 4.2.19 2329 | 2330 | svelte-preprocess@5.1.4(postcss-load-config@3.1.4(postcss@8.4.49))(postcss@8.4.49)(svelte@4.2.19)(typescript@5.6.3): 2331 | dependencies: 2332 | '@types/pug': 2.0.10 2333 | detect-indent: 6.1.0 2334 | magic-string: 0.30.13 2335 | sorcery: 0.11.1 2336 | strip-indent: 3.0.0 2337 | svelte: 4.2.19 2338 | optionalDependencies: 2339 | postcss: 8.4.49 2340 | postcss-load-config: 3.1.4(postcss@8.4.49) 2341 | typescript: 5.6.3 2342 | 2343 | svelte@4.2.19: 2344 | dependencies: 2345 | '@ampproject/remapping': 2.3.0 2346 | '@jridgewell/sourcemap-codec': 1.5.0 2347 | '@jridgewell/trace-mapping': 0.3.25 2348 | '@types/estree': 1.0.6 2349 | acorn: 8.14.0 2350 | aria-query: 5.3.2 2351 | axobject-query: 4.1.0 2352 | code-red: 1.0.4 2353 | css-tree: 2.3.1 2354 | estree-walker: 3.0.3 2355 | is-reference: 3.0.3 2356 | locate-character: 3.0.0 2357 | magic-string: 0.30.13 2358 | periscopic: 3.1.0 2359 | 2360 | text-table@0.2.0: {} 2361 | 2362 | tiny-glob@0.2.9: 2363 | dependencies: 2364 | globalyzer: 0.1.0 2365 | globrex: 0.1.2 2366 | 2367 | to-regex-range@5.0.1: 2368 | dependencies: 2369 | is-number: 7.0.0 2370 | 2371 | totalist@3.0.1: {} 2372 | 2373 | ts-api-utils@1.4.0(typescript@5.6.3): 2374 | dependencies: 2375 | typescript: 5.6.3 2376 | 2377 | tslib@2.8.1: {} 2378 | 2379 | type-check@0.4.0: 2380 | dependencies: 2381 | prelude-ls: 1.2.1 2382 | 2383 | type-fest@0.20.2: {} 2384 | 2385 | typescript@5.6.3: {} 2386 | 2387 | uri-js@4.4.1: 2388 | dependencies: 2389 | punycode: 2.3.1 2390 | 2391 | util-deprecate@1.0.2: {} 2392 | 2393 | vite@5.4.11: 2394 | dependencies: 2395 | esbuild: 0.21.5 2396 | postcss: 8.4.49 2397 | rollup: 4.27.3 2398 | optionalDependencies: 2399 | fsevents: 2.3.3 2400 | 2401 | vitefu@0.2.5(vite@5.4.11): 2402 | optionalDependencies: 2403 | vite: 5.4.11 2404 | 2405 | which@2.0.2: 2406 | dependencies: 2407 | isexe: 2.0.0 2408 | 2409 | word-wrap@1.2.5: {} 2410 | 2411 | wrappy@1.0.2: {} 2412 | 2413 | yaml@1.10.2: {} 2414 | 2415 | yocto-queue@0.1.0: {} 2416 | -------------------------------------------------------------------------------- /frontend/src/app.d.ts: -------------------------------------------------------------------------------- 1 | import '@auth/sveltekit'; 2 | 3 | // See https://kit.svelte.dev/docs/types#app 4 | // for information about these interfaces 5 | declare global { 6 | namespace App { 7 | // interface Error {} 8 | // interface Locals {} 9 | // interface PageData {} 10 | // interface PageState {} 11 | // interface Platform {} 12 | } 13 | } 14 | 15 | // Declare your framework library 16 | declare module '@auth/sveltekit' { 17 | /** 18 | * The shape of the user object returned in the OAuth providers' `profile` callback, 19 | * or the second parameter of the `session` callback, when using a database. 20 | */ 21 | interface User { 22 | pk: number; 23 | username: string; 24 | email: string; 25 | first_name: string; 26 | last_name: string; 27 | } 28 | /** 29 | * The shape of the account object returned in the OAuth providers' `account` callback, 30 | * Usually contains information about the provider being used, like OAuth tokens (`access_token`, etc). 31 | */ 32 | // interface Account {} 33 | 34 | /** 35 | * Returned by `useSession`, `auth`, contains information about the active session. 36 | */ 37 | interface Session { 38 | access_token: string; 39 | refresh_token: string; 40 | ref: number; 41 | iat: number; 42 | exp: number; 43 | jti: string; 44 | error?: 'RefreshAccessTokenError'; 45 | } 46 | } 47 | 48 | export {}; 49 | -------------------------------------------------------------------------------- /frontend/src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /frontend/src/auth.ts: -------------------------------------------------------------------------------- 1 | import { SvelteKitAuth } from '@auth/sveltekit'; 2 | import type { SvelteKitAuthConfig } from '@auth/sveltekit'; 3 | import GitHub from '@auth/sveltekit/providers/github'; 4 | import Google from '@auth/sveltekit/providers/google'; 5 | import CredentialsProvider from '@auth/sveltekit/providers/credentials'; 6 | import { 7 | AUTH_GITHUB_ID, 8 | AUTH_GOOGLE_ID, 9 | AUTH_SECRET, 10 | AUTH_BACKEND_URL 11 | } from '$env/static/private'; 12 | import { dev } from '$app/environment'; 13 | 14 | // These two values should be a bit less than actual token lifetimes 15 | const BACKEND_ACCESS_TOKEN_LIFETIME = 45 * 60; // 45 minutes 16 | const BACKEND_REFRESH_TOKEN_LIFETIME = 6 * 24 * 60 * 60; // 6 days 17 | 18 | const getCurrentEpochTime = () => { 19 | return Math.floor(new Date().getTime() / 1000); 20 | }; 21 | 22 | const SIGN_IN_HANDLERS = { 23 | credentials: async (user, account, profile, email, credentials) => { 24 | // console.log({ user, account, profile, email, credentials }); 25 | return true; 26 | }, 27 | github: async (user, account, profile, email, credentials) => { 28 | try { 29 | const headers = new Headers({ 30 | 'Content-Type': 'application/json' 31 | }); 32 | const response = await fetch(AUTH_BACKEND_URL + 'auth/github/', { 33 | method: 'POST', 34 | headers, 35 | body: JSON.stringify({ 36 | access_token: account['access_token'] 37 | }) 38 | }); 39 | 40 | account['meta'] = await response.json(); 41 | return true; 42 | } catch (error) { 43 | console.error(error); 44 | return false; 45 | } 46 | }, 47 | google: async (user, account, profile, email, credentials) => { 48 | try { 49 | const headers = new Headers({ 50 | 'Content-Type': 'application/json' 51 | }); 52 | const response = await fetch(AUTH_BACKEND_URL + 'auth/google/', { 53 | method: 'POST', 54 | headers, 55 | body: JSON.stringify({ 56 | id_token: account['id_token'], 57 | access_token: account['access_token'] 58 | }) 59 | }); 60 | 61 | account['meta'] = await response.json(); 62 | return true; 63 | } catch (error) { 64 | console.error(error); 65 | return false; 66 | } 67 | } 68 | }; 69 | 70 | const SIGN_IN_PROVIDERS = Object.keys(SIGN_IN_HANDLERS); 71 | 72 | const authOptions: SvelteKitAuthConfig = { 73 | secret: AUTH_SECRET, 74 | session: { 75 | strategy: 'jwt', 76 | maxAge: BACKEND_REFRESH_TOKEN_LIFETIME 77 | }, 78 | providers: [ 79 | CredentialsProvider({ 80 | name: 'Credentials', 81 | credentials: { 82 | username: { label: 'Username', type: 'text' }, 83 | password: { label: 'Password', type: 'password' } 84 | }, 85 | // The data returned from this function is passed forward as the 86 | // `user` variable to the signIn() and jwt() callback 87 | async authorize(credentials, req) { 88 | try { 89 | const headers = new Headers({ 90 | 'Content-Type': 'application/json' 91 | }); 92 | const response = await fetch(AUTH_BACKEND_URL + 'auth/login/', { 93 | method: 'POST', 94 | body: JSON.stringify(credentials), 95 | headers 96 | }); 97 | 98 | const data = await response.json(); 99 | if (!response.ok) { 100 | console.warn({ data }); 101 | return null; 102 | } else { 103 | console.log({ data }); 104 | } 105 | 106 | if (data) return data; 107 | } catch (error) { 108 | console.error(error); 109 | } 110 | return null; 111 | } 112 | }), 113 | (AUTH_GITHUB_ID ) ? GitHub : null, 114 | (AUTH_GOOGLE_ID ) ? Google({ 115 | authorization: { 116 | params: { 117 | prompt: 'consent', 118 | access_type: 'offline', 119 | response_type: 'code' 120 | } 121 | } 122 | }) : null 123 | ].filter(item => item !== null) as Provider[], 124 | callbacks: { 125 | async signIn({ user, account, profile, email, credentials }) { 126 | if (!SIGN_IN_PROVIDERS.includes(account?.provider)) { 127 | return false; 128 | } 129 | 130 | return SIGN_IN_HANDLERS[account.provider](user, account, profile, email, credentials); 131 | }, 132 | async jwt({ user, token, account }) { 133 | if (user && account) { 134 | let backendResponse = account.provider === 'credentials' ? user : account.meta; 135 | 136 | token['user'] = backendResponse.user; 137 | token['access_token'] = backendResponse.access; 138 | token['refresh_token'] = backendResponse.refresh; 139 | token['ref'] = getCurrentEpochTime() + BACKEND_ACCESS_TOKEN_LIFETIME; 140 | 141 | return token; 142 | } 143 | 144 | try { 145 | // Refresh the backend token if necessary 146 | if (getCurrentEpochTime() > token['ref']) { 147 | console.log('Renewing'); 148 | const headers = new Headers({ 149 | 'Content-Type': 'application/json' 150 | }); 151 | const response = await fetch(NEXTAUTH_BACKEND_URL + 'auth/token/refresh/', { 152 | method: 'POST', 153 | body: JSON.stringify({ refresh: token['refresh_token'] }), 154 | headers 155 | }); 156 | 157 | const data = await response.json(); 158 | 159 | if (!response.ok) { 160 | throw data.detail; 161 | } 162 | 163 | token['access_token'] = data.access; 164 | token['refresh_token'] = data.refresh; 165 | token['ref'] = getCurrentEpochTime() + BACKEND_ACCESS_TOKEN_LIFETIME; 166 | } 167 | return token; 168 | } catch (error) { 169 | console.error('Failed to refresh token', error); 170 | 171 | return { ...token, error: 'RefreshTokenError' as const }; 172 | } 173 | }, 174 | async session({ token }) { 175 | // console.log({token}); 176 | return token; 177 | } 178 | }, 179 | logger: { 180 | error(error) { 181 | console.error(error); 182 | }, 183 | warn(code) { 184 | console.warn(code); 185 | }, 186 | debug(code, metadata) { 187 | console.debug(code, metadata); 188 | } 189 | }, 190 | debug: dev, 191 | theme: { 192 | logo: '/favicon.png', 193 | brandColor: 'oklch(0.748 0.26 342.55)' 194 | } 195 | }; 196 | 197 | export const { handle, signIn, signOut } = SvelteKitAuth(authOptions); 198 | -------------------------------------------------------------------------------- /frontend/src/hooks.server.ts: -------------------------------------------------------------------------------- 1 | import { handle as svelteKitAuthHandle } from './auth'; 2 | 3 | export const handle = svelteKitAuthHandle; 4 | -------------------------------------------------------------------------------- /frontend/src/lib/index.ts: -------------------------------------------------------------------------------- 1 | // place files you want to import through the `$lib` alias in this folder. 2 | -------------------------------------------------------------------------------- /frontend/src/routes/+layout.server.ts: -------------------------------------------------------------------------------- 1 | import type { LayoutServerLoad } from './$types'; 2 | 3 | export const load: LayoutServerLoad = async (event) => { 4 | return { 5 | session: await event.locals.auth() 6 | }; 7 | }; 8 | -------------------------------------------------------------------------------- /frontend/src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 |
9 | 10 | 52 | -------------------------------------------------------------------------------- /frontend/src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | Django Auth.js - Home 11 | 12 | 13 |

SvelteKit Auth Example

14 |

15 | {#if $page.data.session} 16 | {#if $page.data.session.user?.image} 17 | 18 | {/if} 19 | 20 | Signed in as
21 | {$page.data.session.user?.name ?? 'User'} 22 |

Signed in as {$page?.data?.session?.user?.username}

23 | 24 | 25 | {:else} 26 | You are not signed in 27 | 28 |
29 |
30 | 34 | 38 | 39 |
40 |
41 | 44 | {/if} 45 |

46 | -------------------------------------------------------------------------------- /frontend/src/routes/_nav.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 |
7 |

8 | {#if $page.data.session} 9 | {#if $page.data.session.user?.image} 10 | 11 | {/if} 12 | 13 | Signed in as
14 | {$page.data.session.user?.email ?? $page.data.session.user?.name} 15 |
16 | Sign out 17 | {:else} 18 | You are not signed in 19 | Sign in 20 | {/if} 21 |

22 |
23 | 32 |
33 | 34 | 116 | -------------------------------------------------------------------------------- /frontend/src/routes/link/+page.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 |
25 | {#if $page.data.session} 26 | 27 | {:else} 28 |

Access Denied

29 |

30 | You must be signed in to view this page 31 |

32 | {/if} 33 |
34 | -------------------------------------------------------------------------------- /frontend/src/routes/login/+page.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | Django Auth.js - Login 14 | 15 | 16 | {#each Object.values(providers) as provider (provider.id)} 17 | {#if provider.type == 'oauth' || provider.type == 'oidc'} 18 |
19 | 22 |
23 | {:else if provider.type == 'credentials'} 24 |
25 | 26 | 30 | 34 | 35 |
36 | {:else} 37 |
38 | {JSON.stringify(provider, null, 4)}
39 | 		
40 | {/if} 41 | {/each} 42 | 43 | 48 | -------------------------------------------------------------------------------- /frontend/src/routes/login/+page.ts: -------------------------------------------------------------------------------- 1 | export async function load({ fetch }) { 2 | const csrfToken = await fetch('auth/csrf') 3 | .then((r) => r.json()) 4 | .then((data) => data.csrfToken); 5 | const providers = await fetch('auth/providers').then((r) => r.json()); 6 | 7 | return { csrfToken, providers }; 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/routes/profile/+page.svelte: -------------------------------------------------------------------------------- 1 | 27 | 28 | 29 | Django Auth.js - Profile 30 | 31 | 32 |
33 |
34 |

PK: {session?.user?.pk}

35 |

Username: {session?.user?.username}

36 |

Email: {session?.user?.email || 'Not provided'}

37 |
38 |         {response}
39 |       
40 |
41 |
42 | 43 | 44 |
45 |
46 | -------------------------------------------------------------------------------- /frontend/src/routes/protected/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit'; 2 | import type { PageServerLoad } from './$types'; 3 | 4 | export const load: PageServerLoad = async (event) => { 5 | const session = await event.locals.getSession(); 6 | if (!session?.user) throw redirect(303, '/'); 7 | return {}; 8 | }; 9 | -------------------------------------------------------------------------------- /frontend/src/routes/protected/+page.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | Django Auth.js - Profile 15 | 16 | 17 | Secrets 18 | -------------------------------------------------------------------------------- /frontend/src/routes/session/+page.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 | 25 | Django Auth.js - Session 26 | 27 | 28 |
29 | {#if $page.data.session} 30 |

Session:

31 |

Session expiry: {new Date($page.data.session?.exp * 1000).toLocaleString()}

32 |

Session issued: {new Date($page.data.session?.iat * 1000).toLocaleString()}

33 |

Session reference: {new Date($page.data.session?.ref * 1000).toLocaleString()}

34 |
35 | {JSON.stringify($page.data.session, null, 4)}
36 | 		
37 | Access token: 38 |

39 | Access token expiry: {new Date( 40 | decodeJWT($page.data.session.access_token)?.payload?.exp * 1000 41 | ).toLocaleString()} 42 |

43 |
44 | {JSON.stringify(decodeJWT($page.data.session.access_token), null, 4)}
45 | 		
46 | Refresh token: 47 |

48 | Refresh token expiry: {new Date( 49 | decodeJWT($page.data.session.refresh_token)?.payload?.exp * 1000 50 | ).toLocaleString()} 51 |

52 |
53 | {JSON.stringify(decodeJWT($page.data.session.refresh_token), null, 4)}
54 | 		
55 | {:else} 56 |

Access Denied

57 |

58 | You must be signed in to view this page 59 |

60 | {/if} 61 |
62 | -------------------------------------------------------------------------------- /frontend/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paul-schwendenman/django-svelte-authjs/cf2e1c1cef682530f4962963f5e1149ad6a959f8/frontend/static/favicon.ico -------------------------------------------------------------------------------- /frontend/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paul-schwendenman/django-svelte-authjs/cf2e1c1cef682530f4962963f5e1149ad6a959f8/frontend/static/favicon.png -------------------------------------------------------------------------------- /frontend/svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 12 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 14 | adapter: adapter() 15 | } 16 | }; 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true, 12 | "moduleResolution": "bundler" 13 | } 14 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 15 | // 16 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 17 | // from the referenced tsconfig.json - TypeScript does not merge them in 18 | } 19 | -------------------------------------------------------------------------------- /frontend/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vite'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()] 6 | }); 7 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "asgiref" 5 | version = "3.7.2" 6 | description = "ASGI specs, helper code, and adapters" 7 | optional = false 8 | python-versions = ">=3.7" 9 | files = [ 10 | {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, 11 | {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, 12 | ] 13 | 14 | [package.extras] 15 | tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] 16 | 17 | [[package]] 18 | name = "certifi" 19 | version = "2023.11.17" 20 | description = "Python package for providing Mozilla's CA Bundle." 21 | optional = false 22 | python-versions = ">=3.6" 23 | files = [ 24 | {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, 25 | {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, 26 | ] 27 | 28 | [[package]] 29 | name = "cffi" 30 | version = "1.16.0" 31 | description = "Foreign Function Interface for Python calling C code." 32 | optional = false 33 | python-versions = ">=3.8" 34 | files = [ 35 | {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, 36 | {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, 37 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, 38 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, 39 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, 40 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, 41 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, 42 | {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, 43 | {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, 44 | {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, 45 | {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, 46 | {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, 47 | {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, 48 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, 49 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, 50 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, 51 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, 52 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, 53 | {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, 54 | {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, 55 | {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, 56 | {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, 57 | {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, 58 | {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, 59 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, 60 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, 61 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, 62 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, 63 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, 64 | {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, 65 | {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, 66 | {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, 67 | {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, 68 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, 69 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, 70 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, 71 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, 72 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, 73 | {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, 74 | {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, 75 | {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, 76 | {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, 77 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, 78 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, 79 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, 80 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, 81 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, 82 | {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, 83 | {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, 84 | {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, 85 | {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, 86 | {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, 87 | ] 88 | 89 | [package.dependencies] 90 | pycparser = "*" 91 | 92 | [[package]] 93 | name = "charset-normalizer" 94 | version = "3.3.2" 95 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 96 | optional = false 97 | python-versions = ">=3.7.0" 98 | files = [ 99 | {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, 100 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, 101 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, 102 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, 103 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, 104 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, 105 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, 106 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, 107 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, 108 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, 109 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, 110 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, 111 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, 112 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, 113 | {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, 114 | {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, 115 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, 116 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, 117 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, 118 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, 119 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, 120 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, 121 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, 122 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, 123 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, 124 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, 125 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, 126 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, 127 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, 128 | {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, 129 | {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, 130 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, 131 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, 132 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, 133 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, 134 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, 135 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, 136 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, 137 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, 138 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, 139 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, 140 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, 141 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, 142 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, 143 | {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, 144 | {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, 145 | {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, 146 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, 147 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, 148 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, 149 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, 150 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, 151 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, 152 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, 153 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, 154 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, 155 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, 156 | {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, 157 | {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, 158 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, 159 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, 160 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, 161 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, 162 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, 163 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, 164 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, 165 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, 166 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, 167 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, 168 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, 169 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, 170 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, 171 | {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, 172 | {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, 173 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, 174 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, 175 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, 176 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, 177 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, 178 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, 179 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, 180 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, 181 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, 182 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, 183 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, 184 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, 185 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, 186 | {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, 187 | {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, 188 | {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, 189 | ] 190 | 191 | [[package]] 192 | name = "cryptography" 193 | version = "41.0.7" 194 | description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." 195 | optional = false 196 | python-versions = ">=3.7" 197 | files = [ 198 | {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, 199 | {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, 200 | {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, 201 | {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, 202 | {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, 203 | {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, 204 | {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, 205 | {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, 206 | {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, 207 | {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, 208 | {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, 209 | {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, 210 | {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, 211 | {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, 212 | {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, 213 | {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, 214 | {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, 215 | {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, 216 | {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, 217 | {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, 218 | {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, 219 | {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, 220 | {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, 221 | ] 222 | 223 | [package.dependencies] 224 | cffi = ">=1.12" 225 | 226 | [package.extras] 227 | docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] 228 | docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] 229 | nox = ["nox"] 230 | pep8test = ["black", "check-sdist", "mypy", "ruff"] 231 | sdist = ["build"] 232 | ssh = ["bcrypt (>=3.1.5)"] 233 | test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] 234 | test-randomorder = ["pytest-randomly"] 235 | 236 | [[package]] 237 | name = "defusedxml" 238 | version = "0.7.1" 239 | description = "XML bomb protection for Python stdlib modules" 240 | optional = false 241 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 242 | files = [ 243 | {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, 244 | {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, 245 | ] 246 | 247 | [[package]] 248 | name = "dj-rest-auth" 249 | version = "5.0.2" 250 | description = "Authentication and Registration in Django Rest Framework" 251 | optional = false 252 | python-versions = ">=3.6" 253 | files = [ 254 | {file = "dj-rest-auth-5.0.2.tar.gz", hash = "sha256:aad7d912476169e9991547bf98645344d3939be2d7052098048d819524c115d9"}, 255 | ] 256 | 257 | [package.dependencies] 258 | Django = ">=3.2" 259 | django-allauth = {version = ">=0.56.0,<0.58.0", optional = true, markers = "extra == \"with-social\""} 260 | djangorestframework = ">=3.13.0" 261 | 262 | [package.extras] 263 | with-social = ["django-allauth (>=0.56.0,<0.58.0)"] 264 | 265 | [[package]] 266 | name = "django" 267 | version = "5.0.1" 268 | description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." 269 | optional = false 270 | python-versions = ">=3.10" 271 | files = [ 272 | {file = "Django-5.0.1-py3-none-any.whl", hash = "sha256:f47a37a90b9bbe2c8ec360235192c7fddfdc832206fcf618bb849b39256affc1"}, 273 | {file = "Django-5.0.1.tar.gz", hash = "sha256:8c8659665bc6e3a44fefe1ab0a291e5a3fb3979f9a8230be29de975e57e8f854"}, 274 | ] 275 | 276 | [package.dependencies] 277 | asgiref = ">=3.7.0,<4" 278 | sqlparse = ">=0.3.1" 279 | tzdata = {version = "*", markers = "sys_platform == \"win32\""} 280 | 281 | [package.extras] 282 | argon2 = ["argon2-cffi (>=19.1.0)"] 283 | bcrypt = ["bcrypt"] 284 | 285 | [[package]] 286 | name = "django-allauth" 287 | version = "0.57.0" 288 | description = "Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication." 289 | optional = false 290 | python-versions = ">=3.7" 291 | files = [ 292 | {file = "django-allauth-0.57.0.tar.gz", hash = "sha256:a095ef0db7de305d9175772c78e765ebd5fceb004ae61c1383d7fc1af0f7c5b1"}, 293 | ] 294 | 295 | [package.dependencies] 296 | Django = ">=3.2" 297 | pyjwt = {version = ">=1.7", extras = ["crypto"]} 298 | python3-openid = ">=3.0.8" 299 | requests = ">=2.0.0" 300 | requests-oauthlib = ">=0.3.0" 301 | 302 | [package.extras] 303 | mfa = ["qrcode (>=7.0.0)"] 304 | saml = ["python3-saml (>=1.15.0,<2.0.0)"] 305 | 306 | [[package]] 307 | name = "django-cors-headers" 308 | version = "4.3.1" 309 | description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." 310 | optional = false 311 | python-versions = ">=3.8" 312 | files = [ 313 | {file = "django-cors-headers-4.3.1.tar.gz", hash = "sha256:0bf65ef45e606aff1994d35503e6b677c0b26cafff6506f8fd7187f3be840207"}, 314 | {file = "django_cors_headers-4.3.1-py3-none-any.whl", hash = "sha256:0b1fd19297e37417fc9f835d39e45c8c642938ddba1acce0c1753d3edef04f36"}, 315 | ] 316 | 317 | [package.dependencies] 318 | asgiref = ">=3.6" 319 | Django = ">=3.2" 320 | 321 | [[package]] 322 | name = "djangorestframework" 323 | version = "3.14.0" 324 | description = "Web APIs for Django, made easy." 325 | optional = false 326 | python-versions = ">=3.6" 327 | files = [ 328 | {file = "djangorestframework-3.14.0-py3-none-any.whl", hash = "sha256:eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08"}, 329 | {file = "djangorestframework-3.14.0.tar.gz", hash = "sha256:579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8"}, 330 | ] 331 | 332 | [package.dependencies] 333 | django = ">=3.0" 334 | pytz = "*" 335 | 336 | [[package]] 337 | name = "djangorestframework-simplejwt" 338 | version = "5.3.1" 339 | description = "A minimal JSON Web Token authentication plugin for Django REST Framework" 340 | optional = false 341 | python-versions = ">=3.8" 342 | files = [ 343 | {file = "djangorestframework_simplejwt-5.3.1-py3-none-any.whl", hash = "sha256:381bc966aa46913905629d472cd72ad45faa265509764e20ffd440164c88d220"}, 344 | {file = "djangorestframework_simplejwt-5.3.1.tar.gz", hash = "sha256:6c4bd37537440bc439564ebf7d6085e74c5411485197073f508ebdfa34bc9fae"}, 345 | ] 346 | 347 | [package.dependencies] 348 | django = ">=3.2" 349 | djangorestframework = ">=3.12" 350 | pyjwt = ">=1.7.1,<3" 351 | 352 | [package.extras] 353 | crypto = ["cryptography (>=3.3.1)"] 354 | dev = ["Sphinx (>=1.6.5,<2)", "cryptography", "flake8", "freezegun", "ipython", "isort", "pep8", "pytest", "pytest-cov", "pytest-django", "pytest-watch", "pytest-xdist", "python-jose (==3.3.0)", "sphinx_rtd_theme (>=0.1.9)", "tox", "twine", "wheel"] 355 | doc = ["Sphinx (>=1.6.5,<2)", "sphinx_rtd_theme (>=0.1.9)"] 356 | lint = ["flake8", "isort", "pep8"] 357 | python-jose = ["python-jose (==3.3.0)"] 358 | test = ["cryptography", "freezegun", "pytest", "pytest-cov", "pytest-django", "pytest-xdist", "tox"] 359 | 360 | [[package]] 361 | name = "idna" 362 | version = "3.6" 363 | description = "Internationalized Domain Names in Applications (IDNA)" 364 | optional = false 365 | python-versions = ">=3.5" 366 | files = [ 367 | {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, 368 | {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, 369 | ] 370 | 371 | [[package]] 372 | name = "oauthlib" 373 | version = "3.2.2" 374 | description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" 375 | optional = false 376 | python-versions = ">=3.6" 377 | files = [ 378 | {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, 379 | {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, 380 | ] 381 | 382 | [package.extras] 383 | rsa = ["cryptography (>=3.0.0)"] 384 | signals = ["blinker (>=1.4.0)"] 385 | signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] 386 | 387 | [[package]] 388 | name = "pycparser" 389 | version = "2.21" 390 | description = "C parser in Python" 391 | optional = false 392 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 393 | files = [ 394 | {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, 395 | {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, 396 | ] 397 | 398 | [[package]] 399 | name = "pyjwt" 400 | version = "2.8.0" 401 | description = "JSON Web Token implementation in Python" 402 | optional = false 403 | python-versions = ">=3.7" 404 | files = [ 405 | {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, 406 | {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, 407 | ] 408 | 409 | [package.dependencies] 410 | cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} 411 | 412 | [package.extras] 413 | crypto = ["cryptography (>=3.4.0)"] 414 | dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] 415 | docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] 416 | tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] 417 | 418 | [[package]] 419 | name = "python3-openid" 420 | version = "3.2.0" 421 | description = "OpenID support for modern servers and consumers." 422 | optional = false 423 | python-versions = "*" 424 | files = [ 425 | {file = "python3-openid-3.2.0.tar.gz", hash = "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf"}, 426 | {file = "python3_openid-3.2.0-py3-none-any.whl", hash = "sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b"}, 427 | ] 428 | 429 | [package.dependencies] 430 | defusedxml = "*" 431 | 432 | [package.extras] 433 | mysql = ["mysql-connector-python"] 434 | postgresql = ["psycopg2"] 435 | 436 | [[package]] 437 | name = "pytz" 438 | version = "2023.3.post1" 439 | description = "World timezone definitions, modern and historical" 440 | optional = false 441 | python-versions = "*" 442 | files = [ 443 | {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, 444 | {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, 445 | ] 446 | 447 | [[package]] 448 | name = "requests" 449 | version = "2.31.0" 450 | description = "Python HTTP for Humans." 451 | optional = false 452 | python-versions = ">=3.7" 453 | files = [ 454 | {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, 455 | {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, 456 | ] 457 | 458 | [package.dependencies] 459 | certifi = ">=2017.4.17" 460 | charset-normalizer = ">=2,<4" 461 | idna = ">=2.5,<4" 462 | urllib3 = ">=1.21.1,<3" 463 | 464 | [package.extras] 465 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 466 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 467 | 468 | [[package]] 469 | name = "requests-oauthlib" 470 | version = "1.3.1" 471 | description = "OAuthlib authentication support for Requests." 472 | optional = false 473 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 474 | files = [ 475 | {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, 476 | {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, 477 | ] 478 | 479 | [package.dependencies] 480 | oauthlib = ">=3.0.0" 481 | requests = ">=2.0.0" 482 | 483 | [package.extras] 484 | rsa = ["oauthlib[signedtoken] (>=3.0.0)"] 485 | 486 | [[package]] 487 | name = "sqlparse" 488 | version = "0.4.4" 489 | description = "A non-validating SQL parser." 490 | optional = false 491 | python-versions = ">=3.5" 492 | files = [ 493 | {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, 494 | {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, 495 | ] 496 | 497 | [package.extras] 498 | dev = ["build", "flake8"] 499 | doc = ["sphinx"] 500 | test = ["pytest", "pytest-cov"] 501 | 502 | [[package]] 503 | name = "tzdata" 504 | version = "2023.4" 505 | description = "Provider of IANA time zone data" 506 | optional = false 507 | python-versions = ">=2" 508 | files = [ 509 | {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, 510 | {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, 511 | ] 512 | 513 | [[package]] 514 | name = "urllib3" 515 | version = "2.1.0" 516 | description = "HTTP library with thread-safe connection pooling, file post, and more." 517 | optional = false 518 | python-versions = ">=3.8" 519 | files = [ 520 | {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, 521 | {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, 522 | ] 523 | 524 | [package.extras] 525 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 526 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 527 | zstd = ["zstandard (>=0.18.0)"] 528 | 529 | [metadata] 530 | lock-version = "2.0" 531 | python-versions = "^3.12" 532 | content-hash = "d0ffafd60af620aa2671cd5352390d02686f1bb2fc00e3b926d10e882a22e553" 533 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "django-svelte-authjs" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Paul Schwendenman "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.12" 10 | Django = "^5.0.1" 11 | djangorestframework = "^3.14.0" 12 | djangorestframework-simplejwt = "^5.3.1" 13 | django-allauth = "0.57.0" 14 | dj-rest-auth = {extras = ["with-social"], version = "^5.0.2"} 15 | django-cors-headers = "^4.3.1" 16 | 17 | 18 | [build-system] 19 | requires = ["poetry-core"] 20 | build-backend = "poetry.core.masonry.api" 21 | -------------------------------------------------------------------------------- /readme.rst: -------------------------------------------------------------------------------- 1 | ----------------------------------------- 2 | Django - Sveltekit - auth.js sample repo 3 | ----------------------------------------- 4 | 5 | This repo contains a frontend built with sveltekit that connects to 6 | a django backend for authentication. It is able to signin with both 7 | django's built in user accounts and with oauth platforms. 8 | 9 | The example provides some different buttons and pages that offer various techniques 10 | to protect pages and data. 11 | 12 | To run, you will need to provide the necessary environment variables and initialize the 13 | sqlite database. to use social auth, those providers should also be added to django via the 14 | admin interface. 15 | 16 | This repo was built as a proof of concept, please feel free to create an issue if you're unable 17 | to get it working! 18 | 19 | - Paul 20 | --------------------------------------------------------------------------------