sentri 1.0.4 → 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 (53) hide show
  1. package/README.md +314 -860
  2. package/dist/cli.js +79 -26
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client.d.ts +34 -69
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +0 -6
  7. package/dist/client.js.map +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/libs/config.d.ts +45 -1
  12. package/dist/libs/config.d.ts.map +1 -1
  13. package/dist/libs/config.js +40 -2
  14. package/dist/libs/config.js.map +1 -1
  15. package/dist/libs/hash.d.ts +14 -0
  16. package/dist/libs/hash.d.ts.map +1 -1
  17. package/dist/libs/hash.js +14 -0
  18. package/dist/libs/hash.js.map +1 -1
  19. package/dist/libs/token.d.ts +37 -0
  20. package/dist/libs/token.d.ts.map +1 -1
  21. package/dist/libs/token.js +63 -0
  22. package/dist/libs/token.js.map +1 -1
  23. package/dist/middleware/authorize.d.ts +15 -0
  24. package/dist/middleware/authorize.d.ts.map +1 -1
  25. package/dist/middleware/authorize.js +18 -3
  26. package/dist/middleware/authorize.js.map +1 -1
  27. package/dist/middleware/permit.d.ts +8 -8
  28. package/dist/middleware/permit.d.ts.map +1 -1
  29. package/dist/middleware/permit.js +10 -10
  30. package/dist/middleware/permit.js.map +1 -1
  31. package/dist/middleware/protect.d.ts +17 -0
  32. package/dist/middleware/protect.d.ts.map +1 -1
  33. package/dist/middleware/protect.js +22 -5
  34. package/dist/middleware/protect.js.map +1 -1
  35. package/dist/middleware/router.d.ts +10 -6
  36. package/dist/middleware/router.d.ts.map +1 -1
  37. package/dist/middleware/router.js +122 -124
  38. package/dist/middleware/router.js.map +1 -1
  39. package/dist/services/auth.d.ts +78 -2
  40. package/dist/services/auth.d.ts.map +1 -1
  41. package/dist/services/auth.js +90 -5
  42. package/dist/services/auth.js.map +1 -1
  43. package/dist/types/auth.d.ts +176 -2
  44. package/dist/types/auth.d.ts.map +1 -1
  45. package/dist/types/auth.js +20 -1
  46. package/dist/types/auth.js.map +1 -1
  47. package/package.json +11 -3
  48. package/templates/drizzle/adapter.ts +154 -0
  49. package/templates/drizzle/auth.ts +47 -0
  50. package/templates/drizzle/schema.ts +47 -0
  51. package/templates/prisma/adapter.ts +122 -0
  52. package/templates/prisma/auth.ts +50 -0
  53. /package/templates/{schema.prisma → prisma/schema.prisma} +0 -0
