@pori15/logixlysia 6.0.11 → 6.0.13
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/dist/index.d.ts +225 -0
- package/dist/index.js +832 -0
- package/package.json +2 -2
- package/src/Error/errors.ts +156 -156
- package/src/Error/type.ts +10 -10
- package/src/extensions/banner.ts +26 -26
- package/src/extensions/index.ts +28 -28
- package/src/helpers/status.ts +58 -58
- package/src/index.ts +151 -151
- package/src/interfaces.ts +207 -207
- package/src/logger/create-logger.ts +238 -238
- package/src/logger/handle-http-error.ts +134 -134
- package/src/logger/index.ts +89 -89
- package/src/output/file.ts +40 -40
- package/src/output/fs.ts +5 -5
- package/src/output/index.ts +42 -42
- package/src/output/rotation-manager.ts +121 -121
- package/src/utils/format.ts +2 -2
- package/src/utils/get-error-code.ts +23 -23
- package/src/utils/handle-error.ts +149 -149
- package/src/utils/rotation.ts +91 -91
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { Elysia, SingletonBase } from "elysia";
|
|
2
|
+
import { Logger as PinoLogger, LoggerOptions as PinoLoggerOptions } from "pino";
|
|
3
|
+
interface ProblemDocument {
|
|
4
|
+
detail?: string;
|
|
5
|
+
instance?: string;
|
|
6
|
+
status?: number;
|
|
7
|
+
title: string;
|
|
8
|
+
type: string;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* RFC 9457 Problem Details Error
|
|
13
|
+
*
|
|
14
|
+
* Core members:
|
|
15
|
+
* - type: URI reference identifying the problem type (default "about:blank")
|
|
16
|
+
* - title: Short human-readable summary
|
|
17
|
+
* - status: HTTP status code
|
|
18
|
+
* - detail: Human-readable explanation for this occurrence
|
|
19
|
+
* - instance: URI reference identifying this specific occurrence
|
|
20
|
+
* - extensions: Additional properties serialized as-is
|
|
21
|
+
*/
|
|
22
|
+
declare class ProblemError extends Error {
|
|
23
|
+
readonly status: number;
|
|
24
|
+
readonly title: string;
|
|
25
|
+
readonly type: string;
|
|
26
|
+
readonly detail?: string;
|
|
27
|
+
readonly instance?: string;
|
|
28
|
+
readonly extensions?: Record<string, unknown>;
|
|
29
|
+
constructor(type: string | undefined, title: string, status: number, detail?: string, instance?: string, extensions?: Record<string, unknown>);
|
|
30
|
+
toJSON(): ProblemDocument;
|
|
31
|
+
}
|
|
32
|
+
interface ProblemConfig {
|
|
33
|
+
detail?: string;
|
|
34
|
+
extensions?: Record<string, unknown>;
|
|
35
|
+
instance?: string;
|
|
36
|
+
title?: string;
|
|
37
|
+
type?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 工厂函数:根据 HTTP 状态码快速创建 ProblemError
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* throw createProblem(400, { detail: 'Invalid email' })
|
|
44
|
+
* throw createProblem(409, { title: 'Duplicate', detail: 'Email already exists' })
|
|
45
|
+
*/
|
|
46
|
+
declare const createProblem: (status: number, overrides?: ProblemConfig) => ProblemError;
|
|
47
|
+
type HttpErrorFactory = (detail?: string, extensions?: Record<string, unknown>) => ProblemError;
|
|
48
|
+
interface HttpErrorConstructor {
|
|
49
|
+
BadGateway: HttpErrorFactory;
|
|
50
|
+
BadRequest: HttpErrorFactory;
|
|
51
|
+
Conflict: HttpErrorFactory;
|
|
52
|
+
Forbidden: HttpErrorFactory;
|
|
53
|
+
GatewayTimeout: HttpErrorFactory;
|
|
54
|
+
InternalServerError: HttpErrorFactory;
|
|
55
|
+
MethodNotAllowed: HttpErrorFactory;
|
|
56
|
+
NotAcceptable: HttpErrorFactory;
|
|
57
|
+
NotFound: HttpErrorFactory;
|
|
58
|
+
NotImplemented: HttpErrorFactory;
|
|
59
|
+
PaymentRequired: HttpErrorFactory;
|
|
60
|
+
ServiceUnavailable: HttpErrorFactory;
|
|
61
|
+
Unauthorized: HttpErrorFactory;
|
|
62
|
+
}
|
|
63
|
+
declare const HttpError: HttpErrorConstructor;
|
|
64
|
+
type Code = number | "PROBLEM_ERROR" | "UNKNOWN" | "VALIDATION" | "NOT_FOUND" | "PARSE" | "INTERNAL_SERVER_ERROR" | "INVALID_COOKIE_SIGNATURE" | "INVALID_FILE_TYPE";
|
|
65
|
+
/** Pino Logger 实例类型 */
|
|
66
|
+
type Pino = PinoLogger<never, boolean>;
|
|
67
|
+
/** 日志级别 */
|
|
68
|
+
type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
|
|
69
|
+
/** 单次请求携带的计时和路径数据 */
|
|
70
|
+
interface StoreData {
|
|
71
|
+
/** 请求开始的纳秒时间戳(hrtime) */
|
|
72
|
+
beforeTime: bigint;
|
|
73
|
+
/** 缓存的 URL pathname,避免重复解析 */
|
|
74
|
+
pathname: string;
|
|
75
|
+
}
|
|
76
|
+
/** Elysia store 中挂载的 logixlysia 状态 */
|
|
77
|
+
interface LogixlysiaStore {
|
|
78
|
+
beforeTime?: bigint;
|
|
79
|
+
logger: Logger;
|
|
80
|
+
pathname?: string;
|
|
81
|
+
pino: Pino;
|
|
82
|
+
[key: string]: unknown;
|
|
83
|
+
}
|
|
84
|
+
/** 自定义日志传输接口(如 Elasticsearch、Slack 等) */
|
|
85
|
+
interface Transport {
|
|
86
|
+
/**
|
|
87
|
+
* 接收一条日志并输出到外部系统
|
|
88
|
+
*
|
|
89
|
+
* @param level - 日志级别
|
|
90
|
+
* @param message - 日志消息
|
|
91
|
+
* @param meta - 附加元数据(请求信息、耗时等)
|
|
92
|
+
*/
|
|
93
|
+
log: (level: LogLevel, message: string, meta?: Record<string, unknown>) => void | Promise<void>;
|
|
94
|
+
}
|
|
95
|
+
/** 日志文件轮转配置 */
|
|
96
|
+
interface LogRotationConfig {
|
|
97
|
+
/** 轮转后是否压缩旧文件 */
|
|
98
|
+
compress?: boolean;
|
|
99
|
+
/** 压缩算法 */
|
|
100
|
+
compression?: "gzip";
|
|
101
|
+
/** 固定间隔轮转,如 `'1d'`、`'12h'` */
|
|
102
|
+
interval?: string;
|
|
103
|
+
/** 保留的最大文件数量或时长,如 `10` 或 `'7d'` */
|
|
104
|
+
maxFiles?: number | string;
|
|
105
|
+
/** 单个日志文件最大体积,如 `'10m'`、`'5k'`,或字节数 */
|
|
106
|
+
maxSize?: string | number;
|
|
107
|
+
}
|
|
108
|
+
/** 错误码到 HTTP 响应的映射条目 */
|
|
109
|
+
interface ErrorMapping {
|
|
110
|
+
/** 错误详情描述 */
|
|
111
|
+
detail?: string;
|
|
112
|
+
/** HTTP 状态码 */
|
|
113
|
+
status: number;
|
|
114
|
+
/** 错误标题 */
|
|
115
|
+
title: string;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 自定义错误解析回调
|
|
119
|
+
*
|
|
120
|
+
* 返回 `ProblemError` 表示已处理,返回 `void` 交给下一层处理
|
|
121
|
+
*/
|
|
122
|
+
type ErrorResolver = (error: unknown, context: {
|
|
123
|
+
code: Code;
|
|
124
|
+
path: string;
|
|
125
|
+
request: Request;
|
|
126
|
+
}) => ProblemError | void;
|
|
127
|
+
/** 启动消息配置 */
|
|
128
|
+
interface StartupConfig {
|
|
129
|
+
/** 启动消息格式,默认 `"banner"` */
|
|
130
|
+
format?: "simple" | "banner";
|
|
131
|
+
/** 是否显示启动消息,默认 `true` */
|
|
132
|
+
show?: boolean;
|
|
133
|
+
}
|
|
134
|
+
/** 日志格式配置 */
|
|
135
|
+
interface FormatConfig {
|
|
136
|
+
/** 是否启用彩色输出,默认 `true`(仅 TTY) */
|
|
137
|
+
colors?: boolean;
|
|
138
|
+
/** 是否在日志中显示请求 IP,默认 `false` */
|
|
139
|
+
showIp?: boolean;
|
|
140
|
+
/** 自定义日志模板,如 `'🦊 {now} {level} {method} {pathname} {status}'` */
|
|
141
|
+
template?: string;
|
|
142
|
+
/** 时间戳格式,如 `'yyyy-mm-dd HH:MM:ss.SSS'` */
|
|
143
|
+
timestamp?: string;
|
|
144
|
+
}
|
|
145
|
+
/** 文件日志配置 */
|
|
146
|
+
interface FileConfig {
|
|
147
|
+
/** 日志文件路径(必填) */
|
|
148
|
+
path: string;
|
|
149
|
+
/** 日志轮转配置 */
|
|
150
|
+
rotation?: LogRotationConfig;
|
|
151
|
+
}
|
|
152
|
+
/** 自定义传输配置 */
|
|
153
|
+
interface TransportsConfig {
|
|
154
|
+
/** 设为 `true` 时只使用 transports,禁用控制台和文件输出 */
|
|
155
|
+
only?: boolean;
|
|
156
|
+
/** 传输目标列表 */
|
|
157
|
+
targets: Transport[];
|
|
158
|
+
}
|
|
159
|
+
/** 错误处理配置 */
|
|
160
|
+
interface ErrorConfig {
|
|
161
|
+
/** 错误码映射表(Postgres / MySQL / 自定义错误码) */
|
|
162
|
+
errorMap?: Record<string, ErrorMapping>;
|
|
163
|
+
/** 自定义错误解析回调 */
|
|
164
|
+
resolve?: ErrorResolver;
|
|
165
|
+
/** 自定义错误类型的 Base URL(RFC 9457) */
|
|
166
|
+
typeBaseUrl?: string;
|
|
167
|
+
/** 是否在控制台显示完整错误详情(detail、extensions),默认 `false` */
|
|
168
|
+
verbose?: boolean;
|
|
169
|
+
}
|
|
170
|
+
/** Logixlysia 插件配置 */
|
|
171
|
+
interface Options {
|
|
172
|
+
/** 错误处理配置 */
|
|
173
|
+
error?: ErrorConfig;
|
|
174
|
+
/** 文件日志配置,设为 `false` 禁用文件日志 */
|
|
175
|
+
file?: false | FileConfig;
|
|
176
|
+
/** 日志格式配置 */
|
|
177
|
+
format?: FormatConfig;
|
|
178
|
+
/** 日志级别过滤,接受单个级别或级别数组 */
|
|
179
|
+
logLevel?: LogLevel | LogLevel[];
|
|
180
|
+
/** Pino Logger 原生配置透传 */
|
|
181
|
+
pino?: PinoLoggerOptions;
|
|
182
|
+
/** 启动消息配置 */
|
|
183
|
+
startup?: StartupConfig;
|
|
184
|
+
/** 自定义传输(数组或带 `only` 选项的对象) */
|
|
185
|
+
transports?: Transport[] | TransportsConfig;
|
|
186
|
+
}
|
|
187
|
+
/** Logger 实例,可通过 `store.logger` 访问 */
|
|
188
|
+
interface Logger {
|
|
189
|
+
/** 记录 DEBUG 级别日志 */
|
|
190
|
+
debug: (request: Request, message: string, context?: Record<string, unknown>) => void;
|
|
191
|
+
/** 记录 ERROR 级别日志 */
|
|
192
|
+
error: (request: Request, message: string, context?: Record<string, unknown>) => void;
|
|
193
|
+
/** 处理 HTTP 错误并输出日志 */
|
|
194
|
+
handleHttpError: (request: Request, error: ProblemError, store: StoreData, options: Options) => void;
|
|
195
|
+
/** 记录 INFO 级别日志 */
|
|
196
|
+
info: (request: Request, message: string, context?: Record<string, unknown>) => void;
|
|
197
|
+
/** 记录指定级别的日志 */
|
|
198
|
+
log: (level: LogLevel, request: Request, data: Record<string, unknown>, store: StoreData) => void;
|
|
199
|
+
/** 底层 Pino Logger 实例 */
|
|
200
|
+
pino: Pino;
|
|
201
|
+
/** 记录 WARNING 级别日志 */
|
|
202
|
+
warn: (request: Request, message: string, context?: Record<string, unknown>) => void;
|
|
203
|
+
}
|
|
204
|
+
/** Logixlysia 请求上下文 */
|
|
205
|
+
interface LogixlysiaContext {
|
|
206
|
+
request: Request;
|
|
207
|
+
store: LogixlysiaStore;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* 递归提取错误码
|
|
211
|
+
* 沿 cause/error 链递归查找,支持被包装的底层错误(Postgres、MySQL、第三方库等)
|
|
212
|
+
*/
|
|
213
|
+
declare const getErrorCode: (error: unknown) => string | undefined;
|
|
214
|
+
interface NormalizeOptions {
|
|
215
|
+
errorMap?: Record<string, ErrorMapping>;
|
|
216
|
+
request?: Request;
|
|
217
|
+
resolve?: ErrorResolver;
|
|
218
|
+
typeBaseUrl?: string;
|
|
219
|
+
}
|
|
220
|
+
declare const normalizeToProblem: (error: unknown, code: Code, path: string, options?: NormalizeOptions) => ProblemError;
|
|
221
|
+
type Logixlysia = Elysia<"Logixlysia", SingletonBase & {
|
|
222
|
+
store: LogixlysiaStore;
|
|
223
|
+
}>;
|
|
224
|
+
declare const logixlysia: (options?: Options) => Logixlysia;
|
|
225
|
+
export { normalizeToProblem, logixlysia, getErrorCode, logixlysia as default, createProblem, TransportsConfig, Transport, StoreData, StartupConfig, ProblemError, ProblemDocument, ProblemConfig, Pino, Options, LogixlysiaStore, LogixlysiaContext, Logixlysia, Logger, LogLevel, HttpErrorConstructor, HttpError, FormatConfig, FileConfig, ErrorResolver, ErrorMapping, ErrorConfig, Code };
|