From a4cc8ee144a6c23afcae63a67a3aa7334b9b68dc Mon Sep 17 00:00:00 2001 From: Alec Larson <1925840+aleclarson@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:34:18 -0500 Subject: [PATCH 1/3] feat: add `AdapterEnv` interface for ambient extension The `AdapterRequestContext#env` method uses this interface to provide type safety at compile-time. It allows the user to make certain assumptions about the existence of particular environment variables. --- packages/base/core/index.d.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/base/core/index.d.ts b/packages/base/core/index.d.ts index 3ebe3c39..d63fa217 100644 --- a/packages/base/core/index.d.ts +++ b/packages/base/core/index.d.ts @@ -1,3 +1,10 @@ +/** + * Interface defining the shape of environment variables + */ +export interface AdapterEnv {} + +export type AdapterEnvKey = keyof AdapterEnv | (string & {}); + /** * Request context as dispatched by the platform adapter */ @@ -24,7 +31,9 @@ export interface AdapterRequestContext

{ * * @returns The value of the variable or undefined if it doesn't exist. */ - env(variable: string): string | undefined; + env( + variable: K, + ): K extends keyof AdapterEnv ? AdapterEnv[K] : string | undefined; /** * Signal that the request hasn't been handled and the returned response is * a placeholder (usually a 404). In this case the adapter should handle the From c309a0cd9ae99730845c4577a90242890baa2235 Mon Sep 17 00:00:00 2001 From: Alec Larson <1925840+aleclarson@users.noreply.github.com> Date: Thu, 2 Jan 2025 12:26:50 -0500 Subject: [PATCH 2/3] expose getter type --- packages/base/core/index.d.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/base/core/index.d.ts b/packages/base/core/index.d.ts index d63fa217..73a352c8 100644 --- a/packages/base/core/index.d.ts +++ b/packages/base/core/index.d.ts @@ -5,6 +5,10 @@ export interface AdapterEnv {} export type AdapterEnvKey = keyof AdapterEnv | (string & {}); +export type AdapterEnvGetter = ( + variable: K, +) => K extends keyof AdapterEnv ? AdapterEnv[K] : string | undefined; + /** * Request context as dispatched by the platform adapter */ @@ -31,9 +35,7 @@ export interface AdapterRequestContext

{ * * @returns The value of the variable or undefined if it doesn't exist. */ - env( - variable: K, - ): K extends keyof AdapterEnv ? AdapterEnv[K] : string | undefined; + env: AdapterEnvGetter; /** * Signal that the request hasn't been handled and the returned response is * a placeholder (usually a 404). In this case the adapter should handle the From 6f1c36a22bfe713bc864c24b548481cc14f2e50f Mon Sep 17 00:00:00 2001 From: Alec Larson <1925840+aleclarson@users.noreply.github.com> Date: Mon, 3 Feb 2025 19:50:41 -0500 Subject: [PATCH 3/3] fix(adapter-test): loosen the `env` argument so `process.env` can be passed without type assertion --- packages/adapter/adapter-test/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/adapter/adapter-test/src/index.ts b/packages/adapter/adapter-test/src/index.ts index 990e3bbb..9385a50d 100644 --- a/packages/adapter/adapter-test/src/index.ts +++ b/packages/adapter/adapter-test/src/index.ts @@ -7,7 +7,7 @@ export interface CreateTestClientArgs

{ handler: HattipHandler

; baseUrl?: string | URL; platform?: P; - env?: Record; + env?: Record; } export function createTestClient

({ @@ -38,7 +38,7 @@ export function createTestClient

({ void promise; }, env(variable) { - return env[variable]; + return env[variable] as any; }, }); };