@@ -11,6 +11,7 @@ import { hasTTY } from "std-env";
1111import { applyEnv } from "./env" ;
1212import { snakeCase } from "scule" ;
1313import { klona } from "klona" ;
14+ import { expectTypeOf } from "vitest" ;
1415
1516const prompt = enquirer ?. prompt ;
1617
@@ -100,7 +101,7 @@ async function search<T>(
100101 searchPlaces ?: string [ ] ,
101102) : Promise < ConfigLoaderResult < T > | null > {
102103 return getExplorer ( moduleName , searchStrategy , searchPlaces ) . search (
103- searchFrom ,
104+ searchFrom
104105 ) as Promise < ConfigLoaderResult < T > > ;
105106}
106107
@@ -117,7 +118,7 @@ async function load<T>(
117118 throw new Error ( `Config file ${ filename } not found` ) ;
118119}
119120
120- export interface LoadConfigOptions <
121+ export async function loadConfig <
121122 T extends Record < string , any > = Record < string , any > ,
122123 TOverrides extends Record < string , any > = {
123124 [ K in keyof T ] : T [ K ] ;
@@ -128,12 +129,12 @@ export interface LoadConfigOptions<
128129 TRequired extends Array < Exclude < keyof T , number | symbol > > = Array <
129130 Exclude < keyof T , number | symbol >
130131 > ,
131- TResult extends Record < string , any > = T &
132+ TResult extends Record < string , any > =
132133 TOverrides &
133134 TDefaultConfig & {
134135 [ K in TRequired [ number ] ] ?: any ;
135- } ,
136- > {
136+ } & T
137+ > ( options : {
137138 name : string ;
138139 searchStrategy ?: SearchStrategy ;
139140 searchPlaces ?: string [ ] ;
@@ -149,28 +150,7 @@ export interface LoadConfigOptions<
149150 | false
150151 | Array < PromptOptions >
151152 | ( ( config : TResult ) => Array < PromptOptions > | Promise < PromptOptions > ) ;
152- }
153-
154- // NOSONAR - Generic type parameters are necessarily duplicated between interface and function for type safety
155- export async function loadConfig <
156- T extends Record < string , any > = Record < string , any > ,
157- TOverrides extends Record < string , any > = {
158- [ K in keyof T ] : T [ K ] ;
159- } ,
160- TDefaultConfig extends Record < string , any > = {
161- [ K in keyof T ] : T [ K ] ;
162- } ,
163- TRequired extends Array < Exclude < keyof T , number | symbol > > = Array <
164- Exclude < keyof T , number | symbol >
165- > ,
166- TResult extends Record < string , any > = T &
167- TOverrides &
168- TDefaultConfig & {
169- [ K in TRequired [ number ] ] ?: any ;
170- } ,
171- > (
172- options : LoadConfigOptions < T , TOverrides , TDefaultConfig , TRequired , TResult > ,
173- ) : Promise < ConfigLoaderResult < TResult > > {
153+ } ) : Promise < ConfigLoaderResult < TResult > > {
174154 const envName = options ?. envName ?? process . env . NODE_ENV ;
175155 const cwd = resolve ( process . cwd ( ) , options ?. cwd || "." ) ;
176156 const dotenv = options ?. dotenv ?? true ;
@@ -276,3 +256,7 @@ export async function loadConfig<
276256
277257 return { config, filepath, isEmpty, missing : [ ] } ;
278258}
259+
260+ export type LoadConfigOptions < T extends Record < string , any > > = Parameters <
261+ typeof loadConfig < T >
262+ > [ 0 ] ;
0 commit comments