@h-ai/core 0.1.0-alpha.16 → 0.1.0-alpha.19
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.md +32 -0
- package/dist/browser.d.ts +19 -4
- package/dist/browser.js +68 -10
- package/dist/browser.js.map +1 -1
- package/dist/{chunk-JM2QORKH.js → chunk-3E75CCDQ.js} +1330 -432
- package/dist/chunk-3E75CCDQ.js.map +1 -0
- package/dist/{core-types-aT8pmvMq.d.ts → core-function-config.node-Baqu9RZ3.d.ts} +245 -3
- package/dist/node.d.ts +4 -205
- package/dist/node.js +16 -9
- package/dist/node.js.map +1 -1
- package/package.json +7 -7
- package/dist/chunk-JM2QORKH.js.map +0 -1
package/README.md
CHANGED
|
@@ -58,6 +58,7 @@ const prefixed = core.id.withPrefix('order_')
|
|
|
58
58
|
|
|
59
59
|
// 工具函数
|
|
60
60
|
core.object.deepMerge(objA, objB)
|
|
61
|
+
core.sanitize.sanitizeSensitiveFields({ password: 'secret', email: 'user@example.com' })
|
|
61
62
|
core.string.capitalize('hello')
|
|
62
63
|
core.array.unique([1, 1, 2, 3])
|
|
63
64
|
core.array.chunk([1, 2, 3, 4, 5], 2) // [[1,2], [3,4], [5]]
|
|
@@ -83,6 +84,13 @@ core.string.capitalize('hello')
|
|
|
83
84
|
core.array.unique([1, 1, 2])
|
|
84
85
|
```
|
|
85
86
|
|
|
87
|
+
浏览器端会保留 `core.config` API 形态以匹配类型定义,但不支持文件配置:
|
|
88
|
+
|
|
89
|
+
- `core.config.get()` 返回 `undefined`,`has()` 返回 `false`,`keys()` 返回 `[]`
|
|
90
|
+
- `load()` / `validate()` / `reload()` 返回 `HaiCommonError.SERVICE_UNAVAILABLE`
|
|
91
|
+
- `watch()` 会立即用同一错误调用回调,并返回安全的 no-op 取消函数
|
|
92
|
+
- 需要配置时请由服务端读取后通过接口下发,或只在浏览器端用 `core.init({ logging })` 配置日志
|
|
93
|
+
|
|
86
94
|
## 详细 API
|
|
87
95
|
|
|
88
96
|
### 日志(Logger)
|
|
@@ -138,6 +146,8 @@ core.logger.setLevel('debug')
|
|
|
138
146
|
const level = core.logger.getLevel() // 'debug'
|
|
139
147
|
```
|
|
140
148
|
|
|
149
|
+
`core.logger` 默认会对日志上下文执行安全脱敏:`password`、`token`、`secret`、`privateKey`、`apiV3Key` 等凭证类字段会替换为 `[REDACTED]`,`url` / `baseUrl` / `endpoint` 这类字段只会掩码 URL 中内嵌的用户名和密码;邮箱、手机号默认不会被遮盖。
|
|
150
|
+
|
|
141
151
|
#### 日志级别规范
|
|
142
152
|
|
|
143
153
|
| 级别 | 适用场景 |
|
|
@@ -173,6 +183,26 @@ core.i18n.DEFAULT_LOCALES // [{ code: 'zh-CN', label: '简体中文' }, { code:
|
|
|
173
183
|
core.i18n.DEFAULT_LOCALE // 'zh-CN'
|
|
174
184
|
```
|
|
175
185
|
|
|
186
|
+
### 脱敏工具
|
|
187
|
+
|
|
188
|
+
`core.sanitize.sanitizeSensitiveFields()` 可递归脱敏对象/数组中的敏感字段;默认会处理密码、token、secret、privateKey、apiV3Key 等凭证类字段,并自动掩码 `url` / `baseUrl` / `endpoint` 字段中的内嵌凭证。模块也可自定义 matcher。
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
core.sanitize.sanitizeSensitiveFields({
|
|
192
|
+
email: 'user@example.com',
|
|
193
|
+
password: 'secret',
|
|
194
|
+
baseUrl: 'https://user:pass@example.com/api/v1',
|
|
195
|
+
profile: { token: 'jwt-token' },
|
|
196
|
+
})
|
|
197
|
+
// => { email: 'user@example.com', password: '[REDACTED]', baseUrl: 'https://[REDACTED]:[REDACTED]@example.com/api/v1', profile: { token: '[REDACTED]' } }
|
|
198
|
+
|
|
199
|
+
core.sanitize.sanitizeSensitiveFields({ email: 'user@example.com' }, {
|
|
200
|
+
matcher: /email/i,
|
|
201
|
+
replacement: '***',
|
|
202
|
+
})
|
|
203
|
+
// => { email: '***' }
|
|
204
|
+
```
|
|
205
|
+
|
|
176
206
|
### Zod 校验错误 i18n 映射
|
|
177
207
|
|
|
178
208
|
`core.zodValidation` 用于把 Zod `SafeParseError` / `ZodError` 转为扁平表单错误,并将 Zod
|
|
@@ -236,6 +266,8 @@ if (!result.success) {
|
|
|
236
266
|
|
|
237
267
|
### 配置管理(Node.js 专用)
|
|
238
268
|
|
|
269
|
+
> 浏览器端没有文件系统,`core.config` 仅提供占位 API:文件相关方法返回 `SERVICE_UNAVAILABLE`,不会加载 YAML。
|
|
270
|
+
|
|
239
271
|
```typescript
|
|
240
272
|
import { core, HaiConfigError } from '@h-ai/core'
|
|
241
273
|
import { z } from 'zod'
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
3
|
-
import 'zod';
|
|
1
|
+
import { l as HaiResult, W as WatchCallback, a as CoreOptions, e as CoreLogger, O as I18nFn, Q as zodValidation, R as IdFn, T as TypeUtilFn, S as ObjectFn, U as SanitizeFn, X as StringFn, Y as ArrayFn, _ as AsyncFn, $ as TimeFn, a0 as ErrorFn, a1 as ModuleFn } from './core-function-config.node-Baqu9RZ3.js';
|
|
2
|
+
export { b as CoreConfig, d as CoreConfigSchema, C as CoreFunctions, E as Env, f as EnvSchema, g as ErrorInfo, h as ErrorInfoValue, H as HaiCommonError, i as HaiConfigError, j as HaiError, k as HaiErrorDef, I as IdConfig, m as IdConfigSchema, n as InterpolationParams, L as Locale, o as LocaleInfo, p as LocaleMessages, q as LogContext, r as LogFormat, s as LogFormatSchema, t as LogLevel, u as LogLevelSchema, v as Logger, w as LoggerFunctions, x as LoggerOptions, y as LoggingConfig, z as LoggingConfigSchema, M as MatchHandlers, A as MessageDictionary, B as MessageOptions, P as PaginatedResult, D as PaginationOptions, F as PaginationOptionsInput, V as ValidationFormError, Z as ZodMessageGetter, G as ZodValidationFn, J as ZodValidationMessageKey, K as err, N as ok } from './core-function-config.node-Baqu9RZ3.js';
|
|
3
|
+
import * as zod from 'zod';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Core 服务对象 - 聚合常用功能(浏览器)。
|
|
@@ -12,6 +12,20 @@ import 'zod';
|
|
|
12
12
|
* ```
|
|
13
13
|
*/
|
|
14
14
|
declare const core: {
|
|
15
|
+
/** 配置管理(浏览器端不支持文件配置,方法返回 SERVICE_UNAVAILABLE) */
|
|
16
|
+
config: {
|
|
17
|
+
load<T>(name: string, filePath: string, schema?: zod.ZodType<T>): HaiResult<T>;
|
|
18
|
+
validate<T>(name: string, schema: zod.ZodType<T>): HaiResult<T>;
|
|
19
|
+
get<T>(name: string): T | undefined;
|
|
20
|
+
getOrThrow<T>(name: string): T;
|
|
21
|
+
reload(name: string): HaiResult<unknown>;
|
|
22
|
+
has(name: string): boolean;
|
|
23
|
+
clear(name?: string): void;
|
|
24
|
+
keys(): string[];
|
|
25
|
+
watch<T = unknown>(name: string, callback: WatchCallback<T>): () => void;
|
|
26
|
+
unwatch(name?: string): void;
|
|
27
|
+
isWatching(name: string): boolean;
|
|
28
|
+
};
|
|
15
29
|
/** 初始化 Core */
|
|
16
30
|
init: typeof initCore;
|
|
17
31
|
logger: CoreLogger;
|
|
@@ -20,6 +34,7 @@ declare const core: {
|
|
|
20
34
|
id: IdFn;
|
|
21
35
|
typeUtils: TypeUtilFn;
|
|
22
36
|
object: ObjectFn;
|
|
37
|
+
sanitize: SanitizeFn;
|
|
23
38
|
string: StringFn;
|
|
24
39
|
array: ArrayFn;
|
|
25
40
|
async: AsyncFn;
|
|
@@ -41,4 +56,4 @@ declare const core: {
|
|
|
41
56
|
*/
|
|
42
57
|
declare function initCore(options?: CoreOptions): void;
|
|
43
58
|
|
|
44
|
-
export { CoreLogger, CoreOptions, core };
|
|
59
|
+
export { CoreLogger, CoreOptions, HaiResult, core };
|
package/dist/browser.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { __commonJS, __toESM, createCore } from './chunk-
|
|
2
|
-
export { CoreConfigSchema, EnvSchema, HaiCommonError, HaiConfigError, IdConfigSchema, LogFormatSchema, LogLevelSchema, LoggingConfigSchema, err, ok } from './chunk-
|
|
1
|
+
import { __commonJS, __toESM, createCore, i18n, err, HaiCommonError, sanitize } from './chunk-3E75CCDQ.js';
|
|
2
|
+
export { CoreConfigSchema, EnvSchema, HaiCommonError, HaiConfigError, IdConfigSchema, LogFormatSchema, LogLevelSchema, LoggingConfigSchema, err, ok } from './chunk-3E75CCDQ.js';
|
|
3
3
|
|
|
4
4
|
// ../../node_modules/loglevel/lib/loglevel.js
|
|
5
5
|
var require_loglevel = __commonJS({
|
|
@@ -252,6 +252,55 @@ var require_loglevel = __commonJS({
|
|
|
252
252
|
}
|
|
253
253
|
});
|
|
254
254
|
|
|
255
|
+
// src/functions/core-function-config.browser.ts
|
|
256
|
+
function unsupported() {
|
|
257
|
+
return err(
|
|
258
|
+
HaiCommonError.SERVICE_UNAVAILABLE,
|
|
259
|
+
i18n.coreM("core_configUnsupportedInBrowser")
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
function unsupportedError() {
|
|
263
|
+
const result = unsupported();
|
|
264
|
+
if (!result.success)
|
|
265
|
+
return result.error;
|
|
266
|
+
throw new Error(i18n.coreM("core_configUnsupportedInBrowser"));
|
|
267
|
+
}
|
|
268
|
+
var config = {
|
|
269
|
+
load(_name, _filePath, _schema) {
|
|
270
|
+
return unsupported();
|
|
271
|
+
},
|
|
272
|
+
validate(_name, _schema) {
|
|
273
|
+
return unsupported();
|
|
274
|
+
},
|
|
275
|
+
get(_name) {
|
|
276
|
+
return void 0;
|
|
277
|
+
},
|
|
278
|
+
getOrThrow(_name) {
|
|
279
|
+
throw new Error(i18n.coreM("core_configUnsupportedInBrowser"));
|
|
280
|
+
},
|
|
281
|
+
reload(_name) {
|
|
282
|
+
return unsupported();
|
|
283
|
+
},
|
|
284
|
+
has(_name) {
|
|
285
|
+
return false;
|
|
286
|
+
},
|
|
287
|
+
clear(_name) {
|
|
288
|
+
},
|
|
289
|
+
keys() {
|
|
290
|
+
return [];
|
|
291
|
+
},
|
|
292
|
+
watch(_name, callback) {
|
|
293
|
+
callback(null, unsupportedError());
|
|
294
|
+
return () => {
|
|
295
|
+
};
|
|
296
|
+
},
|
|
297
|
+
unwatch(_name) {
|
|
298
|
+
},
|
|
299
|
+
isWatching(_name) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
|
|
255
304
|
// src/functions/core-function-logger.browser.ts
|
|
256
305
|
var import_loglevel = __toESM(require_loglevel(), 1);
|
|
257
306
|
var globalLevel = "info";
|
|
@@ -266,13 +315,13 @@ var LEVEL_MAP = {
|
|
|
266
315
|
fatal: "error"
|
|
267
316
|
// loglevel 没有 fatal
|
|
268
317
|
};
|
|
269
|
-
function configureLogger(
|
|
270
|
-
if (
|
|
271
|
-
globalLevel =
|
|
272
|
-
import_loglevel.default.setLevel(LEVEL_MAP[
|
|
318
|
+
function configureLogger(config2) {
|
|
319
|
+
if (config2.level) {
|
|
320
|
+
globalLevel = config2.level;
|
|
321
|
+
import_loglevel.default.setLevel(LEVEL_MAP[config2.level]);
|
|
273
322
|
}
|
|
274
|
-
if (
|
|
275
|
-
globalContext = { ...globalContext, ...
|
|
323
|
+
if (config2.context) {
|
|
324
|
+
globalContext = { ...globalContext, ...config2.context };
|
|
276
325
|
}
|
|
277
326
|
defaultLogger = null;
|
|
278
327
|
}
|
|
@@ -283,11 +332,18 @@ function setLogLevel(level) {
|
|
|
283
332
|
function getLogLevel() {
|
|
284
333
|
return globalLevel;
|
|
285
334
|
}
|
|
335
|
+
function sanitizeLogContext(ctx) {
|
|
336
|
+
if (!ctx || Object.keys(ctx).length === 0) {
|
|
337
|
+
return ctx;
|
|
338
|
+
}
|
|
339
|
+
return sanitize.sanitizeSensitiveFields(ctx);
|
|
340
|
+
}
|
|
286
341
|
function formatMessage(message, context) {
|
|
287
|
-
|
|
342
|
+
const sanitizedContext = sanitizeLogContext(context);
|
|
343
|
+
if (!sanitizedContext || Object.keys(sanitizedContext).length === 0) {
|
|
288
344
|
return message;
|
|
289
345
|
}
|
|
290
|
-
return `${message} ${JSON.stringify(
|
|
346
|
+
return `${message} ${JSON.stringify(sanitizedContext)}`;
|
|
291
347
|
}
|
|
292
348
|
function wrapLoglevel(loggerInstance, baseContext) {
|
|
293
349
|
return {
|
|
@@ -346,6 +402,8 @@ function createBrowserCore() {
|
|
|
346
402
|
});
|
|
347
403
|
return {
|
|
348
404
|
...baseCore,
|
|
405
|
+
/** 配置管理(浏览器端不支持文件配置,方法返回 SERVICE_UNAVAILABLE) */
|
|
406
|
+
config,
|
|
349
407
|
/** 初始化 Core */
|
|
350
408
|
init: initCore
|
|
351
409
|
};
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/loglevel/lib/loglevel.js","../src/functions/core-function-logger.browser.ts","../src/core-main.browser.ts"],"names":["exports","defaultLogger","getLogger","logger","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 — Logger(浏览器版本,基于 loglevel)\n *\n * 提供统一的日志接口,浏览器环境使用 loglevel 实现。\n * @module core-function-logger.browser\n */\n\nimport type { LoggingConfig, LogLevel } from '../core-config.js'\nimport type { LogContext, Logger, LoggerFunctions, LoggerOptions } from '../core-types.js'\nimport log from 'loglevel'\n\n// ─── 全局配置 ───\n\n/** 全局日志级别(默认 'info') */\nlet globalLevel: LogLevel = 'info'\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 // 重置默认 logger 缓存,使下次 getLogger() 返回新配置的实例\n defaultLogger = null\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\n// ─── Logger 实现 ───\n\n/**\n * 格式化日志消息。\n *\n * 将消息文本与上下文拼接为单行输出(上下文序列化为 JSON)。\n *\n * @param message - 日志文本\n * @param context - 日志上下文(空对象时不输出)\n * @returns 格式化后的字符串\n */\nfunction formatMessage(message: string, context?: LogContext): string {\n if (!context || Object.keys(context).length === 0) {\n return message\n }\n return `${message} ${JSON.stringify(context)}`\n}\n\n/**\n * 创建 Logger 包装。\n *\n * 将 loglevel 实例包装为统一 Logger 接口,自动合并基础上下文。\n *\n * @param loggerInstance - loglevel 实例\n * @param baseContext - 基础上下文(会与每次调用时的 ctx 合并)\n * @returns 统一 Logger 实例\n */\nfunction wrapLoglevel(loggerInstance: log.Logger, baseContext: Record<string, unknown>): Logger {\n return {\n trace(message: string, ctx?: LogContext) {\n loggerInstance.trace(formatMessage(message, { ...baseContext, ...ctx }))\n },\n debug(message: string, ctx?: LogContext) {\n loggerInstance.debug(formatMessage(message, { ...baseContext, ...ctx }))\n },\n info(message: string, ctx?: LogContext) {\n loggerInstance.info(formatMessage(message, { ...baseContext, ...ctx }))\n },\n warn(message: string, ctx?: LogContext) {\n loggerInstance.warn(formatMessage(message, { ...baseContext, ...ctx }))\n },\n error(message: string, ctx?: LogContext) {\n loggerInstance.error(formatMessage(message, { ...baseContext, ...ctx }))\n },\n fatal(message: string, ctx?: LogContext) {\n loggerInstance.error(`[FATAL] ${formatMessage(message, { ...baseContext, ...ctx })}`)\n },\n child(childContext: Record<string, unknown>): Logger {\n return wrapLoglevel(loggerInstance, { ...baseContext, ...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: 'web' })\n * appLogger.info('ready')\n * ```\n */\nfunction createLogger(options: LoggerOptions = {}): Logger {\n const { name, level, context } = options\n\n // 创建或获取 logger 实例\n const loggerInstance = name ? log.getLogger(name) : log\n\n // 设置级别\n const effectiveLevel = level ?? globalLevel\n loggerInstance.setLevel(LEVEL_MAP[effectiveLevel])\n\n return wrapLoglevel(loggerInstance, { ...globalContext, ...context })\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 { 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 功能\n return {\n ...baseCore,\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":["exports","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 { 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/** 全局默认上下文(每条日志自动附带) */\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 // 重置默认 logger 缓存,使下次 getLogger() 返回新配置的实例\n defaultLogger = null\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 return sanitizeUtils.sanitizeSensitiveFields(ctx) as LogContext\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): string {\n const sanitizedContext = sanitizeLogContext(context)\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 loggerInstance - loglevel 实例\n * @param baseContext - 基础上下文(会与每次调用时的 ctx 合并)\n * @returns 统一 Logger 实例\n */\nfunction wrapLoglevel(loggerInstance: log.Logger, baseContext: Record<string, unknown>): Logger {\n return {\n trace(message: string, ctx?: LogContext) {\n loggerInstance.trace(formatMessage(message, { ...baseContext, ...ctx }))\n },\n debug(message: string, ctx?: LogContext) {\n loggerInstance.debug(formatMessage(message, { ...baseContext, ...ctx }))\n },\n info(message: string, ctx?: LogContext) {\n loggerInstance.info(formatMessage(message, { ...baseContext, ...ctx }))\n },\n warn(message: string, ctx?: LogContext) {\n loggerInstance.warn(formatMessage(message, { ...baseContext, ...ctx }))\n },\n error(message: string, ctx?: LogContext) {\n loggerInstance.error(formatMessage(message, { ...baseContext, ...ctx }))\n },\n fatal(message: string, ctx?: LogContext) {\n loggerInstance.error(`[FATAL] ${formatMessage(message, { ...baseContext, ...ctx })}`)\n },\n child(childContext: Record<string, unknown>): Logger {\n return wrapLoglevel(loggerInstance, { ...baseContext, ...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: 'web' })\n * appLogger.info('ready')\n * ```\n */\nfunction createLogger(options: LoggerOptions = {}): Logger {\n const { name, level, context } = options\n\n // 创建或获取 logger 实例\n const loggerInstance = name ? log.getLogger(name) : log\n\n // 设置级别\n const effectiveLevel = level ?? globalLevel\n loggerInstance.setLevel(LEVEL_MAP[effectiveLevel])\n\n return wrapLoglevel(loggerInstance, { ...globalContext, ...context })\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"]}
|