1
1
import EnvironmentVariableError from './EnvironmentVariableError' ;
2
2
import { Parser } from './parsers' ;
3
3
4
- export type Env < TSchema extends Schema > = Readonly <
5
- { [ key in keyof TSchema ] : SchemaEntryType < TSchema [ key ] > }
6
- > ;
4
+ export type Env < T > = { [ K in keyof Schema < T > ] : T [ K ] } ;
7
5
8
6
/**
9
7
* A schema defines the environment variable
10
8
* requirements.
11
9
*/
12
- export type Schema = Readonly < { [ name : string ] : SchemaEntry } > ;
10
+ export type Schema < T > = { [ K in keyof T ] : SchemaEntry < T [ K ] > } ;
13
11
14
- export type SchemaEntry = Readonly <
15
- {
16
- parser : Parser ;
17
- envVarName : string ;
18
- } & SchemaEntryRequiredInfo
19
- > ;
12
+ export type SchemaEntry < T > = {
13
+ parser : Parser < T > ;
14
+ envVarName : string ;
15
+ } & SchemaEntryRequiredInfo ;
20
16
21
- export type SchemaEntryRequiredInfo = Readonly <
17
+ export type SchemaEntryRequiredInfo =
22
18
| {
23
19
required : true ;
24
20
}
@@ -28,37 +24,31 @@ export type SchemaEntryRequiredInfo = Readonly<
28
24
* The default value of the environment variable.
29
25
*/
30
26
defaultEnvVarValue : string ;
31
- }
32
- > ;
33
-
34
- export type SchemaEntryType < TSchemaEntry extends SchemaEntry > = ReturnType <
35
- TSchemaEntry [ 'parser' ]
36
- > ;
27
+ } ;
37
28
38
29
/**
39
30
* Returns an env object based on a schema.
40
31
*/
41
- export function makeEnv < TSchema extends Schema > ( schema : TSchema ) : Env < TSchema > {
32
+ export function makeEnv < T extends { [ key : string ] : any } > (
33
+ schema : Schema < T > ,
34
+ ) : Env < T > {
42
35
const env = Object . entries ( schema ) . reduce ( ( acc , [ key , schemaEntry ] ) => {
43
- const value = getValue ( key , schemaEntry ) ;
36
+ const value = getValue ( key , schemaEntry as any ) ;
44
37
45
38
return { ...acc , [ key ] : value } ;
46
- } , { } ) as Env < TSchema > ;
39
+ } , { } ) as Env < T > ;
47
40
48
41
return env ;
49
42
}
50
43
51
- function getValue < TSchemaEntry extends SchemaEntry > (
52
- key : string ,
53
- schemaEntry : TSchemaEntry ,
54
- ) : SchemaEntryType < TSchemaEntry > {
44
+ function getValue < T > ( key : string , schemaEntry : SchemaEntry < T > ) : T {
55
45
const serializedValue = getSerializedValue ( schemaEntry ) ;
56
46
const value = parseSerializedValue ( key , serializedValue , schemaEntry ) ;
57
47
58
48
return value ;
59
49
}
60
50
61
- function getSerializedValue ( schemaEntry : SchemaEntry ) : string {
51
+ function getSerializedValue < T > ( schemaEntry : SchemaEntry < T > ) : string {
62
52
const envVarValue = process . env [ schemaEntry . envVarName ] ;
63
53
64
54
if ( envVarValue !== undefined ) {
@@ -82,12 +72,12 @@ function getSerializedValue(schemaEntry: SchemaEntry): string {
82
72
return serializedValue ;
83
73
}
84
74
85
- function parseSerializedValue < TSchemaEntry extends SchemaEntry > (
75
+ function parseSerializedValue < T > (
86
76
key : string ,
87
77
serializedValue : string ,
88
- schemaEntry : TSchemaEntry ,
89
- ) : SchemaEntryType < TSchemaEntry > {
90
- let value : SchemaEntryType < TSchemaEntry > ;
78
+ schemaEntry : SchemaEntry < T > ,
79
+ ) : T {
80
+ let value : T ;
91
81
92
82
try {
93
83
value = schemaEntry . parser ( serializedValue ) ;
0 commit comments