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;
},
});
};