@revealui/auth 0.2.0 → 0.3.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 (87) hide show
  1. package/README.md +58 -34
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/react/index.d.ts +4 -0
  4. package/dist/react/index.d.ts.map +1 -1
  5. package/dist/react/index.js +2 -0
  6. package/dist/react/useMFA.d.ts +83 -0
  7. package/dist/react/useMFA.d.ts.map +1 -0
  8. package/dist/react/useMFA.js +182 -0
  9. package/dist/react/usePasskey.d.ts +88 -0
  10. package/dist/react/usePasskey.d.ts.map +1 -0
  11. package/dist/react/usePasskey.js +203 -0
  12. package/dist/react/useSession.d.ts.map +1 -1
  13. package/dist/react/useSession.js +16 -5
  14. package/dist/react/useSignIn.d.ts +9 -3
  15. package/dist/react/useSignIn.d.ts.map +1 -1
  16. package/dist/react/useSignIn.js +32 -10
  17. package/dist/react/useSignOut.d.ts.map +1 -1
  18. package/dist/react/useSignUp.d.ts +1 -0
  19. package/dist/react/useSignUp.d.ts.map +1 -1
  20. package/dist/react/useSignUp.js +25 -9
  21. package/dist/server/auth.d.ts +2 -0
  22. package/dist/server/auth.d.ts.map +1 -1
  23. package/dist/server/auth.js +93 -5
  24. package/dist/server/brute-force.d.ts +10 -1
  25. package/dist/server/brute-force.d.ts.map +1 -1
  26. package/dist/server/brute-force.js +46 -23
  27. package/dist/server/errors.d.ts +4 -0
  28. package/dist/server/errors.d.ts.map +1 -1
  29. package/dist/server/errors.js +8 -0
  30. package/dist/server/index.d.ts +17 -6
  31. package/dist/server/index.d.ts.map +1 -1
  32. package/dist/server/index.js +12 -5
  33. package/dist/server/magic-link.d.ts +52 -0
  34. package/dist/server/magic-link.d.ts.map +1 -0
  35. package/dist/server/magic-link.js +111 -0
  36. package/dist/server/mfa.d.ts +87 -0
  37. package/dist/server/mfa.d.ts.map +1 -0
  38. package/dist/server/mfa.js +263 -0
  39. package/dist/server/oauth.d.ts +86 -0
  40. package/dist/server/oauth.d.ts.map +1 -0
  41. package/dist/server/oauth.js +355 -0
  42. package/dist/server/passkey.d.ts +132 -0
  43. package/dist/server/passkey.d.ts.map +1 -0
  44. package/dist/server/passkey.js +257 -0
  45. package/dist/server/password-reset.d.ts +32 -6
  46. package/dist/server/password-reset.d.ts.map +1 -1
  47. package/dist/server/password-reset.js +116 -47
  48. package/dist/server/password-validation.d.ts.map +1 -1
  49. package/dist/server/providers/github.d.ts +14 -0
  50. package/dist/server/providers/github.d.ts.map +1 -0
  51. package/dist/server/providers/github.js +89 -0
  52. package/dist/server/providers/google.d.ts +11 -0
  53. package/dist/server/providers/google.d.ts.map +1 -0
  54. package/dist/server/providers/google.js +69 -0
  55. package/dist/server/providers/vercel.d.ts +11 -0
  56. package/dist/server/providers/vercel.d.ts.map +1 -0
  57. package/dist/server/providers/vercel.js +63 -0
  58. package/dist/server/rate-limit.d.ts +10 -1
  59. package/dist/server/rate-limit.d.ts.map +1 -1
  60. package/dist/server/rate-limit.js +61 -43
  61. package/dist/server/session.d.ts +48 -1
  62. package/dist/server/session.d.ts.map +1 -1
  63. package/dist/server/session.js +126 -7
  64. package/dist/server/signed-cookie.d.ts +32 -0
  65. package/dist/server/signed-cookie.d.ts.map +1 -0
  66. package/dist/server/signed-cookie.js +67 -0
  67. package/dist/server/storage/database.d.ts +10 -1
  68. package/dist/server/storage/database.d.ts.map +1 -1
  69. package/dist/server/storage/database.js +43 -5
  70. package/dist/server/storage/in-memory.d.ts +4 -0
  71. package/dist/server/storage/in-memory.d.ts.map +1 -1
  72. package/dist/server/storage/in-memory.js +16 -6
  73. package/dist/server/storage/index.d.ts +11 -3
  74. package/dist/server/storage/index.d.ts.map +1 -1
  75. package/dist/server/storage/index.js +18 -4
  76. package/dist/server/storage/interface.d.ts +11 -1
  77. package/dist/server/storage/interface.d.ts.map +1 -1
  78. package/dist/server/storage/interface.js +1 -1
  79. package/dist/types.d.ts +23 -8
  80. package/dist/types.d.ts.map +1 -1
  81. package/dist/types.js +2 -2
  82. package/dist/utils/database.d.ts.map +1 -1
  83. package/dist/utils/database.js +12 -2
  84. package/dist/utils/token.d.ts +9 -1
  85. package/dist/utils/token.d.ts.map +1 -1
  86. package/dist/utils/token.js +9 -1
  87. package/package.json +26 -8
