diff --git a/apps/backend/sentry.client.config.ts b/apps/backend/sentry.client.config.ts
index bd7e01706..985801a55 100644
--- a/apps/backend/sentry.client.config.ts
+++ b/apps/backend/sentry.client.config.ts
@@ -4,14 +4,13 @@
import * as Sentry from "@sentry/nextjs";
import { getBrowserCompatibilityReport } from "@stackframe/stack-shared/dist/utils/browser-compat";
-import { getPublicEnvVar } from "@stackframe/stack-shared/dist/utils/env";
import { sentryBaseConfig } from "@stackframe/stack-shared/dist/utils/sentry";
import { nicify } from "@stackframe/stack-shared/dist/utils/strings";
Sentry.init({
...sentryBaseConfig,
- dsn: getPublicEnvVar("NEXT_PUBLIC_SENTRY_DSN"),
+ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
enabled: process.env.NODE_ENV !== "development" && !process.env.CI,
diff --git a/apps/backend/src/app/api/latest/auth/oauth/authorize/[provider_id]/route.tsx b/apps/backend/src/app/api/latest/auth/oauth/authorize/[provider_id]/route.tsx
index 879cd5e04..4d0990b04 100644
--- a/apps/backend/src/app/api/latest/auth/oauth/authorize/[provider_id]/route.tsx
+++ b/apps/backend/src/app/api/latest/auth/oauth/authorize/[provider_id]/route.tsx
@@ -1,5 +1,5 @@
import { checkApiKeySet } from "@/lib/api-keys";
-import { Tenancy, getSoleTenancyFromProject } from "@/lib/tenancies";
+import { getSoleTenancyFromProject } from "@/lib/tenancies";
import { decodeAccessToken, oauthCookieSchema } from "@/lib/tokens";
import { getProvider } from "@/oauth";
import { prismaClient } from "@/prisma-client";
diff --git a/apps/dashboard/sentry.client.config.ts b/apps/dashboard/sentry.client.config.ts
index b39f793b6..daf4e38d5 100644
--- a/apps/dashboard/sentry.client.config.ts
+++ b/apps/dashboard/sentry.client.config.ts
@@ -2,9 +2,9 @@
// The config you add here will be used whenever a users loads a page in their browser.
// https://docs.sentry.io/platforms/javascript/guides/nextjs/
+import { getPublicEnvVar } from "@/lib/env";
import * as Sentry from "@sentry/nextjs";
import { getBrowserCompatibilityReport } from "@stackframe/stack-shared/dist/utils/browser-compat";
-import { getPublicEnvVar } from "@stackframe/stack-shared/dist/utils/env";
import { sentryBaseConfig } from "@stackframe/stack-shared/dist/utils/sentry";
import { nicify } from "@stackframe/stack-shared/dist/utils/strings";
import posthog from "posthog-js";
diff --git a/apps/dashboard/src/app/(main)/(protected)/layout.tsx b/apps/dashboard/src/app/(main)/(protected)/layout.tsx
index 2bf6a5bd8..8bfa3ec02 100644
--- a/apps/dashboard/src/app/(main)/(protected)/layout.tsx
+++ b/apps/dashboard/src/app/(main)/(protected)/layout.tsx
@@ -2,7 +2,7 @@
import Loading from "@/app/loading";
import { useStackApp, useUser } from "@stackframe/stack";
-import { getPublicEnvVar } from '@stackframe/stack-shared/dist/utils/env';
+import { getPublicEnvVar } from '@/lib/env';
import { runAsynchronouslyWithAlert } from "@stackframe/stack-shared/dist/utils/promises";
import { useEffect } from "react";
diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/providers.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/providers.tsx
index 8c34502d7..2cb70453e 100644
--- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/providers.tsx
+++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/providers.tsx
@@ -1,9 +1,9 @@
"use client";
import { FormDialog } from "@/components/form-dialog";
import { InputField, SwitchField } from "@/components/form-fields";
-import type { AdminProject } from "@stackframe/stack";
+import { getPublicEnvVar } from '@/lib/env';
+import { AdminProject } from "@stackframe/stack";
import { yupBoolean, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
-import { getPublicEnvVar } from '@stackframe/stack-shared/dist/utils/env';
import { sharedProviders } from "@stackframe/stack-shared/dist/utils/oauth";
import { ActionDialog, Badge, BrandIcons, InlineCode, Label, SimpleTooltip, Typography } from "@stackframe/stack-ui";
import clsx from "clsx";
diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/emails/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/emails/page-client.tsx
index bc7b1ecbf..aba3e6f4f 100644
--- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/emails/page-client.tsx
+++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/emails/page-client.tsx
@@ -4,12 +4,12 @@ import { FormDialog } from "@/components/form-dialog";
import { InputField, SelectField } from "@/components/form-fields";
import { useRouter } from "@/components/router";
import { SettingCard, SettingText } from "@/components/settings";
+import { getPublicEnvVar } from "@/lib/env";
import { AdminEmailConfig, AdminProject } from "@stackframe/stack";
import { Reader } from "@stackframe/stack-emails/dist/editor/email-builder/index";
import { EMAIL_TEMPLATES_METADATA, convertEmailSubjectVariables, convertEmailTemplateMetadataExampleValues, convertEmailTemplateVariables, validateEmailTemplateContent } from "@stackframe/stack-emails/dist/utils";
import { EmailTemplateType } from "@stackframe/stack-shared/dist/interface/crud/email-templates";
import { strictEmailSchema } from "@stackframe/stack-shared/dist/schema-fields";
-import { getPublicEnvVar } from "@stackframe/stack-shared/dist/utils/env";
import { throwErr } from "@stackframe/stack-shared/dist/utils/errors";
import { deepPlainEquals } from "@stackframe/stack-shared/dist/utils/objects";
import { ActionCell, ActionDialog, Alert, Button, Card, SimpleTooltip, Typography, useToast } from "@stackframe/stack-ui";
diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/project-settings/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/project-settings/page-client.tsx
index 890c6d073..3bb12d6bb 100644
--- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/project-settings/page-client.tsx
+++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/project-settings/page-client.tsx
@@ -2,7 +2,7 @@
import { InputField, SwitchField } from "@/components/form-fields";
import { StyledLink } from "@/components/link";
import { FormSettingCard, SettingCard, SettingSwitch, SettingText } from "@/components/settings";
-import { getPublicEnvVar } from '@stackframe/stack-shared/dist/utils/env';
+import { getPublicEnvVar } from '@/lib/env';
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActionDialog, Alert, Button, Typography } from "@stackframe/stack-ui";
import * as yup from "yup";
import { PageLayout } from "../page-layout";
diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/sidebar-layout.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/sidebar-layout.tsx
index b57bf4568..906ccdcbc 100644
--- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/sidebar-layout.tsx
+++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/sidebar-layout.tsx
@@ -5,7 +5,7 @@ import { Link } from "@/components/link";
import { Logo } from "@/components/logo";
import { ProjectSwitcher } from "@/components/project-switcher";
import ThemeToggle from "@/components/theme-toggle";
-import { getPublicEnvVar } from '@stackframe/stack-shared/dist/utils/env';
+import { getPublicEnvVar } from '@/lib/env';
import { cn } from "@/lib/utils";
import { AdminProject, UserButton, useUser } from "@stackframe/stack";
import { EMAIL_TEMPLATES_METADATA } from "@stackframe/stack-emails/dist/utils";
diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/webhooks/[endpointId]/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/webhooks/[endpointId]/page-client.tsx
index 0219c3a31..1b45a4e6c 100644
--- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/webhooks/[endpointId]/page-client.tsx
+++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/webhooks/[endpointId]/page-client.tsx
@@ -1,7 +1,7 @@
"use client";
import { SettingCard } from "@/components/settings";
-import { getPublicEnvVar } from '@stackframe/stack-shared/dist/utils/env';
+import { getPublicEnvVar } from '@/lib/env';
import { Alert, Badge, Button, CopyButton, Label, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from "@stackframe/stack-ui";
import { ChevronLeft, ChevronRight } from "lucide-react";
import { useMemo, useState } from "react";
diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/webhooks/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/webhooks/page-client.tsx
index f508c4f40..06b0d7ade 100644
--- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/webhooks/page-client.tsx
+++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/webhooks/page-client.tsx
@@ -4,8 +4,8 @@ import { FormDialog, SmartFormDialog } from "@/components/form-dialog";
import { InputField } from "@/components/form-fields";
import { useRouter } from "@/components/router";
import { SettingCard } from "@/components/settings";
+import { getPublicEnvVar } from '@/lib/env';
import { urlSchema } from "@stackframe/stack-shared/dist/schema-fields";
-import { getPublicEnvVar } from '@stackframe/stack-shared/dist/utils/env';
import { ActionCell, ActionDialog, Alert, Button, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from "@stackframe/stack-ui";
import { useState } from "react";
import { SvixProvider, useEndpoints, useSvix } from "svix-react";
diff --git a/apps/dashboard/src/app/layout.tsx b/apps/dashboard/src/app/layout.tsx
index d24769a62..1e37a6004 100644
--- a/apps/dashboard/src/app/layout.tsx
+++ b/apps/dashboard/src/app/layout.tsx
@@ -3,11 +3,11 @@ import { RouterProvider } from '@/components/router';
import { SiteLoadingIndicatorDisplay } from '@/components/site-loading-indicator';
import { StyleLink } from '@/components/style-link';
import { ThemeProvider } from '@/components/theme-provider';
-import { cn } from '@/lib/utils';
+import { getPublicEnvVar } from '@/lib/env';
import { stackServerApp } from '@/stack';
import { StackProvider, StackTheme } from '@stackframe/stack';
-import { getEnvVariable, getNodeEnvironment, getPublicEnvVar } from '@stackframe/stack-shared/dist/utils/env';
-import { Toaster } from '@stackframe/stack-ui';
+import { getEnvVariable, getNodeEnvironment } from '@stackframe/stack-shared/dist/utils/env';
+import { Toaster, cn } from '@stackframe/stack-ui';
import { Analytics } from "@vercel/analytics/react";
import { SpeedInsights } from "@vercel/speed-insights/next";
import { GeistMono } from "geist/font/mono";
diff --git a/apps/dashboard/src/app/providers.tsx b/apps/dashboard/src/app/providers.tsx
index 49f1f0265..02227c740 100644
--- a/apps/dashboard/src/app/providers.tsx
+++ b/apps/dashboard/src/app/providers.tsx
@@ -1,5 +1,5 @@
'use client';
-import { getPublicEnvVar } from '@stackframe/stack-shared/dist/utils/env';
+import { getPublicEnvVar } from '@/lib/env';
import { useStackApp, useUser } from '@stackframe/stack';
import posthog from 'posthog-js';
import { PostHogProvider } from 'posthog-js/react';
diff --git a/apps/dashboard/src/components/env-keys.tsx b/apps/dashboard/src/components/env-keys.tsx
index 9577a87f3..dc0eaf98e 100644
--- a/apps/dashboard/src/components/env-keys.tsx
+++ b/apps/dashboard/src/components/env-keys.tsx
@@ -1,4 +1,4 @@
-import { getPublicEnvVar } from '@stackframe/stack-shared/dist/utils/env';
+import { getPublicEnvVar } from '@/lib/env';
import { Button, CopyField, Tabs, TabsContent, TabsList, TabsTrigger } from "@stackframe/stack-ui";
export default function EnvKeys(props: {
diff --git a/apps/dashboard/src/components/version-alerter.tsx b/apps/dashboard/src/components/version-alerter.tsx
index e0594b6ef..85eb695b2 100644
--- a/apps/dashboard/src/components/version-alerter.tsx
+++ b/apps/dashboard/src/components/version-alerter.tsx
@@ -1,6 +1,6 @@
"use client";
-import { getPublicEnvVar } from '@stackframe/stack-shared/dist/utils/env';
+import { getPublicEnvVar } from '@/lib/env';
import { runAsynchronously, wait } from "@stackframe/stack-shared/dist/utils/promises";
import { useEffect, useState } from "react";
import packageJson from "../../package.json";
diff --git a/apps/dashboard/src/hooks/use-animation-frame.tsx b/apps/dashboard/src/hooks/use-animation-frame.tsx
index 7ab000199..24f316239 100644
--- a/apps/dashboard/src/hooks/use-animation-frame.tsx
+++ b/apps/dashboard/src/hooks/use-animation-frame.tsx
@@ -1,5 +1,5 @@
import { isBrowserLike } from "@stackframe/stack-shared/dist/utils/env";
-import { useEffect, useLayoutEffect, useRef } from "react";
+import { useLayoutEffect, useRef } from "react";
export function useAnimationFrame(callback: FrameRequestCallback) {
const actualCallbackRef = useRef(callback);
diff --git a/apps/dashboard/src/lib/env.tsx b/apps/dashboard/src/lib/env.tsx
new file mode 100644
index 000000000..eca47a029
--- /dev/null
+++ b/apps/dashboard/src/lib/env.tsx
@@ -0,0 +1,60 @@
+/* eslint-disable no-restricted-syntax */
+
+// hack to make sure process is defined in non-node environments
+// NEXT_LINE_PLATFORM js
+process = (globalThis as any).process ?? { env: {} };
+
+const _inlineEnvVars = {
+ NEXT_PUBLIC_STACK_API_URL: process.env.NEXT_PUBLIC_STACK_API_URL,
+ NEXT_PUBLIC_BROWSER_STACK_API_URL: process.env.NEXT_PUBLIC_BROWSER_STACK_API_URL,
+ NEXT_PUBLIC_SERVER_STACK_API_URL: process.env.NEXT_PUBLIC_SERVER_STACK_API_URL,
+ NEXT_PUBLIC_STACK_DASHBOARD_URL: process.env.NEXT_PUBLIC_STACK_DASHBOARD_URL,
+ NEXT_PUBLIC_BROWSER_STACK_DASHBOARD_URL: process.env.NEXT_PUBLIC_BROWSER_STACK_DASHBOARD_URL,
+ NEXT_PUBLIC_SERVER_STACK_DASHBOARD_URL: process.env.NEXT_PUBLIC_SERVER_STACK_DASHBOARD_URL,
+ NEXT_PUBLIC_POSTHOG_KEY: process.env.NEXT_PUBLIC_POSTHOG_KEY,
+ NEXT_PUBLIC_STACK_SVIX_SERVER_URL: process.env.NEXT_PUBLIC_STACK_SVIX_SERVER_URL,
+ NEXT_PUBLIC_SENTRY_DSN: process.env.NEXT_PUBLIC_SENTRY_DSN,
+ NEXT_PUBLIC_VERSION_ALERTER_SEVERE_ONLY: process.env.NEXT_PUBLIC_VERSION_ALERTER_SEVERE_ONLY,
+ NEXT_PUBLIC_STACK_EMULATOR_ENABLED: process.env.NEXT_PUBLIC_STACK_EMULATOR_ENABLED,
+ NEXT_PUBLIC_STACK_EMULATOR_PROJECT_ID: process.env.NEXT_PUBLIC_STACK_EMULATOR_PROJECT_ID,
+ NEXT_PUBLIC_STACK_PROJECT_ID: process.env.NEXT_PUBLIC_STACK_PROJECT_ID,
+ NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY: process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY,
+ NEXT_PUBLIC_STACK_URL: process.env.NEXT_PUBLIC_STACK_URL,
+ NEXT_PUBLIC_STACK_INBUCKET_WEB_URL: process.env.NEXT_PUBLIC_STACK_INBUCKET_WEB_URL,
+} as const;
+
+// This will be replaced with the actual env vars after a docker build
+const _postBuildEnvVars = {
+ NEXT_PUBLIC_STACK_API_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_API_URL",
+ NEXT_PUBLIC_BROWSER_STACK_API_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_BROWSER_STACK_API_URL",
+ NEXT_PUBLIC_SERVER_STACK_API_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_SERVER_STACK_API_URL",
+ NEXT_PUBLIC_STACK_DASHBOARD_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_DASHBOARD_URL",
+ NEXT_PUBLIC_BROWSER_STACK_DASHBOARD_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_BROWSER_STACK_DASHBOARD_URL",
+ NEXT_PUBLIC_SERVER_STACK_DASHBOARD_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_SERVER_STACK_DASHBOARD_URL",
+ NEXT_PUBLIC_STACK_PROJECT_ID: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_PROJECT_ID",
+ NEXT_PUBLIC_POSTHOG_KEY: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_POSTHOG_KEY",
+ NEXT_PUBLIC_STACK_SVIX_SERVER_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_SVIX_SERVER_URL",
+ NEXT_PUBLIC_SENTRY_DSN: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_SENTRY_DSN",
+ NEXT_PUBLIC_VERSION_ALERTER_SEVERE_ONLY: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_VERSION_ALERTER_SEVERE_ONLY",
+ NEXT_PUBLIC_STACK_EMULATOR_ENABLED: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_EMULATOR_ENABLED",
+ NEXT_PUBLIC_STACK_EMULATOR_PROJECT_ID: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_EMULATOR_PROJECT_ID",
+ NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY",
+ NEXT_PUBLIC_STACK_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_URL",
+ NEXT_PUBLIC_STACK_INBUCKET_WEB_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_INBUCKET_WEB_URL",
+} satisfies typeof _inlineEnvVars;
+
+// If this is not replaced with "true", then we will not use inline env vars
+const _usePostBuildEnvVars = 'STACK_ENV_VAR_SENTINEL_USE_INLINE_ENV_VARS';
+
+export function getPublicEnvVar(name: keyof typeof _inlineEnvVars) {
+ // This is a hack to force the compiler not to do any smart optimizations
+ const _ = _usePostBuildEnvVars.toString() + _inlineEnvVars.toString(); // Force runtime evaluation
+
+ const value = _usePostBuildEnvVars.slice(0) === 'true' ? _postBuildEnvVars[name] : _inlineEnvVars[name];
+
+ if (_usePostBuildEnvVars.slice(0) === 'true' && value && value.startsWith('STACK_ENV_VAR_SENTINEL')) {
+ return undefined;
+ }
+ return value;
+}
+
diff --git a/apps/dashboard/src/lib/utils.tsx b/apps/dashboard/src/lib/utils.tsx
index c3fa719c9..b0bac8dac 100644
--- a/apps/dashboard/src/lib/utils.tsx
+++ b/apps/dashboard/src/lib/utils.tsx
@@ -1,4 +1,4 @@
-import { getPublicEnvVar } from "@stackframe/stack-shared/dist/utils/env";
+import { getPublicEnvVar } from "@/lib/env";
import { clsx, type ClassValue } from "clsx";
import { redirect } from "next/navigation";
import { twMerge } from "tailwind-merge";
diff --git a/apps/dashboard/src/middleware.tsx b/apps/dashboard/src/middleware.tsx
index 5879496b0..8e71b71ea 100644
--- a/apps/dashboard/src/middleware.tsx
+++ b/apps/dashboard/src/middleware.tsx
@@ -1,10 +1,10 @@
import { getEnvVariable, getNodeEnvironment } from '@stackframe/stack-shared/dist/utils/env';
import './polyfills';
-import { NextResponse } from 'next/server';
-import type { NextRequest } from 'next/server';
import { StackAssertionError } from '@stackframe/stack-shared/dist/utils/errors';
import { wait } from '@stackframe/stack-shared/dist/utils/promises';
+import type { NextRequest } from 'next/server';
+import { NextResponse } from 'next/server';
const corsAllowedRequestHeaders = [
// General
diff --git a/apps/dashboard/src/stack.tsx b/apps/dashboard/src/stack.tsx
index 43bbd0117..d30302381 100644
--- a/apps/dashboard/src/stack.tsx
+++ b/apps/dashboard/src/stack.tsx
@@ -1,5 +1,6 @@
import { StackServerApp } from '@stackframe/stack';
-import { getPublicEnvVar } from "@stackframe/stack-shared/dist/utils/env";
+import { getPublicEnvVar } from "@/lib/env";
+import { throwErr } from '@stackframe/stack-shared/dist/utils/errors';
import './polyfills';
if (getPublicEnvVar("NEXT_PUBLIC_STACK_PROJECT_ID") !== "internal") {
@@ -7,6 +8,12 @@ if (getPublicEnvVar("NEXT_PUBLIC_STACK_PROJECT_ID") !== "internal") {
}
export const stackServerApp = new StackServerApp<"nextjs-cookie", true, 'internal'>({
+ baseUrl: {
+ browser: getPublicEnvVar("NEXT_PUBLIC_BROWSER_STACK_API_URL") ?? getPublicEnvVar("NEXT_PUBLIC_STACK_API_URL") ?? throwErr("NEXT_PUBLIC_BROWSER_STACK_API_URL is not set"),
+ server: getPublicEnvVar("NEXT_PUBLIC_SERVER_STACK_API_URL") ?? getPublicEnvVar("NEXT_PUBLIC_STACK_API_URL") ?? throwErr("NEXT_PUBLIC_SERVER_STACK_API_URL is not set"),
+ },
+ projectId: "internal",
+ publishableClientKey: getPublicEnvVar("NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY"),
tokenStore: "nextjs-cookie",
urls: {
afterSignIn: "/projects",
diff --git a/docker/server/entrypoint.sh b/docker/server/entrypoint.sh
index eace87ca6..145ce2c38 100644
--- a/docker/server/entrypoint.sh
+++ b/docker/server/entrypoint.sh
@@ -16,9 +16,9 @@ export NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=${STACK_SEED_INTERNAL_PROJECT_PU
export STACK_SECRET_SERVER_KEY=${STACK_SEED_INTERNAL_PROJECT_SECRET_SERVER_KEY}
export STACK_SUPER_SECRET_ADMIN_KEY=${STACK_SEED_INTERNAL_PROJECT_SUPER_SECRET_ADMIN_KEY}
-export NEXT_PUBLIC_CLIENT_STACK_DASHBOARD_URL=${NEXT_PUBLIC_STACK_DASHBOARD_URL}
+export NEXT_PUBLIC_BROWSER_STACK_DASHBOARD_URL=${NEXT_PUBLIC_STACK_DASHBOARD_URL}
export NEXT_PUBLIC_SERVER_STACK_DASHBOARD_URL="http://localhost:8101"
-export NEXT_PUBLIC_CLIENT_STACK_API_URL=${NEXT_PUBLIC_STACK_API_URL}
+export NEXT_PUBLIC_BROWSER_STACK_API_URL=${NEXT_PUBLIC_STACK_API_URL}
export NEXT_PUBLIC_SERVER_STACK_API_URL="http://localhost:8102"
export USE_INLINE_ENV_VARS=true
diff --git a/docs/fern/docs.yml b/docs/fern/docs.yml
index 2d74a1cd9..117e7eb99 100644
--- a/docs/fern/docs.yml
+++ b/docs/fern/docs.yml
@@ -110,6 +110,9 @@ navigation:
- page: Self-Hosting
icon: fa-regular fa-house-laptop
path: ./docs/pages/others/self-host.mdx
+ - page: Vanilla JavaScript Client
+ icon: fa-brands fa-js
+ path: ./docs/pages/others/js-client.mdx
- tab: components
layout:
- page: All Components
diff --git a/docs/fern/docs/pages/getting-started/setup.mdx b/docs/fern/docs/pages/getting-started/setup.mdx
index 34e8e496c..a0b760218 100644
--- a/docs/fern/docs/pages/getting-started/setup.mdx
+++ b/docs/fern/docs/pages/getting-started/setup.mdx
@@ -5,7 +5,11 @@ subtitle: Getting started with Stack in 5 minutes
## Setup
-To get started with Stack, you need a [Next.js project](https://nextjs.org/docs/getting-started/installation) with the app router. The pages router is not supported.
+
+This is the setup guide for Next.js. If you are looking for the setup guide for vanilla JavaScript, check out the [JavaScript Client Guide](../others/js-client.mdx).
+
+
+To get started with Stack Auth, you need a [Next.js project](https://nextjs.org/docs/getting-started/installation) with the app router. The pages router is not supported.
We recommend using our **setup wizard**, which will automatically detect your project structure and guide you through the installation process. In case it fails, you can choose to do the manual installation instead.
diff --git a/docs/fern/docs/pages/others/js-client.mdx b/docs/fern/docs/pages/others/js-client.mdx
new file mode 100644
index 000000000..11c6c0080
--- /dev/null
+++ b/docs/fern/docs/pages/others/js-client.mdx
@@ -0,0 +1,227 @@
+---
+slug: others/js-client
+subtitle: Vanilla JavaScript client library
+---
+
+Stack Auth provides a vanilla JavaScript/TypeScript client library that works with any JavaScript framework in both frontend and backend environments.
+
+Key differences between the JavaScript and Next.js client libraries:
+- No built-in UI components or default pages - you'll need to implement your own UI and callback handlers
+- No React hooks functionality (useUser(), useStackApp(), etc.)
+
+## Installation
+
+```bash
+npm install @stackframe/js
+```
+
+## Backend
+
+### Initialization
+
+```typescript
+import { StackServerApp } from "@stackframe/js";
+
+const stackServerApp = new StackServerApp({
+ projectId: "your-project-id-from-dashboard",
+ publishableClientKey: "your-publishable-client-key-from-dashboard",
+ secretServerKey: "your-secret-server-key-from-dashboard",
+ tokenStore: "memory",
+});
+```
+
+### Example usage
+
+```typescript
+const user = await stackServerApp.getUser("user_id");
+
+await user.update({
+ displayName: "New Display Name",
+});
+
+const team = await stackServerApp.createTeam({
+ name: "New Team",
+});
+
+await team.addUser(user.id);
+```
+
+## Frontend
+
+### Initialization
+
+```typescript
+import { StackClientApp } from "@stackframe/js";
+
+const stackClientApp = new StackClientApp({
+ projectId: "your-project-id-from-dashboard",
+ publishableClientKey: "your-publishable-client-key-from-dashboard",
+ tokenStore: "cookie",
+});
+```
+
+### Example usage
+
+```typescript
+await stackClientApp.signInWithCredential({
+ email: "test@example.com",
+ password: "password123",
+});
+
+const user = await stackClientApp.getUser();
+
+await user.update({
+ displayName: "New Display Name",
+});
+
+await user.signOut();
+```
+
+## HTML Example
+
+Here is how to use Stack Auth with Vite, other frameworks work with the same principle. Below shows a simple sign in/sign up example. The full example is available [here](https://github.com/stack-auth/stack/tree/main/examples/js-example).
+
+```html title="index.html"
+
+
+
+
+
+ Stack Auth JS Example
+
+
+
+ Stack Auth JS Example
+
+
+
+
+
+
+
User Information
+
Email:
+
+
+
+
+
+
+```
+
+```typescript title="browser.ts"
+import { StackClientApp } from "@stackframe/js";
+
+const stackClientApp = new StackClientApp({
+ baseUrl: import.meta.env.VITE_STACK_API_URL,
+ projectId: import.meta.env.VITE_STACK_PROJECT_ID,
+ publishableClientKey: import.meta.env.VITE_STACK_PUBLISHABLE_CLIENT_KEY,
+ tokenStore: "cookie",
+});
+
+const updateUIState = (user: any | null) => {
+ const loginForm = document.getElementById("loginForm");
+ const signUpForm = document.getElementById("signUpForm");
+ const userInfo = document.getElementById("userInfo");
+ const userEmailSpan = document.getElementById("userEmail");
+
+ if (user) {
+ loginForm?.classList.add("hidden");
+ signUpForm?.classList.add("hidden");
+ userInfo?.classList.remove("hidden");
+ if (userEmailSpan) userEmailSpan.textContent = user.primaryEmail || "";
+ } else {
+ loginForm?.classList.remove("hidden");
+ signUpForm?.classList.add("hidden");
+ userInfo?.classList.add("hidden");
+ }
+};
+
+stackClientApp.getUser().then(updateUIState);
+
+document.getElementById("showSignUp")?.addEventListener("click", (e) => {
+ e.preventDefault();
+ document.getElementById("loginForm")?.classList.add("hidden");
+ document.getElementById("signUpForm")?.classList.remove("hidden");
+});
+
+document.getElementById("showSignIn")?.addEventListener("click", (e) => {
+ e.preventDefault();
+ document.getElementById("loginForm")?.classList.remove("hidden");
+ document.getElementById("signUpForm")?.classList.add("hidden");
+});
+
+document.getElementById("signIn")?.addEventListener("click", async () => {
+ const emailInput = document.getElementById("emailInput") as HTMLInputElement;
+ const passwordInput = document.getElementById("passwordInput") as HTMLInputElement;
+
+ const result = await stackClientApp.signInWithCredential({
+ email: emailInput.value,
+ password: passwordInput.value,
+ });
+
+ const user = await stackClientApp.getUser();
+ updateUIState(user);
+ passwordInput.value = "";
+
+ if (result.status === "error") {
+ alert("Sign in failed. Please check your email and password and try again.");
+ }
+});
+
+document.getElementById("signUp")?.addEventListener("click", async () => {
+ const emailInput = document.getElementById("signUpEmail") as HTMLInputElement;
+ const passwordInput = document.getElementById("signUpPassword") as HTMLInputElement;
+
+ const result = await stackClientApp.signUpWithCredential({
+ email: emailInput.value,
+ password: passwordInput.value,
+ });
+
+ if (result.status === "error") {
+ alert("Sign up failed. Please try again.");
+ return;
+ }
+
+ const signInResult = await stackClientApp.signInWithCredential({
+ email: emailInput.value,
+ password: passwordInput.value,
+ });
+
+ const user = await stackClientApp.getUser();
+ updateUIState(user);
+ passwordInput.value = "";
+
+ if (signInResult.status === "error") {
+ alert("Account created but sign in failed. Please sign in manually.");
+ }
+});
+
+document.getElementById("signOut")?.addEventListener("click", async () => {
+ const user = await stackClientApp.getUser();
+ if (user) {
+ await user.signOut();
+ updateUIState(null);
+ }
+});
+
+```
diff --git a/examples/js-example/.env.development b/examples/js-example/.env.development
index b3d3207d7..a70f686c0 100644
--- a/examples/js-example/.env.development
+++ b/examples/js-example/.env.development
@@ -4,3 +4,7 @@ NEXT_PUBLIC_STACK_API_URL=http://localhost:8102
NEXT_PUBLIC_STACK_PROJECT_ID=internal
NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=this-publishable-client-key-is-for-local-development-only
STACK_SECRET_SERVER_KEY=this-secret-server-key-is-for-local-development-only
+
+VITE_STACK_API_URL=http://localhost:8102
+VITE_STACK_PROJECT_ID=internal
+VITE_STACK_PUBLISHABLE_CLIENT_KEY=this-publishable-client-key-is-for-local-development-only
diff --git a/examples/js-example/browser.ts b/examples/js-example/browser.ts
new file mode 100644
index 000000000..95ba8de7f
--- /dev/null
+++ b/examples/js-example/browser.ts
@@ -0,0 +1,94 @@
+import { StackClientApp } from "@stackframe/js";
+
+const stackClientApp = new StackClientApp({
+ baseUrl: import.meta.env.VITE_STACK_API_URL,
+ projectId: import.meta.env.VITE_STACK_PROJECT_ID,
+ publishableClientKey: import.meta.env.VITE_STACK_PUBLISHABLE_CLIENT_KEY,
+ tokenStore: "cookie",
+});
+
+const updateUIState = (user: any | null) => {
+ const loginForm = document.getElementById("loginForm");
+ const signUpForm = document.getElementById("signUpForm");
+ const userInfo = document.getElementById("userInfo");
+ const userEmailSpan = document.getElementById("userEmail");
+
+ if (user) {
+ loginForm?.classList.add("hidden");
+ signUpForm?.classList.add("hidden");
+ userInfo?.classList.remove("hidden");
+ if (userEmailSpan) userEmailSpan.textContent = user.primaryEmail || "";
+ } else {
+ loginForm?.classList.remove("hidden");
+ signUpForm?.classList.add("hidden");
+ userInfo?.classList.add("hidden");
+ }
+};
+
+stackClientApp.getUser().then(updateUIState);
+
+document.getElementById("showSignUp")?.addEventListener("click", (e) => {
+ e.preventDefault();
+ document.getElementById("loginForm")?.classList.add("hidden");
+ document.getElementById("signUpForm")?.classList.remove("hidden");
+});
+
+document.getElementById("showSignIn")?.addEventListener("click", (e) => {
+ e.preventDefault();
+ document.getElementById("loginForm")?.classList.remove("hidden");
+ document.getElementById("signUpForm")?.classList.add("hidden");
+});
+
+document.getElementById("signIn")?.addEventListener("click", async () => {
+ const emailInput = document.getElementById("emailInput") as HTMLInputElement;
+ const passwordInput = document.getElementById("passwordInput") as HTMLInputElement;
+
+ const result = await stackClientApp.signInWithCredential({
+ email: emailInput.value,
+ password: passwordInput.value,
+ });
+
+ const user = await stackClientApp.getUser();
+ updateUIState(user);
+ passwordInput.value = "";
+
+ if (result.status === "error") {
+ alert("Sign in failed. Please check your email and password and try again.");
+ }
+});
+
+document.getElementById("signUp")?.addEventListener("click", async () => {
+ const emailInput = document.getElementById("signUpEmail") as HTMLInputElement;
+ const passwordInput = document.getElementById("signUpPassword") as HTMLInputElement;
+
+ const result = await stackClientApp.signUpWithCredential({
+ email: emailInput.value,
+ password: passwordInput.value,
+ });
+
+ if (result.status === "error") {
+ alert("Sign up failed. Please try again.");
+ return;
+ }
+
+ const signInResult = await stackClientApp.signInWithCredential({
+ email: emailInput.value,
+ password: passwordInput.value,
+ });
+
+ const user = await stackClientApp.getUser();
+ updateUIState(user);
+ passwordInput.value = "";
+
+ if (signInResult.status === "error") {
+ alert("Account created but sign in failed. Please sign in manually.");
+ }
+});
+
+document.getElementById("signOut")?.addEventListener("click", async () => {
+ const user = await stackClientApp.getUser();
+ if (user) {
+ await user.signOut();
+ updateUIState(null);
+ }
+});
diff --git a/examples/js-example/index.html b/examples/js-example/index.html
new file mode 100644
index 000000000..df62bbbfa
--- /dev/null
+++ b/examples/js-example/index.html
@@ -0,0 +1,44 @@
+
+
+
+
+
+ Stack Auth JS Example
+
+
+
+ Stack Auth JS Example
+
+
+
+
+
+
+
User Information
+
Email:
+
+
+
+
+
+
diff --git a/examples/js-example/index.ts b/examples/js-example/node.ts
similarity index 100%
rename from examples/js-example/index.ts
rename to examples/js-example/node.ts
diff --git a/examples/js-example/package.json b/examples/js-example/package.json
index 681854b17..5746fb5df 100644
--- a/examples/js-example/package.json
+++ b/examples/js-example/package.json
@@ -4,13 +4,16 @@
"description": "",
"main": "index.js",
"scripts": {
- "start": "dotenv -e .env.development -- tsx index.ts"
+ "start": "dotenv -e .env.development -e .env.local -- tsx node.ts",
+ "dev": "dotenv -e .env.development -e .env.local -- vite --port 8119"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@stackframe/js": "workspace:*",
- "dotenv-cli": "^7.4.1"
+ "dotenv-cli": "^7.4.1",
+ "typescript": "^5.7.3",
+ "vite": "^6.1.0"
}
}
diff --git a/examples/js-example/tsconfig.json b/examples/js-example/tsconfig.json
new file mode 100644
index 000000000..afa42a178
--- /dev/null
+++ b/examples/js-example/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "strict": true
+ }
+}
diff --git a/packages/js/package.json b/packages/js/package.json
index 86ed3c43f..a6a1c747c 100644
--- a/packages/js/package.json
+++ b/packages/js/package.json
@@ -33,7 +33,6 @@
"dependencies": {
"@hookform/resolvers": "^3.3.4",
"@simplewebauthn/browser": "^11.0.0",
- "@stackframe/stack-sc": "workspace:*",
"@stackframe/stack-shared": "workspace:*",
"color": "^4.2.3",
"cookie": "^0.6.0",
diff --git a/packages/stack-shared/src/utils/env.tsx b/packages/stack-shared/src/utils/env.tsx
index da04bd272..dd51557fb 100644
--- a/packages/stack-shared/src/utils/env.tsx
+++ b/packages/stack-shared/src/utils/env.tsx
@@ -65,91 +65,3 @@ export function getNextRuntime() {
export function getNodeEnvironment() {
return getEnvVariable("NODE_ENV", "");
}
-
-// ===================== Hack to use dynamic env vars in docker build =====================
-
-const _inlineEnvVars = {
- NEXT_PUBLIC_STACK_API_URL: {
- 'default': process.env.NEXT_PUBLIC_STACK_API_URL,
- 'client': process.env.NEXT_PUBLIC_CLIENT_STACK_API_URL,
- 'server': process.env.NEXT_PUBLIC_SERVER_STACK_API_URL,
- },
- NEXT_PUBLIC_STACK_DASHBOARD_URL: {
- 'default': process.env.NEXT_PUBLIC_STACK_DASHBOARD_URL,
- 'client': process.env.NEXT_PUBLIC_CLIENT_STACK_DASHBOARD_URL,
- 'server': process.env.NEXT_PUBLIC_SERVER_STACK_DASHBOARD_URL,
- },
- NEXT_PUBLIC_POSTHOG_KEY: process.env.NEXT_PUBLIC_POSTHOG_KEY,
- NEXT_PUBLIC_STACK_SVIX_SERVER_URL: process.env.NEXT_PUBLIC_STACK_SVIX_SERVER_URL,
- NEXT_PUBLIC_SENTRY_DSN: process.env.NEXT_PUBLIC_SENTRY_DSN,
- NEXT_PUBLIC_VERSION_ALERTER_SEVERE_ONLY: process.env.NEXT_PUBLIC_VERSION_ALERTER_SEVERE_ONLY,
- NEXT_PUBLIC_STACK_EMULATOR_ENABLED: process.env.NEXT_PUBLIC_STACK_EMULATOR_ENABLED,
- NEXT_PUBLIC_STACK_EMULATOR_PROJECT_ID: process.env.NEXT_PUBLIC_STACK_EMULATOR_PROJECT_ID,
- NEXT_PUBLIC_STACK_PROJECT_ID: process.env.NEXT_PUBLIC_STACK_PROJECT_ID,
- NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY: process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY,
- NEXT_PUBLIC_STACK_URL: process.env.NEXT_PUBLIC_STACK_URL,
- NEXT_PUBLIC_STACK_INBUCKET_WEB_URL: process.env.NEXT_PUBLIC_STACK_INBUCKET_WEB_URL,
-} as const;
-
-// This will be replaced with the actual env vars after a docker build
-const _postBuildEnvVars = {
- NEXT_PUBLIC_STACK_API_URL: {
- 'default': 'STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_API_URL',
- 'client': 'STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_CLIENT_STACK_API_URL',
- 'server': 'STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_SERVER_STACK_API_URL',
- },
- NEXT_PUBLIC_STACK_DASHBOARD_URL: {
- 'default': 'STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_DASHBOARD_URL',
- 'client': 'STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_CLIENT_STACK_DASHBOARD_URL',
- 'server': 'STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_SERVER_STACK_DASHBOARD_URL',
- },
- NEXT_PUBLIC_STACK_PROJECT_ID: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_PROJECT_ID",
- NEXT_PUBLIC_POSTHOG_KEY: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_POSTHOG_KEY",
- NEXT_PUBLIC_STACK_SVIX_SERVER_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_SVIX_SERVER_URL",
- NEXT_PUBLIC_SENTRY_DSN: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_SENTRY_DSN",
- NEXT_PUBLIC_VERSION_ALERTER_SEVERE_ONLY: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_VERSION_ALERTER_SEVERE_ONLY",
- NEXT_PUBLIC_STACK_EMULATOR_ENABLED: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_EMULATOR_ENABLED",
- NEXT_PUBLIC_STACK_EMULATOR_PROJECT_ID: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_EMULATOR_PROJECT_ID",
- NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY",
- NEXT_PUBLIC_STACK_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_URL",
- NEXT_PUBLIC_STACK_INBUCKET_WEB_URL: "STACK_ENV_VAR_SENTINEL_NEXT_PUBLIC_STACK_INBUCKET_WEB_URL",
-} satisfies typeof _inlineEnvVars;
-
-// If this is not replaced with "true", then we will not use inline env vars
-const _usePostBuildEnvVars = 'STACK_ENV_VAR_SENTINEL_USE_INLINE_ENV_VARS';
-
-export function getPublicEnvVar(name: keyof typeof _inlineEnvVars) {
- // This is a hack to force the compiler not to do any smart optimizations
- const _ = _usePostBuildEnvVars.toString() + _inlineEnvVars.toString(); // Force runtime evaluation
-
- const value = _usePostBuildEnvVars.slice(0) === 'true' ? _postBuildEnvVars[name] : _inlineEnvVars[name];
-
- // Helper function to check if a value is a sentinel
- const isSentinel = (str?: string) => {
- return _usePostBuildEnvVars.slice(0) === 'true' && str && str.startsWith('STACK_ENV_VAR_SENTINEL');
- };
-
- // If it's a dictionary with client/server values
- if (typeof value === 'object') {
- const preferredValue = isBrowserLike() ? value.client : value.server;
-
- // Check for sentinel values
- if (isSentinel(preferredValue)) {
- return isSentinel(value.default) ? undefined : value.default;
- }
- if (isSentinel(value.default)) {
- return undefined;
- }
-
- return preferredValue || value.default;
- } else if (typeof value === 'string') {
- if (isSentinel(value)) {
- return undefined;
- }
- return value;
- } else {
- return undefined;
- }
-}
-
-// ======================================================================
diff --git a/packages/template/.eslintrc.cjs b/packages/template/.eslintrc.cjs
index 0749648c0..87f988a41 100644
--- a/packages/template/.eslintrc.cjs
+++ b/packages/template/.eslintrc.cjs
@@ -1,5 +1,4 @@
const defaults = require("../../eslint-configs/defaults.js");
-const publicVars = require("../../eslint-configs/extra-rules.js");
module.exports = {
"extends": [
@@ -9,7 +8,6 @@ module.exports = {
"rules": {
"no-restricted-syntax": [
...defaults.rules["no-restricted-syntax"],
- publicVars['no-next-public-env']
],
},
};
diff --git a/packages/template/package-template.json b/packages/template/package-template.json
index 290e944c9..1fbac2515 100644
--- a/packages/template/package-template.json
+++ b/packages/template/package-template.json
@@ -67,6 +67,7 @@
"dependencies": {
"@hookform/resolvers": "^3.3.4",
"@simplewebauthn/browser": "^11.0.0",
+ "//": "NEXT_LINE_PLATFORM react-like",
"@stackframe/stack-sc": "workspace:*",
"@stackframe/stack-shared": "workspace:*",
"//": "NEXT_LINE_PLATFORM react-like",
diff --git a/packages/template/src/lib/cookie.ts b/packages/template/src/lib/cookie.ts
index 978224ff9..fed3c5c6c 100644
--- a/packages/template/src/lib/cookie.ts
+++ b/packages/template/src/lib/cookie.ts
@@ -1,3 +1,4 @@
+// NEXT_LINE_PLATFORM react-like
import { cookies as rscCookies, headers as rscHeaders } from '@stackframe/stack-sc/force-react-server';
import { isBrowserLike } from '@stackframe/stack-shared/dist/utils/env';
import { StackAssertionError } from '@stackframe/stack-shared/dist/utils/errors';
@@ -39,10 +40,14 @@ export async function createCookieHelper(): Promise {
if (isBrowserLike()) {
return createBrowserCookieHelper();
} else {
+ // IF_PLATFORM react-like
return createNextCookieHelper(
await rscCookies(),
await rscHeaders(),
);
+ // ELSE_PLATFORM
+ return await createEmptyCookieHelper();
+ // END_PLATFORM
}
}
@@ -67,6 +72,7 @@ function handleCookieError(e: unknown, options: DeleteCookieOptions | SetCookieO
}
}
+// IF_PLATFORM react-like
function createNextCookieHelper(
rscCookiesAwaited: Awaited>,
rscHeadersAwaited: Awaited>,
@@ -136,6 +142,7 @@ function createNextCookieHelper(
};
return cookieHelper;
}
+// END_PLATFORM
export function getCookieClient(name: string): string | null {
ensureClient();
diff --git a/packages/template/src/lib/stack-app.ts b/packages/template/src/lib/stack-app.ts
index d201ee246..eb6e81275 100644
--- a/packages/template/src/lib/stack-app.ts
+++ b/packages/template/src/lib/stack-app.ts
@@ -1,5 +1,4 @@
import { WebAuthnError, startAuthentication, startRegistration } from "@simplewebauthn/browser";
-import { isReactServer } from "@stackframe/stack-sc";
import { KnownErrors, StackAdminInterface, StackClientInterface, StackServerInterface } from "@stackframe/stack-shared";
import { ProductionModeError, getProductionModeErrors } from "@stackframe/stack-shared/dist/helpers/production-mode";
import { ApiKeyCreateCrudRequest, ApiKeyCreateCrudResponse } from "@stackframe/stack-shared/dist/interface/adminInterface";
@@ -17,7 +16,7 @@ import { InternalSession } from "@stackframe/stack-shared/dist/sessions";
import { encodeBase64 } from "@stackframe/stack-shared/dist/utils/bytes";
import { AsyncCache } from "@stackframe/stack-shared/dist/utils/caches";
import { scrambleDuringCompileTime } from "@stackframe/stack-shared/dist/utils/compile-time";
-import { getPublicEnvVar, isBrowserLike } from "@stackframe/stack-shared/dist/utils/env";
+import { isBrowserLike } from "@stackframe/stack-shared/dist/utils/env";
import { StackAssertionError, concatStacktraces, throwErr } from "@stackframe/stack-shared/dist/utils/errors";
import { ReadonlyJson } from "@stackframe/stack-shared/dist/utils/json";
import { DependenciesMap } from "@stackframe/stack-shared/dist/utils/maps";
@@ -37,11 +36,22 @@ import React, { useCallback, useMemo } from "react";
import { constructRedirectUrl } from "../utils/url";
import { addNewOAuthProviderOrScope, callOAuthCallback, signInWithOAuth } from "./auth";
import { CookieHelper, createBrowserCookieHelper, createCookieHelper, createEmptyCookieHelper, deleteCookieClient, getCookieClient, setOrDeleteCookie, setOrDeleteCookieClient } from "./cookie";
+
+let isReactServer = false;
+// IF_PLATFORM react-like
+import * as sc from "@stackframe/stack-sc";
+isReactServer = sc.isReactServer;
+// END_PLATFORM
+
// NextNavigation.useRouter does not exist in react-server environments and some bundlers try to be helpful and throw a warning. Ignore the warning.
const NextNavigation = scrambleDuringCompileTime(NextNavigationUnscrambled);
const clientVersion = process.env.STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION ?? throwErr("Missing STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION. This should be a compile-time variable set by Stack's build system.");
+// hack to make sure process is defined in non-node environments
+// NEXT_LINE_PLATFORM js
+process = (globalThis as any).process ?? { env: {} };
+
type RequestLike = {
headers: {
get: (name: string) => string | null,
@@ -114,11 +124,11 @@ function getUrls(partial: Partial): HandlerUrls {
}
function getDefaultProjectId() {
- return getPublicEnvVar("NEXT_PUBLIC_STACK_PROJECT_ID") || throwErr(new Error("Welcome to Stack Auth! It seems that you haven't provided a project ID. Please create a project on the Stack dashboard at https://app.stack-auth.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable."));
+ return process.env.NEXT_PUBLIC_STACK_PROJECT_ID || throwErr(new Error("Welcome to Stack Auth! It seems that you haven't provided a project ID. Please create a project on the Stack dashboard at https://app.stack-auth.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable."));
}
function getDefaultPublishableClientKey() {
- return getPublicEnvVar("NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY") || throwErr(new Error("Welcome to Stack Auth! It seems that you haven't provided a publishable client key. Please create an API key for your project on the Stack dashboard at https://app.stack-auth.com and copy your publishable client key into the NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY environment variable."));
+ return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || throwErr(new Error("Welcome to Stack Auth! It seems that you haven't provided a publishable client key. Please create an API key for your project on the Stack dashboard at https://app.stack-auth.com and copy your publishable client key into the NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY environment variable."));
}
function getDefaultSecretServerKey() {
@@ -129,13 +139,50 @@ function getDefaultSuperSecretAdminKey() {
return process.env.STACK_SUPER_SECRET_ADMIN_KEY || throwErr(new Error("No super secret admin key provided. Please copy your key from the Stack dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable."));
}
-function getDefaultBaseUrl() {
- const url = getPublicEnvVar("NEXT_PUBLIC_STACK_API_URL") || getPublicEnvVar("NEXT_PUBLIC_STACK_URL") || defaultBaseUrl;
+/**
+ * Returns the base URL for the Stack API.
+ *
+ * The URL can be specified in several ways, in order of precedence:
+ * 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object
+ * 2. Through environment variables:
+ * - Browser: NEXT_PUBLIC_BROWSER_STACK_API_URL
+ * - Server: NEXT_PUBLIC_SERVER_STACK_API_URL
+ * - Fallback: NEXT_PUBLIC_STACK_API_URL or NEXT_PUBLIC_STACK_URL
+ * 3. Default base URL if none of the above are specified
+ *
+ * The function also ensures the URL doesn't end with a trailing slash
+ * by removing it if present.
+ *
+ * @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object
+ * @returns The configured base URL without trailing slash
+
+ */
+function getBaseUrl(userSpecifiedBaseUrl: string | { browser: string, server: string } | undefined) {
+ let url;
+ if (userSpecifiedBaseUrl) {
+ if (typeof userSpecifiedBaseUrl === "string") {
+ url = userSpecifiedBaseUrl;
+ } else {
+ if (isBrowserLike()) {
+ url = userSpecifiedBaseUrl.browser;
+ } else {
+ url = userSpecifiedBaseUrl.server;
+ }
+ }
+ } else {
+ if (isBrowserLike()) {
+ url = process.env.NEXT_PUBLIC_BROWSER_STACK_API_URL;
+ } else {
+ url = process.env.NEXT_PUBLIC_SERVER_STACK_API_URL;
+ }
+ url = url || process.env.NEXT_PUBLIC_STACK_API_URL || process.env.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;
+ }
+
return url.endsWith('/') ? url.slice(0, -1) : url;
}
export type StackClientAppConstructorOptions = {
- baseUrl?: string,
+ baseUrl?: string | { browser: string, server: string },
projectId?: ProjectId,
publishableClientKey?: string,
urls?: Partial,
@@ -446,7 +493,7 @@ class _StackClientAppImpl _options.baseUrl ?? getDefaultBaseUrl(),
+ getBaseUrl: () => getBaseUrl(_options.baseUrl),
projectId: _options.projectId ?? getDefaultProjectId(),
clientVersion,
publishableClientKey: _options.publishableClientKey ?? getDefaultPublishableClientKey(),
@@ -1888,12 +1935,15 @@ class _StackServerAppImpl options.baseUrl ?? getDefaultBaseUrl(),
+ getBaseUrl: () => getBaseUrl(options.baseUrl),
projectId: options.projectId ?? getDefaultProjectId(),
clientVersion,
publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),
secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey(),
}),
+ baseUrl: options.baseUrl,
+ projectId: options.projectId,
+ publishableClientKey: options.publishableClientKey,
tokenStore: options.tokenStore,
urls: options.urls ?? {},
oauthScopesOnSignIn: options.oauthScopesOnSignIn ?? {},
@@ -2377,7 +2427,7 @@ class _StackAdminAppImpl) {
super({
interface: new StackAdminInterface({
- getBaseUrl: () => options.baseUrl ?? getDefaultBaseUrl(),
+ getBaseUrl: () => getBaseUrl(options.baseUrl),
projectId: options.projectId ?? getDefaultProjectId(),
clientVersion,
..."projectOwnerSession" in options ? {
@@ -2388,6 +2438,8 @@ class _StackAdminAppImpl=18'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/android-arm64@0.19.11':
resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==}
engines: {node: '>=12'}
@@ -1862,6 +1871,12 @@ packages:
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm64@0.24.2':
+ resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm@0.19.11':
resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==}
engines: {node: '>=12'}
@@ -1892,6 +1907,12 @@ packages:
cpu: [arm]
os: [android]
+ '@esbuild/android-arm@0.24.2':
+ resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-x64@0.19.11':
resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==}
engines: {node: '>=12'}
@@ -1922,6 +1943,12 @@ packages:
cpu: [x64]
os: [android]
+ '@esbuild/android-x64@0.24.2':
+ resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/darwin-arm64@0.19.11':
resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==}
engines: {node: '>=12'}
@@ -1952,6 +1979,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-arm64@0.24.2':
+ resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.19.11':
resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==}
engines: {node: '>=12'}
@@ -1982,6 +2015,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@esbuild/darwin-x64@0.24.2':
+ resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/freebsd-arm64@0.19.11':
resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==}
engines: {node: '>=12'}
@@ -2012,6 +2051,12 @@ packages:
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-arm64@0.24.2':
+ resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.19.11':
resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==}
engines: {node: '>=12'}
@@ -2042,6 +2087,12 @@ packages:
cpu: [x64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.24.2':
+ resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/linux-arm64@0.19.11':
resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==}
engines: {node: '>=12'}
@@ -2072,6 +2123,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm64@0.24.2':
+ resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm@0.19.11':
resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==}
engines: {node: '>=12'}
@@ -2102,6 +2159,12 @@ packages:
cpu: [arm]
os: [linux]
+ '@esbuild/linux-arm@0.24.2':
+ resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-ia32@0.19.11':
resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==}
engines: {node: '>=12'}
@@ -2132,6 +2195,12 @@ packages:
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-ia32@0.24.2':
+ resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-loong64@0.19.11':
resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==}
engines: {node: '>=12'}
@@ -2162,6 +2231,12 @@ packages:
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-loong64@0.24.2':
+ resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.19.11':
resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==}
engines: {node: '>=12'}
@@ -2192,6 +2267,12 @@ packages:
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-mips64el@0.24.2':
+ resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.19.11':
resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==}
engines: {node: '>=12'}
@@ -2222,6 +2303,12 @@ packages:
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-ppc64@0.24.2':
+ resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.19.11':
resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==}
engines: {node: '>=12'}
@@ -2252,6 +2339,12 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-riscv64@0.24.2':
+ resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-s390x@0.19.11':
resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==}
engines: {node: '>=12'}
@@ -2282,6 +2375,12 @@ packages:
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-s390x@0.24.2':
+ resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-x64@0.19.11':
resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==}
engines: {node: '>=12'}
@@ -2312,6 +2411,18 @@ packages:
cpu: [x64]
os: [linux]
+ '@esbuild/linux-x64@0.24.2':
+ resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.24.2':
+ resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.19.11':
resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==}
engines: {node: '>=12'}
@@ -2342,6 +2453,12 @@ packages:
cpu: [x64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.24.2':
+ resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
'@esbuild/openbsd-arm64@0.23.1':
resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==}
engines: {node: '>=18'}
@@ -2354,6 +2471,12 @@ packages:
cpu: [arm64]
os: [openbsd]
+ '@esbuild/openbsd-arm64@0.24.2':
+ resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.19.11':
resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==}
engines: {node: '>=12'}
@@ -2384,6 +2507,12 @@ packages:
cpu: [x64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.24.2':
+ resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
'@esbuild/sunos-x64@0.19.11':
resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==}
engines: {node: '>=12'}
@@ -2414,6 +2543,12 @@ packages:
cpu: [x64]
os: [sunos]
+ '@esbuild/sunos-x64@0.24.2':
+ resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/win32-arm64@0.19.11':
resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==}
engines: {node: '>=12'}
@@ -2444,6 +2579,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-arm64@0.24.2':
+ resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-ia32@0.19.11':
resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==}
engines: {node: '>=12'}
@@ -2474,6 +2615,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-ia32@0.24.2':
+ resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-x64@0.19.11':
resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==}
engines: {node: '>=12'}
@@ -2504,6 +2651,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@esbuild/win32-x64@0.24.2':
+ resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
'@eslint-community/eslint-utils@4.4.1':
resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -4934,6 +5087,11 @@ packages:
cpu: [arm]
os: [android]
+ '@rollup/rollup-android-arm-eabi@4.34.8':
+ resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==}
+ cpu: [arm]
+ os: [android]
+
'@rollup/rollup-android-arm64@4.18.0':
resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==}
cpu: [arm64]
@@ -4944,6 +5102,11 @@ packages:
cpu: [arm64]
os: [android]
+ '@rollup/rollup-android-arm64@4.34.8':
+ resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==}
+ cpu: [arm64]
+ os: [android]
+
'@rollup/rollup-darwin-arm64@4.18.0':
resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==}
cpu: [arm64]
@@ -4954,6 +5117,11 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@rollup/rollup-darwin-arm64@4.34.8':
+ resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==}
+ cpu: [arm64]
+ os: [darwin]
+
'@rollup/rollup-darwin-x64@4.18.0':
resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==}
cpu: [x64]
@@ -4964,16 +5132,31 @@ packages:
cpu: [x64]
os: [darwin]
+ '@rollup/rollup-darwin-x64@4.34.8':
+ resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==}
+ cpu: [x64]
+ os: [darwin]
+
'@rollup/rollup-freebsd-arm64@4.24.4':
resolution: {integrity: sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==}
cpu: [arm64]
os: [freebsd]
+ '@rollup/rollup-freebsd-arm64@4.34.8':
+ resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==}
+ cpu: [arm64]
+ os: [freebsd]
+
'@rollup/rollup-freebsd-x64@4.24.4':
resolution: {integrity: sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==}
cpu: [x64]
os: [freebsd]
+ '@rollup/rollup-freebsd-x64@4.34.8':
+ resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==}
+ cpu: [x64]
+ os: [freebsd]
+
'@rollup/rollup-linux-arm-gnueabihf@4.18.0':
resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==}
cpu: [arm]
@@ -4984,6 +5167,11 @@ packages:
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm-gnueabihf@4.34.8':
+ resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm-musleabihf@4.18.0':
resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==}
cpu: [arm]
@@ -4994,6 +5182,11 @@ packages:
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm-musleabihf@4.34.8':
+ resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-gnu@4.18.0':
resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==}
cpu: [arm64]
@@ -5004,6 +5197,11 @@ packages:
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-gnu@4.34.8':
+ resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==}
+ cpu: [arm64]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-musl@4.18.0':
resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==}
cpu: [arm64]
@@ -5014,6 +5212,16 @@ packages:
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-musl@4.34.8':
+ resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.34.8':
+ resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==}
+ cpu: [loong64]
+ os: [linux]
+
'@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==}
cpu: [ppc64]
@@ -5024,6 +5232,11 @@ packages:
cpu: [ppc64]
os: [linux]
+ '@rollup/rollup-linux-powerpc64le-gnu@4.34.8':
+ resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==}
+ cpu: [ppc64]
+ os: [linux]
+
'@rollup/rollup-linux-riscv64-gnu@4.18.0':
resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==}
cpu: [riscv64]
@@ -5034,6 +5247,11 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@rollup/rollup-linux-riscv64-gnu@4.34.8':
+ resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==}
+ cpu: [riscv64]
+ os: [linux]
+
'@rollup/rollup-linux-s390x-gnu@4.18.0':
resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==}
cpu: [s390x]
@@ -5044,6 +5262,11 @@ packages:
cpu: [s390x]
os: [linux]
+ '@rollup/rollup-linux-s390x-gnu@4.34.8':
+ resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==}
+ cpu: [s390x]
+ os: [linux]
+
'@rollup/rollup-linux-x64-gnu@4.18.0':
resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==}
cpu: [x64]
@@ -5054,6 +5277,11 @@ packages:
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-gnu@4.34.8':
+ resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-linux-x64-musl@4.18.0':
resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==}
cpu: [x64]
@@ -5064,6 +5292,11 @@ packages:
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-musl@4.34.8':
+ resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-win32-arm64-msvc@4.18.0':
resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==}
cpu: [arm64]
@@ -5074,6 +5307,11 @@ packages:
cpu: [arm64]
os: [win32]
+ '@rollup/rollup-win32-arm64-msvc@4.34.8':
+ resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==}
+ cpu: [arm64]
+ os: [win32]
+
'@rollup/rollup-win32-ia32-msvc@4.18.0':
resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==}
cpu: [ia32]
@@ -5084,6 +5322,11 @@ packages:
cpu: [ia32]
os: [win32]
+ '@rollup/rollup-win32-ia32-msvc@4.34.8':
+ resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==}
+ cpu: [ia32]
+ os: [win32]
+
'@rollup/rollup-win32-x64-msvc@4.18.0':
resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==}
cpu: [x64]
@@ -5094,6 +5337,11 @@ packages:
cpu: [x64]
os: [win32]
+ '@rollup/rollup-win32-x64-msvc@4.34.8':
+ resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==}
+ cpu: [x64]
+ os: [win32]
+
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
@@ -7172,6 +7420,11 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ esbuild@0.24.2:
+ resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
escalade@3.1.2:
resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
engines: {node: '>=6'}
@@ -8957,6 +9210,11 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nanoid@3.3.8:
+ resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
nanoid@5.0.7:
resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==}
engines: {node: ^18 || >=20}
@@ -9559,6 +9817,10 @@ packages:
resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14}
+ postcss@8.5.2:
+ resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==}
+ engines: {node: ^10 || ^12 || >=14}
+
postgres-array@2.0.0:
resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
engines: {node: '>=4'}
@@ -10087,6 +10349,11 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ rollup@4.34.8:
+ resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
rrweb-cssom@0.7.1:
resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
@@ -10833,6 +11100,11 @@ packages:
engines: {node: '>=18.0.0'}
hasBin: true
+ tsx@4.19.2:
+ resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
tunnel-agent@0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
@@ -10936,6 +11208,11 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
+ typescript@5.7.3:
+ resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
ufo@1.5.4:
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
@@ -11163,6 +11440,46 @@ packages:
terser:
optional: true
+ vite@6.1.0:
+ resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: '>=1.21.0'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
vitest@1.6.0:
resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -12129,6 +12446,9 @@ snapshots:
'@esbuild/aix-ppc64@0.24.0':
optional: true
+ '@esbuild/aix-ppc64@0.24.2':
+ optional: true
+
'@esbuild/android-arm64@0.19.11':
optional: true
@@ -12144,6 +12464,9 @@ snapshots:
'@esbuild/android-arm64@0.24.0':
optional: true
+ '@esbuild/android-arm64@0.24.2':
+ optional: true
+
'@esbuild/android-arm@0.19.11':
optional: true
@@ -12159,6 +12482,9 @@ snapshots:
'@esbuild/android-arm@0.24.0':
optional: true
+ '@esbuild/android-arm@0.24.2':
+ optional: true
+
'@esbuild/android-x64@0.19.11':
optional: true
@@ -12174,6 +12500,9 @@ snapshots:
'@esbuild/android-x64@0.24.0':
optional: true
+ '@esbuild/android-x64@0.24.2':
+ optional: true
+
'@esbuild/darwin-arm64@0.19.11':
optional: true
@@ -12189,6 +12518,9 @@ snapshots:
'@esbuild/darwin-arm64@0.24.0':
optional: true
+ '@esbuild/darwin-arm64@0.24.2':
+ optional: true
+
'@esbuild/darwin-x64@0.19.11':
optional: true
@@ -12204,6 +12536,9 @@ snapshots:
'@esbuild/darwin-x64@0.24.0':
optional: true
+ '@esbuild/darwin-x64@0.24.2':
+ optional: true
+
'@esbuild/freebsd-arm64@0.19.11':
optional: true
@@ -12219,6 +12554,9 @@ snapshots:
'@esbuild/freebsd-arm64@0.24.0':
optional: true
+ '@esbuild/freebsd-arm64@0.24.2':
+ optional: true
+
'@esbuild/freebsd-x64@0.19.11':
optional: true
@@ -12234,6 +12572,9 @@ snapshots:
'@esbuild/freebsd-x64@0.24.0':
optional: true
+ '@esbuild/freebsd-x64@0.24.2':
+ optional: true
+
'@esbuild/linux-arm64@0.19.11':
optional: true
@@ -12249,6 +12590,9 @@ snapshots:
'@esbuild/linux-arm64@0.24.0':
optional: true
+ '@esbuild/linux-arm64@0.24.2':
+ optional: true
+
'@esbuild/linux-arm@0.19.11':
optional: true
@@ -12264,6 +12608,9 @@ snapshots:
'@esbuild/linux-arm@0.24.0':
optional: true
+ '@esbuild/linux-arm@0.24.2':
+ optional: true
+
'@esbuild/linux-ia32@0.19.11':
optional: true
@@ -12279,6 +12626,9 @@ snapshots:
'@esbuild/linux-ia32@0.24.0':
optional: true
+ '@esbuild/linux-ia32@0.24.2':
+ optional: true
+
'@esbuild/linux-loong64@0.19.11':
optional: true
@@ -12294,6 +12644,9 @@ snapshots:
'@esbuild/linux-loong64@0.24.0':
optional: true
+ '@esbuild/linux-loong64@0.24.2':
+ optional: true
+
'@esbuild/linux-mips64el@0.19.11':
optional: true
@@ -12309,6 +12662,9 @@ snapshots:
'@esbuild/linux-mips64el@0.24.0':
optional: true
+ '@esbuild/linux-mips64el@0.24.2':
+ optional: true
+
'@esbuild/linux-ppc64@0.19.11':
optional: true
@@ -12324,6 +12680,9 @@ snapshots:
'@esbuild/linux-ppc64@0.24.0':
optional: true
+ '@esbuild/linux-ppc64@0.24.2':
+ optional: true
+
'@esbuild/linux-riscv64@0.19.11':
optional: true
@@ -12339,6 +12698,9 @@ snapshots:
'@esbuild/linux-riscv64@0.24.0':
optional: true
+ '@esbuild/linux-riscv64@0.24.2':
+ optional: true
+
'@esbuild/linux-s390x@0.19.11':
optional: true
@@ -12354,6 +12716,9 @@ snapshots:
'@esbuild/linux-s390x@0.24.0':
optional: true
+ '@esbuild/linux-s390x@0.24.2':
+ optional: true
+
'@esbuild/linux-x64@0.19.11':
optional: true
@@ -12369,6 +12734,12 @@ snapshots:
'@esbuild/linux-x64@0.24.0':
optional: true
+ '@esbuild/linux-x64@0.24.2':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.24.2':
+ optional: true
+
'@esbuild/netbsd-x64@0.19.11':
optional: true
@@ -12384,12 +12755,18 @@ snapshots:
'@esbuild/netbsd-x64@0.24.0':
optional: true
+ '@esbuild/netbsd-x64@0.24.2':
+ optional: true
+
'@esbuild/openbsd-arm64@0.23.1':
optional: true
'@esbuild/openbsd-arm64@0.24.0':
optional: true
+ '@esbuild/openbsd-arm64@0.24.2':
+ optional: true
+
'@esbuild/openbsd-x64@0.19.11':
optional: true
@@ -12405,6 +12782,9 @@ snapshots:
'@esbuild/openbsd-x64@0.24.0':
optional: true
+ '@esbuild/openbsd-x64@0.24.2':
+ optional: true
+
'@esbuild/sunos-x64@0.19.11':
optional: true
@@ -12420,6 +12800,9 @@ snapshots:
'@esbuild/sunos-x64@0.24.0':
optional: true
+ '@esbuild/sunos-x64@0.24.2':
+ optional: true
+
'@esbuild/win32-arm64@0.19.11':
optional: true
@@ -12435,6 +12818,9 @@ snapshots:
'@esbuild/win32-arm64@0.24.0':
optional: true
+ '@esbuild/win32-arm64@0.24.2':
+ optional: true
+
'@esbuild/win32-ia32@0.19.11':
optional: true
@@ -12450,6 +12836,9 @@ snapshots:
'@esbuild/win32-ia32@0.24.0':
optional: true
+ '@esbuild/win32-ia32@0.24.2':
+ optional: true
+
'@esbuild/win32-x64@0.19.11':
optional: true
@@ -12465,6 +12854,9 @@ snapshots:
'@esbuild/win32-x64@0.24.0':
optional: true
+ '@esbuild/win32-x64@0.24.2':
+ optional: true
+
'@eslint-community/eslint-utils@4.4.1(eslint@8.30.0)':
dependencies:
eslint: 8.30.0
@@ -14987,102 +15379,159 @@ snapshots:
'@rollup/rollup-android-arm-eabi@4.24.4':
optional: true
+ '@rollup/rollup-android-arm-eabi@4.34.8':
+ optional: true
+
'@rollup/rollup-android-arm64@4.18.0':
optional: true
'@rollup/rollup-android-arm64@4.24.4':
optional: true
+ '@rollup/rollup-android-arm64@4.34.8':
+ optional: true
+
'@rollup/rollup-darwin-arm64@4.18.0':
optional: true
'@rollup/rollup-darwin-arm64@4.24.4':
optional: true
+ '@rollup/rollup-darwin-arm64@4.34.8':
+ optional: true
+
'@rollup/rollup-darwin-x64@4.18.0':
optional: true
'@rollup/rollup-darwin-x64@4.24.4':
optional: true
+ '@rollup/rollup-darwin-x64@4.34.8':
+ optional: true
+
'@rollup/rollup-freebsd-arm64@4.24.4':
optional: true
+ '@rollup/rollup-freebsd-arm64@4.34.8':
+ optional: true
+
'@rollup/rollup-freebsd-x64@4.24.4':
optional: true
+ '@rollup/rollup-freebsd-x64@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-arm-gnueabihf@4.18.0':
optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.24.4':
optional: true
+ '@rollup/rollup-linux-arm-gnueabihf@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-arm-musleabihf@4.18.0':
optional: true
'@rollup/rollup-linux-arm-musleabihf@4.24.4':
optional: true
+ '@rollup/rollup-linux-arm-musleabihf@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-arm64-gnu@4.18.0':
optional: true
'@rollup/rollup-linux-arm64-gnu@4.24.4':
optional: true
+ '@rollup/rollup-linux-arm64-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-arm64-musl@4.18.0':
optional: true
'@rollup/rollup-linux-arm64-musl@4.24.4':
optional: true
+ '@rollup/rollup-linux-arm64-musl@4.34.8':
+ optional: true
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
optional: true
'@rollup/rollup-linux-powerpc64le-gnu@4.24.4':
optional: true
+ '@rollup/rollup-linux-powerpc64le-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-riscv64-gnu@4.18.0':
optional: true
'@rollup/rollup-linux-riscv64-gnu@4.24.4':
optional: true
+ '@rollup/rollup-linux-riscv64-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-s390x-gnu@4.18.0':
optional: true
'@rollup/rollup-linux-s390x-gnu@4.24.4':
optional: true
+ '@rollup/rollup-linux-s390x-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-x64-gnu@4.18.0':
optional: true
'@rollup/rollup-linux-x64-gnu@4.24.4':
optional: true
+ '@rollup/rollup-linux-x64-gnu@4.34.8':
+ optional: true
+
'@rollup/rollup-linux-x64-musl@4.18.0':
optional: true
'@rollup/rollup-linux-x64-musl@4.24.4':
optional: true
+ '@rollup/rollup-linux-x64-musl@4.34.8':
+ optional: true
+
'@rollup/rollup-win32-arm64-msvc@4.18.0':
optional: true
'@rollup/rollup-win32-arm64-msvc@4.24.4':
optional: true
+ '@rollup/rollup-win32-arm64-msvc@4.34.8':
+ optional: true
+
'@rollup/rollup-win32-ia32-msvc@4.18.0':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.24.4':
optional: true
+ '@rollup/rollup-win32-ia32-msvc@4.34.8':
+ optional: true
+
'@rollup/rollup-win32-x64-msvc@4.18.0':
optional: true
'@rollup/rollup-win32-x64-msvc@4.24.4':
optional: true
+ '@rollup/rollup-win32-x64-msvc@4.34.8':
+ optional: true
+
'@rtsao/scc@1.1.0': {}
'@rushstack/eslint-patch@1.10.3': {}
@@ -16026,14 +16475,14 @@ snapshots:
next: 14.2.15(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
- '@vitejs/plugin-react@4.3.3(vite@5.4.10(@types/node@20.17.6)(terser@5.31.1))':
+ '@vitejs/plugin-react@4.3.3(vite@6.1.0(@types/node@20.17.6)(jiti@1.21.6)(terser@5.31.1)(tsx@4.19.2)(yaml@2.6.0))':
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
- vite: 5.4.10(@types/node@20.17.6)(terser@5.31.1)
+ vite: 6.1.0(@types/node@20.17.6)(jiti@1.21.6)(terser@5.31.1)(tsx@4.19.2)(yaml@2.6.0)
transitivePeerDependencies:
- supports-color
@@ -17680,6 +18129,34 @@ snapshots:
'@esbuild/win32-ia32': 0.24.0
'@esbuild/win32-x64': 0.24.0
+ esbuild@0.24.2:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.24.2
+ '@esbuild/android-arm': 0.24.2
+ '@esbuild/android-arm64': 0.24.2
+ '@esbuild/android-x64': 0.24.2
+ '@esbuild/darwin-arm64': 0.24.2
+ '@esbuild/darwin-x64': 0.24.2
+ '@esbuild/freebsd-arm64': 0.24.2
+ '@esbuild/freebsd-x64': 0.24.2
+ '@esbuild/linux-arm': 0.24.2
+ '@esbuild/linux-arm64': 0.24.2
+ '@esbuild/linux-ia32': 0.24.2
+ '@esbuild/linux-loong64': 0.24.2
+ '@esbuild/linux-mips64el': 0.24.2
+ '@esbuild/linux-ppc64': 0.24.2
+ '@esbuild/linux-riscv64': 0.24.2
+ '@esbuild/linux-s390x': 0.24.2
+ '@esbuild/linux-x64': 0.24.2
+ '@esbuild/netbsd-arm64': 0.24.2
+ '@esbuild/netbsd-x64': 0.24.2
+ '@esbuild/openbsd-arm64': 0.24.2
+ '@esbuild/openbsd-x64': 0.24.2
+ '@esbuild/sunos-x64': 0.24.2
+ '@esbuild/win32-arm64': 0.24.2
+ '@esbuild/win32-ia32': 0.24.2
+ '@esbuild/win32-x64': 0.24.2
+
escalade@3.1.2: {}
escalade@3.2.0: {}
@@ -20062,6 +20539,8 @@ snapshots:
nanoid@3.3.7: {}
+ nanoid@3.3.8: {}
+
nanoid@5.0.7: {}
napi-build-utils@1.0.2: {}
@@ -20786,15 +21265,6 @@ snapshots:
optionalDependencies:
postcss: 8.4.47
- postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.4.47)(tsx@4.15.5)(yaml@2.4.5):
- dependencies:
- lilconfig: 3.1.2
- optionalDependencies:
- jiti: 1.21.6
- postcss: 8.4.47
- tsx: 4.15.5
- yaml: 2.4.5
-
postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.4.47)(tsx@4.16.2)(yaml@2.6.0):
dependencies:
lilconfig: 3.1.2
@@ -20804,6 +21274,24 @@ snapshots:
tsx: 4.16.2
yaml: 2.6.0
+ postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.5.2)(tsx@4.15.5)(yaml@2.4.5):
+ dependencies:
+ lilconfig: 3.1.2
+ optionalDependencies:
+ jiti: 1.21.6
+ postcss: 8.5.2
+ tsx: 4.15.5
+ yaml: 2.4.5
+
+ postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.5.2)(tsx@4.19.2)(yaml@2.6.0):
+ dependencies:
+ lilconfig: 3.1.2
+ optionalDependencies:
+ jiti: 1.21.6
+ postcss: 8.5.2
+ tsx: 4.19.2
+ yaml: 2.6.0
+
postcss-nested@6.0.1(postcss@8.4.38):
dependencies:
postcss: 8.4.38
@@ -20850,6 +21338,12 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
+ postcss@8.5.2:
+ dependencies:
+ nanoid: 3.3.8
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
postgres-array@2.0.0: {}
postgres-bytea@1.0.0: {}
@@ -21570,6 +22064,31 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.24.4
fsevents: 2.3.3
+ rollup@4.34.8:
+ dependencies:
+ '@types/estree': 1.0.6
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.34.8
+ '@rollup/rollup-android-arm64': 4.34.8
+ '@rollup/rollup-darwin-arm64': 4.34.8
+ '@rollup/rollup-darwin-x64': 4.34.8
+ '@rollup/rollup-freebsd-arm64': 4.34.8
+ '@rollup/rollup-freebsd-x64': 4.34.8
+ '@rollup/rollup-linux-arm-gnueabihf': 4.34.8
+ '@rollup/rollup-linux-arm-musleabihf': 4.34.8
+ '@rollup/rollup-linux-arm64-gnu': 4.34.8
+ '@rollup/rollup-linux-arm64-musl': 4.34.8
+ '@rollup/rollup-linux-loongarch64-gnu': 4.34.8
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8
+ '@rollup/rollup-linux-riscv64-gnu': 4.34.8
+ '@rollup/rollup-linux-s390x-gnu': 4.34.8
+ '@rollup/rollup-linux-x64-gnu': 4.34.8
+ '@rollup/rollup-linux-x64-musl': 4.34.8
+ '@rollup/rollup-win32-arm64-msvc': 4.34.8
+ '@rollup/rollup-win32-ia32-msvc': 4.34.8
+ '@rollup/rollup-win32-x64-msvc': 4.34.8
+ fsevents: 2.3.3
+
rrweb-cssom@0.7.1: {}
rsvp@3.2.1: {}
@@ -22515,7 +23034,7 @@ snapshots:
tsscmp@1.0.6: {}
- tsup@8.1.0(@swc/core@1.3.101)(postcss@8.4.47)(typescript@5.3.3):
+ tsup@8.1.0(@swc/core@1.3.101)(postcss@8.4.47)(typescript@5.7.3):
dependencies:
bundle-require: 4.2.1(esbuild@0.21.5)
cac: 6.7.14
@@ -22534,40 +23053,12 @@ snapshots:
optionalDependencies:
'@swc/core': 1.3.101(@swc/helpers@0.5.13)
postcss: 8.4.47
- typescript: 5.3.3
+ typescript: 5.7.3
transitivePeerDependencies:
- supports-color
- ts-node
- tsup@8.3.5(@swc/core@1.3.101)(jiti@1.21.6)(postcss@8.4.47)(tsx@4.15.5)(typescript@5.3.3)(yaml@2.4.5):
- dependencies:
- bundle-require: 5.0.0(esbuild@0.24.0)
- cac: 6.7.14
- chokidar: 4.0.1
- consola: 3.2.3
- debug: 4.3.7
- esbuild: 0.24.0
- joycon: 3.1.1
- picocolors: 1.1.1
- postcss-load-config: 6.0.1(jiti@1.21.6)(postcss@8.4.47)(tsx@4.15.5)(yaml@2.4.5)
- resolve-from: 5.0.0
- rollup: 4.24.4
- source-map: 0.8.0-beta.0
- sucrase: 3.35.0
- tinyexec: 0.3.1
- tinyglobby: 0.2.10
- tree-kill: 1.2.2
- optionalDependencies:
- '@swc/core': 1.3.101(@swc/helpers@0.5.13)
- postcss: 8.4.47
- typescript: 5.3.3
- transitivePeerDependencies:
- - jiti
- - supports-color
- - tsx
- - yaml
-
- tsup@8.3.5(@swc/core@1.3.101)(jiti@1.21.6)(postcss@8.4.47)(tsx@4.16.2)(typescript@5.3.3)(yaml@2.6.0):
+ tsup@8.3.5(@swc/core@1.3.101)(jiti@1.21.6)(postcss@8.4.47)(tsx@4.16.2)(typescript@5.7.3)(yaml@2.6.0):
dependencies:
bundle-require: 5.0.0(esbuild@0.24.0)
cac: 6.7.14
@@ -22588,6 +23079,62 @@ snapshots:
optionalDependencies:
'@swc/core': 1.3.101(@swc/helpers@0.5.13)
postcss: 8.4.47
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - jiti
+ - supports-color
+ - tsx
+ - yaml
+
+ tsup@8.3.5(@swc/core@1.3.101)(jiti@1.21.6)(postcss@8.5.2)(tsx@4.15.5)(typescript@5.7.3)(yaml@2.4.5):
+ dependencies:
+ bundle-require: 5.0.0(esbuild@0.24.0)
+ cac: 6.7.14
+ chokidar: 4.0.1
+ consola: 3.2.3
+ debug: 4.3.7
+ esbuild: 0.24.0
+ joycon: 3.1.1
+ picocolors: 1.1.1
+ postcss-load-config: 6.0.1(jiti@1.21.6)(postcss@8.5.2)(tsx@4.15.5)(yaml@2.4.5)
+ resolve-from: 5.0.0
+ rollup: 4.24.4
+ source-map: 0.8.0-beta.0
+ sucrase: 3.35.0
+ tinyexec: 0.3.1
+ tinyglobby: 0.2.10
+ tree-kill: 1.2.2
+ optionalDependencies:
+ '@swc/core': 1.3.101(@swc/helpers@0.5.13)
+ postcss: 8.5.2
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - jiti
+ - supports-color
+ - tsx
+ - yaml
+
+ tsup@8.3.5(@swc/core@1.3.101)(jiti@1.21.6)(postcss@8.5.2)(tsx@4.19.2)(typescript@5.3.3)(yaml@2.6.0):
+ dependencies:
+ bundle-require: 5.0.0(esbuild@0.24.0)
+ cac: 6.7.14
+ chokidar: 4.0.1
+ consola: 3.2.3
+ debug: 4.3.7
+ esbuild: 0.24.0
+ joycon: 3.1.1
+ picocolors: 1.1.1
+ postcss-load-config: 6.0.1(jiti@1.21.6)(postcss@8.5.2)(tsx@4.19.2)(yaml@2.6.0)
+ resolve-from: 5.0.0
+ rollup: 4.24.4
+ source-map: 0.8.0-beta.0
+ sucrase: 3.35.0
+ tinyexec: 0.3.1
+ tinyglobby: 0.2.10
+ tree-kill: 1.2.2
+ optionalDependencies:
+ '@swc/core': 1.3.101(@swc/helpers@0.5.13)
+ postcss: 8.5.2
typescript: 5.3.3
transitivePeerDependencies:
- jiti
@@ -22609,6 +23156,14 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
+ tsx@4.19.2:
+ dependencies:
+ esbuild: 0.23.1
+ get-tsconfig: 4.8.1
+ optionalDependencies:
+ fsevents: 2.3.3
+ optional: true
+
tunnel-agent@0.6.0:
dependencies:
safe-buffer: 5.2.1
@@ -22701,6 +23256,8 @@ snapshots:
typescript@5.3.3: {}
+ typescript@5.7.3: {}
+
ufo@1.5.4: {}
uglify-js@3.18.0:
@@ -22993,6 +23550,19 @@ snapshots:
fsevents: 2.3.3
terser: 5.31.1
+ vite@6.1.0(@types/node@20.17.6)(jiti@1.21.6)(terser@5.31.1)(tsx@4.19.2)(yaml@2.6.0):
+ dependencies:
+ esbuild: 0.24.2
+ postcss: 8.5.2
+ rollup: 4.34.8
+ optionalDependencies:
+ '@types/node': 20.17.6
+ fsevents: 2.3.3
+ jiti: 1.21.6
+ terser: 5.31.1
+ tsx: 4.19.2
+ yaml: 2.6.0
+
vitest@1.6.0(@types/node@20.17.6)(jsdom@24.1.3)(terser@5.31.1):
dependencies:
'@vitest/expect': 1.6.0