@warlock.js/auth 4.0.5 → 4.0.10

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 (169) hide show
  1. package/cjs/commands/auth-cleanup-command.d.ts +10 -0
  2. package/cjs/commands/auth-cleanup-command.d.ts.map +1 -0
  3. package/cjs/commands/auth-cleanup-command.js +29 -0
  4. package/cjs/commands/auth-cleanup-command.js.map +1 -0
  5. package/cjs/commands/jwt-secret-generator-command.d.ts.map +1 -1
  6. package/cjs/commands/jwt-secret-generator-command.js +5 -1
  7. package/cjs/commands/jwt-secret-generator-command.js.map +1 -1
  8. package/cjs/contracts/types.d.ts +100 -1
  9. package/cjs/contracts/types.d.ts.map +1 -1
  10. package/cjs/contracts/types.js +20 -0
  11. package/cjs/contracts/types.js.map +1 -0
  12. package/cjs/index.d.ts +2 -1
  13. package/cjs/index.d.ts.map +1 -1
  14. package/cjs/index.js +1 -1
  15. package/cjs/middleware/auth.middleware.d.ts.map +1 -1
  16. package/cjs/middleware/auth.middleware.js +14 -37
  17. package/cjs/middleware/auth.middleware.js.map +1 -1
  18. package/cjs/models/auth.d.ts +24 -2
  19. package/cjs/models/auth.d.ts.map +1 -1
  20. package/cjs/models/auth.js +39 -40
  21. package/cjs/models/auth.js.map +1 -1
  22. package/cjs/models/casts/cast-password.d.ts.map +1 -1
  23. package/cjs/models/casts/cast-password.js +2 -2
  24. package/cjs/models/casts/cast-password.js.map +1 -1
  25. package/cjs/models/index.d.ts +1 -1
  26. package/cjs/models/index.d.ts.map +1 -1
  27. package/cjs/models/refresh-token/index.d.ts +2 -0
  28. package/cjs/models/refresh-token/index.d.ts.map +1 -0
  29. package/cjs/models/refresh-token/migration.d.ts.map +1 -0
  30. package/cjs/models/refresh-token/refresh-token.d.ts +32 -0
  31. package/cjs/models/refresh-token/refresh-token.d.ts.map +1 -0
  32. package/cjs/models/refresh-token/refresh-token.js +52 -0
  33. package/cjs/models/refresh-token/refresh-token.js.map +1 -0
  34. package/cjs/services/auth-events.d.ts +84 -0
  35. package/cjs/services/auth-events.d.ts.map +1 -0
  36. package/cjs/services/auth-events.js +65 -0
  37. package/cjs/services/auth-events.js.map +1 -0
  38. package/cjs/services/auth.service.d.ts +78 -0
  39. package/cjs/services/auth.service.d.ts.map +1 -0
  40. package/cjs/services/auth.service.js +265 -0
  41. package/cjs/services/auth.service.js.map +1 -0
  42. package/cjs/services/generate-jwt-secret.d.ts.map +1 -1
  43. package/cjs/services/generate-jwt-secret.js +4 -4
  44. package/cjs/services/generate-jwt-secret.js.map +1 -1
  45. package/cjs/services/index.d.ts +2 -1
  46. package/cjs/services/index.d.ts.map +1 -1
  47. package/cjs/services/jwt.d.ts +2 -2
  48. package/cjs/services/jwt.d.ts.map +1 -1
  49. package/cjs/services/jwt.js +4 -4
  50. package/cjs/services/jwt.js.map +1 -1
  51. package/cjs/utils/auth-error-codes.d.ts +18 -0
  52. package/cjs/utils/auth-error-codes.d.ts.map +1 -0
  53. package/cjs/utils/auth-error-codes.js +18 -0
  54. package/cjs/utils/auth-error-codes.js.map +1 -0
  55. package/cjs/utils/duration.d.ts +45 -0
  56. package/cjs/utils/duration.d.ts.map +1 -0
  57. package/cjs/utils/duration.js +93 -0
  58. package/cjs/utils/duration.js.map +1 -0
  59. package/cjs/utils/index.d.ts +3 -0
  60. package/cjs/utils/index.d.ts.map +1 -0
  61. package/esm/commands/auth-cleanup-command.d.ts +10 -0
  62. package/esm/commands/auth-cleanup-command.d.ts.map +1 -0
  63. package/esm/commands/auth-cleanup-command.js +29 -0
  64. package/esm/commands/auth-cleanup-command.js.map +1 -0
  65. package/esm/commands/jwt-secret-generator-command.d.ts.map +1 -1
  66. package/esm/commands/jwt-secret-generator-command.js +5 -1
  67. package/esm/commands/jwt-secret-generator-command.js.map +1 -1
  68. package/esm/contracts/types.d.ts +100 -1
  69. package/esm/contracts/types.d.ts.map +1 -1
  70. package/esm/contracts/types.js +20 -0
  71. package/esm/contracts/types.js.map +1 -0
  72. package/esm/index.d.ts +2 -1
  73. package/esm/index.d.ts.map +1 -1
  74. package/esm/index.js +1 -1
  75. package/esm/middleware/auth.middleware.d.ts.map +1 -1
  76. package/esm/middleware/auth.middleware.js +14 -37
  77. package/esm/middleware/auth.middleware.js.map +1 -1
  78. package/esm/models/auth.d.ts +24 -2
  79. package/esm/models/auth.d.ts.map +1 -1
  80. package/esm/models/auth.js +38 -39
  81. package/esm/models/auth.js.map +1 -1
  82. package/esm/models/casts/cast-password.d.ts.map +1 -1
  83. package/esm/models/casts/cast-password.js +2 -2
  84. package/esm/models/casts/cast-password.js.map +1 -1
  85. package/esm/models/index.d.ts +1 -1
  86. package/esm/models/index.d.ts.map +1 -1
  87. package/esm/models/refresh-token/index.d.ts +2 -0
  88. package/esm/models/refresh-token/index.d.ts.map +1 -0
  89. package/esm/models/refresh-token/migration.d.ts.map +1 -0
  90. package/esm/models/refresh-token/refresh-token.d.ts +32 -0
  91. package/esm/models/refresh-token/refresh-token.d.ts.map +1 -0
  92. package/esm/models/refresh-token/refresh-token.js +52 -0
  93. package/esm/models/refresh-token/refresh-token.js.map +1 -0
  94. package/esm/services/auth-events.d.ts +84 -0
  95. package/esm/services/auth-events.d.ts.map +1 -0
  96. package/esm/services/auth-events.js +65 -0
  97. package/esm/services/auth-events.js.map +1 -0
  98. package/esm/services/auth.service.d.ts +78 -0
  99. package/esm/services/auth.service.d.ts.map +1 -0
  100. package/esm/services/auth.service.js +265 -0
  101. package/esm/services/auth.service.js.map +1 -0
  102. package/esm/services/generate-jwt-secret.d.ts.map +1 -1
  103. package/esm/services/generate-jwt-secret.js +5 -5
  104. package/esm/services/generate-jwt-secret.js.map +1 -1
  105. package/esm/services/index.d.ts +2 -1
  106. package/esm/services/index.d.ts.map +1 -1
  107. package/esm/services/jwt.d.ts +2 -2
  108. package/esm/services/jwt.d.ts.map +1 -1
  109. package/esm/services/jwt.js +4 -4
  110. package/esm/services/jwt.js.map +1 -1
  111. package/esm/utils/auth-error-codes.d.ts +18 -0
  112. package/esm/utils/auth-error-codes.d.ts.map +1 -0
  113. package/esm/utils/auth-error-codes.js +18 -0
  114. package/esm/utils/auth-error-codes.js.map +1 -0
  115. package/esm/utils/duration.d.ts +45 -0
  116. package/esm/utils/duration.d.ts.map +1 -0
  117. package/esm/utils/duration.js +93 -0
  118. package/esm/utils/duration.js.map +1 -0
  119. package/esm/utils/index.d.ts +3 -0
  120. package/esm/utils/index.d.ts.map +1 -0
  121. package/package.json +12 -9
  122. package/cjs/commands/index.d.ts +0 -2
  123. package/cjs/commands/index.d.ts.map +0 -1
  124. package/cjs/controllers/guest-login.d.ts +0 -3
  125. package/cjs/controllers/guest-login.d.ts.map +0 -1
  126. package/cjs/controllers/guest-login.js +0 -5
  127. package/cjs/controllers/guest-login.js.map +0 -1
  128. package/cjs/controllers/index.d.ts +0 -2
  129. package/cjs/controllers/index.d.ts.map +0 -1
  130. package/cjs/middleware/auth-middleware.d.ts +0 -2
  131. package/cjs/middleware/auth-middleware.d.ts.map +0 -1
  132. package/cjs/models/guest/guest.d.ts +0 -26
  133. package/cjs/models/guest/guest.d.ts.map +0 -1
  134. package/cjs/models/guest/guest.js +0 -39
  135. package/cjs/models/guest/guest.js.map +0 -1
  136. package/cjs/models/guest/index.d.ts +0 -3
  137. package/cjs/models/guest/index.d.ts.map +0 -1
  138. package/cjs/models/guest/migration.d.ts.map +0 -1
  139. package/cjs/models/guest/migration.js +0 -10
  140. package/cjs/models/guest/migration.js.map +0 -1
  141. package/cjs/services/generate-guest-token.d.ts +0 -2
  142. package/cjs/services/generate-guest-token.d.ts.map +0 -1
  143. package/cjs/services/generate-guest-token.js +0 -11
  144. package/cjs/services/generate-guest-token.js.map +0 -1
  145. package/esm/commands/index.d.ts +0 -2
  146. package/esm/commands/index.d.ts.map +0 -1
  147. package/esm/controllers/guest-login.d.ts +0 -3
  148. package/esm/controllers/guest-login.d.ts.map +0 -1
  149. package/esm/controllers/guest-login.js +0 -5
  150. package/esm/controllers/guest-login.js.map +0 -1
  151. package/esm/controllers/index.d.ts +0 -2
  152. package/esm/controllers/index.d.ts.map +0 -1
  153. package/esm/middleware/auth-middleware.d.ts +0 -2
  154. package/esm/middleware/auth-middleware.d.ts.map +0 -1
  155. package/esm/models/guest/guest.d.ts +0 -26
  156. package/esm/models/guest/guest.d.ts.map +0 -1
  157. package/esm/models/guest/guest.js +0 -39
  158. package/esm/models/guest/guest.js.map +0 -1
  159. package/esm/models/guest/index.d.ts +0 -3
  160. package/esm/models/guest/index.d.ts.map +0 -1
  161. package/esm/models/guest/migration.d.ts.map +0 -1
  162. package/esm/models/guest/migration.js +0 -10
  163. package/esm/models/guest/migration.js.map +0 -1
  164. package/esm/services/generate-guest-token.d.ts +0 -2
  165. package/esm/services/generate-guest-token.d.ts.map +0 -1
  166. package/esm/services/generate-guest-token.js +0 -11
  167. package/esm/services/generate-guest-token.js.map +0 -1
  168. /package/cjs/models/{guest → refresh-token}/migration.d.ts +0 -0
  169. /package/esm/models/{guest → refresh-token}/migration.d.ts +0 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Register the auth:cleanup CLI command
