chore: update package version and dependencies; add env-config for dynamic config keys

This commit is contained in:
2026-02-02 05:44:11 +08:00
parent d46de28db9
commit 69df2803c0
4 changed files with 380 additions and 75 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "@kevisual/use-config", "name": "@kevisual/use-config",
"version": "1.0.28", "version": "1.0.29",
"types": "dist/config.d.ts", "types": "dist/config.d.ts",
"scripts": { "scripts": {
"build": "npm run clean && code-builder build --dts", "build": "npm run clean && code-builder build --dts",
@@ -18,8 +18,9 @@
"license": "UNLICENSED", "license": "UNLICENSED",
"type": "module", "type": "module",
"devDependencies": { "devDependencies": {
"@kevisual/code-builder": "^0.0.3",
"@kevisual/context": "^0.0.4", "@kevisual/context": "^0.0.4",
"@types/node": "^25.0.7", "@types/node": "^25.2.0",
"dotenv": "^17.2.3" "dotenv": "^17.2.3"
}, },
"exports": { "exports": {
@@ -29,7 +30,8 @@
}, },
"./context": "./dist/app.js", "./context": "./dist/app.js",
"./file-store": "./dist/app.js", "./file-store": "./dist/app.js",
"./env": "./dist/app.js" "./env": "./dist/app.js",
"./env-config": "./src/env-config.ts"
}, },
"peerDependencies": { "peerDependencies": {
"dotenv": "^17" "dotenv": "^17"

71
pnpm-lock.yaml generated Normal file
View File

@@ -0,0 +1,71 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
dependencies:
'@kevisual/load':
specifier: ^0.0.6
version: 0.0.6
devDependencies:
'@kevisual/code-builder':
specifier: ^0.0.3
version: 0.0.3
'@kevisual/context':
specifier: ^0.0.4
version: 0.0.4
'@types/node':
specifier: ^25.2.0
version: 25.2.0
dotenv:
specifier: ^17.2.3
version: 17.2.3
packages:
'@kevisual/code-builder@0.0.3':
resolution: {integrity: sha512-mw8HMYBI9otzBv0ASB/Rqb9g03NxpXlR97ScaLb5xeQFNwO/ohdrLdwuNohUBIzLosMWUkuTGIBzV63UhlgIvw==}
hasBin: true
'@kevisual/context@0.0.4':
resolution: {integrity: sha512-HJeLeZQLU+7tCluSfOyvkgKLs0HjCZrdJlZgEgKRSa8XTwZfMAUt6J7qZTbrZAHBlPtX68EPu/PI8JMCeu3WAQ==}
'@kevisual/load@0.0.6':
resolution: {integrity: sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA==}
'@types/node@25.2.0':
resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==}
dotenv@17.2.3:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
eventemitter3@5.0.4:
resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
snapshots:
'@kevisual/code-builder@0.0.3': {}
'@kevisual/context@0.0.4': {}
'@kevisual/load@0.0.6':
dependencies:
eventemitter3: 5.0.4
'@types/node@25.2.0':
dependencies:
undici-types: 7.16.0
dotenv@17.2.3: {}
eventemitter3@5.0.4: {}
undici-types@7.16.0: {}

284
src/env-config.ts Normal file
View File

@@ -0,0 +1,284 @@
export type ConfigEnvItem = {
title: string;
description?: string;
tags?: string[];
}
export const configEnvList = [
// 基础配置
{
title: 'PORT',
description: '服务端口号',
tags: ['基础', '服务']
},
// Redis 配置
{
title: 'REDIS_HOST',
description: 'Redis 服务器地址',
tags: ['Redis', '数据库', '缓存']
},
{
title: 'REDIS_PORT',
description: 'Redis 服务器端口',
tags: ['Redis', '数据库', '缓存']
},
{
title: 'REDIS_PASSWORD',
description: 'Redis 连接密码',
tags: ['Redis', '数据库', '缓存', '安全']
},
{
title: 'REDIS_VERSION',
description: 'Redis 版本号',
tags: ['Redis', '数据库', '缓存']
},
{
title: 'REDIS_DB',
description: 'Redis 数据库索引',
tags: ['Redis', '数据库', '缓存']
},
{
title: 'REDIS_USER',
description: 'Redis 用户名',
tags: ['Redis', '数据库', '缓存', '安全']
},
// PostgreSQL 配置
{
title: 'POSTGRES_HOST',
description: 'PostgreSQL 服务器地址',
tags: ['PostgreSQL', '数据库', '关系型数据库']
},
{
title: 'POSTGRES_PORT',
description: 'PostgreSQL 服务器端口',
tags: ['PostgreSQL', '数据库', '关系型数据库']
},
{
title: 'POSTGRES_PASSWORD',
description: 'PostgreSQL 连接密码',
tags: ['PostgreSQL', '数据库', '关系型数据库', '安全']
},
{
title: 'POSTGRES_USER',
description: 'PostgreSQL 用户名',
tags: ['PostgreSQL', '数据库', '关系型数据库', '安全']
},
{
title: 'POSTGRES_DB',
description: 'PostgreSQL 数据库名称',
tags: ['PostgreSQL', '数据库', '关系型数据库']
},
// MongoDB 配置
{
title: 'MONGO_URI',
description: 'MongoDB 连接字符串',
tags: ['MongoDB', '数据库', 'NoSQL']
},
// Drizzle ORM 配置
{
title: 'DATABASE_URL',
description: '数据库连接 URL用于 Drizzle ORM',
tags: ['数据库', 'ORM', 'Drizzle', '常用']
},
// MinIO 配置
{
title: 'MINIO_ENDPOINT',
description: 'MinIO 服务地址',
tags: ['MinIO', '对象存储', '存储']
},
{
title: 'MINIO_BUCKET_NAME',
description: 'MinIO 存储桶名称',
tags: ['MinIO', '对象存储', '存储']
},
{
title: 'MINIO_ACCESS_KEY',
description: 'MinIO 访问密钥',
tags: ['MinIO', '对象存储', '存储', '安全']
},
{
title: 'MINIO_SECRET_KEY',
description: 'MinIO 秘密密钥',
tags: ['MinIO', '对象存储', '存储', '安全']
},
{
title: 'MINIO_USE_SSL',
description: 'MinIO 是否使用 SSL',
tags: ['MinIO', '对象存储', '存储', '安全']
},
// S3 配置
{
title: 'S3_ACCESS_KEY_ID',
description: 'S3 访问密钥 ID',
tags: ['S3', '对象存储', '存储', 'AWS', '安全']
},
{
title: 'S3_SECRET_ACCESS_KEY',
description: 'S3 秘密访问密钥',
tags: ['S3', '对象存储', '存储', 'AWS', '安全']
},
{
title: 'S3_REGION',
description: 'S3 区域',
tags: ['S3', '对象存储', '存储', 'AWS']
},
{
title: 'S3_BUCKET_NAME',
description: 'S3 存储桶名称',
tags: ['S3', '对象存储', '存储', 'AWS']
},
{
title: 'S3_ENDPOINT',
description: 'S3 服务端点',
tags: ['S3', '对象存储', '存储', 'AWS']
},
{
title: 'S3_FORCE_PATH_STYLE',
description: '是否强制路径式访问 S3MinIO 一般需要开启)',
tags: ['S3', '对象存储', '存储', 'AWS']
},
// KEVISUAL 服务配置
{
title: 'KEVISUAL_TOKEN',
description: 'KEVISUAL 服务认证令牌',
tags: ['KEVISUAL', '服务', '安全']
},
{
title: 'KEVISUAL_API_URL',
description: 'KEVISUAL API 地址',
tags: ['KEVISUAL', '服务', 'API']
},
// AI 配置
{
title: 'KEVISUAL_NEW_API_KEY',
description: 'KEVISUAL AI API 密钥',
tags: ['AI', 'KEVISUAL', '安全']
},
{
title: 'BAILIAN_API_KEY',
description: '百炼 API 密钥',
tags: ['AI', '百炼', '安全', '常用']
},
{
title: 'ZHIPU_API_KEY',
description: '智谱 API 密钥',
tags: ['AI', '智谱', '安全', '常用']
},
{
title: 'MINIMAX_API_KEY',
description: 'MiniMax API 密钥',
tags: ['AI', 'MiniMax', '安全', '常用']
},
{
title: 'VOLCENGINE_API_KEY',
description: '火山引擎 API 密钥',
tags: ['AI', '火山引擎', '安全', '常用']
},
{
title: 'BAILIAN_CODE_API_KEY',
description: '百炼代码规划 API 密钥',
tags: ['AI', '百炼', '代码', '安全', '常用']
},
// 即梦配置
{
title: 'JIMENG_API_URL',
description: '即梦 API 地址',
tags: ['即梦', 'API']
},
{
title: 'JIMENG_API_KEY',
description: '即梦 API 密钥',
tags: ['即梦', 'API', '安全', '常用']
},
{
title: 'JIMENG_TIMEOUT',
description: '即梦 API 超时时间',
tags: ['即梦', 'API']
},
// OpenCode 配置
{
title: 'OPENCODE_URL',
description: 'OpenCode 服务地址',
tags: ['OpenCode', '服务', 'API', '常用']
},
{
title: 'OPENCODE_API_KEY',
description: 'OpenCode API 密钥',
tags: ['OpenCode', 'API', '安全', '常用']
},
{
title: 'OPENCODE_SERVER_PASSWORD',
description: 'OpenCode 服务器密码',
tags: ['OpenCode', '服务', '安全']
},
{
title: "OPENCODE_SERVER_USERNAME",
description: "OpenCode 服务器用户名",
tags: ['OpenCode', '服务', '安全']
},
// 通知配置
{
title: 'FEISHU_NOTIFY_WEBHOOK_URL',
description: '飞书通知 Webhook 地址',
tags: ['通知', '飞书', 'Webhook']
},
// NocoDB 配置
{
title: 'NOCODB_URL',
description: 'NocoDB 服务地址',
tags: ['NocoDB', '数据库', '服务']
},
{
title: 'NOCODB_API_KEY',
description: 'NocoDB API 密钥',
tags: ['NocoDB', '数据库', 'API', '安全']
},
// MeiliSearch 配置
{
title: 'MEILISEARCH_URL',
description: 'MeiliSearch 服务地址',
tags: ['MeiliSearch', '搜索引擎', '服务', '常用']
},
{
title: 'MEILISEARCH_API_KEY',
description: 'MeiliSearch API 密钥',
tags: ['MeiliSearch', '搜索引擎', 'API', '安全', '常用']
},
// PocketBase 配置
{
title: 'POCKETBASE_URL',
description: 'PocketBase 服务地址',
tags: ['PocketBase', '后端', '服务']
},
{
title: 'POCKETBASE_TOKEN',
description: 'PocketBase 认证令牌',
tags: ['PocketBase', '后端', '安全']
},
// CNB 配置
{
title: 'CNB_TOKEN',
description: 'CNB 认证令牌',
tags: ['CNB', 'Cool', '安全', '常用']
},
{
title: 'CNB_API_KEY',
description: 'CNB API 密钥',
tags: ['CNB', 'Cool', 'API', '安全', '常用']
},
{
title: 'CNB_COOKIE',
description: 'CNB Cookie',
tags: ['CNB', 'Cool', '安全', '常用']
},
{
title: 'CNB_REPO_SLUG',
description: 'CNB 仓库标识',
tags: ['CNB', 'Cool']
},
// Kubernetes 配置
{
title: 'KUBECONFIG_DATA',
description: 'Kubernetes 配置数据',
tags: ['Kubernetes', 'K8s', '容器', '部署']
}
] as const;

View File

@@ -2,80 +2,14 @@ import fs from 'node:fs';
import path from 'node:path'; import path from 'node:path';
import dotenv from 'dotenv'; import dotenv from 'dotenv';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import { configEnvList } from './env-config.ts';
// 从 configEnvList 推断配置键名
type ConfigKeys = typeof configEnvList[number]['title'];
// 配置类型 // 配置类型
export type Config<T = {}> = { export type Config<T = {}> = {
PORT?: string; [K in ConfigKeys]?: string;
// redis
REDIS_HOST?: string;
REDIS_PORT?: string;
REDIS_PASSWORD?: string;
REDIS_VERSION?: string;
REDIS_DB?: string;
REDIS_USER?: string;
// postgres
POSTGRES_HOST?: string;
POSTGRES_PORT?: string;
POSTGRES_PASSWORD?: string;
POSTGRES_USER?: string;
POSTGRES_DB?: string;
// mongo
MONGO_URI?: string;
// DB: for drizzleorm
DATABASE_URL?: string;
// minio
MINIO_ENDPOINT?: string;
MINIO_BUCKET_NAME?: string;
MINIO_ACCESS_KEY?: string;
MINIO_SECRET_KEY?: string;
MINIO_USE_SSL?: string;
// s3
S3_ACCESS_KEY_ID?: string;
S3_SECRET_ACCESS_KEY?: string;
S3_REGION?: string;
S3_BUCKET_NAME?: string;
S3_ENDPOINT?: string;
S3_FORCE_PATH_STYLE?: string;
// KEVISUAL 服务相关
KEVISUAL_TOKEN?: string;
KEVISUAL_API_URL?: string;
// AI
KEVISUAL_NEW_API?: string;
BAILIAN_API_KEY?: string;
ZHIPU_API_KEY?: string;
MINIMAX_API_KEY?: string;
DOUBAO_API_KEY?: string;
JIMENG_API_URL?: string;
JIMENG_API_KEY?: string;
JIMENG_TIMEOUT?: string;
OPENCODE_URL?: string;
OPENCODE_API_KEY?: string;
// ## Notify
FEISHU_NOTIFY_WEBHOOK_URL?: string;
// NOCODEB
NOCODB_URL?: string;
NOCODB_API_KEY?: string;
// MEILISEARCH
MEILISEARCH_URL?: string;
MEILISEARCH_API_KEY?: string
// PocketBase
POCKETBASE_URL?: string;
POCKETBASE_TOKEN?: string;
CNB_TOKEN?: string;
CNB_COOKIE?: string;
KUBECONFIG_DATA?: string;
// 其他自定义配置
} & T; } & T;
export const initConfig: Config = { export const initConfig: Config = {
PORT: '3000', PORT: '3000',
@@ -224,7 +158,7 @@ export const useKey = <T = {}>(key: keyof Config<T>, opts?: { defaultValue?: str
v = process.env[key]; v = process.env[key];
} }
if (!v) { if (!v) {
return opts?.defaultValue || null; return opts?.defaultValue || '';
} }
if (opts?.isNumber && typeof v === 'string') { if (opts?.isNumber && typeof v === 'string') {
return Number(v); return Number(v);
@@ -235,6 +169,20 @@ export const useKey = <T = {}>(key: keyof Config<T>, opts?: { defaultValue?: str
return v; return v;
}; };
export const useValue = <T = {}>(key: keyof Config<T>, values: any, opts?: { defaultValue?: string; isNumber?: boolean; isBoolean?: boolean }): string | number | boolean => {
let v = values[key as string];
if (!v) {
return ''
}
if (opts?.isNumber && typeof v === 'string') {
return Number(v);
}
if (opts?.isBoolean && typeof v === 'string') {
return v === 'true';
}
return v;
}
/** /**
* 写入json配置文件 * 写入json配置文件
* @param config 配置 * @param config 配置