From 52ffe49019966acde3b595b20362138b4294aed0 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Tue, 10 Feb 2026 23:44:27 +0100 Subject: [PATCH] feat(next-utils): make directus client environment-aware and standardize base env schema --- packages/next-utils/src/directus.ts | 30 +++++++++++++++++++++++++---- packages/next-utils/src/env.ts | 18 ++++++++++++++++- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/packages/next-utils/src/directus.ts b/packages/next-utils/src/directus.ts index 1aafeea..2e2f5c8 100644 --- a/packages/next-utils/src/directus.ts +++ b/packages/next-utils/src/directus.ts @@ -12,13 +12,35 @@ export type MintelDirectusClient = DirectusClient & AuthenticationClient; /** - * Creates a Directus client configured with Mintel standards + * Creates a Directus client configured with Mintel standards. + * Automatically handles internal vs. external URLs based on environment. */ export function createMintelDirectusClient(url?: string): MintelDirectusClient { - const directusUrl = - url || process.env.DIRECTUS_URL || "http://localhost:8055"; + const isServer = typeof window === "undefined"; - return createDirectus(directusUrl).with(rest()).with(authentication()); + // 1. If an explicit URL is provided, use it. + if (url) { + return createDirectus(url).with(rest()).with(authentication()); + } + + // 2. On server: Prioritize INTERNAL_DIRECTUS_URL, fallback to DIRECTUS_URL + if (isServer) { + const directusUrl = + process.env.INTERNAL_DIRECTUS_URL || + process.env.DIRECTUS_URL || + "http://localhost:8055"; + return createDirectus(directusUrl).with(rest()).with(authentication()); + } + + // 3. In browser: Use a proxy path if we are on a different origin, + // or use the current origin if no DIRECTUS_URL is set. + const proxyPath = "/api/directus"; // Standard Mintel proxy path + const browserUrl = + typeof window !== "undefined" + ? `${window.location.origin}${proxyPath}` + : proxyPath; + + return createDirectus(browserUrl).with(rest()).with(authentication()); } /** diff --git a/packages/next-utils/src/env.ts b/packages/next-utils/src/env.ts index 4830251..f0de342 100644 --- a/packages/next-utils/src/env.ts +++ b/packages/next-utils/src/env.ts @@ -4,10 +4,17 @@ export const mintelEnvSchema = { NODE_ENV: z .enum(["development", "production", "test"]) .default("development"), - NEXT_PUBLIC_BASE_URL: z.string().url(), + NEXT_PUBLIC_BASE_URL: z.string().url().optional(), + NEXT_PUBLIC_TARGET: z + .enum(["development", "testing", "staging", "production"]) + .optional(), + TARGET: z + .enum(["development", "testing", "staging", "production"]) + .optional(), // Analytics (Proxy Pattern) UMAMI_WEBSITE_ID: z.string().optional(), + NEXT_PUBLIC_UMAMI_WEBSITE_ID: z.string().optional(), UMAMI_API_ENDPOINT: z .string() .url() @@ -23,6 +30,8 @@ export const mintelEnvSchema = { LOG_LEVEL: z .enum(["trace", "debug", "info", "warn", "error", "fatal"]) .default("info"), + + // Mail MAIL_HOST: z.string().optional(), MAIL_PORT: z.coerce.number().default(587), MAIL_USERNAME: z.string().optional(), @@ -32,6 +41,13 @@ export const mintelEnvSchema = { (val) => (typeof val === "string" ? val.split(",").filter(Boolean) : val), z.array(z.string()).default([]), ), + + // Directus + DIRECTUS_URL: z.string().url().default("http://localhost:8055"), + DIRECTUS_ADMIN_EMAIL: z.string().optional(), + DIRECTUS_ADMIN_PASSWORD: z.string().optional(), + DIRECTUS_API_TOKEN: z.string().optional(), + INTERNAL_DIRECTUS_URL: z.string().url().optional(), }; export function validateMintelEnv(schemaExtension = {}) {