@kyro-cms/core 0.1.5 → 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.
- package/dist/WebhookService-BCgL1bLF.d.cts +112 -0
- package/dist/WebhookService-BPVJUgTl.d.ts +112 -0
- package/dist/{base-DlhVlwnN.d.cts → base-B0Y6isUJ.d.cts} +1 -1
- package/dist/{base-CQkFzqQl.d.ts → base-DaP-5PPG.d.ts} +1 -1
- package/dist/bootstrap-BMWVB2T6.cjs +31 -0
- package/dist/{bootstrap-X6TP3NKX.cjs.map → bootstrap-BMWVB2T6.cjs.map} +1 -1
- package/dist/bootstrap-LL6O7PWO.js +6 -0
- package/dist/{bootstrap-BDTTUGY2.js.map → bootstrap-LL6O7PWO.js.map} +1 -1
- package/dist/{chunk-3VZCX4DF.cjs → chunk-42JPONZU.cjs} +77 -14
- package/dist/chunk-42JPONZU.cjs.map +1 -0
- package/dist/{chunk-MHS6CPO5.cjs → chunk-4M5PHMUE.cjs} +66 -346
- package/dist/chunk-4M5PHMUE.cjs.map +1 -0
- package/dist/chunk-4PWRCMTQ.cjs +15 -0
- package/dist/chunk-4PWRCMTQ.cjs.map +1 -0
- package/dist/chunk-6COM32WF.js +47 -0
- package/dist/chunk-6COM32WF.js.map +1 -0
- package/dist/chunk-6MSSF46R.js +941 -0
- package/dist/chunk-6MSSF46R.js.map +1 -0
- package/dist/{chunk-TZFJMPCH.cjs → chunk-7YITG2US.cjs} +9 -18
- package/dist/chunk-7YITG2US.cjs.map +1 -0
- package/dist/{chunk-A3RQWHKD.cjs → chunk-BLMFBDBG.cjs} +56 -6
- package/dist/chunk-BLMFBDBG.cjs.map +1 -0
- package/dist/{chunk-EINVJPFM.js → chunk-BTOE3VUK.js} +65 -3
- package/dist/chunk-BTOE3VUK.js.map +1 -0
- package/dist/chunk-E5X75WNB.js +497 -0
- package/dist/chunk-E5X75WNB.js.map +1 -0
- package/dist/chunk-E63IF3MD.cjs +951 -0
- package/dist/chunk-E63IF3MD.cjs.map +1 -0
- package/dist/{chunk-K7QF2QCM.cjs → chunk-FTSSDDZQ.cjs} +7 -3
- package/dist/chunk-FTSSDDZQ.cjs.map +1 -0
- package/dist/chunk-G7VZBCD6.cjs +35 -0
- package/dist/{chunk-5BLDMQED.cjs.map → chunk-G7VZBCD6.cjs.map} +1 -1
- package/dist/{chunk-VMSRTAH7.js → chunk-GLCPGZPM.js} +56 -6
- package/dist/chunk-GLCPGZPM.js.map +1 -0
- package/dist/{chunk-V3B25QOK.cjs → chunk-GVFB5C6O.cjs} +74 -2
- package/dist/chunk-GVFB5C6O.cjs.map +1 -0
- package/dist/chunk-HVSQDZZJ.cjs +765 -0
- package/dist/chunk-HVSQDZZJ.cjs.map +1 -0
- package/dist/chunk-HYC4GNHX.js +758 -0
- package/dist/chunk-HYC4GNHX.js.map +1 -0
- package/dist/chunk-KDVDIZ4Y.cjs +3479 -0
- package/dist/chunk-KDVDIZ4Y.cjs.map +1 -0
- package/dist/{chunk-OG3KX56O.js → chunk-KWGNR4HM.js} +7 -3
- package/dist/chunk-KWGNR4HM.js.map +1 -0
- package/dist/chunk-LIJVWQKU.cjs +256 -0
- package/dist/chunk-LIJVWQKU.cjs.map +1 -0
- package/dist/{chunk-XTZSUDSI.js → chunk-LTRCYJAG.js} +3 -18
- package/dist/chunk-LTRCYJAG.js.map +1 -0
- package/dist/{chunk-UEYC46RL.js → chunk-OUGKLCYF.js} +71 -8
- package/dist/chunk-OUGKLCYF.js.map +1 -0
- package/dist/chunk-RONAX6UU.js +3456 -0
- package/dist/chunk-RONAX6UU.js.map +1 -0
- package/dist/{chunk-C74MQIRL.js → chunk-RRYXQMZG.js} +66 -344
- package/dist/chunk-RRYXQMZG.js.map +1 -0
- package/dist/{chunk-QUJ4OLSC.js → chunk-U74F3YZU.js} +87 -7
- package/dist/chunk-U74F3YZU.js.map +1 -0
- package/dist/chunk-VIONYQ2K.cjs +517 -0
- package/dist/chunk-VIONYQ2K.cjs.map +1 -0
- package/dist/chunk-VSTRLXMQ.cjs +50 -0
- package/dist/chunk-VSTRLXMQ.cjs.map +1 -0
- package/dist/chunk-YT7HXXVN.js +13 -0
- package/dist/chunk-YT7HXXVN.js.map +1 -0
- package/dist/chunk-Z6ZWNWWR.js +30 -0
- package/dist/{chunk-NSBPE2FW.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
- package/dist/cli/index.cjs +11 -7
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +11 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/drizzle/index.cjs +20 -17
- package/dist/drizzle/index.d.cts +4 -4
- package/dist/drizzle/index.d.ts +4 -4
- package/dist/drizzle/index.js +4 -5
- package/dist/graphql/index.cjs +4 -4
- package/dist/graphql/index.d.cts +3 -2
- package/dist/graphql/index.d.ts +3 -2
- package/dist/graphql/index.js +2 -2
- package/dist/{index-DI0DRPNv.d.cts → index-BwE4NueJ.d.cts} +1 -1
- package/dist/{index-CMUNCIWQ.d.ts → index-DUKmDSeC.d.cts} +96 -24
- package/dist/{index-BMySjW6o.d.cts → index-DtBi3zP0.d.ts} +96 -24
- package/dist/{index-4fJKLFK2.d.ts → index-DupWTmW6.d.ts} +1 -1
- package/dist/index.cjs +3317 -352
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +379 -105
- package/dist/index.d.ts +379 -105
- package/dist/index.js +3211 -310
- package/dist/index.js.map +1 -1
- package/dist/media-HOT3O7RW.js +4 -0
- package/dist/media-HOT3O7RW.js.map +1 -0
- package/dist/media-WKP5AOX2.cjs +17 -0
- package/dist/media-WKP5AOX2.cjs.map +1 -0
- package/dist/mongodb/index.cjs +1 -1
- package/dist/mongodb/index.d.cts +2 -2
- package/dist/mongodb/index.d.ts +2 -2
- package/dist/mongodb/index.js +1 -1
- package/dist/mysql-media-AI6YK767.cjs +48 -0
- package/dist/mysql-media-AI6YK767.cjs.map +1 -0
- package/dist/mysql-media-CDZUS7YX.js +45 -0
- package/dist/mysql-media-CDZUS7YX.js.map +1 -0
- package/dist/postgres-auth-adapter-EVRPO7BQ.cjs +14 -0
- package/dist/{postgres-auth-adapter-VK6GY7LX.cjs.map → postgres-auth-adapter-EVRPO7BQ.cjs.map} +1 -1
- package/dist/postgres-auth-adapter-OTRWSTT5.js +5 -0
- package/dist/{postgres-auth-adapter-REJFUMP7.js.map → postgres-auth-adapter-OTRWSTT5.js.map} +1 -1
- package/dist/redis-adapter-2N6VA7BI.cjs +13 -0
- package/dist/{redis-adapter-LBLNKGNS.cjs.map → redis-adapter-2N6VA7BI.cjs.map} +1 -1
- package/dist/redis-adapter-RA24FNCX.js +4 -0
- package/dist/{redis-adapter-4YDY4LWE.js.map → redis-adapter-RA24FNCX.js.map} +1 -1
- package/dist/rest/index.cjs +7 -5
- package/dist/rest/index.d.cts +29 -3
- package/dist/rest/index.d.ts +29 -3
- package/dist/rest/index.js +5 -3
- package/dist/schema-CNB2DDTX.js +6 -0
- package/dist/schema-CNB2DDTX.js.map +1 -0
- package/dist/schema-Y777CQQS.cjs +67 -0
- package/dist/schema-Y777CQQS.cjs.map +1 -0
- package/dist/templates/index.cjs +24 -28
- package/dist/templates/index.d.cts +2 -4
- package/dist/templates/index.d.ts +2 -4
- package/dist/templates/index.js +2 -2
- package/dist/trpc/index.cjs +12 -12
- package/dist/trpc/index.d.cts +19 -14
- package/dist/trpc/index.d.ts +19 -14
- package/dist/trpc/index.js +3 -3
- package/dist/{types-BGM5MV_K.d.cts → types-BM0s_YOy.d.cts} +67 -35
- package/dist/{types-BGM5MV_K.d.ts → types-BM0s_YOy.d.ts} +67 -35
- package/dist/ws/index.cjs +1 -1
- package/dist/ws/index.js +1 -1
- package/package.json +11 -1
- package/dist/bootstrap-BDTTUGY2.js +0 -4
- package/dist/bootstrap-X6TP3NKX.cjs +0 -29
- package/dist/chunk-3QX6KG2S.js +0 -2125
- package/dist/chunk-3QX6KG2S.js.map +0 -1
- package/dist/chunk-3VZCX4DF.cjs.map +0 -1
- package/dist/chunk-5BLDMQED.cjs +0 -18
- package/dist/chunk-7G6EVYCU.cjs +0 -94
- package/dist/chunk-7G6EVYCU.cjs.map +0 -1
- package/dist/chunk-A3RQWHKD.cjs.map +0 -1
- package/dist/chunk-C74MQIRL.js.map +0 -1
- package/dist/chunk-EINVJPFM.js.map +0 -1
- package/dist/chunk-F5B64H5S.cjs +0 -2149
- package/dist/chunk-F5B64H5S.cjs.map +0 -1
- package/dist/chunk-K7QF2QCM.cjs.map +0 -1
- package/dist/chunk-LRTZJJPD.js +0 -86
- package/dist/chunk-LRTZJJPD.js.map +0 -1
- package/dist/chunk-MHS6CPO5.cjs.map +0 -1
- package/dist/chunk-NSBPE2FW.js +0 -15
- package/dist/chunk-OG3KX56O.js.map +0 -1
- package/dist/chunk-QUJ4OLSC.js.map +0 -1
- package/dist/chunk-R3XIBBAW.cjs +0 -34
- package/dist/chunk-R3XIBBAW.cjs.map +0 -1
- package/dist/chunk-SDMNUYVU.js +0 -30
- package/dist/chunk-SDMNUYVU.js.map +0 -1
- package/dist/chunk-TZFJMPCH.cjs.map +0 -1
- package/dist/chunk-UEG7KMKC.cjs +0 -228
- package/dist/chunk-UEG7KMKC.cjs.map +0 -1
- package/dist/chunk-UEYC46RL.js.map +0 -1
- package/dist/chunk-V3B25QOK.cjs.map +0 -1
- package/dist/chunk-VMSRTAH7.js.map +0 -1
- package/dist/chunk-XTZSUDSI.js.map +0 -1
- package/dist/chunk-YD7Y25W7.cjs +0 -176
- package/dist/chunk-YD7Y25W7.cjs.map +0 -1
- package/dist/chunk-YPAFJ7EV.js +0 -225
- package/dist/chunk-YPAFJ7EV.js.map +0 -1
- package/dist/database-7CJOXEZR.js +0 -5
- package/dist/database-7CJOXEZR.js.map +0 -1
- package/dist/database-QOIV44GT.cjs +0 -22
- package/dist/database-QOIV44GT.cjs.map +0 -1
- package/dist/postgres-auth-adapter-REJFUMP7.js +0 -5
- package/dist/postgres-auth-adapter-VK6GY7LX.cjs +0 -14
- package/dist/redis-adapter-4YDY4LWE.js +0 -4
- package/dist/redis-adapter-LBLNKGNS.cjs +0 -13
package/dist/chunk-YD7Y25W7.cjs
DELETED
|
@@ -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"]}
|
package/dist/chunk-YPAFJ7EV.js
DELETED
|
@@ -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 +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,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,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
|