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.
Files changed (43) hide show
  1. package/README.md +87 -37
  2. package/dist/client.d.ts +34 -75
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +0 -7
  5. package/dist/client.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/libs/config.d.ts +45 -1
  10. package/dist/libs/config.d.ts.map +1 -1
  11. package/dist/libs/config.js +40 -2
  12. package/dist/libs/config.js.map +1 -1
  13. package/dist/libs/hash.d.ts +14 -0
  14. package/dist/libs/hash.d.ts.map +1 -1
  15. package/dist/libs/hash.js +14 -0
  16. package/dist/libs/hash.js.map +1 -1
  17. package/dist/libs/token.d.ts +37 -0
  18. package/dist/libs/token.d.ts.map +1 -1
  19. package/dist/libs/token.js +63 -0
  20. package/dist/libs/token.js.map +1 -1
  21. package/dist/middleware/authorize.d.ts +15 -0
  22. package/dist/middleware/authorize.d.ts.map +1 -1
  23. package/dist/middleware/authorize.js +15 -0
  24. package/dist/middleware/authorize.js.map +1 -1
  25. package/dist/middleware/protect.d.ts +17 -0
  26. package/dist/middleware/protect.d.ts.map +1 -1
  27. package/dist/middleware/protect.js +17 -0
  28. package/dist/middleware/protect.js.map +1 -1
  29. package/dist/middleware/router.d.ts +10 -6
  30. package/dist/middleware/router.d.ts.map +1 -1
  31. package/dist/middleware/router.js +24 -14
  32. package/dist/middleware/router.js.map +1 -1
  33. package/dist/services/auth.d.ts +75 -0
  34. package/dist/services/auth.d.ts.map +1 -1
  35. package/dist/services/auth.js +75 -0
  36. package/dist/services/auth.js.map +1 -1
  37. package/dist/types/auth.d.ts +144 -0
  38. package/dist/types/auth.d.ts.map +1 -1
  39. package/package.json +11 -3
  40. package/templates/drizzle/adapter.ts +3 -9
  41. package/templates/drizzle/auth.ts +20 -0
  42. package/templates/prisma/adapter.ts +3 -9
  43. package/templates/prisma/auth.ts +20 -0
@@ -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.
@@ -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.5",
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 { AuthAdapter } from 'sentri';
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 AdapterConfigError(
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 { AuthAdapter } from 'sentri';
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 AdapterConfigError(
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
  );
@@ -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
  });