perf: 优化配置
This commit is contained in:
parent
0cc5c0f98e
commit
748aef5f79
12
package.json
12
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@kevisual/use-config",
|
||||
"version": "1.0.10",
|
||||
"version": "1.0.11",
|
||||
"types": "dist/config.d.ts",
|
||||
"scripts": {
|
||||
"build": "npm run clean && tsup",
|
||||
@ -20,13 +20,13 @@
|
||||
"license": "UNLICENSED",
|
||||
"type": "module",
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.13.5",
|
||||
"dotenv": "^16.4.7",
|
||||
"fast-glob": "^3.3.2",
|
||||
"@types/node": "^22.14.1",
|
||||
"dotenv": "^16.5.0",
|
||||
"fast-glob": "^3.3.3",
|
||||
"json-schema-to-ts": "^3.1.1",
|
||||
"json5": "^2.2.3",
|
||||
"tsup": "^8.4.0",
|
||||
"typescript": "^5.7.3"
|
||||
"typescript": "^5.8.3"
|
||||
},
|
||||
"exports": {
|
||||
".": {
|
||||
@ -54,6 +54,6 @@
|
||||
"dotenv": "^16.4.7"
|
||||
},
|
||||
"dependencies": {
|
||||
"@kevisual/load": "^0.0.4"
|
||||
"@kevisual/load": "^0.0.6"
|
||||
}
|
||||
}
|
140
src/env.ts
140
src/env.ts
@ -4,39 +4,33 @@ import dotenv from 'dotenv';
|
||||
|
||||
// 配置类型
|
||||
export type Config = {
|
||||
port: number;
|
||||
tokenSecret?: string;
|
||||
redis?: {
|
||||
host?: string;
|
||||
port?: number;
|
||||
password?: string;
|
||||
version?: string;
|
||||
[key: string]: any;
|
||||
};
|
||||
posgtres?: {
|
||||
host?: string;
|
||||
port?: number;
|
||||
user?: string;
|
||||
password?: string;
|
||||
database?: string;
|
||||
[key: string]: any;
|
||||
};
|
||||
minio?: {
|
||||
endPoint?: string;
|
||||
bucketName?: string;
|
||||
useSSL?: boolean;
|
||||
accessKey?: string;
|
||||
secretKey?: string;
|
||||
[key: string]: any;
|
||||
};
|
||||
mongo?: {
|
||||
uri?: string;
|
||||
[key: string]: any;
|
||||
};
|
||||
PORT: number;
|
||||
// redis
|
||||
REDIS_HOST?: string;
|
||||
REDIS_PORT?: number;
|
||||
REDIS_PASSWORD?: string;
|
||||
REDIS_VERSION?: string;
|
||||
REDIS_DB?: number;
|
||||
REDIS_USER?: string;
|
||||
// postgres
|
||||
POSTGRES_HOST?: string;
|
||||
POSTGRES_PORT?: number;
|
||||
POSTGRES_PASSWORD?: string;
|
||||
POSTGRES_USER?: string;
|
||||
POSTGRES_DB?: string;
|
||||
// minio
|
||||
MINIO_ENDPOINT?: string;
|
||||
MINIO_BUCKET_NAME?: string;
|
||||
MINIO_ACCESS_KEY?: string;
|
||||
MINIO_SECRET_KEY?: string;
|
||||
MINIO_USE_SSL?: boolean;
|
||||
// mongo
|
||||
MONGO_URI?: string;
|
||||
//
|
||||
[key: string]: any;
|
||||
};
|
||||
export const initConfig: Config = {
|
||||
port: 3000,
|
||||
PORT: 3000,
|
||||
};
|
||||
export const fileIsExist = (path: string) => {
|
||||
try {
|
||||
@ -49,9 +43,21 @@ export const fileIsExist = (path: string) => {
|
||||
export const getDirname = () => {
|
||||
return process.cwd();
|
||||
};
|
||||
type ConfigOpts = {
|
||||
/**
|
||||
* 配置选项
|
||||
*/
|
||||
export type ConfigOpts = {
|
||||
/**
|
||||
* 环境配置文件路径, default: 自定设置,优先级最高, process.cwd() + envConfigFile
|
||||
*/
|
||||
envConfigFile?: string;
|
||||
/**
|
||||
* 当前工作目录, default: process.cwd()
|
||||
*/
|
||||
cwd?: string;
|
||||
/**
|
||||
* 配置文件名, default: .env
|
||||
*/
|
||||
fileName?: string;
|
||||
};
|
||||
/**
|
||||
@ -82,9 +88,17 @@ export const getConfigFile = (opts?: ConfigOpts) => {
|
||||
if (lastLast) return lastLastPath;
|
||||
return '';
|
||||
};
|
||||
|
||||
// 初始化读取配置文件
|
||||
export const init = (opts?: ConfigOpts & { dotenvOpts?: dotenv.DotenvConfigOptions }): Config => {
|
||||
type GetConfigOpts = ConfigOpts & { dotenvOpts?: dotenv.DotenvConfigOptions };
|
||||
/**
|
||||
* 初始化配置, 不会把配置内容挂载到全局
|
||||
* @param opts 配置选项
|
||||
* @param opts.envConfigFile 环境配置文件路径, default: 为空,process.cwd() + envConfigFile
|
||||
* @param opts.cwd 当前工作目录, default: process.cwd()
|
||||
* @param opts.fileName 配置文件名, default: .env
|
||||
* @param opts.dotenvOpts dotenv配置选项
|
||||
* @returns 配置
|
||||
*/
|
||||
export const getConfig = (opts?: GetConfigOpts): Config => {
|
||||
if (opts?.dotenvOpts) {
|
||||
const prased = dotenv.config(opts.dotenvOpts).parsed as Config;
|
||||
if (prased) {
|
||||
@ -109,13 +123,28 @@ export const init = (opts?: ConfigOpts & { dotenvOpts?: dotenv.DotenvConfigOptio
|
||||
*
|
||||
* @returns Config
|
||||
*/
|
||||
export const useConfig = <T>(): Config & T => {
|
||||
export const useConfig = <T>(onlyInitConfig?: GetConfigOpts): Config & T => {
|
||||
const config = (global as any).config;
|
||||
const _config = config || init();
|
||||
const _config = config || getConfig(onlyInitConfig);
|
||||
!config && ((global as any)['config'] = _config);
|
||||
return _config;
|
||||
};
|
||||
|
||||
/**
|
||||
* 更新配置
|
||||
* @param configOpts 配置
|
||||
* @param opts 配置选项
|
||||
* @param opts.cwd 当前工作目录, default: process.cwd()
|
||||
* @param opts.fileName 配置文件名, default: config.json
|
||||
*/
|
||||
export const updateConfig = (configOpts: GetConfigOpts) => {
|
||||
const _config = (global as any).config || {};
|
||||
const newConfig = getConfig(configOpts);
|
||||
Object.assign(_config, newConfig);
|
||||
(global as any).config = _config;
|
||||
return _config;
|
||||
};
|
||||
|
||||
export const useKey = (key: string, opts?: { defaultValue?: string; isNumber?: boolean; isBoolean?: boolean }): string | number | boolean => {
|
||||
let v = useConfig()[key];
|
||||
if (!v) {
|
||||
@ -124,11 +153,46 @@ export const useKey = (key: string, opts?: { defaultValue?: string; isNumber?: b
|
||||
if (!v) {
|
||||
return opts?.defaultValue || null;
|
||||
}
|
||||
if (opts?.isNumber) {
|
||||
if (opts?.isNumber && typeof v === 'string') {
|
||||
return Number(v);
|
||||
}
|
||||
if (opts?.isBoolean) {
|
||||
if (opts?.isBoolean && typeof v === 'string') {
|
||||
return v === 'true';
|
||||
}
|
||||
return v;
|
||||
};
|
||||
|
||||
/**
|
||||
* 写入json配置文件
|
||||
* @param config 配置
|
||||
* @param opts 配置选项
|
||||
* @param opts.cwd 当前工作目录, default: process.cwd()
|
||||
* @param opts.fileName 配置文件名, default: config.json
|
||||
*/
|
||||
export const writeJsonConfig = (config = {}, opts?: Omit<ConfigOpts, 'envConfigFile'>) => {
|
||||
const filePath = getConfigFile({ ...opts, fileName: opts?.fileName || 'config.json' });
|
||||
if (!filePath) {
|
||||
throw new Error(`未找到配置文件: ${opts?.fileName || 'config.json'}`);
|
||||
}
|
||||
fs.writeFileSync(filePath, JSON.stringify(config, null, 2));
|
||||
};
|
||||
|
||||
/**
|
||||
* 读取json配置文件
|
||||
* @param opts 配置选项
|
||||
* @param opts.cwd 当前工作目录, default: process.cwd()
|
||||
* @param opts.fileName 配置文件名, default: config.json
|
||||
* @returns 配置
|
||||
*/
|
||||
export const readJsonConfig = (opts?: Omit<ConfigOpts, 'envConfigFile'>) => {
|
||||
const filePath = getConfigFile({ ...opts, fileName: opts?.fileName || 'config.json' });
|
||||
if (!filePath) {
|
||||
throw new Error(`未找到配置文件: ${opts?.fileName || 'config.json'}`);
|
||||
}
|
||||
try {
|
||||
const value = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
||||
return value;
|
||||
} catch (e) {
|
||||
return {};
|
||||
}
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user