From 5b652640348b0f3fa85eec3daaf78a8b5c5ebb73 Mon Sep 17 00:00:00 2001 From: bkellam Date: Sun, 2 Nov 2025 15:24:19 -0800 Subject: [PATCH] move web to use shared env package --- .env.development | 2 +- packages/backend/package.json | 3 +- packages/backend/src/instrument.ts | 2 +- packages/backend/src/posthog.ts | 7 +- packages/shared/package.json | 2 +- packages/shared/src/crypto.ts | 2 +- packages/shared/src/entitlements.ts | 7 +- packages/shared/src/env.client.ts | 27 +++++ .../src/env.mjs => shared/src/env.server.ts} | 98 +++++++++++----- packages/shared/src/env.ts | 110 ------------------ packages/shared/src/index.client.ts | 6 +- packages/shared/src/index.server.ts | 3 +- packages/shared/src/logger.ts | 2 +- packages/shared/src/types.ts | 2 + packages/web/next.config.mjs | 3 +- packages/web/package.json | 1 - packages/web/src/actions.ts | 2 +- packages/web/src/app/[domain]/agents/page.tsx | 2 +- packages/web/src/app/[domain]/chat/page.tsx | 2 +- .../components/navigationMenu/index.tsx | 2 +- .../[domain]/components/settingsDropdown.tsx | 2 +- packages/web/src/app/[domain]/layout.tsx | 2 +- .../web/src/app/[domain]/repos/[id]/page.tsx | 2 +- .../settings/connections/[id]/page.tsx | 2 +- .../web/src/app/[domain]/settings/layout.tsx | 2 +- .../app/[domain]/settings/license/page.tsx | 2 +- .../web/src/app/[domain]/upgrade/page.tsx | 2 +- .../src/app/api/(server)/ee/audit/route.ts | 2 +- .../web/src/app/api/(server)/stripe/route.ts | 2 +- .../web/src/app/api/(server)/version/route.ts | 2 +- .../web/src/app/api/(server)/webhook/route.ts | 2 +- .../src/app/components/authSecurityNotice.tsx | 2 +- .../components/organizationAccessSettings.tsx | 2 +- packages/web/src/app/layout.tsx | 2 +- packages/web/src/app/onboard/page.tsx | 2 +- packages/web/src/app/posthogProvider.tsx | 2 +- packages/web/src/auth.ts | 2 +- packages/web/src/ee/features/audit/factory.ts | 2 +- .../web/src/ee/features/billing/actions.ts | 2 +- .../web/src/ee/features/billing/stripe.ts | 2 +- packages/web/src/ee/features/sso/sso.ts | 2 +- .../src/features/agents/review-agent/app.ts | 2 +- .../review-agent/nodes/invokeDiffReviewLlm.ts | 2 +- packages/web/src/features/chat/actions.ts | 2 +- packages/web/src/features/chat/agent.ts | 5 +- .../chat/components/chatThread/answerCard.tsx | 2 +- packages/web/src/features/chat/utils.test.ts | 2 +- packages/web/src/features/fileTree/actions.ts | 2 +- .../web/src/features/search/zoektClient.ts | 2 +- packages/web/src/hooks/useCaptureEvent.ts | 2 +- packages/web/src/initialize.ts | 4 +- packages/web/src/lib/types.ts | 2 +- packages/web/src/middleware.ts | 5 - packages/web/src/prisma.ts | 2 +- packages/web/src/withAuthV2.test.ts | 9 +- packages/web/tsconfig.json | 3 +- yarn.lock | 5 +- 57 files changed, 164 insertions(+), 214 deletions(-) create mode 100644 packages/shared/src/env.client.ts rename packages/{web/src/env.mjs => shared/src/env.server.ts} (68%) delete mode 100644 packages/shared/src/env.ts diff --git a/.env.development b/.env.development index 9b5b9682..ddb981af 100644 --- a/.env.development +++ b/.env.development @@ -84,7 +84,7 @@ SOURCEBOT_TELEMETRY_DISABLED=true # Disables telemetry collection # NEXT_PUBLIC_SOURCEBOT_VERSION= # CONFIG_MAX_REPOS_NO_TOKEN= -# NODE_ENV= +NODE_ENV=development # SOURCEBOT_TENANCY_MODE=single # NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT= diff --git a/packages/backend/package.json b/packages/backend/package.json index e2eea1f5..5369bde1 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -32,7 +32,6 @@ "@sourcebot/db": "workspace:*", "@sourcebot/schemas": "workspace:*", "@sourcebot/shared": "workspace:*", - "@t3-oss/env-core": "^0.12.0", "@types/express": "^5.0.0", "argparse": "^2.0.1", "azure-devops-node-api": "^15.1.1", @@ -52,6 +51,6 @@ "posthog-node": "^4.2.1", "prom-client": "^15.1.3", "simple-git": "^3.27.0", - "zod": "^3.24.3" + "zod": "^3.25.74" } } diff --git a/packages/backend/src/instrument.ts b/packages/backend/src/instrument.ts index d760d3df..5e0faa28 100644 --- a/packages/backend/src/instrument.ts +++ b/packages/backend/src/instrument.ts @@ -1,6 +1,6 @@ import * as Sentry from "@sentry/node"; import { createLogger } from "@sourcebot/shared"; -import { env } from "@sourcebot/shared"; +import { env } from "@sourcebot/shared/client"; const logger = createLogger('instrument'); diff --git a/packages/backend/src/posthog.ts b/packages/backend/src/posthog.ts index 204e281f..d61ee46e 100644 --- a/packages/backend/src/posthog.ts +++ b/packages/backend/src/posthog.ts @@ -1,12 +1,13 @@ +import { env as clientEnv } from "@sourcebot/shared/client"; import { env } from "@sourcebot/shared"; import { PostHog } from 'posthog-node'; import { PosthogEvent, PosthogEventMap } from './posthogEvents.js'; let posthog: PostHog | undefined = undefined; -if (env.NEXT_PUBLIC_POSTHOG_PAPIK) { +if (clientEnv.NEXT_PUBLIC_POSTHOG_PAPIK) { posthog = new PostHog( - env.NEXT_PUBLIC_POSTHOG_PAPIK, + clientEnv.NEXT_PUBLIC_POSTHOG_PAPIK, { host: "https://us.i.posthog.com", } @@ -23,7 +24,7 @@ export function captureEvent(event: E, properties: Posth event: event, properties: { ...properties, - sourcebot_version: env.NEXT_PUBLIC_SOURCEBOT_VERSION, + sourcebot_version: clientEnv.NEXT_PUBLIC_SOURCEBOT_VERSION, }, }); } diff --git a/packages/shared/package.json b/packages/shared/package.json index e8e6b3fa..dfe8dc16 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -20,7 +20,7 @@ "strip-json-comments": "^5.0.1", "triple-beam": "^1.4.1", "winston": "^3.15.0", - "zod": "^3.24.3" + "zod": "^3.25.74" }, "devDependencies": { "@types/micromatch": "^4.0.9", diff --git a/packages/shared/src/crypto.ts b/packages/shared/src/crypto.ts index 0d446129..7a88e5ab 100644 --- a/packages/shared/src/crypto.ts +++ b/packages/shared/src/crypto.ts @@ -1,6 +1,6 @@ import crypto from 'crypto'; import fs from 'fs'; -import { env } from './env.js'; +import { env } from './env.server.js'; import { Token } from '@sourcebot/schemas/v3/shared.type'; import { SecretManagerServiceClient } from "@google-cloud/secret-manager"; diff --git a/packages/shared/src/entitlements.ts b/packages/shared/src/entitlements.ts index dfb829ee..e1bba602 100644 --- a/packages/shared/src/entitlements.ts +++ b/packages/shared/src/entitlements.ts @@ -1,7 +1,8 @@ import { base64Decode } from "./utils.js"; import { z } from "zod"; import { createLogger } from "./logger.js"; -import { env } from "./env.js"; +import { env } from "./env.server.js"; +import { env as clientEnv } from "./env.client.js"; import { SOURCEBOT_SUPPORT_EMAIL, SOURCEBOT_UNLIMITED_SEATS } from "./constants.js"; import { verifySignature } from "./crypto.js"; @@ -89,8 +90,8 @@ export const getLicenseKey = (): LicenseKeyPayload | null => { } export const getPlan = (): Plan => { - if (env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT) { - if (env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT === "demo") { + if (clientEnv.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT) { + if (clientEnv.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT === "demo") { return "cloud:demo"; } diff --git a/packages/shared/src/env.client.ts b/packages/shared/src/env.client.ts new file mode 100644 index 00000000..727feb59 --- /dev/null +++ b/packages/shared/src/env.client.ts @@ -0,0 +1,27 @@ +import { createEnv } from "@t3-oss/env-core"; +import { z } from "zod"; +import { SOURCEBOT_CLOUD_ENVIRONMENT } from "./constants.js"; + +export const env = createEnv({ + clientPrefix: "NEXT_PUBLIC_", + client: { + NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: z.enum(SOURCEBOT_CLOUD_ENVIRONMENT).optional(), + NEXT_PUBLIC_SOURCEBOT_VERSION: z.string().default("unknown"), + NEXT_PUBLIC_POSTHOG_PAPIK: z.string().optional(), + NEXT_PUBLIC_SENTRY_BACKEND_DSN: z.string().optional(), + NEXT_PUBLIC_SENTRY_ENVIRONMENT: z.string().optional(), + NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY: z.string().optional(), + NEXT_PUBLIC_LANGFUSE_BASE_URL: z.string().optional() + }, + runtimeEnvStrict: { + NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: process.env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT, + NEXT_PUBLIC_SOURCEBOT_VERSION: process.env.NEXT_PUBLIC_SOURCEBOT_VERSION, + NEXT_PUBLIC_POSTHOG_PAPIK: process.env.NEXT_PUBLIC_POSTHOG_PAPIK, + NEXT_PUBLIC_SENTRY_BACKEND_DSN: process.env.NEXT_PUBLIC_SENTRY_BACKEND_DSN, + NEXT_PUBLIC_SENTRY_ENVIRONMENT: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT, + NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY: process.env.NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY, + NEXT_PUBLIC_LANGFUSE_BASE_URL: process.env.NEXT_PUBLIC_LANGFUSE_BASE_URL, + }, + emptyStringAsUndefined: true, + skipValidation: process.env.SKIP_ENV_VALIDATION === "1", +}); \ No newline at end of file diff --git a/packages/web/src/env.mjs b/packages/shared/src/env.server.ts similarity index 68% rename from packages/web/src/env.mjs rename to packages/shared/src/env.server.ts index 00b6e736..da1b18cd 100644 --- a/packages/web/src/env.mjs +++ b/packages/shared/src/env.server.ts @@ -1,16 +1,62 @@ -import { createEnv } from "@t3-oss/env-nextjs"; +import { createEnv } from "@t3-oss/env-core"; import { z } from "zod"; -import { SOURCEBOT_CLOUD_ENVIRONMENT } from "@sourcebot/shared/client"; +import { SourcebotConfig } from "@sourcebot/schemas/v3/index.type"; +import { getTokenFromConfig } from "./crypto.js"; +import { loadConfig } from "./utils.js"; +import { tenancyModeSchema } from "./types.js"; // Booleans are specified as 'true' or 'false' strings. const booleanSchema = z.enum(["true", "false"]); -export const tenancyModeSchema = z.enum(["multi", "single"]); // Numbers are treated as strings in .env files. // coerce helps us convert them to numbers. // @see: https://zod.dev/?id=coercion-for-primitives const numberSchema = z.coerce.number(); + +const resolveEnvironmentVariableOverridesFromConfig = async (config: SourcebotConfig): Promise> => { + if (!config.environmentOverrides) { + return {}; + } + + const resolved: Record = {}; + console.debug('resolving environment variable overrides'); + + for (const [key, override] of Object.entries(config.environmentOverrides)) { + switch (override.type) { + case 'token': + resolved[key] = await getTokenFromConfig(override.value); + break; + case 'boolean': + resolved[key] = override.value ? 'true' : 'false'; + break; + case 'number': + resolved[key] = override.value.toString(); + break; + case 'string': + resolved[key] = override.value; + break; + } + } + + return resolved; +} + +// Merge process.env with environment variables resolved from config.json +const runtimeEnv = await (async () => { + const configPath = process.env.CONFIG_PATH; + if (!configPath) { + return process.env; + } + + const config = await loadConfig(configPath); + const overrides = await resolveEnvironmentVariableOverridesFromConfig(config); + return { + ...process.env, + ...overrides, + } +})(); + export const env = createEnv({ server: { // Zoekt @@ -18,7 +64,6 @@ export const env = createEnv({ // Auth FORCE_ENABLE_ANONYMOUS_ACCESS: booleanSchema.default('false'), - AUTH_SECRET: z.string(), AUTH_URL: z.string().url(), AUTH_CREDENTIALS_LOGIN_ENABLED: booleanSchema.default('true'), @@ -75,7 +120,7 @@ export const env = createEnv({ DATABASE_URL: z.string().url(), SOURCEBOT_TENANCY_MODE: tenancyModeSchema.default("single"), - CONFIG_PATH: z.string().optional(), + CONFIG_PATH: z.string(), // Misc UI flags SECURITY_CARD_ENABLED: booleanSchema.default('false'), @@ -137,31 +182,30 @@ export const env = createEnv({ // @NOTE: Take care to update actions.ts when changing the name of this. EXPERIMENT_SELF_SERVE_REPO_INDEXING_GITHUB_TOKEN: z.string().optional(), EXPERIMENT_EE_PERMISSION_SYNC_ENABLED: booleanSchema.default('false'), - }, - // @NOTE: Please make sure of the following: - // - Make sure you destructure all client variables in - // the `experimental__runtimeEnv` block below. - // - Update the Dockerfile to pass these variables as build-args. - client: { - // PostHog - NEXT_PUBLIC_POSTHOG_PAPIK: z.string().optional(), - // Misc - NEXT_PUBLIC_SOURCEBOT_VERSION: z.string().default('unknown'), + SOURCEBOT_ENCRYPTION_KEY: z.string(), + SOURCEBOT_INSTALL_ID: z.string().default("unknown"), - NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: z.enum(SOURCEBOT_CLOUD_ENVIRONMENT).optional(), + FALLBACK_GITHUB_CLOUD_TOKEN: z.string().optional(), + FALLBACK_GITLAB_CLOUD_TOKEN: z.string().optional(), + FALLBACK_GITEA_CLOUD_TOKEN: z.string().optional(), - NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY: z.string().optional(), - NEXT_PUBLIC_LANGFUSE_BASE_URL: z.string().optional() + REDIS_URL: z.string().url().default("redis://localhost:6379"), + REDIS_REMOVE_ON_COMPLETE: numberSchema.default(0), + REDIS_REMOVE_ON_FAIL: numberSchema.default(100), + + DEBUG_ENABLE_GROUPMQ_LOGGING: booleanSchema.default('false'), + + CONNECTION_MANAGER_UPSERT_TIMEOUT_MS: numberSchema.default(300000), + REPO_SYNC_RETRY_BASE_SLEEP_SECONDS: numberSchema.default(60), + + GITLAB_CLIENT_QUERY_TIMEOUT_SECONDS: numberSchema.default(60 * 10), + + SOURCEBOT_LOG_LEVEL: z.enum(["info", "debug", "warn", "error"]).default("info"), + SOURCEBOT_STRUCTURED_LOGGING_ENABLED: booleanSchema.default("false"), + SOURCEBOT_STRUCTURED_LOGGING_FILE: z.string().optional(), }, - // For Next.js >= 13.4.4, you only need to destructure client variables: - experimental__runtimeEnv: { - NEXT_PUBLIC_POSTHOG_PAPIK: process.env.NEXT_PUBLIC_POSTHOG_PAPIK, - NEXT_PUBLIC_SOURCEBOT_VERSION: process.env.NEXT_PUBLIC_SOURCEBOT_VERSION, - NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: process.env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT, - NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY: process.env.NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY, - NEXT_PUBLIC_LANGFUSE_BASE_URL: process.env.NEXT_PUBLIC_LANGFUSE_BASE_URL, - }, - skipValidation: process.env.SKIP_ENV_VALIDATION === "1", + runtimeEnv, emptyStringAsUndefined: true, + skipValidation: process.env.SKIP_ENV_VALIDATION === "1", }); \ No newline at end of file diff --git a/packages/shared/src/env.ts b/packages/shared/src/env.ts deleted file mode 100644 index 9b15cad0..00000000 --- a/packages/shared/src/env.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { createEnv } from "@t3-oss/env-core"; -import { z } from "zod"; -import { SOURCEBOT_CLOUD_ENVIRONMENT } from "./constants.js"; -import { SourcebotConfig } from "@sourcebot/schemas/v3/index.type"; -import { getTokenFromConfig } from "./crypto.js"; -import { loadConfig } from "./utils.js"; - -// Booleans are specified as 'true' or 'false' strings. -const booleanSchema = z.enum(["true", "false"]); - -// Numbers are treated as strings in .env files. -// coerce helps us convert them to numbers. -// @see: https://zod.dev/?id=coercion-for-primitives -const numberSchema = z.coerce.number(); - - -const resolveEnvironmentVariableOverridesFromConfig = async (config: SourcebotConfig): Promise> => { - if (!config.environmentOverrides) { - return {}; - } - - const resolved: Record = {}; - console.debug('resolving environment variable overrides'); - - for (const [key, override] of Object.entries(config.environmentOverrides)) { - switch (override.type) { - case 'token': - resolved[key] = await getTokenFromConfig(override.value); - break; - case 'boolean': - resolved[key] = override.value ? 'true' : 'false'; - break; - case 'number': - resolved[key] = override.value.toString(); - break; - case 'string': - resolved[key] = override.value; - break; - } - } - - return resolved; -} - -// Merge process.env with environment variables resolved from config.json -const runtimeEnv = await (async () => { - const configPath = process.env.CONFIG_PATH; - if (!configPath) { - return process.env; - } - - const config = await loadConfig(configPath); - const overrides = await resolveEnvironmentVariableOverridesFromConfig(config); - return { - ...process.env, - ...overrides, - } -})(); - -export const env = createEnv({ - server: { - SOURCEBOT_EE_LICENSE_KEY: z.string().optional(), - SOURCEBOT_PUBLIC_KEY_PATH: z.string(), - - SOURCEBOT_ENCRYPTION_KEY: z.string(), - SOURCEBOT_TELEMETRY_DISABLED: booleanSchema.default("false"), - SOURCEBOT_INSTALL_ID: z.string().default("unknown"), - - DATA_CACHE_DIR: z.string(), - - FALLBACK_GITHUB_CLOUD_TOKEN: z.string().optional(), - FALLBACK_GITLAB_CLOUD_TOKEN: z.string().optional(), - FALLBACK_GITEA_CLOUD_TOKEN: z.string().optional(), - - REDIS_URL: z.string().url().default("redis://localhost:6379"), - REDIS_REMOVE_ON_COMPLETE: numberSchema.default(0), - REDIS_REMOVE_ON_FAIL: numberSchema.default(100), - - DEBUG_ENABLE_GROUPMQ_LOGGING: booleanSchema.default('false'), - - DATABASE_URL: z.string().url().default("postgresql://postgres:postgres@localhost:5432/postgres"), - CONFIG_PATH: z.string(), - - CONNECTION_MANAGER_UPSERT_TIMEOUT_MS: numberSchema.default(300000), - REPO_SYNC_RETRY_BASE_SLEEP_SECONDS: numberSchema.default(60), - - GITLAB_CLIENT_QUERY_TIMEOUT_SECONDS: numberSchema.default(60 * 10), - - EXPERIMENT_EE_PERMISSION_SYNC_ENABLED: booleanSchema.default('false'), - AUTH_EE_GITHUB_BASE_URL: z.string().optional(), - AUTH_EE_GITLAB_BASE_URL: z.string().default("https://gitlab.com"), - - SOURCEBOT_LOG_LEVEL: z.enum(["info", "debug", "warn", "error"]).default("info"), - SOURCEBOT_STRUCTURED_LOGGING_ENABLED: booleanSchema.default("false"), - SOURCEBOT_STRUCTURED_LOGGING_FILE: z.string().optional(), - LOGTAIL_TOKEN: z.string().optional(), - LOGTAIL_HOST: z.string().url().optional(), - }, - client: { - NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: z.enum(SOURCEBOT_CLOUD_ENVIRONMENT).optional(), - NEXT_PUBLIC_SOURCEBOT_VERSION: z.string().default("unknown"), - NEXT_PUBLIC_POSTHOG_PAPIK: z.string().optional(), - NEXT_PUBLIC_SENTRY_BACKEND_DSN: z.string().optional(), - NEXT_PUBLIC_SENTRY_ENVIRONMENT: z.string().optional(), - }, - clientPrefix: "NEXT_PUBLIC_", - runtimeEnv, - emptyStringAsUndefined: true, - skipValidation: process.env.SKIP_ENV_VALIDATION === "1", -}); \ No newline at end of file diff --git a/packages/shared/src/index.client.ts b/packages/shared/src/index.client.ts index ca2bfad2..8d185ba6 100644 --- a/packages/shared/src/index.client.ts +++ b/packages/shared/src/index.client.ts @@ -1,2 +1,4 @@ - -export * from "./constants.js"; \ No newline at end of file +export * from "./constants.js"; +export { + env +} from "./env.client.js"; \ No newline at end of file diff --git a/packages/shared/src/index.server.ts b/packages/shared/src/index.server.ts index 85086eda..c5bcad10 100644 --- a/packages/shared/src/index.server.ts +++ b/packages/shared/src/index.server.ts @@ -16,6 +16,7 @@ export type { export { repoMetadataSchema, repoIndexingJobMetadataSchema, + tenancyModeSchema, } from "./types.js"; export { base64Decode, @@ -27,7 +28,7 @@ export { export * from "./constants.js"; export { env -} from "./env.js"; +} from "./env.server.js"; export { createLogger, } from "./logger.js"; diff --git a/packages/shared/src/logger.ts b/packages/shared/src/logger.ts index c636868d..a3f89e2c 100644 --- a/packages/shared/src/logger.ts +++ b/packages/shared/src/logger.ts @@ -2,7 +2,7 @@ import winston, { format, Logger } from 'winston'; import { Logtail } from '@logtail/node'; import { LogtailTransport } from '@logtail/winston'; import { MESSAGE } from 'triple-beam'; -import { env } from './env.js'; +import { env } from './env.server.js'; /** * Logger configuration with support for structured JSON logging. diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index a03b2e9d..0d5fb520 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -43,3 +43,5 @@ export const repoIndexingJobMetadataSchema = z.object({ }); export type RepoIndexingJobMetadata = z.infer; + +export const tenancyModeSchema = z.enum(["multi", "single"]); \ No newline at end of file diff --git a/packages/web/next.config.mjs b/packages/web/next.config.mjs index 2ab0b642..d344d121 100644 --- a/packages/web/next.config.mjs +++ b/packages/web/next.config.mjs @@ -1,4 +1,3 @@ -await import("./src/env.mjs"); import { withSentryConfig } from "@sentry/nextjs"; @@ -8,7 +7,7 @@ const nextConfig = { // This is required when using standalone builds. // @see: https://env.t3.gg/docs/nextjs#create-your-schema - transpilePackages: ["@t3-oss/env-nextjs", "@t3-oss/env-core"], + transpilePackages: ["@t3-oss/env-core"], // @see : https://posthog.com/docs/advanced/proxy/nextjs async rewrites() { diff --git a/packages/web/package.json b/packages/web/package.json index 710feaeb..ba3c3dbc 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -96,7 +96,6 @@ "@ssddanbrown/codemirror-lang-twig": "^1.0.0", "@stripe/react-stripe-js": "^3.1.1", "@stripe/stripe-js": "^5.6.0", - "@t3-oss/env-nextjs": "^0.12.0", "@tailwindcss/typography": "^0.5.16", "@tanstack/react-query": "^5.53.3", "@tanstack/react-table": "^8.20.5", diff --git a/packages/web/src/actions.ts b/packages/web/src/actions.ts index c3568be9..e194f808 100644 --- a/packages/web/src/actions.ts +++ b/packages/web/src/actions.ts @@ -1,7 +1,7 @@ 'use server'; import { getAuditService } from "@/ee/features/audit/factory"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { addUserToOrganization, orgHasAvailability } from "@/lib/authUtils"; import { ErrorCode } from "@/lib/errorCodes"; import { notAuthenticated, notFound, orgNotFound, ServiceError, ServiceErrorException, unexpectedError } from "@/lib/serviceError"; diff --git a/packages/web/src/app/[domain]/agents/page.tsx b/packages/web/src/app/[domain]/agents/page.tsx index 1da98ff2..fd564268 100644 --- a/packages/web/src/app/[domain]/agents/page.tsx +++ b/packages/web/src/app/[domain]/agents/page.tsx @@ -1,7 +1,7 @@ import Link from "next/link"; import { NavigationMenu } from "../components/navigationMenu"; import { FaCogs } from "react-icons/fa"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; const agents = [ { diff --git a/packages/web/src/app/[domain]/chat/page.tsx b/packages/web/src/app/[domain]/chat/page.tsx index 5b7afef2..5317328d 100644 --- a/packages/web/src/app/[domain]/chat/page.tsx +++ b/packages/web/src/app/[domain]/chat/page.tsx @@ -9,7 +9,7 @@ import { RepositoryCarousel } from "../components/repositoryCarousel"; import { NavigationMenu } from "../components/navigationMenu"; import { Separator } from "@/components/ui/separator"; import { DemoCards } from "./components/demoCards"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { loadJsonFile } from "@sourcebot/shared"; import { DemoExamples, demoExamplesSchema } from "@/types"; diff --git a/packages/web/src/app/[domain]/components/navigationMenu/index.tsx b/packages/web/src/app/[domain]/components/navigationMenu/index.tsx index f350fe92..66c7c36f 100644 --- a/packages/web/src/app/[domain]/components/navigationMenu/index.tsx +++ b/packages/web/src/app/[domain]/components/navigationMenu/index.tsx @@ -6,7 +6,7 @@ import { NavigationMenu as NavigationMenuBase } from "@/components/ui/navigation import { Separator } from "@/components/ui/separator"; import { getSubscriptionInfo } from "@/ee/features/billing/actions"; import { IS_BILLING_ENABLED } from "@/ee/features/billing/stripe"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { ServiceErrorException } from "@/lib/serviceError"; import { isServiceError } from "@/lib/utils"; import { DiscordLogoIcon, GitHubLogoIcon } from "@radix-ui/react-icons"; diff --git a/packages/web/src/app/[domain]/components/settingsDropdown.tsx b/packages/web/src/app/[domain]/components/settingsDropdown.tsx index 92a5705a..ec8ad0f0 100644 --- a/packages/web/src/app/[domain]/components/settingsDropdown.tsx +++ b/packages/web/src/app/[domain]/components/settingsDropdown.tsx @@ -32,7 +32,7 @@ import { useKeymapType } from "@/hooks/useKeymapType" import { useSession } from "next-auth/react"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { signOut } from "next-auth/react" -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared/client"; import posthog from "posthog-js"; import { useDomain } from "@/hooks/useDomain"; diff --git a/packages/web/src/app/[domain]/layout.tsx b/packages/web/src/app/[domain]/layout.tsx index a3079d7f..de506b40 100644 --- a/packages/web/src/app/[domain]/layout.tsx +++ b/packages/web/src/app/[domain]/layout.tsx @@ -16,7 +16,7 @@ import { getSubscriptionInfo } from "@/ee/features/billing/actions"; import { PendingApprovalCard } from "./components/pendingApproval"; import { SubmitJoinRequest } from "./components/submitJoinRequest"; import { hasEntitlement } from "@sourcebot/shared"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { GcpIapAuth } from "./components/gcpIapAuth"; import { getAnonymousAccessStatus, getMemberApprovalRequired } from "@/actions"; import { JoinOrganizationCard } from "@/app/components/joinOrganizationCard"; diff --git a/packages/web/src/app/[domain]/repos/[id]/page.tsx b/packages/web/src/app/[domain]/repos/[id]/page.tsx index a3255c04..8986f7f6 100644 --- a/packages/web/src/app/[domain]/repos/[id]/page.tsx +++ b/packages/web/src/app/[domain]/repos/[id]/page.tsx @@ -4,7 +4,7 @@ import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Skeleton } from "@/components/ui/skeleton" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip" -import { env } from "@/env.mjs" +import { env } from "@sourcebot/shared" import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants" import { ServiceErrorException } from "@/lib/serviceError" import { cn, getCodeHostInfoForRepo, isServiceError } from "@/lib/utils" diff --git a/packages/web/src/app/[domain]/settings/connections/[id]/page.tsx b/packages/web/src/app/[domain]/settings/connections/[id]/page.tsx index c36a3342..4cebd7db 100644 --- a/packages/web/src/app/[domain]/settings/connections/[id]/page.tsx +++ b/packages/web/src/app/[domain]/settings/connections/[id]/page.tsx @@ -4,7 +4,7 @@ import { DisplayDate } from "@/app/[domain]/components/DisplayDate"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"; import { notFound, ServiceErrorException } from "@/lib/serviceError"; import { isServiceError } from "@/lib/utils"; diff --git a/packages/web/src/app/[domain]/settings/layout.tsx b/packages/web/src/app/[domain]/settings/layout.tsx index b0aa8f5b..0b508903 100644 --- a/packages/web/src/app/[domain]/settings/layout.tsx +++ b/packages/web/src/app/[domain]/settings/layout.tsx @@ -10,8 +10,8 @@ import { getConnectionStats, getMe, getOrgAccountRequests } from "@/actions"; import { ServiceErrorException } from "@/lib/serviceError"; import { getOrgFromDomain } from "@/data/org"; import { OrgRole } from "@prisma/client"; -import { env } from "@/env.mjs"; import { hasEntitlement } from "@sourcebot/shared"; +import { env } from "@sourcebot/shared/client"; interface LayoutProps { children: React.ReactNode; diff --git a/packages/web/src/app/[domain]/settings/license/page.tsx b/packages/web/src/app/[domain]/settings/license/page.tsx index 7c6be35e..3e9df37d 100644 --- a/packages/web/src/app/[domain]/settings/license/page.tsx +++ b/packages/web/src/app/[domain]/settings/license/page.tsx @@ -4,7 +4,7 @@ import { Info, Mail } from "lucide-react"; import { getOrgMembers } from "@/actions"; import { isServiceError } from "@/lib/utils"; import { notFound, ServiceErrorException } from "@/lib/serviceError"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared/client"; interface LicensePageProps { params: Promise<{ diff --git a/packages/web/src/app/[domain]/upgrade/page.tsx b/packages/web/src/app/[domain]/upgrade/page.tsx index ed931e8d..3d4e0e30 100644 --- a/packages/web/src/app/[domain]/upgrade/page.tsx +++ b/packages/web/src/app/[domain]/upgrade/page.tsx @@ -8,7 +8,7 @@ import { isServiceError } from "@/lib/utils"; import Link from "next/link"; import { ArrowLeftIcon } from "@radix-ui/react-icons"; import { LogoutEscapeHatch } from "@/app/components/logoutEscapeHatch"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { IS_BILLING_ENABLED } from "@/ee/features/billing/stripe"; import { getSubscriptionInfo } from "@/ee/features/billing/actions"; diff --git a/packages/web/src/app/api/(server)/ee/audit/route.ts b/packages/web/src/app/api/(server)/ee/audit/route.ts index 80a05e2e..c1b8c86c 100644 --- a/packages/web/src/app/api/(server)/ee/audit/route.ts +++ b/packages/web/src/app/api/(server)/ee/audit/route.ts @@ -6,7 +6,7 @@ import { isServiceError } from "@/lib/utils"; import { serviceErrorResponse } from "@/lib/serviceError"; import { StatusCodes } from "http-status-codes"; import { ErrorCode } from "@/lib/errorCodes"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { getEntitlements } from "@sourcebot/shared"; export const GET = async (request: NextRequest) => { diff --git a/packages/web/src/app/api/(server)/stripe/route.ts b/packages/web/src/app/api/(server)/stripe/route.ts index cab38a33..21286043 100644 --- a/packages/web/src/app/api/(server)/stripe/route.ts +++ b/packages/web/src/app/api/(server)/stripe/route.ts @@ -4,7 +4,7 @@ import Stripe from 'stripe'; import { prisma } from '@/prisma'; import { StripeSubscriptionStatus } from '@sourcebot/db'; import { stripeClient } from '@/ee/features/billing/stripe'; -import { env } from '@/env.mjs'; +import { env } from '@sourcebot/shared'; import { createLogger } from "@sourcebot/shared"; const logger = createLogger('stripe-webhook'); diff --git a/packages/web/src/app/api/(server)/version/route.ts b/packages/web/src/app/api/(server)/version/route.ts index 750955de..08008e76 100644 --- a/packages/web/src/app/api/(server)/version/route.ts +++ b/packages/web/src/app/api/(server)/version/route.ts @@ -1,4 +1,4 @@ -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared/client"; import { GetVersionResponse } from "@/lib/types"; // Note: In Next.JS 14, GET methods with no params are cached by default at build time. diff --git a/packages/web/src/app/api/(server)/webhook/route.ts b/packages/web/src/app/api/(server)/webhook/route.ts index a13b5d07..cfd01a25 100644 --- a/packages/web/src/app/api/(server)/webhook/route.ts +++ b/packages/web/src/app/api/(server)/webhook/route.ts @@ -4,7 +4,7 @@ import { NextRequest } from "next/server"; import { App, Octokit } from "octokit"; import { WebhookEventDefinition} from "@octokit/webhooks/types"; import { EndpointDefaults } from "@octokit/types"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { processGitHubPullRequest } from "@/features/agents/review-agent/app"; import { throttling } from "@octokit/plugin-throttling"; import fs from "fs"; diff --git a/packages/web/src/app/components/authSecurityNotice.tsx b/packages/web/src/app/components/authSecurityNotice.tsx index e903383f..2bdda7a8 100644 --- a/packages/web/src/app/components/authSecurityNotice.tsx +++ b/packages/web/src/app/components/authSecurityNotice.tsx @@ -1,7 +1,7 @@ 'use client'; import React, { useState, useEffect } from "react"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared/client"; interface AuthSecurityNoticeProps { closable?: boolean; diff --git a/packages/web/src/app/components/organizationAccessSettings.tsx b/packages/web/src/app/components/organizationAccessSettings.tsx index e240a374..70528164 100644 --- a/packages/web/src/app/components/organizationAccessSettings.tsx +++ b/packages/web/src/app/components/organizationAccessSettings.tsx @@ -6,7 +6,7 @@ import { getOrgMetadata } from "@/lib/utils" import { headers } from "next/headers" import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants" import { hasEntitlement } from "@sourcebot/shared" -import { env } from "@/env.mjs" +import { env } from "@sourcebot/shared" export async function OrganizationAccessSettings() { const org = await getOrgFromDomain(SINGLE_TENANT_ORG_DOMAIN); diff --git a/packages/web/src/app/layout.tsx b/packages/web/src/app/layout.tsx index 441e5e58..4249c00f 100644 --- a/packages/web/src/app/layout.tsx +++ b/packages/web/src/app/layout.tsx @@ -6,7 +6,7 @@ import { PostHogProvider } from "./posthogProvider"; import { Toaster } from "@/components/ui/toaster"; import { TooltipProvider } from "@/components/ui/tooltip"; import { SessionProvider } from "next-auth/react"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { PlanProvider } from "@/features/entitlements/planProvider"; import { getEntitlements } from "@sourcebot/shared"; diff --git a/packages/web/src/app/onboard/page.tsx b/packages/web/src/app/onboard/page.tsx index 33077a9b..5f22cddd 100644 --- a/packages/web/src/app/onboard/page.tsx +++ b/packages/web/src/app/onboard/page.tsx @@ -17,7 +17,7 @@ import { LogoutEscapeHatch } from "@/app/components/logoutEscapeHatch"; import { redirect } from "next/navigation"; import { BetweenHorizontalStart, Brain, GitBranchIcon, LockIcon } from "lucide-react"; import { hasEntitlement } from "@sourcebot/shared"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { GcpIapAuth } from "@/app/[domain]/components/gcpIapAuth"; interface OnboardingProps { diff --git a/packages/web/src/app/posthogProvider.tsx b/packages/web/src/app/posthogProvider.tsx index 44da24ea..8f3bccc7 100644 --- a/packages/web/src/app/posthogProvider.tsx +++ b/packages/web/src/app/posthogProvider.tsx @@ -4,7 +4,7 @@ import { usePostHog } from 'posthog-js/react' import { PostHogProvider as PHProvider } from 'posthog-js/react' import { usePathname, useSearchParams } from "next/navigation" import { Suspense, useEffect } from "react" -import { env } from '@/env.mjs' +import { env } from '@sourcebot/shared/client' import { useSession } from 'next-auth/react' import { captureEvent } from '@/hooks/useCaptureEvent' diff --git a/packages/web/src/auth.ts b/packages/web/src/auth.ts index 64dab588..f61219d7 100644 --- a/packages/web/src/auth.ts +++ b/packages/web/src/auth.ts @@ -4,7 +4,7 @@ import Credentials from "next-auth/providers/credentials" import EmailProvider from "next-auth/providers/nodemailer"; import { PrismaAdapter } from "@auth/prisma-adapter" import { prisma } from "@/prisma"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { User } from '@sourcebot/db'; import 'next-auth/jwt'; import type { Provider } from "next-auth/providers"; diff --git a/packages/web/src/ee/features/audit/factory.ts b/packages/web/src/ee/features/audit/factory.ts index 5fe7d0f4..9a2a4300 100644 --- a/packages/web/src/ee/features/audit/factory.ts +++ b/packages/web/src/ee/features/audit/factory.ts @@ -2,7 +2,7 @@ import { IAuditService } from '@/ee/features/audit/types'; import { MockAuditService } from '@/ee/features/audit/mockAuditService'; import { AuditService } from '@/ee/features/audit/auditService'; import { hasEntitlement } from '@sourcebot/shared'; -import { env } from '@/env.mjs'; +import { env } from '@sourcebot/shared'; let enterpriseService: IAuditService | undefined; diff --git a/packages/web/src/ee/features/billing/actions.ts b/packages/web/src/ee/features/billing/actions.ts index 84ede5e7..d66e94ee 100644 --- a/packages/web/src/ee/features/billing/actions.ts +++ b/packages/web/src/ee/features/billing/actions.ts @@ -7,7 +7,7 @@ import { prisma } from "@/prisma"; import { OrgRole } from "@sourcebot/db"; import { stripeClient } from "./stripe"; import { isServiceError } from "@/lib/utils"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { StatusCodes } from "http-status-codes"; import { ErrorCode } from "@/lib/errorCodes"; import { headers } from "next/headers"; diff --git a/packages/web/src/ee/features/billing/stripe.ts b/packages/web/src/ee/features/billing/stripe.ts index efc69668..c8ca0af7 100644 --- a/packages/web/src/ee/features/billing/stripe.ts +++ b/packages/web/src/ee/features/billing/stripe.ts @@ -1,5 +1,5 @@ import 'server-only'; -import { env } from '@/env.mjs' +import { env } from '@sourcebot/shared' import Stripe from "stripe"; import { hasEntitlement } from '@sourcebot/shared'; diff --git a/packages/web/src/ee/features/sso/sso.ts b/packages/web/src/ee/features/sso/sso.ts index 9095cc06..aca340bf 100644 --- a/packages/web/src/ee/features/sso/sso.ts +++ b/packages/web/src/ee/features/sso/sso.ts @@ -1,4 +1,4 @@ -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import GitHub from "next-auth/providers/github"; import Google from "next-auth/providers/google"; import Okta from "next-auth/providers/okta"; diff --git a/packages/web/src/features/agents/review-agent/app.ts b/packages/web/src/features/agents/review-agent/app.ts index dfd7a289..80d5a2f3 100644 --- a/packages/web/src/features/agents/review-agent/app.ts +++ b/packages/web/src/features/agents/review-agent/app.ts @@ -2,7 +2,7 @@ import { Octokit } from "octokit"; import { generatePrReviews } from "@/features/agents/review-agent/nodes/generatePrReview"; import { githubPushPrReviews } from "@/features/agents/review-agent/nodes/githubPushPrReviews"; import { githubPrParser } from "@/features/agents/review-agent/nodes/githubPrParser"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { GitHubPullRequest } from "@/features/agents/review-agent/types"; import path from "path"; import fs from "fs"; diff --git a/packages/web/src/features/agents/review-agent/nodes/invokeDiffReviewLlm.ts b/packages/web/src/features/agents/review-agent/nodes/invokeDiffReviewLlm.ts index 36684ffc..f3f41be8 100644 --- a/packages/web/src/features/agents/review-agent/nodes/invokeDiffReviewLlm.ts +++ b/packages/web/src/features/agents/review-agent/nodes/invokeDiffReviewLlm.ts @@ -1,6 +1,6 @@ import OpenAI from "openai"; import { sourcebot_file_diff_review, sourcebot_file_diff_review_schema } from "@/features/agents/review-agent/types"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import fs from "fs"; import { createLogger } from "@sourcebot/shared"; diff --git a/packages/web/src/features/chat/actions.ts b/packages/web/src/features/chat/actions.ts index 577812e5..58931d83 100644 --- a/packages/web/src/features/chat/actions.ts +++ b/packages/web/src/features/chat/actions.ts @@ -1,7 +1,7 @@ 'use server'; import { sew, withAuth, withOrgMembership } from "@/actions"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { SOURCEBOT_GUEST_USER_ID } from "@/lib/constants"; import { ErrorCode } from "@/lib/errorCodes"; import { chatIsReadonly, notFound, ServiceError, serviceErrorResponse } from "@/lib/serviceError"; diff --git a/packages/web/src/features/chat/agent.ts b/packages/web/src/features/chat/agent.ts index 402e1732..0c722c27 100644 --- a/packages/web/src/features/chat/agent.ts +++ b/packages/web/src/features/chat/agent.ts @@ -1,4 +1,5 @@ -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; +import { env as clientEnv } from "@sourcebot/shared/client"; import { getFileSource } from "@/features/search/fileSourceApi"; import { isServiceError } from "@/lib/utils"; import { ProviderOptions } from "@ai-sdk/provider-utils"; @@ -140,7 +141,7 @@ export const createAgentStream = async ({ }, // Only enable langfuse traces in cloud environments. experimental_telemetry: { - isEnabled: env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT !== undefined, + isEnabled: clientEnv.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT !== undefined, metadata: { langfuseTraceId: traceId, }, diff --git a/packages/web/src/features/chat/components/chatThread/answerCard.tsx b/packages/web/src/features/chat/components/chatThread/answerCard.tsx index d37ee67e..e3f89f62 100644 --- a/packages/web/src/features/chat/components/chatThread/answerCard.tsx +++ b/packages/web/src/features/chat/components/chatThread/answerCard.tsx @@ -17,7 +17,7 @@ import { isServiceError } from "@/lib/utils"; import { useDomain } from "@/hooks/useDomain"; import useCaptureEvent from "@/hooks/useCaptureEvent"; import { LangfuseWeb } from "langfuse"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared/client"; interface AnswerCardProps { answerText: string; diff --git a/packages/web/src/features/chat/utils.test.ts b/packages/web/src/features/chat/utils.test.ts index 3ebd4e31..698fbe42 100644 --- a/packages/web/src/features/chat/utils.test.ts +++ b/packages/web/src/features/chat/utils.test.ts @@ -4,7 +4,7 @@ import { FILE_REFERENCE_REGEX, ANSWER_TAG } from './constants'; import { SBChatMessage, SBChatMessagePart } from './types'; // Mock the env module -vi.mock('@/env.mjs', () => ({ +vi.mock('@sourcebot/shared', () => ({ env: { SOURCEBOT_CHAT_FILE_MAX_CHARACTERS: 4000, } diff --git a/packages/web/src/features/fileTree/actions.ts b/packages/web/src/features/fileTree/actions.ts index 4d03eb17..a861670d 100644 --- a/packages/web/src/features/fileTree/actions.ts +++ b/packages/web/src/features/fileTree/actions.ts @@ -1,7 +1,7 @@ 'use server'; import { sew } from '@/actions'; -import { env } from '@/env.mjs'; +import { env } from '@sourcebot/shared'; import { notFound, unexpectedError } from '@/lib/serviceError'; import { withOptionalAuthV2 } from '@/withAuthV2'; import { Repo } from '@sourcebot/db'; diff --git a/packages/web/src/features/search/zoektClient.ts b/packages/web/src/features/search/zoektClient.ts index 3379d2ce..bd30fcd1 100644 --- a/packages/web/src/features/search/zoektClient.ts +++ b/packages/web/src/features/search/zoektClient.ts @@ -1,4 +1,4 @@ -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; interface ZoektRequest { path: string, diff --git a/packages/web/src/hooks/useCaptureEvent.ts b/packages/web/src/hooks/useCaptureEvent.ts index 8dd03ffe..597f73ca 100644 --- a/packages/web/src/hooks/useCaptureEvent.ts +++ b/packages/web/src/hooks/useCaptureEvent.ts @@ -3,7 +3,7 @@ import { CaptureOptions } from "posthog-js"; import posthog from "posthog-js"; import { PosthogEvent, PosthogEventMap } from "../lib/posthogEvents"; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared/client"; export function captureEvent(event: E, properties: PosthogEventMap[E], options?: CaptureOptions) { if(!options) { diff --git a/packages/web/src/initialize.ts b/packages/web/src/initialize.ts index d40a7ccf..fa27febd 100644 --- a/packages/web/src/initialize.ts +++ b/packages/web/src/initialize.ts @@ -2,10 +2,8 @@ import { createGuestUser } from '@/lib/authUtils'; import { SOURCEBOT_SUPPORT_EMAIL } from "@/lib/constants"; import { prisma } from "@/prisma"; import { OrgRole } from '@sourcebot/db'; -import { createLogger } from "@sourcebot/shared"; -import { hasEntitlement, loadConfig } from '@sourcebot/shared'; +import { createLogger, env, hasEntitlement, loadConfig } from "@sourcebot/shared"; import { getOrgFromDomain } from './data/org'; -import { env } from './env.mjs'; import { SINGLE_TENANT_ORG_DOMAIN, SINGLE_TENANT_ORG_ID, SOURCEBOT_GUEST_USER_ID } from './lib/constants'; import { ServiceErrorException } from './lib/serviceError'; import { getOrgMetadata, isServiceError } from './lib/utils'; diff --git a/packages/web/src/lib/types.ts b/packages/web/src/lib/types.ts index 545dbbf4..e27e7057 100644 --- a/packages/web/src/lib/types.ts +++ b/packages/web/src/lib/types.ts @@ -1,6 +1,6 @@ import { z } from "zod"; import { getReposResponseSchema, getVersionResponseSchema, repositoryQuerySchema, searchContextQuerySchema } from "./schemas"; -import { tenancyModeSchema } from "@/env.mjs"; +import { tenancyModeSchema } from "@sourcebot/shared"; export type KeymapType = "default" | "vim"; diff --git a/packages/web/src/middleware.ts b/packages/web/src/middleware.ts index 1b127f41..b59e207d 100644 --- a/packages/web/src/middleware.ts +++ b/packages/web/src/middleware.ts @@ -1,15 +1,10 @@ import { NextResponse } from 'next/server' import type { NextRequest } from 'next/server' -import { env } from './env.mjs' import { SINGLE_TENANT_ORG_DOMAIN } from '@/lib/constants' export async function middleware(request: NextRequest) { const url = request.nextUrl.clone(); - if (env.SOURCEBOT_TENANCY_MODE !== 'single') { - return NextResponse.next(); - } - if ( url.pathname.startsWith('/login') || url.pathname.startsWith('/redeem') || diff --git a/packages/web/src/prisma.ts b/packages/web/src/prisma.ts index 50eb11af..52a69cd3 100644 --- a/packages/web/src/prisma.ts +++ b/packages/web/src/prisma.ts @@ -1,5 +1,5 @@ import 'server-only'; -import { env } from "@/env.mjs"; +import { env } from "@sourcebot/shared"; import { Prisma, PrismaClient } from "@sourcebot/db"; import { hasEntitlement } from "@sourcebot/shared"; diff --git a/packages/web/src/withAuthV2.test.ts b/packages/web/src/withAuthV2.test.ts index 0463a152..1b936005 100644 --- a/packages/web/src/withAuthV2.test.ts +++ b/packages/web/src/withAuthV2.test.ts @@ -18,18 +18,10 @@ vi.mock('./auth', () => ({ auth: mocks.auth, })); -vi.mock('@/env.mjs', () => ({ - env: {} -})); - vi.mock('next/headers', () => ({ headers: mocks.headers, })); -vi.mock('@/env.mjs', () => ({ - env: {} -})); - vi.mock('@/prisma', async () => { // @see: https://github.com/prisma/prisma/discussions/20244#discussioncomment-7976447 const actual = await vi.importActual('@/__mocks__/prisma'); @@ -45,6 +37,7 @@ vi.mock('server-only', () => ({ vi.mock('@sourcebot/shared', () => ({ hasEntitlement: mocks.hasEntitlement, hashSecret: vi.fn((secret: string) => secret), + env: {} })); // Test utility to set the mock session diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json index a41d0da0..1abfee26 100644 --- a/packages/web/tsconfig.json +++ b/packages/web/tsconfig.json @@ -35,8 +35,7 @@ "next-env.d.ts", "**/*.ts", "**/*.tsx", - ".next/types/**/*.ts", - "src/env.mjs" + ".next/types/**/*.ts" ], "exclude": [ "node_modules" diff --git a/yarn.lock b/yarn.lock index 2b962b78..1caaf62f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7896,7 +7896,6 @@ __metadata: "@sourcebot/db": "workspace:*" "@sourcebot/schemas": "workspace:*" "@sourcebot/shared": "workspace:*" - "@t3-oss/env-core": "npm:^0.12.0" "@types/argparse": "npm:^2.0.16" "@types/express": "npm:^5.0.0" "@types/micromatch": "npm:^4.0.9" @@ -7925,7 +7924,7 @@ __metadata: tsx: "npm:^4.19.1" typescript: "npm:^5.6.2" vitest: "npm:^2.1.9" - zod: "npm:^3.24.3" + zod: "npm:^3.25.74" languageName: unknown linkType: soft @@ -8009,7 +8008,7 @@ __metadata: tsc-watch: "npm:6.2.1" typescript: "npm:^5.7.3" winston: "npm:^3.15.0" - zod: "npm:^3.24.3" + zod: "npm:^3.25.74" languageName: unknown linkType: soft