@kyro-cms/core 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +556 -130
- package/dist/bootstrap-2WJK6PG7.cjs +29 -0
- package/dist/bootstrap-2WJK6PG7.cjs.map +1 -0
- package/dist/bootstrap-Q2TWUQF3.js +4 -0
- package/dist/bootstrap-Q2TWUQF3.js.map +1 -0
- package/dist/chunk-3QX6KG2S.js +2125 -0
- package/dist/chunk-3QX6KG2S.js.map +1 -0
- package/dist/chunk-5AOILNGY.cjs +212 -0
- package/dist/chunk-5AOILNGY.cjs.map +1 -0
- package/dist/{chunk-DKSMFC3L.js → chunk-EINVJPFM.js} +2 -2
- package/dist/{chunk-DKSMFC3L.js.map → chunk-EINVJPFM.js.map} +1 -1
- package/dist/chunk-F5B64H5S.cjs +2149 -0
- package/dist/chunk-F5B64H5S.cjs.map +1 -0
- package/dist/chunk-I4BORBXT.cjs +914 -0
- package/dist/chunk-I4BORBXT.cjs.map +1 -0
- package/dist/chunk-KA3UOIFC.js +206 -0
- package/dist/chunk-KA3UOIFC.js.map +1 -0
- package/dist/chunk-KWTKEBHM.cjs +176 -0
- package/dist/chunk-KWTKEBHM.cjs.map +1 -0
- package/dist/chunk-M4JFHQ5J.js +170 -0
- package/dist/chunk-M4JFHQ5J.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +9 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-Q7SFCCGT.cjs +11 -0
- package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
- package/dist/chunk-U4CHJTWX.cjs +94 -0
- package/dist/chunk-U4CHJTWX.cjs.map +1 -0
- package/dist/{chunk-3Q3FS5J4.cjs → chunk-V3B25QOK.cjs} +2 -2
- package/dist/{chunk-3Q3FS5J4.cjs.map → chunk-V3B25QOK.cjs.map} +1 -1
- package/dist/chunk-V67YXRBT.js +899 -0
- package/dist/chunk-V67YXRBT.js.map +1 -0
- package/dist/chunk-XLMVCGXA.js +86 -0
- package/dist/chunk-XLMVCGXA.js.map +1 -0
- package/dist/cli/index.cjs +106 -14
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +106 -14
- package/dist/cli/index.js.map +1 -1
- package/dist/database-37KXWUER.js +5 -0
- package/dist/database-37KXWUER.js.map +1 -0
- package/dist/database-LJKD3HE4.cjs +22 -0
- package/dist/database-LJKD3HE4.cjs.map +1 -0
- package/dist/drizzle/index.cjs +25 -5
- package/dist/drizzle/index.d.cts +5 -49
- package/dist/drizzle/index.d.ts +5 -49
- package/dist/drizzle/index.js +5 -1
- package/dist/graphql/index.cjs +1 -0
- package/dist/graphql/index.js +1 -0
- package/dist/index-BVFlb7uU.d.ts +192 -0
- package/dist/index-CzkEHKqu.d.cts +192 -0
- package/dist/index.cjs +1203 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +382 -68
- package/dist/index.d.ts +382 -68
- package/dist/index.js +1110 -20
- package/dist/index.js.map +1 -1
- package/dist/mongodb/index.cjs +1 -0
- package/dist/mongodb/index.js +1 -0
- package/dist/postgres-auth-adapter-CYZAVPPP.cjs +14 -0
- package/dist/postgres-auth-adapter-CYZAVPPP.cjs.map +1 -0
- package/dist/postgres-auth-adapter-LTDUGBMB.js +5 -0
- package/dist/postgres-auth-adapter-LTDUGBMB.js.map +1 -0
- package/dist/rest/index.cjs +1 -0
- package/dist/rest/index.js +1 -0
- package/dist/templates/index.cjs +101 -0
- package/dist/templates/index.cjs.map +1 -0
- package/dist/templates/index.d.cts +55 -0
- package/dist/templates/index.d.ts +55 -0
- package/dist/templates/index.js +4 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/trpc/index.cjs +1 -0
- package/dist/trpc/index.js +1 -0
- package/dist/ws/index.cjs +1 -0
- package/dist/ws/index.js +1 -0
- package/package.json +40 -6
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { users, sessions, passwordHistory, lockouts } from './chunk-KA3UOIFC.js';
|
|
2
|
+
import { eq, and, gt, desc } from 'drizzle-orm';
|
|
3
|
+
import bcrypt from 'bcryptjs';
|
|
4
|
+
import { randomBytes } from 'crypto';
|
|
5
|
+
|
|
6
|
+
var PostgresAuthAdapter = class {
|
|
7
|
+
db;
|
|
8
|
+
prefix;
|
|
9
|
+
sessionTTL;
|
|
10
|
+
refreshTokenTTL;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.db = options.db;
|
|
13
|
+
this.prefix = options.prefix || "kyro:";
|
|
14
|
+
this.sessionTTL = options.sessionTTL || 86400;
|
|
15
|
+
this.refreshTokenTTL = options.refreshTokenTTL || 604800;
|
|
16
|
+
}
|
|
17
|
+
async createUser(data) {
|
|
18
|
+
const [user] = await this.db.insert(users).values({
|
|
19
|
+
email: data.email.toLowerCase(),
|
|
20
|
+
passwordHash: data.passwordHash,
|
|
21
|
+
role: data.role || "customer",
|
|
22
|
+
tenantId: data.tenantId
|
|
23
|
+
}).returning();
|
|
24
|
+
return this.userToAuthUser(user);
|
|
25
|
+
}
|
|
26
|
+
async findUserByEmail(email) {
|
|
27
|
+
const [user] = await this.db.select().from(users).where(eq(users.email, email.toLowerCase())).limit(1);
|
|
28
|
+
return user ? this.userToAuthUser(user) : null;
|
|
29
|
+
}
|
|
30
|
+
async findUserById(id) {
|
|
31
|
+
const [user] = await this.db.select().from(users).where(eq(users.id, id)).limit(1);
|
|
32
|
+
return user ? this.userToAuthUser(user) : null;
|
|
33
|
+
}
|
|
34
|
+
async updateUser(id, data) {
|
|
35
|
+
const dbData = { updatedAt: /* @__PURE__ */ new Date() };
|
|
36
|
+
if (data.email !== void 0) dbData.email = data.email;
|
|
37
|
+
if (data.passwordHash !== void 0)
|
|
38
|
+
dbData.passwordHash = data.passwordHash;
|
|
39
|
+
if (data.role !== void 0) dbData.role = data.role;
|
|
40
|
+
if (data.tenantId !== void 0) dbData.tenantId = data.tenantId;
|
|
41
|
+
if (data.emailVerified !== void 0)
|
|
42
|
+
dbData.emailVerified = data.emailVerified;
|
|
43
|
+
if (data.locked !== void 0) dbData.locked = data.locked;
|
|
44
|
+
if (data.lastLogin !== void 0)
|
|
45
|
+
dbData.lastLogin = data.lastLogin ? new Date(data.lastLogin) : null;
|
|
46
|
+
if (data.failedLoginAttempts !== void 0)
|
|
47
|
+
dbData.failedLoginAttempts = data.failedLoginAttempts;
|
|
48
|
+
const [user] = await this.db.update(users).set(dbData).where(eq(users.id, id)).returning();
|
|
49
|
+
return user ? this.userToAuthUser(user) : null;
|
|
50
|
+
}
|
|
51
|
+
async deleteUser(id) {
|
|
52
|
+
await this.db.delete(users).where(eq(users.id, id));
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
async verifyPassword(password, hash) {
|
|
56
|
+
return bcrypt.compare(password, hash);
|
|
57
|
+
}
|
|
58
|
+
async hashPassword(password) {
|
|
59
|
+
return bcrypt.hash(password, 12);
|
|
60
|
+
}
|
|
61
|
+
async createSession(userId, data) {
|
|
62
|
+
const token = randomBytes(32).toString("base64url");
|
|
63
|
+
const refreshToken = randomBytes(32).toString("base64url");
|
|
64
|
+
const expiresAt = new Date(Date.now() + this.sessionTTL * 1e3);
|
|
65
|
+
new Date(Date.now() + this.refreshTokenTTL * 1e3);
|
|
66
|
+
const [session] = await this.db.insert(sessions).values({
|
|
67
|
+
userId,
|
|
68
|
+
token,
|
|
69
|
+
refreshToken,
|
|
70
|
+
ipAddress: data?.ipAddress,
|
|
71
|
+
userAgent: data?.userAgent,
|
|
72
|
+
expiresAt
|
|
73
|
+
}).returning();
|
|
74
|
+
return this.sessionToSession(session);
|
|
75
|
+
}
|
|
76
|
+
async findSessionByToken(token) {
|
|
77
|
+
const [session] = await this.db.select().from(sessions).where(and(eq(sessions.token, token), gt(sessions.expiresAt, /* @__PURE__ */ new Date()))).limit(1);
|
|
78
|
+
return session ? this.sessionToSession(session) : null;
|
|
79
|
+
}
|
|
80
|
+
async deleteSession(sessionId) {
|
|
81
|
+
await this.db.delete(sessions).where(eq(sessions.id, sessionId));
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
async deleteUserSessions(userId) {
|
|
85
|
+
await this.db.delete(sessions).where(eq(sessions.userId, userId));
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
async addPasswordToHistory(userId, passwordHash) {
|
|
89
|
+
await this.db.insert(passwordHistory).values({
|
|
90
|
+
userId,
|
|
91
|
+
passwordHash
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async getPasswordHistory(userId, count = 5) {
|
|
95
|
+
const history = await this.db.select({ passwordHash: passwordHistory.passwordHash }).from(passwordHistory).where(eq(passwordHistory.userId, userId)).orderBy(desc(passwordHistory.createdAt)).limit(count);
|
|
96
|
+
return history.map((h) => h.passwordHash);
|
|
97
|
+
}
|
|
98
|
+
async isPasswordInHistory(password, userId, historyCount = 5) {
|
|
99
|
+
const history = await this.getPasswordHistory(userId, historyCount);
|
|
100
|
+
for (const hash of history) {
|
|
101
|
+
if (await this.verifyPassword(password, hash)) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
async isLocked(userId) {
|
|
108
|
+
const [lockout] = await this.db.select().from(lockouts).where(
|
|
109
|
+
and(eq(lockouts.userId, userId), gt(lockouts.lockedUntil, /* @__PURE__ */ new Date()))
|
|
110
|
+
).limit(1);
|
|
111
|
+
return !!lockout;
|
|
112
|
+
}
|
|
113
|
+
async getLockout(userId) {
|
|
114
|
+
const [lockout] = await this.db.select().from(lockouts).where(
|
|
115
|
+
and(eq(lockouts.userId, userId), gt(lockouts.lockedUntil, /* @__PURE__ */ new Date()))
|
|
116
|
+
).limit(1);
|
|
117
|
+
return lockout ? { lockedUntil: lockout.lockedUntil } : null;
|
|
118
|
+
}
|
|
119
|
+
async recordFailedAttempt(userId, ipAddress) {
|
|
120
|
+
const user = await this.findUserById(userId);
|
|
121
|
+
const attempts = (user?.failedLoginAttempts || 0) + 1;
|
|
122
|
+
await this.updateUser(userId, { failedLoginAttempts: attempts });
|
|
123
|
+
const maxAttempts = 5;
|
|
124
|
+
const locked = attempts >= maxAttempts;
|
|
125
|
+
if (locked) {
|
|
126
|
+
const lockoutDuration = 15 * 60 * 1e3;
|
|
127
|
+
await this.db.insert(lockouts).values({
|
|
128
|
+
userId,
|
|
129
|
+
ipAddress,
|
|
130
|
+
reason: "Too many failed login attempts",
|
|
131
|
+
lockedUntil: new Date(Date.now() + lockoutDuration)
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return { attempts, locked };
|
|
135
|
+
}
|
|
136
|
+
async resetAttempts(userId) {
|
|
137
|
+
await this.updateUser(userId, { failedLoginAttempts: 0 });
|
|
138
|
+
}
|
|
139
|
+
userToAuthUser(user) {
|
|
140
|
+
return {
|
|
141
|
+
id: user.id,
|
|
142
|
+
email: user.email,
|
|
143
|
+
passwordHash: user.passwordHash || void 0,
|
|
144
|
+
role: user.role,
|
|
145
|
+
tenantId: user.tenantId || void 0,
|
|
146
|
+
emailVerified: user.emailVerified || false,
|
|
147
|
+
locked: user.locked || false,
|
|
148
|
+
lastLogin: user.lastLogin?.toISOString(),
|
|
149
|
+
failedLoginAttempts: user.failedLoginAttempts || 0,
|
|
150
|
+
createdAt: user.createdAt.toISOString(),
|
|
151
|
+
updatedAt: user.updatedAt.toISOString()
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
sessionToSession(session) {
|
|
155
|
+
return {
|
|
156
|
+
id: session.id,
|
|
157
|
+
userId: session.userId,
|
|
158
|
+
token: session.token,
|
|
159
|
+
refreshToken: session.refreshToken || void 0,
|
|
160
|
+
expiresAt: session.expiresAt.toISOString(),
|
|
161
|
+
createdAt: session.createdAt.toISOString(),
|
|
162
|
+
ipAddress: session.ipAddress || void 0,
|
|
163
|
+
userAgent: session.userAgent || void 0
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export { PostgresAuthAdapter };
|
|
169
|
+
//# sourceMappingURL=chunk-M4JFHQ5J.js.map
|
|
170
|
+
//# sourceMappingURL=chunk-M4JFHQ5J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/drizzle/postgres-auth-adapter.ts"],"names":[],"mappings":"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","file":"chunk-M4JFHQ5J.js","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"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export { __export };
|
|
8
|
+
//# sourceMappingURL=chunk-PZ5AY32C.js.map
|
|
9
|
+
//# sourceMappingURL=chunk-PZ5AY32C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-PZ5AY32C.js"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __export = (target, all) => {
|
|
5
|
+
for (var name in all)
|
|
6
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
exports.__export = __export;
|
|
10
|
+
//# sourceMappingURL=chunk-Q7SFCCGT.cjs.map
|
|
11
|
+
//# sourceMappingURL=chunk-Q7SFCCGT.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-Q7SFCCGT.cjs"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk5AOILNGY_cjs = require('./chunk-5AOILNGY.cjs');
|
|
4
|
+
var postgresJs = require('drizzle-orm/postgres-js');
|
|
5
|
+
var postgres = require('postgres');
|
|
6
|
+
var migrator = require('drizzle-orm/postgres-js/migrator');
|
|
7
|
+
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var postgres__default = /*#__PURE__*/_interopDefault(postgres);
|
|
11
|
+
|
|
12
|
+
function getEnv(key, fallback = "") {
|
|
13
|
+
return process.env[key] || fallback;
|
|
14
|
+
}
|
|
15
|
+
function getEnvNum(key, fallback = 0) {
|
|
16
|
+
const val = process.env[key];
|
|
17
|
+
if (!val) return fallback;
|
|
18
|
+
return parseInt(val, 10);
|
|
19
|
+
}
|
|
20
|
+
async function createDatabase(config) {
|
|
21
|
+
const databaseUrl = config?.url || getEnv(
|
|
22
|
+
"DATABASE_URL",
|
|
23
|
+
"postgresql://postgres:postgres@localhost:5432/kyro_cms"
|
|
24
|
+
);
|
|
25
|
+
const maxConnections = config?.maxConnections || getEnvNum("DATABASE_POOL_MAX", 10);
|
|
26
|
+
const ssl = config?.ssl || getEnv("DATABASE_SSL", "false") === "true";
|
|
27
|
+
const client = postgres__default.default(databaseUrl, {
|
|
28
|
+
max: maxConnections,
|
|
29
|
+
ssl: ssl ? "require" : false
|
|
30
|
+
});
|
|
31
|
+
const db = postgresJs.drizzle(client, { schema: chunk5AOILNGY_cjs.auth_exports });
|
|
32
|
+
return { client, db };
|
|
33
|
+
}
|
|
34
|
+
async function runMigrations(db) {
|
|
35
|
+
console.log("Running migrations...");
|
|
36
|
+
await migrator.migrate(db, { migrationsFolder: "./drizzle" });
|
|
37
|
+
console.log("Migrations complete");
|
|
38
|
+
}
|
|
39
|
+
async function seedDefaultRoles(db) {
|
|
40
|
+
const { roles } = chunk5AOILNGY_cjs.auth_exports;
|
|
41
|
+
const defaultRoles = [
|
|
42
|
+
{
|
|
43
|
+
name: "super_admin",
|
|
44
|
+
level: 100,
|
|
45
|
+
inherits: [],
|
|
46
|
+
description: "Full system access across all tenants",
|
|
47
|
+
isSystem: true
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "admin",
|
|
51
|
+
level: 90,
|
|
52
|
+
inherits: ["editor"],
|
|
53
|
+
description: "Full tenant access with all content permissions",
|
|
54
|
+
isSystem: true
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: "editor",
|
|
58
|
+
level: 70,
|
|
59
|
+
inherits: ["author"],
|
|
60
|
+
description: "Edit and publish all content",
|
|
61
|
+
isSystem: true
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "author",
|
|
65
|
+
level: 50,
|
|
66
|
+
inherits: ["customer"],
|
|
67
|
+
description: "Create and edit own content",
|
|
68
|
+
isSystem: true
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "customer",
|
|
72
|
+
level: 30,
|
|
73
|
+
inherits: [],
|
|
74
|
+
description: "Access own data and make purchases",
|
|
75
|
+
isSystem: true
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "guest",
|
|
79
|
+
level: 10,
|
|
80
|
+
inherits: [],
|
|
81
|
+
description: "Public read-only access",
|
|
82
|
+
isSystem: true
|
|
83
|
+
}
|
|
84
|
+
];
|
|
85
|
+
for (const role of defaultRoles) {
|
|
86
|
+
await db.insert(roles).values(role).onConflictDoNothing();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
exports.createDatabase = createDatabase;
|
|
91
|
+
exports.runMigrations = runMigrations;
|
|
92
|
+
exports.seedDefaultRoles = seedDefaultRoles;
|
|
93
|
+
//# sourceMappingURL=chunk-U4CHJTWX.cjs.map
|
|
94
|
+
//# sourceMappingURL=chunk-U4CHJTWX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/drizzle/database.ts"],"names":["postgres","drizzle","auth_exports","migrate"],"mappings":"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","file":"chunk-U4CHJTWX.cjs","sourcesContent":["import { drizzle } from \"drizzle-orm/postgres-js\";\nimport postgres from \"postgres\";\nimport { migrate } from \"drizzle-orm/postgres-js/migrator\";\nimport * as schema from \"./schema/auth.js\";\n\nfunction getEnv(key: string, fallback: string = \"\"): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvNum(key: string, fallback: number = 0): number {\n const val = process.env[key];\n if (!val) return fallback;\n return parseInt(val, 10);\n}\n\nexport interface DatabaseConfig {\n url: string;\n maxConnections: number;\n ssl: boolean;\n}\n\nexport async function createDatabase(config?: Partial<DatabaseConfig>) {\n const databaseUrl =\n config?.url ||\n getEnv(\n \"DATABASE_URL\",\n \"postgresql://postgres:postgres@localhost:5432/kyro_cms\",\n );\n const maxConnections =\n config?.maxConnections || getEnvNum(\"DATABASE_POOL_MAX\", 10);\n const ssl = config?.ssl || getEnv(\"DATABASE_SSL\", \"false\") === \"true\";\n\n const client = postgres(databaseUrl, {\n max: maxConnections,\n ssl: ssl ? \"require\" : false,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const db = drizzle(client, { schema: schema as any });\n\n return { client, db };\n}\n\nexport async function runMigrations(db: ReturnType<typeof drizzle>) {\n console.log(\"Running migrations...\");\n await migrate(db, { migrationsFolder: \"./drizzle\" });\n console.log(\"Migrations complete\");\n}\n\nexport async function seedDefaultRoles(db: ReturnType<typeof drizzle>) {\n const { roles } = schema;\n\n const defaultRoles = [\n {\n name: \"super_admin\",\n level: 100,\n inherits: [],\n description: \"Full system access across all tenants\",\n isSystem: true,\n },\n {\n name: \"admin\",\n level: 90,\n inherits: [\"editor\"],\n description: \"Full tenant access with all content permissions\",\n isSystem: true,\n },\n {\n name: \"editor\",\n level: 70,\n inherits: [\"author\"],\n description: \"Edit and publish all content\",\n isSystem: true,\n },\n {\n name: \"author\",\n level: 50,\n inherits: [\"customer\"],\n description: \"Create and edit own content\",\n isSystem: true,\n },\n {\n name: \"customer\",\n level: 30,\n inherits: [],\n description: \"Access own data and make purchases\",\n isSystem: true,\n },\n {\n name: \"guest\",\n level: 10,\n inherits: [],\n description: \"Public read-only access\",\n isSystem: true,\n },\n ];\n\n for (const role of defaultRoles) {\n await db.insert(roles).values(role).onConflictDoNothing();\n }\n}\n"]}
|
|
@@ -269,5 +269,5 @@ exports.DrizzleAdapter = DrizzleAdapter;
|
|
|
269
269
|
exports.collectionToDrizzleSchema = collectionToDrizzleSchema;
|
|
270
270
|
exports.createDrizzleAdapter = createDrizzleAdapter;
|
|
271
271
|
exports.fieldToDrizzleType = fieldToDrizzleType;
|
|
272
|
-
//# sourceMappingURL=chunk-
|
|
273
|
-
//# sourceMappingURL=chunk-
|
|
272
|
+
//# sourceMappingURL=chunk-V3B25QOK.cjs.map
|
|
273
|
+
//# sourceMappingURL=chunk-V3B25QOK.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/database/drizzle/adapter.ts"],"names":["AbstractBaseAdapter"],"mappings":"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","file":"chunk-3Q3FS5J4.cjs","sourcesContent":["import { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n} from '../../registry/types.js';\nimport type { Field, RelationshipField } from '../../fields/types.js';\n\n// ============================================================================\n// Drizzle Schema Generator\n// ============================================================================\n\nexport function fieldToDrizzleType(field: Field, dialect: 'postgres' | 'mysql' | 'sqlite' = 'postgres'): string {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'number':\n return field.integer ? 'integer' : 'decimal';\n case 'checkbox':\n return 'boolean';\n case 'date':\n return 'timestamp';\n case 'select':\n case 'radio':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'richtext':\n case 'json':\n case 'array':\n case 'group':\n case 'blocks':\n case 'row':\n case 'collapsible':\n case 'tabs':\n return 'jsonb';\n case 'relationship':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'upload':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n default:\n return 'jsonb';\n }\n}\n\nexport function collectionToDrizzleSchema(\n collection: CollectionConfig,\n dialect: 'postgres' | 'mysql' | 'sqlite' = 'postgres'\n): string {\n const tableName = collection.slug.replace(/-/g, '_');\n const lines: string[] = [];\n \n lines.push(`export const ${tableName} = ${dialect === 'mysql' ? 'mysqlTable' : 'pgTable'}('${tableName}', {`);\n \n // Add id field\n lines.push(` id: ${dialect === 'mysql' ? 'varchar' : 'uuid'}('${dialect === 'mysql' ? 'id' : 'id'}').${dialect === 'mysql' ? \"primaryKey().default(sql`UUID()`)\" : \"primaryKey().defaultRandom()\"},`);\n \n // Process fields\n for (const field of collection.fields) {\n if (field.name === 'id') continue;\n \n const dbType = fieldToDrizzleType(field, dialect);\n const isRequired = field.required;\n \n let fieldDef = ` ${field.name}: ${dialect === 'mysql' ? 'mysql' : 'pg'}.${dbType}('${field.name}')`;\n \n // Add constraints\n if (field.unique) fieldDef += '.unique()';\n if (!isRequired) fieldDef += '.nullable()';\n \n // Add default value\n if (field.defaultValue !== undefined) {\n if (typeof field.defaultValue === 'string') {\n fieldDef += `.default('${field.defaultValue}')`;\n } else if (typeof field.defaultValue === 'boolean') {\n fieldDef += `.default(${field.defaultValue})`;\n } else {\n fieldDef += `.default(sql\\`${JSON.stringify(field.defaultValue)}\\`)`;\n }\n }\n \n fieldDef += ',';\n lines.push(fieldDef);\n }\n \n // Add timestamps\n if (collection.timestamps) {\n lines.push(` createdAt: ${dialect === 'mysql' ? 'mysql' : 'pg'}.timestamp('created_at').defaultNow(),`);\n lines.push(` updatedAt: ${dialect === 'mysql' ? 'mysql' : 'pg'}.timestamp('updated_at').defaultNow(),`);\n }\n \n // Add tenantID\n if (collection.tenantScoped) {\n lines.push(` tenantId: ${dialect === 'mysql' ? 'mysql' : 'pg'}.varchar('tenant_id'),`);\n }\n \n lines.push('});');\n \n return lines.join('\\n');\n}\n\n// ============================================================================\n// Drizzle Adapter\n// ============================================================================\n\nexport class DrizzleAdapter extends AbstractBaseAdapter {\n private client: any;\n private schema: any;\n private dialect: 'postgres' | 'mysql' | 'sqlite';\n \n constructor(options: {\n type: 'postgres' | 'mysql' | 'sqlite';\n client: any;\n schema?: any;\n }) {\n super();\n this.client = options.client;\n this.schema = options.schema || {};\n this.dialect = options.type;\n }\n\n async connect(): Promise<void> {\n this.connected = true;\n console.log(`[DrizzleAdapter] Connected to ${this.dialect}`);\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n console.log(`[DrizzleAdapter] Disconnected from ${this.dialect}`);\n }\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n // Build query\n const filters = this.buildWhereClause(where, config, tenantID);\n const sortOption = this.parseSort(sort);\n\n // Get total count\n const totalDocs = await this.count({ collection: slug, where, tenantID });\n\n // Execute query\n const offset = (page - 1) * limit;\n \n let docs: T[] = [];\n try {\n const results = await this.client\n .select()\n .from(table)\n .where(filters)\n .orderBy(sortOption.direction === 'asc' ? table[sortOption.field] : undefined)\n .limit(limit)\n .offset(offset);\n\n docs = results.map((doc: any) => this.processResult(doc, config));\n } catch (error) {\n console.error(`[DrizzleAdapter] Query error:`, error);\n docs = [];\n }\n\n return {\n docs,\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n let query = this.client\n .select()\n .from(table)\n .where(table.id.equals(id));\n\n if (tenantID) {\n query = query.where(table.tenantId.equals(tenantID));\n }\n\n const results = await query.limit(1);\n if (results.length === 0) return null;\n\n return this.processResult(results[0], config) as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const insertData = this.prepareData(data, config);\n if (tenantID) {\n insertData.tenantId = tenantID;\n }\n\n const result = await this.client\n .insert(table)\n .values(insertData)\n .returning();\n\n return this.processResult(result[0], config) as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const updateData = this.prepareData(data, config);\n if (tenantID) {\n updateData.tenantId = tenantID;\n }\n\n const result = await this.client\n .update(table)\n .set(updateData)\n .where(table.id.equals(id))\n .returning();\n\n return this.processResult(result[0], config) as T;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n let query = this.client\n .delete(table)\n .where(table.id.equals(id))\n .returning();\n\n if (tenantID) {\n query = query.where(table.tenantId.equals(tenantID));\n }\n\n const result = await query;\n if (result.length === 0) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(result[0], config) as T;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, where = {}, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const filters = this.buildWhereClause(where, config, tenantID);\n\n try {\n const result = await this.client\n .select({ count: `count(*)` })\n .from(table)\n .where(filters);\n\n return parseInt(result[0]?.count || '0');\n } catch {\n return 0;\n }\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string }): Promise<any> {\n const { collection: slug, where = {}, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const filters = this.buildWhereClause(where, config, tenantID);\n\n const results = await this.client\n .select()\n .from(table)\n .where(filters)\n .limit(1);\n\n if (results.length === 0) return null;\n\n return this.processResult(results[0], config);\n }\n\n async findVersions(args: FindArgs): Promise<FindResult<any>> {\n // Versions are stored in a separate table\n const { collection: slug, where = {}, sort, limit = 10, page = 1 } = args;\n \n // Placeholder implementation\n return {\n docs: [],\n ...this.calculatePagination(page, limit, 0),\n };\n }\n\n async findVersionByID(args: FindByIDArgs): Promise<any> {\n return null;\n }\n\n async createVersion(args: CreateArgs): Promise<any> {\n return args.data;\n }\n\n async deleteVersions(args: { collection: string; where: Record<string, any> }): Promise<void> {\n // Placeholder\n }\n\n // ========================================================================\n // Helper Methods\n // ========================================================================\n\n private getTable(slug: string): any {\n const tableName = this.getTableName(slug);\n const table = this.schema[tableName];\n if (!table) {\n throw new Error(`Table \"${tableName}\" not found in schema`);\n }\n return table;\n }\n\n private buildWhereClause(\n where: Record<string, any>,\n config: CollectionConfig,\n tenantID?: string\n ): any {\n // Simplified where clause builder\n const conditions: any[] = [];\n\n // Apply tenant filter\n if (tenantID && config.tenantScoped) {\n conditions.push({ tenantId: tenantID });\n }\n\n // Process where conditions\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' && Array.isArray(value)) {\n // AND conditions\n for (const subCondition of value) {\n conditions.push(...Object.entries(subCondition).map(([k, v]) => ({ [k]: v })));\n }\n } else if (key === 'OR' && Array.isArray(value)) {\n // OR conditions - simplified\n conditions.push(...value.flatMap((v: any) => \n Object.entries(v).map(([k, val]) => ({ [k]: val }))\n ));\n } else if (typeof value === 'object' && value !== null) {\n // Operator-based conditions\n if (value.equals !== undefined) conditions.push({ [key]: value.equals });\n if (value.not_equals !== undefined) conditions.push({ [key]: { not: value.not_equals } });\n if (value.in) conditions.push({ [key]: { in: value.in } });\n if (value.like) conditions.push({ [key]: { like: value.like } });\n if (value.greater_than !== undefined) conditions.push({ [key]: { gt: value.greater_than } });\n if (value.greater_than_equal !== undefined) conditions.push({ [key]: { gte: value.greater_than_equal } });\n if (value.less_than !== undefined) conditions.push({ [key]: { lt: value.less_than } });\n if (value.less_than_equal !== undefined) conditions.push({ [key]: { lte: value.less_than_equal } });\n } else {\n // Direct equality\n conditions.push({ [key]: value });\n }\n }\n\n return conditions.length > 0 ? conditions : undefined;\n }\n\n private processResult(data: any, config: CollectionConfig): any {\n if (!data) return null;\n\n const result = { ...data };\n\n // Convert id field\n if (data.id) {\n result.id = String(data.id);\n }\n\n // Parse JSON fields\n for (const field of config.fields) {\n if (field.type === 'json' || field.type === 'richtext' || field.type === 'array' || field.type === 'group' || field.type === 'blocks') {\n if (result[field.name] && typeof result[field.name] === 'string') {\n try {\n result[field.name] = JSON.parse(result[field.name]);\n } catch {\n // Keep original value\n }\n }\n }\n }\n\n // Convert timestamps to ISO strings\n if (result.createdAt) {\n result.createdAt = new Date(result.createdAt).toISOString();\n }\n if (result.updatedAt) {\n result.updatedAt = new Date(result.updatedAt).toISOString();\n }\n\n return result;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport function createDrizzleAdapter(options: {\n type: 'postgres' | 'mysql' | 'sqlite';\n client: any;\n schema?: any;\n}): DrizzleAdapter {\n return new DrizzleAdapter(options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/database/drizzle/adapter.ts"],"names":["AbstractBaseAdapter"],"mappings":"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","file":"chunk-V3B25QOK.cjs","sourcesContent":["import { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n} from '../../registry/types.js';\nimport type { Field, RelationshipField } from '../../fields/types.js';\n\n// ============================================================================\n// Drizzle Schema Generator\n// ============================================================================\n\nexport function fieldToDrizzleType(field: Field, dialect: 'postgres' | 'mysql' | 'sqlite' = 'postgres'): string {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'number':\n return field.integer ? 'integer' : 'decimal';\n case 'checkbox':\n return 'boolean';\n case 'date':\n return 'timestamp';\n case 'select':\n case 'radio':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'richtext':\n case 'json':\n case 'array':\n case 'group':\n case 'blocks':\n case 'row':\n case 'collapsible':\n case 'tabs':\n return 'jsonb';\n case 'relationship':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'upload':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n default:\n return 'jsonb';\n }\n}\n\nexport function collectionToDrizzleSchema(\n collection: CollectionConfig,\n dialect: 'postgres' | 'mysql' | 'sqlite' = 'postgres'\n): string {\n const tableName = collection.slug.replace(/-/g, '_');\n const lines: string[] = [];\n \n lines.push(`export const ${tableName} = ${dialect === 'mysql' ? 'mysqlTable' : 'pgTable'}('${tableName}', {`);\n \n // Add id field\n lines.push(` id: ${dialect === 'mysql' ? 'varchar' : 'uuid'}('${dialect === 'mysql' ? 'id' : 'id'}').${dialect === 'mysql' ? \"primaryKey().default(sql`UUID()`)\" : \"primaryKey().defaultRandom()\"},`);\n \n // Process fields\n for (const field of collection.fields) {\n if (field.name === 'id') continue;\n \n const dbType = fieldToDrizzleType(field, dialect);\n const isRequired = field.required;\n \n let fieldDef = ` ${field.name}: ${dialect === 'mysql' ? 'mysql' : 'pg'}.${dbType}('${field.name}')`;\n \n // Add constraints\n if (field.unique) fieldDef += '.unique()';\n if (!isRequired) fieldDef += '.nullable()';\n \n // Add default value\n if (field.defaultValue !== undefined) {\n if (typeof field.defaultValue === 'string') {\n fieldDef += `.default('${field.defaultValue}')`;\n } else if (typeof field.defaultValue === 'boolean') {\n fieldDef += `.default(${field.defaultValue})`;\n } else {\n fieldDef += `.default(sql\\`${JSON.stringify(field.defaultValue)}\\`)`;\n }\n }\n \n fieldDef += ',';\n lines.push(fieldDef);\n }\n \n // Add timestamps\n if (collection.timestamps) {\n lines.push(` createdAt: ${dialect === 'mysql' ? 'mysql' : 'pg'}.timestamp('created_at').defaultNow(),`);\n lines.push(` updatedAt: ${dialect === 'mysql' ? 'mysql' : 'pg'}.timestamp('updated_at').defaultNow(),`);\n }\n \n // Add tenantID\n if (collection.tenantScoped) {\n lines.push(` tenantId: ${dialect === 'mysql' ? 'mysql' : 'pg'}.varchar('tenant_id'),`);\n }\n \n lines.push('});');\n \n return lines.join('\\n');\n}\n\n// ============================================================================\n// Drizzle Adapter\n// ============================================================================\n\nexport class DrizzleAdapter extends AbstractBaseAdapter {\n private client: any;\n private schema: any;\n private dialect: 'postgres' | 'mysql' | 'sqlite';\n \n constructor(options: {\n type: 'postgres' | 'mysql' | 'sqlite';\n client: any;\n schema?: any;\n }) {\n super();\n this.client = options.client;\n this.schema = options.schema || {};\n this.dialect = options.type;\n }\n\n async connect(): Promise<void> {\n this.connected = true;\n console.log(`[DrizzleAdapter] Connected to ${this.dialect}`);\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n console.log(`[DrizzleAdapter] Disconnected from ${this.dialect}`);\n }\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n // Build query\n const filters = this.buildWhereClause(where, config, tenantID);\n const sortOption = this.parseSort(sort);\n\n // Get total count\n const totalDocs = await this.count({ collection: slug, where, tenantID });\n\n // Execute query\n const offset = (page - 1) * limit;\n \n let docs: T[] = [];\n try {\n const results = await this.client\n .select()\n .from(table)\n .where(filters)\n .orderBy(sortOption.direction === 'asc' ? table[sortOption.field] : undefined)\n .limit(limit)\n .offset(offset);\n\n docs = results.map((doc: any) => this.processResult(doc, config));\n } catch (error) {\n console.error(`[DrizzleAdapter] Query error:`, error);\n docs = [];\n }\n\n return {\n docs,\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n let query = this.client\n .select()\n .from(table)\n .where(table.id.equals(id));\n\n if (tenantID) {\n query = query.where(table.tenantId.equals(tenantID));\n }\n\n const results = await query.limit(1);\n if (results.length === 0) return null;\n\n return this.processResult(results[0], config) as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const insertData = this.prepareData(data, config);\n if (tenantID) {\n insertData.tenantId = tenantID;\n }\n\n const result = await this.client\n .insert(table)\n .values(insertData)\n .returning();\n\n return this.processResult(result[0], config) as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const updateData = this.prepareData(data, config);\n if (tenantID) {\n updateData.tenantId = tenantID;\n }\n\n const result = await this.client\n .update(table)\n .set(updateData)\n .where(table.id.equals(id))\n .returning();\n\n return this.processResult(result[0], config) as T;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n let query = this.client\n .delete(table)\n .where(table.id.equals(id))\n .returning();\n\n if (tenantID) {\n query = query.where(table.tenantId.equals(tenantID));\n }\n\n const result = await query;\n if (result.length === 0) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(result[0], config) as T;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, where = {}, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const filters = this.buildWhereClause(where, config, tenantID);\n\n try {\n const result = await this.client\n .select({ count: `count(*)` })\n .from(table)\n .where(filters);\n\n return parseInt(result[0]?.count || '0');\n } catch {\n return 0;\n }\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string }): Promise<any> {\n const { collection: slug, where = {}, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const filters = this.buildWhereClause(where, config, tenantID);\n\n const results = await this.client\n .select()\n .from(table)\n .where(filters)\n .limit(1);\n\n if (results.length === 0) return null;\n\n return this.processResult(results[0], config);\n }\n\n async findVersions(args: FindArgs): Promise<FindResult<any>> {\n // Versions are stored in a separate table\n const { collection: slug, where = {}, sort, limit = 10, page = 1 } = args;\n \n // Placeholder implementation\n return {\n docs: [],\n ...this.calculatePagination(page, limit, 0),\n };\n }\n\n async findVersionByID(args: FindByIDArgs): Promise<any> {\n return null;\n }\n\n async createVersion(args: CreateArgs): Promise<any> {\n return args.data;\n }\n\n async deleteVersions(args: { collection: string; where: Record<string, any> }): Promise<void> {\n // Placeholder\n }\n\n // ========================================================================\n // Helper Methods\n // ========================================================================\n\n private getTable(slug: string): any {\n const tableName = this.getTableName(slug);\n const table = this.schema[tableName];\n if (!table) {\n throw new Error(`Table \"${tableName}\" not found in schema`);\n }\n return table;\n }\n\n private buildWhereClause(\n where: Record<string, any>,\n config: CollectionConfig,\n tenantID?: string\n ): any {\n // Simplified where clause builder\n const conditions: any[] = [];\n\n // Apply tenant filter\n if (tenantID && config.tenantScoped) {\n conditions.push({ tenantId: tenantID });\n }\n\n // Process where conditions\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' && Array.isArray(value)) {\n // AND conditions\n for (const subCondition of value) {\n conditions.push(...Object.entries(subCondition).map(([k, v]) => ({ [k]: v })));\n }\n } else if (key === 'OR' && Array.isArray(value)) {\n // OR conditions - simplified\n conditions.push(...value.flatMap((v: any) => \n Object.entries(v).map(([k, val]) => ({ [k]: val }))\n ));\n } else if (typeof value === 'object' && value !== null) {\n // Operator-based conditions\n if (value.equals !== undefined) conditions.push({ [key]: value.equals });\n if (value.not_equals !== undefined) conditions.push({ [key]: { not: value.not_equals } });\n if (value.in) conditions.push({ [key]: { in: value.in } });\n if (value.like) conditions.push({ [key]: { like: value.like } });\n if (value.greater_than !== undefined) conditions.push({ [key]: { gt: value.greater_than } });\n if (value.greater_than_equal !== undefined) conditions.push({ [key]: { gte: value.greater_than_equal } });\n if (value.less_than !== undefined) conditions.push({ [key]: { lt: value.less_than } });\n if (value.less_than_equal !== undefined) conditions.push({ [key]: { lte: value.less_than_equal } });\n } else {\n // Direct equality\n conditions.push({ [key]: value });\n }\n }\n\n return conditions.length > 0 ? conditions : undefined;\n }\n\n private processResult(data: any, config: CollectionConfig): any {\n if (!data) return null;\n\n const result = { ...data };\n\n // Convert id field\n if (data.id) {\n result.id = String(data.id);\n }\n\n // Parse JSON fields\n for (const field of config.fields) {\n if (field.type === 'json' || field.type === 'richtext' || field.type === 'array' || field.type === 'group' || field.type === 'blocks') {\n if (result[field.name] && typeof result[field.name] === 'string') {\n try {\n result[field.name] = JSON.parse(result[field.name]);\n } catch {\n // Keep original value\n }\n }\n }\n }\n\n // Convert timestamps to ISO strings\n if (result.createdAt) {\n result.createdAt = new Date(result.createdAt).toISOString();\n }\n if (result.updatedAt) {\n result.updatedAt = new Date(result.updatedAt).toISOString();\n }\n\n return result;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport function createDrizzleAdapter(options: {\n type: 'postgres' | 'mysql' | 'sqlite';\n client: any;\n schema?: any;\n}): DrizzleAdapter {\n return new DrizzleAdapter(options);\n}\n"]}
|