3
+ *
4
+ * @example
5
+ * ```bash
6
+ * warlock auth:cleanup
7
+ * ```
8
+ */
9
+ export declare function registerAuthCleanupCommand(): any;
10
+ //# sourceMappingURL=auth-cleanup-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-cleanup-command.d.ts","sourceRoot":"","sources":["../../src/commands/auth-cleanup-command.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,QAqBzC"}
@@ -0,0 +1,29 @@
1
+ 'use strict';var copper=require('@mongez/copper'),core=require('@warlock.js/core'),auth_service=require('../services/auth.service.js');/**
2
+ * Register the auth:cleanup CLI command
3
+ *
4
+ * @example
5
+ * ```bash
6
+ * warlock auth:cleanup
7
+ * ```
8
+ */
9
+ function registerAuthCleanupCommand() {
10
+ return core.command({
11
+ name: "auth.cleanup",
12
+ description: "Remove expired refresh tokens from the database",
13
+ preload: {
14
+ env: true,
15
+ config: ["auth", "database"],
16
+ connectors: ["database"],
17
+ },
18
+ action: async () => {
19
+ console.log(copper.colors.cyan("🧹 Cleaning up expired tokens..."));
20
+ const count = await auth_service.authService.cleanupExpiredTokens();
21
+ if (count === 0) {
22
+ console.log(copper.colors.green("✅ No expired tokens found."));
23
+ }
24
+ else {
25
+ console.log(copper.colors.green(`✅ Removed ${count} expired token(s).`));
26
+ }
27
+ },
28
+ });
29
+ }exports.registerAuthCleanupCommand=registerAuthCleanupCommand;//# sourceMappingURL=auth-cleanup-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-cleanup-command.js","sources":["../../src/commands/auth-cleanup-command.ts"],"sourcesContent":[null],"names":["command","colors","authService"],"mappings":"uIAIA;;;;;;;AAOG;SACa,0BAA0B,GAAA;AACxC,IAAA,OAAOA,YAAO,CAAC;AACb,QAAA,IAAI,EAAE,cAAc;AACpB,QAAA,WAAW,EAAE,iDAAiD;AAC9D,QAAA,OAAO,EAAE;AACP,YAAA,GAAG,EAAE,IAAI;AACT,YAAA,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;YAC5B,UAAU,EAAE,CAAC,UAAU,CAAC;AACzB,SAAA;QACD,MAAM,EAAE,YAAW;YACjB,OAAO,CAAC,GAAG,CAACC,aAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;AAE7D,YAAA,MAAM,KAAK,GAAG,MAAMC,wBAAW,CAAC,oBAAoB,EAAE,CAAC;YAEvD,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,OAAO,CAAC,GAAG,CAACD,aAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;AACzD,aAAA;AAAM,iBAAA;AACL,gBAAA,OAAO,CAAC,GAAG,CAACA,aAAM,CAAC,KAAK,CAAC,CAAA,UAAA,EAAa,KAAK,CAAA,kBAAA,CAAoB,CAAC,CAAC,CAAC;AACnE,aAAA;SACF;AACF,KAAA,CAAC,CAAC;AACL"}
@@ -1 +1 @@
1
- {"version":3,"file":"jwt-secret-generator-command.d.ts","sourceRoot":"","sources":["../../src/commands/jwt-secret-generator-command.ts"],"names":[],"mappings":"AAGA,wBAAgB,iCAAiC,QAEhD"}
1
+ {"version":3,"file":"jwt-secret-generator-command.d.ts","sourceRoot":"","sources":["../../src/commands/jwt-secret-generator-command.ts"],"names":[],"mappings":"AAGA,wBAAgB,iCAAiC,QAMhD"}
@@ -1,3 +1,7 @@
1
1
  'use strict';var core=require('@warlock.js/core'),generateJwtSecret=require('../services/generate-jwt-secret.js');function registerJWTSecretGeneratorCommand() {
2
- return core.command("jwt.generate").action(generateJwtSecret.generateJWTSecret);
2
+ return core.command({
3
+ name: "jwt.generate",
4
+ description: "Generate JWT Secret key in .env file",
5
+ action: generateJwtSecret.generateJWTSecret,
6
+ });
3
7
  }exports.registerJWTSecretGeneratorCommand=registerJWTSecretGeneratorCommand;//# sourceMappingURL=jwt-secret-generator-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt-secret-generator-command.js","sources":["../../src/commands/jwt-secret-generator-command.ts"],"sourcesContent":[null],"names":["command","generateJWTSecret"],"mappings":"2HAGgB,iCAAiC,GAAA;IAC/C,OAAOA,YAAO,CAAC,cAAc,CAAC,CAAC,MAAM,CAACC,mCAAiB,CAAC,CAAC;AAC3D"}
