@pedrohb/errors 0.0.0-stage → 1.0.0
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/LICENSE +21 -0
- package/README.md +52 -3
- package/dist/error-params-CR2parjT.d.cts +387 -0
- package/dist/error-params-CR2parjT.d.mts +387 -0
- package/dist/errors/index.cjs +6 -0
- package/dist/errors/index.d.cts +115 -0
- package/dist/errors/index.d.mts +115 -0
- package/dist/errors/index.mjs +3 -0
- package/dist/errors-DrDL51y9.mjs +149 -0
- package/dist/errors-DrDL51y9.mjs.map +1 -0
- package/dist/errors-TgPe2YUV.cjs +178 -0
- package/dist/errors-TgPe2YUV.cjs.map +1 -0
- package/dist/functions/index.cjs +408 -0
- package/dist/functions/index.cjs.map +1 -0
- package/dist/functions/index.d.cts +3 -0
- package/dist/functions/index.d.mts +3 -0
- package/dist/functions/index.mjs +399 -0
- package/dist/functions/index.mjs.map +1 -0
- package/dist/index-B4tdSdCF.d.mts +544 -0
- package/dist/index-BzFCOXvr.d.cts +544 -0
- package/dist/index.cjs +637 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +510 -0
- package/dist/index.d.mts +510 -0
- package/dist/index.mjs +614 -0
- package/dist/index.mjs.map +1 -0
- package/dist/invalid-param-delimiters-error-BFxlVXp3.mjs +44 -0
- package/dist/invalid-param-delimiters-error-BFxlVXp3.mjs.map +1 -0
- package/dist/invalid-param-delimiters-error-C6UxV7cK.cjs +49 -0
- package/dist/invalid-param-delimiters-error-C6UxV7cK.cjs.map +1 -0
- package/dist/types/index.cjs +0 -0
- package/dist/types/index.d.cts +143 -0
- package/dist/types/index.d.mts +143 -0
- package/dist/types/index.mjs +1 -0
- package/package.json +117 -3
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
import { c as CatalogCode, f as DefaultParamDelimiters, l as ErrorCatalog, m as ErrorParamDelimiters, s as CatalogDescriptor, t as ErrorParams } from "./error-params-CR2parjT.mjs";
|
|
2
|
+
//#region src/functions/escape-reg-exp.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Escapa os caracteres especiais de expressões regulares em uma string, para
|
|
5
|
+
* que ela possa ser usada como texto literal dentro de um `RegExp`.
|
|
6
|
+
*
|
|
7
|
+
* Cada caractere especial (`. * + ? ^ $ { } ( ) | [ ] \`) é precedido por uma
|
|
8
|
+
* barra invertida. Caracteres comuns permanecem inalterados.
|
|
9
|
+
*
|
|
10
|
+
* Útil por exemplo, para montar uma expressão regular a partir de
|
|
11
|
+
* delimitadores informados pelo usuário (como os de placeholders), sem que
|
|
12
|
+
* símbolos como `[` ou `{` sejam interpretados como parte da sintaxe.
|
|
13
|
+
*
|
|
14
|
+
* @param value - String a ser escapada.
|
|
15
|
+
* @returns A string com os caracteres especiais escapados.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* escapeRegExp("{id}"); // "\\{id\\}"
|
|
20
|
+
* escapeRegExp("[nome]"); // "\\[nome\\]"
|
|
21
|
+
* escapeRegExp("a.b*c"); // "a\\.b\\*c"
|
|
22
|
+
* escapeRegExp("texto livre"); // "texto livre"
|
|
23
|
+
*
|
|
24
|
+
* const regex = new RegExp(escapeRegExp("(x)"), "g");
|
|
25
|
+
* "valor (x) aqui".replace(regex, "1"); // "valor 1 aqui"
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
declare function escapeRegExp(value: string): string;
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/base-error.d.ts
|
|
31
|
+
/**
|
|
32
|
+
* Opções aceitas pelo construtor de {@link BaseError}.
|
|
33
|
+
*
|
|
34
|
+
* Estende `ErrorOptions` (que fornece `cause`) e acrescenta:
|
|
35
|
+
* - `delimiters`: delimitadores dos placeholders da mensagem sempre opcional;
|
|
36
|
+
* - `params`: valores dos placeholders **exigido apenas** quando a mensagem
|
|
37
|
+
* do código possui placeholders (ver {@link ErrorParams}). Se a mensagem não
|
|
38
|
+
* tiver placeholders a propriedade `params` não existe no tipo.
|
|
39
|
+
*
|
|
40
|
+
* @template Catalog - Catálogo de erros ao qual o código pertence. Por padrão,
|
|
41
|
+
* `ErrorCatalog`.
|
|
42
|
+
* @template Code - Código do erro dentro do catálogo. Por padrão, todos os
|
|
43
|
+
* códigos do catálogo.
|
|
44
|
+
* @template Delimiters - Tipo dos delimitadores dos placeholders. Por padrão,
|
|
45
|
+
* {@link DefaultParamDelimiters}.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* // Mensagem sem placeholders: apenas `cause` e `delimiters` são aceitos
|
|
50
|
+
* type A = BaseErrorOptions<typeof ERROR_CODES, "INVALID_TOKEN">;
|
|
51
|
+
* // ErrorOptions & { delimiters?: DefaultParamDelimiters }
|
|
52
|
+
*
|
|
53
|
+
* // Mensagem com placeholders: `params` é obrigatório
|
|
54
|
+
* type B = BaseErrorOptions<typeof ERROR_CODES, "USER_NOT_FOUND">;
|
|
55
|
+
* // ErrorOptions & { params: Readonly<{ id: ErrorParamValue }>; delimiters?: ... }
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
type BaseErrorOptions<Catalog extends ErrorCatalog = ErrorCatalog, Code extends CatalogCode<Catalog> = CatalogCode<Catalog>, Delimiters extends ErrorParamDelimiters = DefaultParamDelimiters> = [ErrorParams<Catalog, Code, Delimiters>] extends [never] ? ErrorOptions & {
|
|
59
|
+
delimiters?: Delimiters;
|
|
60
|
+
} : ErrorOptions & {
|
|
61
|
+
params: ErrorParams<Catalog, Code, Delimiters>;
|
|
62
|
+
delimiters?: Delimiters;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Deriva em tempo de compilação a lista de argumentos de opções do
|
|
66
|
+
* construtor de {@link BaseError}.
|
|
67
|
+
*
|
|
68
|
+
* - Se a mensagem **não** tiver placeholders `options` é opcional.
|
|
69
|
+
* - Se tiver placeholders `options` é obrigatório (pois deve conter `params`).
|
|
70
|
+
*
|
|
71
|
+
* É pensado para ser usado como tipo de parâmetro rest (`...args`).
|
|
72
|
+
*
|
|
73
|
+
* @template Catalog - Catálogo de erros ao qual o código pertence. Por padrão,
|
|
74
|
+
* `ErrorCatalog`.
|
|
75
|
+
* @template Code - Código do erro dentro do catálogo. Por padrão, todos os
|
|
76
|
+
* códigos do catálogo.
|
|
77
|
+
* @template Delimiters - Tipo dos delimitadores dos placeholders. Por padrão,
|
|
78
|
+
* {@link DefaultParamDelimiters}.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```ts
|
|
82
|
+
* type A = BaseErrorOptionsArgs<typeof ERROR_CODES, "INVALID_TOKEN">;
|
|
83
|
+
* // [options?: BaseErrorOptions<...>]
|
|
84
|
+
*
|
|
85
|
+
* type B = BaseErrorOptionsArgs<typeof ERROR_CODES, "USER_NOT_FOUND">;
|
|
86
|
+
* // [options: BaseErrorOptions<...>]
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
type BaseErrorOptionsArgs<Catalog extends ErrorCatalog = ErrorCatalog, Code extends CatalogCode<Catalog> = CatalogCode<Catalog>, Delimiters extends ErrorParamDelimiters = DefaultParamDelimiters> = [ErrorParams<Catalog, Code, Delimiters>] extends [never] ? [options?: BaseErrorOptions<Catalog, Code, Delimiters>] : [options: BaseErrorOptions<Catalog, Code, Delimiters>];
|
|
90
|
+
/**
|
|
91
|
+
* Classe base abstrata para erros tipados a partir de um catálogo de erros.
|
|
92
|
+
*
|
|
93
|
+
* Cada erro é criado a partir de um descritor do catálogo (código e mensagem).
|
|
94
|
+
* A mensagem é interpolada com os `params` informados e o tipo dos `params` é
|
|
95
|
+
* derivado dos placeholders da mensagem, de modo que o compilador exige
|
|
96
|
+
* exatamente os parâmetros necessários.
|
|
97
|
+
*
|
|
98
|
+
* O construtor é `protected`: a classe não pode ser instanciada diretamente e
|
|
99
|
+
* deve ser estendida por classes que escolhem o descritor e repassam as
|
|
100
|
+
* opções.
|
|
101
|
+
*
|
|
102
|
+
* Além de `message`, `cause`, `stack` e `name` herdados de `Error`, a
|
|
103
|
+
* instância expõe:
|
|
104
|
+
* - `code`: o código do erro, com tipo literal;
|
|
105
|
+
* - `params`: os parâmetros usados na interpolação (ou `undefined`);
|
|
106
|
+
* - {@link BaseError.serialize} e {@link BaseError.toJSON} para serialização;
|
|
107
|
+
* - uma marca interna ({@link BASE_ERROR_BRAND}) que permite reconhecer o
|
|
108
|
+
* erro com {@link isBaseError} mesmo com múltiplas cópias do pacote.
|
|
109
|
+
*
|
|
110
|
+
* O `name` do erro é o nome da classe concreta (`new.target.name`) e o
|
|
111
|
+
* protótipo é ajustado explicitamente para que `instanceof` funcione em
|
|
112
|
+
* subclasses mesmo em alvos de compilação antigos.
|
|
113
|
+
*
|
|
114
|
+
* @template Catalog - Catálogo de erros ao qual o código pertence. Por padrão,
|
|
115
|
+
* `ErrorCatalog`.
|
|
116
|
+
* @template Code - Código do erro dentro do catálogo. Por padrão, todos os
|
|
117
|
+
* códigos do catálogo.
|
|
118
|
+
* @template Delimiters - Tipo dos delimitadores dos placeholders. Por padrão,
|
|
119
|
+
* {@link DefaultParamDelimiters}.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```ts
|
|
123
|
+
* const TEST_ERROR_CODES = defineErrorCatalog({
|
|
124
|
+
* USER_NOT_FOUND: "Usuário {id} não encontrado",
|
|
125
|
+
* INVALID_TOKEN: "Token inválido",
|
|
126
|
+
* });
|
|
127
|
+
*
|
|
128
|
+
* type TestErrorCodes = typeof TEST_ERROR_CODES;
|
|
129
|
+
*
|
|
130
|
+
* class UserNotFoundError extends BaseError<TestErrorCodes, "USER_NOT_FOUND"> {
|
|
131
|
+
* public constructor(id: number, options?: ErrorOptions) {
|
|
132
|
+
* super(TEST_ERROR_CODES.USER_NOT_FOUND, { params: { id }, ...options });
|
|
133
|
+
* }
|
|
134
|
+
* }
|
|
135
|
+
*
|
|
136
|
+
* class InvalidTokenError extends BaseError<TestErrorCodes, "INVALID_TOKEN"> {
|
|
137
|
+
* public constructor(options?: ErrorOptions) {
|
|
138
|
+
* super(TEST_ERROR_CODES.INVALID_TOKEN, options);
|
|
139
|
+
* }
|
|
140
|
+
* }
|
|
141
|
+
*
|
|
142
|
+
* const erro = new UserNotFoundError(42);
|
|
143
|
+
* erro.message; // "Usuário 42 não encontrado"
|
|
144
|
+
* erro.code; // "USER_NOT_FOUND"
|
|
145
|
+
* erro.params; // { id: 42 }
|
|
146
|
+
* erro.name; // "UserNotFoundError"
|
|
147
|
+
*
|
|
148
|
+
* BaseError.is(erro); // true
|
|
149
|
+
* JSON.stringify(erro); // usa toJSON(), sem stack trace
|
|
150
|
+
* erro.serialize(true); // inclui o stack trace
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
declare abstract class BaseError<Catalog extends ErrorCatalog = ErrorCatalog, Code extends CatalogCode<Catalog> = CatalogCode<Catalog>, Delimiters extends ErrorParamDelimiters = DefaultParamDelimiters> extends Error {
|
|
154
|
+
/** Código do erro conforme o catálogo (ex.: `"USER_NOT_FOUND"`). */
|
|
155
|
+
readonly code: Code;
|
|
156
|
+
/**
|
|
157
|
+
* Parâmetros usados para interpolar a mensagem. É `undefined` quando a
|
|
158
|
+
* mensagem não possui placeholders (ou quando nenhum `params` foi informado).
|
|
159
|
+
*/
|
|
160
|
+
readonly params?: ErrorParams<Catalog, Code, Delimiters>;
|
|
161
|
+
/**
|
|
162
|
+
* Cria um erro a partir de um descritor do catálogo.
|
|
163
|
+
*
|
|
164
|
+
* A mensagem do descritor é interpolada com `options.params` usando os
|
|
165
|
+
* delimitadores de `options.delimiters` (por padrão,
|
|
166
|
+
* {@link DEFAULT_PARAM_DELIMITERS}). Os delimitadores são usados apenas na
|
|
167
|
+
* interpolação e não são armazenados na instância. O objeto `options`
|
|
168
|
+
* também é repassado ao construtor de `Error`, que utiliza `cause`.
|
|
169
|
+
*
|
|
170
|
+
* É `protected` então só pode ser chamado por subclasses.
|
|
171
|
+
*
|
|
172
|
+
* @param descriptor - Descritor do erro no catálogo com `code` e `message`.
|
|
173
|
+
* @param args - Opções do erro ({@link BaseErrorOptions}). São obrigatórias
|
|
174
|
+
* se a mensagem tiver placeholders (por conter `params`) e opcionais caso
|
|
175
|
+
* contrário.
|
|
176
|
+
* @throws {InvalidParamDelimitersError} Se algum dos delimitadores for uma
|
|
177
|
+
* string vazia (lançado durante a interpolação).
|
|
178
|
+
*/
|
|
179
|
+
protected constructor(descriptor: CatalogDescriptor<Catalog, Code>, ...args: BaseErrorOptionsArgs<Catalog, Code, Delimiters>);
|
|
180
|
+
/**
|
|
181
|
+
* Marca interna que identifica a instância como um `BaseError`.
|
|
182
|
+
*
|
|
183
|
+
* Sempre retorna `true` e é lida por {@link isBaseError}. Por ser um
|
|
184
|
+
* getter definido no protótipo, não é uma propriedade própria da instância
|
|
185
|
+
* e portanto, não aparece em serializações nem em `Object.keys`.
|
|
186
|
+
*/
|
|
187
|
+
get [BASE_ERROR_BRAND](): boolean;
|
|
188
|
+
/**
|
|
189
|
+
* Serializa o erro para um objeto simples apropriado para `JSON.stringify`,
|
|
190
|
+
* logs ou transmissão. Veja {@link serializeBaseError} para os detalhes do
|
|
191
|
+
* formato retornado.
|
|
192
|
+
*
|
|
193
|
+
* @param includeStack - Se `true` inclui o stack trace no resultado (e na
|
|
194
|
+
* serialização de causas e parâmetros). Por padrão, `false`.
|
|
195
|
+
* @returns Representação serializável do erro.
|
|
196
|
+
*/
|
|
197
|
+
serialize(includeStack?: boolean): Readonly<{
|
|
198
|
+
cause?: unknown;
|
|
199
|
+
code: string;
|
|
200
|
+
message: string;
|
|
201
|
+
name: string;
|
|
202
|
+
params?: Readonly<Record<string, unknown>>;
|
|
203
|
+
stack?: string;
|
|
204
|
+
}>;
|
|
205
|
+
/**
|
|
206
|
+
* Chamado automaticamente por `JSON.stringify`. Equivale a
|
|
207
|
+
* {@link BaseError.serialize} sem stack trace.
|
|
208
|
+
*
|
|
209
|
+
* @returns Representação serializável do erro sem stack trace.
|
|
210
|
+
*/
|
|
211
|
+
toJSON(): Readonly<{
|
|
212
|
+
cause?: unknown;
|
|
213
|
+
code: string;
|
|
214
|
+
message: string;
|
|
215
|
+
name: string;
|
|
216
|
+
params?: Readonly<Record<string, unknown>>;
|
|
217
|
+
stack?: string;
|
|
218
|
+
}>;
|
|
219
|
+
/**
|
|
220
|
+
* Verifica se um valor é uma instância de `BaseError` (type guard).
|
|
221
|
+
*
|
|
222
|
+
* Atalho para {@link isBaseError}: usa a marca interna em vez de
|
|
223
|
+
* `instanceof` funcionando mesmo com múltiplas cópias do pacote.
|
|
224
|
+
*
|
|
225
|
+
* @param error - Valor a ser verificado.
|
|
226
|
+
* @returns `true` se `error` for um `BaseError`; caso contrário, `false`.
|
|
227
|
+
*/
|
|
228
|
+
static is(error: unknown): error is BaseError;
|
|
229
|
+
/**
|
|
230
|
+
* Serializa de forma segura qualquer valor usado como causa de um erro.
|
|
231
|
+
*
|
|
232
|
+
* Atalho para {@link serializeCauseError}: trata erros, datas, arrays,
|
|
233
|
+
* objetos, funções, `bigint`, `symbol` e referências circulares.
|
|
234
|
+
*
|
|
235
|
+
* @param cause - Valor a ser serializado.
|
|
236
|
+
* @param includeStack - Se `true` inclui o stack trace ao serializar
|
|
237
|
+
* erros. Por padrão, `false`.
|
|
238
|
+
* @returns Representação serializável do valor.
|
|
239
|
+
*/
|
|
240
|
+
static serializeCauseError(cause: unknown, includeStack?: boolean): unknown;
|
|
241
|
+
}
|
|
242
|
+
//#endregion
|
|
243
|
+
//#region src/functions/is-base-error.d.ts
|
|
244
|
+
/**
|
|
245
|
+
* Símbolo usado como marca ("brand") para identificar instâncias de
|
|
246
|
+
* `BaseError` em tempo de execução.
|
|
247
|
+
*
|
|
248
|
+
* É criado com `Symbol.for` que consulta o registro global de símbolos. Assim
|
|
249
|
+
* mesmo que o pacote seja carregado mais de uma vez (ex.: versões duplicadas
|
|
250
|
+
* em `node_modules` ou diferentes bundles), todas as cópias compartilham o
|
|
251
|
+
* mesmo símbolo e {@link isBaseError} continua reconhecendo os erros, algo que
|
|
252
|
+
* `instanceof` sozinho não garante.
|
|
253
|
+
*/
|
|
254
|
+
declare const BASE_ERROR_BRAND: unique symbol;
|
|
255
|
+
/**
|
|
256
|
+
* Verifica se um valor é uma instância de `BaseError` funcionando como um
|
|
257
|
+
* type guard.
|
|
258
|
+
*
|
|
259
|
+
* A checagem exige que o valor seja uma instância de `Error` e que possua a
|
|
260
|
+
* propriedade marcada por {@link BASE_ERROR_BRAND} com o valor `true`. Por
|
|
261
|
+
* usar a marca em vez de `instanceof BaseError`, o resultado é confiável
|
|
262
|
+
* mesmo quando há múltiplas cópias do pacote carregadas na mesma aplicação.
|
|
263
|
+
*
|
|
264
|
+
* @param value - Valor a ser verificado.
|
|
265
|
+
* @returns `true` se `value` for um `BaseError` (e nesse caso o TypeScript
|
|
266
|
+
* restringe o tipo para `BaseError`); caso contrário `false`.
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* ```ts
|
|
270
|
+
* try {
|
|
271
|
+
* await execute();
|
|
272
|
+
* } catch (error) {
|
|
273
|
+
* if (isBaseError(error)) {
|
|
274
|
+
* console.log(error.code); // `error` é tipado como BaseError
|
|
275
|
+
* } else {
|
|
276
|
+
* throw error;
|
|
277
|
+
* }
|
|
278
|
+
* }
|
|
279
|
+
*
|
|
280
|
+
* isBaseError(new Error("comum")); // false
|
|
281
|
+
* isBaseError("texto"); // false
|
|
282
|
+
* isBaseError(null); // false
|
|
283
|
+
* ```
|
|
284
|
+
*/
|
|
285
|
+
declare function isBaseError(value: unknown): value is BaseError;
|
|
286
|
+
//#endregion
|
|
287
|
+
//#region src/functions/serialize-cause-error.d.ts
|
|
288
|
+
/**
|
|
289
|
+
* Texto que substitui uma referência circular durante a serialização.
|
|
290
|
+
*
|
|
291
|
+
* É retornado no lugar de um objeto que já está sendo serializado mais acima
|
|
292
|
+
* na mesma cadeia evitando recursão infinita.
|
|
293
|
+
*/
|
|
294
|
+
declare const CIRCULAR_MARKER = "[Circular]";
|
|
295
|
+
/**
|
|
296
|
+
* Conjunto de referências em processo de serialização usado para detectar
|
|
297
|
+
* ciclos.
|
|
298
|
+
*
|
|
299
|
+
* Por ser um `WeakSet` não impede que os objetos sejam coletados pelo
|
|
300
|
+
* garbage collector.
|
|
301
|
+
*/
|
|
302
|
+
type SeenReferences = WeakSet<object>;
|
|
303
|
+
/**
|
|
304
|
+
* Serializa de forma segura, o valor de uma `cause` (causa) de erro para uma
|
|
305
|
+
* estrutura simples e apropriada para `JSON.stringify`, logs ou transmissão.
|
|
306
|
+
*
|
|
307
|
+
* A conversão depende do tipo do valor:
|
|
308
|
+
* - `string`, `number`, `boolean` e `undefined`: retornados sem alteração;
|
|
309
|
+
* - `null`: retorna `null`;
|
|
310
|
+
* - `bigint` e `symbol`: convertidos para texto com `toString()`
|
|
311
|
+
* (ex.: `10n` vira `"10"`);
|
|
312
|
+
* - função: vira o texto `"[Function: nome]"` ou `"[Function: anonymous]"`
|
|
313
|
+
* se não tiver nome;
|
|
314
|
+
* - `BaseError`: delegado a {@link serializeBaseError};
|
|
315
|
+
* - `Error` nativo: delegado a {@link serializeNativeError};
|
|
316
|
+
* - `Date`: convertida para string ISO 8601 ou `"Invalid Date"` se a data
|
|
317
|
+
* for inválida;
|
|
318
|
+
* - array: cada item é serializado recursivamente;
|
|
319
|
+
* - objeto comum: cada propriedade própria enumerável de chave `string` é
|
|
320
|
+
* serializada recursivamente, resultando em um novo objeto simples.
|
|
321
|
+
*
|
|
322
|
+
* **Referências circulares:** apenas as referências da cadeia atual (os
|
|
323
|
+
* "ancestrais" do valor sendo serializado) são rastreadas. Quando um objeto
|
|
324
|
+
* aparece dentro de si mesmo o ponto de repetição é substituído por
|
|
325
|
+
* {@link CIRCULAR_MARKER}. Como cada objeto é removido do conjunto ao terminar
|
|
326
|
+
* de ser serializado, um mesmo objeto referenciado em dois lugares distintos
|
|
327
|
+
* (sem ciclo) é serializado por completo nas duas ocorrências e não marcado
|
|
328
|
+
* como circular.
|
|
329
|
+
*
|
|
330
|
+
* **Limitações:** protótipos e métodos de objetos comuns são descartados e
|
|
331
|
+
* propriedades com chave `symbol` são ignoradas. Instâncias como `Map` e
|
|
332
|
+
* `Set`, que não possuem propriedades próprias enumeráveis resultam em `{}`.
|
|
333
|
+
*
|
|
334
|
+
* @param cause - Valor a ser serializado normalmente a propriedade `cause`
|
|
335
|
+
* de um erro, mas pode ser qualquer valor.
|
|
336
|
+
* @param includeStack - Se `true`, inclui o stack trace ao serializar erros
|
|
337
|
+
* (`BaseError` e `Error` nativo), repassando a opção aos respectivos
|
|
338
|
+
* serializadores. Por padrão, `false`.
|
|
339
|
+
* @param seen - Conjunto de referências em processo de serialização usado
|
|
340
|
+
* internamente na recursão para detectar ciclos. Em geral não deve ser
|
|
341
|
+
* informado; por padrão, um novo `WeakSet` vazio.
|
|
342
|
+
* @returns Representação serializável do valor cujo formato depende do tipo
|
|
343
|
+
* recebido (ver lista acima).
|
|
344
|
+
*
|
|
345
|
+
* @example
|
|
346
|
+
* ```ts
|
|
347
|
+
* serializeCauseError("falha"); // "falha"
|
|
348
|
+
* serializeCauseError(10n); // "10"
|
|
349
|
+
* serializeCauseError(Symbol("x")); // "Symbol(x)"
|
|
350
|
+
* serializeCauseError(function foo() {}); // "[Function: foo]"
|
|
351
|
+
* serializeCauseError(new Date("2026-01-01T00:00:00Z"));
|
|
352
|
+
* // "2026-01-01T00:00:00.000Z"
|
|
353
|
+
* serializeCauseError(new Date("inválida")); // "Invalid Date"
|
|
354
|
+
*
|
|
355
|
+
* // Estruturas aninhadas
|
|
356
|
+
* serializeCauseError({ ids: [1, 2n], origin: null });
|
|
357
|
+
* // { ids: [1, "2"], origin: null }
|
|
358
|
+
*
|
|
359
|
+
* // Referência circular
|
|
360
|
+
* const a: Record<string, unknown> = { name: "a" };
|
|
361
|
+
* a.self = a;
|
|
362
|
+
* serializeCauseError(a);
|
|
363
|
+
* // { name: "a", self: "[Circular]" }
|
|
364
|
+
*
|
|
365
|
+
* // Mesmo objeto em dois lugares (sem ciclo): serializado nas duas vezes
|
|
366
|
+
* const shared = { x: 1 };
|
|
367
|
+
* serializeCauseError({ a: shared, b: shared });
|
|
368
|
+
* // { a: { x: 1 }, b: { x: 1 } }
|
|
369
|
+
*
|
|
370
|
+
* // Erros, com stack trace opcional
|
|
371
|
+
* serializeCauseError(new Error("falhou"), true);
|
|
372
|
+
* ```
|
|
373
|
+
*/
|
|
374
|
+
declare function serializeCauseError(cause: unknown, includeStack?: boolean, seen?: SeenReferences): unknown;
|
|
375
|
+
//#endregion
|
|
376
|
+
//#region src/functions/serialize-base-error.d.ts
|
|
377
|
+
/**
|
|
378
|
+
* Representação serializável de um `BaseError` composta apenas por valores
|
|
379
|
+
* simples e apropriada para `JSON.stringify`, logs ou transmissão.
|
|
380
|
+
*
|
|
381
|
+
* As propriedades `cause`, `params` e `stack` são opcionais e só aparecem
|
|
382
|
+
* quando o erro as possui (ou no caso de `stack` quando solicitado).
|
|
383
|
+
*/
|
|
384
|
+
type SerializedBaseError = Readonly<{
|
|
385
|
+
/** Causa do erro já serializada com {@link serializeCauseError}. */
|
|
386
|
+
cause?: unknown;
|
|
387
|
+
/** Código do erro conforme o catálogo (ex.: `"USER_NOT_FOUND"`). */
|
|
388
|
+
code: string;
|
|
389
|
+
/** Mensagem do erro já com os placeholders interpolados. */
|
|
390
|
+
message: string;
|
|
391
|
+
/** Nome da classe do erro (ex.: `"BaseError"`). */
|
|
392
|
+
name: string;
|
|
393
|
+
/** Parâmetros usados para interpolar a mensagem já serializados. */
|
|
394
|
+
params?: Readonly<Record<string, unknown>>;
|
|
395
|
+
/** Stack trace do erro presente apenas se `includeStack` for `true`. */
|
|
396
|
+
stack?: string;
|
|
397
|
+
}>;
|
|
398
|
+
/**
|
|
399
|
+
* Serializa um `BaseError` para um objeto simples ({@link SerializedBaseError})
|
|
400
|
+
* apropriado para `JSON.stringify`, logs ou transmissão.
|
|
401
|
+
*
|
|
402
|
+
* O resultado sempre contém `code`, `message` e `name`. As demais
|
|
403
|
+
* propriedades são incluídas apenas quando aplicável:
|
|
404
|
+
* - `cause`: se o erro tiver causa (`error.cause !== undefined`) serializada
|
|
405
|
+
* com {@link serializeCauseError};
|
|
406
|
+
* - `params`: se o erro tiver parâmetros (`error.params !== undefined`)
|
|
407
|
+
* também serializados com {@link serializeCauseError};
|
|
408
|
+
* - `stack`: somente se `includeStack` for `true`.
|
|
409
|
+
*
|
|
410
|
+
* **Referências circulares:** o erro é registrado em `seen` durante a
|
|
411
|
+
* serialização e removido ao final (mesmo se ocorrer uma exceção). Assim se
|
|
412
|
+
* alguma `cause` ou `params` apontar de volta para este mesmo erro, o ponto
|
|
413
|
+
* de repetição é substituído por `"[Circular]"` em vez de causar recursão
|
|
414
|
+
* infinita. Por ser removido ao terminar, o mesmo erro pode aparecer em
|
|
415
|
+
* lugares distintos (sem ciclo) e ser serializado por completo em cada um.
|
|
416
|
+
*
|
|
417
|
+
* @param error - `BaseError` a ser serializado.
|
|
418
|
+
* @param includeStack - Se `true` inclui o stack trace no resultado e o
|
|
419
|
+
* repassa à serialização da causa e dos parâmetros. Por padrão, `false`.
|
|
420
|
+
* @param seen - Conjunto de referências em processo de serialização usado
|
|
421
|
+
* internamente na recursão para detectar ciclos. Em geral não deve ser
|
|
422
|
+
* informado; por padrão, um novo `WeakSet` vazio.
|
|
423
|
+
* @returns Objeto serializável que representa o erro.
|
|
424
|
+
*
|
|
425
|
+
* @example
|
|
426
|
+
* ```ts
|
|
427
|
+
* const error = new BaseError(ERROR_CODES.USER_NOT_FOUND, { id: 42 });
|
|
428
|
+
*
|
|
429
|
+
* serializeBaseError(error);
|
|
430
|
+
* // {
|
|
431
|
+
* // code: "USER_NOT_FOUND",
|
|
432
|
+
* // message: "Usuário 42 não encontrado",
|
|
433
|
+
* // name: "BaseError",
|
|
434
|
+
* // params: { id: 42 },
|
|
435
|
+
* // }
|
|
436
|
+
*
|
|
437
|
+
* // Com stack trace
|
|
438
|
+
* serializeBaseError(erro, true);
|
|
439
|
+
* // { ..., stack: "BaseError: Usuário 42 não encontrado\n at ..." }
|
|
440
|
+
*
|
|
441
|
+
* // Com causa
|
|
442
|
+
* const withCause = new BaseError(ERROR_CODES.INVALID_TOKEN, undefined, {
|
|
443
|
+
* cause: new Error("expirado"),
|
|
444
|
+
* });
|
|
445
|
+
* serializeBaseError(withCause);
|
|
446
|
+
* // { cause: { ... }, code: "INVALID_TOKEN", message: "Token inválido", name: "BaseError" }
|
|
447
|
+
* ```
|
|
448
|
+
*/
|
|
449
|
+
declare function serializeBaseError(error: BaseError, includeStack?: boolean, seen?: SeenReferences): SerializedBaseError;
|
|
450
|
+
//#endregion
|
|
451
|
+
//#region src/functions/serialize-native-error.d.ts
|
|
452
|
+
/**
|
|
453
|
+
* Representação serializável de um `Error` nativo (ou de uma subclasse que
|
|
454
|
+
* não seja `BaseError`), composta apenas por valores simples e apropriada para
|
|
455
|
+
* `JSON.stringify`, logs ou transmissão.
|
|
456
|
+
*
|
|
457
|
+
* As propriedades `cause`, `errors` e `stack` são opcionais e só aparecem
|
|
458
|
+
* quando o erro as possui (ou no caso de `stack` quando solicitado).
|
|
459
|
+
*/
|
|
460
|
+
type SerializedNativeError = Readonly<{
|
|
461
|
+
/** Causa do erro já serializada com {@link serializeCauseError}. */
|
|
462
|
+
cause?: unknown;
|
|
463
|
+
/**
|
|
464
|
+
* Lista de erros agregados já serializados. Presente em erros como
|
|
465
|
+
* `AggregateError` que expõem uma propriedade `errors` do tipo array.
|
|
466
|
+
*/
|
|
467
|
+
errors?: readonly unknown[];
|
|
468
|
+
/** Mensagem do erro. */
|
|
469
|
+
message: string;
|
|
470
|
+
/** Nome do erro (ex.: `"Error"`, `"TypeError"`, `"AggregateError"`). */
|
|
471
|
+
name: string;
|
|
472
|
+
/** Stack trace do erro presente apenas se `includeStack` for `true`. */
|
|
473
|
+
stack?: string;
|
|
474
|
+
}>;
|
|
475
|
+
/**
|
|
476
|
+
* Serializa um `Error` nativo para um objeto simples
|
|
477
|
+
* ({@link SerializedNativeError}) apropriado para `JSON.stringify`, logs ou
|
|
478
|
+
* transmissão.
|
|
479
|
+
*
|
|
480
|
+
* O resultado sempre contém `message` e `name`. As demais propriedades são
|
|
481
|
+
* incluídas apenas quando aplicável:
|
|
482
|
+
* - `cause`: se o erro tiver causa (`error.cause !== undefined`) serializada
|
|
483
|
+
* com {@link serializeCauseError};
|
|
484
|
+
* - `errors`: se o erro tiver uma propriedade `errors` que seja um array
|
|
485
|
+
* (como em `AggregateError`) com cada item serializado com
|
|
486
|
+
* {@link serializeCauseError};
|
|
487
|
+
* - `stack`: somente se `includeStack` for `true`.
|
|
488
|
+
*
|
|
489
|
+
* **Referências circulares:** o erro é registrado em `seen` durante a
|
|
490
|
+
* serialização e removido ao final (mesmo se ocorrer uma exceção). Assim se
|
|
491
|
+
* `cause` ou algum item de `errors` apontar de volta para este mesmo erro, o
|
|
492
|
+
* ponto de repetição é substituído por `"[Circular]"` em vez de causar
|
|
493
|
+
* recursão infinita. Por ser removido ao terminar, o mesmo erro pode aparecer
|
|
494
|
+
* em lugares distintos (sem ciclo) e ser serializado por completo em cada um.
|
|
495
|
+
*
|
|
496
|
+
* **Limitações:** apenas `message`, `name`, `cause`, `errors` e `stack` são
|
|
497
|
+
* copiados. Propriedades adicionais definidas em subclasses (ex.: `code` ou
|
|
498
|
+
* `status`) não são incluídas.
|
|
499
|
+
*
|
|
500
|
+
* @param error - `Error` a ser serializado.
|
|
501
|
+
* @param includeStack - Se `true` inclui o stack trace no resultado e o
|
|
502
|
+
* repassa à serialização da causa e dos erros agregados. Por padrão, `false`.
|
|
503
|
+
* @param seen - Conjunto de referências em processo de serialização usado
|
|
504
|
+
* internamente na recursão para detectar ciclos. Em geral não deve ser
|
|
505
|
+
* informado; por padrão, um novo `WeakSet` vazio.
|
|
506
|
+
* @returns Objeto serializável que representa o erro.
|
|
507
|
+
*
|
|
508
|
+
* @example
|
|
509
|
+
* ```ts
|
|
510
|
+
* serializeNativeError(new TypeError("valor inválido"));
|
|
511
|
+
* // { message: "valor inválido", name: "TypeError" }
|
|
512
|
+
*
|
|
513
|
+
* // Com stack trace
|
|
514
|
+
* serializeNativeError(new Error("falhou"), true);
|
|
515
|
+
* // { message: "falhou", name: "Error", stack: "Error: falhou\n at ..." }
|
|
516
|
+
*
|
|
517
|
+
* // Com causa
|
|
518
|
+
* serializeNativeError(new Error("falhou", { cause: "timeout" }));
|
|
519
|
+
* // { cause: "timeout", message: "falhou", name: "Error" }
|
|
520
|
+
*
|
|
521
|
+
* // Com erros agregados
|
|
522
|
+
* serializeNativeError(
|
|
523
|
+
* new AggregateError([new Error("a"), new Error("b")], "vários erros"),
|
|
524
|
+
* );
|
|
525
|
+
* // {
|
|
526
|
+
* // errors: [
|
|
527
|
+
* // { message: "a", name: "Error" },
|
|
528
|
+
* // { message: "b", name: "Error" },
|
|
529
|
+
* // ],
|
|
530
|
+
* // message: "vários erros",
|
|
531
|
+
* // name: "AggregateError",
|
|
532
|
+
* // }
|
|
533
|
+
*
|
|
534
|
+
* // Referência circular
|
|
535
|
+
* const error = new Error("ciclo");
|
|
536
|
+
* error.cause = error;
|
|
537
|
+
* serializeNativeError(error);
|
|
538
|
+
* // { cause: "[Circular]", message: "ciclo", name: "Error" }
|
|
539
|
+
* ```
|
|
540
|
+
*/
|
|
541
|
+
declare function serializeNativeError(error: Error, includeStack?: boolean, seen?: SeenReferences): SerializedNativeError;
|
|
542
|
+
//#endregion
|
|
543
|
+
export { CIRCULAR_MARKER as a, BASE_ERROR_BRAND as c, BaseErrorOptions as d, BaseErrorOptionsArgs as f, serializeBaseError as i, isBaseError as l, serializeNativeError as n, SeenReferences as o, escapeRegExp as p, SerializedBaseError as r, serializeCauseError as s, SerializedNativeError as t, BaseError as u };
|
|
544
|
+
//# sourceMappingURL=index-B4tdSdCF.d.mts.map
|