kroxt 1.1.4 → 1.2.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.
- package/README.md +119 -152
- package/dist/adapters/drizzle.cjs +51 -0
- package/dist/adapters/drizzle.cjs.map +7 -0
- package/dist/adapters/drizzle.d.ts +14 -0
- package/dist/adapters/drizzle.d.ts.map +1 -0
- package/dist/adapters/drizzle.js +27 -0
- package/dist/adapters/drizzle.js.map +7 -0
- package/dist/{adapter.cjs → adapters/index.cjs} +3 -3
- package/dist/adapters/index.cjs.map +7 -0
- package/dist/{adapter.d.ts → adapters/index.d.ts} +1 -1
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +1 -0
- package/dist/{memoryAdapter.cjs → adapters/memory.cjs} +4 -4
- package/dist/adapters/memory.cjs.map +7 -0
- package/dist/{memoryAdapter.d.ts → adapters/memory.d.ts} +2 -2
- package/dist/adapters/memory.d.ts.map +1 -0
- package/dist/{memoryAdapter.js → adapters/memory.js} +1 -1
- package/dist/adapters/memory.js.map +7 -0
- package/dist/adapters/mongoose.cjs +55 -0
- package/dist/adapters/mongoose.cjs.map +7 -0
- package/dist/adapters/mongoose.d.ts +9 -0
- package/dist/adapters/mongoose.d.ts.map +1 -0
- package/dist/adapters/mongoose.js +31 -0
- package/dist/adapters/mongoose.js.map +7 -0
- package/dist/adapters/prisma.cjs +58 -0
- package/dist/adapters/prisma.cjs.map +7 -0
- package/dist/adapters/prisma.d.ts +12 -0
- package/dist/adapters/prisma.d.ts.map +1 -0
- package/dist/adapters/prisma.js +34 -0
- package/dist/adapters/prisma.js.map +7 -0
- package/dist/{core.cjs → core/index.cjs} +1 -1
- package/dist/core/index.cjs.map +7 -0
- package/dist/{core.d.ts → core/index.d.ts} +3 -3
- package/dist/core/index.d.ts.map +1 -0
- package/dist/{core.js → core/index.js} +1 -1
- package/dist/core/index.js.map +7 -0
- package/dist/index.cjs +9 -6
- package/dist/index.cjs.map +2 -2
- package/dist/index.d.ts +8 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +2 -2
- package/dist/{providers.cjs → providers/index.cjs} +1 -1
- package/dist/providers/index.cjs.map +7 -0
- package/dist/{providers.d.ts → providers/index.d.ts} +1 -1
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/{providers.js → providers/index.js} +1 -1
- package/dist/providers/index.js.map +7 -0
- package/dist/{security.cjs → security/index.cjs} +1 -1
- package/dist/security/index.cjs.map +7 -0
- package/dist/{security.d.ts → security/index.d.ts} +1 -1
- package/dist/security/index.d.ts.map +1 -0
- package/dist/{security.js → security/index.js} +1 -1
- package/dist/security/index.js.map +7 -0
- package/package.json +93 -55
- package/dist/adapter.cjs.map +0 -7
- package/dist/adapter.d.ts.map +0 -1
- package/dist/adapter.js +0 -1
- package/dist/core.cjs.map +0 -7
- package/dist/core.d.ts.map +0 -1
- package/dist/core.js.map +0 -7
- package/dist/memoryAdapter.cjs.map +0 -7
- package/dist/memoryAdapter.d.ts.map +0 -1
- package/dist/memoryAdapter.js.map +0 -7
- package/dist/providers.cjs.map +0 -7
- package/dist/providers.d.ts.map +0 -1
- package/dist/providers.js.map +0 -7
- package/dist/security.cjs.map +0 -7
- package/dist/security.d.ts.map +0 -1
- package/dist/security.js.map +0 -7
- /package/dist/{adapter.js.map → adapters/index.js.map} +0 -0
package/README.md
CHANGED
|
@@ -1,210 +1,177 @@
|
|
|
1
|
-
# kroxt
|
|
1
|
+
# kroxt 🔐
|
|
2
2
|
|
|
3
|
-
A framework-agnostic, modular authentication engine for modern TypeScript applications. Built for security, extensibility, and
|
|
3
|
+
A framework-agnostic, modular authentication engine for modern TypeScript applications. Built for security, extensibility, and pure developer joy.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/kroxt)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
- 🎟️ **Dual-Token Sessions**: Native support for Access and Refresh tokens via `jose`.
|
|
9
|
-
- 🧩 **JWT Customization**: Fully extensible payload with support for custom user fields and `sub` override.
|
|
10
|
-
- 🌍 **OAuth Ready**: Built-in support for GitHub and Google OAuth via `arctic`.
|
|
11
|
-
- 🧩 **Database Agnostic**: Use Mongoose, Prisma, Drizzle, or any store via the `AuthAdapter` pattern.
|
|
12
|
-
- 🌶️ **Password Peppering**: Server-side pepper support for enhanced hash protection.
|
|
13
|
-
- 🛡️ **Timing Attack Protection**: Built-in safeguards against side-channel analysis during login.
|
|
14
|
-
- ✅ **Zod Schema Support**: Perfectly preserves and types your user metadata.
|
|
15
|
-
- 🌍 **Dual ESM/CJS Support**: Native support for both modern ESM (`import`) and CommonJS (`require`).
|
|
8
|
+
## 🚀 Why Kroxt?
|
|
16
9
|
|
|
17
|
-
|
|
10
|
+
Authentication is often either too complex (Passport, Auth.js) or too restrictive. Kroxt is the **"Headless" Auth Engine** that gives you the best of both worlds:
|
|
18
11
|
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
- 🏗️ **Database Agnostic**: Native adapters for **Prisma**, **Drizzle**, and **Mongoose**.
|
|
13
|
+
- 🛠️ **Modular**: Use only what you need. No forced session managers or UI components.
|
|
14
|
+
- 🔐 **Security First**: Argon2 hashing, dual-token rotation, and timing-attack protection built-in.
|
|
15
|
+
- 🧩 **TypeScript Native**: Perfectly preserves your user schemas and metadata.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🗺️ How it Works
|
|
20
|
+
|
|
21
|
+
Kroxt sits between your database and your controller logic. It handles the "heavy lifting" (hashing, JWT signing, token rotation) while you maintain full control over your API.
|
|
22
|
+
|
|
23
|
+
```mermaid
|
|
24
|
+
graph LR
|
|
25
|
+
A[Client] -- "Credentials" --> B[Express/Fastify]
|
|
26
|
+
B -- "auth.signup()" --> C[Kroxt Engine]
|
|
27
|
+
C -- "Save User" --> D[(Database Adapter)]
|
|
28
|
+
D -- "Success" --> C
|
|
29
|
+
C -- "Tokens + User" --> B
|
|
30
|
+
B -- "Set Cookies/JSON" --> A
|
|
31
|
+
|
|
32
|
+
subgraph Adapters
|
|
33
|
+
D
|
|
34
|
+
E[Mongoose]
|
|
35
|
+
F[Drizzle]
|
|
36
|
+
G[Prisma]
|
|
37
|
+
end
|
|
21
38
|
```
|
|
22
39
|
|
|
23
40
|
---
|
|
24
41
|
|
|
25
|
-
##
|
|
42
|
+
## 🏁 Quick Start (5 Minutes)
|
|
43
|
+
|
|
44
|
+
### 1. Installation
|
|
26
45
|
|
|
27
|
-
|
|
46
|
+
```bash
|
|
47
|
+
npm install kroxt
|
|
48
|
+
```
|
|
28
49
|
|
|
29
|
-
###
|
|
50
|
+
### 2. Choose Your Adapter
|
|
30
51
|
|
|
31
|
-
|
|
52
|
+
Kroxt provides official adapters for the most popular ORMs.
|
|
32
53
|
|
|
54
|
+
#### **Option A: Drizzle (SQLite/PG/MySQL)**
|
|
33
55
|
```typescript
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
oauthProvider?: string; // Support for OAuth (e.g., 'github')
|
|
41
|
-
oauthId?: string; // Unique ID from the provider
|
|
42
|
-
name: string;
|
|
43
|
-
}
|
|
56
|
+
import { createDrizzleAdapter } from "kroxt/adapters/drizzle";
|
|
57
|
+
import { db } from "./db";
|
|
58
|
+
import { users } from "./schema";
|
|
59
|
+
import { eq } from "drizzle-orm";
|
|
60
|
+
|
|
61
|
+
export const adapter = createDrizzleAdapter(db, users, eq);
|
|
44
62
|
```
|
|
45
63
|
|
|
46
|
-
|
|
64
|
+
#### **Option B: Prisma**
|
|
65
|
+
```typescript
|
|
66
|
+
import { createPrismaAdapter } from "kroxt/adapters/prisma";
|
|
67
|
+
import { prisma } from "./db";
|
|
47
68
|
|
|
48
|
-
|
|
69
|
+
export const adapter = createPrismaAdapter(prisma.user);
|
|
70
|
+
```
|
|
49
71
|
|
|
72
|
+
#### **Option C: Mongoose**
|
|
50
73
|
```typescript
|
|
51
|
-
import
|
|
52
|
-
import { User } from "./models/user.model
|
|
53
|
-
import type { MyUser } from "./types.js";
|
|
54
|
-
|
|
55
|
-
export const myAdapter: AuthAdapter<MyUser> = {
|
|
56
|
-
createUser: async (data) => {
|
|
57
|
-
const user = await User.create(data);
|
|
58
|
-
const obj = user.toObject();
|
|
59
|
-
return { ...obj, id: obj._id.toString() };
|
|
60
|
-
},
|
|
61
|
-
findUserByEmail: async (email) => {
|
|
62
|
-
const user = await User.findOne({ email });
|
|
63
|
-
if (!user) return null;
|
|
64
|
-
const obj = user.toObject();
|
|
65
|
-
return { ...obj, id: obj._id.toString() };
|
|
66
|
-
},
|
|
67
|
-
findUserById: async (id) => {
|
|
68
|
-
const user = await User.findById(id);
|
|
69
|
-
if (!user) return null;
|
|
70
|
-
const obj = user.toObject();
|
|
71
|
-
return { ...obj, id: obj._id.toString() };
|
|
72
|
-
},
|
|
73
|
-
linkOAuthAccount: async (userId, provider, providerId) => {
|
|
74
|
-
await User.findByIdAndUpdate(userId, {
|
|
75
|
-
oauthProvider: provider,
|
|
76
|
-
oauthId: providerId
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
```
|
|
74
|
+
import { createMongoAdapter } from "kroxt/adapters/mongoose";
|
|
75
|
+
import { User } from "./models/user.model";
|
|
81
76
|
|
|
82
|
-
|
|
77
|
+
export const adapter = createMongoAdapter(User);
|
|
78
|
+
```
|
|
83
79
|
|
|
84
|
-
|
|
80
|
+
### 3. Initialize the Engine
|
|
85
81
|
|
|
86
82
|
```typescript
|
|
87
|
-
import { createAuth } from "kroxt";
|
|
88
|
-
import {
|
|
83
|
+
import { createAuth } from "kroxt/core";
|
|
84
|
+
import { adapter } from "./auth-adapter";
|
|
89
85
|
|
|
90
86
|
export const auth = createAuth({
|
|
91
|
-
adapter
|
|
92
|
-
secret: process.env.
|
|
93
|
-
pepper: process.env.AUTH_PEPPER, // Optional: Server-side pepper for password hashing
|
|
87
|
+
adapter,
|
|
88
|
+
secret: process.env.JWT_SECRET,
|
|
94
89
|
session: {
|
|
95
|
-
expires: "15m",
|
|
96
|
-
refreshExpires: "7d"
|
|
97
|
-
},
|
|
98
|
-
jwt: {
|
|
99
|
-
/**
|
|
100
|
-
* Optional: Fully customize the JWT payload or add extra fields.
|
|
101
|
-
*/
|
|
102
|
-
payload: (user, type) => {
|
|
103
|
-
// Only add extra details to 'access' tokens to keep 'refresh' tokens light.
|
|
104
|
-
if (type === "access") {
|
|
105
|
-
return {
|
|
106
|
-
schoolId: user.schoolId, // Add custom user detail
|
|
107
|
-
role: user.role, // Explicitly include role
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
return {}; // Refresh tokens stay minimal
|
|
111
|
-
}
|
|
90
|
+
expires: "15m",
|
|
91
|
+
refreshExpires: "7d"
|
|
112
92
|
}
|
|
113
93
|
});
|
|
114
94
|
```
|
|
115
95
|
|
|
116
|
-
|
|
96
|
+
---
|
|
117
97
|
|
|
118
|
-
|
|
98
|
+
## 🛡️ Core Authentication Flows
|
|
119
99
|
|
|
120
|
-
|
|
100
|
+
### **Registration**
|
|
121
101
|
```typescript
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
name,
|
|
128
|
-
email,
|
|
129
|
-
...extraFields
|
|
130
|
-
}, password);
|
|
131
|
-
|
|
132
|
-
res.json({ user, accessToken, refreshToken });
|
|
133
|
-
});
|
|
102
|
+
const { user, accessToken, refreshToken } = await auth.signup({
|
|
103
|
+
email,
|
|
104
|
+
name,
|
|
105
|
+
role: 'user'
|
|
106
|
+
}, password);
|
|
134
107
|
```
|
|
135
108
|
|
|
136
|
-
|
|
109
|
+
### **Login**
|
|
137
110
|
```typescript
|
|
138
|
-
|
|
139
|
-
const { email, password } = req.body;
|
|
140
|
-
|
|
141
|
-
// Kroxt verifies password (timing-attack safe) and returns tokens
|
|
142
|
-
const { user, accessToken, refreshToken } = await auth.loginWithPassword(email, password);
|
|
143
|
-
|
|
144
|
-
res.json({ user, accessToken, refreshToken });
|
|
145
|
-
});
|
|
111
|
+
const { user, accessToken, refreshToken } = await auth.loginWithPassword(email, password);
|
|
146
112
|
```
|
|
147
113
|
|
|
148
|
-
|
|
149
|
-
Keep users logged in by rotating access tokens using a valid refresh token.
|
|
114
|
+
### **Token Refresh**
|
|
150
115
|
```typescript
|
|
151
|
-
|
|
152
|
-
const { refreshToken } = req.body;
|
|
153
|
-
|
|
154
|
-
// Returns a fresh access token
|
|
155
|
-
const { accessToken } = await auth.refresh(refreshToken);
|
|
156
|
-
|
|
157
|
-
res.json({ accessToken });
|
|
158
|
-
});
|
|
116
|
+
const { accessToken } = await auth.refresh(refreshToken);
|
|
159
117
|
```
|
|
160
118
|
|
|
161
|
-
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 🐣 Beginner Corner: What is "Headless"?
|
|
122
|
+
|
|
123
|
+
If you're new to backend development, "Headless" means Kroxt **doesn't provide a UI** (no login buttons or pre-made forms). Instead, it provides the **engine** (the logic).
|
|
124
|
+
|
|
125
|
+
**Why is this good?**
|
|
126
|
+
It means you can build your own login screen in React, Vue, or even a Mobile App, and Kroxt will handle the security part on the server exactly the same way every time.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 🛠️ Advanced: Custom JWT Payloads
|
|
131
|
+
|
|
132
|
+
Want to share a user's `role` or `plan` with the frontend via the JWT? Use the `payload` hook:
|
|
133
|
+
|
|
162
134
|
```typescript
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
135
|
+
export const auth = createAuth({
|
|
136
|
+
adapter,
|
|
137
|
+
jwt: {
|
|
138
|
+
payload: (user, type) => {
|
|
139
|
+
if (type === "access") {
|
|
140
|
+
return {
|
|
141
|
+
role: user.role,
|
|
142
|
+
tier: user.subscriptionTier
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
return {}; // Keep refresh tokens small
|
|
146
|
+
}
|
|
147
|
+
}
|
|
173
148
|
});
|
|
174
149
|
```
|
|
175
150
|
|
|
176
151
|
---
|
|
177
152
|
|
|
178
|
-
##
|
|
179
|
-
|
|
180
|
-
### 1. Password Peppering
|
|
181
|
-
Always use a `pepper` in production. It's a server-side secret added to passwords before hashing. If your database is leaked, the hashes cannot be cracked without this pepper.
|
|
153
|
+
## 🛑 Common v1.2.0 Troubleshooting
|
|
182
154
|
|
|
183
|
-
###
|
|
184
|
-
|
|
155
|
+
### "Cannot find module '.prisma/client/default.js'" (ESM on Windows)
|
|
156
|
+
If you're using Prisma with ESM (`"type": "module"`) on Windows, you may need a robust import in your `src/db/index.ts`:
|
|
185
157
|
|
|
186
158
|
```typescript
|
|
187
|
-
import {
|
|
188
|
-
|
|
189
|
-
const
|
|
190
|
-
const isValid = verifyCsrf(tokenInRequest, tokenInCookie);
|
|
159
|
+
import { createRequire } from "module";
|
|
160
|
+
const require = createRequire(import.meta.url);
|
|
161
|
+
const { PrismaClient } = require("@prisma/client");
|
|
191
162
|
```
|
|
192
163
|
|
|
193
|
-
###
|
|
194
|
-
If
|
|
195
|
-
- `httpOnly: true` (Prevents XSS)
|
|
196
|
-
- `secure: true` (Requires HTTPS)
|
|
197
|
-
- `sameSite: 'strict'` (Prevents CSRF)
|
|
198
|
-
|
|
199
|
-
### 4. Rate Limiting
|
|
200
|
-
Implement rate limiting (e.g., `express-rate-limit`) on `/login` and `/register` to block brute-force attempts.
|
|
164
|
+
### Prisma "Unknown argument `name`"
|
|
165
|
+
Prisma is strict about schemas. If you're sending extra fields in `auth.signup()`, ensure your `schema.prisma` includes them (marked as `?` optional if needed).
|
|
201
166
|
|
|
202
167
|
---
|
|
203
168
|
|
|
204
|
-
## Reference Project
|
|
169
|
+
## 🔗 Reference Project
|
|
205
170
|
|
|
206
|
-
|
|
171
|
+
Complete working implementations:
|
|
172
|
+
- [Express + Drizzle + SQLite](https://github.com/adepoju-oluwatobi/kroxt-example)
|
|
173
|
+
- [Express + Mongoose](https://github.com/adepoju-oluwatobi/kroxt-example-cjs)
|
|
207
174
|
|
|
208
|
-
## License
|
|
175
|
+
## 📄 License
|
|
209
176
|
|
|
210
|
-
MIT
|
|
177
|
+
MIT © [Adepoju Oluwatobi](https://github.com/adepoju-oluwatobi)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var drizzle_exports = {};
|
|
20
|
+
__export(drizzle_exports, {
|
|
21
|
+
createDrizzleAdapter: () => createDrizzleAdapter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(drizzle_exports);
|
|
24
|
+
function createDrizzleAdapter(db, table, eq) {
|
|
25
|
+
return {
|
|
26
|
+
async createUser(data) {
|
|
27
|
+
const dataToSave = { id: data.id || globalThis.crypto.randomUUID(), ...data };
|
|
28
|
+
const results = await db.insert(table).values(dataToSave).returning();
|
|
29
|
+
return results[0];
|
|
30
|
+
},
|
|
31
|
+
async findUserByEmail(email) {
|
|
32
|
+
const results = await db.select().from(table).where(eq(table.email, email)).limit(1);
|
|
33
|
+
return results[0] || null;
|
|
34
|
+
},
|
|
35
|
+
async findUserById(id) {
|
|
36
|
+
const results = await db.select().from(table).where(eq(table.id, id)).limit(1);
|
|
37
|
+
return results[0] || null;
|
|
38
|
+
},
|
|
39
|
+
async linkOAuthAccount(userId, provider, providerId) {
|
|
40
|
+
await db.update(table).set({
|
|
41
|
+
oauthProvider: provider,
|
|
42
|
+
oauthId: providerId
|
|
43
|
+
}).where(eq(table.id, userId));
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
48
|
+
0 && (module.exports = {
|
|
49
|
+
createDrizzleAdapter
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=drizzle.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/auth/adapters/drizzle.ts"],
|
|
4
|
+
"sourcesContent": ["import type { AuthAdapter, User } from \"./index.js\";\n\n/**\n * Creates a Drizzle ORM adapter.\n * \n * Works with any Drizzle-supported database (PostgreSQL, MySQL, SQLite)\n * by using the standard drizzle-orm `db` instance and table definition.\n * \n * @param db - The Drizzle database instance.\n * @param table - The Drizzle table representing users.\n * @param eq - The Drizzle `eq` operator (imported from `drizzle-orm`).\n * @returns An AuthAdapter compliant object.\n */\nexport function createDrizzleAdapter<TUser extends User = User>(\n db: any,\n table: any,\n eq: any\n): AuthAdapter<TUser> {\n return {\n async createUser(data: any) {\n const dataToSave = { id: data.id || globalThis.crypto.randomUUID(), ...data };\n const results = await db.insert(table).values(dataToSave).returning();\n return results[0] as TUser;\n },\n\n async findUserByEmail(email: string) {\n const results = await db.select().from(table).where(eq(table.email, email)).limit(1);\n return (results[0] || null) as TUser | null;\n },\n\n async findUserById(id: string) {\n const results = await db.select().from(table).where(eq(table.id, id)).limit(1);\n return (results[0] || null) as TUser | null;\n },\n\n async linkOAuthAccount(userId: string, provider: string, providerId: string) {\n await db.update(table)\n .set({\n oauthProvider: provider,\n oauthId: providerId,\n })\n .where(eq(table.id, userId));\n },\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAaO,SAAS,qBACd,IACA,OACA,IACoB;AACpB,SAAO;AAAA,IACL,MAAM,WAAW,MAAW;AAC1B,YAAM,aAAa,EAAE,IAAI,KAAK,MAAM,WAAW,OAAO,WAAW,GAAG,GAAG,KAAK;AAC5E,YAAM,UAAU,MAAM,GAAG,OAAO,KAAK,EAAE,OAAO,UAAU,EAAE,UAAU;AACpE,aAAO,QAAQ,CAAC;AAAA,IAClB;AAAA,IAEA,MAAM,gBAAgB,OAAe;AACnC,YAAM,UAAU,MAAM,GAAG,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,GAAG,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,CAAC;AACnF,aAAQ,QAAQ,CAAC,KAAK;AAAA,IACxB;AAAA,IAEA,MAAM,aAAa,IAAY;AAC7B,YAAM,UAAU,MAAM,GAAG,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC;AAC7E,aAAQ,QAAQ,CAAC,KAAK;AAAA,IACxB;AAAA,IAEA,MAAM,iBAAiB,QAAgB,UAAkB,YAAoB;AAC3E,YAAM,GAAG,OAAO,KAAK,EAClB,IAAI;AAAA,QACH,eAAe;AAAA,QACf,SAAS;AAAA,MACX,CAAC,EACA,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AuthAdapter, User } from "./index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a Drizzle ORM adapter.
|
|
4
|
+
*
|
|
5
|
+
* Works with any Drizzle-supported database (PostgreSQL, MySQL, SQLite)
|
|
6
|
+
* by using the standard drizzle-orm `db` instance and table definition.
|
|
7
|
+
*
|
|
8
|
+
* @param db - The Drizzle database instance.
|
|
9
|
+
* @param table - The Drizzle table representing users.
|
|
10
|
+
* @param eq - The Drizzle `eq` operator (imported from `drizzle-orm`).
|
|
11
|
+
* @returns An AuthAdapter compliant object.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createDrizzleAdapter<TUser extends User = User>(db: any, table: any, eq: any): AuthAdapter<TUser>;
|
|
14
|
+
//# sourceMappingURL=drizzle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle.d.ts","sourceRoot":"","sources":["../../src/auth/adapters/drizzle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,SAAS,IAAI,GAAG,IAAI,EAC5D,EAAE,EAAE,GAAG,EACP,KAAK,EAAE,GAAG,EACV,EAAE,EAAE,GAAG,GACN,WAAW,CAAC,KAAK,CAAC,CA2BpB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function createDrizzleAdapter(db, table, eq) {
|
|
2
|
+
return {
|
|
3
|
+
async createUser(data) {
|
|
4
|
+
const dataToSave = { id: data.id || globalThis.crypto.randomUUID(), ...data };
|
|
5
|
+
const results = await db.insert(table).values(dataToSave).returning();
|
|
6
|
+
return results[0];
|
|
7
|
+
},
|
|
8
|
+
async findUserByEmail(email) {
|
|
9
|
+
const results = await db.select().from(table).where(eq(table.email, email)).limit(1);
|
|
10
|
+
return results[0] || null;
|
|
11
|
+
},
|
|
12
|
+
async findUserById(id) {
|
|
13
|
+
const results = await db.select().from(table).where(eq(table.id, id)).limit(1);
|
|
14
|
+
return results[0] || null;
|
|
15
|
+
},
|
|
16
|
+
async linkOAuthAccount(userId, provider, providerId) {
|
|
17
|
+
await db.update(table).set({
|
|
18
|
+
oauthProvider: provider,
|
|
19
|
+
oauthId: providerId
|
|
20
|
+
}).where(eq(table.id, userId));
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
createDrizzleAdapter
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=drizzle.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/auth/adapters/drizzle.ts"],
|
|
4
|
+
"sourcesContent": ["import type { AuthAdapter, User } from \"./index.js\";\n\n/**\n * Creates a Drizzle ORM adapter.\n * \n * Works with any Drizzle-supported database (PostgreSQL, MySQL, SQLite)\n * by using the standard drizzle-orm `db` instance and table definition.\n * \n * @param db - The Drizzle database instance.\n * @param table - The Drizzle table representing users.\n * @param eq - The Drizzle `eq` operator (imported from `drizzle-orm`).\n * @returns An AuthAdapter compliant object.\n */\nexport function createDrizzleAdapter<TUser extends User = User>(\n db: any,\n table: any,\n eq: any\n): AuthAdapter<TUser> {\n return {\n async createUser(data: any) {\n const dataToSave = { id: data.id || globalThis.crypto.randomUUID(), ...data };\n const results = await db.insert(table).values(dataToSave).returning();\n return results[0] as TUser;\n },\n\n async findUserByEmail(email: string) {\n const results = await db.select().from(table).where(eq(table.email, email)).limit(1);\n return (results[0] || null) as TUser | null;\n },\n\n async findUserById(id: string) {\n const results = await db.select().from(table).where(eq(table.id, id)).limit(1);\n return (results[0] || null) as TUser | null;\n },\n\n async linkOAuthAccount(userId: string, provider: string, providerId: string) {\n await db.update(table)\n .set({\n oauthProvider: provider,\n oauthId: providerId,\n })\n .where(eq(table.id, userId));\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "AAaO,SAAS,qBACd,IACA,OACA,IACoB;AACpB,SAAO;AAAA,IACL,MAAM,WAAW,MAAW;AAC1B,YAAM,aAAa,EAAE,IAAI,KAAK,MAAM,WAAW,OAAO,WAAW,GAAG,GAAG,KAAK;AAC5E,YAAM,UAAU,MAAM,GAAG,OAAO,KAAK,EAAE,OAAO,UAAU,EAAE,UAAU;AACpE,aAAO,QAAQ,CAAC;AAAA,IAClB;AAAA,IAEA,MAAM,gBAAgB,OAAe;AACnC,YAAM,UAAU,MAAM,GAAG,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,GAAG,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,CAAC;AACnF,aAAQ,QAAQ,CAAC,KAAK;AAAA,IACxB;AAAA,IAEA,MAAM,aAAa,IAAY;AAC7B,YAAM,UAAU,MAAM,GAAG,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC;AAC7E,aAAQ,QAAQ,CAAC,KAAK;AAAA,IACxB;AAAA,IAEA,MAAM,iBAAiB,QAAgB,UAAkB,YAAoB;AAC3E,YAAM,GAAG,OAAO,KAAK,EAClB,IAAI;AAAA,QACH,eAAe;AAAA,QACf,SAAS;AAAA,MACX,CAAC,EACA,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -12,6 +12,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
12
12
|
return to;
|
|
13
13
|
};
|
|
14
14
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
-
var
|
|
16
|
-
module.exports = __toCommonJS(
|
|
17
|
-
//# sourceMappingURL=
|
|
15
|
+
var adapters_exports = {};
|
|
16
|
+
module.exports = __toCommonJS(adapters_exports);
|
|
17
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/auth/adapters/index.ts"],
|
|
4
|
+
"sourcesContent": ["export interface BaseUser {\n id: string;\n email: string;\n passwordHash?: string;\n role?: string;\n}\n\n// Allows any extended fields natively (like nin, bvn, maritalStatus, etc.)\nexport type User<TExtended = Record<string, any>> = BaseUser & TExtended;\n\nexport interface AuthAdapter<TUser = User> {\n createUser: (data: any) => Promise<TUser>;\n findUserByEmail: (email: string) => Promise<TUser | null>;\n findUserById: (id: string) => Promise<TUser | null>;\n linkOAuthAccount: (userId: string, provider: string, providerId: string) => Promise<void>;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -11,4 +11,4 @@ export interface AuthAdapter<TUser = User> {
|
|
|
11
11
|
findUserById: (id: string) => Promise<TUser | null>;
|
|
12
12
|
linkOAuthAccount: (userId: string, provider: string, providerId: string) => Promise<void>;
|
|
13
13
|
}
|
|
14
|
-
//# sourceMappingURL=
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/adapters/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,QAAQ,GAAG,SAAS,CAAC;AAEzE,MAAM,WAAW,WAAW,CAAC,KAAK,GAAG,IAAI;IACvC,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC1D,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACpD,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -16,11 +16,11 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
19
|
+
var memory_exports = {};
|
|
20
|
+
__export(memory_exports, {
|
|
21
21
|
createMemoryAdapter: () => createMemoryAdapter
|
|
22
22
|
});
|
|
23
|
-
module.exports = __toCommonJS(
|
|
23
|
+
module.exports = __toCommonJS(memory_exports);
|
|
24
24
|
function createMemoryAdapter() {
|
|
25
25
|
const users = /* @__PURE__ */ new Map();
|
|
26
26
|
const accounts = /* @__PURE__ */ new Map();
|
|
@@ -52,4 +52,4 @@ function createMemoryAdapter() {
|
|
|
52
52
|
0 && (module.exports = {
|
|
53
53
|
createMemoryAdapter
|
|
54
54
|
});
|
|
55
|
-
//# sourceMappingURL=
|
|
55
|
+
//# sourceMappingURL=memory.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/auth/adapters/memory.ts"],
|
|
4
|
+
"sourcesContent": ["import type { AuthAdapter, User } from \"./index.js\";\n\n/**\n * Creates an in-memory database adapter for the auth engine.\n * This is useful for testing, prototyping, or when you don't need persistent storage.\n * All data is kept in memory and is lost when the server restarts.\n */\nexport function createMemoryAdapter<TUser extends User = User>(): AuthAdapter<TUser> {\n const users = new Map<string, TUser>();\n const accounts = new Map<string, { userId: string; provider: string; providerId: string }>();\n\n return {\n createUser: async (data: any) => {\n // Auto-generate ID if not provided\n const id = data.id || Date.now().toString();\n const newUser = { ...data, id } as TUser;\n\n // Store using email as the primary lookup key\n users.set(newUser.email, newUser);\n return newUser;\n },\n\n findUserByEmail: async (email: string) => {\n return users.get(email) || null;\n },\n\n findUserById: async (id: string) => {\n for (const user of users.values()) {\n if (user.id === id) {\n return user;\n }\n }\n return null;\n },\n\n linkOAuthAccount: async (userId: string, provider: string, providerId: string) => {\n const accountId = `${provider}_${providerId}`;\n accounts.set(accountId, { userId, provider, providerId });\n }\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,SAAS,sBAAqE;AACjF,QAAM,QAAQ,oBAAI,IAAmB;AACrC,QAAM,WAAW,oBAAI,IAAsE;AAE3F,SAAO;AAAA,IACH,YAAY,OAAO,SAAc;AAE7B,YAAM,KAAK,KAAK,MAAM,KAAK,IAAI,EAAE,SAAS;AAC1C,YAAM,UAAU,EAAE,GAAG,MAAM,GAAG;AAG9B,YAAM,IAAI,QAAQ,OAAO,OAAO;AAChC,aAAO;AAAA,IACX;AAAA,IAEA,iBAAiB,OAAO,UAAkB;AACtC,aAAO,MAAM,IAAI,KAAK,KAAK;AAAA,IAC/B;AAAA,IAEA,cAAc,OAAO,OAAe;AAChC,iBAAW,QAAQ,MAAM,OAAO,GAAG;AAC/B,YAAI,KAAK,OAAO,IAAI;AAChB,iBAAO;AAAA,QACX;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAAA,IAEA,kBAAkB,OAAO,QAAgB,UAAkB,eAAuB;AAC9E,YAAM,YAAY,GAAG,QAAQ,IAAI,UAAU;AAC3C,eAAS,IAAI,WAAW,EAAE,QAAQ,UAAU,WAAW,CAAC;AAAA,IAC5D;AAAA,EACJ;AACJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { AuthAdapter, User } from "./
|
|
1
|
+
import type { AuthAdapter, User } from "./index.js";
|
|
2
2
|
/**
|
|
3
3
|
* Creates an in-memory database adapter for the auth engine.
|
|
4
4
|
* This is useful for testing, prototyping, or when you don't need persistent storage.
|
|
5
5
|
* All data is kept in memory and is lost when the server restarts.
|
|
6
6
|
*/
|
|
7
7
|
export declare function createMemoryAdapter<TUser extends User = User>(): AuthAdapter<TUser>;
|
|
8
|
-
//# sourceMappingURL=
|
|
8
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/auth/adapters/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,IAAI,GAAG,IAAI,KAAK,WAAW,CAAC,KAAK,CAAC,CAiCnF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/auth/adapters/memory.ts"],
|
|
4
|
+
"sourcesContent": ["import type { AuthAdapter, User } from \"./index.js\";\n\n/**\n * Creates an in-memory database adapter for the auth engine.\n * This is useful for testing, prototyping, or when you don't need persistent storage.\n * All data is kept in memory and is lost when the server restarts.\n */\nexport function createMemoryAdapter<TUser extends User = User>(): AuthAdapter<TUser> {\n const users = new Map<string, TUser>();\n const accounts = new Map<string, { userId: string; provider: string; providerId: string }>();\n\n return {\n createUser: async (data: any) => {\n // Auto-generate ID if not provided\n const id = data.id || Date.now().toString();\n const newUser = { ...data, id } as TUser;\n\n // Store using email as the primary lookup key\n users.set(newUser.email, newUser);\n return newUser;\n },\n\n findUserByEmail: async (email: string) => {\n return users.get(email) || null;\n },\n\n findUserById: async (id: string) => {\n for (const user of users.values()) {\n if (user.id === id) {\n return user;\n }\n }\n return null;\n },\n\n linkOAuthAccount: async (userId: string, provider: string, providerId: string) => {\n const accountId = `${provider}_${providerId}`;\n accounts.set(accountId, { userId, provider, providerId });\n }\n };\n}\n"],
|
|
5
|
+
"mappings": "AAOO,SAAS,sBAAqE;AACjF,QAAM,QAAQ,oBAAI,IAAmB;AACrC,QAAM,WAAW,oBAAI,IAAsE;AAE3F,SAAO;AAAA,IACH,YAAY,OAAO,SAAc;AAE7B,YAAM,KAAK,KAAK,MAAM,KAAK,IAAI,EAAE,SAAS;AAC1C,YAAM,UAAU,EAAE,GAAG,MAAM,GAAG;AAG9B,YAAM,IAAI,QAAQ,OAAO,OAAO;AAChC,aAAO;AAAA,IACX;AAAA,IAEA,iBAAiB,OAAO,UAAkB;AACtC,aAAO,MAAM,IAAI,KAAK,KAAK;AAAA,IAC/B;AAAA,IAEA,cAAc,OAAO,OAAe;AAChC,iBAAW,QAAQ,MAAM,OAAO,GAAG;AAC/B,YAAI,KAAK,OAAO,IAAI;AAChB,iBAAO;AAAA,QACX;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAAA,IAEA,kBAAkB,OAAO,QAAgB,UAAkB,eAAuB;AAC9E,YAAM,YAAY,GAAG,QAAQ,IAAI,UAAU;AAC3C,eAAS,IAAI,WAAW,EAAE,QAAQ,UAAU,WAAW,CAAC;AAAA,IAC5D;AAAA,EACJ;AACJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var mongoose_exports = {};
|
|
20
|
+
__export(mongoose_exports, {
|
|
21
|
+
createMongoAdapter: () => createMongoAdapter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(mongoose_exports);
|
|
24
|
+
function createMongoAdapter(model) {
|
|
25
|
+
return {
|
|
26
|
+
async createUser(data) {
|
|
27
|
+
const user = await model.create(data);
|
|
28
|
+
const obj = user.toObject();
|
|
29
|
+
return { ...obj, id: obj._id.toString() };
|
|
30
|
+
},
|
|
31
|
+
async findUserByEmail(email) {
|
|
32
|
+
const user = await model.findOne({ email });
|
|
33
|
+
if (!user) return null;
|
|
34
|
+
const obj = user.toObject();
|
|
35
|
+
return { ...obj, id: obj._id.toString() };
|
|
36
|
+
},
|
|
37
|
+
async findUserById(id) {
|
|
38
|
+
const user = await model.findById(id);
|
|
39
|
+
if (!user) return null;
|
|
40
|
+
const obj = user.toObject();
|
|
41
|
+
return { ...obj, id: obj._id.toString() };
|
|
42
|
+
},
|
|
43
|
+
async linkOAuthAccount(userId, provider, providerId) {
|
|
44
|
+
await model.findByIdAndUpdate(userId, {
|
|
45
|
+
oauthProvider: provider,
|
|
46
|
+
oauthId: providerId
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
52
|
+
0 && (module.exports = {
|
|
53
|
+
createMongoAdapter
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=mongoose.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/auth/adapters/mongoose.ts"],
|
|
4
|
+
"sourcesContent": ["import type { AuthAdapter, User } from \"./index.js\";\n\n/**\n * Creates a MongoDB adapter using a Mongoose model.\n * \n * @param model - A Mongoose model instance (e.g., User model).\n * @returns An AuthAdapter compliant object.\n */\nexport function createMongoAdapter<TUser extends User = User>(model: any): AuthAdapter<TUser> {\n return {\n async createUser(data: any) {\n const user = await model.create(data);\n const obj = user.toObject();\n return { ...obj, id: obj._id.toString() } as TUser;\n },\n\n async findUserByEmail(email: string) {\n const user = await model.findOne({ email });\n if (!user) return null;\n const obj = user.toObject();\n return { ...obj, id: obj._id.toString() } as TUser;\n },\n\n async findUserById(id: string) {\n const user = await model.findById(id);\n if (!user) return null;\n const obj = user.toObject();\n return { ...obj, id: obj._id.toString() } as TUser;\n },\n\n async linkOAuthAccount(userId: string, provider: string, providerId: string) {\n await model.findByIdAndUpdate(userId, {\n oauthProvider: provider,\n oauthId: providerId,\n });\n },\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQO,SAAS,mBAA8C,OAAgC;AAC5F,SAAO;AAAA,IACL,MAAM,WAAW,MAAW;AAC1B,YAAM,OAAO,MAAM,MAAM,OAAO,IAAI;AACpC,YAAM,MAAM,KAAK,SAAS;AAC1B,aAAO,EAAE,GAAG,KAAK,IAAI,IAAI,IAAI,SAAS,EAAE;AAAA,IAC1C;AAAA,IAEA,MAAM,gBAAgB,OAAe;AACnC,YAAM,OAAO,MAAM,MAAM,QAAQ,EAAE,MAAM,CAAC;AAC1C,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,MAAM,KAAK,SAAS;AAC1B,aAAO,EAAE,GAAG,KAAK,IAAI,IAAI,IAAI,SAAS,EAAE;AAAA,IAC1C;AAAA,IAEA,MAAM,aAAa,IAAY;AAC7B,YAAM,OAAO,MAAM,MAAM,SAAS,EAAE;AACpC,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,MAAM,KAAK,SAAS;AAC1B,aAAO,EAAE,GAAG,KAAK,IAAI,IAAI,IAAI,SAAS,EAAE;AAAA,IAC1C;AAAA,IAEA,MAAM,iBAAiB,QAAgB,UAAkB,YAAoB;AAC3E,YAAM,MAAM,kBAAkB,QAAQ;AAAA,QACpC,eAAe;AAAA,QACf,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AuthAdapter, User } from "./index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a MongoDB adapter using a Mongoose model.
|
|
4
|
+
*
|
|
5
|
+
* @param model - A Mongoose model instance (e.g., User model).
|
|
6
|
+
* @returns An AuthAdapter compliant object.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createMongoAdapter<TUser extends User = User>(model: any): AuthAdapter<TUser>;
|
|
9
|
+
//# sourceMappingURL=mongoose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongoose.d.ts","sourceRoot":"","sources":["../../src/auth/adapters/mongoose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,SAAS,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CA6B5F"}
|