@jmlq/auth 0.0.1-alpha.34 → 0.0.1-alpha.36

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.
@@ -2,5 +2,6 @@ import { UserRole } from "../types";
2
2
  export interface RegisterUserRequest {
3
3
  email: string;
4
4
  password: string;
5
+ confirmPassword: string;
5
6
  roles: UserRole[];
6
7
  }
@@ -36,6 +36,9 @@ class RegisterUserUseCase {
36
36
  // Use case
37
37
  // ---------------------------------------------------------------------------
38
38
  async execute(request) {
39
+ // Validar que el password y su confirmación sean iguales
40
+ if (request.password != request.confirmPassword)
41
+ throw new domain_1.PasswordMismatchError();
39
42
  // Validar policy antes de hacer trabajo costoso (hash)
40
43
  (0, internal_1.assertPasswordPolicy)(this.passwordPolicy, request.password);
41
44
  // Verificar que el email no esté en uso
@@ -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()));
@@ -12,5 +12,5 @@
12
12
  /**
13
13
  * ÚNICA fuente de verdad de los códigos.
14
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"];
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
16
  export type AuthErrorCode = (typeof AUTH_ERROR_CODES)[number];
@@ -52,4 +52,9 @@ exports.AUTH_ERROR_CODES = [
52
52
  "PASSWORD_RESET_TOKEN_INVALID",
53
53
  "PASSWORD_RESET_TOKEN_EXPIRED",
54
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",
55
60
  ];
@@ -11,7 +11,7 @@ export declare abstract class AuthDomainError extends Error {
11
11
  toJSON(): {
12
12
  name: string;
13
13
  message: string;
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";
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";
15
15
  details: unknown;
16
16
  };
17
17
  /**
@@ -53,3 +53,12 @@ export declare class SessionAuthError extends AuthDomainError {
53
53
  export declare class EmailNotVerifiedError extends AuthDomainError {
54
54
  constructor(message?: string, details?: unknown);
55
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,6 +1,6 @@
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
4
  exports.isAuthErrorCode = isAuthErrorCode;
5
5
  const auth_error_code_1 = require("./auth-error-code");
6
6
  function asAuthErrorLike(value) {
@@ -93,3 +93,21 @@ class EmailNotVerifiedError extends AuthDomainError {
93
93
  }
94
94
  }
95
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.34",
4
+ "version": "0.0.1-alpha.36",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {