@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,149 @@
|
|
|
1
|
+
//#region src/upper-snake-case.ts
|
|
2
|
+
/**
|
|
3
|
+
* Expressão regular que valida códigos em UPPER_SNAKE_CASE em tempo de
|
|
4
|
+
* execução.
|
|
5
|
+
*
|
|
6
|
+
* Regras (espelham o tipo {@link IsUpperSnakeCase}):
|
|
7
|
+
* - deve começar com uma letra maiúscula (`A-Z`);
|
|
8
|
+
* - pode conter letras maiúsculas, dígitos e `_`;
|
|
9
|
+
* - `_` só pode aparecer entre caracteres alfanuméricos, ou seja, não pode
|
|
10
|
+
* estar no início nem no fim e não pode ser repetido em sequência.
|
|
11
|
+
*/
|
|
12
|
+
const UPPER_SNAKE_CASE = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;
|
|
13
|
+
/**
|
|
14
|
+
* Verifica em tempo de execução, se uma string está em UPPER_SNAKE_CASE.
|
|
15
|
+
*
|
|
16
|
+
* É o equivalente em runtime do tipo {@link IsUpperSnakeCase}, usando a
|
|
17
|
+
* expressão regular {@link UPPER_SNAKE_CASE}.
|
|
18
|
+
*
|
|
19
|
+
* @param value - String a ser verificada.
|
|
20
|
+
* @returns `true` se `value` estiver em UPPER_SNAKE_CASE; caso contrário,
|
|
21
|
+
* `false`.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* isUpperSnakeCase("USER_NOT_FOUND"); // true
|
|
26
|
+
* isUpperSnakeCase("ERROR_404"); // true
|
|
27
|
+
* isUpperSnakeCase("userNotFound"); // false
|
|
28
|
+
* isUpperSnakeCase("_USER"); // false
|
|
29
|
+
* isUpperSnakeCase("USER__NOT"); // false
|
|
30
|
+
* isUpperSnakeCase("1ERROR"); // false
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
function isUpperSnakeCase(value) {
|
|
34
|
+
return UPPER_SNAKE_CASE.test(value);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Monta a mensagem de erro exibida quando um código não está em
|
|
38
|
+
* UPPER_SNAKE_CASE.
|
|
39
|
+
*
|
|
40
|
+
* O retorno é tipado como {@link InvalidCodeMessage}, de modo que o texto em
|
|
41
|
+
* runtime corresponde exatamente ao tipo literal usado na validação em tempo
|
|
42
|
+
* de compilação.
|
|
43
|
+
*
|
|
44
|
+
* @template Code - Tipo literal do código inválido.
|
|
45
|
+
* @param code - Código de erro inválido a ser incluído na mensagem.
|
|
46
|
+
* @returns Mensagem descrevendo o código inválido e o formato esperado.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* invalidCodeMessage("userNotFound");
|
|
51
|
+
* // 'Código de erro inválido "userNotFound". Os códigos de erro devem usar UPPER_SNAKE_CASE.'
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
function invalidCodeMessage(code) {
|
|
55
|
+
return `Código de erro inválido "${code}". Os códigos de erro devem usar UPPER_SNAKE_CASE.`;
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/errors/invalid-error-code.ts
|
|
59
|
+
/**
|
|
60
|
+
* Erro lançado quando um código de erro não está em UPPER_SNAKE_CASE.
|
|
61
|
+
*
|
|
62
|
+
* Estende `TypeError` pois indica um valor de tipo ou formato inadequado.
|
|
63
|
+
* É lançado em tempo de execução por `defineErrorCatalog` complementando a
|
|
64
|
+
* validação feita em tempo de compilação por `ValidateErrorDefinitions`.
|
|
65
|
+
*
|
|
66
|
+
* A mensagem é gerada por {@link invalidCodeMessage} e o código inválido fica
|
|
67
|
+
* disponível na propriedade `code`.
|
|
68
|
+
*
|
|
69
|
+
* O `name` do erro é o nome da classe concreta (`new.target.name`) e o
|
|
70
|
+
* protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em
|
|
71
|
+
* subclasses e em alvos de compilação antigos.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* try {
|
|
76
|
+
* defineErrorCatalog({ userNotFound: "Usuário não encontrado" });
|
|
77
|
+
* } catch (error) {
|
|
78
|
+
* if (error instanceof InvalidErrorCode) {
|
|
79
|
+
* error.code; // "userNotFound"
|
|
80
|
+
* error.message; // 'Código de erro inválido "userNotFound". Os códigos de erro devem usar UPPER_SNAKE_CASE.'
|
|
81
|
+
* }
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
var InvalidErrorCode = class extends TypeError {
|
|
86
|
+
/** Código de erro inválido que provocou a exceção. */
|
|
87
|
+
code;
|
|
88
|
+
/**
|
|
89
|
+
* Cria o erro de código inválido.
|
|
90
|
+
*
|
|
91
|
+
* @param code - Código de erro que não está em UPPER_SNAKE_CASE.
|
|
92
|
+
* @param options - Opções padrão de `Error` como `cause`.
|
|
93
|
+
*/
|
|
94
|
+
constructor(code, options) {
|
|
95
|
+
super(invalidCodeMessage(code), options);
|
|
96
|
+
this.name = new.target.name;
|
|
97
|
+
this.code = code;
|
|
98
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
99
|
+
if (Error.captureStackTrace) Error.captureStackTrace(this, new.target);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
//#endregion
|
|
103
|
+
//#region src/errors/either-unwrap-error.ts
|
|
104
|
+
/**
|
|
105
|
+
* Erro lançado quando `unwrap()` é chamado em um `Err` ou `unwrapErr()` é
|
|
106
|
+
* chamado em um `Ok`, ou seja, quando se tenta extrair de um {@link Either}
|
|
107
|
+
* o valor da variante que ele não possui.
|
|
108
|
+
*
|
|
109
|
+
* O valor contido na variante realmente presente é anexado como `cause`
|
|
110
|
+
* (o valor de erro em `unwrap()` num `Err`; o valor de sucesso em
|
|
111
|
+
* `unwrapErr()` num `Ok`). Esse valor pode ser de qualquer tipo, não
|
|
112
|
+
* necessariamente um `Error`.
|
|
113
|
+
*
|
|
114
|
+
* O `name` do erro é o nome da classe concreta (`new.target.name`) e o
|
|
115
|
+
* protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em
|
|
116
|
+
* subclasses e em alvos de compilação antigos.
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```ts
|
|
120
|
+
* try {
|
|
121
|
+
* err<number, string>("falhou").unwrap();
|
|
122
|
+
* } catch (error) {
|
|
123
|
+
* if (error instanceof EitherUnwrapError) {
|
|
124
|
+
* error.message; // "Chamado unwrap() em Err."
|
|
125
|
+
* error.cause; // "falhou"
|
|
126
|
+
* }
|
|
127
|
+
* }
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
var EitherUnwrapError = class extends Error {
|
|
131
|
+
/**
|
|
132
|
+
* Cria o erro de extração inválida de um `Either`.
|
|
133
|
+
*
|
|
134
|
+
* @param message - Mensagem do erro. Por padrão, uma mensagem genérica
|
|
135
|
+
* ("Chamado unwrap() ou unwrapErr() em resultado incompatível.").
|
|
136
|
+
* @param options - Opções padrão de `Error` como `cause` que normalmente
|
|
137
|
+
* carrega o valor contido no `Either`.
|
|
138
|
+
*/
|
|
139
|
+
constructor(message = "Chamado unwrap() ou unwrapErr() em resultado incompatível.", options) {
|
|
140
|
+
super(message, options);
|
|
141
|
+
this.name = new.target.name;
|
|
142
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
143
|
+
if (Error.captureStackTrace) Error.captureStackTrace(this, new.target);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
//#endregion
|
|
147
|
+
export { isUpperSnakeCase as a, invalidCodeMessage as i, InvalidErrorCode as n, UPPER_SNAKE_CASE as r, EitherUnwrapError as t };
|
|
148
|
+
|
|
149
|
+
//# sourceMappingURL=errors-DrDL51y9.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-DrDL51y9.mjs","names":[],"sources":["../src/upper-snake-case.ts","../src/errors/invalid-error-code.ts","../src/errors/either-unwrap-error.ts"],"sourcesContent":["import type {\n\tInvalidCodeMessage,\n\tIsUpperSnakeCase,\n} from \"./types/validate-error-definitions.js\";\n\n/**\n * Expressão regular que valida códigos em UPPER_SNAKE_CASE em tempo de\n * execução.\n *\n * Regras (espelham o tipo {@link IsUpperSnakeCase}):\n * - deve começar com uma letra maiúscula (`A-Z`);\n * - pode conter letras maiúsculas, dígitos e `_`;\n * - `_` só pode aparecer entre caracteres alfanuméricos, ou seja, não pode\n * estar no início nem no fim e não pode ser repetido em sequência.\n */\nexport const UPPER_SNAKE_CASE = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\n\n/**\n * Verifica em tempo de execução, se uma string está em UPPER_SNAKE_CASE.\n *\n * É o equivalente em runtime do tipo {@link IsUpperSnakeCase}, usando a\n * expressão regular {@link UPPER_SNAKE_CASE}.\n *\n * @param value - String a ser verificada.\n * @returns `true` se `value` estiver em UPPER_SNAKE_CASE; caso contrário,\n * `false`.\n *\n * @example\n * ```ts\n * isUpperSnakeCase(\"USER_NOT_FOUND\"); // true\n * isUpperSnakeCase(\"ERROR_404\"); // true\n * isUpperSnakeCase(\"userNotFound\"); // false\n * isUpperSnakeCase(\"_USER\"); // false\n * isUpperSnakeCase(\"USER__NOT\"); // false\n * isUpperSnakeCase(\"1ERROR\"); // false\n * ```\n */\nexport function isUpperSnakeCase(value: string) {\n\treturn UPPER_SNAKE_CASE.test(value);\n}\n\n/**\n * Monta a mensagem de erro exibida quando um código não está em\n * UPPER_SNAKE_CASE.\n *\n * O retorno é tipado como {@link InvalidCodeMessage}, de modo que o texto em\n * runtime corresponde exatamente ao tipo literal usado na validação em tempo\n * de compilação.\n *\n * @template Code - Tipo literal do código inválido.\n * @param code - Código de erro inválido a ser incluído na mensagem.\n * @returns Mensagem descrevendo o código inválido e o formato esperado.\n *\n * @example\n * ```ts\n * invalidCodeMessage(\"userNotFound\");\n * // 'Código de erro inválido \"userNotFound\". Os códigos de erro devem usar UPPER_SNAKE_CASE.'\n * ```\n */\nexport function invalidCodeMessage<Code extends string>(\n\tcode: Code,\n): InvalidCodeMessage<Code> {\n\treturn `Código de erro inválido \"${code}\". Os códigos de erro devem usar UPPER_SNAKE_CASE.`;\n}\n","import { invalidCodeMessage } from \"#/upper-snake-case.js\";\r\n\r\n/**\r\n * Erro lançado quando um código de erro não está em UPPER_SNAKE_CASE.\r\n *\r\n * Estende `TypeError` pois indica um valor de tipo ou formato inadequado.\r\n * É lançado em tempo de execução por `defineErrorCatalog` complementando a\r\n * validação feita em tempo de compilação por `ValidateErrorDefinitions`.\r\n *\r\n * A mensagem é gerada por {@link invalidCodeMessage} e o código inválido fica\r\n * disponível na propriedade `code`.\r\n *\r\n * O `name` do erro é o nome da classe concreta (`new.target.name`) e o\r\n * protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em\r\n * subclasses e em alvos de compilação antigos.\r\n *\r\n * @example\r\n * ```ts\r\n * try {\r\n * defineErrorCatalog({ userNotFound: \"Usuário não encontrado\" });\r\n * } catch (error) {\r\n * if (error instanceof InvalidErrorCode) {\r\n * error.code; // \"userNotFound\"\r\n * error.message; // 'Código de erro inválido \"userNotFound\". Os códigos de erro devem usar UPPER_SNAKE_CASE.'\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class InvalidErrorCode extends TypeError {\r\n /** Código de erro inválido que provocou a exceção. */\r\n public readonly code: string;\r\n\r\n /**\r\n * Cria o erro de código inválido.\r\n *\r\n * @param code - Código de erro que não está em UPPER_SNAKE_CASE.\r\n * @param options - Opções padrão de `Error` como `cause`.\r\n */\r\n public constructor(code: string, options?: ErrorOptions) {\r\n super(invalidCodeMessage(code), options);\r\n\r\n this.name = new.target.name;\r\n this.code = code;\r\n\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, new.target);\r\n }\r\n }\r\n}\r\n","import { Either } from \"#/either.js\";\r\n\r\n/**\r\n * Erro lançado quando `unwrap()` é chamado em um `Err` ou `unwrapErr()` é\r\n * chamado em um `Ok`, ou seja, quando se tenta extrair de um {@link Either}\r\n * o valor da variante que ele não possui.\r\n *\r\n * O valor contido na variante realmente presente é anexado como `cause`\r\n * (o valor de erro em `unwrap()` num `Err`; o valor de sucesso em\r\n * `unwrapErr()` num `Ok`). Esse valor pode ser de qualquer tipo, não\r\n * necessariamente um `Error`.\r\n *\r\n * O `name` do erro é o nome da classe concreta (`new.target.name`) e o\r\n * protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em\r\n * subclasses e em alvos de compilação antigos.\r\n *\r\n * @example\r\n * ```ts\r\n * try {\r\n * err<number, string>(\"falhou\").unwrap();\r\n * } catch (error) {\r\n * if (error instanceof EitherUnwrapError) {\r\n * error.message; // \"Chamado unwrap() em Err.\"\r\n * error.cause; // \"falhou\"\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class EitherUnwrapError extends Error {\r\n /**\r\n * Cria o erro de extração inválida de um `Either`.\r\n *\r\n * @param message - Mensagem do erro. Por padrão, uma mensagem genérica\r\n * (\"Chamado unwrap() ou unwrapErr() em resultado incompatível.\").\r\n * @param options - Opções padrão de `Error` como `cause` que normalmente\r\n * carrega o valor contido no `Either`.\r\n */\r\n public constructor(\r\n message = \"Chamado unwrap() ou unwrapErr() em resultado incompatível.\",\r\n options?: ErrorOptions,\r\n ) {\r\n super(message, options);\r\n\r\n this.name = new.target.name;\r\n\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, new.target);\r\n }\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;AAeA,MAAa,mBAAmB;;;;;;;;;;;;;;;;;;;;;AAsBhC,SAAgB,iBAAiB,OAAe;CAC/C,OAAO,iBAAiB,KAAK,KAAK;AACnC;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,mBACf,MAC2B;CAC3B,OAAO,4BAA4B,KAAK;AACzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnCA,IAAa,mBAAb,cAAsC,UAAU;;CAE9C;;;;;;;CAQA,YAAmB,MAAc,SAAwB;EACvD,MAAM,mBAAmB,IAAI,GAAG,OAAO;EAEvC,KAAK,OAAO,WAAW;EACvB,KAAK,OAAO;EAEZ,OAAO,eAAe,MAAM,WAAW,SAAS;EAEhD,IAAI,MAAM,mBACR,MAAM,kBAAkB,MAAM,UAAU;CAE5C;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtBA,IAAa,oBAAb,cAAuC,MAAM;;;;;;;;;CAS3C,YACE,UAAU,8DACV,SACA;EACA,MAAM,SAAS,OAAO;EAEtB,KAAK,OAAO,WAAW;EAEvB,OAAO,eAAe,MAAM,WAAW,SAAS;EAEhD,IAAI,MAAM,mBACR,MAAM,kBAAkB,MAAM,UAAU;CAE5C;AACF"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
//#region src/upper-snake-case.ts
|
|
2
|
+
/**
|
|
3
|
+
* Expressão regular que valida códigos em UPPER_SNAKE_CASE em tempo de
|
|
4
|
+
* execução.
|
|
5
|
+
*
|
|
6
|
+
* Regras (espelham o tipo {@link IsUpperSnakeCase}):
|
|
7
|
+
* - deve começar com uma letra maiúscula (`A-Z`);
|
|
8
|
+
* - pode conter letras maiúsculas, dígitos e `_`;
|
|
9
|
+
* - `_` só pode aparecer entre caracteres alfanuméricos, ou seja, não pode
|
|
10
|
+
* estar no início nem no fim e não pode ser repetido em sequência.
|
|
11
|
+
*/
|
|
12
|
+
const UPPER_SNAKE_CASE = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;
|
|
13
|
+
/**
|
|
14
|
+
* Verifica em tempo de execução, se uma string está em UPPER_SNAKE_CASE.
|
|
15
|
+
*
|
|
16
|
+
* É o equivalente em runtime do tipo {@link IsUpperSnakeCase}, usando a
|
|
17
|
+
* expressão regular {@link UPPER_SNAKE_CASE}.
|
|
18
|
+
*
|
|
19
|
+
* @param value - String a ser verificada.
|
|
20
|
+
* @returns `true` se `value` estiver em UPPER_SNAKE_CASE; caso contrário,
|
|
21
|
+
* `false`.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* isUpperSnakeCase("USER_NOT_FOUND"); // true
|
|
26
|
+
* isUpperSnakeCase("ERROR_404"); // true
|
|
27
|
+
* isUpperSnakeCase("userNotFound"); // false
|
|
28
|
+
* isUpperSnakeCase("_USER"); // false
|
|
29
|
+
* isUpperSnakeCase("USER__NOT"); // false
|
|
30
|
+
* isUpperSnakeCase("1ERROR"); // false
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
function isUpperSnakeCase(value) {
|
|
34
|
+
return UPPER_SNAKE_CASE.test(value);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Monta a mensagem de erro exibida quando um código não está em
|
|
38
|
+
* UPPER_SNAKE_CASE.
|
|
39
|
+
*
|
|
40
|
+
* O retorno é tipado como {@link InvalidCodeMessage}, de modo que o texto em
|
|
41
|
+
* runtime corresponde exatamente ao tipo literal usado na validação em tempo
|
|
42
|
+
* de compilação.
|
|
43
|
+
*
|
|
44
|
+
* @template Code - Tipo literal do código inválido.
|
|
45
|
+
* @param code - Código de erro inválido a ser incluído na mensagem.
|
|
46
|
+
* @returns Mensagem descrevendo o código inválido e o formato esperado.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* invalidCodeMessage("userNotFound");
|
|
51
|
+
* // 'Código de erro inválido "userNotFound". Os códigos de erro devem usar UPPER_SNAKE_CASE.'
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
function invalidCodeMessage(code) {
|
|
55
|
+
return `Código de erro inválido "${code}". Os códigos de erro devem usar UPPER_SNAKE_CASE.`;
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/errors/invalid-error-code.ts
|
|
59
|
+
/**
|
|
60
|
+
* Erro lançado quando um código de erro não está em UPPER_SNAKE_CASE.
|
|
61
|
+
*
|
|
62
|
+
* Estende `TypeError` pois indica um valor de tipo ou formato inadequado.
|
|
63
|
+
* É lançado em tempo de execução por `defineErrorCatalog` complementando a
|
|
64
|
+
* validação feita em tempo de compilação por `ValidateErrorDefinitions`.
|
|
65
|
+
*
|
|
66
|
+
* A mensagem é gerada por {@link invalidCodeMessage} e o código inválido fica
|
|
67
|
+
* disponível na propriedade `code`.
|
|
68
|
+
*
|
|
69
|
+
* O `name` do erro é o nome da classe concreta (`new.target.name`) e o
|
|
70
|
+
* protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em
|
|
71
|
+
* subclasses e em alvos de compilação antigos.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* try {
|
|
76
|
+
* defineErrorCatalog({ userNotFound: "Usuário não encontrado" });
|
|
77
|
+
* } catch (error) {
|
|
78
|
+
* if (error instanceof InvalidErrorCode) {
|
|
79
|
+
* error.code; // "userNotFound"
|
|
80
|
+
* error.message; // 'Código de erro inválido "userNotFound". Os códigos de erro devem usar UPPER_SNAKE_CASE.'
|
|
81
|
+
* }
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
var InvalidErrorCode = class extends TypeError {
|
|
86
|
+
/** Código de erro inválido que provocou a exceção. */
|
|
87
|
+
code;
|
|
88
|
+
/**
|
|
89
|
+
* Cria o erro de código inválido.
|
|
90
|
+
*
|
|
91
|
+
* @param code - Código de erro que não está em UPPER_SNAKE_CASE.
|
|
92
|
+
* @param options - Opções padrão de `Error` como `cause`.
|
|
93
|
+
*/
|
|
94
|
+
constructor(code, options) {
|
|
95
|
+
super(invalidCodeMessage(code), options);
|
|
96
|
+
this.name = new.target.name;
|
|
97
|
+
this.code = code;
|
|
98
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
99
|
+
if (Error.captureStackTrace) Error.captureStackTrace(this, new.target);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
//#endregion
|
|
103
|
+
//#region src/errors/either-unwrap-error.ts
|
|
104
|
+
/**
|
|
105
|
+
* Erro lançado quando `unwrap()` é chamado em um `Err` ou `unwrapErr()` é
|
|
106
|
+
* chamado em um `Ok`, ou seja, quando se tenta extrair de um {@link Either}
|
|
107
|
+
* o valor da variante que ele não possui.
|
|
108
|
+
*
|
|
109
|
+
* O valor contido na variante realmente presente é anexado como `cause`
|
|
110
|
+
* (o valor de erro em `unwrap()` num `Err`; o valor de sucesso em
|
|
111
|
+
* `unwrapErr()` num `Ok`). Esse valor pode ser de qualquer tipo, não
|
|
112
|
+
* necessariamente um `Error`.
|
|
113
|
+
*
|
|
114
|
+
* O `name` do erro é o nome da classe concreta (`new.target.name`) e o
|
|
115
|
+
* protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em
|
|
116
|
+
* subclasses e em alvos de compilação antigos.
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```ts
|
|
120
|
+
* try {
|
|
121
|
+
* err<number, string>("falhou").unwrap();
|
|
122
|
+
* } catch (error) {
|
|
123
|
+
* if (error instanceof EitherUnwrapError) {
|
|
124
|
+
* error.message; // "Chamado unwrap() em Err."
|
|
125
|
+
* error.cause; // "falhou"
|
|
126
|
+
* }
|
|
127
|
+
* }
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
var EitherUnwrapError = class extends Error {
|
|
131
|
+
/**
|
|
132
|
+
* Cria o erro de extração inválida de um `Either`.
|
|
133
|
+
*
|
|
134
|
+
* @param message - Mensagem do erro. Por padrão, uma mensagem genérica
|
|
135
|
+
* ("Chamado unwrap() ou unwrapErr() em resultado incompatível.").
|
|
136
|
+
* @param options - Opções padrão de `Error` como `cause` que normalmente
|
|
137
|
+
* carrega o valor contido no `Either`.
|
|
138
|
+
*/
|
|
139
|
+
constructor(message = "Chamado unwrap() ou unwrapErr() em resultado incompatível.", options) {
|
|
140
|
+
super(message, options);
|
|
141
|
+
this.name = new.target.name;
|
|
142
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
143
|
+
if (Error.captureStackTrace) Error.captureStackTrace(this, new.target);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
//#endregion
|
|
147
|
+
Object.defineProperty(exports, "EitherUnwrapError", {
|
|
148
|
+
enumerable: true,
|
|
149
|
+
get: function() {
|
|
150
|
+
return EitherUnwrapError;
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
Object.defineProperty(exports, "InvalidErrorCode", {
|
|
154
|
+
enumerable: true,
|
|
155
|
+
get: function() {
|
|
156
|
+
return InvalidErrorCode;
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
Object.defineProperty(exports, "UPPER_SNAKE_CASE", {
|
|
160
|
+
enumerable: true,
|
|
161
|
+
get: function() {
|
|
162
|
+
return UPPER_SNAKE_CASE;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
Object.defineProperty(exports, "invalidCodeMessage", {
|
|
166
|
+
enumerable: true,
|
|
167
|
+
get: function() {
|
|
168
|
+
return invalidCodeMessage;
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
Object.defineProperty(exports, "isUpperSnakeCase", {
|
|
172
|
+
enumerable: true,
|
|
173
|
+
get: function() {
|
|
174
|
+
return isUpperSnakeCase;
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
//# sourceMappingURL=errors-TgPe2YUV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-TgPe2YUV.cjs","names":[],"sources":["../src/upper-snake-case.ts","../src/errors/invalid-error-code.ts","../src/errors/either-unwrap-error.ts"],"sourcesContent":["import type {\n\tInvalidCodeMessage,\n\tIsUpperSnakeCase,\n} from \"./types/validate-error-definitions.js\";\n\n/**\n * Expressão regular que valida códigos em UPPER_SNAKE_CASE em tempo de\n * execução.\n *\n * Regras (espelham o tipo {@link IsUpperSnakeCase}):\n * - deve começar com uma letra maiúscula (`A-Z`);\n * - pode conter letras maiúsculas, dígitos e `_`;\n * - `_` só pode aparecer entre caracteres alfanuméricos, ou seja, não pode\n * estar no início nem no fim e não pode ser repetido em sequência.\n */\nexport const UPPER_SNAKE_CASE = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\n\n/**\n * Verifica em tempo de execução, se uma string está em UPPER_SNAKE_CASE.\n *\n * É o equivalente em runtime do tipo {@link IsUpperSnakeCase}, usando a\n * expressão regular {@link UPPER_SNAKE_CASE}.\n *\n * @param value - String a ser verificada.\n * @returns `true` se `value` estiver em UPPER_SNAKE_CASE; caso contrário,\n * `false`.\n *\n * @example\n * ```ts\n * isUpperSnakeCase(\"USER_NOT_FOUND\"); // true\n * isUpperSnakeCase(\"ERROR_404\"); // true\n * isUpperSnakeCase(\"userNotFound\"); // false\n * isUpperSnakeCase(\"_USER\"); // false\n * isUpperSnakeCase(\"USER__NOT\"); // false\n * isUpperSnakeCase(\"1ERROR\"); // false\n * ```\n */\nexport function isUpperSnakeCase(value: string) {\n\treturn UPPER_SNAKE_CASE.test(value);\n}\n\n/**\n * Monta a mensagem de erro exibida quando um código não está em\n * UPPER_SNAKE_CASE.\n *\n * O retorno é tipado como {@link InvalidCodeMessage}, de modo que o texto em\n * runtime corresponde exatamente ao tipo literal usado na validação em tempo\n * de compilação.\n *\n * @template Code - Tipo literal do código inválido.\n * @param code - Código de erro inválido a ser incluído na mensagem.\n * @returns Mensagem descrevendo o código inválido e o formato esperado.\n *\n * @example\n * ```ts\n * invalidCodeMessage(\"userNotFound\");\n * // 'Código de erro inválido \"userNotFound\". Os códigos de erro devem usar UPPER_SNAKE_CASE.'\n * ```\n */\nexport function invalidCodeMessage<Code extends string>(\n\tcode: Code,\n): InvalidCodeMessage<Code> {\n\treturn `Código de erro inválido \"${code}\". Os códigos de erro devem usar UPPER_SNAKE_CASE.`;\n}\n","import { invalidCodeMessage } from \"#/upper-snake-case.js\";\r\n\r\n/**\r\n * Erro lançado quando um código de erro não está em UPPER_SNAKE_CASE.\r\n *\r\n * Estende `TypeError` pois indica um valor de tipo ou formato inadequado.\r\n * É lançado em tempo de execução por `defineErrorCatalog` complementando a\r\n * validação feita em tempo de compilação por `ValidateErrorDefinitions`.\r\n *\r\n * A mensagem é gerada por {@link invalidCodeMessage} e o código inválido fica\r\n * disponível na propriedade `code`.\r\n *\r\n * O `name` do erro é o nome da classe concreta (`new.target.name`) e o\r\n * protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em\r\n * subclasses e em alvos de compilação antigos.\r\n *\r\n * @example\r\n * ```ts\r\n * try {\r\n * defineErrorCatalog({ userNotFound: \"Usuário não encontrado\" });\r\n * } catch (error) {\r\n * if (error instanceof InvalidErrorCode) {\r\n * error.code; // \"userNotFound\"\r\n * error.message; // 'Código de erro inválido \"userNotFound\". Os códigos de erro devem usar UPPER_SNAKE_CASE.'\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class InvalidErrorCode extends TypeError {\r\n /** Código de erro inválido que provocou a exceção. */\r\n public readonly code: string;\r\n\r\n /**\r\n * Cria o erro de código inválido.\r\n *\r\n * @param code - Código de erro que não está em UPPER_SNAKE_CASE.\r\n * @param options - Opções padrão de `Error` como `cause`.\r\n */\r\n public constructor(code: string, options?: ErrorOptions) {\r\n super(invalidCodeMessage(code), options);\r\n\r\n this.name = new.target.name;\r\n this.code = code;\r\n\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, new.target);\r\n }\r\n }\r\n}\r\n","import { Either } from \"#/either.js\";\r\n\r\n/**\r\n * Erro lançado quando `unwrap()` é chamado em um `Err` ou `unwrapErr()` é\r\n * chamado em um `Ok`, ou seja, quando se tenta extrair de um {@link Either}\r\n * o valor da variante que ele não possui.\r\n *\r\n * O valor contido na variante realmente presente é anexado como `cause`\r\n * (o valor de erro em `unwrap()` num `Err`; o valor de sucesso em\r\n * `unwrapErr()` num `Ok`). Esse valor pode ser de qualquer tipo, não\r\n * necessariamente um `Error`.\r\n *\r\n * O `name` do erro é o nome da classe concreta (`new.target.name`) e o\r\n * protótipo é ajustado explicitamente para que `instanceof` funcione mesmo em\r\n * subclasses e em alvos de compilação antigos.\r\n *\r\n * @example\r\n * ```ts\r\n * try {\r\n * err<number, string>(\"falhou\").unwrap();\r\n * } catch (error) {\r\n * if (error instanceof EitherUnwrapError) {\r\n * error.message; // \"Chamado unwrap() em Err.\"\r\n * error.cause; // \"falhou\"\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class EitherUnwrapError extends Error {\r\n /**\r\n * Cria o erro de extração inválida de um `Either`.\r\n *\r\n * @param message - Mensagem do erro. Por padrão, uma mensagem genérica\r\n * (\"Chamado unwrap() ou unwrapErr() em resultado incompatível.\").\r\n * @param options - Opções padrão de `Error` como `cause` que normalmente\r\n * carrega o valor contido no `Either`.\r\n */\r\n public constructor(\r\n message = \"Chamado unwrap() ou unwrapErr() em resultado incompatível.\",\r\n options?: ErrorOptions,\r\n ) {\r\n super(message, options);\r\n\r\n this.name = new.target.name;\r\n\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, new.target);\r\n }\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;AAeA,MAAa,mBAAmB;;;;;;;;;;;;;;;;;;;;;AAsBhC,SAAgB,iBAAiB,OAAe;CAC/C,OAAO,iBAAiB,KAAK,KAAK;AACnC;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,mBACf,MAC2B;CAC3B,OAAO,4BAA4B,KAAK;AACzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnCA,IAAa,mBAAb,cAAsC,UAAU;;CAE9C;;;;;;;CAQA,YAAmB,MAAc,SAAwB;EACvD,MAAM,mBAAmB,IAAI,GAAG,OAAO;EAEvC,KAAK,OAAO,WAAW;EACvB,KAAK,OAAO;EAEZ,OAAO,eAAe,MAAM,WAAW,SAAS;EAEhD,IAAI,MAAM,mBACR,MAAM,kBAAkB,MAAM,UAAU;CAE5C;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtBA,IAAa,oBAAb,cAAuC,MAAM;;;;;;;;;CAS3C,YACE,UAAU,8DACV,SACA;EACA,MAAM,SAAS,OAAO;EAEtB,KAAK,OAAO,WAAW;EAEvB,OAAO,eAAe,MAAM,WAAW,SAAS;EAEhD,IAAI,MAAM,mBACR,MAAM,kBAAkB,MAAM,UAAU;CAE5C;AACF"}
|