-
-
Notifications
You must be signed in to change notification settings - Fork 85
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
f1e0791
commit 94129d3
Showing
7 changed files
with
137 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,13 @@ | ||
import "./app/env.js"; | ||
// import "./app/env.js"; | ||
|
||
/** @type {import('next').NextConfig} */ | ||
const nextConfig = { | ||
eslint: { | ||
ignoreDuringBuilds: true, | ||
}, | ||
experimental: { | ||
taint: true, | ||
}, | ||
}; | ||
|
||
export default nextConfig; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
/// <reference types="react/experimental" /> | ||
|
||
/** | ||
* This contains a potential future version of `createEnv` that | ||
* uses the new Taint API to prevent server variables from being | ||
* passed to client components. | ||
*/ | ||
|
||
import type { ServerClientOptions, StrictOptions } from "@t3-oss/env-core"; | ||
import { createEnv as createEnvCore } from "@t3-oss/env-core"; | ||
import * as React from "react"; | ||
import type { ZodType } from "zod"; | ||
|
||
const CLIENT_PREFIX = "NEXT_PUBLIC_" as const; | ||
type ClientPrefix = typeof CLIENT_PREFIX; | ||
|
||
type Options< | ||
TServer extends Record<string, ZodType>, | ||
TClient extends Record<`${ClientPrefix}${string}`, ZodType>, | ||
TShared extends Record<string, ZodType>, | ||
TExtends extends Array<Record<string, unknown>>, | ||
> = Omit< | ||
StrictOptions<ClientPrefix, TServer, TClient, TShared, TExtends> & | ||
ServerClientOptions<ClientPrefix, TServer, TClient>, | ||
"runtimeEnvStrict" | "runtimeEnv" | "clientPrefix" | ||
> & | ||
( | ||
| { | ||
/** | ||
* Manual destruction of `process.env`. Required for Next.js < 13.4.4. | ||
*/ | ||
runtimeEnv: StrictOptions< | ||
ClientPrefix, | ||
TServer, | ||
TClient, | ||
TShared, | ||
TExtends | ||
>["runtimeEnvStrict"]; | ||
experimental__runtimeEnv?: never; | ||
} | ||
| { | ||
runtimeEnv?: never; | ||
/** | ||
* Can be used for Next.js ^13.4.4 since they stopped static analysis of server side `process.env`. | ||
* Only client side `process.env` is statically analyzed and needs to be manually destructured. | ||
*/ | ||
experimental__runtimeEnv: Record< | ||
| { | ||
[TKey in keyof TClient]: TKey extends `${ClientPrefix}${string}` | ||
? TKey | ||
: never; | ||
}[keyof TClient] | ||
| { | ||
[TKey in keyof TShared]: TKey extends string ? TKey : never; | ||
}[keyof TShared], | ||
string | boolean | number | undefined | ||
>; | ||
} | ||
); | ||
|
||
export function createEnv< | ||
TServer extends Record<string, ZodType> = NonNullable<unknown>, | ||
TClient extends Record< | ||
`${ClientPrefix}${string}`, | ||
ZodType | ||
> = NonNullable<unknown>, | ||
TShared extends Record<string, ZodType> = NonNullable<unknown>, | ||
const TExtends extends Array<Record<string, unknown>> = [], | ||
>(opts: Options<TServer, TClient, TShared, TExtends>) { | ||
const client = typeof opts.client === "object" ? opts.client : {}; | ||
const server = typeof opts.server === "object" ? opts.server : {}; | ||
const shared = opts.shared; | ||
|
||
const runtimeEnv = opts.runtimeEnv | ||
? opts.runtimeEnv | ||
: { | ||
...process.env, | ||
...opts.experimental__runtimeEnv, | ||
}; | ||
|
||
const proxy = createEnvCore< | ||
ClientPrefix, | ||
TServer, | ||
TClient, | ||
TShared, | ||
TExtends | ||
>({ | ||
...opts, | ||
shared, | ||
client, | ||
server, | ||
clientPrefix: CLIENT_PREFIX, | ||
runtimeEnv, | ||
}); | ||
|
||
for (const key in proxy) { | ||
if (key in server) { | ||
try { | ||
React.experimental_taintUniqueValue( | ||
"Passing server variables is not supported", | ||
proxy, | ||
proxy[key], | ||
); | ||
} catch {} | ||
} | ||
} | ||
|
||
return proxy; | ||
} |