2023-12-08 22:35:15 +01:00
import { createEnv } from "@t3-oss/env-nextjs" ;
import { z } from "zod" ;
2024-07-20 22:23:58 +02:00
const trueStrings = [ "1" , "yes" , "t" , "true" ] ;
const falseStrings = [ "0" , "no" , "f" , "false" ] ;
const supportedAuthProviders = [ "credentials" , "oidc" , "ldap" ] ;
const authProvidersSchema = z
. string ( )
. min ( 1 )
. transform ( ( providers ) =>
providers
. replaceAll ( " " , "" )
. toLowerCase ( )
. split ( "," )
. filter ( ( provider ) => {
if ( supportedAuthProviders . includes ( provider ) ) return true ;
else if ( ! provider )
console . log ( "One or more of the entries for AUTH_PROVIDER could not be parsed and/or returned null." ) ;
else console . log ( ` The value entered for AUTH_PROVIDER " ${ provider } " is incorrect. ` ) ;
return false ;
} ) ,
)
. default ( "credentials" ) ;
2024-08-09 15:59:00 +02:00
const createDurationSchema = ( defaultValue ) =>
z
. string ( )
. regex ( /^\d+[smhd]?$/ )
. default ( defaultValue )
. transform ( ( duration ) => {
const lastChar = duration [ duration . length - 1 ] ;
if ( ! isNaN ( Number ( lastChar ) ) ) {
return Number ( defaultValue ) ;
}
const multipliers = {
s : 1 ,
m : 60 ,
h : 60 * 60 ,
d : 60 * 60 * 24 ,
} ;
const numberDuration = Number ( duration . slice ( 0 , - 1 ) ) ;
const multiplier = multipliers [ lastChar ] ;
return numberDuration * multiplier ;
} ) ;
2024-07-20 22:23:58 +02:00
const booleanSchema = z
. string ( )
. default ( "false" )
. transform ( ( value , ctx ) => {
const normalized = value . trim ( ) . toLowerCase ( ) ;
if ( trueStrings . includes ( normalized ) ) return true ;
if ( falseStrings . includes ( normalized ) ) return false ;
throw new Error ( ` Invalid boolean value for ${ ctx . path . join ( "." ) } ` ) ;
} ) ;
const skipValidation = Boolean ( process . env . CI ) || Boolean ( process . env . SKIP _ENV _VALIDATION ) ;
const authProviders = skipValidation ? [ ] : authProvidersSchema . parse ( process . env . AUTH _PROVIDERS ) ;
2023-12-08 22:35:15 +01:00
export const env = createEnv ( {
server : {
2024-08-09 19:24:07 +02:00
AUTH _LOGOUT _REDIRECT _URL : z . string ( ) . url ( ) . optional ( ) ,
2024-08-09 15:59:00 +02:00
AUTH _SESSION _EXPIRY _TIME : createDurationSchema ( "30d" ) ,
2024-07-20 22:23:58 +02:00
AUTH _PROVIDERS : authProvidersSchema ,
... ( authProviders . includes ( "oidc" )
? {
AUTH _OIDC _ISSUER : z . string ( ) . url ( ) ,
AUTH _OIDC _CLIENT _ID : z . string ( ) . min ( 1 ) ,
AUTH _OIDC _CLIENT _SECRET : z . string ( ) . min ( 1 ) ,
AUTH _OIDC _CLIENT _NAME : z . string ( ) . min ( 1 ) . default ( "OIDC" ) ,
AUTH _OIDC _AUTO _LOGIN : booleanSchema ,
AUTH _OIDC _SCOPE _OVERWRITE : z . string ( ) . min ( 1 ) . default ( "openid email profile groups" ) ,
2024-10-07 21:13:15 +02:00
AUTH _OIDC _GROUPS _ATTRIBUTE : z . string ( ) . default ( "groups" ) , // Is used in the signIn event to assign the correct groups, key is from object of decoded id_token
2024-07-20 22:23:58 +02:00
}
: { } ) ,
... ( authProviders . includes ( "ldap" )
? {
AUTH _LDAP _URI : z . string ( ) . url ( ) ,
AUTH _LDAP _BIND _DN : z . string ( ) ,
AUTH _LDAP _BIND _PASSWORD : z . string ( ) ,
AUTH _LDAP _BASE : z . string ( ) ,
AUTH _LDAP _SEARCH _SCOPE : z . enum ( [ "base" , "one" , "sub" ] ) . default ( "base" ) ,
AUTH _LDAP _USERNAME _ATTRIBUTE : z . string ( ) . default ( "uid" ) ,
AUTH _LDAP _USER _MAIL _ATTRIBUTE : z . string ( ) . default ( "mail" ) ,
AUTH _LDAP _USERNAME _FILTER _EXTRA _ARG : z . string ( ) . optional ( ) ,
AUTH _LDAP _GROUP _CLASS : z . string ( ) . default ( "groupOfUniqueNames" ) ,
AUTH _LDAP _GROUP _MEMBER _ATTRIBUTE : z . string ( ) . default ( "member" ) ,
AUTH _LDAP _GROUP _MEMBER _USER _ATTRIBUTE : z . string ( ) . default ( "dn" ) ,
AUTH _LDAP _GROUP _FILTER _EXTRA _ARG : z . string ( ) . optional ( ) ,
}
: { } ) ,
2023-12-08 22:35:15 +01:00
} ,
client : { } ,
runtimeEnv : {
2024-08-09 19:24:07 +02:00
AUTH _LOGOUT _REDIRECT _URL : process . env . AUTH _LOGOUT _REDIRECT _URL ,
2024-08-09 15:59:00 +02:00
AUTH _SESSION _EXPIRY _TIME : process . env . AUTH _SESSION _EXPIRY _TIME ,
2024-07-20 22:23:58 +02:00
AUTH _PROVIDERS : process . env . AUTH _PROVIDERS ,
AUTH _LDAP _BASE : process . env . AUTH _LDAP _BASE ,
AUTH _LDAP _BIND _DN : process . env . AUTH _LDAP _BIND _DN ,
AUTH _LDAP _BIND _PASSWORD : process . env . AUTH _LDAP _BIND _PASSWORD ,
AUTH _LDAP _GROUP _CLASS : process . env . AUTH _LDAP _GROUP _CLASS ,
AUTH _LDAP _GROUP _FILTER _EXTRA _ARG : process . env . AUTH _LDAP _GROUP _FILTER _EXTRA _ARG ,
AUTH _LDAP _GROUP _MEMBER _ATTRIBUTE : process . env . AUTH _LDAP _GROUP _MEMBER _ATTRIBUTE ,
AUTH _LDAP _GROUP _MEMBER _USER _ATTRIBUTE : process . env . AUTH _LDAP _GROUP _MEMBER _USER _ATTRIBUTE ,
AUTH _LDAP _SEARCH _SCOPE : process . env . AUTH _LDAP _SEARCH _SCOPE ,
AUTH _LDAP _URI : process . env . AUTH _LDAP _URI ,
AUTH _OIDC _CLIENT _ID : process . env . AUTH _OIDC _CLIENT _ID ,
AUTH _OIDC _CLIENT _NAME : process . env . AUTH _OIDC _CLIENT _NAME ,
AUTH _OIDC _CLIENT _SECRET : process . env . AUTH _OIDC _CLIENT _SECRET ,
AUTH _OIDC _ISSUER : process . env . AUTH _OIDC _ISSUER ,
AUTH _OIDC _SCOPE _OVERWRITE : process . env . AUTH _OIDC _SCOPE _OVERWRITE ,
2024-10-07 21:13:15 +02:00
AUTH _OIDC _GROUPS _ATTRIBUTE : process . env . AUTH _OIDC _GROUPS _ATTRIBUTE ,
2024-07-20 22:23:58 +02:00
AUTH _LDAP _USERNAME _ATTRIBUTE : process . env . AUTH _LDAP _USERNAME _ATTRIBUTE ,
AUTH _LDAP _USER _MAIL _ATTRIBUTE : process . env . AUTH _LDAP _USER _MAIL _ATTRIBUTE ,
AUTH _LDAP _USERNAME _FILTER _EXTRA _ARG : process . env . AUTH _LDAP _USERNAME _FILTER _EXTRA _ARG ,
AUTH _OIDC _AUTO _LOGIN : process . env . AUTH _OIDC _AUTO _LOGIN ,
2023-12-08 22:35:15 +01:00
} ,
2024-07-20 22:23:58 +02:00
skipValidation ,
2023-12-08 22:35:15 +01:00
} ) ;