@speedy-js/config-loader
Version:
An out-of-box config loader with TypeScript support.
72 lines (65 loc) • 1.61 kB
text/typescript
/**
* Module dependencies
*/
import * as fs from 'fs';
import * as path from 'path';
import { bundleRequire, Options } from './bundle-require';
export interface IConfigLoaderOptions {
cwd: string;
stopDir?: string;
configKey: string;
configFile?: string | string[];
configSuffix?: string;
esbuildOptions?: Options['esbuildOptions'];
getOutputFile?: (filepath: string) => string
preserveTemporaryFile?: boolean
}
export interface IConfigLoaderResult<T> {
path?: string;
data: T;
}
export async function loadConfig<T = Record<string, unknown>>(
opts: IConfigLoaderOptions,
): Promise<IConfigLoaderResult<T>> {
const {
cwd = process.cwd(),
configKey,
configFile,
configSuffix = 'config',
esbuildOptions = {},
} = opts;
const files = Array.isArray(configFile)
? configFile
: typeof configFile === 'string'
? [configFile]
: [
`${configKey}.${configSuffix}.ts`,
`${configKey}.${configSuffix}.js`,
`.${configKey}rc.ts`,
`.${configKey}rc.js`,
];
for (const file of files) {
const filepath = path.resolve(cwd, file);
if (fs.existsSync(filepath)) {
const m = await bundleRequire({
filepath,
preserveTemporaryFile: opts.preserveTemporaryFile,
getOutputFile: opts.getOutputFile,
esbuildOptions: {
bundle: false,
...esbuildOptions,
target: 'node12',
},
});
const data = m.default || m;
return {
path: filepath,
data,
};
}
}
return {
path: null,
data: {} as T,
};
}