1
+ {"version":3,"file":"jwt-secret-generator-command.js","sources":["../../src/commands/jwt-secret-generator-command.ts"],"sourcesContent":[null],"names":["command","generateJWTSecret"],"mappings":"2HAGgB,iCAAiC,GAAA;AAC/C,IAAA,OAAOA,YAAO,CAAC;AACb,QAAA,IAAI,EAAE,cAAc;AACpB,QAAA,WAAW,EAAE,sCAAsC;AACnD,QAAA,MAAM,EAAEC,mCAAiB;AAC1B,KAAA,CAAC,CAAC;AACL"}
@@ -1,5 +1,26 @@
1
1
  import { type Algorithm } from "fast-jwt";
2
2
  import type { Auth } from "../models/auth";
3
+ import type { Duration, ExpiresIn } from "../utils/duration";
4
+ /**
5
+ * Symbol to indicate no expiration for tokens
6
+ * Use this when you explicitly want tokens to never expire
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // src/config/auth.ts
11
+ * import { NO_EXPIRATION, type AuthConfigurations } from "@warlock.js/auth";
12
+ *
13
+ * const authConfigurations: AuthConfigurations = {
14
+ * jwt: {
15
+ * secret: env("JWT_SECRET"),
16
+ * expiresIn: NO_EXPIRATION, // Token never expires
17
+ * },
18
+ * };
19
+ *
20
+ * export default authConfigurations;
21
+ * ```
22
+ */
23
+ export declare const NO_EXPIRATION: unique symbol;
3
24
  export type AuthConfigurations = {
4
25
  /**
5
26
  * Define all user types
@@ -12,11 +33,50 @@ export type AuthConfigurations = {
12
33
  * JWT configurations
13
34
  */
14
35
  jwt: {
36
+ /**
37
+ * JWT secret key for signing access tokens
38
+ */
15
39
  secret: string;
40
+ /**
41
+ * JWT algorithm
42
+ * @default "HS256"
43
+ */
16
44
  algorithm?: Algorithm;
45
+ /**
46
+ * Access token expiration time
47
+ * Supports Duration object, string format, or NO_EXPIRATION
48
+ * @example { hours: 1 }, { days: 7, hours: 12 }, "1h", "1d 2h", NO_EXPIRATION
49
+ * @default { hours: 1 }
50
+ */
51
+ expiresIn?: ExpiresIn;
52
+ /**
53
+ * Refresh token configurations
54
+ */
17
55
  refresh?: {
56
+ /**
57
+ * Separate secret for refresh tokens (recommended for security)
58
+ * If not provided, falls back to main JWT secret
59
+ */
18
60
  secret?: string;
19
- expiresIn?: number | string;
61
+ /**
62
+ * Refresh token expiration time
63
+ * Supports Duration object or string format
64
+ * @example { days: 7 }, { weeks: 1 }, "7d", "1w"
65
+ * @default { days: 7 }
66
+ */
67
+ expiresIn?: Duration | string | number;
68
+ /**
69
+ * Enable token rotation (issue new refresh token on each use)
70
+ * Old refresh token is invalidated after use
71
+ * @default true
72
+ */
73
+ rotation?: boolean;
74
+ /**
75
+ * Maximum number of active refresh tokens per user
76
+ * When exceeded, oldest tokens are revoked
77
+ * @default 5
78
+ */
79
+ maxPerUser?: number;
20
80
  };
21
81
  };
22
82
  /**
@@ -32,4 +92,43 @@ export type AuthConfigurations = {
32
92
  salt?: number;
33
93
  };
34
94
  };
95
+ /**
96
+ * Token pair returned after login or token refresh
97
+ */
98
+ export type TokenPair = {
99
+ /**
100
+ * JWT access token (short-lived)
101
+ */
102
+ accessToken: string;
103
+ /**
104
+ * JWT refresh token (long-lived)
105
+ */
106
+ refreshToken: string;
107
+ /**
108
+ * Access token expiration time in seconds or time string
109
+ */
110
+ expiresIn: number | string;
111
+ };
112
+ /**
113
+ * Device information for session tracking
114
+ */
115
+ export type DeviceInfo = {
116
+ /**
117
+ * User agent string from request
118
+ */
119
+ userAgent?: string;
120
+ /**
121
+ * Client IP address
122
+ */
123
+ ip?: string;
124
+ /**
125
+ * Optional device identifier
126
+ */
127
+ deviceId?: string;
128
+ /**
129
+ * Token family ID (for rotation tracking)
130
+ * @internal
131
+ */
132
+ familyId?: string;
133
+ };
35
134
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,QAAQ,EAAE;QACR,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,IAAI,CAAC;KACjC,CAAC;IACF;;OAEG;IACH,GAAG,EAAE;QACH,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,OAAO,CAAC,EAAE;YACR,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;SAC7B,CAAC;KACH,CAAC;IACF;;OAEG;IACH,QAAQ,CAAC,EAAE;QACT;;;;;WAKG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,eAA0B,CAAC;AAErD,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,QAAQ,EAAE;QACR,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,IAAI,CAAC;KACjC,CAAC;IACF;;OAEG;IACH,GAAG,EAAE;QACH;;WAEG;QACH,MAAM,EAAE,MAAM,CAAC;QACf;;;WAGG;QACH,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB;;;;;WAKG;QACH,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB;;WAEG;QACH,OAAO,CAAC,EAAE;YACR;;;eAGG;YACH,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB;;;;;eAKG;YACH,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;YACvC;;;;eAIG;YACH,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB;;;;eAIG;YACH,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;IACF;;OAEG;IACH,QAAQ,CAAC,EAAE;QACT;;;;;WAKG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC"}
@@ -0,0 +1,20 @@
1
+ 'use strict';/**
2
+ * Symbol to indicate no expiration for tokens
3
+ * Use this when you explicitly want tokens to never expire
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * // src/config/auth.ts
8
+ * import { NO_EXPIRATION, type AuthConfigurations } from "@warlock.js/auth";
9
+ *
10
+ * const authConfigurations: AuthConfigurations = {
11
+ * jwt: {
12
+ * secret: env("JWT_SECRET"),
13
+ * expiresIn: NO_EXPIRATION, // Token never expires
14
+ * },
15
+ * };
16
+ *
17
+ * export default authConfigurations;
18
+ * ```
19
+ */
20
+ const NO_EXPIRATION = Symbol("NO_EXPIRATION");exports.NO_EXPIRATION=NO_EXPIRATION;//# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../src/contracts/types.ts"],"sourcesContent":[null],"names":[],"mappings":"aAIA;;;;;;;;;;;;;;;;;;AAkBG;MACU,aAAa,GAAG,MAAM,CAAC,eAAe"}
package/cjs/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
+ export * from "./commands/auth-cleanup-command";
1
2
  export * from "./commands/jwt-secret-generator-command";
2
3
  export * from "./contracts";
3
- export * from "./controllers";
4
4
  export * from "./middleware";
5
5
  export * from "./models";
6
6
  export * from "./services";
7
+ export * from "./utils";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAC;AACxD,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
package/cjs/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';var jwtSecretGeneratorCommand=require('./commands/jwt-secret-generator-command.js'),guestLogin=require('./controllers/guest-login.js'),auth_middleware=require('./middleware/auth.middleware.js'),accessToken=require('./models/access-token/access-token.js');require('./models/access-token/migration.js');var auth=require('./models/auth.js'),castPassword=require('./models/casts/cast-password.js'),guest=require('./models/guest/guest.js');require('./models/guest/migration.js');var generateGuestToken=require('./services/generate-guest-token.js'),generateJwtSecret=require('./services/generate-jwt-secret.js'),jwt=require('./services/jwt.js');exports.registerJWTSecretGeneratorCommand=jwtSecretGeneratorCommand.registerJWTSecretGeneratorCommand;exports.guestLogin=guestLogin.guestLogin;exports.authMiddleware=auth_middleware.authMiddleware;exports.AccessToken=accessToken.AccessToken;exports.Auth=auth.Auth;exports.castPassword=castPassword.castPassword;exports.Guest=guest.Guest;exports.generateGuestToken=generateGuestToken.generateGuestToken;exports.generateJWTSecret=generateJwtSecret.generateJWTSecret;exports.jwt=jwt.jwt;//# sourceMappingURL=index.js.map
1
+ 'use strict';var authCleanupCommand=require('./commands/auth-cleanup-command.js'),jwtSecretGeneratorCommand=require('./commands/jwt-secret-generator-command.js'),types=require('./contracts/types.js'),auth_middleware=require('./middleware/auth.middleware.js'),accessToken=require('./models/access-token/access-token.js');require('./models/access-token/migration.js');var auth=require('./models/auth.js'),castPassword=require('./models/casts/cast-password.js'),refreshToken=require('./models/refresh-token/refresh-token.js'),authEvents=require('./services/auth-events.js'),auth_service=require('./services/auth.service.js'),generateJwtSecret=require('./services/generate-jwt-secret.js'),jwt=require('./services/jwt.js'),authErrorCodes=require('./utils/auth-error-codes.js'),duration=require('./utils/duration.js');exports.registerAuthCleanupCommand=authCleanupCommand.registerAuthCleanupCommand;exports.registerJWTSecretGeneratorCommand=jwtSecretGeneratorCommand.registerJWTSecretGeneratorCommand;exports.NO_EXPIRATION=types.NO_EXPIRATION;exports.authMiddleware=auth_middleware.authMiddleware;exports.AccessToken=accessToken.AccessToken;exports.Auth=auth.Auth;exports.castPassword=castPassword.castPassword;exports.RefreshToken=refreshToken.RefreshToken;exports.authEvents=authEvents.authEvents;exports.authService=auth_service.authService;exports.generateJWTSecret=generateJwtSecret.generateJWTSecret;exports.jwt=jwt.jwt;Object.defineProperty(exports,'AuthErrorCodes',{enumerable:true,get:function(){return authErrorCodes.AuthErrorCodes}});exports.parseExpirationToMs=duration.parseExpirationToMs;exports.toJwtExpiresIn=duration.toJwtExpiresIn;//# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.middleware.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,cAqHjE"}
1
+ {"version":3,"file":"auth.middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.middleware.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,cAuFjE"}
@@ -1,4 +1,4 @@
1
- 'use strict';var config=require('@mongez/config'),logger=require('@warlock.js/logger'),accessToken=require('../models/access-token/access-token.js');require('../models/access-token/migration.js');var jwt=require('../services/jwt.js');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var config__default=/*#__PURE__*/_interopDefault(config);function authMiddleware(allowedUserType) {
1
+ 'use strict';var core=require('@warlock.js/core'),logger=require('@warlock.js/logger'),accessToken=require('../models/access-token/access-token.js');require('../models/access-token/migration.js');var jwt=require('../services/jwt.js'),authErrorCodes=require('../utils/auth-error-codes.js');function authMiddleware(allowedUserType) {
2
2
  const allowedTypes = !allowedUserType
3
3
  ? []
4
4
  : Array.isArray(allowedUserType)
@@ -11,20 +11,22 @@
11
11
  return;
12
12
  if (!authorizationValue) {
13
13
  return response.unauthorized({
14
- // TODO: translate this message
15
- error: "Unauthorized: Access Token is missing",
14
+ error: core.t("auth.errors.missingAccessToken"),
15
+ errorCode: authErrorCodes.AuthErrorCodes.MissingAccessToken,
16
16
  });
17
17
  }
18
18
  // get current user jwt
19
19
  const user = await jwt.jwt.verify(authorizationValue);
20
+ // store decoded access token object in request object
21
+ request.decodedAccessToken = user;
20
22
  // use our own jwt verify to verify the token
21
23
  const accessToken$1 = await accessToken.AccessToken.first({
22
24
  token: authorizationValue,
23
25
  });
24
26
  if (!accessToken$1) {
25
27
  return response.unauthorized({
26
- // TODO: translate this message
27
- error: "Unauthorized: Invalid Access Token",
28
+ error: core.t("auth.errors.invalidAccessToken"),
29
+ errorCode: authErrorCodes.AuthErrorCodes.InvalidAccessToken,
28
30
  });
29
31
  }
30
32
  // now, we need to get an instance of user using its corresponding model
@@ -32,14 +34,13 @@
32
34
  // check if the user type is allowed
33
35
  if (allowedTypes.length && !allowedTypes.includes(userType)) {
34
36
  return response.unauthorized({
35
- // TODO: translate this message
36
- error: "You are not allowed to access this resource",
37
+ error: core.t("auth.errors.unauthorized"),
38
+ errorCode: authErrorCodes.AuthErrorCodes.Unauthorized,
37
39
  });
38
40
  }
39
41
  // get user model class
40
- const UserModel = config__default.default.get(`auth.userType.${userType}`);
42
+ const UserModel = core.config.key(`auth.userType.${userType}`);
41
43
  if (!UserModel) {
42
- // TODO: translate this message
43
44
  throw new Error(`User type ${userType} is unknown type.`);
44
45
  }
45
46
  // get user model instance
@@ -47,8 +48,8 @@
47
48
  if (!currentUser) {
48
49
  accessToken$1.destroy();
49
50
  return response.unauthorized({
50
- // TODO: translate this message
51
- error: "Unauthorized: Invalid Access Token",
51
+ error: core.t("auth.errors.invalidAccessToken"),
52
+ errorCode: authErrorCodes.AuthErrorCodes.InvalidAccessToken,
52
53
  });
53
54
  }
54
55
  // update last access
@@ -63,34 +64,10 @@
63
64
  // unset current user
64
65
  request.clearCurrentUser();
65
66
  return response.unauthorized({
66
- // TODO: translate this message
67
- error: "Unauthorized: Invalid Access Token",
67
+ error: core.t("auth.errors.invalidAccessToken"),
68
+ errorCode: authErrorCodes.AuthErrorCodes.InvalidAccessToken,
68
69
  });
69
70
  }
70
71
  };
71
- if (allowedUserType) {
72
- const userAccessTokenKey = `${allowedUserType}AccessToken`;
73
- const userAccessTokenKeyNameHeader = `${allowedUserType}AccessTokenHeader`;
74
- auth.postman = {
75
- onCollectingVariables(variables) {
76
- if (variables.find(variable => variable.key === userAccessTokenKeyNameHeader))
77
- return;
78
- variables.push({
79
- key: userAccessTokenKey,
80
- value: "YOUR_TOKEN_HERE",
81
- });
82
- variables.push({
83
- key: userAccessTokenKeyNameHeader,
84
- value: `Bearer {{${userAccessTokenKey}}}`,
85
- });
86
- },
87
- onAddingRequest({ request }) {
88
- request.header.push({
89
- key: "Authorization",
90
- value: `{{${userAccessTokenKeyNameHeader}}}`,
91
- });
92
- },
93
- };
94
- }
95
72
  return auth;
96
73
  }exports.authMiddleware=authMiddleware;//# sourceMappingURL=auth.middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.middleware.js","sources":["../../src/middleware/auth.middleware.ts"],"sourcesContent":[null],"names":["jwt","accessToken","AccessToken","config","log"],"mappings":"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"}