@@ -0,0 +1,122 @@
1
+ // sentri — Prisma adapter template
2
+ // Generated by: npx sentri generate prisma
3
+ //
4
+ // Adjust the Prisma model/field names below if your schema differs from the
5
+ // template produced by `npx sentri init`.
6
+
7
+ import type { PrismaClient } from '@prisma/client';
8
+ import { AuthError, type AuthAdapter } from 'sentri';
9
+
10
+ export function createAdapter(prisma: PrismaClient): AuthAdapter {
11
+ if (!prisma) {
12
+ throw new AuthError(
13
+ 'CONFIGURATION_ERROR',
14
+ 'createAdapter requires a PrismaClient instance. Did you forget to pass it?\n' +
15
+ 'Example: createAdapter(prisma)',
16
+ );
17
+ }
18
+ return {
19
+ user: {
20
+ async findByIdentifier(identifier) {
21
+ const user = await prisma.user.findUnique({
22
+ where: { identifier },
23
+ include: { userRoles: { include: { role: true } } },
24
+ });
25
+ if (!user) return null;
26
+ return {
27
+ id: user.id,
28
+ identifier: user.identifier,
29
+ passwordHash: user.passwordHash,
30
+ roles: user.userRoles.map((userRole) => userRole.role.name),
31
+ };
32
+ },
33
+
34
+ async findById(id) {
35
+ const user = await prisma.user.findUnique({
36
+ where: { id },
37
+ include: { userRoles: { include: { role: true } } },
38
+ });
39
+ if (!user) return null;
40
+ return {
41
+ id: user.id,
42
+ identifier: user.identifier,
43
+ passwordHash: user.passwordHash,
44
+ roles: user.userRoles.map((userRole) => userRole.role.name),
45
+ };
46
+ },
47
+
48
+ async create({ identifier, passwordHash, roles }) {
49
+ const user = await prisma.user.create({
50
+ data: {
51
+ identifier,
52
+ passwordHash,
53
+ userRoles: {
54
+ create: await Promise.all(
55
+ roles.map(async (name) => {
56
+ const role = await prisma.role.upsert({
57
+ where: { name },
58
+ update: {},
59
+ create: { name },
60
+ });
61
+ return { roleId: role.id };
62
+ }),
63
+ ),
64
+ },
65
+ },
66
+ });
67
+ return { id: user.id };
68
+ },
69
+
70
+ async updateRoles(userId, roles) {
71
+ await prisma.userRole.deleteMany({ where: { userId } });
72
+ await Promise.all(
73
+ roles.map(async (name) => {
74
+ const role = await prisma.role.upsert({
75
+ where: { name },
76
+ update: {},
77
+ create: { name },
78
+ });
79
+ await prisma.userRole.create({ data: { userId, roleId: role.id } });
80
+ }),
81
+ );
82
+ },
83
+ },
84
+
85
+ session: {
86
+ async create({ userId, expiresAt }) {
87
+ const session = await prisma.session.create({ data: { userId, expiresAt } });
88
+ return { id: session.id };
89
+ },
90
+
91
+ async findById(sessionId) {
92
+ const session = await prisma.session.findUnique({
93
+ where: { id: sessionId },
94
+ include: {
95
+ user: { include: { userRoles: { include: { role: true } } } },
96
+ },
97
+ });
98
+ if (!session) return null;
99
+ return {
100
+ id: session.id,
101
+ userId: session.userId,
102
+ expiresAt: session.expiresAt,
103
+ createdAt: session.createdAt,
104
+ user: {
105
+ id: session.user.id,
106
+ identifier: session.user.identifier,
107
+ passwordHash: session.user.passwordHash,
108
+ roles: session.user.userRoles.map((userRole) => userRole.role.name),
109
+ },
110
+ };
111
+ },
112
+
113
+ async delete(sessionId) {
114
+ await prisma.session.delete({ where: { id: sessionId } }).catch(() => {});
115
+ },
116
+
117
+ async deleteAllForUser(userId) {
118
+ await prisma.session.deleteMany({ where: { userId } });
119
+ },
120
+ },
121
+ };
122
+ }
@@ -0,0 +1,50 @@
1
+ // sentri — auth config template (Prisma)
2
+ // Generated by: npx sentri generate prisma
3
+ //
4
+ // Update validRoles to match the roles your application uses.
5
+ // Add JWT_SECRET to your .env file.
6
+ // If you already have a PrismaClient instance elsewhere, import it instead of
7
+ // creating a new one here.
8
+
9
+ import { PrismaClient } from '@prisma/client';
10
+ import { createAuth } from 'sentri';
11
+ import { createAdapter } from './adapter.js';
12
+
13
+ const prisma = new PrismaClient();
14
+
15
+ export const auth = createAuth({
16
+ secret: process.env.JWT_SECRET!,
17
+ validRoles: ['user', 'admin'] as const,
18
+ adapter: createAdapter(prisma),
19
+ // accessExpiresIn: '15m',
20
+ // refreshExpiresIn: '7d',
21
+ // algorithm: 'HS256',
22
+ // saltRounds: 12,
23
+ cookie: {
24
+ secure: process.env.NODE_ENV === 'production',
25
+ // name: 'refresh_token',
26
+ // httpOnly: true,
27
+ // sameSite: 'strict',
28
+ // path: '/',
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
+ // },
50
+ });