@kyro-cms/core 0.1.6 → 0.1.7

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 (170) hide show
  1. package/dist/WebhookService-BCgL1bLF.d.cts +112 -0
  2. package/dist/WebhookService-BPVJUgTl.d.ts +112 -0
  3. package/dist/{base-DlhVlwnN.d.cts → base-B0Y6isUJ.d.cts} +1 -1
  4. package/dist/{base-CQkFzqQl.d.ts → base-DaP-5PPG.d.ts} +1 -1
  5. package/dist/bootstrap-BMWVB2T6.cjs +31 -0
  6. package/dist/{bootstrap-WMWQ4DBX.cjs.map → bootstrap-BMWVB2T6.cjs.map} +1 -1
  7. package/dist/bootstrap-LL6O7PWO.js +6 -0
  8. package/dist/{bootstrap-WOVGAKZP.js.map → bootstrap-LL6O7PWO.js.map} +1 -1
  9. package/dist/{chunk-3VZCX4DF.cjs → chunk-42JPONZU.cjs} +77 -14
  10. package/dist/chunk-42JPONZU.cjs.map +1 -0
  11. package/dist/{chunk-3EVLFWH2.cjs → chunk-4M5PHMUE.cjs} +60 -346
  12. package/dist/chunk-4M5PHMUE.cjs.map +1 -0
  13. package/dist/chunk-4PWRCMTQ.cjs +15 -0
  14. package/dist/chunk-4PWRCMTQ.cjs.map +1 -0
  15. package/dist/chunk-6COM32WF.js +47 -0
  16. package/dist/chunk-6COM32WF.js.map +1 -0
  17. package/dist/chunk-6MSSF46R.js +941 -0
  18. package/dist/chunk-6MSSF46R.js.map +1 -0
  19. package/dist/{chunk-TZFJMPCH.cjs → chunk-7YITG2US.cjs} +9 -18
  20. package/dist/chunk-7YITG2US.cjs.map +1 -0
  21. package/dist/{chunk-A3RQWHKD.cjs → chunk-BLMFBDBG.cjs} +56 -6
  22. package/dist/chunk-BLMFBDBG.cjs.map +1 -0
  23. package/dist/{chunk-EINVJPFM.js → chunk-BTOE3VUK.js} +65 -3
  24. package/dist/chunk-BTOE3VUK.js.map +1 -0
  25. package/dist/chunk-E5X75WNB.js +497 -0
  26. package/dist/chunk-E5X75WNB.js.map +1 -0
  27. package/dist/chunk-E63IF3MD.cjs +951 -0
  28. package/dist/chunk-E63IF3MD.cjs.map +1 -0
  29. package/dist/{chunk-K7QF2QCM.cjs → chunk-FTSSDDZQ.cjs} +7 -3
  30. package/dist/chunk-FTSSDDZQ.cjs.map +1 -0
  31. package/dist/chunk-G7VZBCD6.cjs +35 -0
  32. package/dist/{chunk-5BLDMQED.cjs.map → chunk-G7VZBCD6.cjs.map} +1 -1
  33. package/dist/{chunk-VMSRTAH7.js → chunk-GLCPGZPM.js} +56 -6
  34. package/dist/chunk-GLCPGZPM.js.map +1 -0
  35. package/dist/{chunk-V3B25QOK.cjs → chunk-GVFB5C6O.cjs} +74 -2
  36. package/dist/chunk-GVFB5C6O.cjs.map +1 -0
  37. package/dist/chunk-HVSQDZZJ.cjs +765 -0
  38. package/dist/chunk-HVSQDZZJ.cjs.map +1 -0
  39. package/dist/chunk-HYC4GNHX.js +758 -0
  40. package/dist/chunk-HYC4GNHX.js.map +1 -0
  41. package/dist/chunk-KDVDIZ4Y.cjs +3479 -0
  42. package/dist/chunk-KDVDIZ4Y.cjs.map +1 -0
  43. package/dist/{chunk-OG3KX56O.js → chunk-KWGNR4HM.js} +7 -3
  44. package/dist/chunk-KWGNR4HM.js.map +1 -0
  45. package/dist/chunk-LIJVWQKU.cjs +256 -0
  46. package/dist/chunk-LIJVWQKU.cjs.map +1 -0
  47. package/dist/{chunk-XTZSUDSI.js → chunk-LTRCYJAG.js} +3 -18
  48. package/dist/chunk-LTRCYJAG.js.map +1 -0
  49. package/dist/{chunk-UEYC46RL.js → chunk-OUGKLCYF.js} +71 -8
  50. package/dist/chunk-OUGKLCYF.js.map +1 -0
  51. package/dist/chunk-RONAX6UU.js +3456 -0
  52. package/dist/chunk-RONAX6UU.js.map +1 -0
  53. package/dist/{chunk-5Y7QGIHD.js → chunk-RRYXQMZG.js} +60 -344
  54. package/dist/chunk-RRYXQMZG.js.map +1 -0
  55. package/dist/{chunk-QUJ4OLSC.js → chunk-U74F3YZU.js} +87 -7
  56. package/dist/chunk-U74F3YZU.js.map +1 -0
  57. package/dist/chunk-VIONYQ2K.cjs +517 -0
  58. package/dist/chunk-VIONYQ2K.cjs.map +1 -0
  59. package/dist/chunk-VSTRLXMQ.cjs +50 -0
  60. package/dist/chunk-VSTRLXMQ.cjs.map +1 -0
  61. package/dist/chunk-YT7HXXVN.js +13 -0
  62. package/dist/chunk-YT7HXXVN.js.map +1 -0
  63. package/dist/chunk-Z6ZWNWWR.js +30 -0
  64. package/dist/{chunk-NSBPE2FW.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
  65. package/dist/cli/index.cjs +11 -7
  66. package/dist/cli/index.cjs.map +1 -1
  67. package/dist/cli/index.js +11 -7
  68. package/dist/cli/index.js.map +1 -1
  69. package/dist/drizzle/index.cjs +20 -17
  70. package/dist/drizzle/index.d.cts +4 -4
  71. package/dist/drizzle/index.d.ts +4 -4
  72. package/dist/drizzle/index.js +4 -5
  73. package/dist/graphql/index.cjs +4 -4
  74. package/dist/graphql/index.d.cts +3 -2
  75. package/dist/graphql/index.d.ts +3 -2
  76. package/dist/graphql/index.js +2 -2
  77. package/dist/{index-DI0DRPNv.d.cts → index-BwE4NueJ.d.cts} +1 -1
  78. package/dist/{index-CMUNCIWQ.d.ts → index-DUKmDSeC.d.cts} +96 -24
  79. package/dist/{index-BMySjW6o.d.cts → index-DtBi3zP0.d.ts} +96 -24
  80. package/dist/{index-4fJKLFK2.d.ts → index-DupWTmW6.d.ts} +1 -1
  81. package/dist/index.cjs +3317 -352
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.cts +379 -105
  84. package/dist/index.d.ts +379 -105
  85. package/dist/index.js +3211 -310
  86. package/dist/index.js.map +1 -1
  87. package/dist/media-HOT3O7RW.js +4 -0
  88. package/dist/media-HOT3O7RW.js.map +1 -0
  89. package/dist/media-WKP5AOX2.cjs +17 -0
  90. package/dist/media-WKP5AOX2.cjs.map +1 -0
  91. package/dist/mongodb/index.cjs +1 -1
  92. package/dist/mongodb/index.d.cts +2 -2
  93. package/dist/mongodb/index.d.ts +2 -2
  94. package/dist/mongodb/index.js +1 -1
  95. package/dist/mysql-media-AI6YK767.cjs +48 -0
  96. package/dist/mysql-media-AI6YK767.cjs.map +1 -0
  97. package/dist/mysql-media-CDZUS7YX.js +45 -0
  98. package/dist/mysql-media-CDZUS7YX.js.map +1 -0
  99. package/dist/postgres-auth-adapter-EVRPO7BQ.cjs +14 -0
  100. package/dist/{postgres-auth-adapter-VK6GY7LX.cjs.map → postgres-auth-adapter-EVRPO7BQ.cjs.map} +1 -1
  101. package/dist/postgres-auth-adapter-OTRWSTT5.js +5 -0
  102. package/dist/{postgres-auth-adapter-REJFUMP7.js.map → postgres-auth-adapter-OTRWSTT5.js.map} +1 -1
  103. package/dist/redis-adapter-2N6VA7BI.cjs +13 -0
  104. package/dist/{redis-adapter-LBLNKGNS.cjs.map → redis-adapter-2N6VA7BI.cjs.map} +1 -1
  105. package/dist/redis-adapter-RA24FNCX.js +4 -0
  106. package/dist/{redis-adapter-4YDY4LWE.js.map → redis-adapter-RA24FNCX.js.map} +1 -1
  107. package/dist/rest/index.cjs +7 -5
  108. package/dist/rest/index.d.cts +29 -3
  109. package/dist/rest/index.d.ts +29 -3
  110. package/dist/rest/index.js +5 -3
  111. package/dist/schema-CNB2DDTX.js +6 -0
  112. package/dist/schema-CNB2DDTX.js.map +1 -0
  113. package/dist/schema-Y777CQQS.cjs +67 -0
  114. package/dist/schema-Y777CQQS.cjs.map +1 -0
  115. package/dist/templates/index.cjs +24 -28
  116. package/dist/templates/index.d.cts +2 -4
  117. package/dist/templates/index.d.ts +2 -4
  118. package/dist/templates/index.js +2 -2
  119. package/dist/trpc/index.cjs +12 -12
  120. package/dist/trpc/index.d.cts +19 -14
  121. package/dist/trpc/index.d.ts +19 -14
  122. package/dist/trpc/index.js +3 -3
  123. package/dist/{types-BGM5MV_K.d.cts → types-BM0s_YOy.d.cts} +67 -35
  124. package/dist/{types-BGM5MV_K.d.ts → types-BM0s_YOy.d.ts} +67 -35
  125. package/dist/ws/index.cjs +1 -1
  126. package/dist/ws/index.js +1 -1
  127. package/package.json +11 -1
  128. package/dist/bootstrap-WMWQ4DBX.cjs +0 -29
  129. package/dist/bootstrap-WOVGAKZP.js +0 -4
  130. package/dist/chunk-3EVLFWH2.cjs.map +0 -1
  131. package/dist/chunk-3QX6KG2S.js +0 -2125
  132. package/dist/chunk-3QX6KG2S.js.map +0 -1
  133. package/dist/chunk-3VZCX4DF.cjs.map +0 -1
  134. package/dist/chunk-5BLDMQED.cjs +0 -18
  135. package/dist/chunk-5Y7QGIHD.js.map +0 -1
  136. package/dist/chunk-7G6EVYCU.cjs +0 -94
  137. package/dist/chunk-7G6EVYCU.cjs.map +0 -1
  138. package/dist/chunk-A3RQWHKD.cjs.map +0 -1
  139. package/dist/chunk-EINVJPFM.js.map +0 -1
  140. package/dist/chunk-F5B64H5S.cjs +0 -2149
  141. package/dist/chunk-F5B64H5S.cjs.map +0 -1
  142. package/dist/chunk-K7QF2QCM.cjs.map +0 -1
  143. package/dist/chunk-LRTZJJPD.js +0 -86
  144. package/dist/chunk-LRTZJJPD.js.map +0 -1
  145. package/dist/chunk-NSBPE2FW.js +0 -15
  146. package/dist/chunk-OG3KX56O.js.map +0 -1
  147. package/dist/chunk-QUJ4OLSC.js.map +0 -1
  148. package/dist/chunk-R3XIBBAW.cjs +0 -34
  149. package/dist/chunk-R3XIBBAW.cjs.map +0 -1
  150. package/dist/chunk-SDMNUYVU.js +0 -30
  151. package/dist/chunk-SDMNUYVU.js.map +0 -1
  152. package/dist/chunk-TZFJMPCH.cjs.map +0 -1
  153. package/dist/chunk-UEG7KMKC.cjs +0 -228
  154. package/dist/chunk-UEG7KMKC.cjs.map +0 -1
  155. package/dist/chunk-UEYC46RL.js.map +0 -1
  156. package/dist/chunk-V3B25QOK.cjs.map +0 -1
  157. package/dist/chunk-VMSRTAH7.js.map +0 -1
  158. package/dist/chunk-XTZSUDSI.js.map +0 -1
  159. package/dist/chunk-YD7Y25W7.cjs +0 -176
  160. package/dist/chunk-YD7Y25W7.cjs.map +0 -1
  161. package/dist/chunk-YPAFJ7EV.js +0 -225
  162. package/dist/chunk-YPAFJ7EV.js.map +0 -1
  163. package/dist/database-7CJOXEZR.js +0 -5
  164. package/dist/database-7CJOXEZR.js.map +0 -1
  165. package/dist/database-QOIV44GT.cjs +0 -22
  166. package/dist/database-QOIV44GT.cjs.map +0 -1
  167. package/dist/postgres-auth-adapter-REJFUMP7.js +0 -5
  168. package/dist/postgres-auth-adapter-VK6GY7LX.cjs +0 -14
  169. package/dist/redis-adapter-4YDY4LWE.js +0 -4
  170. package/dist/redis-adapter-LBLNKGNS.cjs +0 -13
@@ -1,176 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkTZFJMPCH_cjs = require('./chunk-TZFJMPCH.cjs');
4
- var drizzleOrm = require('drizzle-orm');
5
- var bcrypt = require('bcryptjs');
6
- var crypto = require('crypto');
7
-
8
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
-
10
- var bcrypt__default = /*#__PURE__*/_interopDefault(bcrypt);
11
-
12
- var PostgresAuthAdapter = class {
13
- db;
14
- prefix;
15
- sessionTTL;
16
- refreshTokenTTL;
17
- constructor(options) {
18
- this.db = options.db;
19
- this.prefix = options.prefix || "kyro:";
20
- this.sessionTTL = options.sessionTTL || 86400;
21
- this.refreshTokenTTL = options.refreshTokenTTL || 604800;
22
- }
23
- async createUser(data) {
24
- const [user] = await this.db.insert(chunkTZFJMPCH_cjs.users).values({
25
- email: data.email.toLowerCase(),
26
- passwordHash: data.passwordHash,
27
- role: data.role || "customer",
28
- tenantId: data.tenantId
29
- }).returning();
30
- return this.userToAuthUser(user);
31
- }
32
- async findUserByEmail(email) {
33
- const [user] = await this.db.select().from(chunkTZFJMPCH_cjs.users).where(drizzleOrm.eq(chunkTZFJMPCH_cjs.users.email, email.toLowerCase())).limit(1);
34
- return user ? this.userToAuthUser(user) : null;
35
- }
36
- async findUserById(id) {
37
- const [user] = await this.db.select().from(chunkTZFJMPCH_cjs.users).where(drizzleOrm.eq(chunkTZFJMPCH_cjs.users.id, id)).limit(1);
38
- return user ? this.userToAuthUser(user) : null;
39
- }
40
- async updateUser(id, data) {
41
- const dbData = { updatedAt: /* @__PURE__ */ new Date() };
42
- if (data.email !== void 0) dbData.email = data.email;
43
- if (data.passwordHash !== void 0)
44
- dbData.passwordHash = data.passwordHash;
45
- if (data.role !== void 0) dbData.role = data.role;
46
- if (data.tenantId !== void 0) dbData.tenantId = data.tenantId;
47
- if (data.emailVerified !== void 0)
48
- dbData.emailVerified = data.emailVerified;
49
- if (data.locked !== void 0) dbData.locked = data.locked;
50
- if (data.lastLogin !== void 0)
51
- dbData.lastLogin = data.lastLogin ? new Date(data.lastLogin) : null;
52
- if (data.failedLoginAttempts !== void 0)
53
- dbData.failedLoginAttempts = data.failedLoginAttempts;
54
- const [user] = await this.db.update(chunkTZFJMPCH_cjs.users).set(dbData).where(drizzleOrm.eq(chunkTZFJMPCH_cjs.users.id, id)).returning();
55
- return user ? this.userToAuthUser(user) : null;
56
- }
57
- async deleteUser(id) {
58
- await this.db.delete(chunkTZFJMPCH_cjs.users).where(drizzleOrm.eq(chunkTZFJMPCH_cjs.users.id, id));
59
- return true;
60
- }
61
- async verifyPassword(password, hash) {
62
- return bcrypt__default.default.compare(password, hash);
63
- }
64
- async hashPassword(password) {
65
- return bcrypt__default.default.hash(password, 12);
66
- }
67
- async createSession(userId, data) {
68
- const token = crypto.randomBytes(32).toString("base64url");
69
- const refreshToken = crypto.randomBytes(32).toString("base64url");
70
- const expiresAt = new Date(Date.now() + this.sessionTTL * 1e3);
71
- new Date(Date.now() + this.refreshTokenTTL * 1e3);
72
- const [session] = await this.db.insert(chunkTZFJMPCH_cjs.sessions).values({
73
- userId,
74
- token,
75
- refreshToken,
76
- ipAddress: data?.ipAddress,
77
- userAgent: data?.userAgent,
78
- expiresAt
79
- }).returning();
80
- return this.sessionToSession(session);
81
- }
82
- async findSessionByToken(token) {
83
- const [session] = await this.db.select().from(chunkTZFJMPCH_cjs.sessions).where(drizzleOrm.and(drizzleOrm.eq(chunkTZFJMPCH_cjs.sessions.token, token), drizzleOrm.gt(chunkTZFJMPCH_cjs.sessions.expiresAt, /* @__PURE__ */ new Date()))).limit(1);
84
- return session ? this.sessionToSession(session) : null;
85
- }
86
- async deleteSession(sessionId) {
87
- await this.db.delete(chunkTZFJMPCH_cjs.sessions).where(drizzleOrm.eq(chunkTZFJMPCH_cjs.sessions.id, sessionId));
88
- return true;
89
- }
90
- async deleteUserSessions(userId) {
91
- await this.db.delete(chunkTZFJMPCH_cjs.sessions).where(drizzleOrm.eq(chunkTZFJMPCH_cjs.sessions.userId, userId));
92
- return 1;
93
- }
94
- async addPasswordToHistory(userId, passwordHash) {
95
- await this.db.insert(chunkTZFJMPCH_cjs.passwordHistory).values({
96
- userId,
97
- passwordHash
98
- });
99
- }
100
- async getPasswordHistory(userId, count = 5) {
101
- const history = await this.db.select({ passwordHash: chunkTZFJMPCH_cjs.passwordHistory.passwordHash }).from(chunkTZFJMPCH_cjs.passwordHistory).where(drizzleOrm.eq(chunkTZFJMPCH_cjs.passwordHistory.userId, userId)).orderBy(drizzleOrm.desc(chunkTZFJMPCH_cjs.passwordHistory.createdAt)).limit(count);
102
- return history.map((h) => h.passwordHash);
103
- }
104
- async isPasswordInHistory(password, userId, historyCount = 5) {
105
- const history = await this.getPasswordHistory(userId, historyCount);
106
- for (const hash of history) {
107
- if (await this.verifyPassword(password, hash)) {
108
- return true;
109
- }
110
- }
111
- return false;
112
- }
113
- async isLocked(userId) {
114
- const [lockout] = await this.db.select().from(chunkTZFJMPCH_cjs.lockouts).where(
115
- drizzleOrm.and(drizzleOrm.eq(chunkTZFJMPCH_cjs.lockouts.userId, userId), drizzleOrm.gt(chunkTZFJMPCH_cjs.lockouts.lockedUntil, /* @__PURE__ */ new Date()))
116
- ).limit(1);
117
- return !!lockout;
118
- }
119
- async getLockout(userId) {
120
- const [lockout] = await this.db.select().from(chunkTZFJMPCH_cjs.lockouts).where(
121
- drizzleOrm.and(drizzleOrm.eq(chunkTZFJMPCH_cjs.lockouts.userId, userId), drizzleOrm.gt(chunkTZFJMPCH_cjs.lockouts.lockedUntil, /* @__PURE__ */ new Date()))
122
- ).limit(1);
123
- return lockout ? { lockedUntil: lockout.lockedUntil } : null;
124
- }
125
- async recordFailedAttempt(userId, ipAddress) {
126
- const user = await this.findUserById(userId);
127
- const attempts = (user?.failedLoginAttempts || 0) + 1;
128
- await this.updateUser(userId, { failedLoginAttempts: attempts });
129
- const maxAttempts = 5;
130
- const locked = attempts >= maxAttempts;
131
- if (locked) {
132
- const lockoutDuration = 15 * 60 * 1e3;
133
- await this.db.insert(chunkTZFJMPCH_cjs.lockouts).values({
134
- userId,
135
- ipAddress,
136
- reason: "Too many failed login attempts",
137
- lockedUntil: new Date(Date.now() + lockoutDuration)
138
- });
139
- }
140
- return { attempts, locked };
141
- }
142
- async resetAttempts(userId) {
143
- await this.updateUser(userId, { failedLoginAttempts: 0 });
144
- }
145
- userToAuthUser(user) {
146
- return {
147
- id: user.id,
148
- email: user.email,
149
- passwordHash: user.passwordHash || void 0,
150
- role: user.role,
151
- tenantId: user.tenantId || void 0,
152
- emailVerified: user.emailVerified || false,
153
- locked: user.locked || false,
154
- lastLogin: user.lastLogin?.toISOString(),
155
- failedLoginAttempts: user.failedLoginAttempts || 0,
156
- createdAt: user.createdAt.toISOString(),
157
- updatedAt: user.updatedAt.toISOString()
158
- };
159
- }
160
- sessionToSession(session) {
161
- return {
162
- id: session.id,
163
- userId: session.userId,
164
- token: session.token,
165
- refreshToken: session.refreshToken || void 0,
166
- expiresAt: session.expiresAt.toISOString(),
167
- createdAt: session.createdAt.toISOString(),
168
- ipAddress: session.ipAddress || void 0,
169
- userAgent: session.userAgent || void 0
170
- };
171
- }
172
- };
173
-
174
- exports.PostgresAuthAdapter = PostgresAuthAdapter;
175
- //# sourceMappingURL=chunk-YD7Y25W7.cjs.map
176
- //# sourceMappingURL=chunk-YD7Y25W7.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/database/drizzle/postgres-auth-adapter.ts"],"names":["users","eq","bcrypt","randomBytes","sessions","and","gt","passwordHistory","desc","lockouts"],"mappings":"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","file":"chunk-YD7Y25W7.cjs","sourcesContent":["import type { PostgresJsDatabase } from \"drizzle-orm/postgres-js\";\nimport { eq, and, gt, desc } from \"drizzle-orm\";\nimport bcrypt from \"bcryptjs\";\nimport { randomBytes } from \"crypto\";\nimport type {\n AuthAdapter,\n AuthUser,\n Session,\n UserRole,\n} from \"../../auth/types.js\";\nimport {\n users,\n sessions,\n passwordHistory,\n auditLogs,\n lockouts,\n type AuthUser as AuthUserRow,\n} from \"./schema/auth.js\";\n\nexport interface PostgresAuthAdapterOptions {\n db: PostgresJsDatabase;\n prefix?: string;\n sessionTTL?: number;\n refreshTokenTTL?: number;\n}\n\nexport class PostgresAuthAdapter implements AuthAdapter {\n private db: PostgresJsDatabase;\n private prefix: string;\n private sessionTTL: number;\n private refreshTokenTTL: number;\n\n constructor(options: PostgresAuthAdapterOptions) {\n this.db = options.db;\n this.prefix = options.prefix || \"kyro:\";\n this.sessionTTL = options.sessionTTL || 86400;\n this.refreshTokenTTL = options.refreshTokenTTL || 604800;\n }\n\n async createUser(data: {\n email: string;\n passwordHash: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const [user] = await this.db\n .insert(users)\n .values({\n email: data.email.toLowerCase(),\n passwordHash: data.passwordHash,\n role: (data.role || \"customer\") as string,\n tenantId: data.tenantId,\n })\n .returning();\n\n return this.userToAuthUser(user);\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const [user] = await this.db\n .select()\n .from(users)\n .where(eq(users.email, email.toLowerCase()))\n .limit(1);\n\n return user ? this.userToAuthUser(user) : null;\n }\n\n async findUserById(id: string): Promise<AuthUser | null> {\n const [user] = await this.db\n .select()\n .from(users)\n .where(eq(users.id, id))\n .limit(1);\n\n return user ? this.userToAuthUser(user) : null;\n }\n\n async updateUser(\n id: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const dbData: Record<string, unknown> = { updatedAt: new Date() };\n if (data.email !== undefined) dbData.email = data.email;\n if (data.passwordHash !== undefined)\n dbData.passwordHash = data.passwordHash;\n if (data.role !== undefined) dbData.role = data.role;\n if (data.tenantId !== undefined) dbData.tenantId = data.tenantId;\n if (data.emailVerified !== undefined)\n dbData.emailVerified = data.emailVerified;\n if (data.locked !== undefined) dbData.locked = data.locked;\n if (data.lastLogin !== undefined)\n dbData.lastLogin = data.lastLogin ? new Date(data.lastLogin) : null;\n if (data.failedLoginAttempts !== undefined)\n dbData.failedLoginAttempts = data.failedLoginAttempts;\n\n const [user] = await this.db\n .update(users)\n .set(dbData)\n .where(eq(users.id, id))\n .returning();\n\n return user ? this.userToAuthUser(user) : null;\n }\n\n async deleteUser(id: string): Promise<boolean> {\n const result = await this.db.delete(users).where(eq(users.id, id));\n return true;\n }\n\n async verifyPassword(password: string, hash: string): Promise<boolean> {\n return bcrypt.compare(password, hash);\n }\n\n async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, 12);\n }\n\n async createSession(\n userId: string,\n data?: { ipAddress?: string; userAgent?: string },\n ): Promise<Session> {\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const expiresAt = new Date(Date.now() + this.sessionTTL * 1000);\n const refreshExpiresAt = new Date(Date.now() + this.refreshTokenTTL * 1000);\n\n const [session] = await this.db\n .insert(sessions)\n .values({\n userId,\n token,\n refreshToken,\n ipAddress: data?.ipAddress,\n userAgent: data?.userAgent,\n expiresAt,\n })\n .returning();\n\n return this.sessionToSession(session);\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n const [session] = await this.db\n .select()\n .from(sessions)\n .where(and(eq(sessions.token, token), gt(sessions.expiresAt, new Date())))\n .limit(1);\n\n return session ? this.sessionToSession(session) : null;\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n await this.db.delete(sessions).where(eq(sessions.id, sessionId));\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n const result = await this.db\n .delete(sessions)\n .where(eq(sessions.userId, userId));\n return 1;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n await this.db.insert(passwordHistory).values({\n userId,\n passwordHash,\n });\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n const history = await this.db\n .select({ passwordHash: passwordHistory.passwordHash })\n .from(passwordHistory)\n .where(eq(passwordHistory.userId, userId))\n .orderBy(desc(passwordHistory.createdAt))\n .limit(count);\n\n return history.map((h) => h.passwordHash);\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n\n for (const hash of history) {\n if (await this.verifyPassword(password, hash)) {\n return true;\n }\n }\n\n return false;\n }\n\n async isLocked(userId: string): Promise<boolean> {\n const [lockout] = await this.db\n .select()\n .from(lockouts)\n .where(\n and(eq(lockouts.userId, userId), gt(lockouts.lockedUntil, new Date())),\n )\n .limit(1);\n\n return !!lockout;\n }\n\n async getLockout(userId: string): Promise<{ lockedUntil: Date } | null> {\n const [lockout] = await this.db\n .select()\n .from(lockouts)\n .where(\n and(eq(lockouts.userId, userId), gt(lockouts.lockedUntil, new Date())),\n )\n .limit(1);\n\n return lockout ? { lockedUntil: lockout.lockedUntil } : null;\n }\n\n async recordFailedAttempt(\n userId: string,\n ipAddress?: string,\n ): Promise<{ attempts: number; locked: boolean }> {\n const user = await this.findUserById(userId);\n const attempts = (user?.failedLoginAttempts || 0) + 1;\n\n await this.updateUser(userId, { failedLoginAttempts: attempts });\n\n const maxAttempts = 5;\n const locked = attempts >= maxAttempts;\n\n if (locked) {\n const lockoutDuration = 15 * 60 * 1000;\n await this.db.insert(lockouts).values({\n userId,\n ipAddress,\n reason: \"Too many failed login attempts\",\n lockedUntil: new Date(Date.now() + lockoutDuration),\n });\n }\n\n return { attempts, locked };\n }\n\n async resetAttempts(userId: string): Promise<void> {\n await this.updateUser(userId, { failedLoginAttempts: 0 });\n }\n\n private userToAuthUser(user: AuthUserRow): AuthUser {\n return {\n id: user.id,\n email: user.email,\n passwordHash: user.passwordHash || undefined,\n role: user.role as UserRole,\n tenantId: user.tenantId || undefined,\n emailVerified: user.emailVerified || false,\n locked: user.locked || false,\n lastLogin: user.lastLogin?.toISOString(),\n failedLoginAttempts: user.failedLoginAttempts || 0,\n createdAt: user.createdAt.toISOString(),\n updatedAt: user.updatedAt.toISOString(),\n };\n }\n\n private sessionToSession(session: typeof sessions.$inferSelect): Session {\n return {\n id: session.id,\n userId: session.userId,\n token: session.token,\n refreshToken: session.refreshToken || undefined,\n expiresAt: session.expiresAt.toISOString(),\n createdAt: session.createdAt.toISOString(),\n ipAddress: session.ipAddress || undefined,\n userAgent: session.userAgent || undefined,\n };\n }\n}\n"]}
@@ -1,225 +0,0 @@
1
- import { evaluateAccess } from './chunk-SDMNUYVU.js';
2
- import { Hono } from 'hono';
3
-
4
- function createHonoApp(options) {
5
- const { registry, db, user, tenantID, cors } = options;
6
- const app = new Hono();
7
- if (cors) {
8
- app.use("*", async (c, next) => {
9
- const origin = c.req.header("Origin") || "*";
10
- if (cors.origins && !cors.origins.includes(origin) && !cors.origins.includes("*")) ;
11
- c.header("Access-Control-Allow-Origin", origin);
12
- c.header("Access-Control-Allow-Methods", "GET, POST, PATCH, DELETE, OPTIONS");
13
- c.header("Access-Control-Allow-Headers", "Content-Type, Authorization");
14
- if (cors.credentials) {
15
- c.header("Access-Control-Allow-Credentials", "true");
16
- }
17
- if (c.req.method === "OPTIONS") {
18
- return c.text("");
19
- }
20
- await next();
21
- });
22
- }
23
- app.get("/api/health", (c) => {
24
- return c.json({
25
- status: "ok",
26
- version: "0.1.0",
27
- collections: registry.getCollectionSlugs(),
28
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
29
- });
30
- });
31
- app.get("/api/collections", (c) => {
32
- const collections2 = registry.getCollections().map((col) => ({
33
- slug: col.slug,
34
- label: col.label || col.slug,
35
- fields: col.fields.filter((f) => f.name).map((f) => ({
36
- name: f.name,
37
- type: f.type,
38
- required: f.required,
39
- label: f.label
40
- }))
41
- }));
42
- return c.json(collections2);
43
- });
44
- const collections = registry.getCollections();
45
- for (const collection of collections) {
46
- const slug = collection.slug;
47
- const basePath = `/api/${slug}`;
48
- app.get(basePath, async (c) => {
49
- try {
50
- if (collection.access?.read) {
51
- const allowed = await evaluateAccess(collection.access.read, {
52
- req: c.req,
53
- user,
54
- tenantID
55
- });
56
- if (allowed === false) {
57
- return c.json({ error: "Access denied" }, 403);
58
- }
59
- }
60
- const url = new URL(c.req.url);
61
- const page = parseInt(url.searchParams.get("page") || "1");
62
- const limit = Math.min(parseInt(url.searchParams.get("limit") || "10"), 100);
63
- const sort = url.searchParams.get("sort") || void 0;
64
- const depth = parseInt(url.searchParams.get("depth") || "0");
65
- const select = url.searchParams.get("select")?.split(",") || void 0;
66
- let where = {};
67
- const whereParam = url.searchParams.get("where");
68
- if (whereParam) {
69
- try {
70
- where = JSON.parse(whereParam);
71
- } catch {
72
- }
73
- }
74
- const result = await db.find({
75
- collection: slug,
76
- where,
77
- sort,
78
- limit,
79
- page,
80
- depth,
81
- tenantID,
82
- select
83
- });
84
- return c.json(result);
85
- } catch (error) {
86
- return c.json({ error: error.message }, 500);
87
- }
88
- });
89
- app.get(`${basePath}/:id`, async (c) => {
90
- try {
91
- const id = c.req.param("id");
92
- const url = new URL(c.req.url);
93
- const depth = parseInt(url.searchParams.get("depth") || "0");
94
- const select = url.searchParams.get("select")?.split(",") || void 0;
95
- if (collection.access?.read) {
96
- const allowed = await evaluateAccess(collection.access.read, {
97
- req: c.req,
98
- user,
99
- tenantID,
100
- id
101
- });
102
- if (allowed === false) {
103
- return c.json({ error: "Access denied" }, 403);
104
- }
105
- }
106
- const doc = await db.findByID({
107
- collection: slug,
108
- id,
109
- depth,
110
- tenantID,
111
- select
112
- });
113
- if (!doc) {
114
- return c.json({ error: "Document not found" }, 404);
115
- }
116
- return c.json(doc);
117
- } catch (error) {
118
- return c.json({ error: error.message }, 500);
119
- }
120
- });
121
- app.post(basePath, async (c) => {
122
- try {
123
- const body = await c.req.json();
124
- if (collection.access?.create) {
125
- const allowed = await evaluateAccess(collection.access.create, {
126
- req: c.req,
127
- user,
128
- tenantID,
129
- data: body
130
- });
131
- if (allowed === false) {
132
- return c.json({ error: "Access denied" }, 403);
133
- }
134
- }
135
- const schema = registry.getCreateZodSchema(slug);
136
- const validated = schema.parse(body);
137
- if (collection.tenantScoped && tenantID) {
138
- validated.tenantID = tenantID;
139
- }
140
- const doc = await db.create({
141
- collection: slug,
142
- data: validated,
143
- tenantID
144
- });
145
- return c.json({ doc, message: "Created successfully" }, 201);
146
- } catch (error) {
147
- if (error.name === "ZodError") {
148
- return c.json({ error: "Validation failed", details: error.errors }, 400);
149
- }
150
- return c.json({ error: error.message }, 500);
151
- }
152
- });
153
- app.patch(`${basePath}/:id`, async (c) => {
154
- try {
155
- const id = c.req.param("id");
156
- const body = await c.req.json();
157
- if (collection.access?.update) {
158
- const allowed = await evaluateAccess(collection.access.update, {
159
- req: c.req,
160
- user,
161
- tenantID,
162
- id,
163
- data: body
164
- });
165
- if (allowed === false) {
166
- return c.json({ error: "Access denied" }, 403);
167
- }
168
- }
169
- const schema = registry.getUpdateZodSchema(slug);
170
- const validated = schema.parse(body);
171
- const doc = await db.update({
172
- collection: slug,
173
- id,
174
- data: validated,
175
- tenantID
176
- });
177
- return c.json({ doc, message: "Updated successfully" });
178
- } catch (error) {
179
- if (error.name === "ZodError") {
180
- return c.json({ error: "Validation failed", details: error.errors }, 400);
181
- }
182
- return c.json({ error: error.message }, 500);
183
- }
184
- });
185
- app.delete(`${basePath}/:id`, async (c) => {
186
- try {
187
- const id = c.req.param("id");
188
- if (collection.access?.delete) {
189
- const allowed = await evaluateAccess(collection.access.delete, {
190
- req: c.req,
191
- user,
192
- tenantID,
193
- id
194
- });
195
- if (allowed === false) {
196
- return c.json({ error: "Access denied" }, 403);
197
- }
198
- }
199
- const doc = await db.delete({
200
- collection: slug,
201
- id,
202
- tenantID
203
- });
204
- return c.json({ doc, message: "Deleted successfully" });
205
- } catch (error) {
206
- return c.json({ error: error.message }, 500);
207
- }
208
- });
209
- }
210
- return app;
211
- }
212
- function createRESTAPI(registry, db, options) {
213
- return createHonoApp({
214
- registry,
215
- db,
216
- user: options?.user,
217
- req: options?.req,
218
- tenantID: options?.tenantID,
219
- cors: options?.cors
220
- });
221
- }
222
-
223
- export { createHonoApp, createRESTAPI };
224
- //# sourceMappingURL=chunk-YPAFJ7EV.js.map
225
- //# sourceMappingURL=chunk-YPAFJ7EV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/rest/hono-app.ts"],"names":["collections"],"mappings":"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","file":"chunk-YPAFJ7EV.js","sourcesContent":["import { Hono } from 'hono';\nimport type { BaseAdapter } from '../../registry/types.js';\nimport { Registry } from '../../registry/index.js';\nimport { evaluateAccess } from '../../access/types.js';\nimport type { User, Request } from '../../hooks/types.js';\n\n// ============================================================================\n// REST API Factory\n// ============================================================================\n\nexport interface HonoAppOptions {\n registry: Registry;\n db: BaseAdapter;\n user?: User;\n req?: Request;\n tenantID?: string;\n cors?: {\n origins?: string[];\n credentials?: boolean;\n };\n}\n\nexport function createHonoApp(options: HonoAppOptions): Hono {\n const { registry, db, user, tenantID, cors } = options;\n const app = new Hono();\n\n // CORS middleware\n if (cors) {\n app.use('*', async (c, next) => {\n const origin = c.req.header('Origin') || '*';\n if (cors.origins && !cors.origins.includes(origin) && !cors.origins.includes('*')) {\n // Blocked origin\n }\n \n c.header('Access-Control-Allow-Origin', origin);\n c.header('Access-Control-Allow-Methods', 'GET, POST, PATCH, DELETE, OPTIONS');\n c.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n if (cors.credentials) {\n c.header('Access-Control-Allow-Credentials', 'true');\n }\n \n if (c.req.method === 'OPTIONS') {\n return c.text('');\n }\n \n await next();\n });\n }\n\n // Health check\n app.get('/api/health', (c) => {\n return c.json({\n status: 'ok',\n version: '0.1.0',\n collections: registry.getCollectionSlugs(),\n timestamp: new Date().toISOString(),\n });\n });\n\n // List collections\n app.get('/api/collections', (c) => {\n const collections = registry.getCollections().map(col => ({\n slug: col.slug,\n label: col.label || col.slug,\n fields: col.fields.filter(f => f.name).map(f => ({\n name: f.name,\n type: f.type,\n required: f.required,\n label: f.label,\n })),\n }));\n return c.json(collections);\n });\n\n // Dynamic collection routes\n const collections = registry.getCollections();\n\n for (const collection of collections) {\n const slug = collection.slug;\n const basePath = `/api/${slug}`;\n\n // GET /api/:collection - List\n app.get(basePath, async (c) => {\n try {\n // Check access\n if (collection.access?.read) {\n const allowed = await evaluateAccess(collection.access.read, {\n req: c.req as any,\n user,\n tenantID,\n });\n if (allowed === false) {\n return c.json({ error: 'Access denied' }, 403);\n }\n }\n\n // Parse query params\n const url = new URL(c.req.url);\n const page = parseInt(url.searchParams.get('page') || '1');\n const limit = Math.min(parseInt(url.searchParams.get('limit') || '10'), 100);\n const sort = url.searchParams.get('sort') || undefined;\n const depth = parseInt(url.searchParams.get('depth') || '0');\n const select = url.searchParams.get('select')?.split(',') || undefined;\n \n let where = {};\n const whereParam = url.searchParams.get('where');\n if (whereParam) {\n try {\n where = JSON.parse(whereParam);\n } catch {}\n }\n\n const result = await db.find({\n collection: slug,\n where,\n sort,\n limit,\n page,\n depth,\n tenantID,\n select,\n });\n\n return c.json(result);\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/:collection/:id - Find by ID\n app.get(`${basePath}/:id`, async (c) => {\n try {\n const id = c.req.param('id');\n const url = new URL(c.req.url);\n const depth = parseInt(url.searchParams.get('depth') || '0');\n const select = url.searchParams.get('select')?.split(',') || undefined;\n\n // Check access\n if (collection.access?.read) {\n const allowed = await evaluateAccess(collection.access.read, {\n req: c.req as any,\n user,\n tenantID,\n id,\n });\n if (allowed === false) {\n return c.json({ error: 'Access denied' }, 403);\n }\n }\n\n const doc = await db.findByID({\n collection: slug,\n id,\n depth,\n tenantID,\n select,\n });\n\n if (!doc) {\n return c.json({ error: 'Document not found' }, 404);\n }\n\n return c.json(doc);\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/:collection - Create\n app.post(basePath, async (c) => {\n try {\n const body = await c.req.json();\n\n // Check access\n if (collection.access?.create) {\n const allowed = await evaluateAccess(collection.access.create, {\n req: c.req as any,\n user,\n tenantID,\n data: body,\n });\n if (allowed === false) {\n return c.json({ error: 'Access denied' }, 403);\n }\n }\n\n // Validate with Zod\n const schema = registry.getCreateZodSchema(slug);\n const validated = schema.parse(body);\n\n // Add tenantID if scoped\n if (collection.tenantScoped && tenantID) {\n validated.tenantID = tenantID;\n }\n\n const doc = await db.create({\n collection: slug,\n data: validated,\n tenantID,\n });\n\n return c.json({ doc, message: 'Created successfully' }, 201);\n } catch (error: any) {\n if (error.name === 'ZodError') {\n return c.json({ error: 'Validation failed', details: error.errors }, 400);\n }\n return c.json({ error: error.message }, 500);\n }\n });\n\n // PATCH /api/:collection/:id - Update\n app.patch(`${basePath}/:id`, async (c) => {\n try {\n const id = c.req.param('id');\n const body = await c.req.json();\n\n // Check access\n if (collection.access?.update) {\n const allowed = await evaluateAccess(collection.access.update, {\n req: c.req as any,\n user,\n tenantID,\n id,\n data: body,\n });\n if (allowed === false) {\n return c.json({ error: 'Access denied' }, 403);\n }\n }\n\n // Validate with Zod\n const schema = registry.getUpdateZodSchema(slug);\n const validated = schema.parse(body);\n\n const doc = await db.update({\n collection: slug,\n id,\n data: validated,\n tenantID,\n });\n\n return c.json({ doc, message: 'Updated successfully' });\n } catch (error: any) {\n if (error.name === 'ZodError') {\n return c.json({ error: 'Validation failed', details: error.errors }, 400);\n }\n return c.json({ error: error.message }, 500);\n }\n });\n\n // DELETE /api/:collection/:id - Delete\n app.delete(`${basePath}/:id`, async (c) => {\n try {\n const id = c.req.param('id');\n\n // Check access\n if (collection.access?.delete) {\n const allowed = await evaluateAccess(collection.access.delete, {\n req: c.req as any,\n user,\n tenantID,\n id,\n });\n if (allowed === false) {\n return c.json({ error: 'Access denied' }, 403);\n }\n }\n\n const doc = await db.delete({\n collection: slug,\n id,\n tenantID,\n });\n\n return c.json({ doc, message: 'Deleted successfully' });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n }\n\n return app;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createRESTAPI(registry: Registry, db: BaseAdapter, options?: {\n user?: User;\n req?: Request;\n tenantID?: string;\n cors?: {\n origins?: string[];\n credentials?: boolean;\n };\n}): Hono {\n return createHonoApp({\n registry,\n db,\n user: options?.user,\n req: options?.req,\n tenantID: options?.tenantID,\n cors: options?.cors,\n });\n}\n"]}
@@ -1,5 +0,0 @@
1
- export { createDatabase, runMigrations, seedDefaultRoles } from './chunk-LRTZJJPD.js';
2
- import './chunk-XTZSUDSI.js';
3
- import './chunk-NSBPE2FW.js';
4
- //# sourceMappingURL=database-7CJOXEZR.js.map
5
- //# sourceMappingURL=database-7CJOXEZR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"database-7CJOXEZR.js"}
@@ -1,22 +0,0 @@
1
- 'use strict';
2
-
3
- var chunk7G6EVYCU_cjs = require('./chunk-7G6EVYCU.cjs');
4
- require('./chunk-TZFJMPCH.cjs');
5
- require('./chunk-5BLDMQED.cjs');
6
-
7
-
8
-
9
- Object.defineProperty(exports, "createDatabase", {
10
- enumerable: true,
11
- get: function () { return chunk7G6EVYCU_cjs.createDatabase; }
12
- });
13
- Object.defineProperty(exports, "runMigrations", {
14
- enumerable: true,
15
- get: function () { return chunk7G6EVYCU_cjs.runMigrations; }
16
- });
17
- Object.defineProperty(exports, "seedDefaultRoles", {
18
- enumerable: true,
19
- get: function () { return chunk7G6EVYCU_cjs.seedDefaultRoles; }
20
- });
21
- //# sourceMappingURL=database-QOIV44GT.cjs.map
22
- //# sourceMappingURL=database-QOIV44GT.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"database-QOIV44GT.cjs"}
@@ -1,5 +0,0 @@
1
- export { PostgresAuthAdapter } from './chunk-QUJ4OLSC.js';
2
- import './chunk-XTZSUDSI.js';
3
- import './chunk-NSBPE2FW.js';
4
- //# sourceMappingURL=postgres-auth-adapter-REJFUMP7.js.map
5
- //# sourceMappingURL=postgres-auth-adapter-REJFUMP7.js.map
@@ -1,14 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkYD7Y25W7_cjs = require('./chunk-YD7Y25W7.cjs');
4
- require('./chunk-TZFJMPCH.cjs');
5
- require('./chunk-5BLDMQED.cjs');
6
-
7
-
8
-
9
- Object.defineProperty(exports, "PostgresAuthAdapter", {
10
- enumerable: true,
11
- get: function () { return chunkYD7Y25W7_cjs.PostgresAuthAdapter; }
12
- });
13
- //# sourceMappingURL=postgres-auth-adapter-VK6GY7LX.cjs.map
14
- //# sourceMappingURL=postgres-auth-adapter-VK6GY7LX.cjs.map
@@ -1,4 +0,0 @@
1
- export { RedisAuthAdapter } from './chunk-VMSRTAH7.js';
2
- import './chunk-NSBPE2FW.js';
3
- //# sourceMappingURL=redis-adapter-4YDY4LWE.js.map
4
- //# sourceMappingURL=redis-adapter-4YDY4LWE.js.map
@@ -1,13 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkA3RQWHKD_cjs = require('./chunk-A3RQWHKD.cjs');
4
- require('./chunk-5BLDMQED.cjs');
5
-
6
-
7
-
8
- Object.defineProperty(exports, "RedisAuthAdapter", {
9
- enumerable: true,
10
- get: function () { return chunkA3RQWHKD_cjs.RedisAuthAdapter; }
11
- });
12
- //# sourceMappingURL=redis-adapter-LBLNKGNS.cjs.map
13
- //# sourceMappingURL=redis-adapter-LBLNKGNS.cjs.map