@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/dist/index.cjs ADDED
@@ -0,0 +1,637 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_invalid_param_delimiters_error = require("./invalid-param-delimiters-error-C6UxV7cK.cjs");
3
+ const require_errors = require("./errors-TgPe2YUV.cjs");
4
+ const require_functions_index = require("./functions/index.cjs");
5
+ require("./types/index.cjs");
6
+ //#region src/interpolate-error-message.ts
7
+ /**
8
+ * Interpola os parâmetros informados na mensagem de um descritor de erro
9
+ * substituindo cada placeholder pelo valor correspondente.
10
+ *
11
+ * Os placeholders são localizados com {@link createParamPlaceholder} a partir
12
+ * dos delimitadores informados. O nome de cada placeholder é aparado
13
+ * (`{ id }` equivale a `{id}`) e o valor é convertido para texto com `String`.
14
+ *
15
+ * O placeholder é mantido exatamente como está na mensagem (sem substituição)
16
+ * quando:
17
+ * - o nome é vazio (ex.: `{}` ou `{ }`);
18
+ * - o nome não existe como propriedade própria de `params`.
19
+ *
20
+ * O objeto de parâmetros é exigido ou omitido conforme a mensagem via
21
+ * {@link ErrorMessageArgs}: mensagens sem placeholders não aceitam `params` e
22
+ * mensagens com placeholders exigem todos eles.
23
+ *
24
+ * @template Descriptor - Tipo do descritor de erro cuja `message` define os
25
+ * parâmetros exigidos.
26
+ * @template Delimiters - Tipo dos delimitadores dos placeholders. Por padrão,
27
+ * {@link DefaultParamDelimiters}.
28
+ * @param descriptor - Descritor de erro cuja mensagem será interpolada.
29
+ * @param delimiters - Delimitadores `open` e `close` dos placeholders.
30
+ * @param args - Objeto `params` com os valores dos placeholders exigido
31
+ * apenas se a mensagem tiver placeholders.
32
+ * @returns A mensagem com os placeholders substituídos.
33
+ * @throws {InvalidParamDelimitersError} Se `open` ou `close` for uma string
34
+ * vazia (lançado por {@link createParamPlaceholder}).
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const keys = { open: "{", close: "}" } as const;
39
+ *
40
+ * const USER_NOT_FOUND = {
41
+ * code: "USER_NOT_FOUND",
42
+ * message: "Usuário {id} não encontrado em {table}",
43
+ * } as const satisfies ErrorDescriptor;
44
+ *
45
+ * interpolateErrorMessage(USER_NOT_FOUND, keys, {
46
+ * id: 42,
47
+ * table: "users",
48
+ * });
49
+ * // "Usuário 42 não encontrado em users"
50
+ *
51
+ * const INVALID_TOKEN = {
52
+ * code: "INVALID_TOKEN",
53
+ * message: "Token inválido",
54
+ * } as const satisfies ErrorDescriptor;
55
+ *
56
+ * interpolateErrorMessage(INVALID_TOKEN, keys);
57
+ * // "Token inválido" (sem params)
58
+ *
59
+ * // Delimitadores personalizados
60
+ * const ROUTE_NOT_FOUND = {
61
+ * code: "ROUTE_NOT_FOUND",
62
+ * message: "Rota [route] não encontrada",
63
+ * } as const satisfies ErrorDescriptor;
64
+ *
65
+ * interpolateErrorMessage(
66
+ * ROUTE_NOT_FOUND,
67
+ * { open: "[", close: "]" } as const,
68
+ * { route: "/home" },
69
+ * );
70
+ * // "Rota /home não encontrada"
71
+ * ```
72
+ */
73
+ function interpolateErrorMessage(descriptor, delimiters, ...args) {
74
+ const params = args[0] ?? {};
75
+ const placeholder = require_functions_index.createParamPlaceholder(delimiters);
76
+ return descriptor.message.replace(placeholder, (match, rawKey) => {
77
+ const key = rawKey.trim();
78
+ if (key === "" || !Object.hasOwn(params, key)) return match;
79
+ return String(params[key]);
80
+ });
81
+ }
82
+ //#endregion
83
+ //#region src/base-error.ts
84
+ /**
85
+ * Classe base abstrata para erros tipados a partir de um catálogo de erros.
86
+ *
87
+ * Cada erro é criado a partir de um descritor do catálogo (código e mensagem).
88
+ * A mensagem é interpolada com os `params` informados e o tipo dos `params` é
89
+ * derivado dos placeholders da mensagem, de modo que o compilador exige
90
+ * exatamente os parâmetros necessários.
91
+ *
92
+ * O construtor é `protected`: a classe não pode ser instanciada diretamente e
93
+ * deve ser estendida por classes que escolhem o descritor e repassam as
94
+ * opções.
95
+ *
96
+ * Além de `message`, `cause`, `stack` e `name` herdados de `Error`, a
97
+ * instância expõe:
98
+ * - `code`: o código do erro, com tipo literal;
99
+ * - `params`: os parâmetros usados na interpolação (ou `undefined`);
100
+ * - {@link BaseError.serialize} e {@link BaseError.toJSON} para serialização;
101
+ * - uma marca interna ({@link BASE_ERROR_BRAND}) que permite reconhecer o
102
+ * erro com {@link isBaseError} mesmo com múltiplas cópias do pacote.
103
+ *
104
+ * O `name` do erro é o nome da classe concreta (`new.target.name`) e o
105
+ * protótipo é ajustado explicitamente para que `instanceof` funcione em
106
+ * subclasses mesmo em alvos de compilação antigos.
107
+ *
108
+ * @template Catalog - Catálogo de erros ao qual o código pertence. Por padrão,
109
+ * `ErrorCatalog`.
110
+ * @template Code - Código do erro dentro do catálogo. Por padrão, todos os
111
+ * códigos do catálogo.
112
+ * @template Delimiters - Tipo dos delimitadores dos placeholders. Por padrão,
113
+ * {@link DefaultParamDelimiters}.
114
+ *
115
+ * @example
116
+ * ```ts
117
+ * const TEST_ERROR_CODES = defineErrorCatalog({
118
+ * USER_NOT_FOUND: "Usuário {id} não encontrado",
119
+ * INVALID_TOKEN: "Token inválido",
120
+ * });
121
+ *
122
+ * type TestErrorCodes = typeof TEST_ERROR_CODES;
123
+ *
124
+ * class UserNotFoundError extends BaseError<TestErrorCodes, "USER_NOT_FOUND"> {
125
+ * public constructor(id: number, options?: ErrorOptions) {
126
+ * super(TEST_ERROR_CODES.USER_NOT_FOUND, { params: { id }, ...options });
127
+ * }
128
+ * }
129
+ *
130
+ * class InvalidTokenError extends BaseError<TestErrorCodes, "INVALID_TOKEN"> {
131
+ * public constructor(options?: ErrorOptions) {
132
+ * super(TEST_ERROR_CODES.INVALID_TOKEN, options);
133
+ * }
134
+ * }
135
+ *
136
+ * const erro = new UserNotFoundError(42);
137
+ * erro.message; // "Usuário 42 não encontrado"
138
+ * erro.code; // "USER_NOT_FOUND"
139
+ * erro.params; // { id: 42 }
140
+ * erro.name; // "UserNotFoundError"
141
+ *
142
+ * BaseError.is(erro); // true
143
+ * JSON.stringify(erro); // usa toJSON(), sem stack trace
144
+ * erro.serialize(true); // inclui o stack trace
145
+ * ```
146
+ */
147
+ var BaseError = class extends Error {
148
+ /** Código do erro conforme o catálogo (ex.: `"USER_NOT_FOUND"`). */
149
+ code;
150
+ /**
151
+ * Parâmetros usados para interpolar a mensagem. É `undefined` quando a
152
+ * mensagem não possui placeholders (ou quando nenhum `params` foi informado).
153
+ */
154
+ params;
155
+ /**
156
+ * Cria um erro a partir de um descritor do catálogo.
157
+ *
158
+ * A mensagem do descritor é interpolada com `options.params` usando os
159
+ * delimitadores de `options.delimiters` (por padrão,
160
+ * {@link DEFAULT_PARAM_DELIMITERS}). Os delimitadores são usados apenas na
161
+ * interpolação e não são armazenados na instância. O objeto `options`
162
+ * também é repassado ao construtor de `Error`, que utiliza `cause`.
163
+ *
164
+ * É `protected` então só pode ser chamado por subclasses.
165
+ *
166
+ * @param descriptor - Descritor do erro no catálogo com `code` e `message`.
167
+ * @param args - Opções do erro ({@link BaseErrorOptions}). São obrigatórias
168
+ * se a mensagem tiver placeholders (por conter `params`) e opcionais caso
169
+ * contrário.
170
+ * @throws {InvalidParamDelimitersError} Se algum dos delimitadores for uma
171
+ * string vazia (lançado durante a interpolação).
172
+ */
173
+ constructor(descriptor, ...args) {
174
+ const options = args[0];
175
+ const delimiters = options?.delimiters ?? require_functions_index.DEFAULT_PARAM_DELIMITERS;
176
+ const params = options && "params" in options ? options.params : void 0;
177
+ super(interpolateErrorMessage(descriptor, delimiters, ...params === void 0 ? [] : [params]), options);
178
+ this.name = new.target.name;
179
+ this.code = descriptor.code;
180
+ this.params = params;
181
+ Object.setPrototypeOf(this, new.target.prototype);
182
+ if (Error.captureStackTrace) Error.captureStackTrace(this, new.target);
183
+ }
184
+ /**
185
+ * Marca interna que identifica a instância como um `BaseError`.
186
+ *
187
+ * Sempre retorna `true` e é lida por {@link isBaseError}. Por ser um
188
+ * getter definido no protótipo, não é uma propriedade própria da instância
189
+ * e portanto, não aparece em serializações nem em `Object.keys`.
190
+ */
191
+ get [require_functions_index.BASE_ERROR_BRAND]() {
192
+ return true;
193
+ }
194
+ /**
195
+ * Serializa o erro para um objeto simples apropriado para `JSON.stringify`,
196
+ * logs ou transmissão. Veja {@link serializeBaseError} para os detalhes do
197
+ * formato retornado.
198
+ *
199
+ * @param includeStack - Se `true` inclui o stack trace no resultado (e na
200
+ * serialização de causas e parâmetros). Por padrão, `false`.
201
+ * @returns Representação serializável do erro.
202
+ */
203
+ serialize(includeStack = false) {
204
+ return require_functions_index.serializeBaseError(this, includeStack);
205
+ }
206
+ /**
207
+ * Chamado automaticamente por `JSON.stringify`. Equivale a
208
+ * {@link BaseError.serialize} sem stack trace.
209
+ *
210
+ * @returns Representação serializável do erro sem stack trace.
211
+ */
212
+ toJSON() {
213
+ return this.serialize();
214
+ }
215
+ /**
216
+ * Verifica se um valor é uma instância de `BaseError` (type guard).
217
+ *
218
+ * Atalho para {@link isBaseError}: usa a marca interna em vez de
219
+ * `instanceof` funcionando mesmo com múltiplas cópias do pacote.
220
+ *
221
+ * @param error - Valor a ser verificado.
222
+ * @returns `true` se `error` for um `BaseError`; caso contrário, `false`.
223
+ */
224
+ static is(error) {
225
+ return require_functions_index.isBaseError(error);
226
+ }
227
+ /**
228
+ * Serializa de forma segura qualquer valor usado como causa de um erro.
229
+ *
230
+ * Atalho para {@link serializeCauseError}: trata erros, datas, arrays,
231
+ * objetos, funções, `bigint`, `symbol` e referências circulares.
232
+ *
233
+ * @param cause - Valor a ser serializado.
234
+ * @param includeStack - Se `true` inclui o stack trace ao serializar
235
+ * erros. Por padrão, `false`.
236
+ * @returns Representação serializável do valor.
237
+ */
238
+ static serializeCauseError(cause, includeStack = false) {
239
+ return require_functions_index.serializeCauseError(cause, includeStack);
240
+ }
241
+ };
242
+ //#endregion
243
+ //#region src/define-error-catalog.ts
244
+ /**
245
+ * Cria um catálogo de erros imutável a partir de um objeto que associa cada
246
+ * código de erro à sua mensagem.
247
+ *
248
+ * Para cada entrada de `definitions` gera um {@link ErrorDescriptor} com
249
+ * `code` e `message` congelado com `Object.freeze`. O próprio catálogo
250
+ * retornado também é congelado, de modo que nem o catálogo nem seus
251
+ * descritores podem ser alterados depois de criados.
252
+ *
253
+ * A validação ocorre em duas camadas:
254
+ * - em tempo de compilação via {@link ValidateErrorDefinitions}: códigos fora
255
+ * de UPPER_SNAKE_CASE geram um erro de tipo com uma mensagem explicativa;
256
+ * - em tempo de execução via {@link isUpperSnakeCase}: códigos inválidos
257
+ * lançam {@link InvalidErrorCode}, o que protege contra definições que
258
+ * escapem da checagem de tipos (ex.: objetos tipados como `any` ou
259
+ * `Record<string, string>`).
260
+ *
261
+ * O parâmetro de tipo `T` é declarado como `const`, o que preserva os tipos
262
+ * literais dos códigos e das mensagens sem a necessidade de `as const` na
263
+ * chamada.
264
+ *
265
+ * @template Codes - Objeto que mapeia códigos de erro para suas mensagens.
266
+ * @param definitions - Definições do catálogo: chaves são os códigos em
267
+ * UPPER_SNAKE_CASE.
268
+ * @returns Catálogo de erros somente leitura com um descritor para cada
269
+ * código informado.
270
+ * @throws {InvalidErrorCode} Se algum código não estiver em UPPER_SNAKE_CASE.
271
+ *
272
+ * @example
273
+ * ```ts
274
+ * const TEST_ERROR_CODES = defineErrorCatalog({
275
+ * USER_NOT_FOUND: "Usuário {id} não encontrado",
276
+ * INVALID_TOKEN: "Token inválido",
277
+ * });
278
+ *
279
+ * TEST_ERROR_CODES.USER_NOT_FOUND.code; // "USER_NOT_FOUND"
280
+ * TEST_ERROR_CODES.USER_NOT_FOUND.message; // "Usuário {id} não encontrado"
281
+ *
282
+ * // Erro de compilação (e de execução): código fora de UPPER_SNAKE_CASE
283
+ * defineErrorCatalog({
284
+ * userNotFound: "Usuário não encontrado",
285
+ * });
286
+ * // Lança InvalidErrorCode
287
+ * ```
288
+ */
289
+ function defineErrorCatalog(definitions) {
290
+ const catalog = {};
291
+ for (const [code, message] of Object.entries(definitions)) {
292
+ if (!require_errors.isUpperSnakeCase(code)) throw new require_errors.InvalidErrorCode(code);
293
+ catalog[code] = Object.freeze({
294
+ code,
295
+ message
296
+ });
297
+ }
298
+ return Object.freeze(catalog);
299
+ }
300
+ //#endregion
301
+ //#region src/either.ts
302
+ /**
303
+ * Representa o resultado de uma operação que pode ter sucesso (`Ok`) ou
304
+ * falhar (`Err`), tornando o erro parte explícita do tipo de retorno em vez
305
+ * de depender de exceções.
306
+ *
307
+ * Um `Either<O, E>` é sempre uma instância de {@link Ok} que carrega um
308
+ * valor de sucesso do tipo `O`, ou de {@link Err} que carrega um valor de
309
+ * erro do tipo `E`. Use {@link ok} e {@link err} para criá-los.
310
+ *
311
+ * Os métodos {@link Either.map}, {@link Either.mapErr}, {@link Either.flatMap}
312
+ * e {@link Either.orElse} retornam um novo `Either` e não alteram o original.
313
+ * Para tratar os dois casos use {@link Either.match}, ou os type guards
314
+ * {@link Either.isOk} e {@link Either.isErr}.
315
+ *
316
+ * @template O - Tipo do valor de sucesso.
317
+ * @template E - Tipo do valor de erro.
318
+ *
319
+ * @example
320
+ * ```ts
321
+ * function toDivide(a: number, b: number): Either<number, string> {
322
+ * return b === 0 ? err("Divisão por zero") : ok(a / b);
323
+ * }
324
+ *
325
+ * const message = toDivide(10, 2)
326
+ * .map((resultado) => resultado * 3)
327
+ * .match({
328
+ * onOk: (valor) => `Resultado: ${valor}`,
329
+ * onErr: (erro) => `Falha: ${erro}`,
330
+ * });
331
+ * // "Resultado: 15"
332
+ * ```
333
+ */
334
+ var Either = class {
335
+ /**
336
+ * Transforma o valor de sucesso mantendo o erro intacto.
337
+ *
338
+ * Se for `Ok` aplica `fn` ao valor e retorna um novo `Ok` com o resultado.
339
+ * Se for `Err` `fn` não é chamada e um novo `Err` com o mesmo erro é
340
+ * retornado. Exceções lançadas por `fn` não são capturadas.
341
+ *
342
+ * @template O2 - Tipo do novo valor de sucesso.
343
+ * @param fn - Função que converte o valor de sucesso.
344
+ * @returns Um `Either` com o valor transformado ou o erro original.
345
+ *
346
+ * @example
347
+ * ```ts
348
+ * ok<number, string>(2).map((n) => n * 2).unwrap(); // 4
349
+ * err<number, string>("falhou").map((n) => n * 2).unwrapErr(); // "falhou"
350
+ * ```
351
+ */
352
+ map(fn) {
353
+ if (this.isOk()) return ok(fn(this.unwrap()));
354
+ return err(this.unwrapErr());
355
+ }
356
+ /**
357
+ * Transforma o valor de erro mantendo o sucesso intacto.
358
+ *
359
+ * Se for `Err` aplica `fn` ao erro e retorna um novo `Err` com o resultado.
360
+ * Se for `Ok` `fn` não é chamada e um novo `Ok` com o mesmo valor é
361
+ * retornado. Exceções lançadas por `fn` não são capturadas.
362
+ *
363
+ * @template E2 - Tipo do novo valor de erro.
364
+ * @param fn - Função que converte o valor de erro.
365
+ * @returns Um `Either` com o erro transformado ou o valor original.
366
+ *
367
+ * @example
368
+ * ```ts
369
+ * err<number, string>("falhou").mapErr((e) => e.length).unwrapErr(); // 7
370
+ * ok<number, string>(1).mapErr((e) => e.length).unwrap(); // 1
371
+ * ```
372
+ */
373
+ mapErr(fn) {
374
+ if (this.isErr()) return err(fn(this.unwrapErr()));
375
+ return ok(this.unwrap());
376
+ }
377
+ /**
378
+ * Encadeia uma operação que também retorna um `Either` usada quando o
379
+ * próximo passo também pode falhar.
380
+ *
381
+ * Se for `Ok`, retorna diretamente o `Either` produzido por `fn` (sem
382
+ * aninhamento). Se for `Err` `fn` não é chamada e o erro é propagado.
383
+ * O tipo de erro resultante é a união `E | E2`. Exceções lançadas por `fn`
384
+ * não são capturadas.
385
+ *
386
+ * @template O2 - Tipo do valor de sucesso retornado por `fn`.
387
+ * @template E2 - Tipo do valor de erro retornado por `fn`.
388
+ * @param fn - Função que recebe o valor de sucesso e retorna um `Either`.
389
+ * @returns O `Either` retornado por `fn`, ou o erro original.
390
+ *
391
+ * @example
392
+ * ```ts
393
+ * const forNumber = (s: string): Either<number, string> => {
394
+ * const n = Number(s);
395
+ * return Number.isNaN(n) ? err("Não é número") : ok(n);
396
+ * };
397
+ *
398
+ * ok<string, string>("42").flatMap(forNumber).unwrap(); // 42
399
+ * ok<string, string>("abc").flatMap(forNumber).unwrapErr(); // "Não é número"
400
+ * ```
401
+ */
402
+ flatMap(fn) {
403
+ if (this.isOk()) return fn(this.unwrap());
404
+ return err(this.unwrapErr());
405
+ }
406
+ /**
407
+ * Tenta se recuperar de um erro encadeando uma operação alternativa que
408
+ * também retorna um `Either`. É o oposto de {@link Either.flatMap}.
409
+ *
410
+ * Se for `Err` retorna diretamente o `Either` produzido por `fn`. Se for
411
+ * `Ok` `fn` não é chamada e o valor é mantido. O tipo de sucesso
412
+ * resultante é a união `O | O2`. Exceções lançadas por `fn` não são
413
+ * capturadas.
414
+ *
415
+ * @template O2 - Tipo do valor de sucesso retornado por `fn`.
416
+ * @template E2 - Tipo do valor de erro retornado por `fn`.
417
+ * @param fn - Função que recebe o valor de erro e retorna um `Either`.
418
+ * @returns O `Either` retornado por `fn`, ou o valor de sucesso original.
419
+ *
420
+ * @example
421
+ * ```ts
422
+ * err<number, string>("falhou").orElse(() => ok(0)).unwrap(); // 0
423
+ * ok<number, string>(5).orElse(() => ok(0)).unwrap(); // 5
424
+ * ```
425
+ */
426
+ orElse(fn) {
427
+ if (this.isErr()) return fn(this.unwrapErr());
428
+ return ok(this.unwrap());
429
+ }
430
+ /**
431
+ * Trata os dois casos e produz um único valor chamando o handler da
432
+ * variante correspondente.
433
+ *
434
+ * @template R - Tipo do valor retornado pelos handlers.
435
+ * @param handlers - Objeto com `onOk` chamado com o valor de sucesso e
436
+ * `onErr` chamado com o valor de erro.
437
+ * @returns O resultado do handler chamado.
438
+ *
439
+ * @example
440
+ * ```ts
441
+ * const texto = resultado.match({
442
+ * onOk: (valor) => `Sucesso: ${valor}`,
443
+ * onErr: (erro) => `Erro: ${erro}`,
444
+ * });
445
+ * ```
446
+ */
447
+ match(handlers) {
448
+ if (this.isOk()) return handlers.onOk(this.unwrap());
449
+ return handlers.onErr(this.unwrapErr());
450
+ }
451
+ };
452
+ /**
453
+ * Variante de sucesso de {@link Either} que carrega um valor do tipo `O`.
454
+ *
455
+ * O construtor é `protected`; para criar uma instância use {@link Ok.create}
456
+ * ou a função {@link ok}.
457
+ *
458
+ * @template O - Tipo do valor de sucesso. Por padrão, `never`.
459
+ * @template E - Tipo do valor de erro usado apenas para compatibilidade com
460
+ * {@link Either}. Por padrão, `never`.
461
+ */
462
+ var Ok = class Ok extends Either {
463
+ /** Discriminante da variante sempre `"Ok"`. */
464
+ tag = "Ok";
465
+ /** Valor de sucesso armazenado. */
466
+ value;
467
+ /**
468
+ * @param value - Valor de sucesso a ser armazenado.
469
+ */
470
+ constructor(value) {
471
+ super();
472
+ this.value = value;
473
+ }
474
+ /**
475
+ * Retorna o valor de sucesso armazenado.
476
+ *
477
+ * @returns O valor contido.
478
+ */
479
+ unwrap() {
480
+ return this.value;
481
+ }
482
+ /**
483
+ * Sempre lança um erro pois um `Ok` não possui valor de erro.
484
+ *
485
+ * @throws {EitherUnwrapError} Sempre. A `cause` é o valor de sucesso contido.
486
+ */
487
+ unwrapErr() {
488
+ throw new require_errors.EitherUnwrapError("Chamado unwrapErr() em Ok.", { cause: this.value });
489
+ }
490
+ /** @returns Sempre `true`. */
491
+ isOk() {
492
+ return true;
493
+ }
494
+ /** @returns Sempre `false`. */
495
+ isErr() {
496
+ return false;
497
+ }
498
+ /**
499
+ * Cria um `Ok` com o valor informado.
500
+ *
501
+ * @template O - Tipo do valor de sucesso. Por padrão, `never`.
502
+ * @template E - Tipo do valor de erro. Por padrão, `never`.
503
+ * @param value - Valor de sucesso.
504
+ * @returns Uma nova instância de `Ok`.
505
+ */
506
+ static create(value) {
507
+ return new Ok(value);
508
+ }
509
+ };
510
+ /**
511
+ * Variante de erro de {@link Either} que carrega um valor do tipo `E`.
512
+ *
513
+ * O construtor é `protected`; para criar uma instância use {@link Err.create}
514
+ * ou a função {@link err}.
515
+ *
516
+ * @template O - Tipo do valor de sucesso usado apenas para compatibilidade
517
+ * com {@link Either}. Por padrão, `never`.
518
+ * @template E - Tipo do valor de erro. Por padrão, `never`.
519
+ */
520
+ var Err = class Err extends Either {
521
+ /** Discriminante da variante sempre `"Err"`. */
522
+ tag = "Err";
523
+ /** Valor de erro armazenado. */
524
+ value;
525
+ /**
526
+ * @param value - Valor de erro a ser armazenado.
527
+ */
528
+ constructor(value) {
529
+ super();
530
+ this.value = value;
531
+ }
532
+ /**
533
+ * Sempre lança um erro pois um `Err` não possui valor de sucesso.
534
+ *
535
+ * @throws {EitherUnwrapError} Sempre. A `cause` é o valor de erro contido.
536
+ */
537
+ unwrap() {
538
+ throw new require_errors.EitherUnwrapError("Chamado unwrap() em Err.", { cause: this.value });
539
+ }
540
+ /**
541
+ * Retorna o valor de erro armazenado.
542
+ *
543
+ * @returns O valor contido.
544
+ */
545
+ unwrapErr() {
546
+ return this.value;
547
+ }
548
+ /** @returns Sempre `false`. */
549
+ isOk() {
550
+ return false;
551
+ }
552
+ /** @returns Sempre `true`. */
553
+ isErr() {
554
+ return true;
555
+ }
556
+ /**
557
+ * Cria um `Err` com o valor informado.
558
+ *
559
+ * @template O - Tipo do valor de sucesso. Por padrão, `never`.
560
+ * @template E - Tipo do valor de erro. Por padrão, `never`.
561
+ * @param value - Valor de erro.
562
+ * @returns Uma nova instância de `Err`.
563
+ */
564
+ static create(value) {
565
+ return new Err(value);
566
+ }
567
+ };
568
+ /**
569
+ * Cria um {@link Either} de sucesso (`Ok`) com o valor informado.
570
+ *
571
+ * O retorno é tipado como `Either<O, E>` e não como `Ok` para que possa ser
572
+ * usado onde se espera qualquer variante. Como `E` não pode ser inferido a
573
+ * partir do argumento, informe-o explicitamente quando necessário.
574
+ *
575
+ * @template O - Tipo do valor de sucesso. Por padrão, `never`.
576
+ * @template E - Tipo do valor de erro. Por padrão, `never`.
577
+ * @param value - Valor de sucesso.
578
+ * @returns Um `Either` que é um `Ok` contendo `value`.
579
+ *
580
+ * @example
581
+ * ```ts
582
+ * const result = ok<number, string>(42);
583
+ * result.isOk(); // true
584
+ * result.unwrap(); // 42
585
+ * ```
586
+ */
587
+ function ok(value) {
588
+ return Ok.create(value);
589
+ }
590
+ /**
591
+ * Cria um {@link Either} de erro (`Err`) com o valor informado.
592
+ *
593
+ * O retorno é tipado como `Either<O, E>` e não como `Err` para que possa ser
594
+ * usado onde se espera qualquer variante. Como `O` não pode ser inferido a
595
+ * partir do argumento, informe-o explicitamente quando necessário.
596
+ *
597
+ * @template O - Tipo do valor de sucesso. Por padrão, `never`.
598
+ * @template E - Tipo do valor de erro. Por padrão, `never`.
599
+ * @param value - Valor de erro.
600
+ * @returns Um `Either` que é um `Err` contendo `value`.
601
+ *
602
+ * @example
603
+ * ```ts
604
+ * const result = err<number, string>("Algo deu errado");
605
+ * result.isErr(); // true
606
+ * result.unwrapErr(); // "Algo deu errado"
607
+ * ```
608
+ */
609
+ function err(value) {
610
+ return Err.create(value);
611
+ }
612
+ //#endregion
613
+ exports.BASE_ERROR_BRAND = require_functions_index.BASE_ERROR_BRAND;
614
+ exports.BaseError = BaseError;
615
+ exports.CIRCULAR_MARKER = require_functions_index.CIRCULAR_MARKER;
616
+ exports.DEFAULT_PARAM_DELIMITERS = require_functions_index.DEFAULT_PARAM_DELIMITERS;
617
+ exports.Either = Either;
618
+ exports.EitherUnwrapError = require_errors.EitherUnwrapError;
619
+ exports.Err = Err;
620
+ exports.InvalidErrorCode = require_errors.InvalidErrorCode;
621
+ exports.InvalidParamDelimitersError = require_invalid_param_delimiters_error.InvalidParamDelimitersError;
622
+ exports.Ok = Ok;
623
+ exports.UPPER_SNAKE_CASE = require_errors.UPPER_SNAKE_CASE;
624
+ exports.createParamPlaceholder = require_functions_index.createParamPlaceholder;
625
+ exports.defineErrorCatalog = defineErrorCatalog;
626
+ exports.err = err;
627
+ exports.escapeRegExp = require_functions_index.escapeRegExp;
628
+ exports.interpolateErrorMessage = interpolateErrorMessage;
629
+ exports.invalidCodeMessage = require_errors.invalidCodeMessage;
630
+ exports.isBaseError = require_functions_index.isBaseError;
631
+ exports.isUpperSnakeCase = require_errors.isUpperSnakeCase;
632
+ exports.ok = ok;
633
+ exports.serializeBaseError = require_functions_index.serializeBaseError;
634
+ exports.serializeCauseError = require_functions_index.serializeCauseError;
635
+ exports.serializeNativeError = require_functions_index.serializeNativeError;
636
+
637
+ //# sourceMappingURL=index.cjs.map