@jmlq/auth 0.0.1-alpha.33 → 0.0.1-alpha.35

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.
@@ -12,7 +12,11 @@ class VerifyEmailUseCase {
12
12
  const token = String(request.token ?? "").trim();
13
13
  if (!token) {
14
14
  // Conservador: si prefieres un error de dominio, puedes crear uno específico.
15
- throw new Error("Email verification token is required");
15
+ if (!token) {
16
+ throw new errors_1.InvalidInputError("Email verification token is required", {
17
+ field: "token",
18
+ });
19
+ }
16
20
  }
17
21
  const consumed = await this.emailVerificationToken.consume(token);
18
22
  const user = await this.userRepository.findById(new object_values_1.Id(consumed.userId.getValue()));
@@ -9,4 +9,8 @@
9
9
  * - Mantén este catálogo pequeño y estable.
10
10
  * - Si agregas un error nuevo, agrega aquí su código.
11
11
  */
12
- export type AuthErrorCode = "TOKEN_INVALID" | "TOKEN_EXPIRED" | "TOKEN_MALFORMED" | "SIGNATURE_INVALID" | "AUTHENTICATION_FAILED" | "JWT_ERROR" | "KEY_MISMATCH" | "KEY_NOT_FOUND" | "KEY_MISMATCH" | "CLAIMS_VALIDATION_ERROR" | "JWT_PAYLOAD_INVALID" | "TOKEN_NOT_YET_VALID" | "JWT_EMPTY" | "JWT_MALFORMED" | "ALGORITHM_UNSUPPORTED" | "KEY_MISMATCH" | "KEY_NOT_FOUND" | "INVALID_EMAIL" | "INVALID_HASHED_PASSWORD" | "PASSWORD_POLICY_VIOLATION" | "PASSWORD_MISMATCH" | "USER_NOT_FOUND" | "USER_DISABLED" | "EMAIL_ALREADY_IN_USE" | "INVALID_PERMISSION" | "INVALID_ROLE" | "INVALID_ID" | "LOGOUT_FAILED" | "EMAIL_NOT_VERIFIED" | "PASSWORD_RESET_TOKEN_INVALID" | "PASSWORD_RESET_TOKEN_EXPIRED" | "PASSWORD_RESET_TOKEN_ALREADY_USED";
12
+ /**
13
+ * ÚNICA fuente de verdad de los códigos.
14
+ */
15
+ export declare const AUTH_ERROR_CODES: readonly ["TOKEN_INVALID", "TOKEN_EXPIRED", "TOKEN_MALFORMED", "SIGNATURE_INVALID", "AUTHENTICATION_FAILED", "JWT_ERROR", "KEY_MISMATCH", "KEY_NOT_FOUND", "KEY_MISMATCH", "CLAIMS_VALIDATION_ERROR", "JWT_PAYLOAD_INVALID", "TOKEN_NOT_YET_VALID", "JWT_EMPTY", "JWT_MALFORMED", "ALGORITHM_UNSUPPORTED", "KEY_MISMATCH", "KEY_NOT_FOUND", "INVALID_EMAIL", "INVALID_HASHED_PASSWORD", "PASSWORD_POLICY_VIOLATION", "PASSWORD_MISMATCH", "USER_NOT_FOUND", "USER_DISABLED", "EMAIL_ALREADY_IN_USE", "INVALID_PERMISSION", "INVALID_ROLE", "INVALID_ID", "LOGOUT_FAILED", "EMAIL_NOT_VERIFIED", "PASSWORD_RESET_TOKEN_INVALID", "PASSWORD_RESET_TOKEN_EXPIRED", "PASSWORD_RESET_TOKEN_ALREADY_USED", "EMAIL_VERIFICATION_TOKEN_INVALID", "EMAIL_VERIFICATION_TOKEN_EXPIRED", "EMAIL_VERIFICATION_TOKEN_ALREADY_USED", "INVALID_INPUT"];
16
+ export type AuthErrorCode = (typeof AUTH_ERROR_CODES)[number];
@@ -1,2 +1,60 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AUTH_ERROR_CODES = void 0;
4
+ /**
5
+ * Códigos canónicos de error del dominio de Auth.
6
+ *
7
+ * Objetivo:
8
+ * - Host / plugins NO deben depender de `error.name` o `message`.
9
+ * - Solo deben mapear por `code`.
10
+ *
11
+ * Nota:
12
+ * - Mantén este catálogo pequeño y estable.
13
+ * - Si agregas un error nuevo, agrega aquí su código.
14
+ */
15
+ /**
16
+ * ÚNICA fuente de verdad de los códigos.
17
+ */
18
+ exports.AUTH_ERROR_CODES = [
19
+ // JWT / sesión
20
+ "TOKEN_INVALID",
21
+ "TOKEN_EXPIRED",
22
+ "TOKEN_MALFORMED", // formato invalido (no header.payload.signature),
23
+ "SIGNATURE_INVALID",
24
+ "AUTHENTICATION_FAILED", // catch-all de autenticación,
25
+ "JWT_ERROR",
26
+ "KEY_MISMATCH",
27
+ "KEY_NOT_FOUND",
28
+ "KEY_MISMATCH",
29
+ "CLAIMS_VALIDATION_ERROR",
30
+ "JWT_PAYLOAD_INVALID",
31
+ "TOKEN_NOT_YET_VALID",
32
+ "JWT_EMPTY",
33
+ "JWT_MALFORMED",
34
+ // Refresh Token
35
+ "ALGORITHM_UNSUPPORTED",
36
+ "KEY_MISMATCH",
37
+ "KEY_NOT_FOUND",
38
+ // Identidad / login
39
+ "INVALID_EMAIL",
40
+ "INVALID_HASHED_PASSWORD",
41
+ "PASSWORD_POLICY_VIOLATION",
42
+ "PASSWORD_MISMATCH",
43
+ "USER_NOT_FOUND",
44
+ "USER_DISABLED",
45
+ "EMAIL_ALREADY_IN_USE",
46
+ "INVALID_PERMISSION",
47
+ "INVALID_ROLE",
48
+ "INVALID_ID",
49
+ "LOGOUT_FAILED",
50
+ "EMAIL_NOT_VERIFIED",
51
+ // Password reset
52
+ "PASSWORD_RESET_TOKEN_INVALID",
53
+ "PASSWORD_RESET_TOKEN_EXPIRED",
54
+ "PASSWORD_RESET_TOKEN_ALREADY_USED",
55
+ "EMAIL_VERIFICATION_TOKEN_INVALID",
56
+ "EMAIL_VERIFICATION_TOKEN_EXPIRED",
57
+ "EMAIL_VERIFICATION_TOKEN_ALREADY_USED",
58
+ //General
59
+ "INVALID_INPUT",
60
+ ];
@@ -3,6 +3,7 @@ export interface ClaimsIssue {
3
3
  path: string;
4
4
  message: string;
5
5
  }
6
+ export declare function isAuthErrorCode(value: unknown): value is AuthErrorCode;
6
7
  export declare abstract class AuthDomainError extends Error {
7
8
  readonly code: AuthErrorCode;
8
9
  readonly details?: unknown;
@@ -10,7 +11,7 @@ export declare abstract class AuthDomainError extends Error {
10
11
  toJSON(): {
11
12
  name: string;
12
13
  message: string;
13
- code: AuthErrorCode;
14
+ code: "TOKEN_INVALID" | "TOKEN_EXPIRED" | "TOKEN_MALFORMED" | "SIGNATURE_INVALID" | "AUTHENTICATION_FAILED" | "JWT_ERROR" | "KEY_MISMATCH" | "KEY_NOT_FOUND" | "CLAIMS_VALIDATION_ERROR" | "JWT_PAYLOAD_INVALID" | "TOKEN_NOT_YET_VALID" | "JWT_EMPTY" | "JWT_MALFORMED" | "ALGORITHM_UNSUPPORTED" | "INVALID_EMAIL" | "INVALID_HASHED_PASSWORD" | "PASSWORD_POLICY_VIOLATION" | "PASSWORD_MISMATCH" | "USER_NOT_FOUND" | "USER_DISABLED" | "EMAIL_ALREADY_IN_USE" | "INVALID_PERMISSION" | "INVALID_ROLE" | "INVALID_ID" | "LOGOUT_FAILED" | "EMAIL_NOT_VERIFIED" | "PASSWORD_RESET_TOKEN_INVALID" | "PASSWORD_RESET_TOKEN_EXPIRED" | "PASSWORD_RESET_TOKEN_ALREADY_USED" | "EMAIL_VERIFICATION_TOKEN_INVALID" | "EMAIL_VERIFICATION_TOKEN_EXPIRED" | "EMAIL_VERIFICATION_TOKEN_ALREADY_USED" | "INVALID_INPUT";
14
15
  details: unknown;
15
16
  };
16
17
  /**
@@ -52,3 +53,12 @@ export declare class SessionAuthError extends AuthDomainError {
52
53
  export declare class EmailNotVerifiedError extends AuthDomainError {
53
54
  constructor(message?: string, details?: unknown);
54
55
  }
56
+ export declare class EmailVerificationTokenAlreadyUsedError extends AuthDomainError {
57
+ constructor(message?: string, details?: unknown);
58
+ }
59
+ export declare class EmailVerificationTokenInvalidError extends AuthDomainError {
60
+ constructor(message?: string, details?: unknown);
61
+ }
62
+ export declare class EmailVerificationTokenExpiredError extends AuthDomainError {
63
+ constructor(message?: string, details?: unknown);
64
+ }
@@ -1,11 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EmailNotVerifiedError = exports.SessionAuthError = exports.AuthenticationError = exports.InvalidSignatureError = exports.InvalidTokenFormatError = exports.TokenExpiredError = exports.AuthDomainError = void 0;
3
+ exports.EmailVerificationTokenExpiredError = exports.EmailVerificationTokenInvalidError = exports.EmailVerificationTokenAlreadyUsedError = exports.EmailNotVerifiedError = exports.SessionAuthError = exports.AuthenticationError = exports.InvalidSignatureError = exports.InvalidTokenFormatError = exports.TokenExpiredError = exports.AuthDomainError = void 0;
4
+ exports.isAuthErrorCode = isAuthErrorCode;
5
+ const auth_error_code_1 = require("./auth-error-code");
4
6
  function asAuthErrorLike(value) {
5
7
  if (value && typeof value === "object")
6
8
  return value;
7
9
  return {};
8
10
  }
11
+ const AUTH_ERROR_CODE_SET = new Set(auth_error_code_1.AUTH_ERROR_CODES);
12
+ function isAuthErrorCode(value) {
13
+ return typeof value === "string" && AUTH_ERROR_CODE_SET.has(value);
14
+ }
9
15
  class AuthDomainError extends Error {
10
16
  constructor(message, code, details) {
11
17
  super(message);
@@ -42,7 +48,8 @@ class AuthDomainError extends Error {
42
48
  if (e instanceof AuthDomainError)
43
49
  return true;
44
50
  const like = asAuthErrorLike(e);
45
- return typeof like.code === "string" && typeof like.message === "string";
51
+ // Exigir que code sea uno de los canónicos del core
52
+ return isAuthErrorCode(like.code);
46
53
  }
47
54
  }
48
55
  exports.AuthDomainError = AuthDomainError;
@@ -86,3 +93,21 @@ class EmailNotVerifiedError extends AuthDomainError {
86
93
  }
87
94
  }
88
95
  exports.EmailNotVerifiedError = EmailNotVerifiedError;
96
+ class EmailVerificationTokenAlreadyUsedError extends AuthDomainError {
97
+ constructor(message = "Email verification token already used", details) {
98
+ super(message, "EMAIL_VERIFICATION_TOKEN_ALREADY_USED", details);
99
+ }
100
+ }
101
+ exports.EmailVerificationTokenAlreadyUsedError = EmailVerificationTokenAlreadyUsedError;
102
+ class EmailVerificationTokenInvalidError extends AuthDomainError {
103
+ constructor(message = "Email verification token is invalid", details) {
104
+ super(message, "EMAIL_VERIFICATION_TOKEN_INVALID", details);
105
+ }
106
+ }
107
+ exports.EmailVerificationTokenInvalidError = EmailVerificationTokenInvalidError;
108
+ class EmailVerificationTokenExpiredError extends AuthDomainError {
109
+ constructor(message = "Email verification token has expired", details) {
110
+ super(message, "EMAIL_VERIFICATION_TOKEN_EXPIRED", details);
111
+ }
112
+ }
113
+ exports.EmailVerificationTokenExpiredError = EmailVerificationTokenExpiredError;
@@ -0,0 +1,4 @@
1
+ import { AuthDomainError } from "./auth.errors";
2
+ export declare class InvalidInputError extends AuthDomainError {
3
+ constructor(message?: string, details?: unknown);
4
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InvalidInputError = void 0;
4
+ const auth_errors_1 = require("./auth.errors");
5
+ class InvalidInputError extends auth_errors_1.AuthDomainError {
6
+ constructor(message = "Email verification token is required", details) {
7
+ super(message, "INVALID_INPUT", details);
8
+ }
9
+ }
10
+ exports.InvalidInputError = InvalidInputError;
@@ -4,3 +4,4 @@ export * from "./password-reset.errors";
4
4
  export * from "./jwt-payload.error";
5
5
  export * from "./auth-error-code";
6
6
  export * from "./jwt.errors";
7
+ export * from "./general.errors";
@@ -20,3 +20,4 @@ __exportStar(require("./password-reset.errors"), exports);
20
20
  __exportStar(require("./jwt-payload.error"), exports);
21
21
  __exportStar(require("./auth-error-code"), exports);
22
22
  __exportStar(require("./jwt.errors"), exports);
23
+ __exportStar(require("./general.errors"), exports);
package/dist/index.d.ts CHANGED
@@ -12,7 +12,7 @@ export { normalizeJwtPayload } from "./domain/services";
12
12
  * Aunque ya se exporta vía `export * from "./domain/errors"`,
13
13
  * se expone de forma directa para que el host/plugins lo consuman sin ambigüedad.
14
14
  */
15
- export { InvalidJwtPayloadError, InvalidJwtEmptyError, InvalidJwtMalformedError, } from "./domain/errors";
15
+ export * from "./domain/errors";
16
16
  export * from "./domain/ports";
17
17
  export * from "./domain/entities";
18
18
  export { readNonEmptyString } from "./domain/services/helpers";
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.readNonEmptyString = exports.InvalidJwtMalformedError = exports.InvalidJwtEmptyError = exports.InvalidJwtPayloadError = exports.normalizeJwtPayload = exports.assertJwtStructure = exports.optionalAudience = void 0;
17
+ exports.readNonEmptyString = exports.normalizeJwtPayload = exports.assertJwtStructure = exports.optionalAudience = void 0;
18
18
  var helpers_1 = require("./domain/services/helpers");
19
19
  Object.defineProperty(exports, "optionalAudience", { enumerable: true, get: function () { return helpers_1.optionalAudience; } });
20
20
  Object.defineProperty(exports, "assertJwtStructure", { enumerable: true, get: function () { return helpers_1.assertJwtStructure; } });
@@ -30,10 +30,7 @@ Object.defineProperty(exports, "normalizeJwtPayload", { enumerable: true, get: f
30
30
  * Aunque ya se exporta vía `export * from "./domain/errors"`,
31
31
  * se expone de forma directa para que el host/plugins lo consuman sin ambigüedad.
32
32
  */
33
- var errors_1 = require("./domain/errors");
34
- Object.defineProperty(exports, "InvalidJwtPayloadError", { enumerable: true, get: function () { return errors_1.InvalidJwtPayloadError; } });
35
- Object.defineProperty(exports, "InvalidJwtEmptyError", { enumerable: true, get: function () { return errors_1.InvalidJwtEmptyError; } });
36
- Object.defineProperty(exports, "InvalidJwtMalformedError", { enumerable: true, get: function () { return errors_1.InvalidJwtMalformedError; } });
33
+ __exportStar(require("./domain/errors"), exports);
37
34
  // Contratos (ports) + config
38
35
  __exportStar(require("./domain/ports"), exports);
39
36
  // Entities
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jmlq/auth",
3
3
  "description": "JWT authentication package with clean architecture",
4
- "version": "0.0.1-alpha.33",
4
+ "version": "0.0.1-alpha.35",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {