diff --git a/.gitignore b/.gitignore index 8bea82447..6f3962009 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ node-compile-cache/ .eslintcache .env.local .env.*.local +scratch/ npm-debug.log* yarn-debug.log* diff --git a/apps/backend/package.json b/apps/backend/package.json index 57289b2c0..17ebe4199 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -63,7 +63,7 @@ "nodemailer": "^6.9.10", "oidc-provider": "^8.5.1", "openid-client": "5.6.4", - "oslo": "^1.2.1", + "@oslojs/otp": "^1.1.0", "posthog-node": "^4.1.0", "react": "19.0.0", "react-dom": "19.0.0", diff --git a/apps/backend/src/app/api/latest/auth/cli/complete/route.tsx b/apps/backend/src/app/api/latest/auth/cli/complete/route.tsx index cf6a01c61..644bcbd87 100644 --- a/apps/backend/src/app/api/latest/auth/cli/complete/route.tsx +++ b/apps/backend/src/app/api/latest/auth/cli/complete/route.tsx @@ -25,9 +25,8 @@ export const POST = createSmartRouteHandler({ }), async handler({ auth: { tenancy }, body: { login_code, refresh_token } }) { // Find the CLI auth attempt - const cliAuth = await prismaClient.cliAuthAttempt.findFirst({ + const cliAuth = await prismaClient.cliAuthAttempt.findUnique({ where: { - tenancyId: tenancy.id, loginCode: login_code, refreshToken: null, expiresAt: { @@ -40,6 +39,10 @@ export const POST = createSmartRouteHandler({ throw new StatusError(400, "Invalid login code or the code has expired"); } + if (cliAuth.tenancyId !== tenancy.id) { + throw new StatusError(400, "Project ID mismatch; please ensure that you are using the correct app url."); + } + // Update with refresh token await prismaClient.cliAuthAttempt.update({ where: { diff --git a/apps/backend/src/app/api/latest/auth/mfa/sign-in/verification-code-handler.tsx b/apps/backend/src/app/api/latest/auth/mfa/sign-in/verification-code-handler.tsx index 9824a8415..a29dd68ef 100644 --- a/apps/backend/src/app/api/latest/auth/mfa/sign-in/verification-code-handler.tsx +++ b/apps/backend/src/app/api/latest/auth/mfa/sign-in/verification-code-handler.tsx @@ -1,12 +1,12 @@ import { createAuthTokens } from "@/lib/tokens"; import { prismaClient } from "@/prisma-client"; import { createVerificationCodeHandler } from "@/route-handlers/verification-code-handler"; +import { verifyTOTP } from "@oslojs/otp"; import { VerificationCodeType } from "@prisma/client"; import { KnownErrors } from "@stackframe/stack-shared"; import { ProjectsCrud } from "@stackframe/stack-shared/dist/interface/crud/projects"; import { signInResponseSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields"; import { StackAssertionError } from "@stackframe/stack-shared/dist/utils/errors"; -import { TOTPController } from "oslo/otp"; export const mfaVerificationCodeHandler = createVerificationCodeHandler({ metadata: { @@ -49,7 +49,7 @@ export const mfaVerificationCodeHandler = createVerificationCodeHandler({ if (!totpSecret) { throw new StackAssertionError("User does not have a TOTP secret", { user }); } - const isTotpValid = await new TOTPController().verify(body.totp, totpSecret); + const isTotpValid = verifyTOTP(totpSecret, 30, 6, body.totp); if (!isTotpValid) { throw new KnownErrors.InvalidTotpCode(); } diff --git a/apps/e2e/package.json b/apps/e2e/package.json index 20f0e3a71..e8935d045 100644 --- a/apps/e2e/package.json +++ b/apps/e2e/package.json @@ -15,6 +15,6 @@ "@stackframe/stack-shared": "workspace:*", "dotenv": "^16.4.5", "jose": "^5.2.2", - "oslo": "^1.2.1" + "@oslojs/otp": "^1.1.0" } } diff --git a/apps/e2e/tests/backend/endpoints/api/v1/auth/mfa/sign-in.test.ts b/apps/e2e/tests/backend/endpoints/api/v1/auth/mfa/sign-in.test.ts index 1f009c0ab..fdd937950 100644 --- a/apps/e2e/tests/backend/endpoints/api/v1/auth/mfa/sign-in.test.ts +++ b/apps/e2e/tests/backend/endpoints/api/v1/auth/mfa/sign-in.test.ts @@ -1,4 +1,4 @@ -import { TOTPController } from "oslo/otp"; +import { generateTOTP } from "@oslojs/otp"; import { it } from "../../../../../../helpers"; import { Auth, backendContext, niceBackendFetch } from "../../../../../backend-helpers"; @@ -28,7 +28,7 @@ it("should sign in users with MFA enabled", async ({ expect }) => { }, } `); - const totp = await new TOTPController().generate(totpSecret); + const totp = generateTOTP(totpSecret, 30, 6); const response = await niceBackendFetch("/api/v1/auth/mfa/sign-in", { accessType: "client", method: "POST", @@ -67,7 +67,7 @@ it("should reject invalid attempt codes", async ({ expect }) => { const passwordRes = await Auth.Password.signUpWithEmail(); const { totpSecret } = await Auth.Mfa.setupTotpMfa(); await Auth.signOut(); - const totp = await new TOTPController().generate(totpSecret); + const totp = generateTOTP(totpSecret, 30, 6); const response = await niceBackendFetch("/api/v1/auth/mfa/sign-in", { accessType: "client", method: "POST", diff --git a/apps/dashboard/public/stack_auth_cli_template.py b/docs/examples/stack_auth_cli_template.py similarity index 100% rename from apps/dashboard/public/stack_auth_cli_template.py rename to docs/examples/stack_auth_cli_template.py diff --git a/docs/fern/docs/pages-template/others/cli-authentication.mdx b/docs/fern/docs/pages-template/others/cli-authentication.mdx index b862faa22..1be9b0f88 100644 --- a/docs/fern/docs/pages-template/others/cli-authentication.mdx +++ b/docs/fern/docs/pages-template/others/cli-authentication.mdx @@ -5,7 +5,7 @@ description: How to authenticate a command line application using Stack Auth If you're building a command line application that runs in a terminal, you can use Stack Auth to let your users log in to their accounts. -To do so, we provide a Python template that you can use as a starting point. [Download it here](https://app.stack-auth.com/stack_auth_cli_template.py) and copy it into your project, for example: +To do so, we provide a Python template that you can use as a starting point. [Download it here](https://github.com/stack-auth/stack-auth/docs/examples/stack_auth_cli_template.py) and copy it into your project, for example: ```py └─ my-python-app diff --git a/docs/fern/style.css b/docs/fern/style.css index d3d1553cb..8114bde47 100644 --- a/docs/fern/style.css +++ b/docs/fern/style.css @@ -11,6 +11,10 @@ padding: 16px; } +.grid:has(.prose .stack-aside-container) { + grid-template-columns: minmax(0, 1fr) !important; +} + .stack-aside-container { display: grid; grid-template-columns: 55% 40%; @@ -64,19 +68,19 @@ } -.fern-accordion > [data-state="closed"] > button > .fern-accordion-trigger-title > .accordion-show-properties::before { +.fern-accordion > [data-state="closed"] .fern-accordion-trigger-title > .accordion-show-properties::before { content: "Show properties"; } -.fern-accordion > [data-state="open"] > button > .fern-accordion-trigger-title > .accordion-show-properties::before { +.fern-accordion > [data-state="open"] .fern-accordion-trigger-title > .accordion-show-properties::before { content: "Hide properties"; } -.fern-accordion > [data-state="closed"] > button > .fern-accordion-trigger-title > .accordion-show-possible-values::before { +.fern-accordion > [data-state="closed"] .fern-accordion-trigger-title > .accordion-show-possible-values::before { content: "Show possible values"; } -.fern-accordion > [data-state="open"] > button > .fern-accordion-trigger-title > .accordion-show-possible-values::before { +.fern-accordion > [data-state="open"] .fern-accordion-trigger-title > .accordion-show-possible-values::before { content: "Hide possible values"; } @@ -141,7 +145,7 @@ svg[icon*="square-u"] { display: none; } -div.stack-50h > span > span > img { +div.stack-50h > span > span > img, img.stack-50h { aspect-ratio: auto !important; height: unset !important; width: unset !important; @@ -149,7 +153,7 @@ div.stack-50h > span > span > img { object-fit: contain !important; } -div.stack-100h > span > span > img { +div.stack-100h > span > span > img, img.stack-100h { aspect-ratio: auto !important; height: unset !important; width: unset !important; @@ -157,7 +161,7 @@ div.stack-100h > span > span > img { object-fit: contain !important; } -div.stack-150h > span > span > img { +div.stack-150h > span > span > img, img.stack-150h { aspect-ratio: auto !important; height: unset !important; width: unset !important; @@ -165,7 +169,7 @@ div.stack-150h > span > span > img { object-fit: contain !important; } -div.stack-200h > span > span > img { +div.stack-200h > span > span > img, img.stack-200h { aspect-ratio: auto !important; height: unset !important; width: unset !important; @@ -173,7 +177,7 @@ div.stack-200h > span > span > img { object-fit: contain !important; } -div.stack-250h > span > span > img { +div.stack-250h > span > span > img, img.stack-250h { aspect-ratio: auto !important; height: unset !important; width: unset !important; @@ -181,7 +185,7 @@ div.stack-250h > span > span > img { object-fit: contain !important; } -div.stack-300h > span > span > img { +div.stack-300h > span > span > img, img.stack-300h { aspect-ratio: auto !important; height: unset !important; width: unset !important; @@ -189,7 +193,7 @@ div.stack-300h > span > span > img { object-fit: contain !important; } -div.stack-350h > span > span > img { +div.stack-350h > span > span > img, img.stack-350h { aspect-ratio: auto !important; height: unset !important; width: unset !important; diff --git a/packages/js/package.json b/packages/js/package.json index e568e48c8..1f807985a 100644 --- a/packages/js/package.json +++ b/packages/js/package.json @@ -39,7 +39,7 @@ "jose": "^5.2.2", "js-cookie": "^3.0.5", "oauth4webapi": "^2.10.3", - "oslo": "^1.2.1", + "@oslojs/otp": "^1.1.0", "qrcode": "^1.5.4", "rimraf": "^5.0.5", "tsx": "^4.7.2", diff --git a/packages/react/package.json b/packages/react/package.json index 91f7d01b5..23713bbe2 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -50,7 +50,7 @@ "js-cookie": "^3.0.5", "lucide-react": "^0.378.0", "oauth4webapi": "^2.10.3", - "oslo": "^1.2.1", + "@oslojs/otp": "^1.1.0", "qrcode": "^1.5.4", "react-avatar-editor": "^13.0.2", "react-hook-form": "^7.51.4", diff --git a/packages/stack/package.json b/packages/stack/package.json index 82ecd5e33..724660e60 100644 --- a/packages/stack/package.json +++ b/packages/stack/package.json @@ -51,7 +51,7 @@ "js-cookie": "^3.0.5", "lucide-react": "^0.378.0", "oauth4webapi": "^2.10.3", - "oslo": "^1.2.1", + "@oslojs/otp": "^1.1.0", "qrcode": "^1.5.4", "react-avatar-editor": "^13.0.2", "react-hook-form": "^7.51.4", diff --git a/packages/template/package-template.json b/packages/template/package-template.json index 436a69cb7..42d725479 100644 --- a/packages/template/package-template.json +++ b/packages/template/package-template.json @@ -83,7 +83,7 @@ "//": "NEXT_LINE_PLATFORM react-like", "lucide-react": "^0.378.0", "oauth4webapi": "^2.10.3", - "oslo": "^1.2.1", + "@oslojs/otp": "^1.1.0", "qrcode": "^1.5.4", "//": "NEXT_LINE_PLATFORM react-like", "react-avatar-editor": "^13.0.2", diff --git a/packages/template/package.json b/packages/template/package.json index 4462b8583..38c825267 100644 --- a/packages/template/package.json +++ b/packages/template/package.json @@ -56,7 +56,7 @@ "js-cookie": "^3.0.5", "lucide-react": "^0.378.0", "oauth4webapi": "^2.10.3", - "oslo": "^1.2.1", + "@oslojs/otp": "^1.1.0", "qrcode": "^1.5.4", "react-avatar-editor": "^13.0.2", "react-hook-form": "^7.51.4", diff --git a/packages/template/src/components-page/account-settings.tsx b/packages/template/src/components-page/account-settings.tsx index f99be6e98..92d3ca0dc 100644 --- a/packages/template/src/components-page/account-settings.tsx +++ b/packages/template/src/components-page/account-settings.tsx @@ -1,6 +1,7 @@ 'use client'; import { yupResolver } from "@hookform/resolvers/yup"; +import { createTOTPKeyURI, verifyTOTP } from "@oslojs/otp"; import { KnownErrors } from "@stackframe/stack-shared"; import { getPasswordError } from '@stackframe/stack-shared/dist/helpers/password'; import { useAsyncCallback } from '@stackframe/stack-shared/dist/hooks/use-async-callback'; @@ -11,7 +12,6 @@ import { captureError, throwErr } from '@stackframe/stack-shared/dist/utils/erro import { runAsynchronously, runAsynchronouslyWithAlert } from '@stackframe/stack-shared/dist/utils/promises'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActionCell, Badge, Button, Input, Label, PasswordInput, Separator, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from '@stackframe/stack-ui'; import { Edit, Trash, icons } from 'lucide-react'; -import { TOTPController, createTOTPKeyURI } from "oslo/otp"; import * as QRCode from 'qrcode'; import React, { Suspense, useEffect, useState } from "react"; import { useForm } from 'react-hook-form'; @@ -876,7 +876,7 @@ function MfaSection() { useEffect(() => { setIsMaybeWrong(false); runAsynchronouslyWithAlert(async () => { - if (generatedSecret && await new TOTPController().verify(mfaCode, generatedSecret)) { + if (generatedSecret && verifyTOTP(generatedSecret, 30, 6, mfaCode)) { await handleSubmit(); } setIsMaybeWrong(true); @@ -954,7 +954,7 @@ function MfaSection() { } async function generateTotpQrCode(project: Project, user: CurrentUser, secret: Uint8Array) { - const uri = createTOTPKeyURI(project.displayName, user.primaryEmail ?? user.id, secret); + const uri = createTOTPKeyURI(project.displayName, user.primaryEmail ?? user.id, secret, 30, 6); return await QRCode.toDataURL(uri) as any; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1bd07de2..c74a68b4a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,6 +138,9 @@ importers: '@opentelemetry/semantic-conventions': specifier: ^1.27.0 version: 1.27.0 + '@oslojs/otp': + specifier: ^1.1.0 + version: 1.1.0 '@prisma/client': specifier: ^6.0.1 version: 6.0.1(prisma@6.0.1) @@ -186,9 +189,6 @@ importers: openid-client: specifier: 5.6.4 version: 5.6.4(patch_hash=2gg7ly76yaettle5dlvkpcfpny) - oslo: - specifier: ^1.2.1 - version: 1.2.1 posthog-node: specifier: ^4.1.0 version: 4.1.0 @@ -407,6 +407,9 @@ importers: apps/e2e: dependencies: + '@oslojs/otp': + specifier: ^1.1.0 + version: 1.1.0 '@stackframe/js': specifier: workspace:* version: link:../../packages/js @@ -419,9 +422,6 @@ importers: jose: specifier: ^5.2.2 version: 5.6.3 - oslo: - specifier: ^1.2.1 - version: 1.2.1 apps/mcp-server: dependencies: @@ -866,6 +866,9 @@ importers: '@hookform/resolvers': specifier: ^3.3.4 version: 3.6.0(react-hook-form@7.53.1(react@18.3.1)) + '@oslojs/otp': + specifier: ^1.1.0 + version: 1.1.0 '@simplewebauthn/browser': specifier: ^11.0.0 version: 11.0.0 @@ -887,9 +890,6 @@ importers: oauth4webapi: specifier: ^2.10.3 version: 2.10.4 - oslo: - specifier: ^1.2.1 - version: 1.2.1 qrcode: specifier: ^1.5.4 version: 1.5.4 @@ -957,6 +957,9 @@ importers: '@hookform/resolvers': specifier: ^3.3.4 version: 3.6.0(react-hook-form@7.53.1(react@18.3.1)) + '@oslojs/otp': + specifier: ^1.1.0 + version: 1.1.0 '@simplewebauthn/browser': specifier: ^11.0.0 version: 11.0.0 @@ -993,9 +996,6 @@ importers: oauth4webapi: specifier: ^2.10.3 version: 2.10.4 - oslo: - specifier: ^1.2.1 - version: 1.2.1 qrcode: specifier: ^1.5.4 version: 1.5.4 @@ -1075,6 +1075,9 @@ importers: '@hookform/resolvers': specifier: ^3.3.4 version: 3.6.0(react-hook-form@7.53.1(react@18.2.0)) + '@oslojs/otp': + specifier: ^1.1.0 + version: 1.1.0 '@simplewebauthn/browser': specifier: ^11.0.0 version: 11.0.0 @@ -1114,9 +1117,6 @@ importers: oauth4webapi: specifier: ^2.10.3 version: 2.10.4 - oslo: - specifier: ^1.2.1 - version: 1.2.1 qrcode: specifier: ^1.5.4 version: 1.5.4 @@ -1491,6 +1491,9 @@ importers: '@hookform/resolvers': specifier: ^3.3.4 version: 3.6.0(react-hook-form@7.53.1(react@18.3.1)) + '@oslojs/otp': + specifier: ^1.1.0 + version: 1.1.0 '@simplewebauthn/browser': specifier: ^11.0.0 version: 11.0.0 @@ -1530,9 +1533,6 @@ importers: oauth4webapi: specifier: ^2.10.3 version: 2.10.4 - oslo: - specifier: ^1.2.1 - version: 1.2.1 qrcode: specifier: ^1.5.4 version: 1.5.4 @@ -1900,12 +1900,6 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - '@emnapi/core@0.45.0': - resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} - - '@emnapi/runtime@0.45.0': - resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} - '@emnapi/runtime@1.2.0': resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} @@ -3806,180 +3800,6 @@ packages: resolution: {integrity: sha512-sYvqL1GeZLRSwgl++/oOzxJj/ZBe2yXnp6E5LGNQ5qjpn0+t/dwquXILUe3Sk2Y8/wU7XeRxToOtBVeSVkuJag==} engines: {node: '>=16.0.0'} - '@node-rs/argon2-android-arm-eabi@1.7.0': - resolution: {integrity: sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@node-rs/argon2-android-arm64@1.7.0': - resolution: {integrity: sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@node-rs/argon2-darwin-arm64@1.7.0': - resolution: {integrity: sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@node-rs/argon2-darwin-x64@1.7.0': - resolution: {integrity: sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@node-rs/argon2-freebsd-x64@1.7.0': - resolution: {integrity: sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': - resolution: {integrity: sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@node-rs/argon2-linux-arm64-gnu@1.7.0': - resolution: {integrity: sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/argon2-linux-arm64-musl@1.7.0': - resolution: {integrity: sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/argon2-linux-x64-gnu@1.7.0': - resolution: {integrity: sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/argon2-linux-x64-musl@1.7.0': - resolution: {integrity: sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/argon2-wasm32-wasi@1.7.0': - resolution: {integrity: sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@node-rs/argon2-win32-arm64-msvc@1.7.0': - resolution: {integrity: sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@node-rs/argon2-win32-ia32-msvc@1.7.0': - resolution: {integrity: sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@node-rs/argon2-win32-x64-msvc@1.7.0': - resolution: {integrity: sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@node-rs/argon2@1.7.0': - resolution: {integrity: sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==} - engines: {node: '>= 10'} - - '@node-rs/bcrypt-android-arm-eabi@1.9.0': - resolution: {integrity: sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@node-rs/bcrypt-android-arm64@1.9.0': - resolution: {integrity: sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@node-rs/bcrypt-darwin-arm64@1.9.0': - resolution: {integrity: sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@node-rs/bcrypt-darwin-x64@1.9.0': - resolution: {integrity: sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@node-rs/bcrypt-freebsd-x64@1.9.0': - resolution: {integrity: sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': - resolution: {integrity: sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': - resolution: {integrity: sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/bcrypt-linux-arm64-musl@1.9.0': - resolution: {integrity: sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/bcrypt-linux-x64-gnu@1.9.0': - resolution: {integrity: sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/bcrypt-linux-x64-musl@1.9.0': - resolution: {integrity: sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/bcrypt-wasm32-wasi@1.9.0': - resolution: {integrity: sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': - resolution: {integrity: sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': - resolution: {integrity: sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@node-rs/bcrypt-win32-x64-msvc@1.9.0': - resolution: {integrity: sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@node-rs/bcrypt@1.9.0': - resolution: {integrity: sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig==} - engines: {node: '>= 10'} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -4263,6 +4083,21 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 + '@oslojs/asn1@1.0.0': + resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==} + + '@oslojs/binary@1.0.0': + resolution: {integrity: sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==} + + '@oslojs/crypto@1.0.0': + resolution: {integrity: sha512-dVz8TkkgYdr3tlwxHd7SCYGxoN7ynwHLA0nei/Aq9C+ERU0BK+U8+/3soEzBUxUNKYBf42351DyJUZ2REla50w==} + + '@oslojs/encoding@1.0.0': + resolution: {integrity: sha512-dyIB0SdZgMm5BhGwdSp8rMxEFIopLKxDG1vxIBaiogyom6ZqH2aXPb6DEC2WzOOWKdPSq1cxdNeRx2wAn1Z+ZQ==} + + '@oslojs/otp@1.1.0': + resolution: {integrity: sha512-tpdxlnCLcY6IZLLqH8kGD8PSvIVyev/+Gbglgvrk9e4YzgKO7+7FL8NWBofL7LZI6MgQ1HnNUuotRG6t1JJ0dg==} + '@peculiar/asn1-android@2.3.13': resolution: {integrity: sha512-0VTNazDGKrLS6a3BwTDZanqq6DR/I3SbvmDMuS8Be+OYpvM6x1SRDh9AGDsHVnaCOIztOspCPc6N1m+iUv1Xxw==} @@ -6044,9 +5879,6 @@ packages: '@tweenjs/tween.js@25.0.0': resolution: {integrity: sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==} - '@tybys/wasm-util@0.8.3': - resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} - '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} @@ -8408,9 +8240,6 @@ packages: resolution: {integrity: sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==} engines: {node: '>=10.13.0'} - fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} - fs-tree-diff@2.0.1: resolution: {integrity: sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A==} engines: {node: 6.* || 8.* || >= 10.*} @@ -9439,13 +9268,6 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} - memfs-browser@3.5.10302: - resolution: {integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==} - - memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} - meow@7.1.1: resolution: {integrity: sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==} engines: {node: '>=10'} @@ -9975,10 +9797,6 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - oslo@1.2.1: - resolution: {integrity: sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA==} - deprecated: Package is no longer supported. Please see https://oslojs.dev for the successor project. - outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -12748,16 +12566,6 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@emnapi/core@0.45.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@0.45.0': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.2.0': dependencies: tslib: 2.8.1 @@ -14071,134 +13879,6 @@ snapshots: basic-auth: 2.0.1 type-is: 1.6.18 - '@node-rs/argon2-android-arm-eabi@1.7.0': - optional: true - - '@node-rs/argon2-android-arm64@1.7.0': - optional: true - - '@node-rs/argon2-darwin-arm64@1.7.0': - optional: true - - '@node-rs/argon2-darwin-x64@1.7.0': - optional: true - - '@node-rs/argon2-freebsd-x64@1.7.0': - optional: true - - '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': - optional: true - - '@node-rs/argon2-linux-arm64-gnu@1.7.0': - optional: true - - '@node-rs/argon2-linux-arm64-musl@1.7.0': - optional: true - - '@node-rs/argon2-linux-x64-gnu@1.7.0': - optional: true - - '@node-rs/argon2-linux-x64-musl@1.7.0': - optional: true - - '@node-rs/argon2-wasm32-wasi@1.7.0': - dependencies: - '@emnapi/core': 0.45.0 - '@emnapi/runtime': 0.45.0 - '@tybys/wasm-util': 0.8.3 - memfs-browser: 3.5.10302 - optional: true - - '@node-rs/argon2-win32-arm64-msvc@1.7.0': - optional: true - - '@node-rs/argon2-win32-ia32-msvc@1.7.0': - optional: true - - '@node-rs/argon2-win32-x64-msvc@1.7.0': - optional: true - - '@node-rs/argon2@1.7.0': - optionalDependencies: - '@node-rs/argon2-android-arm-eabi': 1.7.0 - '@node-rs/argon2-android-arm64': 1.7.0 - '@node-rs/argon2-darwin-arm64': 1.7.0 - '@node-rs/argon2-darwin-x64': 1.7.0 - '@node-rs/argon2-freebsd-x64': 1.7.0 - '@node-rs/argon2-linux-arm-gnueabihf': 1.7.0 - '@node-rs/argon2-linux-arm64-gnu': 1.7.0 - '@node-rs/argon2-linux-arm64-musl': 1.7.0 - '@node-rs/argon2-linux-x64-gnu': 1.7.0 - '@node-rs/argon2-linux-x64-musl': 1.7.0 - '@node-rs/argon2-wasm32-wasi': 1.7.0 - '@node-rs/argon2-win32-arm64-msvc': 1.7.0 - '@node-rs/argon2-win32-ia32-msvc': 1.7.0 - '@node-rs/argon2-win32-x64-msvc': 1.7.0 - - '@node-rs/bcrypt-android-arm-eabi@1.9.0': - optional: true - - '@node-rs/bcrypt-android-arm64@1.9.0': - optional: true - - '@node-rs/bcrypt-darwin-arm64@1.9.0': - optional: true - - '@node-rs/bcrypt-darwin-x64@1.9.0': - optional: true - - '@node-rs/bcrypt-freebsd-x64@1.9.0': - optional: true - - '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': - optional: true - - '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': - optional: true - - '@node-rs/bcrypt-linux-arm64-musl@1.9.0': - optional: true - - '@node-rs/bcrypt-linux-x64-gnu@1.9.0': - optional: true - - '@node-rs/bcrypt-linux-x64-musl@1.9.0': - optional: true - - '@node-rs/bcrypt-wasm32-wasi@1.9.0': - dependencies: - '@emnapi/core': 0.45.0 - '@emnapi/runtime': 0.45.0 - '@tybys/wasm-util': 0.8.3 - memfs-browser: 3.5.10302 - optional: true - - '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': - optional: true - - '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': - optional: true - - '@node-rs/bcrypt-win32-x64-msvc@1.9.0': - optional: true - - '@node-rs/bcrypt@1.9.0': - optionalDependencies: - '@node-rs/bcrypt-android-arm-eabi': 1.9.0 - '@node-rs/bcrypt-android-arm64': 1.9.0 - '@node-rs/bcrypt-darwin-arm64': 1.9.0 - '@node-rs/bcrypt-darwin-x64': 1.9.0 - '@node-rs/bcrypt-freebsd-x64': 1.9.0 - '@node-rs/bcrypt-linux-arm-gnueabihf': 1.9.0 - '@node-rs/bcrypt-linux-arm64-gnu': 1.9.0 - '@node-rs/bcrypt-linux-arm64-musl': 1.9.0 - '@node-rs/bcrypt-linux-x64-gnu': 1.9.0 - '@node-rs/bcrypt-linux-x64-musl': 1.9.0 - '@node-rs/bcrypt-wasm32-wasi': 1.9.0 - '@node-rs/bcrypt-win32-arm64-msvc': 1.9.0 - '@node-rs/bcrypt-win32-ia32-msvc': 1.9.0 - '@node-rs/bcrypt-win32-x64-msvc': 1.9.0 - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -14561,6 +14241,25 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@oslojs/asn1@1.0.0': + dependencies: + '@oslojs/binary': 1.0.0 + + '@oslojs/binary@1.0.0': {} + + '@oslojs/crypto@1.0.0': + dependencies: + '@oslojs/asn1': 1.0.0 + '@oslojs/binary': 1.0.0 + + '@oslojs/encoding@1.0.0': {} + + '@oslojs/otp@1.1.0': + dependencies: + '@oslojs/binary': 1.0.0 + '@oslojs/crypto': 1.0.0 + '@oslojs/encoding': 1.0.0 + '@peculiar/asn1-android@2.3.13': dependencies: '@peculiar/asn1-schema': 2.3.13 @@ -16641,11 +16340,6 @@ snapshots: '@tweenjs/tween.js@25.0.0': {} - '@tybys/wasm-util@0.8.3': - dependencies: - tslib: 2.8.1 - optional: true - '@types/accepts@1.3.7': dependencies: '@types/node': 20.17.6 @@ -19694,9 +19388,6 @@ snapshots: graceful-fs: 4.2.11 streamx: 2.18.0 - fs-monkey@1.0.6: - optional: true - fs-tree-diff@2.0.1: dependencies: '@types/symlink-or-copy': 1.2.2 @@ -20785,16 +20476,6 @@ snapshots: media-typer@1.1.0: {} - memfs-browser@3.5.10302: - dependencies: - memfs: 3.5.3 - optional: true - - memfs@3.5.3: - dependencies: - fs-monkey: 1.0.6 - optional: true - meow@7.1.1: dependencies: '@types/minimist': 1.2.5 @@ -21529,11 +21210,6 @@ snapshots: os-tmpdir@1.0.2: {} - oslo@1.2.1: - dependencies: - '@node-rs/argon2': 1.7.0 - '@node-rs/bcrypt': 1.9.0 - outdent@0.5.0: {} p-cancelable@3.0.0: {}