package/dist/types.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * Auth Types
3
3
  *
4
4
  * Type definitions for authentication system.
5
- * Uses concrete interfaces instead of z.infer<> aliases to ensure
6
- * ESLint type-checked rules can resolve all types.
5
+ * Uses concrete interfaces instead of z.infer<> aliases for
6
+ * clear type definitions and better IDE support.
7
7
  */
8
8
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/utils/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAEhD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAU3C;AAED;;GAEG;AACH,wBAAgB,wBAAwB,2CAMvC;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBtE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B7E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAC3B,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAKxE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAStF;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,aAAa,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,EAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAClC,OAAO,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAI3C"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/utils/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAU3C;AAED;;GAEG;AACH,wBAAgB,wBAAwB,2CAMvC;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBtE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B7E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAC3B,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CASxE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAStF;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,aAAa,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,EAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAClC,OAAO,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAI3C"}
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { getClient } from '@revealui/db/client';
8
8
  import { sessions, users } from '@revealui/db/schema';
9
- import { eq } from 'drizzle-orm';
9
+ import { and, eq, isNull } from 'drizzle-orm';
10
10
  /**
11
11
  * Gets the test database connection string from environment variables
12
12
  */
@@ -66,6 +66,11 @@ export async function createTestUser(overrides) {
66
66
  agentModel: null,
67
67
  agentCapabilities: null,
68
68
  agentConfig: null,
69
+ emailVerified: false,
70
+ emailVerificationToken: null,
71
+ emailVerifiedAt: null,
72
+ mfaEnabled: false,
73
+ mfaVerifiedAt: null,
69
74
  preferences: null,
70
75
  createdAt: new Date(),
71
76
  updatedAt: new Date(),
@@ -93,6 +98,7 @@ export async function createTestSession(userId, overrides) {
93
98
  persistent: overrides?.persistent ?? null,
94
99
  lastActivityAt: overrides?.lastActivityAt || new Date(),
95
100
  createdAt: overrides?.createdAt || new Date(),
101
+ metadata: overrides?.metadata ?? null,
96
102
  };
97
103
  await db.insert(sessions).values(testSession);
98
104
  return testSession;
@@ -102,7 +108,11 @@ export async function createTestSession(userId, overrides) {
102
108
  */
103
109
  export async function getUserByEmail(email) {
104
110
  const db = getClient();
105
- const result = await db.select().from(users).where(eq(users.email, email)).limit(1);
111
+ const result = await db
112
+ .select()
113
+ .from(users)
114
+ .where(and(eq(users.email, email), isNull(users.deletedAt)))
115
+ .limit(1);
106
116
  const user = result[0];
107
117
  return user ?? null;
108
118
  }
@@ -5,7 +5,15 @@
5
5
  * Uses SHA-256 for fast hashing (sessions are short-lived).
6
6
  */
7
7
  /**
8
- * Hash a session token for storage in database
8
+ * Hash a session token using SHA-256.
9
+ *
10
+ * SHA-256 is appropriate for high-entropy session tokens (256-bit / 32 random bytes).
11
+ * Unlike passwords (low entropy, user-chosen), these tokens have sufficient keyspace
12
+ * (~2^256) to make brute-force infeasible even with fast hashes. Using bcrypt/argon2
13
+ * would add ~100ms latency per request with no meaningful security benefit.
14
+ *
15
+ * Security relies on: (1) token entropy >= 128 bits, (2) session expiry enforcement,
16
+ * (3) token regeneration on privilege changes.
9
17
  *
10
18
  * @param token - Plain session token
11
19
  * @returns Hashed token (SHA-256)
@@ -1 +1 @@
1
- {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/utils/token.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAMhE"}
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/utils/token.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAMhE"}
@@ -6,7 +6,15 @@
6
6
  */
7
7
  import { createHash, timingSafeEqual } from 'node:crypto';
8
8
  /**
9
- * Hash a session token for storage in database
9
+ * Hash a session token using SHA-256.
10
+ *
11
+ * SHA-256 is appropriate for high-entropy session tokens (256-bit / 32 random bytes).
12
+ * Unlike passwords (low entropy, user-chosen), these tokens have sufficient keyspace
13
+ * (~2^256) to make brute-force infeasible even with fast hashes. Using bcrypt/argon2
14
+ * would add ~100ms latency per request with no meaningful security benefit.
15
+ *
16
+ * Security relies on: (1) token entropy >= 128 bits, (2) session expiry enforcement,
17
+ * (3) token regeneration on privilege changes.
10
18
  *
11
19
  * @param token - Plain session token
12
20
  * @returns Hashed token (SHA-256)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revealui/auth",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Authentication system for RevealUI - database-backed sessions with Better Auth patterns",
5
5
  "keywords": [
6
6
  "auth",
@@ -10,24 +10,35 @@
10
10
  ],
11
11
  "license": "MIT",
12
12
  "dependencies": {
13
+ "@simplewebauthn/server": "^13.3.0",
13
14
  "bcryptjs": "^3.0.3",
14
15
  "drizzle-orm": "^0.45.1",
15
- "zod": "^4.3.5",
16
- "@revealui/config": "0.2.0",
17
- "@revealui/contracts": "1.0.0",
18
- "@revealui/core": "0.2.0",
19
- "@revealui/db": "0.2.0"
16
+ "zod": "^4.3.6",
17
+ "@revealui/core": "0.3.0",
18
+ "@revealui/db": "0.3.0",
19
+ "@revealui/config": "0.3.0",
20
+ "@revealui/contracts": "1.2.0"
20
21
  },
21
22
  "devDependencies": {
23
+ "@simplewebauthn/browser": "^13.3.0",
24
+ "@testing-library/react": "^16.3.2",
22
25
  "@types/node": "^25.3.0",
23
26
  "@types/react": "^19.2.14",
24
27
  "@vitest/coverage-v8": "^4.0.18",
28
+ "happy-dom": "^20.8.4",
25
29
  "react": "^19.2.3",
26
30
  "typescript": "^5.9.3",
27
31
  "vitest": "^4.0.18",
28
32
  "dev": "0.0.1"
29
33
  },
34
+ "engines": {
35
+ "node": ">=24.13.0"
36
+ },
30
37
  "exports": {
38
+ ".": {
39
+ "types": "./dist/index.d.ts",
40
+ "import": "./dist/index.js"
41
+ },
31
42
  "./server": {
32
43
  "types": "./dist/server/index.d.ts",
33
44
  "import": "./dist/server/index.js"
@@ -44,22 +55,29 @@
44
55
  "files": [
45
56
  "dist"
46
57
  ],
58
+ "main": "./dist/index.js",
47
59
  "peerDependencies": {
60
+ "@simplewebauthn/browser": "^13.0.0",
48
61
  "react": "^18.0.0 || ^19.0.0"
49
62
  },
63
+ "peerDependenciesMeta": {
64
+ "@simplewebauthn/browser": {
65
+ "optional": true
66
+ }
67
+ },
50
68
  "publishConfig": {
51
69
  "access": "public",
52
70
  "registry": "https://registry.npmjs.org"
53
71
  },
54
72
  "type": "module",
73
+ "types": "./dist/index.d.ts",
55
74
  "scripts": {
56
75
  "build": "tsc",
57
76
  "clean": "rm -rf dist",
58
77
  "dev": "tsc --watch",
59
78
  "lint": "biome check .",
60
- "lint:eslint": "eslint .",
61
79
  "test": "vitest run",
62
- "test:coverage": "vitest run --coverage",
80
+ "test:coverage": "vitest run --coverage --coverage.reporter=json-summary --coverage.reporter=html --coverage.reporter=text",
63
81
  "test:watch": "vitest",
64
82
  "typecheck": "tsc --noEmit"
65
83
  }