@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
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { EitherUnwrapError, InvalidErrorCode, InvalidParamDelimitersError } from "./errors/index.mjs";
|
|
2
|
+
import { a as Trim, c as CatalogCode, d as DEFAULT_PARAM_DELIMITERS, f as DefaultParamDelimiters, i as ExtractPlaceholders, l as ErrorCatalog, m as ErrorParamDelimiters, n as ErrorParamValue, o as Whitespace, p as createParamPlaceholder, r as ParamsFromMessage, s as CatalogDescriptor, t as ErrorParams, u as ErrorDescriptor } from "./error-params-CR2parjT.mjs";
|
|
3
|
+
import { a as CIRCULAR_MARKER, c as BASE_ERROR_BRAND, d as BaseErrorOptions, f as BaseErrorOptionsArgs, i as serializeBaseError, l as isBaseError, n as serializeNativeError, o as SeenReferences, p as escapeRegExp, r as SerializedBaseError, s as serializeCauseError, t as SerializedNativeError, u as BaseError } from "./index-B4tdSdCF.mjs";
|
|
4
|
+
import { AlphaNumeric, Digit, InvalidCodeMessage, IsUpperSnakeCase, Segment, Tail, UpperLetter, ValidateErrorDefinitions } from "./types/index.mjs";
|
|
5
|
+
//#region src/define-error-catalog.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Cria um catálogo de erros imutável a partir de um objeto que associa cada
|
|
8
|
+
* código de erro à sua mensagem.
|
|
9
|
+
*
|
|
10
|
+
* Para cada entrada de `definitions` gera um {@link ErrorDescriptor} com
|
|
11
|
+
* `code` e `message` congelado com `Object.freeze`. O próprio catálogo
|
|
12
|
+
* retornado também é congelado, de modo que nem o catálogo nem seus
|
|
13
|
+
* descritores podem ser alterados depois de criados.
|
|
14
|
+
*
|
|
15
|
+
* A validação ocorre em duas camadas:
|
|
16
|
+
* - em tempo de compilação via {@link ValidateErrorDefinitions}: códigos fora
|
|
17
|
+
* de UPPER_SNAKE_CASE geram um erro de tipo com uma mensagem explicativa;
|
|
18
|
+
* - em tempo de execução via {@link isUpperSnakeCase}: códigos inválidos
|
|
19
|
+
* lançam {@link InvalidErrorCode}, o que protege contra definições que
|
|
20
|
+
* escapem da checagem de tipos (ex.: objetos tipados como `any` ou
|
|
21
|
+
* `Record<string, string>`).
|
|
22
|
+
*
|
|
23
|
+
* O parâmetro de tipo `T` é declarado como `const`, o que preserva os tipos
|
|
24
|
+
* literais dos códigos e das mensagens sem a necessidade de `as const` na
|
|
25
|
+
* chamada.
|
|
26
|
+
*
|
|
27
|
+
* @template Codes - Objeto que mapeia códigos de erro para suas mensagens.
|
|
28
|
+
* @param definitions - Definições do catálogo: chaves são os códigos em
|
|
29
|
+
* UPPER_SNAKE_CASE.
|
|
30
|
+
* @returns Catálogo de erros somente leitura com um descritor para cada
|
|
31
|
+
* código informado.
|
|
32
|
+
* @throws {InvalidErrorCode} Se algum código não estiver em UPPER_SNAKE_CASE.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const TEST_ERROR_CODES = defineErrorCatalog({
|
|
37
|
+
* USER_NOT_FOUND: "Usuário {id} não encontrado",
|
|
38
|
+
* INVALID_TOKEN: "Token inválido",
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* TEST_ERROR_CODES.USER_NOT_FOUND.code; // "USER_NOT_FOUND"
|
|
42
|
+
* TEST_ERROR_CODES.USER_NOT_FOUND.message; // "Usuário {id} não encontrado"
|
|
43
|
+
*
|
|
44
|
+
* // Erro de compilação (e de execução): código fora de UPPER_SNAKE_CASE
|
|
45
|
+
* defineErrorCatalog({
|
|
46
|
+
* userNotFound: "Usuário não encontrado",
|
|
47
|
+
* });
|
|
48
|
+
* // Lança InvalidErrorCode
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function defineErrorCatalog<const Codes extends Record<string, string>>(definitions: ValidateErrorDefinitions<Codes>): ErrorCatalog<Codes>;
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/either.d.ts
|
|
54
|
+
/**
|
|
55
|
+
* Representa o resultado de uma operação que pode ter sucesso (`Ok`) ou
|
|
56
|
+
* falhar (`Err`), tornando o erro parte explícita do tipo de retorno em vez
|
|
57
|
+
* de depender de exceções.
|
|
58
|
+
*
|
|
59
|
+
* Um `Either<O, E>` é sempre uma instância de {@link Ok} que carrega um
|
|
60
|
+
* valor de sucesso do tipo `O`, ou de {@link Err} que carrega um valor de
|
|
61
|
+
* erro do tipo `E`. Use {@link ok} e {@link err} para criá-los.
|
|
62
|
+
*
|
|
63
|
+
* Os métodos {@link Either.map}, {@link Either.mapErr}, {@link Either.flatMap}
|
|
64
|
+
* e {@link Either.orElse} retornam um novo `Either` e não alteram o original.
|
|
65
|
+
* Para tratar os dois casos use {@link Either.match}, ou os type guards
|
|
66
|
+
* {@link Either.isOk} e {@link Either.isErr}.
|
|
67
|
+
*
|
|
68
|
+
* @template O - Tipo do valor de sucesso.
|
|
69
|
+
* @template E - Tipo do valor de erro.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* function toDivide(a: number, b: number): Either<number, string> {
|
|
74
|
+
* return b === 0 ? err("Divisão por zero") : ok(a / b);
|
|
75
|
+
* }
|
|
76
|
+
*
|
|
77
|
+
* const message = toDivide(10, 2)
|
|
78
|
+
* .map((resultado) => resultado * 3)
|
|
79
|
+
* .match({
|
|
80
|
+
* onOk: (valor) => `Resultado: ${valor}`,
|
|
81
|
+
* onErr: (erro) => `Falha: ${erro}`,
|
|
82
|
+
* });
|
|
83
|
+
* // "Resultado: 15"
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export declare abstract class Either<O, E> {
|
|
87
|
+
/** Discriminante da variante: `"Ok"` para sucesso e `"Err"` para erro. */
|
|
88
|
+
abstract readonly tag: "Ok" | "Err";
|
|
89
|
+
/**
|
|
90
|
+
* Retorna o valor de sucesso.
|
|
91
|
+
*
|
|
92
|
+
* @returns O valor contido em `Ok`.
|
|
93
|
+
* @throws {EitherUnwrapError} Se for um `Err`. A `cause` do erro é o valor
|
|
94
|
+
* de erro contido.
|
|
95
|
+
*/
|
|
96
|
+
abstract unwrap(): O;
|
|
97
|
+
/**
|
|
98
|
+
* Retorna o valor de erro.
|
|
99
|
+
*
|
|
100
|
+
* @returns O valor contido em `Err`.
|
|
101
|
+
* @throws {EitherUnwrapError} Se for um `Ok`. A `cause` do erro é o valor
|
|
102
|
+
* de sucesso contido.
|
|
103
|
+
*/
|
|
104
|
+
abstract unwrapErr(): E;
|
|
105
|
+
/**
|
|
106
|
+
* Verifica se é um `Ok` funcionando como type guard.
|
|
107
|
+
*
|
|
108
|
+
* @returns `true` se for `Ok` (restringindo o tipo para {@link Ok});
|
|
109
|
+
* caso contrário, `false`.
|
|
110
|
+
*/
|
|
111
|
+
abstract isOk(): this is Ok<O, E>;
|
|
112
|
+
/**
|
|
113
|
+
* Verifica se é um `Err` funcionando como type guard.
|
|
114
|
+
*
|
|
115
|
+
* @returns `true` se for `Err` (restringindo o tipo para {@link Err});
|
|
116
|
+
* caso contrário, `false`.
|
|
117
|
+
*/
|
|
118
|
+
abstract isErr(): this is Err<O, E>;
|
|
119
|
+
/**
|
|
120
|
+
* Transforma o valor de sucesso mantendo o erro intacto.
|
|
121
|
+
*
|
|
122
|
+
* Se for `Ok` aplica `fn` ao valor e retorna um novo `Ok` com o resultado.
|
|
123
|
+
* Se for `Err` `fn` não é chamada e um novo `Err` com o mesmo erro é
|
|
124
|
+
* retornado. Exceções lançadas por `fn` não são capturadas.
|
|
125
|
+
*
|
|
126
|
+
* @template O2 - Tipo do novo valor de sucesso.
|
|
127
|
+
* @param fn - Função que converte o valor de sucesso.
|
|
128
|
+
* @returns Um `Either` com o valor transformado ou o erro original.
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```ts
|
|
132
|
+
* ok<number, string>(2).map((n) => n * 2).unwrap(); // 4
|
|
133
|
+
* err<number, string>("falhou").map((n) => n * 2).unwrapErr(); // "falhou"
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
map<O2>(fn: (value: O) => O2): Either<O2, E>;
|
|
137
|
+
/**
|
|
138
|
+
* Transforma o valor de erro mantendo o sucesso intacto.
|
|
139
|
+
*
|
|
140
|
+
* Se for `Err` aplica `fn` ao erro e retorna um novo `Err` com o resultado.
|
|
141
|
+
* Se for `Ok` `fn` não é chamada e um novo `Ok` com o mesmo valor é
|
|
142
|
+
* retornado. Exceções lançadas por `fn` não são capturadas.
|
|
143
|
+
*
|
|
144
|
+
* @template E2 - Tipo do novo valor de erro.
|
|
145
|
+
* @param fn - Função que converte o valor de erro.
|
|
146
|
+
* @returns Um `Either` com o erro transformado ou o valor original.
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* err<number, string>("falhou").mapErr((e) => e.length).unwrapErr(); // 7
|
|
151
|
+
* ok<number, string>(1).mapErr((e) => e.length).unwrap(); // 1
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
mapErr<E2>(fn: (value: E) => E2): Either<O, E2>;
|
|
155
|
+
/**
|
|
156
|
+
* Encadeia uma operação que também retorna um `Either` usada quando o
|
|
157
|
+
* próximo passo também pode falhar.
|
|
158
|
+
*
|
|
159
|
+
* Se for `Ok`, retorna diretamente o `Either` produzido por `fn` (sem
|
|
160
|
+
* aninhamento). Se for `Err` `fn` não é chamada e o erro é propagado.
|
|
161
|
+
* O tipo de erro resultante é a união `E | E2`. Exceções lançadas por `fn`
|
|
162
|
+
* não são capturadas.
|
|
163
|
+
*
|
|
164
|
+
* @template O2 - Tipo do valor de sucesso retornado por `fn`.
|
|
165
|
+
* @template E2 - Tipo do valor de erro retornado por `fn`.
|
|
166
|
+
* @param fn - Função que recebe o valor de sucesso e retorna um `Either`.
|
|
167
|
+
* @returns O `Either` retornado por `fn`, ou o erro original.
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```ts
|
|
171
|
+
* const forNumber = (s: string): Either<number, string> => {
|
|
172
|
+
* const n = Number(s);
|
|
173
|
+
* return Number.isNaN(n) ? err("Não é número") : ok(n);
|
|
174
|
+
* };
|
|
175
|
+
*
|
|
176
|
+
* ok<string, string>("42").flatMap(forNumber).unwrap(); // 42
|
|
177
|
+
* ok<string, string>("abc").flatMap(forNumber).unwrapErr(); // "Não é número"
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
flatMap<O2, E2>(fn: (value: O) => Either<O2, E2>): Either<O2, E | E2>;
|
|
181
|
+
/**
|
|
182
|
+
* Tenta se recuperar de um erro encadeando uma operação alternativa que
|
|
183
|
+
* também retorna um `Either`. É o oposto de {@link Either.flatMap}.
|
|
184
|
+
*
|
|
185
|
+
* Se for `Err` retorna diretamente o `Either` produzido por `fn`. Se for
|
|
186
|
+
* `Ok` `fn` não é chamada e o valor é mantido. O tipo de sucesso
|
|
187
|
+
* resultante é a união `O | O2`. Exceções lançadas por `fn` não são
|
|
188
|
+
* capturadas.
|
|
189
|
+
*
|
|
190
|
+
* @template O2 - Tipo do valor de sucesso retornado por `fn`.
|
|
191
|
+
* @template E2 - Tipo do valor de erro retornado por `fn`.
|
|
192
|
+
* @param fn - Função que recebe o valor de erro e retorna um `Either`.
|
|
193
|
+
* @returns O `Either` retornado por `fn`, ou o valor de sucesso original.
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```ts
|
|
197
|
+
* err<number, string>("falhou").orElse(() => ok(0)).unwrap(); // 0
|
|
198
|
+
* ok<number, string>(5).orElse(() => ok(0)).unwrap(); // 5
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
orElse<O2, E2>(fn: (value: E) => Either<O2, E2>): Either<O | O2, E2>;
|
|
202
|
+
/**
|
|
203
|
+
* Trata os dois casos e produz um único valor chamando o handler da
|
|
204
|
+
* variante correspondente.
|
|
205
|
+
*
|
|
206
|
+
* @template R - Tipo do valor retornado pelos handlers.
|
|
207
|
+
* @param handlers - Objeto com `onOk` chamado com o valor de sucesso e
|
|
208
|
+
* `onErr` chamado com o valor de erro.
|
|
209
|
+
* @returns O resultado do handler chamado.
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* ```ts
|
|
213
|
+
* const texto = resultado.match({
|
|
214
|
+
* onOk: (valor) => `Sucesso: ${valor}`,
|
|
215
|
+
* onErr: (erro) => `Erro: ${erro}`,
|
|
216
|
+
* });
|
|
217
|
+
* ```
|
|
218
|
+
*/
|
|
219
|
+
match<R>(handlers: Readonly<{
|
|
220
|
+
onOk(value: O): R;
|
|
221
|
+
onErr(value: E): R;
|
|
222
|
+
}>): R;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Variante de sucesso de {@link Either} que carrega um valor do tipo `O`.
|
|
226
|
+
*
|
|
227
|
+
* O construtor é `protected`; para criar uma instância use {@link Ok.create}
|
|
228
|
+
* ou a função {@link ok}.
|
|
229
|
+
*
|
|
230
|
+
* @template O - Tipo do valor de sucesso. Por padrão, `never`.
|
|
231
|
+
* @template E - Tipo do valor de erro usado apenas para compatibilidade com
|
|
232
|
+
* {@link Either}. Por padrão, `never`.
|
|
233
|
+
*/
|
|
234
|
+
export declare class Ok<O = never, E = never> extends Either<O, E> {
|
|
235
|
+
/** Discriminante da variante sempre `"Ok"`. */
|
|
236
|
+
readonly tag: "Ok";
|
|
237
|
+
/** Valor de sucesso armazenado. */
|
|
238
|
+
private readonly value;
|
|
239
|
+
/**
|
|
240
|
+
* @param value - Valor de sucesso a ser armazenado.
|
|
241
|
+
*/
|
|
242
|
+
protected constructor(value: O);
|
|
243
|
+
/**
|
|
244
|
+
* Retorna o valor de sucesso armazenado.
|
|
245
|
+
*
|
|
246
|
+
* @returns O valor contido.
|
|
247
|
+
*/
|
|
248
|
+
unwrap(): O;
|
|
249
|
+
/**
|
|
250
|
+
* Sempre lança um erro pois um `Ok` não possui valor de erro.
|
|
251
|
+
*
|
|
252
|
+
* @throws {EitherUnwrapError} Sempre. A `cause` é o valor de sucesso contido.
|
|
253
|
+
*/
|
|
254
|
+
unwrapErr(): E;
|
|
255
|
+
/** @returns Sempre `true`. */
|
|
256
|
+
isOk(): this is Ok<O, E>;
|
|
257
|
+
/** @returns Sempre `false`. */
|
|
258
|
+
isErr(): this is Err<O, E>;
|
|
259
|
+
/**
|
|
260
|
+
* Cria um `Ok` com o valor informado.
|
|
261
|
+
*
|
|
262
|
+
* @template O - Tipo do valor de sucesso. Por padrão, `never`.
|
|
263
|
+
* @template E - Tipo do valor de erro. Por padrão, `never`.
|
|
264
|
+
* @param value - Valor de sucesso.
|
|
265
|
+
* @returns Uma nova instância de `Ok`.
|
|
266
|
+
*/
|
|
267
|
+
static create<O = never, E = never>(value: O): Ok<O, E>;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Variante de erro de {@link Either} que carrega um valor do tipo `E`.
|
|
271
|
+
*
|
|
272
|
+
* O construtor é `protected`; para criar uma instância use {@link Err.create}
|
|
273
|
+
* ou a função {@link err}.
|
|
274
|
+
*
|
|
275
|
+
* @template O - Tipo do valor de sucesso usado apenas para compatibilidade
|
|
276
|
+
* com {@link Either}. Por padrão, `never`.
|
|
277
|
+
* @template E - Tipo do valor de erro. Por padrão, `never`.
|
|
278
|
+
*/
|
|
279
|
+
export declare class Err<O = never, E = never> extends Either<O, E> {
|
|
280
|
+
/** Discriminante da variante sempre `"Err"`. */
|
|
281
|
+
readonly tag: "Err";
|
|
282
|
+
/** Valor de erro armazenado. */
|
|
283
|
+
private readonly value;
|
|
284
|
+
/**
|
|
285
|
+
* @param value - Valor de erro a ser armazenado.
|
|
286
|
+
*/
|
|
287
|
+
protected constructor(value: E);
|
|
288
|
+
/**
|
|
289
|
+
* Sempre lança um erro pois um `Err` não possui valor de sucesso.
|
|
290
|
+
*
|
|
291
|
+
* @throws {EitherUnwrapError} Sempre. A `cause` é o valor de erro contido.
|
|
292
|
+
*/
|
|
293
|
+
unwrap(): O;
|
|
294
|
+
/**
|
|
295
|
+
* Retorna o valor de erro armazenado.
|
|
296
|
+
*
|
|
297
|
+
* @returns O valor contido.
|
|
298
|
+
*/
|
|
299
|
+
unwrapErr(): E;
|
|
300
|
+
/** @returns Sempre `false`. */
|
|
301
|
+
isOk(): this is Ok<O, E>;
|
|
302
|
+
/** @returns Sempre `true`. */
|
|
303
|
+
isErr(): this is Err<O, E>;
|
|
304
|
+
/**
|
|
305
|
+
* Cria um `Err` com o valor informado.
|
|
306
|
+
*
|
|
307
|
+
* @template O - Tipo do valor de sucesso. Por padrão, `never`.
|
|
308
|
+
* @template E - Tipo do valor de erro. Por padrão, `never`.
|
|
309
|
+
* @param value - Valor de erro.
|
|
310
|
+
* @returns Uma nova instância de `Err`.
|
|
311
|
+
*/
|
|
312
|
+
static create<O = never, E = never>(value: E): Err<O, E>;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Cria um {@link Either} de sucesso (`Ok`) com o valor informado.
|
|
316
|
+
*
|
|
317
|
+
* O retorno é tipado como `Either<O, E>` e não como `Ok` para que possa ser
|
|
318
|
+
* usado onde se espera qualquer variante. Como `E` não pode ser inferido a
|
|
319
|
+
* partir do argumento, informe-o explicitamente quando necessário.
|
|
320
|
+
*
|
|
321
|
+
* @template O - Tipo do valor de sucesso. Por padrão, `never`.
|
|
322
|
+
* @template E - Tipo do valor de erro. Por padrão, `never`.
|
|
323
|
+
* @param value - Valor de sucesso.
|
|
324
|
+
* @returns Um `Either` que é um `Ok` contendo `value`.
|
|
325
|
+
*
|
|
326
|
+
* @example
|
|
327
|
+
* ```ts
|
|
328
|
+
* const result = ok<number, string>(42);
|
|
329
|
+
* result.isOk(); // true
|
|
330
|
+
* result.unwrap(); // 42
|
|
331
|
+
* ```
|
|
332
|
+
*/
|
|
333
|
+
export declare function ok<O = never, E = never>(value: O): Either<O, E>;
|
|
334
|
+
/**
|
|
335
|
+
* Cria um {@link Either} de erro (`Err`) com o valor informado.
|
|
336
|
+
*
|
|
337
|
+
* O retorno é tipado como `Either<O, E>` e não como `Err` para que possa ser
|
|
338
|
+
* usado onde se espera qualquer variante. Como `O` não pode ser inferido a
|
|
339
|
+
* partir do argumento, informe-o explicitamente quando necessário.
|
|
340
|
+
*
|
|
341
|
+
* @template O - Tipo do valor de sucesso. Por padrão, `never`.
|
|
342
|
+
* @template E - Tipo do valor de erro. Por padrão, `never`.
|
|
343
|
+
* @param value - Valor de erro.
|
|
344
|
+
* @returns Um `Either` que é um `Err` contendo `value`.
|
|
345
|
+
*
|
|
346
|
+
* @example
|
|
347
|
+
* ```ts
|
|
348
|
+
* const result = err<number, string>("Algo deu errado");
|
|
349
|
+
* result.isErr(); // true
|
|
350
|
+
* result.unwrapErr(); // "Algo deu errado"
|
|
351
|
+
* ```
|
|
352
|
+
*/
|
|
353
|
+
export declare function err<O = never, E = never>(value: E): Either<O, E>;
|
|
354
|
+
//#endregion
|
|
355
|
+
//#region src/interpolate-error-message.d.ts
|
|
356
|
+
/**
|
|
357
|
+
* Deriva, em tempo de compilação a lista de argumentos extras exigida para
|
|
358
|
+
* interpolar uma mensagem de erro.
|
|
359
|
+
*
|
|
360
|
+
* - Se a mensagem **não** tiver placeholders o resultado é uma tupla vazia
|
|
361
|
+
* (`[]`), ou seja, nenhum argumento adicional deve ser passado.
|
|
362
|
+
* - Se tiver placeholders o resultado é uma tupla com um único argumento
|
|
363
|
+
* obrigatório, `params` do tipo {@link ParamsFromMessage}.
|
|
364
|
+
*
|
|
365
|
+
* É pensado para ser usado como tipo de parâmetro rest (`...args`) de modo
|
|
366
|
+
* que o objeto de parâmetros seja exigido apenas quando necessário.
|
|
367
|
+
*
|
|
368
|
+
* @template Message - Mensagem a ser analisada.
|
|
369
|
+
* @template Delimiters - Objeto com os delimitadores `open` e `close` do
|
|
370
|
+
* placeholder. Por padrão, {@link DefaultParamDelimiters}.
|
|
371
|
+
*
|
|
372
|
+
* @example
|
|
373
|
+
* ```ts
|
|
374
|
+
* type A = ErrorMessageArgs<"Usuário {id} não encontrado">;
|
|
375
|
+
* // [params: Readonly<{ id: ErrorParamValue }>]
|
|
376
|
+
*
|
|
377
|
+
* type B = ErrorMessageArgs<"Token inválido">;
|
|
378
|
+
* // []
|
|
379
|
+
*
|
|
380
|
+
* type C = ErrorMessageArgs<
|
|
381
|
+
* "Rota [route] não encontrada",
|
|
382
|
+
* { readonly open: "["; readonly close: "]" }
|
|
383
|
+
* >;
|
|
384
|
+
* // [params: Readonly<{ route: ErrorParamValue }>]
|
|
385
|
+
* ```
|
|
386
|
+
*/
|
|
387
|
+
export type ErrorMessageArgs<Message extends string, Delimiters extends ErrorParamDelimiters = DefaultParamDelimiters> = [ParamsFromMessage<Message, Delimiters>] extends [never] ? [] : [params: ParamsFromMessage<Message, Delimiters>];
|
|
388
|
+
/**
|
|
389
|
+
* Interpola os parâmetros informados na mensagem de um descritor de erro
|
|
390
|
+
* substituindo cada placeholder pelo valor correspondente.
|
|
391
|
+
*
|
|
392
|
+
* Os placeholders são localizados com {@link createParamPlaceholder} a partir
|
|
393
|
+
* dos delimitadores informados. O nome de cada placeholder é aparado
|
|
394
|
+
* (`{ id }` equivale a `{id}`) e o valor é convertido para texto com `String`.
|
|
395
|
+
*
|
|
396
|
+
* O placeholder é mantido exatamente como está na mensagem (sem substituição)
|
|
397
|
+
* quando:
|
|
398
|
+
* - o nome é vazio (ex.: `{}` ou `{ }`);
|
|
399
|
+
* - o nome não existe como propriedade própria de `params`.
|
|
400
|
+
*
|
|
401
|
+
* O objeto de parâmetros é exigido ou omitido conforme a mensagem via
|
|
402
|
+
* {@link ErrorMessageArgs}: mensagens sem placeholders não aceitam `params` e
|
|
403
|
+
* mensagens com placeholders exigem todos eles.
|
|
404
|
+
*
|
|
405
|
+
* @template Descriptor - Tipo do descritor de erro cuja `message` define os
|
|
406
|
+
* parâmetros exigidos.
|
|
407
|
+
* @template Delimiters - Tipo dos delimitadores dos placeholders. Por padrão,
|
|
408
|
+
* {@link DefaultParamDelimiters}.
|
|
409
|
+
* @param descriptor - Descritor de erro cuja mensagem será interpolada.
|
|
410
|
+
* @param delimiters - Delimitadores `open` e `close` dos placeholders.
|
|
411
|
+
* @param args - Objeto `params` com os valores dos placeholders exigido
|
|
412
|
+
* apenas se a mensagem tiver placeholders.
|
|
413
|
+
* @returns A mensagem com os placeholders substituídos.
|
|
414
|
+
* @throws {InvalidParamDelimitersError} Se `open` ou `close` for uma string
|
|
415
|
+
* vazia (lançado por {@link createParamPlaceholder}).
|
|
416
|
+
*
|
|
417
|
+
* @example
|
|
418
|
+
* ```ts
|
|
419
|
+
* const keys = { open: "{", close: "}" } as const;
|
|
420
|
+
*
|
|
421
|
+
* const USER_NOT_FOUND = {
|
|
422
|
+
* code: "USER_NOT_FOUND",
|
|
423
|
+
* message: "Usuário {id} não encontrado em {table}",
|
|
424
|
+
* } as const satisfies ErrorDescriptor;
|
|
425
|
+
*
|
|
426
|
+
* interpolateErrorMessage(USER_NOT_FOUND, keys, {
|
|
427
|
+
* id: 42,
|
|
428
|
+
* table: "users",
|
|
429
|
+
* });
|
|
430
|
+
* // "Usuário 42 não encontrado em users"
|
|
431
|
+
*
|
|
432
|
+
* const INVALID_TOKEN = {
|
|
433
|
+
* code: "INVALID_TOKEN",
|
|
434
|
+
* message: "Token inválido",
|
|
435
|
+
* } as const satisfies ErrorDescriptor;
|
|
436
|
+
*
|
|
437
|
+
* interpolateErrorMessage(INVALID_TOKEN, keys);
|
|
438
|
+
* // "Token inválido" (sem params)
|
|
439
|
+
*
|
|
440
|
+
* // Delimitadores personalizados
|
|
441
|
+
* const ROUTE_NOT_FOUND = {
|
|
442
|
+
* code: "ROUTE_NOT_FOUND",
|
|
443
|
+
* message: "Rota [route] não encontrada",
|
|
444
|
+
* } as const satisfies ErrorDescriptor;
|
|
445
|
+
*
|
|
446
|
+
* interpolateErrorMessage(
|
|
447
|
+
* ROUTE_NOT_FOUND,
|
|
448
|
+
* { open: "[", close: "]" } as const,
|
|
449
|
+
* { route: "/home" },
|
|
450
|
+
* );
|
|
451
|
+
* // "Rota /home não encontrada"
|
|
452
|
+
* ```
|
|
453
|
+
*/
|
|
454
|
+
export declare function interpolateErrorMessage<Descriptor extends ErrorDescriptor, Delimiters extends ErrorParamDelimiters = DefaultParamDelimiters>(descriptor: Descriptor, delimiters: Delimiters, ...args: ErrorMessageArgs<Descriptor["message"], Delimiters>): string;
|
|
455
|
+
//#endregion
|
|
456
|
+
//#region src/upper-snake-case.d.ts
|
|
457
|
+
/**
|
|
458
|
+
* Expressão regular que valida códigos em UPPER_SNAKE_CASE em tempo de
|
|
459
|
+
* execução.
|
|
460
|
+
*
|
|
461
|
+
* Regras (espelham o tipo {@link IsUpperSnakeCase}):
|
|
462
|
+
* - deve começar com uma letra maiúscula (`A-Z`);
|
|
463
|
+
* - pode conter letras maiúsculas, dígitos e `_`;
|
|
464
|
+
* - `_` só pode aparecer entre caracteres alfanuméricos, ou seja, não pode
|
|
465
|
+
* estar no início nem no fim e não pode ser repetido em sequência.
|
|
466
|
+
*/
|
|
467
|
+
export declare const UPPER_SNAKE_CASE: RegExp;
|
|
468
|
+
/**
|
|
469
|
+
* Verifica em tempo de execução, se uma string está em UPPER_SNAKE_CASE.
|
|
470
|
+
*
|
|
471
|
+
* É o equivalente em runtime do tipo {@link IsUpperSnakeCase}, usando a
|
|
472
|
+
* expressão regular {@link UPPER_SNAKE_CASE}.
|
|
473
|
+
*
|
|
474
|
+
* @param value - String a ser verificada.
|
|
475
|
+
* @returns `true` se `value` estiver em UPPER_SNAKE_CASE; caso contrário,
|
|
476
|
+
* `false`.
|
|
477
|
+
*
|
|
478
|
+
* @example
|
|
479
|
+
* ```ts
|
|
480
|
+
* isUpperSnakeCase("USER_NOT_FOUND"); // true
|
|
481
|
+
* isUpperSnakeCase("ERROR_404"); // true
|
|
482
|
+
* isUpperSnakeCase("userNotFound"); // false
|
|
483
|
+
* isUpperSnakeCase("_USER"); // false
|
|
484
|
+
* isUpperSnakeCase("USER__NOT"); // false
|
|
485
|
+
* isUpperSnakeCase("1ERROR"); // false
|
|
486
|
+
* ```
|
|
487
|
+
*/
|
|
488
|
+
export declare function isUpperSnakeCase(value: string): boolean;
|
|
489
|
+
/**
|
|
490
|
+
* Monta a mensagem de erro exibida quando um código não está em
|
|
491
|
+
* UPPER_SNAKE_CASE.
|
|
492
|
+
*
|
|
493
|
+
* O retorno é tipado como {@link InvalidCodeMessage}, de modo que o texto em
|
|
494
|
+
* runtime corresponde exatamente ao tipo literal usado na validação em tempo
|
|
495
|
+
* de compilação.
|
|
496
|
+
*
|
|
497
|
+
* @template Code - Tipo literal do código inválido.
|
|
498
|
+
* @param code - Código de erro inválido a ser incluído na mensagem.
|
|
499
|
+
* @returns Mensagem descrevendo o código inválido e o formato esperado.
|
|
500
|
+
*
|
|
501
|
+
* @example
|
|
502
|
+
* ```ts
|
|
503
|
+
* invalidCodeMessage("userNotFound");
|
|
504
|
+
* // 'Código de erro inválido "userNotFound". Os códigos de erro devem usar UPPER_SNAKE_CASE.'
|
|
505
|
+
* ```
|
|
506
|
+
*/
|
|
507
|
+
export declare function invalidCodeMessage<Code extends string>(code: Code): InvalidCodeMessage<Code>;
|
|
508
|
+
//#endregion
|
|
509
|
+
export { AlphaNumeric, BASE_ERROR_BRAND, BaseError, BaseErrorOptions, BaseErrorOptionsArgs, CIRCULAR_MARKER, CatalogCode, CatalogDescriptor, DEFAULT_PARAM_DELIMITERS, DefaultParamDelimiters, Digit, EitherUnwrapError, ErrorCatalog, ErrorDescriptor, ErrorParamDelimiters, ErrorParamValue, ErrorParams, ExtractPlaceholders, InvalidCodeMessage, InvalidErrorCode, InvalidParamDelimitersError, IsUpperSnakeCase, ParamsFromMessage, SeenReferences, Segment, SerializedBaseError, SerializedNativeError, Tail, Trim, UpperLetter, ValidateErrorDefinitions, Whitespace, createParamPlaceholder, escapeRegExp, isBaseError, serializeBaseError, serializeCauseError, serializeNativeError };
|
|
510
|
+
//# sourceMappingURL=index.d.mts.map
|