@awesome-lang-auth/node 1.10.1

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 (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.detailed.md +4059 -0
  3. package/README.md +248 -0
  4. package/dist/abstract/base-auth-strategy.abstract.d.ts +7 -0
  5. package/dist/abstract/base-auth-strategy.abstract.d.ts.map +1 -0
  6. package/dist/abstract/base-auth-strategy.abstract.js +7 -0
  7. package/dist/abstract/base-auth-strategy.abstract.js.map +1 -0
  8. package/dist/abstract/base-oauth-strategy.abstract.d.ts +27 -0
  9. package/dist/abstract/base-oauth-strategy.abstract.d.ts.map +1 -0
  10. package/dist/abstract/base-oauth-strategy.abstract.js +11 -0
  11. package/dist/abstract/base-oauth-strategy.abstract.js.map +1 -0
  12. package/dist/adapters/express.d.ts +45 -0
  13. package/dist/adapters/express.d.ts.map +1 -0
  14. package/dist/adapters/express.js +49 -0
  15. package/dist/adapters/express.js.map +1 -0
  16. package/dist/adapters/fastify.d.ts +72 -0
  17. package/dist/adapters/fastify.d.ts.map +1 -0
  18. package/dist/adapters/fastify.js +63 -0
  19. package/dist/adapters/fastify.js.map +1 -0
  20. package/dist/auth-configurator.d.ts +65 -0
  21. package/dist/auth-configurator.d.ts.map +1 -0
  22. package/dist/auth-configurator.js +127 -0
  23. package/dist/auth-configurator.js.map +1 -0
  24. package/dist/events/auth-event-bus.d.ts +68 -0
  25. package/dist/events/auth-event-bus.d.ts.map +1 -0
  26. package/dist/events/auth-event-bus.js +60 -0
  27. package/dist/events/auth-event-bus.js.map +1 -0
  28. package/dist/events/auth-event-names.d.ts +34 -0
  29. package/dist/events/auth-event-names.d.ts.map +1 -0
  30. package/dist/events/auth-event-names.js +41 -0
  31. package/dist/events/auth-event-names.js.map +1 -0
  32. package/dist/http-types.d.ts +135 -0
  33. package/dist/http-types.d.ts.map +1 -0
  34. package/dist/http-types.js +18 -0
  35. package/dist/http-types.js.map +1 -0
  36. package/dist/index.d.ts +80 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +88 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/interfaces/api-key-store.interface.d.ts +94 -0
  41. package/dist/interfaces/api-key-store.interface.d.ts.map +1 -0
  42. package/dist/interfaces/api-key-store.interface.js +3 -0
  43. package/dist/interfaces/api-key-store.interface.js.map +1 -0
  44. package/dist/interfaces/auth-strategy.interface.d.ts +6 -0
  45. package/dist/interfaces/auth-strategy.interface.d.ts.map +1 -0
  46. package/dist/interfaces/auth-strategy.interface.js +3 -0
  47. package/dist/interfaces/auth-strategy.interface.js.map +1 -0
  48. package/dist/interfaces/linked-accounts-store.interface.d.ts +74 -0
  49. package/dist/interfaces/linked-accounts-store.interface.d.ts.map +1 -0
  50. package/dist/interfaces/linked-accounts-store.interface.js +3 -0
  51. package/dist/interfaces/linked-accounts-store.interface.js.map +1 -0
  52. package/dist/interfaces/pending-link-store.interface.d.ts +77 -0
  53. package/dist/interfaces/pending-link-store.interface.d.ts.map +1 -0
  54. package/dist/interfaces/pending-link-store.interface.js +3 -0
  55. package/dist/interfaces/pending-link-store.interface.js.map +1 -0
  56. package/dist/interfaces/roles-permissions-store.interface.d.ts +129 -0
  57. package/dist/interfaces/roles-permissions-store.interface.d.ts.map +1 -0
  58. package/dist/interfaces/roles-permissions-store.interface.js +3 -0
  59. package/dist/interfaces/roles-permissions-store.interface.js.map +1 -0
  60. package/dist/interfaces/session-store.interface.d.ts +92 -0
  61. package/dist/interfaces/session-store.interface.d.ts.map +1 -0
  62. package/dist/interfaces/session-store.interface.js +3 -0
  63. package/dist/interfaces/session-store.interface.js.map +1 -0
  64. package/dist/interfaces/settings-store.interface.d.ts +91 -0
  65. package/dist/interfaces/settings-store.interface.d.ts.map +1 -0
  66. package/dist/interfaces/settings-store.interface.js +3 -0
  67. package/dist/interfaces/settings-store.interface.js.map +1 -0
  68. package/dist/interfaces/sse-distributor.interface.d.ts +25 -0
  69. package/dist/interfaces/sse-distributor.interface.d.ts.map +1 -0
  70. package/dist/interfaces/sse-distributor.interface.js +3 -0
  71. package/dist/interfaces/sse-distributor.interface.js.map +1 -0
  72. package/dist/interfaces/telemetry-store.interface.d.ts +72 -0
  73. package/dist/interfaces/telemetry-store.interface.d.ts.map +1 -0
  74. package/dist/interfaces/telemetry-store.interface.js +3 -0
  75. package/dist/interfaces/telemetry-store.interface.js.map +1 -0
  76. package/dist/interfaces/template-store.interface.d.ts +37 -0
  77. package/dist/interfaces/template-store.interface.d.ts.map +1 -0
  78. package/dist/interfaces/template-store.interface.js +3 -0
  79. package/dist/interfaces/template-store.interface.js.map +1 -0
  80. package/dist/interfaces/tenant-store.interface.d.ts +97 -0
  81. package/dist/interfaces/tenant-store.interface.d.ts.map +1 -0
  82. package/dist/interfaces/tenant-store.interface.js +3 -0
  83. package/dist/interfaces/tenant-store.interface.js.map +1 -0
  84. package/dist/interfaces/token-store.interface.d.ts +10 -0
  85. package/dist/interfaces/token-store.interface.d.ts.map +1 -0
  86. package/dist/interfaces/token-store.interface.js +3 -0
  87. package/dist/interfaces/token-store.interface.js.map +1 -0
  88. package/dist/interfaces/user-metadata-store.interface.d.ts +50 -0
  89. package/dist/interfaces/user-metadata-store.interface.d.ts.map +1 -0
  90. package/dist/interfaces/user-metadata-store.interface.js +3 -0
  91. package/dist/interfaces/user-metadata-store.interface.js.map +1 -0
  92. package/dist/interfaces/user-store.interface.d.ts +113 -0
  93. package/dist/interfaces/user-store.interface.d.ts.map +1 -0
  94. package/dist/interfaces/user-store.interface.js +3 -0
  95. package/dist/interfaces/user-store.interface.js.map +1 -0
  96. package/dist/interfaces/webhook-store.interface.d.ts +139 -0
  97. package/dist/interfaces/webhook-store.interface.d.ts.map +1 -0
  98. package/dist/interfaces/webhook-store.interface.js +3 -0
  99. package/dist/interfaces/webhook-store.interface.js.map +1 -0
  100. package/dist/middleware/api-key.middleware.d.ts +35 -0
  101. package/dist/middleware/api-key.middleware.d.ts.map +1 -0
  102. package/dist/middleware/api-key.middleware.js +45 -0
  103. package/dist/middleware/api-key.middleware.js.map +1 -0
  104. package/dist/middleware/auth.middleware.d.ts +13 -0
  105. package/dist/middleware/auth.middleware.d.ts.map +1 -0
  106. package/dist/middleware/auth.middleware.js +55 -0
  107. package/dist/middleware/auth.middleware.js.map +1 -0
  108. package/dist/middleware/jwks-auth.middleware.d.ts +18 -0
  109. package/dist/middleware/jwks-auth.middleware.d.ts.map +1 -0
  110. package/dist/middleware/jwks-auth.middleware.js +77 -0
  111. package/dist/middleware/jwks-auth.middleware.js.map +1 -0
  112. package/dist/models/api-key.model.d.ts +66 -0
  113. package/dist/models/api-key.model.d.ts.map +1 -0
  114. package/dist/models/api-key.model.js +3 -0
  115. package/dist/models/api-key.model.js.map +1 -0
  116. package/dist/models/auth-config.model.d.ts +387 -0
  117. package/dist/models/auth-config.model.d.ts.map +1 -0
  118. package/dist/models/auth-config.model.js +3 -0
  119. package/dist/models/auth-config.model.js.map +1 -0
  120. package/dist/models/errors.d.ts +7 -0
  121. package/dist/models/errors.d.ts.map +1 -0
  122. package/dist/models/errors.js +14 -0
  123. package/dist/models/errors.js.map +1 -0
  124. package/dist/models/session.model.d.ts +28 -0
  125. package/dist/models/session.model.d.ts.map +1 -0
  126. package/dist/models/session.model.js +3 -0
  127. package/dist/models/session.model.js.map +1 -0
  128. package/dist/models/tenant.model.d.ts +20 -0
  129. package/dist/models/tenant.model.d.ts.map +1 -0
  130. package/dist/models/tenant.model.js +3 -0
  131. package/dist/models/tenant.model.js.map +1 -0
  132. package/dist/models/token.model.d.ts +21 -0
  133. package/dist/models/token.model.d.ts.map +1 -0
  134. package/dist/models/token.model.js +3 -0
  135. package/dist/models/token.model.js.map +1 -0
  136. package/dist/models/user.model.d.ts +92 -0
  137. package/dist/models/user.model.d.ts.map +1 -0
  138. package/dist/models/user.model.js +3 -0
  139. package/dist/models/user.model.js.map +1 -0
  140. package/dist/router/admin.router.d.ts +188 -0
  141. package/dist/router/admin.router.d.ts.map +1 -0
  142. package/dist/router/admin.router.js +1507 -0
  143. package/dist/router/admin.router.js.map +1 -0
  144. package/dist/router/auth.router.d.ts +199 -0
  145. package/dist/router/auth.router.d.ts.map +1 -0
  146. package/dist/router/auth.router.js +1636 -0
  147. package/dist/router/auth.router.js.map +1 -0
  148. package/dist/router/openapi.d.ts +98 -0
  149. package/dist/router/openapi.d.ts.map +1 -0
  150. package/dist/router/openapi.js +1518 -0
  151. package/dist/router/openapi.js.map +1 -0
  152. package/dist/router/router-events.d.ts +38 -0
  153. package/dist/router/router-events.d.ts.map +1 -0
  154. package/dist/router/router-events.js +74 -0
  155. package/dist/router/router-events.js.map +1 -0
  156. package/dist/router/tools.router.d.ts +104 -0
  157. package/dist/router/tools.router.d.ts.map +1 -0
  158. package/dist/router/tools.router.js +227 -0
  159. package/dist/router/tools.router.js.map +1 -0
  160. package/dist/router/ui.router.d.ts +49 -0
  161. package/dist/router/ui.router.d.ts.map +1 -0
  162. package/dist/router/ui.router.js +272 -0
  163. package/dist/router/ui.router.js.map +1 -0
  164. package/dist/services/api-key.service.d.ts +53 -0
  165. package/dist/services/api-key.service.d.ts.map +1 -0
  166. package/dist/services/api-key.service.js +66 -0
  167. package/dist/services/api-key.service.js.map +1 -0
  168. package/dist/services/jwks.service.d.ts +73 -0
  169. package/dist/services/jwks.service.d.ts.map +1 -0
  170. package/dist/services/jwks.service.js +174 -0
  171. package/dist/services/jwks.service.js.map +1 -0
  172. package/dist/services/mailer.service.d.ts +30 -0
  173. package/dist/services/mailer.service.d.ts.map +1 -0
  174. package/dist/services/mailer.service.js +248 -0
  175. package/dist/services/mailer.service.js.map +1 -0
  176. package/dist/services/notification.service.d.ts +110 -0
  177. package/dist/services/notification.service.d.ts.map +1 -0
  178. package/dist/services/notification.service.js +79 -0
  179. package/dist/services/notification.service.js.map +1 -0
  180. package/dist/services/password.service.d.ts +5 -0
  181. package/dist/services/password.service.d.ts.map +1 -0
  182. package/dist/services/password.service.js +17 -0
  183. package/dist/services/password.service.js.map +1 -0
  184. package/dist/services/sms.service.d.ts +14 -0
  185. package/dist/services/sms.service.d.ts.map +1 -0
  186. package/dist/services/sms.service.js +51 -0
  187. package/dist/services/sms.service.js.map +1 -0
  188. package/dist/services/token.service.d.ts +62 -0
  189. package/dist/services/token.service.d.ts.map +1 -0
  190. package/dist/services/token.service.js +354 -0
  191. package/dist/services/token.service.js.map +1 -0
  192. package/dist/stores/memory-template.store.d.ts +12 -0
  193. package/dist/stores/memory-template.store.d.ts.map +1 -0
  194. package/dist/stores/memory-template.store.js +35 -0
  195. package/dist/stores/memory-template.store.js.map +1 -0
  196. package/dist/strategies/api-key/api-key.strategy.d.ts +72 -0
  197. package/dist/strategies/api-key/api-key.strategy.d.ts.map +1 -0
  198. package/dist/strategies/api-key/api-key.strategy.js +182 -0
  199. package/dist/strategies/api-key/api-key.strategy.js.map +1 -0
  200. package/dist/strategies/local/local.strategy.d.ts +19 -0
  201. package/dist/strategies/local/local.strategy.d.ts.map +1 -0
  202. package/dist/strategies/local/local.strategy.js +45 -0
  203. package/dist/strategies/local/local.strategy.js.map +1 -0
  204. package/dist/strategies/magic-link/magic-link.strategy.d.ts +8 -0
  205. package/dist/strategies/magic-link/magic-link.strategy.d.ts.map +1 -0
  206. package/dist/strategies/magic-link/magic-link.strategy.js +53 -0
  207. package/dist/strategies/magic-link/magic-link.strategy.js.map +1 -0
  208. package/dist/strategies/oauth/generic-oauth.strategy.d.ts +120 -0
  209. package/dist/strategies/oauth/generic-oauth.strategy.d.ts.map +1 -0
  210. package/dist/strategies/oauth/generic-oauth.strategy.js +88 -0
  211. package/dist/strategies/oauth/generic-oauth.strategy.js.map +1 -0
  212. package/dist/strategies/oauth/github.strategy.d.ts +31 -0
  213. package/dist/strategies/oauth/github.strategy.d.ts.map +1 -0
  214. package/dist/strategies/oauth/github.strategy.js +72 -0
  215. package/dist/strategies/oauth/github.strategy.js.map +1 -0
  216. package/dist/strategies/oauth/google.strategy.d.ts +31 -0
  217. package/dist/strategies/oauth/google.strategy.d.ts.map +1 -0
  218. package/dist/strategies/oauth/google.strategy.js +61 -0
  219. package/dist/strategies/oauth/google.strategy.js.map +1 -0
  220. package/dist/strategies/sms/sms.strategy.d.ts +7 -0
  221. package/dist/strategies/sms/sms.strategy.d.ts.map +1 -0
  222. package/dist/strategies/sms/sms.strategy.js +39 -0
  223. package/dist/strategies/sms/sms.strategy.js.map +1 -0
  224. package/dist/strategies/two-factor/totp.strategy.d.ts +12 -0
  225. package/dist/strategies/two-factor/totp.strategy.d.ts.map +1 -0
  226. package/dist/strategies/two-factor/totp.strategy.js +32 -0
  227. package/dist/strategies/two-factor/totp.strategy.js.map +1 -0
  228. package/dist/tools/auth-tools.d.ts +200 -0
  229. package/dist/tools/auth-tools.d.ts.map +1 -0
  230. package/dist/tools/auth-tools.js +232 -0
  231. package/dist/tools/auth-tools.js.map +1 -0
  232. package/dist/tools/sse-manager.d.ts +118 -0
  233. package/dist/tools/sse-manager.d.ts.map +1 -0
  234. package/dist/tools/sse-manager.js +163 -0
  235. package/dist/tools/sse-manager.js.map +1 -0
  236. package/dist/tools/sse-notify.decorator.d.ts +74 -0
  237. package/dist/tools/sse-notify.decorator.d.ts.map +1 -0
  238. package/dist/tools/sse-notify.decorator.js +78 -0
  239. package/dist/tools/sse-notify.decorator.js.map +1 -0
  240. package/dist/tools/webhook-action.d.ts +130 -0
  241. package/dist/tools/webhook-action.d.ts.map +1 -0
  242. package/dist/tools/webhook-action.js +144 -0
  243. package/dist/tools/webhook-action.js.map +1 -0
  244. package/dist/tools/webhook-sender.d.ts +31 -0
  245. package/dist/tools/webhook-sender.d.ts.map +1 -0
  246. package/dist/tools/webhook-sender.js +80 -0
  247. package/dist/tools/webhook-sender.js.map +1 -0
  248. package/dist/ui-assets/2fa.html +115 -0
  249. package/dist/ui-assets/account-conflict.html +108 -0
  250. package/dist/ui-assets/admin.css +263 -0
  251. package/dist/ui-assets/admin.js +1927 -0
  252. package/dist/ui-assets/auth.js +725 -0
  253. package/dist/ui-assets/base.css +219 -0
  254. package/dist/ui-assets/forgot-password.html +93 -0
  255. package/dist/ui-assets/link-verify.html +74 -0
  256. package/dist/ui-assets/login.html +135 -0
  257. package/dist/ui-assets/magic-link.html +112 -0
  258. package/dist/ui-assets/register.html +122 -0
  259. package/dist/ui-assets/reset-password.html +103 -0
  260. package/dist/ui-assets/ui-i18n-keys.json +78 -0
  261. package/dist/ui-assets/verify-email.html +66 -0
  262. package/package.json +89 -0
@@ -0,0 +1,122 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Register - Awesome Node Auth</title>
8
+ <link rel="stylesheet" href="base.css">
9
+ </head>
10
+
11
+ <body>
12
+ <div class="auth-container">
13
+ <img src="" alt="Logo" class="logo hidden">
14
+ <h1 class="site-name" data-i18n="site_name">Awesome Node Auth</h1>
15
+ <h2 data-i18n="register_title">Create Account</h2>
16
+
17
+ <div id="alert" class="alert hidden"></div>
18
+
19
+ <form id="register-form">
20
+ <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 12px;">
21
+ <div class="form-group">
22
+ <label for="firstName">First Name</label>
23
+ <input type="text" id="firstName" name="firstName" required>
24
+ </div>
25
+ <div class="form-group">
26
+ <label for="lastName">Last Name</label>
27
+ <input type="text" id="lastName" name="lastName" required>
28
+ </div>
29
+ </div>
30
+ <div class="form-group">
31
+ <label for="email" data-i18n="email_label">Email</label>
32
+ <input type="email" id="email" name="email" required data-i18n="email_placeholder">
33
+ </div>
34
+ <div class="form-group">
35
+ <label for="password">Password</label>
36
+ <input type="password" id="password" name="password" required>
37
+ </div>
38
+ <div class="form-group">
39
+ <label for="confirmPassword">Confirm Password</label>
40
+ <input type="password" id="confirmPassword" name="confirmPassword" required>
41
+ </div>
42
+ <button type="submit" id="submit-btn">Register</button>
43
+ </form>
44
+
45
+ <div class="footer-links">
46
+ <p>Already have an account? <a href="login">Login</a></p>
47
+ </div>
48
+ </div>
49
+
50
+ <script src="auth.js?v=2"></script>
51
+ <script>
52
+ document.addEventListener('DOMContentLoaded', async () => {
53
+ await AuthService.init();
54
+
55
+ if (AuthService.user) {
56
+ window.location.href = '/';
57
+ return;
58
+ }
59
+
60
+ const form = document.getElementById('register-form');
61
+ const alert = document.getElementById('alert');
62
+ const submitBtn = document.getElementById('submit-btn');
63
+
64
+ form.addEventListener('submit', async (e) => {
65
+ e.preventDefault();
66
+ alert.className = 'alert hidden';
67
+
68
+ if (form.password.value !== form.confirmPassword.value) {
69
+ alert.textContent = 'Passwords do not match';
70
+ alert.classList.add('alert-error');
71
+ alert.classList.remove('hidden');
72
+ return;
73
+ }
74
+
75
+ submitBtn.disabled = true;
76
+ submitBtn.textContent = 'Creating account...';
77
+
78
+ const payload = {
79
+ email: form.email.value,
80
+ password: form.password.value,
81
+ firstName: form.firstName.value,
82
+ lastName: form.lastName.value
83
+ };
84
+
85
+ try {
86
+ const result = await AuthService.apiCall('/register', 'POST', payload);
87
+
88
+ if (result.success) {
89
+ alert.textContent = 'Registration successful! Redirecting...';
90
+ alert.classList.add('alert-success');
91
+ alert.classList.remove('hidden');
92
+
93
+ // Attempt auto-login if library returns success
94
+ const loginRes = await AuthService.apiCall('/login', 'POST', {
95
+ email: payload.email,
96
+ password: payload.password
97
+ });
98
+
99
+ if (loginRes.success) {
100
+ window.location.href = '/';
101
+ } else {
102
+ window.location.href = 'login?registered=true';
103
+ }
104
+ } else {
105
+ alert.textContent = result.error || 'Registration failed';
106
+ alert.classList.add('alert-error');
107
+ alert.classList.remove('hidden');
108
+ }
109
+ } catch (err) {
110
+ alert.textContent = 'An unexpected error occurred';
111
+ alert.classList.add('alert-error');
112
+ alert.classList.remove('hidden');
113
+ } finally {
114
+ submitBtn.disabled = false;
115
+ submitBtn.textContent = 'Register';
116
+ }
117
+ });
118
+ });
119
+ </script>
120
+ </body>
121
+
122
+ </html>
@@ -0,0 +1,103 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Reset Password - Awesome Node Auth</title>
8
+ <link rel="stylesheet" href="base.css">
9
+ </head>
10
+
11
+ <body>
12
+ <div class="auth-container">
13
+ <img src="" alt="Logo" class="logo hidden">
14
+ <h1 class="site-name" data-i18n="site_name">Awesome Node Auth</h1>
15
+ <h2 data-i18n="reset_password_title">Set New Password</h2>
16
+
17
+ <div id="alert" class="alert hidden"></div>
18
+
19
+ <form id="reset-form">
20
+ <div class="form-group">
21
+ <label for="password" data-i18n="new_password_label">New Password</label>
22
+ <input type="password" id="password" name="password" required data-i18n="new_password_placeholder">
23
+ </div>
24
+ <div class="form-group">
25
+ <label for="confirmPassword" data-i18n="confirm_password_label">Confirm Password</label>
26
+ <input type="password" id="confirmPassword" name="confirmPassword" required data-i18n="confirm_password_placeholder">
27
+ </div>
28
+ <button type="submit" id="submit-btn" data-i18n="save_password_button">Save New Password</button>
29
+ </form>
30
+
31
+ <div id="success-message" class="hidden">
32
+ <div class="alert alert-success" data-i18n="reset_password_success">
33
+ Your password has been successfully reset.
34
+ </div>
35
+ <p class="footer-links">
36
+ <a href="login" data-i18n="proceed_to_login_link">Proceed to login</a>
37
+ </p>
38
+ </div>
39
+ </div>
40
+
41
+ <script src="auth.js?v=2"></script>
42
+ <script>
43
+ document.addEventListener('DOMContentLoaded', async () => {
44
+ await AuthService.init();
45
+
46
+ const urlParams = new URLSearchParams(window.location.search);
47
+ const token = urlParams.get('token');
48
+
49
+ const form = document.getElementById('reset-form');
50
+ const alert = document.getElementById('alert');
51
+ const submitBtn = document.getElementById('submit-btn');
52
+ const successContainer = document.getElementById('success-message');
53
+
54
+ if (!token) {
55
+ alert.textContent = 'Invalid or missing reset token.';
56
+ alert.classList.add('alert-error');
57
+ alert.classList.remove('hidden');
58
+ form.classList.add('hidden');
59
+ return;
60
+ }
61
+
62
+ form.addEventListener('submit', async (e) => {
63
+ e.preventDefault();
64
+ alert.className = 'alert hidden';
65
+
66
+ if (form.password.value !== form.confirmPassword.value) {
67
+ alert.textContent = 'Passwords do not match';
68
+ alert.classList.add('alert-error');
69
+ alert.classList.remove('hidden');
70
+ return;
71
+ }
72
+
73
+ submitBtn.disabled = true;
74
+ submitBtn.textContent = 'Saving...';
75
+
76
+ try {
77
+ const result = await AuthService.apiCall('/reset-password', 'POST', {
78
+ password: form.password.value,
79
+ token
80
+ });
81
+
82
+ if (result.success) {
83
+ form.classList.add('hidden');
84
+ successContainer.classList.remove('hidden');
85
+ } else {
86
+ alert.textContent = result.error || 'Failed to reset password';
87
+ alert.classList.add('alert-error');
88
+ alert.classList.remove('hidden');
89
+ }
90
+ } catch (err) {
91
+ alert.textContent = 'An unexpected error occurred';
92
+ alert.classList.add('alert-error');
93
+ alert.classList.remove('hidden');
94
+ } finally {
95
+ submitBtn.disabled = false;
96
+ submitBtn.textContent = 'Save New Password';
97
+ }
98
+ });
99
+ });
100
+ </script>
101
+ </body>
102
+
103
+ </html>
@@ -0,0 +1,78 @@
1
+ {
2
+ "2fa": [
3
+ "site_name",
4
+ "two_fa_code_label",
5
+ "two_fa_code_placeholder",
6
+ "two_fa_setup_instruction",
7
+ "two_fa_title",
8
+ "verify_code_button"
9
+ ],
10
+ "account-conflict": [
11
+ "account_linking_instruction",
12
+ "account_linking_title",
13
+ "send_verification_email_button",
14
+ "site_name"
15
+ ],
16
+ "forgot-password": [
17
+ "email_label",
18
+ "email_placeholder",
19
+ "forgot_password_instruction",
20
+ "forgot_password_success",
21
+ "forgot_password_title",
22
+ "login_link",
23
+ "remember_password_text",
24
+ "return_to_login_link",
25
+ "send_reset_link_button",
26
+ "site_name"
27
+ ],
28
+ "link-verify": [
29
+ "account_linking_loading",
30
+ "account_linking_title",
31
+ "go_to_login_link",
32
+ "site_name"
33
+ ],
34
+ "login": [
35
+ "email_label",
36
+ "email_placeholder",
37
+ "forgot_password_link",
38
+ "login_button",
39
+ "login_title",
40
+ "no_account_text",
41
+ "password_label",
42
+ "password_placeholder",
43
+ "signup_link",
44
+ "site_name",
45
+ "social_divider"
46
+ ],
47
+ "magic-link": [
48
+ "email_label",
49
+ "email_placeholder",
50
+ "magic_link_instruction",
51
+ "magic_link_title",
52
+ "send_magic_link_button",
53
+ "site_name"
54
+ ],
55
+ "register": [
56
+ "email_label",
57
+ "email_placeholder",
58
+ "register_title",
59
+ "site_name"
60
+ ],
61
+ "reset-password": [
62
+ "confirm_password_label",
63
+ "confirm_password_placeholder",
64
+ "new_password_label",
65
+ "new_password_placeholder",
66
+ "proceed_to_login_link",
67
+ "reset_password_success",
68
+ "reset_password_title",
69
+ "save_password_button",
70
+ "site_name"
71
+ ],
72
+ "verify-email": [
73
+ "go_to_login_link",
74
+ "site_name",
75
+ "verify_email_loading",
76
+ "verify_email_title"
77
+ ]
78
+ }
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Verify Email - Awesome Node Auth</title>
8
+ <link rel="stylesheet" href="base.css">
9
+ </head>
10
+
11
+ <body>
12
+ <div class="auth-container">
13
+ <img src="" alt="Logo" class="logo hidden">
14
+ <h1 class="site-name" data-i18n="site_name">Awesome Node Auth</h1>
15
+ <h2 data-i18n="verify_email_title">Email Verification</h2>
16
+
17
+ <div id="alert" class="alert hidden"></div>
18
+
19
+ <div id="loading" class="footer-links" data-i18n="verify_email_loading">
20
+ Verifying your email address, please wait...
21
+ </div>
22
+
23
+ <div class="footer-links">
24
+ <a href="login" data-i18n="go_to_login_link">Go to login</a>
25
+ </div>
26
+ </div>
27
+
28
+ <script src="auth.js?v=2"></script>
29
+ <script>
30
+ document.addEventListener('DOMContentLoaded', async () => {
31
+ await AuthService.init();
32
+
33
+ const urlParams = new URLSearchParams(window.location.search);
34
+ const token = urlParams.get('token');
35
+ const alert = document.getElementById('alert');
36
+ const loading = document.getElementById('loading');
37
+
38
+ if (!token) {
39
+ alert.textContent = 'Invalid or missing verification token.';
40
+ alert.className = 'alert alert-error';
41
+ loading.classList.add('hidden');
42
+ return;
43
+ }
44
+
45
+ try {
46
+ // GET /auth/verify-email?token=...
47
+ const result = await AuthService.apiCall(`/verify-email?token=${token}`, 'GET');
48
+
49
+ loading.classList.add('hidden');
50
+ if (result.success) {
51
+ alert.textContent = 'Your email has been successfully verified!';
52
+ alert.className = 'alert alert-success';
53
+ } else {
54
+ alert.textContent = result.error || 'Verification failed';
55
+ alert.className = 'alert alert-error';
56
+ }
57
+ } catch (err) {
58
+ loading.classList.add('hidden');
59
+ alert.textContent = 'An unexpected error occurred';
60
+ alert.className = 'alert alert-error';
61
+ }
62
+ });
63
+ </script>
64
+ </body>
65
+
66
+ </html>
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "@awesome-lang-auth/node",
3
+ "version": "1.10.1",
4
+ "description": "Database-agnostic JWT authentication and communication bus for Node.js",
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "extract-i18n": "node scripts/extract-i18n-keys.js",
8
+ "build": "npm run extract-i18n && tsc && mkdir -p dist/ui-assets && cp -r src/ui/assets/* dist/ui-assets",
9
+ "test": "vitest run",
10
+ "test:coverage": "vitest run --coverage"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/awesome-lang-auth/awesome-node-auth.git"
15
+ },
16
+ "keywords": [
17
+ "auth",
18
+ "node",
19
+ "nodejs",
20
+ "awesome-node-auth",
21
+ "awesome-lang-auth",
22
+ "authentication",
23
+ "middleware",
24
+ "express-auth",
25
+ "jwt",
26
+ "security",
27
+ "backend",
28
+ "authorization",
29
+ "nestjs",
30
+ "nextjs",
31
+ "angular",
32
+ "react",
33
+ "vue",
34
+ "ssr",
35
+ "ios",
36
+ "android",
37
+ "2fa",
38
+ "totp",
39
+ "flutter",
40
+ "bearer token",
41
+ "sms",
42
+ "event-bus",
43
+ "pub-sub",
44
+ "message-queue",
45
+ "redis"
46
+ ],
47
+ "author": "Nicola Brecciaroli",
48
+ "license": "MIT",
49
+ "type": "commonjs",
50
+ "bugs": {
51
+ "url": "https://github.com/awesome-lang-auth/awesome-node-auth/issues"
52
+ },
53
+ "homepage": "https://www.awesomenodeauth.com/",
54
+ "dependencies": {
55
+ "bcryptjs": "^3.0.3",
56
+ "jsonwebtoken": "^9.0.3",
57
+ "multer": "^2.1.1",
58
+ "otplib": "^13.3.0",
59
+ "qrcode": "^1.5.4"
60
+ },
61
+ "devDependencies": {
62
+ "@types/bcryptjs": "^2.4.6",
63
+ "@types/express": "^5.0.6",
64
+ "@types/jsonwebtoken": "^9.0.10",
65
+ "@types/multer": "^2.1.0",
66
+ "@types/node": "^25.3.0",
67
+ "@types/qrcode": "^1.5.6",
68
+ "@types/supertest": "^6.0.3",
69
+ "@vitest/coverage-v8": "^4.0.18",
70
+ "express": "^5.2.1",
71
+ "happy-dom": "^20.8.3",
72
+ "supertest": "^7.2.2",
73
+ "typescript": "^5.9.3",
74
+ "vitest": "^4.0.18"
75
+ },
76
+ "types": "dist/index.d.ts",
77
+ "files": [
78
+ "dist",
79
+ "dist/ui-assets",
80
+ "README.md",
81
+ "LICENSE"
82
+ ],
83
+ "overrides": {
84
+ "rollup": "^4.59.0"
85
+ },
86
+ "publishConfig": {
87
+ "access": "public"
88
+ }
89
+ }