@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.
@@ -0,0 +1,387 @@
1
+ //#region src/types/error-param-delimiters.d.ts
2
+ /**
3
+ * Delimitadores de abertura e fechamento usados para identificar os
4
+ * placeholders em uma mensagem de erro (ex.: `{id}`). Também pode
5
+ * ser usado para tipar, em runtime, o objeto de delimitadores.
6
+ *
7
+ * Os parâmetros de tipo têm `string` como padrão, de modo que
8
+ * `ErrorParamDelimiters` sem argumentos serve como restrição genérica
9
+ * (`extends ErrorParamDelimiters`) aceitando quaisquer delimitadores. Para o
10
+ * par padrão `{` e `}`, informe os literais explicitamente.
11
+ *
12
+ * @template Open - Tipo literal do delimitador de abertura. Por padrão, `string`.
13
+ * @template Close - Tipo literal do delimitador de fechamento. Por padrão, `string`.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const keys = { open: "{", close: "}" } as const satisfies ErrorParamDelimiters;
18
+ *
19
+ * const brackets: ErrorParamDelimiters<"[", "]"> = {
20
+ * open: "[",
21
+ * close: "]",
22
+ * };
23
+ * // Mensagem correspondente: "Usuário [id] não encontrado"
24
+ * ```
25
+ */
26
+ type ErrorParamDelimiters<Open extends string = string, Close extends string = string> = Readonly<{
27
+ /** Delimitador que marca o início de um placeholder (ex.: `"{"`). */
28
+ open: Open;
29
+ /** Delimitador que marca o fim de um placeholder (ex.: `"}"`). */
30
+ close: Close;
31
+ }>;
32
+ //#endregion
33
+ //#region src/functions/create-param-placeholder.d.ts
34
+ /**
35
+ * Delimitadores padrão dos placeholders em mensagens de erro: `{` para abrir
36
+ * e `}` para fechar (ex.: `{id}`).
37
+ *
38
+ * Declarado com `as const`, então mantém os tipos literais `"{"` e `"}"`,
39
+ * o que permite derivar {@link DefaultParamDelimiters} a partir dele.
40
+ */
41
+ declare const DEFAULT_PARAM_DELIMITERS: {
42
+ readonly open: "{";
43
+ readonly close: "}";
44
+ };
45
+ /**
46
+ * Tipo dos delimitadores padrão equivalente a
47
+ * `{ readonly open: "{"; readonly close: "}" }`.
48
+ *
49
+ * É usado como valor padrão de `Delimiters` em tipos como `ErrorParams`.
50
+ */
51
+ type DefaultParamDelimiters = typeof DEFAULT_PARAM_DELIMITERS;
52
+ /**
53
+ * Cria uma expressão regular global que localiza os placeholders de uma
54
+ * mensagem de erro com base nos delimitadores informados.
55
+ *
56
+ * Os delimitadores são escapados com {@link escapeRegExp}, então símbolos como
57
+ * `[`, `(` ou `$` são tratados como texto literal. Delimitadores com mais de
58
+ * um caractere (ex.: `{{` e `}}`) também são aceitos.
59
+ *
60
+ * Em cada correspondência o grupo de captura `1` contém o texto entre os
61
+ * delimitadores, exatamente como aparece na mensagem (sem aparar espaços).
62
+ * O conteúdo pode ocupar várias linhas, mas não pode conter os delimitadores
63
+ * de abertura ou de fechamento. Em casos como `{{id}}` a correspondência
64
+ * recai sobre o par mais interno (`{id}`). Placeholders vazios (ex.: `{}`)
65
+ * também correspondem com o grupo `1` igual a `""`.
66
+ *
67
+ * Cada chamada devolve uma nova instância de `RegExp`. Como ela usa a flag
68
+ * `g` que mantém estado em `lastIndex`, isso evita que usos diferentes
69
+ * compartilhem o mesmo estado.
70
+ *
71
+ * @param delimiters - Delimitadores `open` e `close` do placeholder. Por
72
+ * padrão, {@link DEFAULT_PARAM_DELIMITERS} (`{` e `}`).
73
+ * @returns Expressão regular global que corresponde a cada placeholder.
74
+ * @throws {InvalidParamDelimitersError} Se `open` ou `close` for uma string
75
+ * vazia.
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * const regex = createParamPlaceholder();
80
+ *
81
+ * for (const match of "Usuário {id} não encontrado em {table}".matchAll(regex)) {
82
+ * console.log(match[1]);
83
+ * }
84
+ * // "id"
85
+ * // "table"
86
+ *
87
+ * "Olá, {nome}!".replace(regex, (_, param) => `<${param}>`);
88
+ * // "Olá, <nome>!"
89
+ *
90
+ * // Delimitadores personalizados
91
+ * const brackets = createParamPlaceholder({ open: "[", close: "]" });
92
+ * "Rota [route] não encontrada".match(brackets); // ["[route]"]
93
+ *
94
+ * // Delimitadores vazios não são permitidos
95
+ * createParamPlaceholder({ open: "", close: "}" });
96
+ * // Lança InvalidParamDelimitersError
97
+ * ```
98
+ */
99
+ declare function createParamPlaceholder(delimiters?: ErrorParamDelimiters): RegExp;
100
+ //#endregion
101
+ //#region src/types/error-descriptor.d.ts
102
+ /**
103
+ * Descreve um erro do catálogo: um código identificador e a mensagem associada.
104
+ *
105
+ * A mensagem pode conter placeholders (ex.: `"Usuário {id} não encontrado"`),
106
+ * que são preenchidos com os parâmetros informados na criação do erro.
107
+ *
108
+ * @template Code - Tipo literal do código do erro. Por padrão, `string`.
109
+ * @template Message - Tipo literal da mensagem do erro. Por padrão, `string`.
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * const USER_NOT_FOUND = {
114
+ * code: "USER_NOT_FOUND",
115
+ * message: "Usuário {id} não encontrado",
116
+ * } as const satisfies ErrorDescriptor;
117
+ * ```
118
+ */
119
+ interface ErrorDescriptor<Code extends string = string, Message extends string = string> {
120
+ /** Código único que identifica o erro (ex.: `"USER_NOT_FOUND"`). */
121
+ readonly code: Code;
122
+ /** Mensagem do erro, podendo conter placeholders como `{id}`. */
123
+ readonly message: Message;
124
+ }
125
+ //#endregion
126
+ //#region src/types/error-catalog.d.ts
127
+ /**
128
+ * Catálogo de erros somente leitura, derivado de um objeto que associa cada
129
+ * código de erro à sua mensagem.
130
+ *
131
+ * Para cada entrada de `Definitions`, a chave vira o `code` e o valor vira a
132
+ * `message` de um {@link ErrorDescriptor}, preservando os tipos literais de
133
+ * ambos. Assim, `TEST_ERROR_CODES.USER_NOT_FOUND.code` tem o tipo `"USER_NOT_FOUND"`
134
+ * e `TEST_ERROR_CODES.USER_NOT_FOUND.message` tem o tipo literal da mensagem definida.
135
+ *
136
+ * Apenas chaves do tipo `string` são consideradas.
137
+ *
138
+ * @template Definitions - Objeto que mapeia códigos de erro para suas
139
+ * mensagens. Por padrão, `Record<string, string>`.
140
+ *
141
+ * @example
142
+ * ```ts
143
+ * type TEST_ERROR_CODES = ErrorCatalog<{
144
+ * USER_NOT_FOUND: "Usuário {id} não encontrado";
145
+ * INVALID_TOKEN: "Token inválido";
146
+ * }>;
147
+ * // {
148
+ * // readonly USER_NOT_FOUND: ErrorDescriptor<"USER_NOT_FOUND", "Usuário {id} não encontrado">;
149
+ * // readonly INVALID_TOKEN: ErrorDescriptor<"INVALID_TOKEN", "Token inválido">;
150
+ * // }
151
+ * ```
152
+ */
153
+ type ErrorCatalog<Definitions extends Record<string, string> = Record<string, string>> = Readonly<{ [Code in keyof Definitions & string]: ErrorDescriptor<Code, Definitions[Code]>; }>;
154
+ //#endregion
155
+ //#region src/types/catalog-code.d.ts
156
+ /**
157
+ * Extrai a união de todos os códigos de erro presentes em um catálogo.
158
+ *
159
+ * Percorre cada {@link ErrorDescriptor} do catálogo e coleta o tipo literal de
160
+ * sua propriedade `code`. Útil para tipar parâmetros que aceitam apenas
161
+ * códigos válidos de um catálogo específico.
162
+ *
163
+ * @template Catalog - Catálogo de erros a ser analisado. Por padrão,
164
+ * `ErrorCatalog`, caso em que o resultado é `string`.
165
+ *
166
+ * @example
167
+ * ```ts
168
+ * type TEST_ERROR_CODES = ErrorCatalog<{
169
+ * USER_NOT_FOUND: "Usuário {id} não encontrado";
170
+ * INVALID_TOKEN: "Token inválido";
171
+ * }>;
172
+ *
173
+ * type TestErrorCatalogCode = CatalogCode<TEST_ERROR_CODES>;
174
+ * // "USER_NOT_FOUND" | "INVALID_TOKEN"
175
+ * ```
176
+ */
177
+ type CatalogCode<Catalog extends ErrorCatalog = ErrorCatalog> = Catalog[keyof Catalog]["code"];
178
+ //#endregion
179
+ //#region src/types/catalog-descriptor.d.ts
180
+ /**
181
+ * Obtém o descritor de erro correspondente a um código específico de um
182
+ * catálogo.
183
+ *
184
+ * Busca em `Catalog` a entrada cujo `code` é `Code` e retorna o respectivo
185
+ * `ErrorDescriptor`, com `code` e `message` em seus tipos literais. Se `Code`
186
+ * for uma união de códigos, o resultado é a união dos descritores
187
+ * correspondentes. Se `Code` não for informado, o resultado é a união de todos
188
+ * os descritores do catálogo.
189
+ *
190
+ * @template Catalog - Catálogo de erros a ser consultado. Por padrão,
191
+ * `ErrorCatalog`.
192
+ * @template Code - Código (ou união de códigos) a ser buscado, restrito aos
193
+ * códigos existentes no catálogo (ver {@link CatalogCode}). Por padrão, todos
194
+ * os códigos do catálogo.
195
+ *
196
+ * @example
197
+ * ```ts
198
+ * type TEST_ERROR_CODES = ErrorCatalog<{
199
+ * USER_NOT_FOUND: "Usuário {id} não encontrado";
200
+ * INVALID_TOKEN: "Token inválido";
201
+ * }>;
202
+ *
203
+ * type A = CatalogDescriptor<TEST_ERROR_CODES, "USER_NOT_FOUND">;
204
+ * // ErrorDescriptor<"USER_NOT_FOUND", "Usuário {id} não encontrado">
205
+ *
206
+ * type B = CatalogDescriptor<TEST_ERROR_CODES, "USER_NOT_FOUND" | "INVALID_TOKEN">;
207
+ * // ErrorDescriptor<"USER_NOT_FOUND", ...> | ErrorDescriptor<"INVALID_TOKEN", ...>
208
+ *
209
+ * type C = CatalogDescriptor<TEST_ERROR_CODES>;
210
+ * // união de todos os descritores do catálogo
211
+ * ```
212
+ */
213
+ type CatalogDescriptor<Catalog extends ErrorCatalog = ErrorCatalog, Code extends CatalogCode<Catalog> = CatalogCode<Catalog>> = Extract<Catalog[Code], {
214
+ code: Code;
215
+ }>;
216
+ //#endregion
217
+ //#region src/types/extract-placeholders.d.ts
218
+ /**
219
+ * Caracteres de espaço em branco reconhecidos pelos tipos utilitários deste módulo.
220
+ *
221
+ * Inclui espaço, tabulação, quebra de linha (`\n`) e retorno de carro (`\r`).
222
+ */
223
+ type Whitespace = " " | "\t" | "\n" | "\r";
224
+ /**
225
+ * Remove, em tempo de compilação, todos os espaços em branco no início e no fim
226
+ * de uma string literal. É o equivalente em nível de tipos a `String.prototype.trim()`.
227
+ *
228
+ * O tipo é recursivo: remove um caractere de espaço por vez do início e
229
+ * quando não há mais nenhum, do fim até restar apenas o conteúdo "limpo".
230
+ *
231
+ * @template T - Tipo string literal a ser aparado. Por padrão, `string`.
232
+ *
233
+ * @example
234
+ * ```ts
235
+ * type A = Trim<" olá ">; // "olá"
236
+ * type B = Trim<"\n\tabc\r">; // "abc"
237
+ * type C = Trim<"sem-espaço">; // "sem-espaço"
238
+ * type D = Trim<string>; // string
239
+ * ```
240
+ */
241
+ type Trim<T extends string = string> = T extends `${Whitespace}${infer Rest}` ? Trim<Rest> : T extends `${infer Rest}${Whitespace}` ? Trim<Rest> : T;
242
+ /**
243
+ * Extrai, em tempo de compilação, os nomes dos placeholders presentes em uma
244
+ * string de mensagem, retornando-os como uma união de string literals.
245
+ *
246
+ * Os delimitadores de abertura e fechamento são informados por meio de um
247
+ * objeto {@link ErrorParamDelimiters}. O conteúdo de cada placeholder é
248
+ * aparado com {@link Trim} e placeholders vazios (ex.: `{}` ou `{ }`) são
249
+ * ignorados.
250
+ *
251
+ * Se `Message` for o tipo genérico `string` (ou seja, não for um literal),
252
+ * não é possível inferir os placeholders e o resultado é `string`. Se a
253
+ * mensagem não contiver nenhum placeholder, o resultado é `never`.
254
+ *
255
+ *
256
+ * @template Message - Mensagem a ser analisada. Por padrão, `string`.
257
+ * @template Delimiters - Objeto com os delimitadores `open` e `close` do
258
+ * placeholder. Por padrão, {@link DefaultParamDelimiters}.
259
+ *
260
+ * @example
261
+ * ```ts
262
+ * type Keys = { readonly open: "{"; readonly close: "}" };
263
+ *
264
+ * type A = ExtractPlaceholders<"Olá, {nome}! Você tem {qtd} mensagens.", Keys>;
265
+ * // "nome" | "qtd"
266
+ *
267
+ * type B = ExtractPlaceholders<"Valor: { valor }", Keys>;
268
+ * // "valor" (espaços internos são removidos)
269
+ *
270
+ * type C = ExtractPlaceholders<"Sem placeholders", Keys>;
271
+ * // never
272
+ *
273
+ * type D = ExtractPlaceholders<"Olá, {}!", Keys>;
274
+ * // never (placeholder vazio é ignorado)
275
+ *
276
+ * type E = ExtractPlaceholders<
277
+ * "Olá, [nome]!",
278
+ * { readonly open: "["; readonly close: "]" }
279
+ * >;
280
+ * // "nome" (delimitadores personalizados)
281
+ *
282
+ * type F = ExtractPlaceholders<string, Keys>;
283
+ * // string (mensagem não literal)
284
+ * ```
285
+ */
286
+ type ExtractPlaceholders<Message extends string = string, Delimiters extends ErrorParamDelimiters = DefaultParamDelimiters> = string extends Message ? string : Message extends `${string}${Delimiters["open"]}${infer Param}${Delimiters["close"]}${infer Rest}` ? Trim<Param> extends "" ? ExtractPlaceholders<Rest, Delimiters> : Trim<Param> | ExtractPlaceholders<Rest, Delimiters> : never;
287
+ //#endregion
288
+ //#region src/types/params-from-message.d.ts
289
+ /**
290
+ * Valores aceitos como parâmetros para preencher os placeholders de uma
291
+ * mensagem de erro.
292
+ *
293
+ * Restringe-se a tipos primitivos simples e serializáveis, o que evita
294
+ * objetos arbitrários e referências circulares nos parâmetros do erro.
295
+ */
296
+ type ErrorParamValue = string | number | boolean | bigint | null;
297
+ /**
298
+ * Deriva em tempo de compilação, o tipo do objeto de parâmetros exigido por
299
+ * uma mensagem com base nos placeholders presentes nela.
300
+ *
301
+ * Cada placeholder encontrado (via {@link ExtractPlaceholders}) vira uma
302
+ * propriedade obrigatória e somente leitura do tipo {@link ErrorParamValue}.
303
+ * Os delimitadores dos placeholders são informados por meio de um objeto
304
+ * {@link ErrorParamDelimiters}.
305
+ *
306
+ * - Se a mensagem **não** tiver placeholders o resultado é `never`, indicando
307
+ * que nenhum parâmetro deve ser informado.
308
+ * - Se `Message` for o tipo genérico `string` (não literal), não é possível
309
+ * inferir os placeholders e o resultado é um objeto com chaves `string`
310
+ * arbitrárias, ou seja, `Readonly<Record<string, ErrorParamValue>>`.
311
+ *
312
+ * @template Message - Mensagem a ser analisada. Por padrão, `string`.
313
+ * @template Delimiters - Objeto com os delimitadores `open` e `close` do
314
+ * placeholder. Por padrão, {@link DefaultParamDelimiters}.
315
+ *
316
+ * @example
317
+ * ```ts
318
+ * type Keys = { readonly open: "{"; readonly close: "}" };
319
+ *
320
+ * type A = ParamsFromMessage<"Usuário {id} não encontrado em {table}", Keys>;
321
+ * // Readonly<{ id: ErrorParamValue; table: ErrorParamValue }>
322
+ *
323
+ * type B = ParamsFromMessage<"Algo deu errado", Keys>;
324
+ * // never (sem placeholders, sem parâmetros)
325
+ *
326
+ * type C = ParamsFromMessage<
327
+ * "Falha em [resource]",
328
+ * { readonly open: "["; readonly close: "]" }
329
+ * >;
330
+ * // Readonly<{ resource: ErrorParamValue }>
331
+ *
332
+ * type D = ParamsFromMessage<string, Keys>;
333
+ * // Readonly<Record<string, ErrorParamValue>>
334
+ * ```
335
+ */
336
+ type ParamsFromMessage<Message extends string = string, Delimiters extends ErrorParamDelimiters = DefaultParamDelimiters> = [ExtractPlaceholders<Message, Delimiters>] extends [never] ? never : Readonly<{ [K in ExtractPlaceholders<Message, Delimiters>]: ErrorParamValue; }>;
337
+ //#endregion
338
+ //#region src/types/error-params.d.ts
339
+ /**
340
+ * Deriva em tempo de compilação, o tipo do objeto de parâmetros exigido para
341
+ * criar o erro de um código específico de um catálogo.
342
+ *
343
+ * Localiza o descritor do código em `Catalog` (via {@link CatalogDescriptor}),
344
+ * lê sua `message` e converte os placeholders encontrados em propriedades
345
+ * obrigatórias (via {@link ParamsFromMessage}). Os delimitadores dos
346
+ * placeholders são informados por meio de um objeto
347
+ * {@link ErrorParamDelimiters}.
348
+ *
349
+ * - Se a mensagem do código **não** tiver placeholders, o resultado é `never`,
350
+ * indicando que nenhum parâmetro deve ser informado.
351
+ * - Se `Code` for uma união de códigos, o resultado exige os placeholders de
352
+ * todas as mensagens correspondentes, e não apenas os de uma delas.
353
+ *
354
+ * @template Catalog - Catálogo de erros a ser consultado. Por padrão,
355
+ * `ErrorCatalog`.
356
+ * @template Code - Código (ou união de códigos) do erro, restrito aos códigos
357
+ * existentes no catálogo (ver {@link CatalogCode}). Por padrão, todos os
358
+ * códigos do catálogo.
359
+ * @template Delimiters - Objeto com os delimitadores `open` e `close` do
360
+ * placeholder. Por padrão, {@link DefaultParamDelimiters}.
361
+ *
362
+ * @example
363
+ * ```ts
364
+ * type TEST_ERROR_CODES = ErrorCatalog<{
365
+ * USER_NOT_FOUND: "Usuário {id} não encontrado em {tabela}";
366
+ * INVALID_TOKEN: "Token inválido";
367
+ * ROUTE_NOT_FOUND: "Rota [rota] não encontrada";
368
+ * }>;
369
+ *
370
+ * type A = ErrorParams<TEST_ERROR_CODES, "USER_NOT_FOUND">;
371
+ * // Readonly<{ id: ErrorParamValue; tabela: ErrorParamValue }>
372
+ *
373
+ * type B = ErrorParams<TEST_ERROR_CODES, "INVALID_TOKEN">;
374
+ * // never (sem placeholders, sem parâmetros)
375
+ *
376
+ * type C = ErrorParams<
377
+ * TEST_ERROR_CODES,
378
+ * "ROUTE_NOT_FOUND",
379
+ * { readonly open: "["; readonly close: "]" }
380
+ * >;
381
+ * // Readonly<{ rota: ErrorParamValue }> (delimitadores personalizados)
382
+ * ```
383
+ */
384
+ type ErrorParams<Catalog extends ErrorCatalog = ErrorCatalog, Code extends CatalogCode<Catalog> = CatalogCode<Catalog>, Delimiters extends ErrorParamDelimiters = DefaultParamDelimiters> = ParamsFromMessage<CatalogDescriptor<Catalog, Code>["message"], Delimiters>;
385
+ //#endregion
386
+ export { Trim as a, CatalogCode as c, DEFAULT_PARAM_DELIMITERS as d, DefaultParamDelimiters as f, ExtractPlaceholders as i, ErrorCatalog as l, ErrorParamDelimiters as m, ErrorParamValue as n, Whitespace as o, createParamPlaceholder as p, ParamsFromMessage as r, CatalogDescriptor as s, ErrorParams as t, ErrorDescriptor as u };
387
+ //# sourceMappingURL=error-params-CR2parjT.d.mts.map
@@ -0,0 +1,6 @@
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
+ exports.EitherUnwrapError = require_errors.EitherUnwrapError;
5
+ exports.InvalidErrorCode = require_errors.InvalidErrorCode;
6
+ exports.InvalidParamDelimitersError = require_invalid_param_delimiters_error.InvalidParamDelimitersError;
@@ -0,0 +1,115 @@
1
+ //#region src/errors/either-unwrap-error.d.ts
2
+ /**
3
+ * Erro lançado quando `unwrap()` é chamado em um `Err` ou `unwrapErr()` é
4
+ * chamado em um `Ok`, ou seja, quando se tenta extrair de um {@link Either}
5
+ * o valor da variante que ele não possui.
6
+ *
7
+ * O valor contido na variante realmente presente é anexado como `cause`
8
+ * (o valor de erro em `unwrap()` num `Err`; o valor de sucesso em
9
+ * `unwrapErr()` num `Ok`). Esse valor pode ser de qualquer tipo, não
10
+ * necessariamente um `Error`.
11
+ *
12
+ * O `name` do erro é o nome da classe concreta (`new.target.name`) e o
13
+ * protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em
14
+ * subclasses e em alvos de compilação antigos.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * try {
19
+ * err<number, string>("falhou").unwrap();
20
+ * } catch (error) {
21
+ * if (error instanceof EitherUnwrapError) {
22
+ * error.message; // "Chamado unwrap() em Err."
23
+ * error.cause; // "falhou"
24
+ * }
25
+ * }
26
+ * ```
27
+ */
28
+ export declare class EitherUnwrapError extends Error {
29
+ /**
30
+ * Cria o erro de extração inválida de um `Either`.
31
+ *
32
+ * @param message - Mensagem do erro. Por padrão, uma mensagem genérica
33
+ * ("Chamado unwrap() ou unwrapErr() em resultado incompatível.").
34
+ * @param options - Opções padrão de `Error` como `cause` que normalmente
35
+ * carrega o valor contido no `Either`.
36
+ */
37
+ constructor(message?: string, options?: ErrorOptions);
38
+ }
39
+ //#endregion
40
+ //#region src/errors/invalid-error-code.d.ts
41
+ /**
42
+ * Erro lançado quando um código de erro não está em UPPER_SNAKE_CASE.
43
+ *
44
+ * Estende `TypeError` pois indica um valor de tipo ou formato inadequado.
45
+ * É lançado em tempo de execução por `defineErrorCatalog` complementando a
46
+ * validação feita em tempo de compilação por `ValidateErrorDefinitions`.
47
+ *
48
+ * A mensagem é gerada por {@link invalidCodeMessage} e o código inválido fica
49
+ * disponível na propriedade `code`.
50
+ *
51
+ * O `name` do erro é o nome da classe concreta (`new.target.name`) e o
52
+ * protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em
53
+ * subclasses e em alvos de compilação antigos.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * try {
58
+ * defineErrorCatalog({ userNotFound: "Usuário não encontrado" });
59
+ * } catch (error) {
60
+ * if (error instanceof InvalidErrorCode) {
61
+ * error.code; // "userNotFound"
62
+ * error.message; // 'Código de erro inválido "userNotFound". Os códigos de erro devem usar UPPER_SNAKE_CASE.'
63
+ * }
64
+ * }
65
+ * ```
66
+ */
67
+ export declare class InvalidErrorCode extends TypeError {
68
+ /** Código de erro inválido que provocou a exceção. */
69
+ readonly code: string;
70
+ /**
71
+ * Cria o erro de código inválido.
72
+ *
73
+ * @param code - Código de erro que não está em UPPER_SNAKE_CASE.
74
+ * @param options - Opções padrão de `Error` como `cause`.
75
+ */
76
+ constructor(code: string, options?: ErrorOptions);
77
+ }
78
+ //#endregion
79
+ //#region src/errors/invalid-param-delimiters-error.d.ts
80
+ /**
81
+ * Erro lançado quando os delimitadores de placeholders são inválidos, ou
82
+ * seja, quando `open` ou `close` é uma string vazia.
83
+ *
84
+ * Estende `TypeError` pois indica um valor de formato inadequado. É lançado
85
+ * em tempo de execução por `createParamPlaceholder` e por consequência, por
86
+ * quem o utiliza como `interpolateErrorMessage` e o construtor de
87
+ * `BaseError`.
88
+ *
89
+ * O `name` do erro é o nome da classe concreta (`new.target.name`) e o
90
+ * protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em
91
+ * subclasses e em alvos de compilação antigos.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * try {
96
+ * createParamPlaceholder({ open: "", close: "}" });
97
+ * } catch (error) {
98
+ * if (error instanceof InvalidParamDelimitersError) {
99
+ * error.message; // "Os delimitadores open e close não podem ser vazios."
100
+ * }
101
+ * }
102
+ * ```
103
+ */
104
+ export declare class InvalidParamDelimitersError extends TypeError {
105
+ /**
106
+ * Cria o erro de delimitadores inválidos.
107
+ *
108
+ * @param message - Mensagem do erro. Por padrão, "Os delimitadores open e
109
+ * close não podem ser vazios.".
110
+ * @param options - Opções padrão de `Error` como `cause`.
111
+ */
112
+ constructor(message?: string, options?: ErrorOptions);
113
+ }
114
+ //#endregion
115
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,115 @@
1
+ //#region src/errors/either-unwrap-error.d.ts
2
+ /**
3
+ * Erro lançado quando `unwrap()` é chamado em um `Err` ou `unwrapErr()` é
4
+ * chamado em um `Ok`, ou seja, quando se tenta extrair de um {@link Either}
5
+ * o valor da variante que ele não possui.
6
+ *
7
+ * O valor contido na variante realmente presente é anexado como `cause`
8
+ * (o valor de erro em `unwrap()` num `Err`; o valor de sucesso em
9
+ * `unwrapErr()` num `Ok`). Esse valor pode ser de qualquer tipo, não
10
+ * necessariamente um `Error`.
11
+ *
12
+ * O `name` do erro é o nome da classe concreta (`new.target.name`) e o
13
+ * protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em
14
+ * subclasses e em alvos de compilação antigos.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * try {
19
+ * err<number, string>("falhou").unwrap();
20
+ * } catch (error) {
21
+ * if (error instanceof EitherUnwrapError) {
22
+ * error.message; // "Chamado unwrap() em Err."
23
+ * error.cause; // "falhou"
24
+ * }
25
+ * }
26
+ * ```
27
+ */
28
+ export declare class EitherUnwrapError extends Error {
29
+ /**
30
+ * Cria o erro de extração inválida de um `Either`.
31
+ *
32
+ * @param message - Mensagem do erro. Por padrão, uma mensagem genérica
33
+ * ("Chamado unwrap() ou unwrapErr() em resultado incompatível.").
34
+ * @param options - Opções padrão de `Error` como `cause` que normalmente
35
+ * carrega o valor contido no `Either`.
36
+ */
37
+ constructor(message?: string, options?: ErrorOptions);
38
+ }
39
+ //#endregion
40
+ //#region src/errors/invalid-error-code.d.ts
41
+ /**
42
+ * Erro lançado quando um código de erro não está em UPPER_SNAKE_CASE.
43
+ *
44
+ * Estende `TypeError` pois indica um valor de tipo ou formato inadequado.
45
+ * É lançado em tempo de execução por `defineErrorCatalog` complementando a
46
+ * validação feita em tempo de compilação por `ValidateErrorDefinitions`.
47
+ *
48
+ * A mensagem é gerada por {@link invalidCodeMessage} e o código inválido fica
49
+ * disponível na propriedade `code`.
50
+ *
51
+ * O `name` do erro é o nome da classe concreta (`new.target.name`) e o
52
+ * protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em
53
+ * subclasses e em alvos de compilação antigos.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * try {
58
+ * defineErrorCatalog({ userNotFound: "Usuário não encontrado" });
59
+ * } catch (error) {
60
+ * if (error instanceof InvalidErrorCode) {
61
+ * error.code; // "userNotFound"
62
+ * error.message; // 'Código de erro inválido "userNotFound". Os códigos de erro devem usar UPPER_SNAKE_CASE.'
63
+ * }
64
+ * }
65
+ * ```
66
+ */
67
+ export declare class InvalidErrorCode extends TypeError {
68
+ /** Código de erro inválido que provocou a exceção. */
69
+ readonly code: string;
70
+ /**
71
+ * Cria o erro de código inválido.
72
+ *
73
+ * @param code - Código de erro que não está em UPPER_SNAKE_CASE.
74
+ * @param options - Opções padrão de `Error` como `cause`.
75
+ */
76
+ constructor(code: string, options?: ErrorOptions);
77
+ }
78
+ //#endregion
79
+ //#region src/errors/invalid-param-delimiters-error.d.ts
80
+ /**
81
+ * Erro lançado quando os delimitadores de placeholders são inválidos, ou
82
+ * seja, quando `open` ou `close` é uma string vazia.
83
+ *
84
+ * Estende `TypeError` pois indica um valor de formato inadequado. É lançado
85
+ * em tempo de execução por `createParamPlaceholder` e por consequência, por
86
+ * quem o utiliza como `interpolateErrorMessage` e o construtor de
87
+ * `BaseError`.
88
+ *
89
+ * O `name` do erro é o nome da classe concreta (`new.target.name`) e o
90
+ * protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em
91
+ * subclasses e em alvos de compilação antigos.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * try {
96
+ * createParamPlaceholder({ open: "", close: "}" });
97
+ * } catch (error) {
98
+ * if (error instanceof InvalidParamDelimitersError) {
99
+ * error.message; // "Os delimitadores open e close não podem ser vazios."
100
+ * }
101
+ * }
102
+ * ```
103
+ */
104
+ export declare class InvalidParamDelimitersError extends TypeError {
105
+ /**
106
+ * Cria o erro de delimitadores inválidos.
107
+ *
108
+ * @param message - Mensagem do erro. Por padrão, "Os delimitadores open e
109
+ * close não podem ser vazios.".
110
+ * @param options - Opções padrão de `Error` como `cause`.
111
+ */
112
+ constructor(message?: string, options?: ErrorOptions);
113
+ }
114
+ //#endregion
115
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1,3 @@
1
+ import { t as InvalidParamDelimitersError } from "../invalid-param-delimiters-error-BFxlVXp3.mjs";
2
+ import { n as InvalidErrorCode, t as EitherUnwrapError } from "../errors-DrDL51y9.mjs";
3
+ export { EitherUnwrapError, InvalidErrorCode, InvalidParamDelimitersError };