diff --git a/.env.development b/.env.development index 1e79d58..116b30d 100644 --- a/.env.development +++ b/.env.development @@ -32,6 +32,13 @@ TEMPLATES_TMPDIR="./templates_tmp" TEMPLATES_GITHUB_TOKEN="" # TEMPLATES_ADMINS="" +## Redis +REDIS_BASE="legal-site" +REDIS_HOST="localhost" +REDIS_PORT=6379 +REDIS_TLS=false +REDIS_PASSWORD="" + ## test only NEXT_PUBLIC_MATOMO_SITE_ID=1 NEXT_PUBLIC_MATOMO_URL="http://localhost" diff --git a/.env.production b/.env.production index 0f3de07..954ff66 100644 --- a/.env.production +++ b/.env.production @@ -31,3 +31,10 @@ SECURITY_JWT_ALGORITHM="HS256" # TEMPLATES_TMPDIR="./templates_tmp" # TEMPLATES_GITHUB_TOKEN="" # TEMPLATES_ADMINS="" + +## Redis +# REDIS_BASE="legal-site" +# REDIS_HOST="localhost" +# REDIS_PORT=6379 +# REDIS_TLS=false +# REDIS_PASSWORD="" diff --git a/docker-compose.yml b/docker-compose.yml index c3e2c78..93436c3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,29 +9,16 @@ services: MAILDEV_WEB_PORT: 1080 MAILDEV_SMTP_PORT: 1025 restart: always - postgres: - image: postgres:17 + + redis: + image: redis:alpine ports: - - "5432:5432" + - "6379:6379" environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: legal_site + REDIS_PORT: 6379 + REDIS_DATABASES: 1 volumes: - - pgdata:/var/lib/postgresql/data + - cache:/data restart: always - pgadmin: - image: dcagatay/pwless-pgadmin4 - ports: - - 5050:80 - environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_HOST: postgres - POSTGRES_PORT: 5432 - volumes: - - pgadmin:/var/lib/pgadmin - volumes: - pgdata: - pgadmin: \ No newline at end of file + cache: \ No newline at end of file diff --git a/env.d.ts b/env.d.ts index da10cf9..64177e3 100644 --- a/env.d.ts +++ b/env.d.ts @@ -17,6 +17,11 @@ declare namespace NodeJS { * {@link [Local Env Dist](.env.development)} */ APP_SUPER_ADMIN?: string; + /** + * Dist: `development` + * {@link [Local Env Dist](.env.development)} + */ + NODE_ENV?: string; /** * No dist value. * {@link [Local Env Dist](.env.development)} @@ -72,6 +77,76 @@ declare namespace NodeJS { * {@link [Local Env Dist](.env.development)} */ SECURITY_JWT_ALGORITHM?: string; + /** + * Dist: `../local-site-templates-test` + * {@link [Local Env Dist](.env.development)} + */ + TEMPLATES_GIT_URL?: string; + /** + * No dist value. + * {@link [Local Env Dist](.env.development)} + */ + TEMPLATES_GIT_GPG_PRIVATE_KEY?: string; + /** + * No dist value. + * {@link [Local Env Dist](.env.development)} + */ + TEMPLATES_GIT_GPG_PASSPHRASE?: string; + /** + * Dist: `bot@email.com` + * {@link [Local Env Dist](.env.development)} + */ + TEMPLATES_GIT_AUTHOR_EMAIL?: string; + /** + * Dist: `Bot` + * {@link [Local Env Dist](.env.development)} + */ + TEMPLATES_GIT_AUTHOR_NAME?: string; + /** + * Dist: `bot@email.com` + * {@link [Local Env Dist](.env.development)} + */ + TEMPLATES_GIT_COMMITTER_EMAIL?: string; + /** + * Dist: `Bot` + * {@link [Local Env Dist](.env.development)} + */ + TEMPLATES_GIT_COMMITTER_NAME?: string; + /** + * Dist: `./templates_tmp` + * {@link [Local Env Dist](.env.development)} + */ + TEMPLATES_TMPDIR?: string; + /** + * No dist value. + * {@link [Local Env Dist](.env.development)} + */ + TEMPLATES_GITHUB_TOKEN?: string; + /** + * Dist: `legal-site` + * {@link [Local Env Dist](.env.development)} + */ + REDIS_BASE?: string; + /** + * Dist: `localhost` + * {@link [Local Env Dist](.env.development)} + */ + REDIS_HOST?: string; + /** + * Dist: `6379` + * {@link [Local Env Dist](.env.development)} + */ + REDIS_PORT?: string; + /** + * Dist: `false` + * {@link [Local Env Dist](.env.development)} + */ + REDIS_TLS?: string; + /** + * No dist value. + * {@link [Local Env Dist](.env.development)} + */ + REDIS_PASSWORD?: string; /** * Dist: `1` * {@link [Local Env Dist](.env.development)} @@ -108,6 +183,7 @@ declare type ProcessEnvCustomKeys = | 'APP_ENV' | 'MAINTENANCE_MODE' | 'APP_SUPER_ADMIN' + | 'NODE_ENV' | 'ESPACE_MEMBRE_API_KEY' | 'ESPACE_MEMBRE_URL' | 'MAILER_ENABLE' @@ -119,6 +195,20 @@ declare type ProcessEnvCustomKeys = | 'MAILER_FROM_EMAIL' | 'SECURITY_JWT_SECRET' | 'SECURITY_JWT_ALGORITHM' + | 'TEMPLATES_GIT_URL' + | 'TEMPLATES_GIT_GPG_PRIVATE_KEY' + | 'TEMPLATES_GIT_GPG_PASSPHRASE' + | 'TEMPLATES_GIT_AUTHOR_EMAIL' + | 'TEMPLATES_GIT_AUTHOR_NAME' + | 'TEMPLATES_GIT_COMMITTER_EMAIL' + | 'TEMPLATES_GIT_COMMITTER_NAME' + | 'TEMPLATES_TMPDIR' + | 'TEMPLATES_GITHUB_TOKEN' + | 'REDIS_BASE' + | 'REDIS_HOST' + | 'REDIS_PORT' + | 'REDIS_TLS' + | 'REDIS_PASSWORD' | 'NEXT_PUBLIC_MATOMO_SITE_ID' | 'NEXT_PUBLIC_MATOMO_URL' | 'NEXT_PUBLIC_APP_VERSION' diff --git a/legal_site.json b/legal_site.json index c4c3329..1bb9246 100644 --- a/legal_site.json +++ b/legal_site.json @@ -36,5 +36,12 @@ }, "github": { "token": "" + }, + "redis": { + "base": "legal_site", + "host": "", + "port": 6379, + "tls": false, + "password": "" } } \ No newline at end of file diff --git a/package.json b/package.json index 051c724..5ce2b60 100644 --- a/package.json +++ b/package.json @@ -20,10 +20,11 @@ "generateEnvDeclaration": "yarn run-script scripts/generateEnvDeclaration.ts" }, "dependencies": { + "@auth/unstorage-adapter": "^2.7.4", "@codegouvfr/react-dsfr": "^1.16.5-rc.0", "@formkit/auto-animate": "^0.8.2", "@hookform/resolvers": "^3.9.1", - "@incubateur-ademe/next-auth-espace-membre-provider": "^0.0.6", + "@incubateur-ademe/next-auth-espace-membre-provider": "^0.0.7", "@mdx-js/react": "^3.1.0", "@monaco-editor/react": "^4.7.0-rc.0", "@next/mdx": "^15.1.0", @@ -31,6 +32,7 @@ "@types/mdx": "^2.0.13", "gray-matter": "^4.0.3", "immer": "^10.1.1", + "ioredis": "^5.4.2", "lodash": "^4.17.21", "lru-cache": "^11.0.2", "monaco-editor": "^0.52.2", @@ -50,6 +52,7 @@ "remark-mdx-frontmatter": "^5.0.0", "sharp": "^0.33.5", "simple-git": "^3.27.0", + "unstorage": "^1.14.4", "zod": "^3.23.8", "zustand": "^4.5.5" }, @@ -79,7 +82,6 @@ "monaco-editor-webpack-plugin": "^7.1.0", "postcss": "^8.4.49", "prettier": "^3.4.1", - "prisma": "^6.0.1", "sass": "^1.80.7", "tailwindcss": "^3.4.14", "ts-node": "^10.9.2", diff --git a/prisma/schema.prisma b/prisma/schema.prisma deleted file mode 100644 index ee282c7..0000000 --- a/prisma/schema.prisma +++ /dev/null @@ -1,14 +0,0 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? -// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init - -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} diff --git a/src/config.ts b/src/config.ts index 797d406..998f4eb 100644 --- a/src/config.ts +++ b/src/config.ts @@ -79,5 +79,12 @@ export const config = { github: { token: ensureApiEnvVar(process.env.TEMPLATES_GITHUB_TOKEN, ""), }, + redis: { + base: ensureApiEnvVar(process.env.REDIS_BASE, "legal-site"), + host: ensureApiEnvVar(process.env.REDIS_HOST, "localhost"), + port: ensureApiEnvVar(process.env.REDIS_PORT, Number, 6379), + tls: ensureApiEnvVar(process.env.REDIS_TLS, isTruthy, false), + password: ensureApiEnvVar(process.env.REDIS_PASSWORD, ""), + }, }, } as const; diff --git a/src/lib/next-auth/auth.ts b/src/lib/next-auth/auth.ts index dda78f8..e83a4b0 100644 --- a/src/lib/next-auth/auth.ts +++ b/src/lib/next-auth/auth.ts @@ -1,11 +1,23 @@ +import { UnstorageAdapter } from "@auth/unstorage-adapter"; import { EspaceMembreProvider } from "@incubateur-ademe/next-auth-espace-membre-provider"; import NextAuth from "next-auth"; -import { type AdapterUser } from "next-auth/adapters"; +import { type Adapter, type AdapterUser } from "next-auth/adapters"; import Nodemailer from "next-auth/providers/nodemailer"; +import { type ConnectionOptions } from "tls"; +import { createStorage } from "unstorage"; +import unstorageRedisDriver from "unstorage/drivers/redis"; import { config } from "@/config"; -import { LRUCacheAdapater } from "./LRUCacheAdapter"; +const redis = createStorage({ + driver: unstorageRedisDriver({ + base: config.api.redis.base, + host: config.api.redis.host, + port: config.api.redis.port, + tls: config.api.redis.tls as unknown as ConnectionOptions, // https://unstorage.unjs.io/drivers/redis + password: config.api.redis.password, + }), +}); declare module "next-auth" { interface Account { @@ -47,8 +59,7 @@ export const { session: { strategy: "jwt", }, - adapter: espaceMembreProvider.AdapterWrapper(LRUCacheAdapater), - // adapter: AirtableAdapter(), + adapter: espaceMembreProvider.AdapterWrapper(UnstorageAdapter(redis) as Adapter), // experimental: { // enableWebAuthn: true, // }, @@ -78,10 +89,11 @@ export const { token = { ...token, user: { + id: token.sub || espaceMembreMember.username, email: espaceMembreMember.primary_email, name: espaceMembreMember.fullname, emailVerified: new Date(), - id: espaceMembreMember.username, + username: espaceMembreMember.username, image: espaceMembreMember.avatar, isAdmin: config.api.templates.admins.includes(espaceMembreMember.username), }, diff --git a/yarn.lock b/yarn.lock index 6323376..ad0d0c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,6 +20,24 @@ preact "10.11.3" preact-render-to-string "5.2.3" +"@auth/core@0.37.4": + version "0.37.4" + resolved "https://registry.yarnpkg.com/@auth/core/-/core-0.37.4.tgz#c51410aa7d0997fa22a07a196d2c21c8b1bca71b" + integrity sha512-HOXJwXWXQRhbBDHlMU0K/6FT1v+wjtzdKhsNg0ZN7/gne6XPsIrjZ4daMcFnbq0Z/vsAbYBinQhhua0d77v7qw== + dependencies: + "@panva/hkdf" "^1.2.1" + jose "^5.9.6" + oauth4webapi "^3.1.1" + preact "10.24.3" + preact-render-to-string "6.5.11" + +"@auth/unstorage-adapter@^2.7.4": + version "2.7.4" + resolved "https://registry.yarnpkg.com/@auth/unstorage-adapter/-/unstorage-adapter-2.7.4.tgz#13ce383eed42753eb7bbf66ec684a1de217b83e4" + integrity sha512-NU+v2XOZM6TFoVD2/FYaE2EX9q9SjCGLozogcUMuxAdQewwYgp8MflkbhnIXpoWL+hqczCweCbw/v85s0fO+DA== + dependencies: + "@auth/core" "0.37.4" + "@babel/code-frame@^7.23.5": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" @@ -235,10 +253,15 @@ resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== -"@incubateur-ademe/next-auth-espace-membre-provider@^0.0.6": - version "0.0.6" - resolved "https://registry.yarnpkg.com/@incubateur-ademe/next-auth-espace-membre-provider/-/next-auth-espace-membre-provider-0.0.6.tgz#d299f819d4cbb63b418a98c074cbe812791cfe8f" - integrity sha512-zdsz1mSt1jOqbbLCTJdJinkDGreZgREh+nVZrmYb1FqhPzW8ztW801YbcT5d99Z8mcx1jIsnHTS/kv1ohhdpOg== +"@incubateur-ademe/next-auth-espace-membre-provider@^0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@incubateur-ademe/next-auth-espace-membre-provider/-/next-auth-espace-membre-provider-0.0.7.tgz#d5c085960f811b5082668a7a4aec20fe451e16cf" + integrity sha512-4MOTIrium3GUoHIr8TmSFjfg+1qmt8M0P5UoPejii+NSc5LxqZ7p3ZWvozy81r3BI1ju8JSX6AR8THEiCQhrTQ== + +"@ioredis/commands@^1.1.1": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" + integrity sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -557,42 +580,6 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== -"@prisma/debug@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-6.0.1.tgz#8407544dd89c8bf85a6e9889ea263fe0e1ccebe2" - integrity sha512-jQylgSOf7ibTVxqBacnAlVGvek6fQxJIYCQOeX2KexsfypNzXjJQSS2o5s+Mjj2Np93iSOQUaw6TvPj8syhG4w== - -"@prisma/engines-version@5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e": - version "5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e.tgz#2db5a05d014aac504e8574da6b96ac3d9a617526" - integrity sha512-JmIds0Q2/vsOmnuTJYxY4LE+sajqjYKhLtdOT6y4imojqv5d/aeVEfbBGC74t8Be1uSp0OP8lxIj2OqoKbLsfQ== - -"@prisma/engines@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-6.0.1.tgz#b64afa9b4e2bedc2b6488b15f9d867c8672b33ee" - integrity sha512-4hxzI+YQIR2uuDyVsDooFZGu5AtixbvM2psp+iayDZ4hRrAHo/YwgA17N23UWq7G6gRu18NvuNMb48qjP3DPQw== - dependencies: - "@prisma/debug" "6.0.1" - "@prisma/engines-version" "5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e" - "@prisma/fetch-engine" "6.0.1" - "@prisma/get-platform" "6.0.1" - -"@prisma/fetch-engine@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-6.0.1.tgz#1e3affb7a749caaf366239c7d61ae7b19d3e7e00" - integrity sha512-T36bWFVGeGYYSyYOj9d+O9G3sBC+pAyMC+jc45iSL63/Haq1GrYjQPgPMxrEj9m739taXrupoysRedQ+VyvM/Q== - dependencies: - "@prisma/debug" "6.0.1" - "@prisma/engines-version" "5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e" - "@prisma/get-platform" "6.0.1" - -"@prisma/get-platform@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-6.0.1.tgz#322dae7e8862c9b849384b820b81ecd4006e1d63" - integrity sha512-zspC9vlxAqx4E6epMPMLLBMED2VD8axDe8sPnquZ8GOsn6tiacWK0oxrGK4UAHYzYUVuMVUApJbdXB2dFpLhvg== - dependencies: - "@prisma/debug" "6.0.1" - "@rtsao/scc@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" @@ -1052,7 +1039,7 @@ any-promise@^1.0.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@~3.1.2: +anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -1365,6 +1352,11 @@ client-only@0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +cluster-key-slot@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" + integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== + collapse-white-space@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" @@ -1413,6 +1405,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +consola@^3.2.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.3.3.tgz#0dd8a2314b0f7bf18a49064138ad685f3346543d" + integrity sha512-Qil5KwghMzlqd51UXM0b6fyaGHtOC22scxrwrz4A2882LyUMwQjnvaedN1HAeXzphspQ6CpHkzMAWxBTUruDLg== + +cookie-es@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cookie-es/-/cookie-es-1.2.2.tgz#18ceef9eb513cac1cb6c14bcbf8bdb2679b34821" + integrity sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg== + cookie@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" @@ -1432,6 +1434,13 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +"crossws@>=0.2.0 <0.4.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/crossws/-/crossws-0.3.1.tgz#7980e0b6688fe23286661c3ab8deeccbaa05ca86" + integrity sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw== + dependencies: + uncrypto "^0.1.3" + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -1530,11 +1539,26 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +defu@^6.1.4: + version "6.1.4" + resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" + integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== + +denque@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + dequal@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +destr@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449" + integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== + detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -2253,7 +2277,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@2.3.3, fsevents@~2.3.2: +fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -2397,6 +2421,22 @@ gray-matter@^4.0.3: section-matter "^1.0.0" strip-bom-string "^1.0.0" +h3@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/h3/-/h3-1.13.0.tgz#b5347a8936529794b6754b440e26c0ab8a60dceb" + integrity sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg== + dependencies: + cookie-es "^1.2.2" + crossws ">=0.2.0 <0.4.0" + defu "^6.1.4" + destr "^2.0.3" + iron-webcrypto "^1.2.1" + ohash "^1.1.4" + radix3 "^1.1.2" + ufo "^1.5.4" + uncrypto "^0.1.3" + unenv "^1.10.0" + has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -2550,6 +2590,26 @@ internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" +ioredis@^5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.4.2.tgz#ebb6f1a10b825b2c0fb114763d7e82114a0bee6c" + integrity sha512-0SZXGNGZ+WzISQ67QDyZ2x0+wVxjjUndtD8oSeik/4ajifeiRufed8fCb8QW8VMyi4MXcS+UO1k/0NGhvq1PAg== + dependencies: + "@ioredis/commands" "^1.1.1" + cluster-key-slot "^1.1.0" + debug "^4.3.4" + denque "^2.1.0" + lodash.defaults "^4.2.0" + lodash.isarguments "^3.1.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + standard-as-callback "^2.1.0" + +iron-webcrypto@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz#aa60ff2aa10550630f4c0b11fd2442becdb35a6f" + integrity sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg== + is-alphabetical@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" @@ -2818,7 +2878,7 @@ jiti@^1.21.6: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== -jose@^5.9.3: +jose@^5.9.3, jose@^5.9.6: version "5.9.6" resolved "https://registry.yarnpkg.com/jose/-/jose-5.9.6.tgz#77f1f901d88ebdc405e57cce08d2a91f47521883" integrity sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ== @@ -2943,6 +3003,16 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== + +lodash.isarguments@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -2965,7 +3035,7 @@ loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lru-cache@^10.2.0: +lru-cache@^10.2.0, lru-cache@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== @@ -3585,6 +3655,11 @@ micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: braces "^3.0.3" picomatch "^2.3.1" +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3712,6 +3787,11 @@ node-addon-api@^7.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== +node-fetch-native@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.4.tgz#679fc8fd8111266d47d7e72c379f1bed9acff06e" + integrity sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ== + node-releases@^2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" @@ -3732,7 +3812,7 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -oauth4webapi@^3.0.0: +oauth4webapi@^3.0.0, oauth4webapi@^3.1.1: version "3.1.4" resolved "https://registry.yarnpkg.com/oauth4webapi/-/oauth4webapi-3.1.4.tgz#50695385cea8e7a43f3e2e23bc33ea27faece4a7" integrity sha512-eVfN3nZNbok2s/ROifO0UAc5G8nRoLSbrcKJ09OqmucgnhXEfdIQOR4gq1eJH1rN3gV7rNw62bDEgftsgFtBEg== @@ -3804,6 +3884,20 @@ object.values@^1.1.6, object.values@^1.2.0: define-properties "^1.2.1" es-object-atoms "^1.0.0" +ofetch@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.4.1.tgz#b6bf6b0d75ba616cef6519dd8b6385a8bae480ec" + integrity sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw== + dependencies: + destr "^2.0.3" + node-fetch-native "^1.6.4" + ufo "^1.5.4" + +ohash@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/ohash/-/ohash-1.1.4.tgz#ae8d83014ab81157d2c285abf7792e2995fadd72" + integrity sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g== + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -3896,6 +3990,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -3990,11 +4089,21 @@ preact-render-to-string@5.2.3: dependencies: pretty-format "^3.8.0" +preact-render-to-string@6.5.11: + version "6.5.11" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.5.11.tgz#467e69908a453497bb93d4d1fc35fb749a78e027" + integrity sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw== + preact@10.11.3: version "10.11.3" resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== +preact@10.24.3: + version "10.24.3" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.24.3.tgz#086386bd47071e3b45410ef20844c21e23828f64" + integrity sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4017,15 +4126,6 @@ pretty-format@^3.8.0: resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== -prisma@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-6.0.1.tgz#63bf769c798b98986aeaf9cddbf12193f9e2c356" - integrity sha512-CaMNFHkf+DDq8zq3X/JJsQ4Koy7dyWwwtOKibkT/Am9j/tDxcfbg7+lB1Dzhx18G/+RQCMgjPYB61bhRqteNBQ== - dependencies: - "@prisma/engines" "6.0.1" - optionalDependencies: - fsevents "2.3.3" - prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -4050,6 +4150,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +radix3@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/radix3/-/radix3-1.1.2.tgz#fd27d2af3896c6bf4bcdfab6427c69c2afc69ec0" + integrity sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA== + react-dom@^19: version "19.0.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0.tgz#43446f1f01c65a4cd7f7588083e686a6726cfb57" @@ -4141,6 +4246,18 @@ recma-stringify@^1.0.0: unified "^11.0.0" vfile "^6.0.0" +redis-errors@^1.0.0, redis-errors@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" + integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w== + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A== + dependencies: + redis-errors "^1.0.0" + reflect.getprototypeof@^1.0.4, reflect.getprototypeof@^1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz#04311b33a1b713ca5eb7b5aed9950a86481858e5" @@ -4464,6 +4581,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +standard-as-callback@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" + integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== + state-local@^1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" @@ -4877,6 +4999,11 @@ typescript@^5.7.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== +ufo@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" + integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -4887,11 +5014,27 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +uncrypto@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b" + integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== + undici-types@~6.20.0: version "6.20.0" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== +unenv@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/unenv/-/unenv-1.10.0.tgz#c3394a6c6e4cfe68d699f87af456fe3f0db39571" + integrity sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ== + dependencies: + consola "^3.2.3" + defu "^6.1.4" + mime "^3.0.0" + node-fetch-native "^1.6.4" + pathe "^1.1.2" + unified@^11.0.0: version "11.0.5" resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" @@ -4974,6 +5117,20 @@ unist-util-visit@^5.0.0: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" +unstorage@^1.14.4: + version "1.14.4" + resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.14.4.tgz#620dd68997a3245fca1e04c0171335817525bc3d" + integrity sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg== + dependencies: + anymatch "^3.1.3" + chokidar "^3.6.0" + destr "^2.0.3" + h3 "^1.13.0" + lru-cache "^10.4.3" + node-fetch-native "^1.6.4" + ofetch "^1.4.1" + ufo "^1.5.4" + update-browserslist-db@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"