1
+ {"version":3,"file":"auth.middleware.js","sources":["../../src/middleware/auth.middleware.ts"],"sourcesContent":[null],"names":["t","AuthErrorCodes","jwt","accessToken","AccessToken","config","log"],"mappings":"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"}
@@ -1,18 +1,40 @@
1
1
  import type { ChildModel } from "@warlock.js/cascade";
2
2
  import { Model } from "@warlock.js/cascade";
3
+ import type { DeviceInfo, TokenPair } from "../contracts/types";
4
+ import type { RefreshToken } from "./refresh-token/refresh-token";
3
5
  export declare abstract class Auth extends Model {
4
6
  /**
5
7
  * Get user type
6
8
  */
7
9
  abstract get userType(): string;
8
10
  /**
9
- * Generate jwt token
11
+ * Get access token payload
12
+ */
13
+ accessTokenPayload(): any;
14
+ /**
15
+ * Create both access and refresh tokens
16
+ */
17
+ createTokenPair(deviceInfo?: DeviceInfo): Promise<TokenPair>;
18
+ /**
19
+ * Generate access token
10
20
  */
11
21
  generateAccessToken(data?: any): Promise<string>;
22
+ /**
23
+ * Generate refresh token
24
+ */
25
+ generateRefreshToken(deviceInfo?: DeviceInfo): Promise<RefreshToken>;
12
26
  /**
13
27
  * Remove current access token
14
28
  */
15
29
  removeAccessToken(token: string): Promise<void>;
30
+ /**
31
+ * Revoke all tokens (logout from all devices)
32
+ */
33
+ revokeAllTokens(): Promise<void>;
34
+ /**
35
+ * Get active sessions
36
+ */
37
+ activeSessions(): Promise<RefreshToken[]>;
16
38
  /**
17
39
  * Attempt to login the user
18
40
  */
@@ -20,6 +42,6 @@ export declare abstract class Auth extends Model {
20
42
  /**
21
43
  * Confirm password
22
44
  */
23
- confirmPassword(password: string): any;
45
+ confirmPassword(password: string): boolean;
24
46
  }
25
47
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/models/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAI5C,8BAAsB,IAAK,SAAQ,KAAK;IACtC;;OAEG;IACH,aAAoB,QAAQ,IAAI,MAAM,CAAC;IAEvC;;OAEG;IACU,mBAAmB,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B7D;;OAEG;IACU,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAO5C;;OAEG;WACiB,OAAO,CAAC,CAAC,EAC3B,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EACnB,IAAI,EAAE,GAAG,GACR,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAkBpB;;OAEG;IACI,eAAe,CAAC,QAAQ,EAAE,MAAM;CAGxC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/models/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,8BAAsB,IAAK,SAAQ,KAAK;IACtC;;OAEG;IACH,aAAoB,QAAQ,IAAI,MAAM,CAAC;IAEvC;;OAEG;IACI,kBAAkB;IAMzB;;OAEG;IACU,eAAe,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAIzE;;OAEG;IACU,mBAAmB,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7D;;OAEG;IACU,oBAAoB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAIjF;;OAEG;IACU,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7C;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAItD;;OAEG;WACiB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAIjF;;OAEG;IACI,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAGlD"}
@@ -1,59 +1,58 @@
1
- 'use strict';var password=require('@mongez/password'),cascade=require('@warlock.js/cascade'),jwt=require('../services/jwt.js'),accessToken=require('./access-token/access-token.js');require('./access-token/migration.js');class Auth extends cascade.Model {
1
+ 'use strict';var cascade=require('@warlock.js/cascade');require('@mongez/events');var auth_service=require('../services/auth.service.js');require('@mongez/fs'),require('@mongez/reinforcements'),require('@warlock.js/core'),require('@warlock.js/logger'),require('fast-jwt');class Auth extends cascade.Model {
2
2
  /**
3
- * Generate jwt token
3
+ * Get access token payload
4
+ */
5
+ accessTokenPayload() {
6
+ // Dynamically import to avoid circular dependency
7
+ const { authService } = require("../services/auth.service");
8
+ return authService.buildAccessTokenPayload(this);
9
+ }
10
+ /**
11
+ * Create both access and refresh tokens
12
+ */
13
+ async createTokenPair(deviceInfo) {
14
+ return auth_service.authService.createTokenPair(this, deviceInfo);
15
+ }
16
+ /**
17
+ * Generate access token
4
18
  */
5
19
  async generateAccessToken(data) {
6
- // store the main data in the data object
7
- // we need to store the user data in an object
8
- // that we'll sue to generate the token
9
- // and also it will be saved in the Access Token model under `user` column
10
- if (!data) {
11
- data = {
12
- ...this.only(["id", "_id"]),
13
- userType: this.userType,
14
- createdAt: Date.now(),
15
- };
16
- }
17
- // use our own jwt generator to generate a token for the guest
18
- const token = await jwt.jwt.generate(data);
19
- // store token and the auth model data in the access token model
20
- // note that we didn't make it sync because we don't want to wait for the token to be stored in the database
21
- // as nothing depends on it
22
- accessToken.AccessToken.create({
23
- token,
24
- user: data,
25
- });
26
- return token;
20
+ return auth_service.authService.generateAccessToken(this, data);
21
+ }
22
+ /**
23
+ * Generate refresh token
24
+ */
25
+ async generateRefreshToken(deviceInfo) {
26
+ return auth_service.authService.createRefreshToken(this, deviceInfo);
27
27
  }
28
28
  /**
29
29
  * Remove current access token
30
30
  */
31
31
  async removeAccessToken(token) {
32
- accessToken.AccessToken.delete({
33
- token: token,
34
- "user.id": this.id,
35
- });
32
+ return auth_service.authService.removeAccessToken(this, token);
33
+ }
34
+ /**
35
+ * Revoke all tokens (logout from all devices)
36
+ */
37
+ async revokeAllTokens() {
38
+ return auth_service.authService.revokeAllTokens(this);
39
+ }
40
+ /**
41
+ * Get active sessions
42
+ */
43
+ async activeSessions() {
44
+ return auth_service.authService.getActiveSessions(this);
36
45
  }
37
46
  /**
38
47
  * Attempt to login the user
39
48
  */
40
49
  static async attempt(data) {
41
- // find first user with the given data, but exclude from it the password
42
- const { password, ...otherData } = data;
43
- const user = (await this.first(otherData));
44
- if (!user) {
45
- return null;
46
- }
47
- // now verify the password
48
- if (!user.confirmPassword(password)) {
49
- return null;
50
- }
51
- return user;
50
+ return auth_service.authService.attemptLogin(this, data);
52
51
  }
53
52
  /**
54
53
  * Confirm password
55
54
  */
56
- confirmPassword(password$1) {
57
- return password.verify(String(this.get("password")), String(password$1));
55
+ confirmPassword(password) {
56
+ return auth_service.authService.verifyPassword(this.get("password"), password);
58
57
  }
59
58
  }exports.Auth=Auth;//# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sources":["../../src/models/auth.ts"],"sourcesContent":[null],"names":["Model","jwt","AccessToken","password","verify"],"mappings":"4NAMM,MAAgB,IAAK,SAAQA,aAAK,CAAA;AAMtC;;AAEG;IACI,MAAM,mBAAmB,CAAC,IAAU,EAAA;;;;;QAKzC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,IAAI,GAAG;gBACL,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,gBAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;AACH,SAAA;;QAGD,MAAM,KAAK,GAAG,MAAMC,OAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;;;;QAKvCC,uBAAW,CAAC,MAAM,CAAC;YACjB,KAAK;AACL,YAAA,IAAI,EAAE,IAAI;AACX,SAAA,CAAC,CAAC;AAEH,QAAA,OAAO,KAAK,CAAC;KACd;AAED;;AAEG;IACI,MAAM,iBAAiB,CAAC,KAAa,EAAA;QAC1CA,uBAAW,CAAC,MAAM,CAAC;AACjB,YAAA,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,IAAI,CAAC,EAAE;AACnB,SAAA,CAAC,CAAC;KACJ;AAED;;AAEG;AACI,IAAA,aAAa,OAAO,CAEzB,IAAS,EAAA;;QAGT,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC;QAExC,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC,KAAK,CAAI,SAAS,CAAC,CAAgB,CAAC;QAE7D,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;;AAGD,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE;AACnC,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AAED,QAAA,OAAO,IAAS,CAAC;KAClB;AAED;;AAEG;AACI,IAAA,eAAe,CAACC,UAAgB,EAAA;AACrC,QAAA,OAAOC,eAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAACD,UAAQ,CAAC,CAAC,CAAC;KAC/D;AACF"}
1
+ {"version":3,"file":"auth.js","sources":["../../src/models/auth.ts"],"sourcesContent":[null],"names":["Model","authService"],"mappings":"gRAMM,MAAgB,IAAK,SAAQA,aAAK,CAAA;AAMtC;;AAEG;IACI,kBAAkB,GAAA;;QAEvB,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;AAC5D,QAAA,OAAO,WAAW,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;KAClD;AAED;;AAEG;IACI,MAAM,eAAe,CAAC,UAAuB,EAAA;QAClD,OAAOC,wBAAW,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;KACtD;AAED;;AAEG;IACI,MAAM,mBAAmB,CAAC,IAAU,EAAA;QACzC,OAAOA,wBAAW,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACpD;AAED;;AAEG;IACI,MAAM,oBAAoB,CAAC,UAAuB,EAAA;QACvD,OAAOA,wBAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;KACzD;AAED;;AAEG;IACI,MAAM,iBAAiB,CAAC,KAAa,EAAA;QAC1C,OAAOA,wBAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACnD;AAED;;AAEG;AACI,IAAA,MAAM,eAAe,GAAA;AAC1B,QAAA,OAAOA,wBAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KAC1C;AAED;;AAEG;AACI,IAAA,MAAM,cAAc,GAAA;AACzB,QAAA,OAAOA,wBAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;KAC5C;AAED;;AAEG;AACI,IAAA,aAAa,OAAO,CAAyB,IAAS,EAAA;QAC3D,OAAOA,wBAAW,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KAC7C;AAED;;AAEG;AACI,IAAA,eAAe,CAAC,QAAgB,EAAA;AACrC,QAAA,OAAOA,wBAAW,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;KACnE;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"cast-password.d.ts","sourceRoot":"","sources":["../../../src/models/casts/cast-password.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,OAIpE"}
1
+ {"version":3,"file":"cast-password.d.ts","sourceRoot":"","sources":["../../../src/models/casts/cast-password.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAGjD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,OAIpE"}
@@ -1,9 +1,9 @@
1
- 'use strict';var config=require('@mongez/config'),password=require('@mongez/password');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var config__default=/*#__PURE__*/_interopDefault(config);/**
1
+ 'use strict';var password=require('@mongez/password'),core=require('@warlock.js/core');/**
2
2
  * Cast password on model save
3
3
  * If the password is not changed, keep it as is
4
4
  */
5
5
  function castPassword(value, column, model) {
6
6
  return value
7
- ? password.hash(String(value), config__default.default.get("auth.password.salt", 12))
7
+ ? password.hash(String(value), core.config.key("auth.password.salt", 12))
8
8
  : model.getInitial(column);
9
9
  }exports.castPassword=castPassword;//# sourceMappingURL=cast-password.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cast-password.js","sources":["../../../src/models/casts/cast-password.ts"],"sourcesContent":[null],"names":["hash","config"],"mappings":"iNAIA;;;AAGG;SACa,YAAY,CAAC,KAAU,EAAE,MAAc,EAAE,KAAY,EAAA;AACnE,IAAA,OAAO,KAAK;AACV,UAAEA,aAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAEC,uBAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;AAC3D,UAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/B"}
1
+ {"version":3,"file":"cast-password.js","sources":["../../../src/models/casts/cast-password.ts"],"sourcesContent":[null],"names":["hash","config"],"mappings":"uFAIA;;;AAGG;SACa,YAAY,CAAC,KAAU,EAAE,MAAc,EAAE,KAAY,EAAA;AACnE,IAAA,OAAO,KAAK;AACV,UAAEA,aAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAEC,WAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;AAC3D,UAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/B"}
@@ -1,5 +1,5 @@
1
1
  export * from "./access-token";
2
2
  export * from "./auth";
3
3
  export * from "./casts";
4
- export * from "./guest";
4
+ export * from "./refresh-token";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./refresh-token";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/migration.ts"],"names":[],"mappings":";AAGA,wBAeG"}
@@ -0,0 +1,32 @@
1
+ import { Model, type Casts } from "@warlock.js/cascade";
2
+ export declare class RefreshToken extends Model {
3
+ /**
4
+ * {@inheritDoc}
5
+ */
6
+ static collection: string;
7
+ /**
8
+ * {@inheritDoc}
9
+ */
10
+ protected casts: Casts;
11
+ /**
12
+ * Check if token is expired
13
+ */
14
+ get isExpired(): boolean;
15
+ /**
16
+ * Check if token is revoked
17
+ */
18
+ get isRevoked(): boolean;
19
+ /**
20
+ * Check if token is valid (not expired and not revoked)
21
+ */
22
+ get isValid(): boolean;
23
+ /**
24
+ * Revoke this token
25
+ */
26
+ revoke(): Promise<this>;
27
+ /**
28
+ * Mark token as used (update lastUsedAt)
29
+ */
30
+ markAsUsed(): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=refresh-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/refresh-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,YAAa,SAAQ,KAAK;IACrC;;OAEG;IACH,OAAc,UAAU,SAAmB;IAE3C;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,CASpB;IAEF;;OAEG;IACH,IAAW,SAAS,IAAI,OAAO,CAI9B;IAED;;OAEG;IACH,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED;;OAEG;IACH,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGzC"}