sentri 1.0.5 → 1.0.6
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 +87 -37
- package/dist/client.d.ts +34 -75
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +0 -7
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/libs/config.d.ts +45 -1
- package/dist/libs/config.d.ts.map +1 -1
- package/dist/libs/config.js +40 -2
- package/dist/libs/config.js.map +1 -1
- package/dist/libs/hash.d.ts +14 -0
- package/dist/libs/hash.d.ts.map +1 -1
- package/dist/libs/hash.js +14 -0
- package/dist/libs/hash.js.map +1 -1
- package/dist/libs/token.d.ts +37 -0
- package/dist/libs/token.d.ts.map +1 -1
- package/dist/libs/token.js +63 -0
- package/dist/libs/token.js.map +1 -1
- package/dist/middleware/authorize.d.ts +15 -0
- package/dist/middleware/authorize.d.ts.map +1 -1
- package/dist/middleware/authorize.js +15 -0
- package/dist/middleware/authorize.js.map +1 -1
- package/dist/middleware/protect.d.ts +17 -0
- package/dist/middleware/protect.d.ts.map +1 -1
- package/dist/middleware/protect.js +17 -0
- package/dist/middleware/protect.js.map +1 -1
- package/dist/middleware/router.d.ts +10 -6
- package/dist/middleware/router.d.ts.map +1 -1
- package/dist/middleware/router.js +24 -14
- package/dist/middleware/router.js.map +1 -1
- package/dist/services/auth.d.ts +75 -0
- package/dist/services/auth.d.ts.map +1 -1
- package/dist/services/auth.js +75 -0
- package/dist/services/auth.js.map +1 -1
- package/dist/types/auth.d.ts +144 -0
- package/dist/types/auth.d.ts.map +1 -1
- package/package.json +11 -3
- package/templates/drizzle/adapter.ts +3 -9
- package/templates/drizzle/auth.ts +20 -0
- package/templates/prisma/adapter.ts +3 -9
- package/templates/prisma/auth.ts +20 -0
package/dist/types/auth.d.ts
CHANGED
|
@@ -97,6 +97,132 @@ export interface AuthAdapter {
|
|
|
97
97
|
deleteAllForUser(userId: string): Promise<void>;
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Custom service functions for the built-in auth router.
|
|
102
|
+
*
|
|
103
|
+
* Each key matches the internal service function name. When provided, the
|
|
104
|
+
* custom function replaces the default service call for that route while the
|
|
105
|
+
* router still handles request parsing, input validation, and response formatting.
|
|
106
|
+
*
|
|
107
|
+
* The function signatures mirror the internal services exactly but without the
|
|
108
|
+
* `config` parameter — the library passes config at bind time.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* createAuth({
|
|
112
|
+
* // ...
|
|
113
|
+
* router: {
|
|
114
|
+
* login: async (input) => {
|
|
115
|
+
* // add OTP check, custom user lookup, etc.
|
|
116
|
+
* // must return AuthResult
|
|
117
|
+
* },
|
|
118
|
+
* signup: async (input) => {
|
|
119
|
+
* // send welcome email, set default profile, etc.
|
|
120
|
+
* // must return SignupResult
|
|
121
|
+
* },
|
|
122
|
+
* },
|
|
123
|
+
* });
|
|
124
|
+
*/
|
|
125
|
+
export interface RouterHandlers {
|
|
126
|
+
/**
|
|
127
|
+
* Replaces the default signup service.
|
|
128
|
+
*
|
|
129
|
+
* The router validates the request body (identifier, password, roles) first,
|
|
130
|
+
* then calls this function with the parsed input. Must return a `SignupResult`.
|
|
131
|
+
* If omitted, the library's built-in signup logic runs instead.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* signup: async (input) => {
|
|
135
|
+
* const result = await defaultSignup(input);
|
|
136
|
+
* if (result.success) {
|
|
137
|
+
* await emailService.sendWelcome(input.identifier);
|
|
138
|
+
* }
|
|
139
|
+
* return result;
|
|
140
|
+
* }
|
|
141
|
+
*/
|
|
142
|
+
signup?: (input: SignupInput) => Promise<SignupResult>;
|
|
143
|
+
/**
|
|
144
|
+
* Replaces the default login service.
|
|
145
|
+
*
|
|
146
|
+
* The router validates the request body (identifier, password) first,
|
|
147
|
+
* then calls this function with the parsed input. Must return an `AuthResult`.
|
|
148
|
+
* If omitted, the library's built-in login logic runs instead.
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* login: async (input) => {
|
|
152
|
+
* // verify OTP before issuing tokens
|
|
153
|
+
* const otpValid = await redis.get(`otp:${input.identifier}`);
|
|
154
|
+
* if (!otpValid) {
|
|
155
|
+
* return { success: false, error: new AuthError('INVALID_CREDENTIALS', 'OTP required') };
|
|
156
|
+
* }
|
|
157
|
+
* return defaultLogin(input);
|
|
158
|
+
* }
|
|
159
|
+
*/
|
|
160
|
+
login?: (input: LoginInput) => Promise<AuthResult>;
|
|
161
|
+
/**
|
|
162
|
+
* Replaces the default refresh service.
|
|
163
|
+
*
|
|
164
|
+
* Receives the raw refresh token string extracted from the cookie.
|
|
165
|
+
* Must return a `RefreshResult`. If omitted, the built-in session-rotation
|
|
166
|
+
* logic runs instead.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* refresh: async (refreshToken) => {
|
|
170
|
+
* const result = await defaultRefresh(refreshToken);
|
|
171
|
+
* if (result.success) {
|
|
172
|
+
* await auditLog.record('token_rotated', result.user.id);
|
|
173
|
+
* }
|
|
174
|
+
* return result;
|
|
175
|
+
* }
|
|
176
|
+
*/
|
|
177
|
+
refresh?: (refreshToken: string) => Promise<RefreshResult>;
|
|
178
|
+
/**
|
|
179
|
+
* Replaces the default logout service.
|
|
180
|
+
*
|
|
181
|
+
* Receives the raw refresh token from the cookie, or `undefined` if no cookie
|
|
182
|
+
* was present. The router clears the cookie after this function resolves.
|
|
183
|
+
* If omitted, the built-in session deletion logic runs instead.
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* logout: async (refreshToken) => {
|
|
187
|
+
* if (refreshToken) {
|
|
188
|
+
* await defaultLogout(refreshToken);
|
|
189
|
+
* await auditLog.record('logout', refreshToken);
|
|
190
|
+
* }
|
|
191
|
+
* }
|
|
192
|
+
*/
|
|
193
|
+
logout?: (refreshToken: string | undefined) => Promise<void>;
|
|
194
|
+
/**
|
|
195
|
+
* Replaces the default logoutAll service.
|
|
196
|
+
*
|
|
197
|
+
* Receives the authenticated user's ID (from `req.user`, set by `protect()`).
|
|
198
|
+
* If omitted, the built-in "delete all sessions" logic runs instead.
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* logoutAll: async (userId) => {
|
|
202
|
+
* await defaultLogoutAll(userId);
|
|
203
|
+
* await notifyService.push(userId, 'You have been signed out from all devices.');
|
|
204
|
+
* }
|
|
205
|
+
*/
|
|
206
|
+
logoutAll?: (userId: string) => Promise<void>;
|
|
207
|
+
/**
|
|
208
|
+
* Replaces the default assignRoles service.
|
|
209
|
+
*
|
|
210
|
+
* The router validates the request body and params first, then calls this
|
|
211
|
+
* function with the target `userId` and the validated `roles` array.
|
|
212
|
+
* Must return an `AssignRolesResult`. If omitted, the built-in role-merge
|
|
213
|
+
* logic runs instead.
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* assignRoles: async (userId, roles) => {
|
|
217
|
+
* const result = await defaultAssignRoles(userId, roles);
|
|
218
|
+
* if (result.success) {
|
|
219
|
+
* await auditLog.record('roles_assigned', { userId, roles });
|
|
220
|
+
* }
|
|
221
|
+
* return result;
|
|
222
|
+
* }
|
|
223
|
+
*/
|
|
224
|
+
assignRoles?: (userId: string, roles: string[]) => Promise<AssignRolesResult>;
|
|
225
|
+
}
|
|
100
226
|
/**
|
|
101
227
|
* Configuration passed to {@link createAuth}.
|
|
102
228
|
*
|
|
@@ -146,6 +272,24 @@ export interface AuthConfig<TRole extends string = string> {
|
|
|
146
272
|
validRoles: readonly TRole[];
|
|
147
273
|
/** ORM adapter that connects the library to your database. */
|
|
148
274
|
adapter: AuthAdapter;
|
|
275
|
+
/**
|
|
276
|
+
* Custom service functions for individual routes in the built-in auth router.
|
|
277
|
+
*
|
|
278
|
+
* The router still handles request parsing, validation, and response formatting.
|
|
279
|
+
* Only the core service logic is replaced by your function.
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* createAuth({
|
|
283
|
+
* // ...
|
|
284
|
+
* router: {
|
|
285
|
+
* login: async (input) => {
|
|
286
|
+
* // verify OTP, then delegate to default or return custom result
|
|
287
|
+
* return { success: true, accessToken, refreshToken, user };
|
|
288
|
+
* },
|
|
289
|
+
* },
|
|
290
|
+
* });
|
|
291
|
+
*/
|
|
292
|
+
router?: RouterHandlers;
|
|
149
293
|
/**
|
|
150
294
|
* When set, the built-in router (`auth.router()`) stores the refresh token
|
|
151
295
|
* in an httpOnly cookie instead of returning it in the response body.
|
package/dist/types/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sentri",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "Personal auth/authorization library for Express + Postgres",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -20,7 +20,10 @@
|
|
|
20
20
|
"templates"
|
|
21
21
|
],
|
|
22
22
|
"scripts": {
|
|
23
|
-
"build": "tsc"
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"test:coverage": "vitest run --coverage"
|
|
24
27
|
},
|
|
25
28
|
"keywords": [
|
|
26
29
|
"auth",
|
|
@@ -37,8 +40,13 @@
|
|
|
37
40
|
"@types/express": "^5.0.6",
|
|
38
41
|
"@types/jsonwebtoken": "^9.0.10",
|
|
39
42
|
"@types/node": "^22.20.0",
|
|
43
|
+
"@types/supertest": "^7.2.0",
|
|
44
|
+
"@vitest/coverage-v8": "^4.1.9",
|
|
45
|
+
"express": "^5.2.1",
|
|
46
|
+
"supertest": "^7.2.2",
|
|
40
47
|
"tsx": "^4.22.4",
|
|
41
|
-
"typescript": "^6.0.3"
|
|
48
|
+
"typescript": "^6.0.3",
|
|
49
|
+
"vitest": "^4.1.9"
|
|
42
50
|
},
|
|
43
51
|
"dependencies": {
|
|
44
52
|
"bcrypt": "^6.0.0",
|
|
@@ -12,19 +12,13 @@
|
|
|
12
12
|
|
|
13
13
|
import { eq } from 'drizzle-orm';
|
|
14
14
|
import type { NodePgDatabase } from 'drizzle-orm/node-postgres';
|
|
15
|
-
import type
|
|
15
|
+
import { AuthError, type AuthAdapter } from 'sentri';
|
|
16
16
|
import { users, roles, userRoles, sessions } from './schema.js';
|
|
17
17
|
|
|
18
|
-
class AdapterConfigError extends Error {
|
|
19
|
-
constructor(message: string) {
|
|
20
|
-
super(message);
|
|
21
|
-
this.name = 'AdapterConfigError';
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
18
|
export function createAdapter(db: NodePgDatabase): AuthAdapter {
|
|
26
19
|
if (!db) {
|
|
27
|
-
throw new
|
|
20
|
+
throw new AuthError(
|
|
21
|
+
'CONFIGURATION_ERROR',
|
|
28
22
|
'createAdapter requires a Drizzle db instance. Did you forget to pass it?\n' +
|
|
29
23
|
'Example: createAdapter(db)',
|
|
30
24
|
);
|
|
@@ -24,4 +24,24 @@ export const auth = createAuth({
|
|
|
24
24
|
// sameSite: 'strict',
|
|
25
25
|
// path: '/',
|
|
26
26
|
},
|
|
27
|
+
// router: {
|
|
28
|
+
// signup: async (input) => {
|
|
29
|
+
// // custom signup logic — must return SignupResult
|
|
30
|
+
// },
|
|
31
|
+
// login: async (input) => {
|
|
32
|
+
// // custom login logic — must return AuthResult
|
|
33
|
+
// },
|
|
34
|
+
// refresh: async (refreshToken) => {
|
|
35
|
+
// // custom refresh logic — must return RefreshResult
|
|
36
|
+
// },
|
|
37
|
+
// logout: async (refreshToken) => {
|
|
38
|
+
// // custom logout logic
|
|
39
|
+
// },
|
|
40
|
+
// logoutAll: async (userId) => {
|
|
41
|
+
// // custom logout-all logic
|
|
42
|
+
// },
|
|
43
|
+
// assignRoles: async (userId, roles) => {
|
|
44
|
+
// // custom assignRoles logic — must return AssignRolesResult
|
|
45
|
+
// },
|
|
46
|
+
// },
|
|
27
47
|
});
|
|
@@ -5,18 +5,12 @@
|
|
|
5
5
|
// template produced by `npx sentri init`.
|
|
6
6
|
|
|
7
7
|
import type { PrismaClient } from '@prisma/client';
|
|
8
|
-
import type
|
|
9
|
-
|
|
10
|
-
class AdapterConfigError extends Error {
|
|
11
|
-
constructor(message: string) {
|
|
12
|
-
super(message);
|
|
13
|
-
this.name = 'AdapterConfigError';
|
|
14
|
-
}
|
|
15
|
-
}
|
|
8
|
+
import { AuthError, type AuthAdapter } from 'sentri';
|
|
16
9
|
|
|
17
10
|
export function createAdapter(prisma: PrismaClient): AuthAdapter {
|
|
18
11
|
if (!prisma) {
|
|
19
|
-
throw new
|
|
12
|
+
throw new AuthError(
|
|
13
|
+
'CONFIGURATION_ERROR',
|
|
20
14
|
'createAdapter requires a PrismaClient instance. Did you forget to pass it?\n' +
|
|
21
15
|
'Example: createAdapter(prisma)',
|
|
22
16
|
);
|
package/templates/prisma/auth.ts
CHANGED
|
@@ -27,4 +27,24 @@ export const auth = createAuth({
|
|
|
27
27
|
// sameSite: 'strict',
|
|
28
28
|
// path: '/',
|
|
29
29
|
},
|
|
30
|
+
// router: {
|
|
31
|
+
// signup: async (input) => {
|
|
32
|
+
// // custom signup logic — must return SignupResult
|
|
33
|
+
// },
|
|
34
|
+
// login: async (input) => {
|
|
35
|
+
// // custom login logic — must return AuthResult
|
|
36
|
+
// },
|
|
37
|
+
// refresh: async (refreshToken) => {
|
|
38
|
+
// // custom refresh logic — must return RefreshResult
|
|
39
|
+
// },
|
|
40
|
+
// logout: async (refreshToken) => {
|
|
41
|
+
// // custom logout logic
|
|
42
|
+
// },
|
|
43
|
+
// logoutAll: async (userId) => {
|
|
44
|
+
// // custom logout-all logic
|
|
45
|
+
// },
|
|
46
|
+
// assignRoles: async (userId, roles) => {
|
|
47
|
+
// // custom assignRoles logic — must return AssignRolesResult
|
|
48
|
+
// },
|
|
49
|
+
// },
|
|
30
50
|
});
|