@naman_deep_singh/security 1.6.0 → 1.7.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.
Files changed (95) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/core/crypto/CryptoManger.js +107 -0
  3. package/dist/cjs/core/crypto/index.js +13 -26
  4. package/dist/cjs/core/index.js +44 -0
  5. package/dist/cjs/core/jwt/{jwtManager.js → JWTManager.js} +8 -8
  6. package/dist/cjs/core/jwt/decode.js +0 -1
  7. package/dist/cjs/core/jwt/generateTokens.js +6 -6
  8. package/dist/cjs/core/jwt/index.js +23 -22
  9. package/dist/cjs/core/jwt/signToken.js +2 -2
  10. package/dist/cjs/core/password/{passwordManager.js → PasswordManager.js} +3 -3
  11. package/dist/cjs/core/password/hash.js +5 -5
  12. package/dist/cjs/core/password/index.js +20 -17
  13. package/dist/cjs/index.js +4 -40
  14. package/dist/cjs/interfaces/index.js +2 -0
  15. package/dist/esm/core/crypto/CryptoManger.js +100 -0
  16. package/dist/esm/core/crypto/index.js +5 -5
  17. package/dist/esm/core/index.js +6 -0
  18. package/dist/esm/core/jwt/{jwtManager.js → JWTManager.js} +3 -3
  19. package/dist/esm/core/jwt/decode.js +0 -1
  20. package/dist/esm/core/jwt/generateTokens.js +2 -2
  21. package/dist/esm/core/jwt/index.js +8 -8
  22. package/dist/esm/core/jwt/signToken.js +1 -1
  23. package/dist/esm/core/password/{passwordManager.js → PasswordManager.js} +1 -1
  24. package/dist/esm/core/password/hash.js +3 -3
  25. package/dist/esm/core/password/index.js +5 -3
  26. package/dist/esm/index.js +4 -13
  27. package/dist/esm/interfaces/index.js +1 -0
  28. package/dist/types/core/crypto/CryptoManger.d.ts +36 -0
  29. package/dist/types/core/crypto/index.d.ts +5 -5
  30. package/dist/types/core/index.d.ts +3 -0
  31. package/dist/{esm/core/jwt/jwtManager.d.ts → types/core/jwt/JWTManager.d.ts} +1 -1
  32. package/dist/types/core/jwt/generateTokens.d.ts +1 -1
  33. package/dist/types/core/jwt/index.d.ts +9 -8
  34. package/dist/types/core/jwt/verify.d.ts +1 -1
  35. package/dist/types/core/password/{passwordManager.d.ts → PasswordManager.d.ts} +1 -1
  36. package/dist/types/core/password/index.d.ts +6 -3
  37. package/dist/types/core/password/strength.d.ts +1 -1
  38. package/dist/types/index.d.ts +1 -40
  39. package/dist/types/interfaces/index.d.ts +2 -0
  40. package/package.json +30 -4
  41. package/dist/cjs/core/crypto/cryptoManager.d.ts +0 -111
  42. package/dist/cjs/core/crypto/cryptoManager.js +0 -208
  43. package/dist/cjs/core/crypto/decrypt.d.ts +0 -1
  44. package/dist/cjs/core/crypto/encrypt.d.ts +0 -1
  45. package/dist/cjs/core/crypto/hmac.d.ts +0 -8
  46. package/dist/cjs/core/crypto/index.d.ts +0 -5
  47. package/dist/cjs/core/crypto/random.d.ts +0 -8
  48. package/dist/cjs/core/jwt/decode.d.ts +0 -12
  49. package/dist/cjs/core/jwt/extractToken.d.ts +0 -11
  50. package/dist/cjs/core/jwt/generateTokens.d.ts +0 -4
  51. package/dist/cjs/core/jwt/index.d.ts +0 -8
  52. package/dist/cjs/core/jwt/jwtManager.d.ts +0 -43
  53. package/dist/cjs/core/jwt/parseDuration.d.ts +0 -1
  54. package/dist/cjs/core/jwt/signToken.d.ts +0 -2
  55. package/dist/cjs/core/jwt/types.d.ts +0 -22
  56. package/dist/cjs/core/jwt/validateToken.d.ts +0 -16
  57. package/dist/cjs/core/jwt/verify.d.ts +0 -18
  58. package/dist/cjs/core/password/hash.d.ts +0 -10
  59. package/dist/cjs/core/password/index.d.ts +0 -3
  60. package/dist/cjs/core/password/passwordManager.d.ts +0 -29
  61. package/dist/cjs/core/password/strength.d.ts +0 -2
  62. package/dist/cjs/core/password/types.d.ts +0 -7
  63. package/dist/cjs/core/password/utils.d.ts +0 -16
  64. package/dist/cjs/core/password/verify.d.ts +0 -10
  65. package/dist/cjs/index.d.ts +0 -40
  66. package/dist/cjs/interfaces/jwt.interface.d.ts +0 -47
  67. package/dist/cjs/interfaces/password.interface.d.ts +0 -60
  68. package/dist/esm/core/crypto/cryptoManager.d.ts +0 -111
  69. package/dist/esm/core/crypto/cryptoManager.js +0 -203
  70. package/dist/esm/core/crypto/decrypt.d.ts +0 -1
  71. package/dist/esm/core/crypto/encrypt.d.ts +0 -1
  72. package/dist/esm/core/crypto/hmac.d.ts +0 -8
  73. package/dist/esm/core/crypto/index.d.ts +0 -5
  74. package/dist/esm/core/crypto/random.d.ts +0 -8
  75. package/dist/esm/core/jwt/decode.d.ts +0 -12
  76. package/dist/esm/core/jwt/extractToken.d.ts +0 -11
  77. package/dist/esm/core/jwt/generateTokens.d.ts +0 -4
  78. package/dist/esm/core/jwt/index.d.ts +0 -8
  79. package/dist/esm/core/jwt/parseDuration.d.ts +0 -1
  80. package/dist/esm/core/jwt/signToken.d.ts +0 -2
  81. package/dist/esm/core/jwt/types.d.ts +0 -22
  82. package/dist/esm/core/jwt/validateToken.d.ts +0 -16
  83. package/dist/esm/core/jwt/verify.d.ts +0 -18
  84. package/dist/esm/core/password/hash.d.ts +0 -10
  85. package/dist/esm/core/password/index.d.ts +0 -3
  86. package/dist/esm/core/password/passwordManager.d.ts +0 -29
  87. package/dist/esm/core/password/strength.d.ts +0 -2
  88. package/dist/esm/core/password/types.d.ts +0 -7
  89. package/dist/esm/core/password/utils.d.ts +0 -16
  90. package/dist/esm/core/password/verify.d.ts +0 -10
  91. package/dist/esm/index.d.ts +0 -40
  92. package/dist/esm/interfaces/jwt.interface.d.ts +0 -47
  93. package/dist/esm/interfaces/password.interface.d.ts +0 -60
  94. package/dist/types/core/crypto/cryptoManager.d.ts +0 -111
  95. package/dist/types/core/jwt/jwtManager.d.ts +0 -43
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ```bash
2
2
  @naman_deep_singh/security
3
3
 
4
- Version: 1.6.0
4
+ Version: 1.7.0
5
5
 
6
6
  A complete, lightweight security toolkit for Node.js & TypeScript providing:
7
7
 
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CryptoManager = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const errors_1 = require("@naman_deep_singh/errors");
9
+ const decrypt_js_1 = require("./decrypt.js");
10
+ const encrypt_js_1 = require("./encrypt.js");
11
+ const hmac_js_1 = require("./hmac.js");
12
+ /**
13
+ * High-level cryptography manager
14
+ * Wraps encryption, decryption, HMAC, and random utilities
15
+ */
16
+ class CryptoManager {
17
+ constructor(secret) {
18
+ if (!secret || typeof secret !== 'string' || secret.length < 16) {
19
+ throw new errors_1.BadRequestError({
20
+ reason: 'CryptoManager secret must be a non-empty string (min 16 chars)',
21
+ });
22
+ }
23
+ this.secret = secret;
24
+ }
25
+ /**
26
+ * Encrypt data using AES-256-GCM
27
+ */
28
+ encrypt(data) {
29
+ if (!data || typeof data !== 'string') {
30
+ throw new errors_1.BadRequestError({
31
+ reason: 'Data to encrypt must be a non-empty string',
32
+ });
33
+ }
34
+ return (0, encrypt_js_1.encrypt)(data, this.secret);
35
+ }
36
+ /**
37
+ * Decrypt AES-256-GCM encrypted data
38
+ */
39
+ decrypt(encrypted) {
40
+ if (!encrypted || typeof encrypted !== 'string') {
41
+ throw new errors_1.BadRequestError({
42
+ reason: 'Encrypted value must be a non-empty string',
43
+ });
44
+ }
45
+ return (0, decrypt_js_1.decrypt)(encrypted, this.secret);
46
+ }
47
+ /**
48
+ * Create HMAC SHA-256 signature
49
+ */
50
+ createHMAC(message) {
51
+ if (!message || typeof message !== 'string') {
52
+ throw new errors_1.BadRequestError({
53
+ reason: 'Message must be a non-empty string',
54
+ });
55
+ }
56
+ return (0, hmac_js_1.hmacSign)(message, this.secret);
57
+ }
58
+ /**
59
+ * Verify HMAC SHA-256 signature
60
+ */
61
+ verifyHMAC(message, signature) {
62
+ if (!message ||
63
+ typeof message !== 'string' ||
64
+ !signature ||
65
+ typeof signature !== 'string') {
66
+ return false;
67
+ }
68
+ return (0, hmac_js_1.hmacVerify)(message, this.secret, signature);
69
+ }
70
+ /**
71
+ * Generate cryptographically secure random bytes
72
+ */
73
+ generateRandomBytes(length = 32) {
74
+ if (!Number.isInteger(length) || length <= 0) {
75
+ throw new errors_1.BadRequestError({
76
+ reason: 'Random byte length must be a positive integer',
77
+ });
78
+ }
79
+ return crypto_1.default.randomBytes(length);
80
+ }
81
+ /**
82
+ * Generate secure random hex string
83
+ */
84
+ generateRandomHex(length = 32) {
85
+ if (!Number.isInteger(length) || length <= 0) {
86
+ throw new errors_1.BadRequestError({
87
+ reason: 'Random hex length must be a positive integer',
88
+ });
89
+ }
90
+ return crypto_1.default.randomBytes(length).toString('hex');
91
+ }
92
+ /**
93
+ * Generate secure random string (URL-safe base64)
94
+ */
95
+ generateRandomString(length = 32) {
96
+ if (!Number.isInteger(length) || length <= 0) {
97
+ throw new errors_1.BadRequestError({
98
+ reason: 'Random string length must be a positive integer',
99
+ });
100
+ }
101
+ return crypto_1.default
102
+ .randomBytes(Math.ceil((length * 3) / 4))
103
+ .toString('base64url')
104
+ .slice(0, length);
105
+ }
106
+ }
107
+ exports.CryptoManager = CryptoManager;
@@ -1,28 +1,15 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
2
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.generateStrongPassword = exports.randomToken = exports.hmacVerify = exports.hmacSign = exports.encrypt = exports.decrypt = void 0;
18
- var decrypt_1 = require("./decrypt");
19
- Object.defineProperty(exports, "decrypt", { enumerable: true, get: function () { return decrypt_1.decrypt; } });
20
- var encrypt_1 = require("./encrypt");
21
- Object.defineProperty(exports, "encrypt", { enumerable: true, get: function () { return encrypt_1.encrypt; } });
22
- var hmac_1 = require("./hmac");
23
- Object.defineProperty(exports, "hmacSign", { enumerable: true, get: function () { return hmac_1.hmacSign; } });
24
- Object.defineProperty(exports, "hmacVerify", { enumerable: true, get: function () { return hmac_1.hmacVerify; } });
25
- var random_1 = require("./random");
26
- Object.defineProperty(exports, "randomToken", { enumerable: true, get: function () { return random_1.randomToken; } });
27
- Object.defineProperty(exports, "generateStrongPassword", { enumerable: true, get: function () { return random_1.generateStrongPassword; } });
28
- __exportStar(require("./cryptoManager"), exports);
3
+ exports.generateStrongPassword = exports.randomToken = exports.hmacVerify = exports.hmacSign = exports.decrypt = exports.encrypt = exports.CryptoManager = void 0;
4
+ var CryptoManger_js_1 = require("./CryptoManger.js");
5
+ Object.defineProperty(exports, "CryptoManager", { enumerable: true, get: function () { return CryptoManger_js_1.CryptoManager; } });
6
+ var encrypt_js_1 = require("./encrypt.js");
7
+ Object.defineProperty(exports, "encrypt", { enumerable: true, get: function () { return encrypt_js_1.encrypt; } });
8
+ var decrypt_js_1 = require("./decrypt.js");
9
+ Object.defineProperty(exports, "decrypt", { enumerable: true, get: function () { return decrypt_js_1.decrypt; } });
10
+ var hmac_js_1 = require("./hmac.js");
11
+ Object.defineProperty(exports, "hmacSign", { enumerable: true, get: function () { return hmac_js_1.hmacSign; } });
12
+ Object.defineProperty(exports, "hmacVerify", { enumerable: true, get: function () { return hmac_js_1.hmacVerify; } });
13
+ var random_js_1 = require("./random.js");
14
+ Object.defineProperty(exports, "randomToken", { enumerable: true, get: function () { return random_js_1.randomToken; } });
15
+ Object.defineProperty(exports, "generateStrongPassword", { enumerable: true, get: function () { return random_js_1.generateStrongPassword; } });
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizePassword = exports.estimatePasswordEntropy = exports.safeCompare = exports.ensureValidPassword = exports.PasswordManager = exports.verifyPasswordWithPepperSync = exports.verifyPasswordSync = exports.verifyPasswordWithPepper = exports.verifyPassword = exports.isPasswordStrong = exports.hashPasswordWithPepperSync = exports.hashPasswordSync = exports.hashPasswordWithPepper = exports.hashPassword = exports.JWTManager = exports.safeVerifyTokenWithOptions = exports.safeVerifyToken = exports.verifyTokenWithOptions = exports.verifyToken = exports.isTokenExpired = exports.validateTokenPayload = exports.signToken = exports.parseDuration = exports.rotateRefreshToken = exports.generateTokens = exports.extractToken = exports.decodeTokenStrict = exports.decodeToken = exports.generateStrongPassword = exports.randomToken = exports.hmacVerify = exports.hmacSign = exports.decrypt = exports.encrypt = exports.CryptoManager = void 0;
4
+ // Re-export everything from crypto module
5
+ var index_js_1 = require("./crypto/index.js");
6
+ Object.defineProperty(exports, "CryptoManager", { enumerable: true, get: function () { return index_js_1.CryptoManager; } });
7
+ Object.defineProperty(exports, "encrypt", { enumerable: true, get: function () { return index_js_1.encrypt; } });
8
+ Object.defineProperty(exports, "decrypt", { enumerable: true, get: function () { return index_js_1.decrypt; } });
9
+ Object.defineProperty(exports, "hmacSign", { enumerable: true, get: function () { return index_js_1.hmacSign; } });
10
+ Object.defineProperty(exports, "hmacVerify", { enumerable: true, get: function () { return index_js_1.hmacVerify; } });
11
+ Object.defineProperty(exports, "randomToken", { enumerable: true, get: function () { return index_js_1.randomToken; } });
12
+ Object.defineProperty(exports, "generateStrongPassword", { enumerable: true, get: function () { return index_js_1.generateStrongPassword; } });
13
+ // Re-export everything from jwt module
14
+ var index_js_2 = require("./jwt/index.js");
15
+ Object.defineProperty(exports, "decodeToken", { enumerable: true, get: function () { return index_js_2.decodeToken; } });
16
+ Object.defineProperty(exports, "decodeTokenStrict", { enumerable: true, get: function () { return index_js_2.decodeTokenStrict; } });
17
+ Object.defineProperty(exports, "extractToken", { enumerable: true, get: function () { return index_js_2.extractToken; } });
18
+ Object.defineProperty(exports, "generateTokens", { enumerable: true, get: function () { return index_js_2.generateTokens; } });
19
+ Object.defineProperty(exports, "rotateRefreshToken", { enumerable: true, get: function () { return index_js_2.rotateRefreshToken; } });
20
+ Object.defineProperty(exports, "parseDuration", { enumerable: true, get: function () { return index_js_2.parseDuration; } });
21
+ Object.defineProperty(exports, "signToken", { enumerable: true, get: function () { return index_js_2.signToken; } });
22
+ Object.defineProperty(exports, "validateTokenPayload", { enumerable: true, get: function () { return index_js_2.validateTokenPayload; } });
23
+ Object.defineProperty(exports, "isTokenExpired", { enumerable: true, get: function () { return index_js_2.isTokenExpired; } });
24
+ Object.defineProperty(exports, "verifyToken", { enumerable: true, get: function () { return index_js_2.verifyToken; } });
25
+ Object.defineProperty(exports, "verifyTokenWithOptions", { enumerable: true, get: function () { return index_js_2.verifyTokenWithOptions; } });
26
+ Object.defineProperty(exports, "safeVerifyToken", { enumerable: true, get: function () { return index_js_2.safeVerifyToken; } });
27
+ Object.defineProperty(exports, "safeVerifyTokenWithOptions", { enumerable: true, get: function () { return index_js_2.safeVerifyTokenWithOptions; } });
28
+ Object.defineProperty(exports, "JWTManager", { enumerable: true, get: function () { return index_js_2.JWTManager; } });
29
+ // Re-export everything from password module
30
+ var index_js_3 = require("./password/index.js");
31
+ Object.defineProperty(exports, "hashPassword", { enumerable: true, get: function () { return index_js_3.hashPassword; } });
32
+ Object.defineProperty(exports, "hashPasswordWithPepper", { enumerable: true, get: function () { return index_js_3.hashPasswordWithPepper; } });
33
+ Object.defineProperty(exports, "hashPasswordSync", { enumerable: true, get: function () { return index_js_3.hashPasswordSync; } });
34
+ Object.defineProperty(exports, "hashPasswordWithPepperSync", { enumerable: true, get: function () { return index_js_3.hashPasswordWithPepperSync; } });
35
+ Object.defineProperty(exports, "isPasswordStrong", { enumerable: true, get: function () { return index_js_3.isPasswordStrong; } });
36
+ Object.defineProperty(exports, "verifyPassword", { enumerable: true, get: function () { return index_js_3.verifyPassword; } });
37
+ Object.defineProperty(exports, "verifyPasswordWithPepper", { enumerable: true, get: function () { return index_js_3.verifyPasswordWithPepper; } });
38
+ Object.defineProperty(exports, "verifyPasswordSync", { enumerable: true, get: function () { return index_js_3.verifyPasswordSync; } });
39
+ Object.defineProperty(exports, "verifyPasswordWithPepperSync", { enumerable: true, get: function () { return index_js_3.verifyPasswordWithPepperSync; } });
40
+ Object.defineProperty(exports, "PasswordManager", { enumerable: true, get: function () { return index_js_3.PasswordManager; } });
41
+ Object.defineProperty(exports, "ensureValidPassword", { enumerable: true, get: function () { return index_js_3.ensureValidPassword; } });
42
+ Object.defineProperty(exports, "safeCompare", { enumerable: true, get: function () { return index_js_3.safeCompare; } });
43
+ Object.defineProperty(exports, "estimatePasswordEntropy", { enumerable: true, get: function () { return index_js_3.estimatePasswordEntropy; } });
44
+ Object.defineProperty(exports, "normalizePassword", { enumerable: true, get: function () { return index_js_3.normalizePassword; } });
@@ -4,11 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.JWTManager = void 0;
7
- const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
- const signToken_1 = require("./signToken");
9
- const verify_1 = require("./verify");
10
7
  const errors_1 = require("@naman_deep_singh/errors");
11
8
  const utils_1 = require("@naman_deep_singh/utils");
9
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
10
+ const signToken_js_1 = require("./signToken.js");
11
+ const verify_js_1 = require("./verify.js");
12
12
  class JWTManager {
13
13
  constructor(config) {
14
14
  this.accessSecret = config.accessSecret;
@@ -38,7 +38,7 @@ class JWTManager {
38
38
  async generateAccessToken(payload) {
39
39
  try {
40
40
  this.validatePayload(payload);
41
- const token = (0, signToken_1.signToken)(payload, this.accessSecret, this.accessExpiry, {
41
+ const token = (0, signToken_js_1.signToken)(payload, this.accessSecret, this.accessExpiry, {
42
42
  algorithm: 'HS256',
43
43
  });
44
44
  return token;
@@ -53,7 +53,7 @@ class JWTManager {
53
53
  async generateRefreshToken(payload) {
54
54
  try {
55
55
  this.validatePayload(payload);
56
- const token = (0, signToken_1.signToken)(payload, this.refreshSecret, this.refreshExpiry, {
56
+ const token = (0, signToken_js_1.signToken)(payload, this.refreshSecret, this.refreshExpiry, {
57
57
  algorithm: 'HS256',
58
58
  });
59
59
  return token;
@@ -91,7 +91,7 @@ class JWTManager {
91
91
  validateToken(token, secret) {
92
92
  if (!token || typeof token !== 'string')
93
93
  return false;
94
- return (0, verify_1.safeVerifyToken)(token, secret).valid;
94
+ return (0, verify_js_1.safeVerifyToken)(token, secret).valid;
95
95
  }
96
96
  /** Rotate refresh token */
97
97
  async rotateRefreshToken(oldToken) {
@@ -104,7 +104,7 @@ class JWTManager {
104
104
  const payload = { ...decoded };
105
105
  delete payload.iat;
106
106
  delete payload.exp;
107
- const newToken = (0, signToken_1.signToken)(payload, this.refreshSecret, this.refreshExpiry);
107
+ const newToken = (0, signToken_js_1.signToken)(payload, this.refreshSecret, this.refreshExpiry);
108
108
  return newToken;
109
109
  }
110
110
  /** Check if token is expired */
@@ -169,7 +169,7 @@ class JWTManager {
169
169
  return cached.payload;
170
170
  }
171
171
  }
172
- const { valid, payload, error } = (0, verify_1.safeVerifyToken)(token, secret);
172
+ const { valid, payload, error } = (0, verify_js_1.safeVerifyToken)(token, secret);
173
173
  if (!valid || !payload || typeof payload === 'string') {
174
174
  this.cache?.set(cacheKey, {
175
175
  valid: false,
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.decodeToken = decodeToken;
4
4
  exports.decodeTokenStrict = decodeTokenStrict;
5
5
  const errors_1 = require("@naman_deep_singh/errors");
6
- // src/jwt/decodeToken.ts
7
6
  const jsonwebtoken_1 = require("jsonwebtoken");
8
7
  /**
9
8
  * Flexible decode
@@ -3,17 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateTokens = void 0;
4
4
  exports.rotateRefreshToken = rotateRefreshToken;
5
5
  const errors_1 = require("@naman_deep_singh/errors");
6
- const signToken_1 = require("./signToken");
7
- const verify_1 = require("./verify");
6
+ const signToken_js_1 = require("./signToken.js");
7
+ const verify_js_1 = require("./verify.js");
8
8
  // Helper function to create branded tokens
9
9
  /* const createBrandedToken = <T extends string>(token: string, _brand: T): T => {
10
10
  return token as T
11
11
  } */
12
12
  const generateTokens = (payload, accessSecret, refreshSecret, accessExpiry = '15m', refreshExpiry = '7d') => {
13
- const accessToken = (0, signToken_1.signToken)(payload, accessSecret, accessExpiry, {
13
+ const accessToken = (0, signToken_js_1.signToken)(payload, accessSecret, accessExpiry, {
14
14
  algorithm: 'HS256',
15
15
  });
16
- const refreshToken = (0, signToken_1.signToken)(payload, refreshSecret, refreshExpiry, {
16
+ const refreshToken = (0, signToken_js_1.signToken)(payload, refreshSecret, refreshExpiry, {
17
17
  algorithm: 'HS256',
18
18
  });
19
19
  return {
@@ -23,7 +23,7 @@ const generateTokens = (payload, accessSecret, refreshSecret, accessExpiry = '15
23
23
  };
24
24
  exports.generateTokens = generateTokens;
25
25
  function rotateRefreshToken(oldToken, secret) {
26
- const decoded = (0, verify_1.verifyToken)(oldToken, secret);
26
+ const decoded = (0, verify_js_1.verifyToken)(oldToken, secret);
27
27
  if (typeof decoded === 'string') {
28
28
  throw new errors_1.TokenMalformedError({
29
29
  reason: 'Invalid token payload — expected JWT payload object',
@@ -32,6 +32,6 @@ function rotateRefreshToken(oldToken, secret) {
32
32
  const payload = { ...decoded };
33
33
  delete payload.iat;
34
34
  delete payload.exp;
35
- const newToken = (0, signToken_1.signToken)(payload, secret, '7d');
35
+ const newToken = (0, signToken_js_1.signToken)(payload, secret, '7d');
36
36
  return newToken;
37
37
  }
@@ -1,24 +1,25 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
2
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./decode"), exports);
18
- __exportStar(require("./extractToken"), exports);
19
- __exportStar(require("./generateTokens"), exports);
20
- __exportStar(require("./parseDuration"), exports);
21
- __exportStar(require("./signToken"), exports);
22
- __exportStar(require("./types"), exports);
23
- __exportStar(require("./validateToken"), exports);
24
- __exportStar(require("./verify"), exports);
3
+ exports.JWTManager = exports.safeVerifyTokenWithOptions = exports.safeVerifyToken = exports.verifyTokenWithOptions = exports.verifyToken = exports.isTokenExpired = exports.validateTokenPayload = exports.signToken = exports.parseDuration = exports.rotateRefreshToken = exports.generateTokens = exports.extractToken = exports.decodeTokenStrict = exports.decodeToken = void 0;
4
+ var decode_js_1 = require("./decode.js");
5
+ Object.defineProperty(exports, "decodeToken", { enumerable: true, get: function () { return decode_js_1.decodeToken; } });
6
+ Object.defineProperty(exports, "decodeTokenStrict", { enumerable: true, get: function () { return decode_js_1.decodeTokenStrict; } });
7
+ var extractToken_js_1 = require("./extractToken.js");
8
+ Object.defineProperty(exports, "extractToken", { enumerable: true, get: function () { return extractToken_js_1.extractToken; } });
9
+ var generateTokens_js_1 = require("./generateTokens.js");
10
+ Object.defineProperty(exports, "generateTokens", { enumerable: true, get: function () { return generateTokens_js_1.generateTokens; } });
11
+ Object.defineProperty(exports, "rotateRefreshToken", { enumerable: true, get: function () { return generateTokens_js_1.rotateRefreshToken; } });
12
+ var parseDuration_js_1 = require("./parseDuration.js");
13
+ Object.defineProperty(exports, "parseDuration", { enumerable: true, get: function () { return parseDuration_js_1.parseDuration; } });
14
+ var signToken_js_1 = require("./signToken.js");
15
+ Object.defineProperty(exports, "signToken", { enumerable: true, get: function () { return signToken_js_1.signToken; } });
16
+ var validateToken_js_1 = require("./validateToken.js");
17
+ Object.defineProperty(exports, "validateTokenPayload", { enumerable: true, get: function () { return validateToken_js_1.validateTokenPayload; } });
18
+ Object.defineProperty(exports, "isTokenExpired", { enumerable: true, get: function () { return validateToken_js_1.isTokenExpired; } });
19
+ var verify_js_1 = require("./verify.js");
20
+ Object.defineProperty(exports, "verifyToken", { enumerable: true, get: function () { return verify_js_1.verifyToken; } });
21
+ Object.defineProperty(exports, "verifyTokenWithOptions", { enumerable: true, get: function () { return verify_js_1.verifyTokenWithOptions; } });
22
+ Object.defineProperty(exports, "safeVerifyToken", { enumerable: true, get: function () { return verify_js_1.safeVerifyToken; } });
23
+ Object.defineProperty(exports, "safeVerifyTokenWithOptions", { enumerable: true, get: function () { return verify_js_1.safeVerifyTokenWithOptions; } });
24
+ var JWTManager_js_1 = require("./JWTManager.js");
25
+ Object.defineProperty(exports, "JWTManager", { enumerable: true, get: function () { return JWTManager_js_1.JWTManager; } });
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.signToken = void 0;
4
4
  const errors_1 = require("@naman_deep_singh/errors");
5
5
  const jsonwebtoken_1 = require("jsonwebtoken");
6
- const parseDuration_1 = require("./parseDuration");
6
+ const parseDuration_js_1 = require("./parseDuration.js");
7
7
  function getExpiryTimestamp(seconds) {
8
8
  return Math.floor(Date.now() / 1000) + seconds;
9
9
  }
10
10
  const signToken = (payload, secret, expiresIn = '1h', options = {}) => {
11
- const seconds = (0, parseDuration_1.parseDuration)(expiresIn);
11
+ const seconds = (0, parseDuration_js_1.parseDuration)(expiresIn);
12
12
  if (!seconds || seconds < 10) {
13
13
  throw new errors_1.ValidationError({ reason: 'Token expiry too small' });
14
14
  }
@@ -7,7 +7,7 @@ exports.PasswordManager = void 0;
7
7
  const crypto_1 = __importDefault(require("crypto"));
8
8
  const bcryptjs_1 = __importDefault(require("bcryptjs"));
9
9
  const errors_1 = require("@naman_deep_singh/errors");
10
- const utils_1 = require("./utils");
10
+ const utils_js_1 = require("./utils.js");
11
11
  class PasswordManager {
12
12
  constructor(config = {}) {
13
13
  this.defaultConfig = {
@@ -26,7 +26,7 @@ class PasswordManager {
26
26
  */
27
27
  async hash(password, salt) {
28
28
  try {
29
- (0, utils_1.ensureValidPassword)(password);
29
+ (0, utils_js_1.ensureValidPassword)(password);
30
30
  this.validate(password);
31
31
  const saltRounds = this.defaultConfig.saltRounds;
32
32
  let finalSalt = salt;
@@ -127,7 +127,7 @@ class PasswordManager {
127
127
  * Check password strength
128
128
  */
129
129
  checkStrength(password) {
130
- const entropy = (0, utils_1.estimatePasswordEntropy)(password);
130
+ const entropy = (0, utils_js_1.estimatePasswordEntropy)(password);
131
131
  let score = 0;
132
132
  const feedback = [];
133
133
  const suggestions = [];
@@ -8,18 +8,18 @@ exports.hashPasswordWithPepper = hashPasswordWithPepper;
8
8
  exports.hashPasswordWithPepperSync = hashPasswordWithPepperSync;
9
9
  const errors_1 = require("@naman_deep_singh/errors");
10
10
  const bcryptjs_1 = __importDefault(require("bcryptjs"));
11
- const utils_1 = require("./utils");
11
+ const utils_js_1 = require("./utils.js");
12
12
  /**
13
13
  * Hash a password asynchronously using bcrypt.
14
14
  */
15
15
  const hashPassword = async (password, saltRounds = 10) => {
16
16
  try {
17
- (0, utils_1.ensureValidPassword)(password);
17
+ (0, utils_js_1.ensureValidPassword)(password);
18
18
  const salt = await bcryptjs_1.default.genSalt(saltRounds);
19
19
  return bcryptjs_1.default.hash(password, salt);
20
20
  }
21
21
  catch (error) {
22
- throw new errors_1.InternalServerError({ reason: 'Password hashing failed' }, error instanceof Error ? error : undefined);
22
+ throw new errors_1.InternalServerError(undefined, { reason: 'Password hashing failed' }, error instanceof Error ? error : undefined);
23
23
  }
24
24
  };
25
25
  exports.hashPassword = hashPassword;
@@ -31,12 +31,12 @@ function hashPasswordWithPepper(password, pepper) {
31
31
  */
32
32
  const hashPasswordSync = (password, saltRounds = 10) => {
33
33
  try {
34
- (0, utils_1.ensureValidPassword)(password);
34
+ (0, utils_js_1.ensureValidPassword)(password);
35
35
  const salt = bcryptjs_1.default.genSaltSync(saltRounds);
36
36
  return bcryptjs_1.default.hashSync(password, salt);
37
37
  }
38
38
  catch (error) {
39
- throw new errors_1.InternalServerError({ reason: 'Password hashing failed' }, error instanceof Error ? error : undefined);
39
+ throw new errors_1.InternalServerError(undefined, { reason: 'Password hashing failed' }, error instanceof Error ? error : undefined);
40
40
  }
41
41
  };
42
42
  exports.hashPasswordSync = hashPasswordSync;
@@ -1,19 +1,22 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
2
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./hash"), exports);
18
- __exportStar(require("./strength"), exports);
19
- __exportStar(require("./verify"), exports);
3
+ exports.normalizePassword = exports.estimatePasswordEntropy = exports.safeCompare = exports.ensureValidPassword = exports.PasswordManager = exports.verifyPasswordWithPepperSync = exports.verifyPasswordSync = exports.verifyPasswordWithPepper = exports.verifyPassword = exports.isPasswordStrong = exports.hashPasswordWithPepperSync = exports.hashPasswordSync = exports.hashPasswordWithPepper = exports.hashPassword = void 0;
4
+ var hash_js_1 = require("./hash.js");
5
+ Object.defineProperty(exports, "hashPassword", { enumerable: true, get: function () { return hash_js_1.hashPassword; } });
6
+ Object.defineProperty(exports, "hashPasswordWithPepper", { enumerable: true, get: function () { return hash_js_1.hashPasswordWithPepper; } });
7
+ Object.defineProperty(exports, "hashPasswordSync", { enumerable: true, get: function () { return hash_js_1.hashPasswordSync; } });
8
+ Object.defineProperty(exports, "hashPasswordWithPepperSync", { enumerable: true, get: function () { return hash_js_1.hashPasswordWithPepperSync; } });
9
+ var strength_js_1 = require("./strength.js");
10
+ Object.defineProperty(exports, "isPasswordStrong", { enumerable: true, get: function () { return strength_js_1.isPasswordStrong; } });
11
+ var verify_js_1 = require("./verify.js");
12
+ Object.defineProperty(exports, "verifyPassword", { enumerable: true, get: function () { return verify_js_1.verifyPassword; } });
13
+ Object.defineProperty(exports, "verifyPasswordWithPepper", { enumerable: true, get: function () { return verify_js_1.verifyPasswordWithPepper; } });
14
+ Object.defineProperty(exports, "verifyPasswordSync", { enumerable: true, get: function () { return verify_js_1.verifyPasswordSync; } });
15
+ Object.defineProperty(exports, "verifyPasswordWithPepperSync", { enumerable: true, get: function () { return verify_js_1.verifyPasswordWithPepperSync; } });
16
+ var PasswordManager_js_1 = require("./PasswordManager.js");
17
+ Object.defineProperty(exports, "PasswordManager", { enumerable: true, get: function () { return PasswordManager_js_1.PasswordManager; } });
18
+ var utils_js_1 = require("./utils.js");
19
+ Object.defineProperty(exports, "ensureValidPassword", { enumerable: true, get: function () { return utils_js_1.ensureValidPassword; } });
20
+ Object.defineProperty(exports, "safeCompare", { enumerable: true, get: function () { return utils_js_1.safeCompare; } });
21
+ Object.defineProperty(exports, "estimatePasswordEntropy", { enumerable: true, get: function () { return utils_js_1.estimatePasswordEntropy; } });
22
+ Object.defineProperty(exports, "normalizePassword", { enumerable: true, get: function () { return utils_js_1.normalizePassword; } });
package/dist/cjs/index.js CHANGED
@@ -10,47 +10,11 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
10
10
  if (k2 === undefined) k2 = k;
11
11
  o[k2] = m[k];
12
12
  }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
13
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
15
  };
21
- var __importStar = (this && this.__importStar) || (function () {
22
- var ownKeys = function(o) {
23
- ownKeys = Object.getOwnPropertyNames || function (o) {
24
- var ar = [];
25
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
- return ar;
27
- };
28
- return ownKeys(o);
29
- };
30
- return function (mod) {
31
- if (mod && mod.__esModule) return mod;
32
- var result = {};
33
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
- __setModuleDefault(result, mod);
35
- return result;
36
- };
37
- })();
38
16
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.InternalServerError = exports.ValidationError = exports.UnauthorizedError = exports.BadRequestError = void 0;
40
- __exportStar(require("./core/password"), exports);
41
- __exportStar(require("./core/jwt"), exports);
42
- __exportStar(require("./core/crypto"), exports);
43
- // Re-export common errors for convenience
44
- var errors_1 = require("@naman_deep_singh/errors");
45
- Object.defineProperty(exports, "BadRequestError", { enumerable: true, get: function () { return errors_1.BadRequestError; } });
46
- Object.defineProperty(exports, "UnauthorizedError", { enumerable: true, get: function () { return errors_1.UnauthorizedError; } });
47
- Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
48
- Object.defineProperty(exports, "InternalServerError", { enumerable: true, get: function () { return errors_1.InternalServerError; } });
49
- const CryptoUtils = __importStar(require("./core/crypto"));
50
- const JWTUtils = __importStar(require("./core/jwt"));
51
- const PasswordUtils = __importStar(require("./core/password"));
52
- exports.default = {
53
- ...PasswordUtils,
54
- ...JWTUtils,
55
- ...CryptoUtils,
56
- };
17
+ // Core modules
18
+ __exportStar(require("./core/index.js"), exports);
19
+ // Public interfaces
20
+ // export * from './interfaces/index.js'
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,100 @@
1
+ import crypto from 'crypto';
2
+ import { BadRequestError } from '@naman_deep_singh/errors';
3
+ import { decrypt } from './decrypt.js';
4
+ import { encrypt } from './encrypt.js';
5
+ import { hmacSign, hmacVerify } from './hmac.js';
6
+ /**
7
+ * High-level cryptography manager
8
+ * Wraps encryption, decryption, HMAC, and random utilities
9
+ */
10
+ export class CryptoManager {
11
+ constructor(secret) {
12
+ if (!secret || typeof secret !== 'string' || secret.length < 16) {
13
+ throw new BadRequestError({
14
+ reason: 'CryptoManager secret must be a non-empty string (min 16 chars)',
15
+ });
16
+ }
17
+ this.secret = secret;
18
+ }
19
+ /**
20
+ * Encrypt data using AES-256-GCM
21
+ */
22
+ encrypt(data) {
23
+ if (!data || typeof data !== 'string') {
24
+ throw new BadRequestError({
25
+ reason: 'Data to encrypt must be a non-empty string',
26
+ });
27
+ }
28
+ return encrypt(data, this.secret);
29
+ }
30
+ /**
31
+ * Decrypt AES-256-GCM encrypted data
32
+ */
33
+ decrypt(encrypted) {
34
+ if (!encrypted || typeof encrypted !== 'string') {
35
+ throw new BadRequestError({
36
+ reason: 'Encrypted value must be a non-empty string',
37
+ });
38
+ }
39
+ return decrypt(encrypted, this.secret);
40
+ }
41
+ /**
42
+ * Create HMAC SHA-256 signature
43
+ */
44
+ createHMAC(message) {
45
+ if (!message || typeof message !== 'string') {
46
+ throw new BadRequestError({
47
+ reason: 'Message must be a non-empty string',
48
+ });
49
+ }
50
+ return hmacSign(message, this.secret);
51
+ }
52
+ /**
53
+ * Verify HMAC SHA-256 signature
54
+ */
55
+ verifyHMAC(message, signature) {
56
+ if (!message ||
57
+ typeof message !== 'string' ||
58
+ !signature ||
59
+ typeof signature !== 'string') {
60
+ return false;
61
+ }
62
+ return hmacVerify(message, this.secret, signature);
63
+ }
64
+ /**
65
+ * Generate cryptographically secure random bytes
66
+ */
67
+ generateRandomBytes(length = 32) {
68
+ if (!Number.isInteger(length) || length <= 0) {
69
+ throw new BadRequestError({
70
+ reason: 'Random byte length must be a positive integer',
71
+ });
72
+ }
73
+ return crypto.randomBytes(length);
74
+ }
75
+ /**
76
+ * Generate secure random hex string
77
+ */
78
+ generateRandomHex(length = 32) {
79
+ if (!Number.isInteger(length) || length <= 0) {
80
+ throw new BadRequestError({
81
+ reason: 'Random hex length must be a positive integer',
82
+ });
83
+ }
84
+ return crypto.randomBytes(length).toString('hex');
85
+ }
86
+ /**
87
+ * Generate secure random string (URL-safe base64)
88
+ */
89
+ generateRandomString(length = 32) {
90
+ if (!Number.isInteger(length) || length <= 0) {
91
+ throw new BadRequestError({
92
+ reason: 'Random string length must be a positive integer',
93
+ });
94
+ }
95
+ return crypto
96
+ .randomBytes(Math.ceil((length * 3) / 4))
97
+ .toString('base64url')
98
+ .slice(0, length);
99
+ }
100
+ }