@h-ai/core 0.1.0-alpha.64 → 0.1.0-alpha.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +13 -1
- package/README.ja.md +13 -1
- package/README.md +13 -1
- package/dist/browser.d.ts +6 -2
- package/dist/browser.js +3 -0
- package/dist/browser.js.map +1 -1
- package/dist/{core-function-config.node-CwXAT7fW.d.ts → core-function-config.node-7KVlEiFk.d.ts} +22 -0
- package/dist/node.d.ts +2 -2
- package/dist/node.js +42 -2
- package/dist/node.js.map +1 -1
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -91,7 +91,7 @@ core.array.unique([1, 1, 2])
|
|
|
91
91
|
The browser retains the `core.config` API shape for type compatibility, but does not support file configuration:
|
|
92
92
|
|
|
93
93
|
- `core.config.get()` returns `undefined`, `has()` returns `false`, and `keys()` returns `[]`.
|
|
94
|
-
- `load()` / `validate()` / `reload()` return `HaiCommonError.SERVICE_UNAVAILABLE`.
|
|
94
|
+
- `loadEnvFiles()` / `load()` / `validate()` / `reload()` return `HaiCommonError.SERVICE_UNAVAILABLE`.
|
|
95
95
|
- `watch()` immediately calls its callback with the same error and returns a safe no-op unsubscribe function.
|
|
96
96
|
- Read configuration on the server and deliver it through an API, or use `core.init({ logging })` only to configure browser logging.
|
|
97
97
|
|
|
@@ -327,6 +327,18 @@ core.config.clear('app') // 清除单个
|
|
|
327
327
|
core.config.clear() // 清除全部
|
|
328
328
|
```
|
|
329
329
|
|
|
330
|
+
#### Dotenv files and environment modes
|
|
331
|
+
|
|
332
|
+
Node-only `core.config.loadEnvFiles({ mode, envDir })` returns HaiResult and merges `.env` → `.env.<mode>` → `.env.local`, with existing process variables taking priority. development/production map to dev/prod; missing files are skipped. It does not mutate the process: check success before assigning. Track public environment files and `.env.example`; ignore private `.env.local`. core.init does not load dotenv. Browser calls return SERVICE_UNAVAILABLE.
|
|
333
|
+
|
|
334
|
+
```ts
|
|
335
|
+
const env = core.config.loadEnvFiles({ mode: 'dev', envDir: '.' })
|
|
336
|
+
if (!env.success)
|
|
337
|
+
throw new Error(env.error.message)
|
|
338
|
+
Object.assign(process.env, env.data)
|
|
339
|
+
core.init({ configDir: './config' })
|
|
340
|
+
```
|
|
341
|
+
|
|
330
342
|
#### Environment variable mapping and interpolation
|
|
331
343
|
|
|
332
344
|
`core.config.load(name, ...)` automatically maps each YAML leaf to an
|
package/README.ja.md
CHANGED
|
@@ -91,7 +91,7 @@ core.array.unique([1, 1, 2])
|
|
|
91
91
|
ブラウザー版は型定義に合わせて `core.config` の API 形状を保持しますが、ファイル設定には対応しません:
|
|
92
92
|
|
|
93
93
|
- `core.config.get()` は `undefined`、`has()` は `false`、`keys()` は `[]` を返します。
|
|
94
|
-
- `load()` / `validate()` / `reload()` は `HaiCommonError.SERVICE_UNAVAILABLE` を返します。
|
|
94
|
+
- `loadEnvFiles()` / `load()` / `validate()` / `reload()` は `HaiCommonError.SERVICE_UNAVAILABLE` を返します。
|
|
95
95
|
- `watch()` は同じエラーで直ちにコールバックを呼び、安全な no-op の監視解除関数を返します。
|
|
96
96
|
- 設定が必要な場合はサーバーで読み込み API で渡すか、ブラウザーでは `core.init({ logging })` でログのみ設定してください。
|
|
97
97
|
|
|
@@ -327,6 +327,18 @@ core.config.clear('app') // 清除单个
|
|
|
327
327
|
core.config.clear() // 清除全部
|
|
328
328
|
```
|
|
329
329
|
|
|
330
|
+
#### dotenv ファイルと環境切り替え
|
|
331
|
+
|
|
332
|
+
Node 専用の `core.config.loadEnvFiles({ mode, envDir })` は HaiResult を返し、`.env` → `.env.<mode>` → `.env.local` の順で読み込みます。既存のプロセス変数が最優先です。development/production は dev/prod に対応し、存在しないファイルは省略します。プロセスは変更しないため、success を確認してから代入します。公開設定と `.env.example` は Git 登録し、私有の `.env.local` は除外します。core.init は dotenv を読み込まず、ブラウザーでは SERVICE_UNAVAILABLE を返します。
|
|
333
|
+
|
|
334
|
+
```ts
|
|
335
|
+
const env = core.config.loadEnvFiles({ mode: 'dev', envDir: '.' })
|
|
336
|
+
if (!env.success)
|
|
337
|
+
throw new Error(env.error.message)
|
|
338
|
+
Object.assign(process.env, env.data)
|
|
339
|
+
core.init({ configDir: './config' })
|
|
340
|
+
```
|
|
341
|
+
|
|
330
342
|
#### 環境変数のマッピングと展開
|
|
331
343
|
|
|
332
344
|
`core.config.load(name, ...)` は YAML の各末端設定を
|
package/README.md
CHANGED
|
@@ -91,7 +91,7 @@ core.array.unique([1, 1, 2])
|
|
|
91
91
|
浏览器端会保留 `core.config` API 形态以匹配类型定义,但不支持文件配置:
|
|
92
92
|
|
|
93
93
|
- `core.config.get()` 返回 `undefined`,`has()` 返回 `false`,`keys()` 返回 `[]`
|
|
94
|
-
- `load()` / `validate()` / `reload()` 返回 `HaiCommonError.SERVICE_UNAVAILABLE`
|
|
94
|
+
- `loadEnvFiles()` / `load()` / `validate()` / `reload()` 返回 `HaiCommonError.SERVICE_UNAVAILABLE`
|
|
95
95
|
- `watch()` 会立即用同一错误调用回调,并返回安全的 no-op 取消函数
|
|
96
96
|
- 需要配置时请由服务端读取后通过接口下发,或只在浏览器端用 `core.init({ logging })` 配置日志
|
|
97
97
|
|
|
@@ -327,6 +327,18 @@ core.config.clear('app') // 清除单个
|
|
|
327
327
|
core.config.clear() // 清除全部
|
|
328
328
|
```
|
|
329
329
|
|
|
330
|
+
#### dotenv 文件与环境切换
|
|
331
|
+
|
|
332
|
+
Node 专用的 `core.config.loadEnvFiles({ mode, envDir })` 返回 HaiResult,读取 `.env` → `.env.<mode>` → `.env.local`,已有进程环境最高;development/production 映射为 dev/prod,文件不存在时跳过。该函数不修改进程,调用方检查 success 后注入。除 `.env.local` 外的公共环境文件及完整说明 `.env.example` 提交 Git。`core.init` 不自动读取 dotenv,浏览器调用返回 SERVICE_UNAVAILABLE。
|
|
333
|
+
|
|
334
|
+
```ts
|
|
335
|
+
const env = core.config.loadEnvFiles({ mode: 'dev', envDir: '.' })
|
|
336
|
+
if (!env.success)
|
|
337
|
+
throw new Error(env.error.message)
|
|
338
|
+
Object.assign(process.env, env.data)
|
|
339
|
+
core.init({ configDir: './config' })
|
|
340
|
+
```
|
|
341
|
+
|
|
330
342
|
#### 环境变量映射与插值
|
|
331
343
|
|
|
332
344
|
`core.config.load(name, ...)` 会为每个 YAML 叶子配置项自动映射
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { H as HaiResult, W as WatchCallback, C as CoreOptions, a as CoreLogger, I as I18nFn, z as zodValidation, b as IdFn, T as TypeUtilFn, O as ObjectFn, S as SanitizeFn, c as StringFn, A as ArrayFn, d as AsyncFn, e as TimeFn, E as ErrorFn, M as ModuleFn } from './core-function-config.node-
|
|
2
|
-
export { f as CoreConfig, g as CoreConfigSchema, h as CoreFunctions, i as Env, j as EnvSchema, k as ErrorInfo, l as ErrorInfoValue, m as HaiCommonError, n as HaiConfigError, o as HaiError, p as HaiErrorDef, q as IdConfig, r as IdConfigSchema, s as InterpolationParams, L as Locale, t as LocaleInfo, u as LocaleMessages, v as LogContext, w as LogFormat, x as LogFormatSchema, y as LogLevel, B as LogLevelSchema, D as Logger, F as LoggerFunctions, G as LoggerOptions, J as LoggingConfig, K as LoggingConfigSchema, N as MatchHandlers, P as MessageDictionary, Q as MessageOptions, R as PaginatedResult, U as PaginationOptions, V as PaginationOptionsInput, X as ValidationFormError, Z as ZodMessageGetter, Y as ZodValidationFn, _ as ZodValidationMessageKey, $ as err, a0 as ok } from './core-function-config.node-
|
|
1
|
+
import { H as HaiResult, W as WatchCallback, C as CoreOptions, a as CoreLogger, I as I18nFn, z as zodValidation, b as IdFn, T as TypeUtilFn, O as ObjectFn, S as SanitizeFn, c as StringFn, A as ArrayFn, d as AsyncFn, e as TimeFn, E as ErrorFn, M as ModuleFn } from './core-function-config.node-7KVlEiFk.js';
|
|
2
|
+
export { f as CoreConfig, g as CoreConfigSchema, h as CoreFunctions, i as Env, j as EnvSchema, k as ErrorInfo, l as ErrorInfoValue, m as HaiCommonError, n as HaiConfigError, o as HaiError, p as HaiErrorDef, q as IdConfig, r as IdConfigSchema, s as InterpolationParams, L as Locale, t as LocaleInfo, u as LocaleMessages, v as LogContext, w as LogFormat, x as LogFormatSchema, y as LogLevel, B as LogLevelSchema, D as Logger, F as LoggerFunctions, G as LoggerOptions, J as LoggingConfig, K as LoggingConfigSchema, N as MatchHandlers, P as MessageDictionary, Q as MessageOptions, R as PaginatedResult, U as PaginationOptions, V as PaginationOptionsInput, X as ValidationFormError, Z as ZodMessageGetter, Y as ZodValidationFn, _ as ZodValidationMessageKey, $ as err, a0 as ok } from './core-function-config.node-7KVlEiFk.js';
|
|
3
3
|
import * as zod from 'zod';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -14,6 +14,10 @@ import * as zod from 'zod';
|
|
|
14
14
|
declare const core: {
|
|
15
15
|
/** 配置管理(浏览器端不支持文件配置,方法返回 SERVICE_UNAVAILABLE) */
|
|
16
16
|
config: {
|
|
17
|
+
loadEnvFiles(options: {
|
|
18
|
+
mode: string;
|
|
19
|
+
envDir?: string;
|
|
20
|
+
}): HaiResult<Record<string, string>>;
|
|
17
21
|
load<T>(name: string, filePath: string, schema?: zod.ZodType<T>): HaiResult<T>;
|
|
18
22
|
validate<T>(name: string, schema: zod.ZodType<T>): HaiResult<T>;
|
|
19
23
|
get<T>(name: string): T | undefined;
|
package/dist/browser.js
CHANGED
|
@@ -266,6 +266,9 @@ function unsupportedError() {
|
|
|
266
266
|
throw new Error(i18n.coreM("core_configUnsupportedInBrowser"));
|
|
267
267
|
}
|
|
268
268
|
var config = {
|
|
269
|
+
loadEnvFiles(_options) {
|
|
270
|
+
return unsupported();
|
|
271
|
+
},
|
|
269
272
|
load(_name, _filePath, _schema) {
|
|
270
273
|
return unsupported();
|
|
271
274
|
},
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/loglevel/lib/loglevel.js","../src/functions/core-function-config.browser.ts","../src/functions/core-function-logger.browser.ts","../src/core-main.browser.ts"],"names":["defaultLogger","getLogger","logger","config","log"],"mappings":"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","file":"browser.js","sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","/**\n * @h-ai/core — 配置管理(浏览器占位实现)\n *\n * 浏览器环境没有文件系统,不能加载 / 监听 YAML 配置文件。\n * 该实现保持 `core.config` API 形态与 Node.js 一致,但所有文件相关操作\n * 都返回明确的 SERVICE_UNAVAILABLE,避免运行时出现 `core.config` 为 undefined。\n * @module core-function-config.browser\n */\n\nimport type { ZodType } from 'zod'\nimport type { HaiError, HaiResult } from '../core-types.js'\nimport type { ConfigFn, WatchCallback } from './core-function-config.node.js'\nimport { err, HaiCommonError } from '../core-types.js'\nimport { i18n } from '../i18n/core-i18n-utils.js'\n\nfunction unsupported<T>(): HaiResult<T> {\n return err(\n HaiCommonError.SERVICE_UNAVAILABLE,\n i18n.coreM('core_configUnsupportedInBrowser'),\n )\n}\n\nfunction unsupportedError(): HaiError {\n const result = unsupported<never>()\n if (!result.success)\n return result.error\n throw new Error(i18n.coreM('core_configUnsupportedInBrowser'))\n}\n\n/** 浏览器端 config 占位对象,API 与 Node.js config 保持一致。 */\nexport const config: ConfigFn = {\n load<T>(_name: string, _filePath: string, _schema?: ZodType<T>): HaiResult<T> {\n return unsupported<T>()\n },\n\n validate<T>(_name: string, _schema: ZodType<T>): HaiResult<T> {\n return unsupported<T>()\n },\n\n get<T>(_name: string): T | undefined {\n return undefined\n },\n\n getOrThrow<T>(_name: string): T {\n throw new Error(i18n.coreM('core_configUnsupportedInBrowser'))\n },\n\n reload(_name: string): HaiResult<unknown> {\n return unsupported<unknown>()\n },\n\n has(_name: string): boolean {\n return false\n },\n\n clear(_name?: string): void {\n // 浏览器端无配置缓存,无需操作。\n },\n\n keys(): string[] {\n return []\n },\n\n watch<T = unknown>(_name: string, callback: WatchCallback<T>): () => void {\n callback(null, unsupportedError())\n return () => { }\n },\n\n unwatch(_name?: string): void {\n // 浏览器端无 watcher,无需操作。\n },\n\n isWatching(_name: string): boolean {\n return false\n },\n}\n\n/** config 子工具类型 */\nexport type BrowserConfigFn = typeof config\n","/**\n * @h-ai/core — Logger(浏览器版本,基于 loglevel)\n *\n * 提供统一的日志接口,浏览器环境使用 loglevel 实现。\n * @module core-function-logger.browser\n */\n\nimport type { LogFormat, LoggingConfig, LogLevel } from '../core-config.js'\nimport type { LogContext, Logger, LoggerFunctions, LoggerOptions } from '../core-types.js'\nimport log from 'loglevel'\nimport { sanitize as sanitizeUtils } from '../utils/core-util-sanitize.js'\n\n// ─── 全局配置 ───\n\n/** 全局日志级别(默认 'info') */\nlet globalLevel: LogLevel = 'info'\n\n/** 浏览器默认可读输出;可配置 JSON 格式用于采集。 */\nlet globalFormat: LogFormat = 'pretty'\n\n/** 附加脱敏路径,与默认凭据脱敏同时生效。 */\nlet globalRedact: string[] = []\n\n/** 全局默认上下文(每条日志自动附带) */\nlet globalContext: Record<string, unknown> = {}\n\n/** 默认 Logger 单例缓存 */\nlet defaultLogger: Logger | null = null\n\n/**\n * LogLevel 到 loglevel 库级别的映射。\n *\n * loglevel 不支持 fatal,映射为 error。\n */\nconst LEVEL_MAP: Record<LogLevel, log.LogLevelDesc> = {\n trace: 'trace',\n debug: 'debug',\n info: 'info',\n warn: 'warn',\n error: 'error',\n fatal: 'error', // loglevel 没有 fatal\n}\n\n/**\n * 配置全局 Logger 选项。\n *\n * @param config - 日志配置\n *\n * @example\n * ```ts\n * logger.configureLogger({ level: 'debug' })\n * ```\n */\nfunction configureLogger(config: Partial<LoggingConfig>): void {\n if (config.level) {\n globalLevel = config.level\n log.setLevel(LEVEL_MAP[config.level])\n }\n if (config.context) {\n globalContext = { ...globalContext, ...config.context }\n }\n if (config.format)\n globalFormat = config.format\n if (config.redact)\n globalRedact = [...config.redact]\n}\n\n/**\n * 设置全局日志级别。\n *\n * @param level - 日志级别\n *\n * @example\n * ```ts\n * logger.setLogLevel('warn')\n * ```\n */\nfunction setLogLevel(level: LogLevel): void {\n globalLevel = level\n log.setLevel(LEVEL_MAP[level])\n}\n\n/**\n * 获取当前全局日志级别。\n *\n * @example\n * ```ts\n * const level = logger.getLogLevel()\n * ```\n */\nfunction getLogLevel(): LogLevel {\n return globalLevel\n}\n\nfunction sanitizeLogContext(ctx?: LogContext): LogContext | undefined {\n if (!ctx || Object.keys(ctx).length === 0) {\n return ctx\n }\n\n const sanitized = sanitizeUtils.sanitizeSensitiveFields(ctx)\n for (const path of globalRedact)\n redactPath(sanitized, path.match(/\\*|[^.[\\]\"']+/g) ?? [])\n return sanitized\n}\n\n/** 在已脱敏的副本上处理点/括号路径和通配符,不修改调用方原始对象。 */\nfunction redactPath(value: unknown, segments: string[]): void {\n if (!value || typeof value !== 'object' || segments.length === 0)\n return\n const record = value as Record<string, unknown>\n const [segment, ...rest] = segments\n const keys = segment === '*' ? Object.keys(record) : [segment!]\n for (const key of keys) {\n if (!Object.hasOwn(record, key) || ['__proto__', 'constructor', 'prototype'].includes(key))\n continue\n if (rest.length === 0)\n record[key] = '[REDACTED]'\n else redactPath(record[key], rest)\n }\n}\n\n// ─── Logger 实现 ───\n\n/**\n * 格式化日志消息。\n *\n * 将消息文本与上下文拼接为单行输出(上下文序列化为 JSON)。\n *\n * @param message - 日志文本\n * @param context - 日志上下文(空对象时不输出)\n * @returns 格式化后的字符串\n */\nfunction formatMessage(message: string, context?: LogContext, format: LogFormat = globalFormat, level: LogLevel = 'info'): string {\n const sanitizedContext = sanitizeLogContext(context)\n\n if (format === 'json')\n return JSON.stringify({ ...sanitizedContext, level, msg: message })\n\n if (!sanitizedContext || Object.keys(sanitizedContext).length === 0) {\n return message\n }\n return `${message} ${JSON.stringify(sanitizedContext)}`\n}\n\n/**\n * 创建 Logger 包装。\n *\n * 将 loglevel 实例包装为统一 Logger 接口,自动合并基础上下文。\n *\n * @param resolveLogger - 当前级别的 loglevel 实例\n * @param resolveContext - 当前基础上下文(会与每次调用时的 ctx 合并)\n * @param resolveFormat - 当前输出格式\n * @returns 统一 Logger 实例\n */\nfunction wrapLoglevel(resolveLogger: () => log.Logger, resolveContext: () => Record<string, unknown>, resolveFormat: () => LogFormat): Logger {\n return {\n trace(message: string, ctx?: LogContext) {\n resolveLogger().trace(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'trace'))\n },\n debug(message: string, ctx?: LogContext) {\n resolveLogger().debug(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'debug'))\n },\n info(message: string, ctx?: LogContext) {\n resolveLogger().info(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'info'))\n },\n warn(message: string, ctx?: LogContext) {\n resolveLogger().warn(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'warn'))\n },\n error(message: string, ctx?: LogContext) {\n resolveLogger().error(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'error'))\n },\n fatal(message: string, ctx?: LogContext) {\n const text = formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'fatal')\n resolveLogger().error(resolveFormat() === 'json' ? text : `[FATAL] ${text}`)\n },\n child(childContext: Record<string, unknown>): Logger {\n return wrapLoglevel(resolveLogger, () => ({ ...resolveContext(), ...childContext }), resolveFormat)\n },\n }\n}\n\n/**\n * 创建 Logger 实例。\n *\n * @param options - Logger 选项\n * @returns Logger 实例\n *\n * @example\n * ```ts\n * const appLogger = logger.createLogger({ name: 'web' })\n * appLogger.info('ready')\n * ```\n */\nfunction createLogger(options: LoggerOptions = {}): Logger {\n const { name, level, format } = options\n const context = { ...options.context }\n\n // 创建或获取 logger 实例\n const loggerInstance = name ? log.getLogger(name) : log\n\n const resolveLogger = (): log.Logger => {\n const effectiveLevel = LEVEL_MAP[level ?? globalLevel]\n if (loggerInstance.getLevel() !== log.levels[String(effectiveLevel).toUpperCase() as keyof typeof log.levels])\n loggerInstance.setLevel(effectiveLevel)\n return loggerInstance\n }\n resolveLogger()\n return wrapLoglevel(resolveLogger, () => ({ ...globalContext, ...context }), () => format ?? globalFormat)\n}\n\n// ─── 默认 Logger 实例 ───\n\n/**\n * 获取默认 Logger 实例(单例)。\n *\n * @example\n * ```ts\n * const defaultLogger = logger.getLogger()\n * ```\n */\nfunction getLogger(): Logger {\n if (!defaultLogger) {\n defaultLogger = createLogger()\n }\n return defaultLogger\n}\n\n// ─── 对外出口 ───\n\n/**\n * 浏览器 Logger 函数集合。\n *\n * @example\n * ```ts\n * logger.createLogger({ name: 'ui' }).info('boot')\n * ```\n */\nexport const logger: LoggerFunctions = {\n configureLogger,\n setLogLevel,\n getLogLevel,\n createLogger,\n getLogger,\n}\n","/**\n * @h-ai/core — Core 服务聚合(浏览器)\n *\n * 提供浏览器环境的 core 对象,聚合常用功能。 所有功能统一通过 core 对象访问(不含 config 能力)。\n * @module core-main.browser\n */\n\nimport type { CoreOptions } from './core-types.js'\nimport { createCore } from './core-main.js'\nimport { config } from './functions/core-function-config.browser.js'\nimport { logger } from './functions/core-function-logger.browser.js'\n\n// ─── Core 实例 ───\n\n/**\n * 创建 Browser 版本的 core 对象。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.logger.info('ready')\n * ```\n */\nfunction createBrowserCore() {\n const baseCore = createCore({\n createLogger: logger.createLogger,\n getLogger: logger.getLogger,\n configureLogger: logger.configureLogger,\n setLogLevel: logger.setLogLevel,\n getLogLevel: logger.getLogLevel,\n })\n\n // 扩展 config 和 init 功能;浏览器端 config 为占位实现,返回明确不支持错误。\n return {\n ...baseCore,\n /** 配置管理(浏览器端不支持文件配置,方法返回 SERVICE_UNAVAILABLE) */\n config,\n /** 初始化 Core */\n init: initCore,\n }\n}\n\n/**\n * Core 服务对象 - 聚合常用功能(浏览器)。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.logger.info('browser ready')\n * ```\n */\nexport const core = createBrowserCore()\n\n/**\n * 初始化 Core(内部实现,通过 core.init() 调用)。\n * 注意:浏览器环境不支持 config 和 watchConfig 选项。\n *\n * @param options - 初始化选项\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.init({ logging: { level: 'debug' } })\n * ```\n */\nfunction initCore(options: CoreOptions = {}): void {\n const logger = core.logger\n\n // 配置日志\n if (options.logging) {\n core.logger.configure(options.logging)\n }\n\n if (options.watchConfig) {\n logger.warn('[core] Browser does not support watchConfig option')\n }\n\n logger.info('[core] Initialized (browser mode)')\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/loglevel/lib/loglevel.js","../src/functions/core-function-config.browser.ts","../src/functions/core-function-logger.browser.ts","../src/core-main.browser.ts"],"names":["defaultLogger","getLogger","logger","config","log"],"mappings":"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","file":"browser.js","sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","/**\n * @h-ai/core — 配置管理(浏览器占位实现)\n *\n * 浏览器环境没有文件系统,不能加载 / 监听 YAML 配置文件。\n * 该实现保持 `core.config` API 形态与 Node.js 一致,但所有文件相关操作\n * 都返回明确的 SERVICE_UNAVAILABLE,避免运行时出现 `core.config` 为 undefined。\n * @module core-function-config.browser\n */\n\nimport type { ZodType } from 'zod'\nimport type { HaiError, HaiResult } from '../core-types.js'\nimport type { ConfigFn, WatchCallback } from './core-function-config.node.js'\nimport { err, HaiCommonError } from '../core-types.js'\nimport { i18n } from '../i18n/core-i18n-utils.js'\n\nfunction unsupported<T>(): HaiResult<T> {\n return err(\n HaiCommonError.SERVICE_UNAVAILABLE,\n i18n.coreM('core_configUnsupportedInBrowser'),\n )\n}\n\nfunction unsupportedError(): HaiError {\n const result = unsupported<never>()\n if (!result.success)\n return result.error\n throw new Error(i18n.coreM('core_configUnsupportedInBrowser'))\n}\n\n/** 浏览器端 config 占位对象,API 与 Node.js config 保持一致。 */\nexport const config: ConfigFn = {\n loadEnvFiles(_options: { mode: string, envDir?: string }): HaiResult<Record<string, string>> {\n return unsupported<Record<string, string>>()\n },\n load<T>(_name: string, _filePath: string, _schema?: ZodType<T>): HaiResult<T> {\n return unsupported<T>()\n },\n\n validate<T>(_name: string, _schema: ZodType<T>): HaiResult<T> {\n return unsupported<T>()\n },\n\n get<T>(_name: string): T | undefined {\n return undefined\n },\n\n getOrThrow<T>(_name: string): T {\n throw new Error(i18n.coreM('core_configUnsupportedInBrowser'))\n },\n\n reload(_name: string): HaiResult<unknown> {\n return unsupported<unknown>()\n },\n\n has(_name: string): boolean {\n return false\n },\n\n clear(_name?: string): void {\n // 浏览器端无配置缓存,无需操作。\n },\n\n keys(): string[] {\n return []\n },\n\n watch<T = unknown>(_name: string, callback: WatchCallback<T>): () => void {\n callback(null, unsupportedError())\n return () => { }\n },\n\n unwatch(_name?: string): void {\n // 浏览器端无 watcher,无需操作。\n },\n\n isWatching(_name: string): boolean {\n return false\n },\n}\n\n/** config 子工具类型 */\nexport type BrowserConfigFn = typeof config\n","/**\n * @h-ai/core — Logger(浏览器版本,基于 loglevel)\n *\n * 提供统一的日志接口,浏览器环境使用 loglevel 实现。\n * @module core-function-logger.browser\n */\n\nimport type { LogFormat, LoggingConfig, LogLevel } from '../core-config.js'\nimport type { LogContext, Logger, LoggerFunctions, LoggerOptions } from '../core-types.js'\nimport log from 'loglevel'\nimport { sanitize as sanitizeUtils } from '../utils/core-util-sanitize.js'\n\n// ─── 全局配置 ───\n\n/** 全局日志级别(默认 'info') */\nlet globalLevel: LogLevel = 'info'\n\n/** 浏览器默认可读输出;可配置 JSON 格式用于采集。 */\nlet globalFormat: LogFormat = 'pretty'\n\n/** 附加脱敏路径,与默认凭据脱敏同时生效。 */\nlet globalRedact: string[] = []\n\n/** 全局默认上下文(每条日志自动附带) */\nlet globalContext: Record<string, unknown> = {}\n\n/** 默认 Logger 单例缓存 */\nlet defaultLogger: Logger | null = null\n\n/**\n * LogLevel 到 loglevel 库级别的映射。\n *\n * loglevel 不支持 fatal,映射为 error。\n */\nconst LEVEL_MAP: Record<LogLevel, log.LogLevelDesc> = {\n trace: 'trace',\n debug: 'debug',\n info: 'info',\n warn: 'warn',\n error: 'error',\n fatal: 'error', // loglevel 没有 fatal\n}\n\n/**\n * 配置全局 Logger 选项。\n *\n * @param config - 日志配置\n *\n * @example\n * ```ts\n * logger.configureLogger({ level: 'debug' })\n * ```\n */\nfunction configureLogger(config: Partial<LoggingConfig>): void {\n if (config.level) {\n globalLevel = config.level\n log.setLevel(LEVEL_MAP[config.level])\n }\n if (config.context) {\n globalContext = { ...globalContext, ...config.context }\n }\n if (config.format)\n globalFormat = config.format\n if (config.redact)\n globalRedact = [...config.redact]\n}\n\n/**\n * 设置全局日志级别。\n *\n * @param level - 日志级别\n *\n * @example\n * ```ts\n * logger.setLogLevel('warn')\n * ```\n */\nfunction setLogLevel(level: LogLevel): void {\n globalLevel = level\n log.setLevel(LEVEL_MAP[level])\n}\n\n/**\n * 获取当前全局日志级别。\n *\n * @example\n * ```ts\n * const level = logger.getLogLevel()\n * ```\n */\nfunction getLogLevel(): LogLevel {\n return globalLevel\n}\n\nfunction sanitizeLogContext(ctx?: LogContext): LogContext | undefined {\n if (!ctx || Object.keys(ctx).length === 0) {\n return ctx\n }\n\n const sanitized = sanitizeUtils.sanitizeSensitiveFields(ctx)\n for (const path of globalRedact)\n redactPath(sanitized, path.match(/\\*|[^.[\\]\"']+/g) ?? [])\n return sanitized\n}\n\n/** 在已脱敏的副本上处理点/括号路径和通配符,不修改调用方原始对象。 */\nfunction redactPath(value: unknown, segments: string[]): void {\n if (!value || typeof value !== 'object' || segments.length === 0)\n return\n const record = value as Record<string, unknown>\n const [segment, ...rest] = segments\n const keys = segment === '*' ? Object.keys(record) : [segment!]\n for (const key of keys) {\n if (!Object.hasOwn(record, key) || ['__proto__', 'constructor', 'prototype'].includes(key))\n continue\n if (rest.length === 0)\n record[key] = '[REDACTED]'\n else redactPath(record[key], rest)\n }\n}\n\n// ─── Logger 实现 ───\n\n/**\n * 格式化日志消息。\n *\n * 将消息文本与上下文拼接为单行输出(上下文序列化为 JSON)。\n *\n * @param message - 日志文本\n * @param context - 日志上下文(空对象时不输出)\n * @returns 格式化后的字符串\n */\nfunction formatMessage(message: string, context?: LogContext, format: LogFormat = globalFormat, level: LogLevel = 'info'): string {\n const sanitizedContext = sanitizeLogContext(context)\n\n if (format === 'json')\n return JSON.stringify({ ...sanitizedContext, level, msg: message })\n\n if (!sanitizedContext || Object.keys(sanitizedContext).length === 0) {\n return message\n }\n return `${message} ${JSON.stringify(sanitizedContext)}`\n}\n\n/**\n * 创建 Logger 包装。\n *\n * 将 loglevel 实例包装为统一 Logger 接口,自动合并基础上下文。\n *\n * @param resolveLogger - 当前级别的 loglevel 实例\n * @param resolveContext - 当前基础上下文(会与每次调用时的 ctx 合并)\n * @param resolveFormat - 当前输出格式\n * @returns 统一 Logger 实例\n */\nfunction wrapLoglevel(resolveLogger: () => log.Logger, resolveContext: () => Record<string, unknown>, resolveFormat: () => LogFormat): Logger {\n return {\n trace(message: string, ctx?: LogContext) {\n resolveLogger().trace(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'trace'))\n },\n debug(message: string, ctx?: LogContext) {\n resolveLogger().debug(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'debug'))\n },\n info(message: string, ctx?: LogContext) {\n resolveLogger().info(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'info'))\n },\n warn(message: string, ctx?: LogContext) {\n resolveLogger().warn(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'warn'))\n },\n error(message: string, ctx?: LogContext) {\n resolveLogger().error(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'error'))\n },\n fatal(message: string, ctx?: LogContext) {\n const text = formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'fatal')\n resolveLogger().error(resolveFormat() === 'json' ? text : `[FATAL] ${text}`)\n },\n child(childContext: Record<string, unknown>): Logger {\n return wrapLoglevel(resolveLogger, () => ({ ...resolveContext(), ...childContext }), resolveFormat)\n },\n }\n}\n\n/**\n * 创建 Logger 实例。\n *\n * @param options - Logger 选项\n * @returns Logger 实例\n *\n * @example\n * ```ts\n * const appLogger = logger.createLogger({ name: 'web' })\n * appLogger.info('ready')\n * ```\n */\nfunction createLogger(options: LoggerOptions = {}): Logger {\n const { name, level, format } = options\n const context = { ...options.context }\n\n // 创建或获取 logger 实例\n const loggerInstance = name ? log.getLogger(name) : log\n\n const resolveLogger = (): log.Logger => {\n const effectiveLevel = LEVEL_MAP[level ?? globalLevel]\n if (loggerInstance.getLevel() !== log.levels[String(effectiveLevel).toUpperCase() as keyof typeof log.levels])\n loggerInstance.setLevel(effectiveLevel)\n return loggerInstance\n }\n resolveLogger()\n return wrapLoglevel(resolveLogger, () => ({ ...globalContext, ...context }), () => format ?? globalFormat)\n}\n\n// ─── 默认 Logger 实例 ───\n\n/**\n * 获取默认 Logger 实例(单例)。\n *\n * @example\n * ```ts\n * const defaultLogger = logger.getLogger()\n * ```\n */\nfunction getLogger(): Logger {\n if (!defaultLogger) {\n defaultLogger = createLogger()\n }\n return defaultLogger\n}\n\n// ─── 对外出口 ───\n\n/**\n * 浏览器 Logger 函数集合。\n *\n * @example\n * ```ts\n * logger.createLogger({ name: 'ui' }).info('boot')\n * ```\n */\nexport const logger: LoggerFunctions = {\n configureLogger,\n setLogLevel,\n getLogLevel,\n createLogger,\n getLogger,\n}\n","/**\n * @h-ai/core — Core 服务聚合(浏览器)\n *\n * 提供浏览器环境的 core 对象,聚合常用功能。 所有功能统一通过 core 对象访问(不含 config 能力)。\n * @module core-main.browser\n */\n\nimport type { CoreOptions } from './core-types.js'\nimport { createCore } from './core-main.js'\nimport { config } from './functions/core-function-config.browser.js'\nimport { logger } from './functions/core-function-logger.browser.js'\n\n// ─── Core 实例 ───\n\n/**\n * 创建 Browser 版本的 core 对象。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.logger.info('ready')\n * ```\n */\nfunction createBrowserCore() {\n const baseCore = createCore({\n createLogger: logger.createLogger,\n getLogger: logger.getLogger,\n configureLogger: logger.configureLogger,\n setLogLevel: logger.setLogLevel,\n getLogLevel: logger.getLogLevel,\n })\n\n // 扩展 config 和 init 功能;浏览器端 config 为占位实现,返回明确不支持错误。\n return {\n ...baseCore,\n /** 配置管理(浏览器端不支持文件配置,方法返回 SERVICE_UNAVAILABLE) */\n config,\n /** 初始化 Core */\n init: initCore,\n }\n}\n\n/**\n * Core 服务对象 - 聚合常用功能(浏览器)。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.logger.info('browser ready')\n * ```\n */\nexport const core = createBrowserCore()\n\n/**\n * 初始化 Core(内部实现,通过 core.init() 调用)。\n * 注意:浏览器环境不支持 config 和 watchConfig 选项。\n *\n * @param options - 初始化选项\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.init({ logging: { level: 'debug' } })\n * ```\n */\nfunction initCore(options: CoreOptions = {}): void {\n const logger = core.logger\n\n // 配置日志\n if (options.logging) {\n core.logger.configure(options.logging)\n }\n\n if (options.watchConfig) {\n logger.warn('[core] Browser does not support watchConfig option')\n }\n\n logger.info('[core] Initialized (browser mode)')\n}\n"]}
|
package/dist/{core-function-config.node-CwXAT7fW.d.ts → core-function-config.node-7KVlEiFk.d.ts}
RENAMED
|
@@ -1781,6 +1781,28 @@ type WatchCallback<T = unknown> = (config: T | null, error?: HaiError) => void;
|
|
|
1781
1781
|
* ```
|
|
1782
1782
|
*/
|
|
1783
1783
|
declare const config: {
|
|
1784
|
+
/**
|
|
1785
|
+
* 读取 dotenv 文件并按统一顺序合并,不修改进程环境。
|
|
1786
|
+
*
|
|
1787
|
+
* 优先级:已有进程环境 > .env.local > .env.<mode> > .env。
|
|
1788
|
+
* development/production 分别映射到 dev/prod;不存在的文件跳过。
|
|
1789
|
+
* 返回值可能包含私有配置,仅在 Node 启动/构建边界注入,不下发浏览器。
|
|
1790
|
+
* @param options - 文件所在目录及环境模式
|
|
1791
|
+
* @param options.mode - dev/test/prod 或 Vite 的 development/production
|
|
1792
|
+
* @param options.envDir - dotenv 所在目录,默认进程工作目录
|
|
1793
|
+
* @returns 已合并的变量;非法模式或读取失败返回配置错误,不包含文件内容
|
|
1794
|
+
* @example
|
|
1795
|
+
* ```ts
|
|
1796
|
+
* const env = core.config.loadEnvFiles({ mode: 'dev', envDir: '.' })
|
|
1797
|
+
* if (!env.success) throw new Error(env.error.message)
|
|
1798
|
+
* Object.assign(process.env, env.data)
|
|
1799
|
+
* core.init({ configDir: './config' })
|
|
1800
|
+
* ```
|
|
1801
|
+
*/
|
|
1802
|
+
loadEnvFiles(options: {
|
|
1803
|
+
mode: string;
|
|
1804
|
+
envDir?: string;
|
|
1805
|
+
}): HaiResult<Record<string, string>>;
|
|
1784
1806
|
/**
|
|
1785
1807
|
* 加载配置到缓存。
|
|
1786
1808
|
*
|
package/dist/node.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { h as CoreFunctions, a1 as config, C as CoreOptions } from './core-function-config.node-
|
|
2
|
-
export { f as CoreConfig, g as CoreConfigSchema, a as CoreLogger, i as Env, j as EnvSchema, k as ErrorInfo, l as ErrorInfoValue, m as HaiCommonError, n as HaiConfigError, o as HaiError, p as HaiErrorDef, H as HaiResult, q as IdConfig, r as IdConfigSchema, s as InterpolationParams, L as Locale, t as LocaleInfo, u as LocaleMessages, v as LogContext, w as LogFormat, x as LogFormatSchema, y as LogLevel, B as LogLevelSchema, D as Logger, F as LoggerFunctions, G as LoggerOptions, J as LoggingConfig, K as LoggingConfigSchema, N as MatchHandlers, P as MessageDictionary, Q as MessageOptions, R as PaginatedResult, U as PaginationOptions, V as PaginationOptionsInput, X as ValidationFormError, Z as ZodMessageGetter, Y as ZodValidationFn, _ as ZodValidationMessageKey, $ as err, a0 as ok } from './core-function-config.node-
|
|
1
|
+
import { h as CoreFunctions, a1 as config, C as CoreOptions } from './core-function-config.node-7KVlEiFk.js';
|
|
2
|
+
export { f as CoreConfig, g as CoreConfigSchema, a as CoreLogger, i as Env, j as EnvSchema, k as ErrorInfo, l as ErrorInfoValue, m as HaiCommonError, n as HaiConfigError, o as HaiError, p as HaiErrorDef, H as HaiResult, q as IdConfig, r as IdConfigSchema, s as InterpolationParams, L as Locale, t as LocaleInfo, u as LocaleMessages, v as LogContext, w as LogFormat, x as LogFormatSchema, y as LogLevel, B as LogLevelSchema, D as Logger, F as LoggerFunctions, G as LoggerOptions, J as LoggingConfig, K as LoggingConfigSchema, N as MatchHandlers, P as MessageDictionary, Q as MessageOptions, R as PaginatedResult, U as PaginationOptions, V as PaginationOptionsInput, X as ValidationFormError, Z as ZodMessageGetter, Y as ZodValidationFn, _ as ZodValidationMessageKey, $ as err, a0 as ok } from './core-function-config.node-7KVlEiFk.js';
|
|
3
3
|
import 'zod';
|
|
4
4
|
|
|
5
5
|
/**
|
package/dist/node.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createCore, i18n, err, HaiConfigError, ok, sanitize, typeUtils, CoreConfigSchema } from './chunk-RXNSRXYF.js';
|
|
2
2
|
export { CoreConfigSchema, EnvSchema, HaiCommonError, HaiConfigError, IdConfigSchema, LogFormatSchema, LogLevelSchema, LoggingConfigSchema, err, ok } from './chunk-RXNSRXYF.js';
|
|
3
|
-
import { existsSync, readdirSync, watch
|
|
3
|
+
import { existsSync, readFileSync, readdirSync, watch } from 'fs';
|
|
4
4
|
import { join } from 'path';
|
|
5
5
|
import process2 from 'process';
|
|
6
|
+
import { parseEnv } from 'util';
|
|
6
7
|
import { parse } from 'yaml';
|
|
7
8
|
import { execSync } from 'child_process';
|
|
8
9
|
import { createRequire } from 'module';
|
|
@@ -46,7 +47,7 @@ function resolveEnv(value, name, path = []) {
|
|
|
46
47
|
if (envValue === void 0 && defaultValue === void 0) {
|
|
47
48
|
return err(HaiConfigError.CONFIG_ENV_VAR_MISSING, i18n.coreM("core_configEnvVarMissing", { params: { varName } }));
|
|
48
49
|
}
|
|
49
|
-
result = result.replace(fullMatch, envValue ?? defaultValue ?? "");
|
|
50
|
+
result = result.replace(fullMatch, () => envValue ?? defaultValue ?? "");
|
|
50
51
|
}
|
|
51
52
|
if (FULL_VAR_PATTERN.test(value))
|
|
52
53
|
return ok(parseEnvValue(result));
|
|
@@ -251,6 +252,45 @@ function clearCache(name) {
|
|
|
251
252
|
}
|
|
252
253
|
}
|
|
253
254
|
var config = {
|
|
255
|
+
/**
|
|
256
|
+
* 读取 dotenv 文件并按统一顺序合并,不修改进程环境。
|
|
257
|
+
*
|
|
258
|
+
* 优先级:已有进程环境 > .env.local > .env.<mode> > .env。
|
|
259
|
+
* development/production 分别映射到 dev/prod;不存在的文件跳过。
|
|
260
|
+
* 返回值可能包含私有配置,仅在 Node 启动/构建边界注入,不下发浏览器。
|
|
261
|
+
* @param options - 文件所在目录及环境模式
|
|
262
|
+
* @param options.mode - dev/test/prod 或 Vite 的 development/production
|
|
263
|
+
* @param options.envDir - dotenv 所在目录,默认进程工作目录
|
|
264
|
+
* @returns 已合并的变量;非法模式或读取失败返回配置错误,不包含文件内容
|
|
265
|
+
* @example
|
|
266
|
+
* ```ts
|
|
267
|
+
* const env = core.config.loadEnvFiles({ mode: 'dev', envDir: '.' })
|
|
268
|
+
* if (!env.success) throw new Error(env.error.message)
|
|
269
|
+
* Object.assign(process.env, env.data)
|
|
270
|
+
* core.init({ configDir: './config' })
|
|
271
|
+
* ```
|
|
272
|
+
*/
|
|
273
|
+
loadEnvFiles(options) {
|
|
274
|
+
const mode = options.mode === "development" ? "dev" : options.mode === "production" ? "prod" : options.mode;
|
|
275
|
+
if (!/^[a-z0-9][\w-]*$/i.test(mode))
|
|
276
|
+
return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM("core_configValidationFailed"));
|
|
277
|
+
const envDir = options.envDir ?? process2.cwd();
|
|
278
|
+
try {
|
|
279
|
+
const merged = {};
|
|
280
|
+
for (const name of [".env", `.env.${mode}`, ".env.local"]) {
|
|
281
|
+
const file = join(envDir, name);
|
|
282
|
+
if (existsSync(file))
|
|
283
|
+
Object.assign(merged, parseEnv(readFileSync(file, "utf8")));
|
|
284
|
+
}
|
|
285
|
+
for (const name of Object.keys(merged)) {
|
|
286
|
+
if (process2.env[name] !== void 0)
|
|
287
|
+
merged[name] = process2.env[name];
|
|
288
|
+
}
|
|
289
|
+
return ok(merged);
|
|
290
|
+
} catch {
|
|
291
|
+
return err(HaiConfigError.CONFIG_PARSE_ERROR, i18n.coreM("core_configParseFailed", { params: { filePath: envDir } }));
|
|
292
|
+
}
|
|
293
|
+
},
|
|
254
294
|
/**
|
|
255
295
|
* 加载配置到缓存。
|
|
256
296
|
*
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/functions/core-function-config.node.ts","../src/functions/core-function-logger.node.ts","../src/core-main.node.ts"],"names":["process","result","config","logger","existsSync"],"mappings":"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","file":"node.js","sourcesContent":["/**\n * @h-ai/core — 配置管理(Node.js 专用)\n *\n * 提供 YAML 配置文件加载、约定式环境变量映射、显式环境变量插值、缓存管理。\n * @module core-function-config.node\n */\n\nimport type { ZodType } from 'zod'\nimport type { HaiError, HaiResult } from '../core-types.js'\n\nimport { existsSync, readFileSync, watch } from 'node:fs'\nimport process from 'node:process'\nimport { parse } from 'yaml'\n\n// ─── 配置文件监听 ───\n\nimport { err, HaiConfigError, ok } from '../core-types.js'\nimport { i18n } from '../i18n/core-i18n-utils.js'\nimport { typeUtils } from '../utils/core-util-type.js'\n\n/** 缓存项(存储已加载的配置及其元信息) */\ninterface CacheEntry<T = unknown> {\n /** 解析后的配置数据 */\n data: T\n /** 配置文件路径 */\n filePath: string\n /** Zod 校验 Schema(重载时复用,无 Schema 加载时为 undefined) */\n schema?: ZodType<T>\n /** 加载时间戳(毫秒) */\n loadedAt: number\n}\n\n// ─── 内部工具 ───\n\n/** 环境变量插值正则(支持 ${VAR} 与 ${VAR:default}) */\nconst ENV_VAR_PATTERN = /\\$\\{([^}:]+)(?::([^}]*))?\\}/g\n\n/** 判断整个字符串是否恰好是单个 ${VAR} 或 ${VAR:default}(用于类型还原) */\nconst FULL_VAR_PATTERN = /^\\$\\{[^}:]+(?::[^}]*)?\\}$/\n\n/**\n * 将环境变量字符串按 YAML 标量规则还原类型。\n *\n * @param value - 环境变量原始字符串\n * @returns 空字符串保持不变;其余值尽量还原为 YAML 原生类型\n */\nfunction parseEnvValue(value: string): unknown {\n // YAML 会把空文档解析为 null;空环境变量仍是明确的字符串值,不能改变其类型。\n if (value === '')\n return ''\n\n try {\n const parsed = parse(value)\n return parsed === undefined ? value : parsed\n }\n catch {\n return value\n }\n}\n\n/**\n * 将配置名或 YAML 路径片段规范化为环境变量片段。\n *\n * camelCase 不拆词,例如 apiKey → APIKEY;非字母数字字符统一为下划线。\n *\n * @param segment - 配置名、键名或数组索引\n * @returns 可用于环境变量名的片段\n */\nfunction normalizeEnvSegment(segment: string): string {\n return segment\n .replace(/[^a-z0-9]+/gi, '_')\n .replace(/^_+|_+$/g, '')\n .toUpperCase()\n}\n\n/**\n * 构建配置项的约定环境变量名。\n *\n * @example `ai` + `llm.apiKey` → `HAI_AI_LLM_APIKEY`\n *\n * @param name - 配置名称\n * @param path - YAML 中从根到叶子的键路径;数组索引也作为一段\n * @returns 以 HAI 开头的环境变量名\n */\nfunction buildConventionEnvName(name: string, path: string[]): string {\n return ['HAI', name, ...path]\n .map(normalizeEnvSegment)\n .filter(Boolean)\n .join('_')\n}\n\n/**\n * 解析配置中的环境变量。\n *\n * 每个叶子配置项都会优先读取 `HAI_<配置名>_<YAML 路径>`;\n * 约定变量不存在时再解析显式 `${VAR}`,显式语法用于指定特殊变量名。\n *\n * @param value - 任意配置值(字符串、数组、对象或原始值)\n * @param name - 配置名称\n * @param path - 当前值的 YAML 路径\n * @returns 插值后的结果;当环境变量缺失且未提供默认值时返回 ENV_VAR_MISSING 错误\n */\nfunction resolveEnv(value: unknown, name: string, path: string[] = []): HaiResult<unknown> {\n // 对象和数组也可整体覆盖,云配置可以注入原 YAML 未声明的连接字段。\n const conventionEnvValue = process.env[buildConventionEnvName(name, path)]\n if (conventionEnvValue !== undefined)\n return ok(parseEnvValue(conventionEnvValue))\n\n if (typeof value === 'string') {\n ENV_VAR_PATTERN.lastIndex = 0\n const hasExplicitEnv = ENV_VAR_PATTERN.test(value)\n ENV_VAR_PATTERN.lastIndex = 0\n\n if (!hasExplicitEnv)\n return ok(value)\n\n let result = value\n // 避免在 while 条件中赋值(满足 lint 规则 no-cond-assign)\n while (true) {\n const match = ENV_VAR_PATTERN.exec(value)\n if (!match)\n break\n\n const [fullMatch, varName, defaultValue] = match\n const envValue = process.env[varName]\n\n // 未提供默认值且环境变量不存在时,返回错误\n if (envValue === undefined && defaultValue === undefined) {\n return err(HaiConfigError.CONFIG_ENV_VAR_MISSING, i18n.coreM('core_configEnvVarMissing', { params: { varName } }))\n }\n result = result.replace(fullMatch, envValue ?? defaultValue ?? '')\n }\n\n // 当原值整体是单个 ${VAR:default} 时,插值结果需还原为 YAML 原生类型。\n if (FULL_VAR_PATTERN.test(value))\n return ok(parseEnvValue(result))\n\n return ok(result)\n }\n\n if (Array.isArray(value)) {\n const results: unknown[] = []\n for (const [index, item] of value.entries()) {\n const r = resolveEnv(item, name, [...path, String(index)])\n if (!r.success)\n return r\n results.push(r.data)\n }\n return ok(results)\n }\n\n if (typeUtils.isObject(value)) {\n const results: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) {\n const r = resolveEnv(v, name, [...path, k])\n if (!r.success)\n return r\n results[k] = r.data\n }\n return ok(results)\n }\n\n return ok(value)\n}\n\n// ─── 配置管理器 ───\n\n/** 配置缓存 */\nconst configCache = new Map<string, CacheEntry>()\n\n/**\n * 监听回调类型。\n *\n * @template T - 配置数据类型\n *\n * @example\n * ```ts\n * const callback: WatchCallback<AppConfig> = (cfg, error) => {\n * if (error) { core.logger.error('Config reload failed', { error }); return }\n * // 使用更新后的 cfg\n * }\n * ```\n */\nexport type WatchCallback<T = unknown> = (config: T | null, error?: HaiError) => void\n\n/** 配置监听条目(包含文件 watcher 和回调集合) */\ninterface WatchEntry {\n /** fs.watch 返回的 watcher 实例 */\n watcher: ReturnType<typeof watch>\n /** 已注册的回调函数集合 */\n callbacks: Set<WatchCallback<unknown>>\n /** 防抖定时器(用于 stopWatching 时清理) */\n debounceTimer: ReturnType<typeof setTimeout> | null\n}\n\n/** 配置监听映射 */\nconst watchEntries = new Map<string, WatchEntry>()\n\n/**\n * 创建未加载错误。\n *\n * @param name - 配置名称\n * @returns HaiError,错误码为 NOT_LOADED\n */\nfunction createNotLoadedError(name: string): HaiError {\n const result = err(HaiConfigError.CONFIG_NOT_LOADED, i18n.coreM('core_configNotLoaded', { params: { name } }))\n if (!result.success)\n return result.error\n\n throw new Error('unreachable')\n}\n\n/**\n * 通知监听回调。\n *\n * @param name - 配置名称\n * @param result - 重载结果(成功时传配置数据,失败时传错误)\n */\nfunction notifyWatchCallbacks(name: string, result: HaiResult<unknown>): void {\n const entry = watchEntries.get(name)\n if (!entry)\n return\n\n if (result.success) {\n for (const callback of entry.callbacks) {\n try {\n callback(result.data, undefined)\n }\n catch { /* 隔离单个回调异常,不影响其他回调 */ }\n }\n }\n else {\n for (const callback of entry.callbacks) {\n try {\n callback(null, result.error)\n }\n catch { /* 隔离单个回调异常,不影响其他回调 */ }\n }\n }\n}\n\n/**\n * 加载 YAML 配置文件(不带 Schema 验证)。\n *\n * 流程:检查文件存在 → 读取 YAML → 约定式环境变量映射与显式插值。\n *\n * @param name - 配置名称,用于生成 `HAI_<配置名>_<YAML 路径>` 环境变量名\n * @param filePath - YAML 文件路径\n * @returns 解析结果;可能的错误码:FILE_NOT_FOUND / PARSE_ERROR / ENV_VAR_MISSING\n */\nfunction loadYaml(name: string, filePath: string): HaiResult<unknown> {\n if (!existsSync(filePath)) {\n return err(HaiConfigError.CONFIG_FILE_NOT_FOUND, i18n.coreM('core_configFileNotExist', { params: { filePath } }))\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n const parsed = parse(content)\n return resolveEnv(parsed, name)\n }\n catch (error) {\n return err(HaiConfigError.CONFIG_PARSE_ERROR, i18n.coreM('core_configParseFailed', { params: { filePath } }), error)\n }\n}\n\n/**\n * 加载并验证配置文件。\n *\n * 流程:加载 YAML → 环境变量映射与插值 → Zod Schema 校验。\n *\n * @param name - 配置名称\n * @param filePath - YAML 文件路径\n * @param schema - Zod 校验 Schema\n * @returns 校验后的配置数据;可能的错误码:FILE_NOT_FOUND / PARSE_ERROR / ENV_VAR_MISSING / VALIDATION_ERROR\n */\nfunction loadConfig<T>(\n name: string,\n filePath: string,\n schema: ZodType<T>,\n): HaiResult<T> {\n const yamlResult = loadYaml(name, filePath)\n if (!yamlResult.success)\n return yamlResult\n\n const parseResult = schema.safeParse(yamlResult.data)\n if (!parseResult.success) {\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'), parseResult.error.issues)\n }\n\n return ok(parseResult.data)\n}\n\n/**\n * 加载配置并写入缓存。\n *\n * @param name - 配置名称(缓存 key)\n * @param filePath - YAML 文件路径\n * @param schema - 可选 Zod Schema(不传则跳过校验)\n * @returns 加载结果;成功时同时更新缓存\n */\nfunction loadAndCache<T>(\n name: string,\n filePath: string,\n schema?: ZodType<T>,\n): HaiResult<T> {\n const result = schema ? loadConfig(name, filePath, schema) : loadYaml(name, filePath) as HaiResult<T>\n if (result.success) {\n configCache.set(name, {\n data: result.data,\n filePath,\n schema: schema as ZodType<unknown> | undefined,\n loadedAt: Date.now(),\n })\n }\n return result\n}\n\n/**\n * 校验已加载的配置并写回缓存。\n *\n * 从缓存中取出原始数据重新用 Schema 校验,校验通过后更新缓存。\n *\n * @param name - 配置名称\n * @param schema - Zod Schema\n * @returns 校验结果;未加载时返回 NOT_LOADED,校验失败返回 VALIDATION_ERROR\n */\nfunction validateLoadedConfig<T>(name: string, schema: ZodType<T>): HaiResult<T> {\n const entry = configCache.get(name)\n if (!entry) {\n return err(createNotLoadedError(name))\n }\n\n const parseResult = schema.safeParse(entry.data)\n if (!parseResult.success) {\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'), parseResult.error.issues)\n }\n\n const validated = parseResult.data\n configCache.set(name, {\n ...entry,\n data: validated,\n schema,\n loadedAt: Date.now(),\n })\n\n return ok(validated)\n}\n\n/**\n * 重新加载配置并通知监听器。\n *\n * 从缓存中获取文件路径和 Schema,重新加载并触发所有 watch 回调。\n *\n * @param name - 配置名称\n * @returns 重载结果;未加载时返回 NOT_LOADED\n */\nfunction reloadAndNotify(name: string): HaiResult<unknown> {\n const entry = configCache.get(name)\n if (!entry) {\n const result = err(createNotLoadedError(name))\n notifyWatchCallbacks(name, result)\n return result\n }\n\n // 无 Schema 时直接加载 YAML(不做校验),避免 schema 为 undefined 导致运行时崩溃\n const result = entry.schema ? loadConfig(name, entry.filePath, entry.schema) : loadYaml(name, entry.filePath)\n if (result.success) {\n configCache.set(name, {\n ...entry,\n data: result.data,\n loadedAt: Date.now(),\n })\n }\n notifyWatchCallbacks(name, result)\n return result\n}\n\n/**\n * 启动配置文件监听。\n *\n * 使用 `fs.watch` 监听文件变更,变更时自动重载并通知回调。\n * 同一配置名只会创建一个 watcher,多次调用返回同一实例。\n *\n * @param name - 配置名称\n * @returns WatchEntry 实例;配置未加载时返回 null\n */\nfunction startFileWatcher(name: string): WatchEntry | null {\n const existing = watchEntries.get(name)\n if (existing)\n return existing\n\n const entry = configCache.get(name)\n if (!entry)\n return null\n\n try {\n const watchEntry: WatchEntry = {\n watcher: null!,\n callbacks: new Set(),\n debounceTimer: null,\n }\n\n // 防抖定时器:fs.watch 可能对同一次文件保存触发多次 'change' 事件\n const watcher = watch(entry.filePath, (eventType) => {\n if (eventType === 'change') {\n if (watchEntry.debounceTimer)\n clearTimeout(watchEntry.debounceTimer)\n watchEntry.debounceTimer = setTimeout(() => {\n watchEntry.debounceTimer = null\n reloadAndNotify(name)\n }, 100)\n }\n })\n\n watchEntry.watcher = watcher\n watchEntries.set(name, watchEntry)\n return watchEntry\n }\n catch {\n return null\n }\n}\n\n/**\n * 注册监听回调。\n *\n * 启动文件 watcher(若尚未启动)并注册回调。\n * 配置未加载时立即回调 NOT_LOADED 错误。\n *\n * @param name - 配置名称\n * @param callback - 变更回调\n * @returns 取消监听函数;调用后自动清理(无回调时关闭 watcher)\n */\nfunction registerWatch<T>(name: string, callback: WatchCallback<T>): () => void {\n const entry = startFileWatcher(name)\n if (!entry) {\n callback(null, createNotLoadedError(name))\n return () => { }\n }\n\n entry.callbacks.add(callback as WatchCallback<unknown>)\n\n return () => {\n const current = watchEntries.get(name)\n if (!current)\n return\n\n current.callbacks.delete(callback as WatchCallback<unknown>)\n if (current.callbacks.size === 0) {\n if (current.debounceTimer)\n clearTimeout(current.debounceTimer)\n current.watcher.close()\n watchEntries.delete(name)\n }\n }\n}\n\n/**\n * 停止监听(内部实现)。\n *\n * @param name - 配置名称;不传则停止所有监听并清空映射\n */\nfunction stopWatching(name?: string): void {\n if (name) {\n const entry = watchEntries.get(name)\n if (entry) {\n if (entry.debounceTimer)\n clearTimeout(entry.debounceTimer)\n entry.watcher.close()\n watchEntries.delete(name)\n }\n }\n else {\n for (const entry of watchEntries.values()) {\n if (entry.debounceTimer)\n clearTimeout(entry.debounceTimer)\n entry.watcher.close()\n }\n watchEntries.clear()\n }\n}\n\n/**\n * 清理缓存(同时停止对应监听)。\n *\n * @param name - 配置名称;不传则清理全部缓存并停止所有监听\n */\nfunction clearCache(name?: string): void {\n if (name) {\n configCache.delete(name)\n stopWatching(name)\n }\n else {\n configCache.clear()\n stopWatching()\n }\n}\n\n/**\n * 配置管理对象。\n *\n * @example\n * ```ts\n * const result = config.load('app', './config/app.yml')\n * if (result.success) {\n * const cfg = config.get('app')\n * }\n * ```\n */\nexport const config = {\n /**\n * 加载配置到缓存。\n *\n * 加载 YAML 文件并可选地用 Zod Schema 校验,成功后写入缓存。\n *\n * @param name - 配置名称(缓存 key)\n * @param filePath - YAML 文件路径\n * @param schema - 可选 Zod Schema(不传则跳过校验)\n * @returns 成功时返回解析后的配置数据;失败时返回 HaiError\n *\n * @example\n * ```ts\n * const result = config.load('core', './config/_core.yml', CoreConfigSchema)\n * if (result.success) {\n * // result.data 为校验后的配置\n * }\n * ```\n */\n load<T>(name: string, filePath: string, schema?: ZodType<T>): HaiResult<T> {\n return loadAndCache(name, filePath, schema)\n },\n\n /**\n * 验证已加载的配置数据。\n *\n * 对缓存中的配置数据重新用 Schema 校验,校验通过后更新缓存。\n *\n * @param name - 配置名称\n * @param schema - Zod 验证模式\n * @returns 校验结果;未加载时返回 NOT_LOADED,格式错误返回 VALIDATION_ERROR\n *\n * @example\n * ```ts\n * const result = config.validate('app', AppSchema)\n * if (!result.success) {\n * // result.error.code 可能为 NOT_LOADED 或 VALIDATION_ERROR\n * }\n * ```\n */\n validate<T>(name: string, schema: ZodType<T>): HaiResult<T> {\n return validateLoadedConfig(name, schema)\n },\n\n /**\n * 获取已加载的配置。\n *\n * @param name - 配置名称\n * @returns 配置数据;未加载时返回 undefined\n *\n * @example\n * ```ts\n * const cfg = config.get<CoreConfig>('core')\n * if (cfg) {\n * // 使用 cfg\n * }\n * ```\n */\n get<T>(name: string): T | undefined {\n return configCache.get(name)?.data as T | undefined\n },\n\n /**\n * 获取配置,不存在时抛出错误。\n *\n * @param name - 配置名称\n * @returns 配置数据\n * @throws 配置未加载时抛出 Error\n *\n * @example\n * ```ts\n * try {\n * const cfg = config.getOrThrow<CoreConfig>('core')\n * } catch (e) {\n * // 配置未加载\n * }\n * ```\n */\n getOrThrow<T>(name: string): T {\n const data = this.get<T>(name)\n if (data === undefined) {\n throw new Error(i18n.coreM('core_configNotLoaded', { params: { name } }))\n }\n return data\n },\n\n /**\n * 重新加载配置。\n *\n * 从磁盘重新读取配置文件并更新缓存,同时通知所有 watch 回调。\n *\n * @param name - 配置名称\n * @returns 重载结果;未加载时返回 NOT_LOADED\n *\n * @example\n * ```ts\n * const result = config.reload('app')\n * ```\n */\n reload(name: string): HaiResult<unknown> {\n return reloadAndNotify(name)\n },\n\n /**\n * 检查配置是否已加载。\n *\n * @param name - 配置名称\n * @returns 是否已加载到缓存\n *\n * @example\n * ```ts\n * if (config.has('db')) {\n * const dbCfg = config.get('db')\n * }\n * ```\n */\n has(name: string): boolean {\n return configCache.has(name)\n },\n\n /**\n * 清除配置缓存(同时停止对应监听)。\n *\n * @param name - 配置名称;不传则清除全部\n *\n * @example\n * ```ts\n * config.clear('app') // 清除单个\n * config.clear() // 清除全部\n * ```\n */\n clear(name?: string): void {\n clearCache(name)\n },\n\n /**\n * 获取所有已加载的配置名称。\n *\n * @returns 配置名称数组\n *\n * @example\n * ```ts\n * const names = config.keys() // ['core', 'db', 'app']\n * ```\n */\n keys(): string[] {\n return Array.from(configCache.keys())\n },\n\n /**\n * 监听配置文件变更并自动重载。\n *\n * 文件变更时自动重新加载并调用回调。配置未加载时立即回调 NOT_LOADED 错误。\n *\n * @param name - 配置名称\n * @param callback - 配置变更回调,接收新配置或错误\n * @returns 取消监听函数\n *\n * @example\n * ```ts\n * const unwatch = config.watch('app', (cfg, error) => {\n * if (error) { core.logger.error('reload failed', { error }); return }\n * core.logger.info('config updated', { cfg })\n * })\n * // 取消监听\n * unwatch()\n * ```\n */\n watch<T = unknown>(name: string, callback: WatchCallback<T>): () => void {\n return registerWatch(name, callback)\n },\n\n /**\n * 停止配置文件监听。\n *\n * @param name - 配置名称;不传则停止所有监听\n *\n * @example\n * ```ts\n * config.unwatch('app') // 停止单个\n * config.unwatch() // 停止全部\n * ```\n */\n unwatch(name?: string): void {\n stopWatching(name)\n },\n\n /**\n * 检查是否正在监听某个配置。\n *\n * @param name - 配置名称\n * @returns 是否有活跃的 watcher\n *\n * @example\n * ```ts\n * if (config.isWatching('app')) {\n * config.unwatch('app')\n * }\n * ```\n */\n isWatching(name: string): boolean {\n return watchEntries.has(name)\n },\n}\n\n/** config 子工具类型 */\nexport type ConfigFn = typeof config\n","/**\n * @h-ai/core — Logger(Node.js 版本,基于 pino)\n *\n * 提供统一的日志接口,Node.js 环境使用 pino 实现。\n * @module core-function-logger.node\n */\n\nimport type { LogFormat, LoggingConfig, LogLevel } from '../core-config.js'\nimport type { LogContext, Logger, LoggerFunctions, LoggerOptions } from '../core-types.js'\nimport { execSync } from 'node:child_process'\nimport { createRequire } from 'node:module'\nimport process from 'node:process'\nimport pino from 'pino'\nimport { sanitize as sanitizeUtils } from '../utils/core-util-sanitize.js'\n\n// ESM 场景下通过 createRequire 复用 CommonJS 的 resolve 能力,用来探测可选依赖是否存在。\nconst nodeRequire = createRequire(import.meta.url)\n\nif (process.platform === 'win32' && process.stdout.isTTY) {\n try {\n // 强制切换控制台代码页为 UTF-8(避免 GBK/GB2312 导致的乱码)\n execSync('chcp 65001 > nul', { stdio: 'ignore' })\n\n // 设置 stdout/stderr 编码为 UTF-8\n if (process.stdout.setDefaultEncoding) {\n process.stdout.setDefaultEncoding('utf8')\n }\n if (process.stderr.setDefaultEncoding) {\n process.stderr.setDefaultEncoding('utf8')\n }\n\n // 通过环境变量强制 Node.js 使用 UTF-8\n process.env.LANG = 'zh_CN.UTF-8'\n process.env.LC_ALL = 'zh_CN.UTF-8'\n process.env.PYTHONIOENCODING = 'utf-8'\n }\n // eslint-disable-next-line unused-imports/no-unused-vars\n catch (_e) {\n // 忽略错误,某些环境可能不支持\n }\n}\n\n// ─── 全局配置 ───\n\n/** 全局日志级别(默认 'info') */\nlet globalLevel: LogLevel = 'info'\n\n/** 全局日志格式(默认 'pretty',适合开发环境) */\nlet globalFormat: LogFormat = 'pretty'\n\n/** 全局默认上下文(每条日志自动附带) */\nlet globalContext: Record<string, unknown> = {}\n\n/** 全局脱敏字段路径列表(如 ['password', 'token']) */\nlet globalRedact: string[] = []\n\n/** 格式和脱敏规则变化时,已有 Logger 在下次输出时更新底层实例。 */\nlet outputRevision = 0\n\n/** 默认 Logger 单例缓存 */\nlet defaultLogger: Logger | null = null\n\n/**\n * 配置全局 Logger 选项。\n *\n * @param config - 日志配置\n *\n * @example\n * ```ts\n * logger.configureLogger({ level: 'debug' })\n * ```\n */\nfunction configureLogger(config: Partial<LoggingConfig>): void {\n if (config.level)\n globalLevel = config.level\n if (config.format) {\n globalFormat = config.format\n outputRevision++\n }\n if (config.context)\n globalContext = { ...globalContext, ...config.context }\n if (config.redact) {\n globalRedact = [...config.redact]\n outputRevision++\n }\n}\n\n/**\n * 设置全局日志级别。\n *\n * @param level - 日志级别\n *\n * @example\n * ```ts\n * logger.setLogLevel('warn')\n * ```\n */\nfunction setLogLevel(level: LogLevel): void {\n globalLevel = level\n}\n\n/**\n * 获取当前全局日志级别。\n *\n * @example\n * ```ts\n * const level = logger.getLogLevel()\n * ```\n */\nfunction getLogLevel(): LogLevel {\n return globalLevel\n}\n\nfunction sanitizeLogContext(ctx?: LogContext): LogContext | undefined {\n if (!ctx || Object.keys(ctx).length === 0) {\n return ctx\n }\n\n return sanitizeUtils.sanitizeSensitiveFields(ctx) as LogContext\n}\n\n// ─── Logger 实现 ───\n\n/**\n * 包装 pino 实例为统一 Logger 接口。\n *\n * 将 pino 的原生方法映射为 Logger 接口,自动合并上下文。\n *\n * @param resolvePino - 当前配置对应的 pino 实例\n * @param resolveContext - 当前基础上下文(会与每次调用时的 ctx 合并)\n * @returns 统一 Logger 实例\n */\nfunction wrapPino(resolvePino: () => pino.Logger, resolveContext: () => Record<string, unknown>): Logger {\n return {\n trace(message: string, ctx?: LogContext) {\n resolvePino().trace(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n debug(message: string, ctx?: LogContext) {\n resolvePino().debug(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n info(message: string, ctx?: LogContext) {\n resolvePino().info(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n warn(message: string, ctx?: LogContext) {\n resolvePino().warn(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n error(message: string, ctx?: LogContext) {\n resolvePino().error(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n fatal(message: string, ctx?: LogContext) {\n resolvePino().fatal(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n child(childContext: Record<string, unknown>): Logger {\n // 只保存本地上下文,输出时继承父级的当前配置;不绑定旧 pino child。\n return wrapPino(resolvePino, () => ({ ...resolveContext(), ...childContext }))\n },\n }\n}\n\n/**\n * 创建 Logger 实例。\n *\n * @param options - Logger 选项\n * @returns Logger 实例\n *\n * @example\n * ```ts\n * const appLogger = logger.createLogger({ name: 'api', level: 'info' })\n * appLogger.info('ready')\n * ```\n */\nfunction createLogger(options: LoggerOptions = {}): Logger {\n const localOptions = { ...options, context: { ...options.context } }\n let revision = outputRevision\n let output = createPinoOutput(localOptions)\n const resolvePino = (): pino.Logger => {\n if (revision !== outputRevision) {\n const updated = createPinoOutput(localOptions)\n output.close()\n output = updated\n revision = outputRevision\n }\n const level = localOptions.level ?? globalLevel\n if (output.instance.level !== level)\n output.instance.level = level\n return output.instance\n }\n return wrapPino(resolvePino, () => ({ ...globalContext, ...localOptions.context }))\n}\n\n/** 底层输出只负责格式和脱敏;已有包装在输出时应用当前全局配置。 */\nfunction createPinoOutput(options: LoggerOptions): { instance: pino.Logger, close: () => void } {\n const level = options.level ?? globalLevel\n const format = options.format ?? globalFormat\n\n // 先构造一份与输出介质无关的基础配置,后面再按 transport 能力决定是否启用 pretty。\n const pinoOptions: pino.LoggerOptions = {\n level,\n name: options.name,\n formatters: {\n level: label => ({ level: label }),\n },\n }\n\n // redact 支持\n if (globalRedact.length > 0) {\n pinoOptions.redact = {\n paths: globalRedact,\n censor: '[REDACTED]',\n }\n }\n\n let pinoInstance: pino.Logger\n let transport: ReturnType<typeof pino.transport> | undefined\n\n if (format === 'pretty' && isPrettyTransportAvailable()) {\n // 只有在 pino-pretty 可解析时才挂载 transport,避免可选依赖缺失直接导致 logger 初始化失败。\n try {\n transport = pino.transport({\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'pid,hostname',\n },\n })\n pinoInstance = pino(pinoOptions, transport)\n }\n catch (error) {\n // 其他初始化异常应重新抛出,便于排查\n if (isPrettyTransportUnavailable(error)) {\n pinoInstance = pino(pinoOptions)\n }\n else {\n throw error\n }\n }\n }\n else {\n pinoInstance = pino(pinoOptions)\n }\n\n return { instance: pinoInstance, close: () => transport?.end() }\n}\n\nfunction isPrettyTransportAvailable(): boolean {\n try {\n // pino-pretty 是可选依赖,这里用 resolve 做能力探测,避免在缺失场景下直接 import 失败。\n nodeRequire.resolve('pino-pretty')\n return true\n }\n catch {\n return false\n }\n}\n\nfunction isPrettyTransportUnavailable(error: unknown): boolean {\n const message\n = error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : ''\n\n const normalized = message.toLowerCase()\n\n return normalized.includes('pino-pretty')\n && (normalized.includes('cannot find module')\n || normalized.includes('unable to determine transport target')\n || normalized.includes('cannot load')\n || normalized.includes('not found'))\n}\n\n// ─── 默认 Logger 实例 ───\n\n/**\n * 获取默认 Logger 实例(单例)。\n *\n * @example\n * ```ts\n * const defaultLogger = logger.getLogger()\n * ```\n */\nfunction getLogger(): Logger {\n if (!defaultLogger) {\n defaultLogger = createLogger()\n }\n return defaultLogger\n}\n\n// ─── 对外出口 ───\n\n/**\n * Node.js Logger 函数集合。\n *\n * @example\n * ```ts\n * logger.createLogger({ name: 'service' }).info('boot')\n * ```\n */\nexport const logger: LoggerFunctions = {\n configureLogger,\n setLogLevel,\n getLogLevel,\n createLogger,\n getLogger,\n}\n","/**\n * @h-ai/core — Core 服务聚合(Node.js)\n *\n * 提供 Node.js 环境的 core 对象,聚合常用功能。 所有功能统一通过 core 对象访问,并提供配置加载能力。\n * @module core-main.node\n */\n\nimport type { CoreFunctions, CoreOptions } from './core-types.js'\nimport { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { CoreConfigSchema } from './core-config.js'\nimport { createCore } from './core-main.js'\nimport { config } from './functions/core-function-config.node.js'\nimport { logger } from './functions/core-function-logger.node.js'\n\nconst YAML_EXTENSION_REGEX = /\\.ya?ml$/\ntype NodeCoreFunctions = CoreFunctions & {\n readonly config: typeof config\n readonly init: typeof initCore\n}\n\n// ─── Core 实例 ───\n\n/**\n * 创建 Node.js 版本的 core 对象。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.logger.info('ready')\n * ```\n */\nfunction createNodeCore(): NodeCoreFunctions {\n const baseCore = createCore({\n createLogger: logger.createLogger,\n getLogger: logger.getLogger,\n configureLogger: logger.configureLogger,\n setLogLevel: logger.setLogLevel,\n getLogLevel: logger.getLogLevel,\n })\n\n // 扩展 config 和 init 功能\n return {\n ...baseCore,\n /** Zod 校验错误 → i18n 消息映射工具(kit / serv / api-client 共享)。 */\n zodValidation: baseCore.zodValidation,\n /** 配置管理 */\n config,\n /** 初始化 Core */\n init: initCore,\n }\n}\n\n/**\n * Core 服务对象 - 聚合常用功能(Node.js)。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.init({ configDir: './config' })\n * ```\n */\nexport const core: NodeCoreFunctions = createNodeCore()\n\n// ─── Initialization ───\n\n/**\n * 配置加载项(描述单个待加载的配置文件)。\n */\ninterface ConfigLoadItem {\n /** 配置名称(用作缓存 key,如 'core'、'db'、'app') */\n name: string\n /** 配置文件绝对路径 */\n filePath: string\n}\n\n/**\n * 扫描配置目录并构建配置加载项列表。\n *\n * 约定:\n * - 以 `_` 开头的文件为内置模块配置(如 `_core.yml` → name='core')\n * - 其他文件为业务配置(如 `app.yml` → name='app')\n *\n * @param configDir - 配置目录路径\n * @returns 配置加载项列表;目录不存在时返回空数组并输出警告\n *\n * @example\n * ```ts\n * const items = scanConfigDir('./config')\n * // [{ name: 'core', filePath: './config/_core.yml' }, { name: 'app', filePath: './config/app.yml' }]\n * ```\n */\nfunction scanConfigDir(\n configDir: string,\n): ConfigLoadItem[] {\n const logger = core.logger\n const items: ConfigLoadItem[] = []\n\n if (!existsSync(configDir)) {\n logger.warn(`[core] Config directory not found: ${configDir}`)\n return items\n }\n\n const files = readdirSync(configDir).filter(f =>\n f.endsWith('.yml') || f.endsWith('.yaml'),\n )\n\n for (const file of files) {\n const filePath = join(configDir, file)\n const baseName = file.replace(YAML_EXTENSION_REGEX, '')\n\n // 判断是否为内置模块配置(以 _ 开头)\n if (baseName.startsWith('_')) {\n const moduleName = baseName.slice(1) // 去掉 _ 前缀\n items.push({\n name: moduleName,\n filePath,\n })\n }\n else {\n // 业务配置(文件名作为配置名)\n items.push({\n name: baseName,\n filePath,\n })\n }\n }\n return items\n}\n\n/**\n * 初始化 Core(内部实现,通过 `core.init()` 调用)。\n *\n * 执行流程:\n * 1. 配置日志(若提供 `options.logging`)\n * 2. 扫描并加载配置目录中的所有 YAML 文件\n * 3. 启用配置文件监听(若 `options.watchConfig` 为 true)\n *\n * @param options - 初始化选项\n *\n * @example\n * ```ts\n * core.init({ configDir: './config', watchConfig: true })\n * ```\n */\nfunction initCore(options: CoreOptions = {}): void {\n const startTime = Date.now()\n const logger = core.logger\n\n // 1. Configure logging\n if (options.logging) {\n core.logger.configure(options.logging)\n }\n\n let configItems: ConfigLoadItem[] = []\n\n if (options.configDir) {\n // 约定优于配置模式\n configItems = scanConfigDir(options.configDir)\n }\n\n // 先应用 core 的日志配置,避免其它配置加载日志使用初始化前的级别与格式。\n configItems.sort((left, right) => Number(right.name === 'core') - Number(left.name === 'core'))\n\n // 2. Load config files\n for (const item of configItems) {\n if (item.name === 'core') {\n const result = config.load(item.name, item.filePath, CoreConfigSchema)\n if (result.success) {\n if (!options.logging) {\n core.logger.configure(result.data.logging || {})\n }\n logger.info(`[core] Config loaded: ${item.name} <- ${item.filePath}`)\n }\n else {\n logger.error(`[core] Config load failed: ${item.name}`, {\n error: result.error,\n })\n }\n }\n else {\n const result = config.load(item.name, item.filePath)\n if (result.success) {\n logger.info(`[core] Config loaded: ${item.name} <- ${item.filePath}`)\n }\n else {\n logger.error(`[core] Config load failed: ${item.name}`, {\n error: result.error,\n })\n }\n }\n }\n\n // 3. Enable config file watching\n if (options.watchConfig && configItems.length > 0) {\n setupConfigWatch(configItems)\n }\n\n const duration = Date.now() - startTime\n logger.info(`[core] Initialized (${duration}ms)`)\n}\n\n/**\n * 启用配置文件监听。\n *\n * 为每个已加载的配置项注册文件 watcher,变更时自动重载并输出日志。\n *\n * @param configs - 需要监听的配置项列表\n */\nfunction setupConfigWatch(configs: ConfigLoadItem[]): void {\n const logger = core.logger\n\n for (const item of configs) {\n config.watch(item.name, (_config, error) => {\n if (error) {\n logger.error(`[core] Config reload failed: ${item.name}`, { error })\n return\n }\n logger.info(`[core] Config reloaded: ${item.name}`)\n })\n\n logger.debug(`[core] Config watch enabled: ${item.name}`)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/functions/core-function-config.node.ts","../src/functions/core-function-logger.node.ts","../src/core-main.node.ts"],"names":["process","result","config","logger","existsSync","join"],"mappings":"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","file":"node.js","sourcesContent":["/**\n * @h-ai/core — 配置管理(Node.js 专用)\n *\n * 提供 YAML 配置文件加载、约定式环境变量映射、显式环境变量插值、缓存管理。\n * @module core-function-config.node\n */\n\nimport type { ZodType } from 'zod'\nimport type { HaiError, HaiResult } from '../core-types.js'\n\nimport { existsSync, readFileSync, watch } from 'node:fs'\nimport { join } from 'node:path'\nimport process from 'node:process'\nimport { parseEnv } from 'node:util'\nimport { parse } from 'yaml'\n\n// ─── 配置文件监听 ───\n\nimport { err, HaiConfigError, ok } from '../core-types.js'\nimport { i18n } from '../i18n/core-i18n-utils.js'\nimport { typeUtils } from '../utils/core-util-type.js'\n\n/** 缓存项(存储已加载的配置及其元信息) */\ninterface CacheEntry<T = unknown> {\n /** 解析后的配置数据 */\n data: T\n /** 配置文件路径 */\n filePath: string\n /** Zod 校验 Schema(重载时复用,无 Schema 加载时为 undefined) */\n schema?: ZodType<T>\n /** 加载时间戳(毫秒) */\n loadedAt: number\n}\n\n// ─── 内部工具 ───\n\n/** 环境变量插值正则(支持 ${VAR} 与 ${VAR:default}) */\nconst ENV_VAR_PATTERN = /\\$\\{([^}:]+)(?::([^}]*))?\\}/g\n\n/** 判断整个字符串是否恰好是单个 ${VAR} 或 ${VAR:default}(用于类型还原) */\nconst FULL_VAR_PATTERN = /^\\$\\{[^}:]+(?::[^}]*)?\\}$/\n\n/**\n * 将环境变量字符串按 YAML 标量规则还原类型。\n *\n * @param value - 环境变量原始字符串\n * @returns 空字符串保持不变;其余值尽量还原为 YAML 原生类型\n */\nfunction parseEnvValue(value: string): unknown {\n // YAML 会把空文档解析为 null;空环境变量仍是明确的字符串值,不能改变其类型。\n if (value === '')\n return ''\n\n try {\n const parsed = parse(value)\n return parsed === undefined ? value : parsed\n }\n catch {\n return value\n }\n}\n\n/**\n * 将配置名或 YAML 路径片段规范化为环境变量片段。\n *\n * camelCase 不拆词,例如 apiKey → APIKEY;非字母数字字符统一为下划线。\n *\n * @param segment - 配置名、键名或数组索引\n * @returns 可用于环境变量名的片段\n */\nfunction normalizeEnvSegment(segment: string): string {\n return segment\n .replace(/[^a-z0-9]+/gi, '_')\n .replace(/^_+|_+$/g, '')\n .toUpperCase()\n}\n\n/**\n * 构建配置项的约定环境变量名。\n *\n * @example `ai` + `llm.apiKey` → `HAI_AI_LLM_APIKEY`\n *\n * @param name - 配置名称\n * @param path - YAML 中从根到叶子的键路径;数组索引也作为一段\n * @returns 以 HAI 开头的环境变量名\n */\nfunction buildConventionEnvName(name: string, path: string[]): string {\n return ['HAI', name, ...path]\n .map(normalizeEnvSegment)\n .filter(Boolean)\n .join('_')\n}\n\n/**\n * 解析配置中的环境变量。\n *\n * 每个叶子配置项都会优先读取 `HAI_<配置名>_<YAML 路径>`;\n * 约定变量不存在时再解析显式 `${VAR}`,显式语法用于指定特殊变量名。\n *\n * @param value - 任意配置值(字符串、数组、对象或原始值)\n * @param name - 配置名称\n * @param path - 当前值的 YAML 路径\n * @returns 插值后的结果;当环境变量缺失且未提供默认值时返回 ENV_VAR_MISSING 错误\n */\nfunction resolveEnv(value: unknown, name: string, path: string[] = []): HaiResult<unknown> {\n // 对象和数组也可整体覆盖,云配置可以注入原 YAML 未声明的连接字段。\n const conventionEnvValue = process.env[buildConventionEnvName(name, path)]\n if (conventionEnvValue !== undefined)\n return ok(parseEnvValue(conventionEnvValue))\n\n if (typeof value === 'string') {\n ENV_VAR_PATTERN.lastIndex = 0\n const hasExplicitEnv = ENV_VAR_PATTERN.test(value)\n ENV_VAR_PATTERN.lastIndex = 0\n\n if (!hasExplicitEnv)\n return ok(value)\n\n let result = value\n // 避免在 while 条件中赋值(满足 lint 规则 no-cond-assign)\n while (true) {\n const match = ENV_VAR_PATTERN.exec(value)\n if (!match)\n break\n\n const [fullMatch, varName, defaultValue] = match\n const envValue = process.env[varName]\n\n // 未提供默认值且环境变量不存在时,返回错误\n if (envValue === undefined && defaultValue === undefined) {\n return err(HaiConfigError.CONFIG_ENV_VAR_MISSING, i18n.coreM('core_configEnvVarMissing', { params: { varName } }))\n }\n result = result.replace(fullMatch, () => envValue ?? defaultValue ?? '')\n }\n\n // 当原值整体是单个 ${VAR:default} 时,插值结果需还原为 YAML 原生类型。\n if (FULL_VAR_PATTERN.test(value))\n return ok(parseEnvValue(result))\n\n return ok(result)\n }\n\n if (Array.isArray(value)) {\n const results: unknown[] = []\n for (const [index, item] of value.entries()) {\n const r = resolveEnv(item, name, [...path, String(index)])\n if (!r.success)\n return r\n results.push(r.data)\n }\n return ok(results)\n }\n\n if (typeUtils.isObject(value)) {\n const results: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) {\n const r = resolveEnv(v, name, [...path, k])\n if (!r.success)\n return r\n results[k] = r.data\n }\n return ok(results)\n }\n\n return ok(value)\n}\n\n// ─── 配置管理器 ───\n\n/** 配置缓存 */\nconst configCache = new Map<string, CacheEntry>()\n\n/**\n * 监听回调类型。\n *\n * @template T - 配置数据类型\n *\n * @example\n * ```ts\n * const callback: WatchCallback<AppConfig> = (cfg, error) => {\n * if (error) { core.logger.error('Config reload failed', { error }); return }\n * // 使用更新后的 cfg\n * }\n * ```\n */\nexport type WatchCallback<T = unknown> = (config: T | null, error?: HaiError) => void\n\n/** 配置监听条目(包含文件 watcher 和回调集合) */\ninterface WatchEntry {\n /** fs.watch 返回的 watcher 实例 */\n watcher: ReturnType<typeof watch>\n /** 已注册的回调函数集合 */\n callbacks: Set<WatchCallback<unknown>>\n /** 防抖定时器(用于 stopWatching 时清理) */\n debounceTimer: ReturnType<typeof setTimeout> | null\n}\n\n/** 配置监听映射 */\nconst watchEntries = new Map<string, WatchEntry>()\n\n/**\n * 创建未加载错误。\n *\n * @param name - 配置名称\n * @returns HaiError,错误码为 NOT_LOADED\n */\nfunction createNotLoadedError(name: string): HaiError {\n const result = err(HaiConfigError.CONFIG_NOT_LOADED, i18n.coreM('core_configNotLoaded', { params: { name } }))\n if (!result.success)\n return result.error\n\n throw new Error('unreachable')\n}\n\n/**\n * 通知监听回调。\n *\n * @param name - 配置名称\n * @param result - 重载结果(成功时传配置数据,失败时传错误)\n */\nfunction notifyWatchCallbacks(name: string, result: HaiResult<unknown>): void {\n const entry = watchEntries.get(name)\n if (!entry)\n return\n\n if (result.success) {\n for (const callback of entry.callbacks) {\n try {\n callback(result.data, undefined)\n }\n catch { /* 隔离单个回调异常,不影响其他回调 */ }\n }\n }\n else {\n for (const callback of entry.callbacks) {\n try {\n callback(null, result.error)\n }\n catch { /* 隔离单个回调异常,不影响其他回调 */ }\n }\n }\n}\n\n/**\n * 加载 YAML 配置文件(不带 Schema 验证)。\n *\n * 流程:检查文件存在 → 读取 YAML → 约定式环境变量映射与显式插值。\n *\n * @param name - 配置名称,用于生成 `HAI_<配置名>_<YAML 路径>` 环境变量名\n * @param filePath - YAML 文件路径\n * @returns 解析结果;可能的错误码:FILE_NOT_FOUND / PARSE_ERROR / ENV_VAR_MISSING\n */\nfunction loadYaml(name: string, filePath: string): HaiResult<unknown> {\n if (!existsSync(filePath)) {\n return err(HaiConfigError.CONFIG_FILE_NOT_FOUND, i18n.coreM('core_configFileNotExist', { params: { filePath } }))\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n const parsed = parse(content)\n return resolveEnv(parsed, name)\n }\n catch (error) {\n return err(HaiConfigError.CONFIG_PARSE_ERROR, i18n.coreM('core_configParseFailed', { params: { filePath } }), error)\n }\n}\n\n/**\n * 加载并验证配置文件。\n *\n * 流程:加载 YAML → 环境变量映射与插值 → Zod Schema 校验。\n *\n * @param name - 配置名称\n * @param filePath - YAML 文件路径\n * @param schema - Zod 校验 Schema\n * @returns 校验后的配置数据;可能的错误码:FILE_NOT_FOUND / PARSE_ERROR / ENV_VAR_MISSING / VALIDATION_ERROR\n */\nfunction loadConfig<T>(\n name: string,\n filePath: string,\n schema: ZodType<T>,\n): HaiResult<T> {\n const yamlResult = loadYaml(name, filePath)\n if (!yamlResult.success)\n return yamlResult\n\n const parseResult = schema.safeParse(yamlResult.data)\n if (!parseResult.success) {\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'), parseResult.error.issues)\n }\n\n return ok(parseResult.data)\n}\n\n/**\n * 加载配置并写入缓存。\n *\n * @param name - 配置名称(缓存 key)\n * @param filePath - YAML 文件路径\n * @param schema - 可选 Zod Schema(不传则跳过校验)\n * @returns 加载结果;成功时同时更新缓存\n */\nfunction loadAndCache<T>(\n name: string,\n filePath: string,\n schema?: ZodType<T>,\n): HaiResult<T> {\n const result = schema ? loadConfig(name, filePath, schema) : loadYaml(name, filePath) as HaiResult<T>\n if (result.success) {\n configCache.set(name, {\n data: result.data,\n filePath,\n schema: schema as ZodType<unknown> | undefined,\n loadedAt: Date.now(),\n })\n }\n return result\n}\n\n/**\n * 校验已加载的配置并写回缓存。\n *\n * 从缓存中取出原始数据重新用 Schema 校验,校验通过后更新缓存。\n *\n * @param name - 配置名称\n * @param schema - Zod Schema\n * @returns 校验结果;未加载时返回 NOT_LOADED,校验失败返回 VALIDATION_ERROR\n */\nfunction validateLoadedConfig<T>(name: string, schema: ZodType<T>): HaiResult<T> {\n const entry = configCache.get(name)\n if (!entry) {\n return err(createNotLoadedError(name))\n }\n\n const parseResult = schema.safeParse(entry.data)\n if (!parseResult.success) {\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'), parseResult.error.issues)\n }\n\n const validated = parseResult.data\n configCache.set(name, {\n ...entry,\n data: validated,\n schema,\n loadedAt: Date.now(),\n })\n\n return ok(validated)\n}\n\n/**\n * 重新加载配置并通知监听器。\n *\n * 从缓存中获取文件路径和 Schema,重新加载并触发所有 watch 回调。\n *\n * @param name - 配置名称\n * @returns 重载结果;未加载时返回 NOT_LOADED\n */\nfunction reloadAndNotify(name: string): HaiResult<unknown> {\n const entry = configCache.get(name)\n if (!entry) {\n const result = err(createNotLoadedError(name))\n notifyWatchCallbacks(name, result)\n return result\n }\n\n // 无 Schema 时直接加载 YAML(不做校验),避免 schema 为 undefined 导致运行时崩溃\n const result = entry.schema ? loadConfig(name, entry.filePath, entry.schema) : loadYaml(name, entry.filePath)\n if (result.success) {\n configCache.set(name, {\n ...entry,\n data: result.data,\n loadedAt: Date.now(),\n })\n }\n notifyWatchCallbacks(name, result)\n return result\n}\n\n/**\n * 启动配置文件监听。\n *\n * 使用 `fs.watch` 监听文件变更,变更时自动重载并通知回调。\n * 同一配置名只会创建一个 watcher,多次调用返回同一实例。\n *\n * @param name - 配置名称\n * @returns WatchEntry 实例;配置未加载时返回 null\n */\nfunction startFileWatcher(name: string): WatchEntry | null {\n const existing = watchEntries.get(name)\n if (existing)\n return existing\n\n const entry = configCache.get(name)\n if (!entry)\n return null\n\n try {\n const watchEntry: WatchEntry = {\n watcher: null!,\n callbacks: new Set(),\n debounceTimer: null,\n }\n\n // 防抖定时器:fs.watch 可能对同一次文件保存触发多次 'change' 事件\n const watcher = watch(entry.filePath, (eventType) => {\n if (eventType === 'change') {\n if (watchEntry.debounceTimer)\n clearTimeout(watchEntry.debounceTimer)\n watchEntry.debounceTimer = setTimeout(() => {\n watchEntry.debounceTimer = null\n reloadAndNotify(name)\n }, 100)\n }\n })\n\n watchEntry.watcher = watcher\n watchEntries.set(name, watchEntry)\n return watchEntry\n }\n catch {\n return null\n }\n}\n\n/**\n * 注册监听回调。\n *\n * 启动文件 watcher(若尚未启动)并注册回调。\n * 配置未加载时立即回调 NOT_LOADED 错误。\n *\n * @param name - 配置名称\n * @param callback - 变更回调\n * @returns 取消监听函数;调用后自动清理(无回调时关闭 watcher)\n */\nfunction registerWatch<T>(name: string, callback: WatchCallback<T>): () => void {\n const entry = startFileWatcher(name)\n if (!entry) {\n callback(null, createNotLoadedError(name))\n return () => { }\n }\n\n entry.callbacks.add(callback as WatchCallback<unknown>)\n\n return () => {\n const current = watchEntries.get(name)\n if (!current)\n return\n\n current.callbacks.delete(callback as WatchCallback<unknown>)\n if (current.callbacks.size === 0) {\n if (current.debounceTimer)\n clearTimeout(current.debounceTimer)\n current.watcher.close()\n watchEntries.delete(name)\n }\n }\n}\n\n/**\n * 停止监听(内部实现)。\n *\n * @param name - 配置名称;不传则停止所有监听并清空映射\n */\nfunction stopWatching(name?: string): void {\n if (name) {\n const entry = watchEntries.get(name)\n if (entry) {\n if (entry.debounceTimer)\n clearTimeout(entry.debounceTimer)\n entry.watcher.close()\n watchEntries.delete(name)\n }\n }\n else {\n for (const entry of watchEntries.values()) {\n if (entry.debounceTimer)\n clearTimeout(entry.debounceTimer)\n entry.watcher.close()\n }\n watchEntries.clear()\n }\n}\n\n/**\n * 清理缓存(同时停止对应监听)。\n *\n * @param name - 配置名称;不传则清理全部缓存并停止所有监听\n */\nfunction clearCache(name?: string): void {\n if (name) {\n configCache.delete(name)\n stopWatching(name)\n }\n else {\n configCache.clear()\n stopWatching()\n }\n}\n\n/**\n * 配置管理对象。\n *\n * @example\n * ```ts\n * const result = config.load('app', './config/app.yml')\n * if (result.success) {\n * const cfg = config.get('app')\n * }\n * ```\n */\nexport const config = {\n /**\n * 读取 dotenv 文件并按统一顺序合并,不修改进程环境。\n *\n * 优先级:已有进程环境 > .env.local > .env.<mode> > .env。\n * development/production 分别映射到 dev/prod;不存在的文件跳过。\n * 返回值可能包含私有配置,仅在 Node 启动/构建边界注入,不下发浏览器。\n * @param options - 文件所在目录及环境模式\n * @param options.mode - dev/test/prod 或 Vite 的 development/production\n * @param options.envDir - dotenv 所在目录,默认进程工作目录\n * @returns 已合并的变量;非法模式或读取失败返回配置错误,不包含文件内容\n * @example\n * ```ts\n * const env = core.config.loadEnvFiles({ mode: 'dev', envDir: '.' })\n * if (!env.success) throw new Error(env.error.message)\n * Object.assign(process.env, env.data)\n * core.init({ configDir: './config' })\n * ```\n */\n loadEnvFiles(options: { mode: string, envDir?: string }): HaiResult<Record<string, string>> {\n const mode = options.mode === 'development' ? 'dev' : options.mode === 'production' ? 'prod' : options.mode\n if (!/^[a-z0-9][\\w-]*$/i.test(mode))\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'))\n const envDir = options.envDir ?? process.cwd()\n try {\n const merged: Record<string, string> = {}\n for (const name of ['.env', `.env.${mode}`, '.env.local']) {\n const file = join(envDir, name)\n if (existsSync(file))\n Object.assign(merged, parseEnv(readFileSync(file, 'utf8')))\n }\n for (const name of Object.keys(merged)) {\n if (process.env[name] !== undefined)\n merged[name] = process.env[name]\n }\n return ok(merged)\n }\n catch {\n // dotenv 解析异常可能携带原始行,错误边界不暴露文件内容。\n return err(HaiConfigError.CONFIG_PARSE_ERROR, i18n.coreM('core_configParseFailed', { params: { filePath: envDir } }))\n }\n },\n\n /**\n * 加载配置到缓存。\n *\n * 加载 YAML 文件并可选地用 Zod Schema 校验,成功后写入缓存。\n *\n * @param name - 配置名称(缓存 key)\n * @param filePath - YAML 文件路径\n * @param schema - 可选 Zod Schema(不传则跳过校验)\n * @returns 成功时返回解析后的配置数据;失败时返回 HaiError\n *\n * @example\n * ```ts\n * const result = config.load('core', './config/_core.yml', CoreConfigSchema)\n * if (result.success) {\n * // result.data 为校验后的配置\n * }\n * ```\n */\n load<T>(name: string, filePath: string, schema?: ZodType<T>): HaiResult<T> {\n return loadAndCache(name, filePath, schema)\n },\n\n /**\n * 验证已加载的配置数据。\n *\n * 对缓存中的配置数据重新用 Schema 校验,校验通过后更新缓存。\n *\n * @param name - 配置名称\n * @param schema - Zod 验证模式\n * @returns 校验结果;未加载时返回 NOT_LOADED,格式错误返回 VALIDATION_ERROR\n *\n * @example\n * ```ts\n * const result = config.validate('app', AppSchema)\n * if (!result.success) {\n * // result.error.code 可能为 NOT_LOADED 或 VALIDATION_ERROR\n * }\n * ```\n */\n validate<T>(name: string, schema: ZodType<T>): HaiResult<T> {\n return validateLoadedConfig(name, schema)\n },\n\n /**\n * 获取已加载的配置。\n *\n * @param name - 配置名称\n * @returns 配置数据;未加载时返回 undefined\n *\n * @example\n * ```ts\n * const cfg = config.get<CoreConfig>('core')\n * if (cfg) {\n * // 使用 cfg\n * }\n * ```\n */\n get<T>(name: string): T | undefined {\n return configCache.get(name)?.data as T | undefined\n },\n\n /**\n * 获取配置,不存在时抛出错误。\n *\n * @param name - 配置名称\n * @returns 配置数据\n * @throws 配置未加载时抛出 Error\n *\n * @example\n * ```ts\n * try {\n * const cfg = config.getOrThrow<CoreConfig>('core')\n * } catch (e) {\n * // 配置未加载\n * }\n * ```\n */\n getOrThrow<T>(name: string): T {\n const data = this.get<T>(name)\n if (data === undefined) {\n throw new Error(i18n.coreM('core_configNotLoaded', { params: { name } }))\n }\n return data\n },\n\n /**\n * 重新加载配置。\n *\n * 从磁盘重新读取配置文件并更新缓存,同时通知所有 watch 回调。\n *\n * @param name - 配置名称\n * @returns 重载结果;未加载时返回 NOT_LOADED\n *\n * @example\n * ```ts\n * const result = config.reload('app')\n * ```\n */\n reload(name: string): HaiResult<unknown> {\n return reloadAndNotify(name)\n },\n\n /**\n * 检查配置是否已加载。\n *\n * @param name - 配置名称\n * @returns 是否已加载到缓存\n *\n * @example\n * ```ts\n * if (config.has('db')) {\n * const dbCfg = config.get('db')\n * }\n * ```\n */\n has(name: string): boolean {\n return configCache.has(name)\n },\n\n /**\n * 清除配置缓存(同时停止对应监听)。\n *\n * @param name - 配置名称;不传则清除全部\n *\n * @example\n * ```ts\n * config.clear('app') // 清除单个\n * config.clear() // 清除全部\n * ```\n */\n clear(name?: string): void {\n clearCache(name)\n },\n\n /**\n * 获取所有已加载的配置名称。\n *\n * @returns 配置名称数组\n *\n * @example\n * ```ts\n * const names = config.keys() // ['core', 'db', 'app']\n * ```\n */\n keys(): string[] {\n return Array.from(configCache.keys())\n },\n\n /**\n * 监听配置文件变更并自动重载。\n *\n * 文件变更时自动重新加载并调用回调。配置未加载时立即回调 NOT_LOADED 错误。\n *\n * @param name - 配置名称\n * @param callback - 配置变更回调,接收新配置或错误\n * @returns 取消监听函数\n *\n * @example\n * ```ts\n * const unwatch = config.watch('app', (cfg, error) => {\n * if (error) { core.logger.error('reload failed', { error }); return }\n * core.logger.info('config updated', { cfg })\n * })\n * // 取消监听\n * unwatch()\n * ```\n */\n watch<T = unknown>(name: string, callback: WatchCallback<T>): () => void {\n return registerWatch(name, callback)\n },\n\n /**\n * 停止配置文件监听。\n *\n * @param name - 配置名称;不传则停止所有监听\n *\n * @example\n * ```ts\n * config.unwatch('app') // 停止单个\n * config.unwatch() // 停止全部\n * ```\n */\n unwatch(name?: string): void {\n stopWatching(name)\n },\n\n /**\n * 检查是否正在监听某个配置。\n *\n * @param name - 配置名称\n * @returns 是否有活跃的 watcher\n *\n * @example\n * ```ts\n * if (config.isWatching('app')) {\n * config.unwatch('app')\n * }\n * ```\n */\n isWatching(name: string): boolean {\n return watchEntries.has(name)\n },\n}\n\n/** config 子工具类型 */\nexport type ConfigFn = typeof config\n","/**\n * @h-ai/core — Logger(Node.js 版本,基于 pino)\n *\n * 提供统一的日志接口,Node.js 环境使用 pino 实现。\n * @module core-function-logger.node\n */\n\nimport type { LogFormat, LoggingConfig, LogLevel } from '../core-config.js'\nimport type { LogContext, Logger, LoggerFunctions, LoggerOptions } from '../core-types.js'\nimport { execSync } from 'node:child_process'\nimport { createRequire } from 'node:module'\nimport process from 'node:process'\nimport pino from 'pino'\nimport { sanitize as sanitizeUtils } from '../utils/core-util-sanitize.js'\n\n// ESM 场景下通过 createRequire 复用 CommonJS 的 resolve 能力,用来探测可选依赖是否存在。\nconst nodeRequire = createRequire(import.meta.url)\n\nif (process.platform === 'win32' && process.stdout.isTTY) {\n try {\n // 强制切换控制台代码页为 UTF-8(避免 GBK/GB2312 导致的乱码)\n execSync('chcp 65001 > nul', { stdio: 'ignore' })\n\n // 设置 stdout/stderr 编码为 UTF-8\n if (process.stdout.setDefaultEncoding) {\n process.stdout.setDefaultEncoding('utf8')\n }\n if (process.stderr.setDefaultEncoding) {\n process.stderr.setDefaultEncoding('utf8')\n }\n\n // 通过环境变量强制 Node.js 使用 UTF-8\n process.env.LANG = 'zh_CN.UTF-8'\n process.env.LC_ALL = 'zh_CN.UTF-8'\n process.env.PYTHONIOENCODING = 'utf-8'\n }\n // eslint-disable-next-line unused-imports/no-unused-vars\n catch (_e) {\n // 忽略错误,某些环境可能不支持\n }\n}\n\n// ─── 全局配置 ───\n\n/** 全局日志级别(默认 'info') */\nlet globalLevel: LogLevel = 'info'\n\n/** 全局日志格式(默认 'pretty',适合开发环境) */\nlet globalFormat: LogFormat = 'pretty'\n\n/** 全局默认上下文(每条日志自动附带) */\nlet globalContext: Record<string, unknown> = {}\n\n/** 全局脱敏字段路径列表(如 ['password', 'token']) */\nlet globalRedact: string[] = []\n\n/** 格式和脱敏规则变化时,已有 Logger 在下次输出时更新底层实例。 */\nlet outputRevision = 0\n\n/** 默认 Logger 单例缓存 */\nlet defaultLogger: Logger | null = null\n\n/**\n * 配置全局 Logger 选项。\n *\n * @param config - 日志配置\n *\n * @example\n * ```ts\n * logger.configureLogger({ level: 'debug' })\n * ```\n */\nfunction configureLogger(config: Partial<LoggingConfig>): void {\n if (config.level)\n globalLevel = config.level\n if (config.format) {\n globalFormat = config.format\n outputRevision++\n }\n if (config.context)\n globalContext = { ...globalContext, ...config.context }\n if (config.redact) {\n globalRedact = [...config.redact]\n outputRevision++\n }\n}\n\n/**\n * 设置全局日志级别。\n *\n * @param level - 日志级别\n *\n * @example\n * ```ts\n * logger.setLogLevel('warn')\n * ```\n */\nfunction setLogLevel(level: LogLevel): void {\n globalLevel = level\n}\n\n/**\n * 获取当前全局日志级别。\n *\n * @example\n * ```ts\n * const level = logger.getLogLevel()\n * ```\n */\nfunction getLogLevel(): LogLevel {\n return globalLevel\n}\n\nfunction sanitizeLogContext(ctx?: LogContext): LogContext | undefined {\n if (!ctx || Object.keys(ctx).length === 0) {\n return ctx\n }\n\n return sanitizeUtils.sanitizeSensitiveFields(ctx) as LogContext\n}\n\n// ─── Logger 实现 ───\n\n/**\n * 包装 pino 实例为统一 Logger 接口。\n *\n * 将 pino 的原生方法映射为 Logger 接口,自动合并上下文。\n *\n * @param resolvePino - 当前配置对应的 pino 实例\n * @param resolveContext - 当前基础上下文(会与每次调用时的 ctx 合并)\n * @returns 统一 Logger 实例\n */\nfunction wrapPino(resolvePino: () => pino.Logger, resolveContext: () => Record<string, unknown>): Logger {\n return {\n trace(message: string, ctx?: LogContext) {\n resolvePino().trace(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n debug(message: string, ctx?: LogContext) {\n resolvePino().debug(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n info(message: string, ctx?: LogContext) {\n resolvePino().info(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n warn(message: string, ctx?: LogContext) {\n resolvePino().warn(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n error(message: string, ctx?: LogContext) {\n resolvePino().error(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n fatal(message: string, ctx?: LogContext) {\n resolvePino().fatal(sanitizeLogContext({ ...resolveContext(), ...ctx }) ?? {}, message)\n },\n child(childContext: Record<string, unknown>): Logger {\n // 只保存本地上下文,输出时继承父级的当前配置;不绑定旧 pino child。\n return wrapPino(resolvePino, () => ({ ...resolveContext(), ...childContext }))\n },\n }\n}\n\n/**\n * 创建 Logger 实例。\n *\n * @param options - Logger 选项\n * @returns Logger 实例\n *\n * @example\n * ```ts\n * const appLogger = logger.createLogger({ name: 'api', level: 'info' })\n * appLogger.info('ready')\n * ```\n */\nfunction createLogger(options: LoggerOptions = {}): Logger {\n const localOptions = { ...options, context: { ...options.context } }\n let revision = outputRevision\n let output = createPinoOutput(localOptions)\n const resolvePino = (): pino.Logger => {\n if (revision !== outputRevision) {\n const updated = createPinoOutput(localOptions)\n output.close()\n output = updated\n revision = outputRevision\n }\n const level = localOptions.level ?? globalLevel\n if (output.instance.level !== level)\n output.instance.level = level\n return output.instance\n }\n return wrapPino(resolvePino, () => ({ ...globalContext, ...localOptions.context }))\n}\n\n/** 底层输出只负责格式和脱敏;已有包装在输出时应用当前全局配置。 */\nfunction createPinoOutput(options: LoggerOptions): { instance: pino.Logger, close: () => void } {\n const level = options.level ?? globalLevel\n const format = options.format ?? globalFormat\n\n // 先构造一份与输出介质无关的基础配置,后面再按 transport 能力决定是否启用 pretty。\n const pinoOptions: pino.LoggerOptions = {\n level,\n name: options.name,\n formatters: {\n level: label => ({ level: label }),\n },\n }\n\n // redact 支持\n if (globalRedact.length > 0) {\n pinoOptions.redact = {\n paths: globalRedact,\n censor: '[REDACTED]',\n }\n }\n\n let pinoInstance: pino.Logger\n let transport: ReturnType<typeof pino.transport> | undefined\n\n if (format === 'pretty' && isPrettyTransportAvailable()) {\n // 只有在 pino-pretty 可解析时才挂载 transport,避免可选依赖缺失直接导致 logger 初始化失败。\n try {\n transport = pino.transport({\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'pid,hostname',\n },\n })\n pinoInstance = pino(pinoOptions, transport)\n }\n catch (error) {\n // 其他初始化异常应重新抛出,便于排查\n if (isPrettyTransportUnavailable(error)) {\n pinoInstance = pino(pinoOptions)\n }\n else {\n throw error\n }\n }\n }\n else {\n pinoInstance = pino(pinoOptions)\n }\n\n return { instance: pinoInstance, close: () => transport?.end() }\n}\n\nfunction isPrettyTransportAvailable(): boolean {\n try {\n // pino-pretty 是可选依赖,这里用 resolve 做能力探测,避免在缺失场景下直接 import 失败。\n nodeRequire.resolve('pino-pretty')\n return true\n }\n catch {\n return false\n }\n}\n\nfunction isPrettyTransportUnavailable(error: unknown): boolean {\n const message\n = error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : ''\n\n const normalized = message.toLowerCase()\n\n return normalized.includes('pino-pretty')\n && (normalized.includes('cannot find module')\n || normalized.includes('unable to determine transport target')\n || normalized.includes('cannot load')\n || normalized.includes('not found'))\n}\n\n// ─── 默认 Logger 实例 ───\n\n/**\n * 获取默认 Logger 实例(单例)。\n *\n * @example\n * ```ts\n * const defaultLogger = logger.getLogger()\n * ```\n */\nfunction getLogger(): Logger {\n if (!defaultLogger) {\n defaultLogger = createLogger()\n }\n return defaultLogger\n}\n\n// ─── 对外出口 ───\n\n/**\n * Node.js Logger 函数集合。\n *\n * @example\n * ```ts\n * logger.createLogger({ name: 'service' }).info('boot')\n * ```\n */\nexport const logger: LoggerFunctions = {\n configureLogger,\n setLogLevel,\n getLogLevel,\n createLogger,\n getLogger,\n}\n","/**\n * @h-ai/core — Core 服务聚合(Node.js)\n *\n * 提供 Node.js 环境的 core 对象,聚合常用功能。 所有功能统一通过 core 对象访问,并提供配置加载能力。\n * @module core-main.node\n */\n\nimport type { CoreFunctions, CoreOptions } from './core-types.js'\nimport { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { CoreConfigSchema } from './core-config.js'\nimport { createCore } from './core-main.js'\nimport { config } from './functions/core-function-config.node.js'\nimport { logger } from './functions/core-function-logger.node.js'\n\nconst YAML_EXTENSION_REGEX = /\\.ya?ml$/\ntype NodeCoreFunctions = CoreFunctions & {\n readonly config: typeof config\n readonly init: typeof initCore\n}\n\n// ─── Core 实例 ───\n\n/**\n * 创建 Node.js 版本的 core 对象。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.logger.info('ready')\n * ```\n */\nfunction createNodeCore(): NodeCoreFunctions {\n const baseCore = createCore({\n createLogger: logger.createLogger,\n getLogger: logger.getLogger,\n configureLogger: logger.configureLogger,\n setLogLevel: logger.setLogLevel,\n getLogLevel: logger.getLogLevel,\n })\n\n // 扩展 config 和 init 功能\n return {\n ...baseCore,\n /** Zod 校验错误 → i18n 消息映射工具(kit / serv / api-client 共享)。 */\n zodValidation: baseCore.zodValidation,\n /** 配置管理 */\n config,\n /** 初始化 Core */\n init: initCore,\n }\n}\n\n/**\n * Core 服务对象 - 聚合常用功能(Node.js)。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.init({ configDir: './config' })\n * ```\n */\nexport const core: NodeCoreFunctions = createNodeCore()\n\n// ─── Initialization ───\n\n/**\n * 配置加载项(描述单个待加载的配置文件)。\n */\ninterface ConfigLoadItem {\n /** 配置名称(用作缓存 key,如 'core'、'db'、'app') */\n name: string\n /** 配置文件绝对路径 */\n filePath: string\n}\n\n/**\n * 扫描配置目录并构建配置加载项列表。\n *\n * 约定:\n * - 以 `_` 开头的文件为内置模块配置(如 `_core.yml` → name='core')\n * - 其他文件为业务配置(如 `app.yml` → name='app')\n *\n * @param configDir - 配置目录路径\n * @returns 配置加载项列表;目录不存在时返回空数组并输出警告\n *\n * @example\n * ```ts\n * const items = scanConfigDir('./config')\n * // [{ name: 'core', filePath: './config/_core.yml' }, { name: 'app', filePath: './config/app.yml' }]\n * ```\n */\nfunction scanConfigDir(\n configDir: string,\n): ConfigLoadItem[] {\n const logger = core.logger\n const items: ConfigLoadItem[] = []\n\n if (!existsSync(configDir)) {\n logger.warn(`[core] Config directory not found: ${configDir}`)\n return items\n }\n\n const files = readdirSync(configDir).filter(f =>\n f.endsWith('.yml') || f.endsWith('.yaml'),\n )\n\n for (const file of files) {\n const filePath = join(configDir, file)\n const baseName = file.replace(YAML_EXTENSION_REGEX, '')\n\n // 判断是否为内置模块配置(以 _ 开头)\n if (baseName.startsWith('_')) {\n const moduleName = baseName.slice(1) // 去掉 _ 前缀\n items.push({\n name: moduleName,\n filePath,\n })\n }\n else {\n // 业务配置(文件名作为配置名)\n items.push({\n name: baseName,\n filePath,\n })\n }\n }\n return items\n}\n\n/**\n * 初始化 Core(内部实现,通过 `core.init()` 调用)。\n *\n * 执行流程:\n * 1. 配置日志(若提供 `options.logging`)\n * 2. 扫描并加载配置目录中的所有 YAML 文件\n * 3. 启用配置文件监听(若 `options.watchConfig` 为 true)\n *\n * @param options - 初始化选项\n *\n * @example\n * ```ts\n * core.init({ configDir: './config', watchConfig: true })\n * ```\n */\nfunction initCore(options: CoreOptions = {}): void {\n const startTime = Date.now()\n const logger = core.logger\n\n // 1. Configure logging\n if (options.logging) {\n core.logger.configure(options.logging)\n }\n\n let configItems: ConfigLoadItem[] = []\n\n if (options.configDir) {\n // 约定优于配置模式\n configItems = scanConfigDir(options.configDir)\n }\n\n // 先应用 core 的日志配置,避免其它配置加载日志使用初始化前的级别与格式。\n configItems.sort((left, right) => Number(right.name === 'core') - Number(left.name === 'core'))\n\n // 2. Load config files\n for (const item of configItems) {\n if (item.name === 'core') {\n const result = config.load(item.name, item.filePath, CoreConfigSchema)\n if (result.success) {\n if (!options.logging) {\n core.logger.configure(result.data.logging || {})\n }\n logger.info(`[core] Config loaded: ${item.name} <- ${item.filePath}`)\n }\n else {\n logger.error(`[core] Config load failed: ${item.name}`, {\n error: result.error,\n })\n }\n }\n else {\n const result = config.load(item.name, item.filePath)\n if (result.success) {\n logger.info(`[core] Config loaded: ${item.name} <- ${item.filePath}`)\n }\n else {\n logger.error(`[core] Config load failed: ${item.name}`, {\n error: result.error,\n })\n }\n }\n }\n\n // 3. Enable config file watching\n if (options.watchConfig && configItems.length > 0) {\n setupConfigWatch(configItems)\n }\n\n const duration = Date.now() - startTime\n logger.info(`[core] Initialized (${duration}ms)`)\n}\n\n/**\n * 启用配置文件监听。\n *\n * 为每个已加载的配置项注册文件 watcher,变更时自动重载并输出日志。\n *\n * @param configs - 需要监听的配置项列表\n */\nfunction setupConfigWatch(configs: ConfigLoadItem[]): void {\n const logger = core.logger\n\n for (const item of configs) {\n config.watch(item.name, (_config, error) => {\n if (error) {\n logger.error(`[core] Config reload failed: ${item.name}`, { error })\n return\n }\n logger.info(`[core] Config reloaded: ${item.name}`)\n })\n\n logger.debug(`[core] Config watch enabled: ${item.name}`)\n }\n}\n"]}
|
package/package.json
CHANGED