sitepaige-mcp-server 0.7.9 → 0.7.11

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.
@@ -156,14 +156,14 @@ export async function POST(request: Request) {
156
156
 
157
157
  // Delete existing sessions for this user
158
158
  const existingSessions = await db_query(db,
159
- "SELECT ID FROM UserSession WHERE userid = ?",
159
+ "SELECT ID FROM usersession WHERE userid = ?",
160
160
  [user.userid]
161
161
  );
162
162
 
163
163
  if (existingSessions && existingSessions.length > 0) {
164
164
  const sessionIds = existingSessions.map(session => session.ID);
165
165
  const placeholders = sessionIds.map(() => '?').join(',');
166
- await db_query(db, `DELETE FROM UserSession WHERE ID IN (${placeholders})`, sessionIds);
166
+ await db_query(db, `DELETE FROM usersession WHERE ID IN (${placeholders})`, sessionIds);
167
167
  }
168
168
 
169
169
  // Generate secure session token and ID
@@ -172,7 +172,7 @@ export async function POST(request: Request) {
172
172
 
173
173
  // Create new session with secure token
174
174
  await db_query(db,
175
- "INSERT INTO UserSession (ID, SessionToken, userid, ExpirationDate) VALUES (?, ?, ?, ?)",
175
+ "INSERT INTO usersession (ID, SessionToken, userid, ExpirationDate) VALUES (?, ?, ?, ?)",
176
176
  [sessionId, sessionToken, user.userid, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString()]
177
177
  );
178
178
 
@@ -318,7 +318,7 @@ export async function DELETE(request: Request) {
318
318
 
319
319
  // Delete session from database using the actual session token
320
320
  await db_query(db,
321
- "DELETE FROM UserSession WHERE SessionToken = ?",
321
+ "DELETE FROM usersession WHERE SessionToken = ?",
322
322
  [sessionToken]
323
323
  );
324
324
 
@@ -44,11 +44,7 @@ export async function db_init(): Promise<mysql.Pool> {
44
44
  // Create the pool
45
45
  pool = mysql.createPool(poolConfig);
46
46
 
47
- // Test the connection
48
- const connection = await pool.getConnection();
49
- await connection.ping();
50
- connection.release();
51
-
47
+
52
48
  return pool;
53
49
  } catch (error) {
54
50
  throw error;
@@ -105,60 +101,7 @@ export async function db_query(
105
101
  * @returns SQL string for creating the table
106
102
  */
107
103
  export function db_migrate(model: Model, dbType: string): string {
108
- // Special handling for auth tables - create them first
109
- if (model.name === '__auth_tables__') {
110
- return `-- Users table (required for authentication)
111
- CREATE TABLE IF NOT EXISTS \`Users\` (
112
- \`userid\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
113
- \`OAuthID\` VARCHAR(255) NOT NULL UNIQUE,
114
- \`Source\` VARCHAR(20) NOT NULL CHECK(\`Source\` IN ('google', 'facebook', 'apple', 'github')),
115
- \`UserName\` VARCHAR(255) NOT NULL,
116
- \`Email\` VARCHAR(255),
117
- \`AvatarURL\` TEXT,
118
- \`UserLevel\` INTEGER NOT NULL DEFAULT 1 CHECK(\`UserLevel\` IN (0, 1, 2)),
119
- \`UserTier\` INTEGER NOT NULL DEFAULT 0,
120
- \`LastLoginDate\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
121
- \`CreatedDate\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
122
- \`IsActive\` BOOLEAN NOT NULL DEFAULT true
123
- );
124
-
125
- -- Indexes for Users table
126
- CREATE INDEX idx_users_oauthid ON \`Users\`(\`OAuthID\`);
127
- CREATE INDEX idx_users_email ON \`Users\`(\`Email\`);
128
- CREATE INDEX idx_users_usertier ON \`Users\`(\`UserTier\`);
129
-
130
- -- UserSession table
131
- CREATE TABLE IF NOT EXISTS \`UserSession\` (
132
- \`ID\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
133
- \`SessionToken\` VARCHAR(255) NOT NULL UNIQUE,
134
- \`userid\` VARCHAR(36) NOT NULL,
135
- \`ExpirationDate\` DATETIME NOT NULL,
136
- FOREIGN KEY (\`userid\`) REFERENCES \`Users\`(\`userid\`) ON DELETE CASCADE
137
- );
138
-
139
- -- Indexes for UserSession table
140
- CREATE INDEX idx_session_token ON \`UserSession\`(\`SessionToken\`);
141
- CREATE INDEX idx_session_user ON \`UserSession\`(\`userid\`);
142
- CREATE INDEX idx_session_expiry ON \`UserSession\`(\`ExpirationDate\`);
143
-
144
- -- OAuthTokens table
145
- CREATE TABLE IF NOT EXISTS \`OAuthTokens\` (
146
- \`ID\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
147
- \`userid\` VARCHAR(36) NOT NULL,
148
- \`Provider\` VARCHAR(20) NOT NULL CHECK(\`Provider\` IN ('google', 'facebook', 'apple', 'github')),
149
- \`AccessToken\` TEXT NOT NULL,
150
- \`RefreshToken\` TEXT,
151
- \`ExpiresAt\` DATETIME,
152
- \`CreatedAt\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
153
- \`UpdatedAt\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
154
- FOREIGN KEY (\`userid\`) REFERENCES \`Users\`(\`userid\`) ON DELETE CASCADE
155
- );
156
-
157
- -- Indexes for OAuthTokens table
158
- CREATE INDEX idx_oauth_user ON \`OAuthTokens\`(\`userid\`);
159
- CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
160
- }
161
-
104
+
162
105
  const sanitizedTableName = model.name;
163
106
 
164
107
  // Start with the model's fields
@@ -233,7 +176,7 @@ CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
233
176
  // Add foreign key constraints at the end
234
177
  const foreignKeys: string[] = [];
235
178
  if (model.data_is_user_specific === "true") {
236
- foreignKeys.push(`FOREIGN KEY (\`userid\`) REFERENCES \`Users\` (\`userid\`)`);
179
+ foreignKeys.push(`FOREIGN KEY (\`userid\`) REFERENCES \`users\` (\`userid\`)`);
237
180
  }
238
181
 
239
182
  const allConstraints = foreignKeys.length > 0
@@ -245,13 +188,3 @@ CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
245
188
 
246
189
  return sql;
247
190
  }
248
-
249
- /**
250
- * Close database connection(s)
251
- */
252
- export async function closeDatabase(): Promise<void> {
253
- if (pool) {
254
- await pool.end();
255
- pool = null;
256
- }
257
- }
@@ -51,9 +51,7 @@ export async function db_init(): Promise<Pool> {
51
51
 
52
52
  // Create the pool
53
53
  pool = new Pool(poolConfig);
54
-
55
- // Test the connection
56
- await pool.query('SELECT NOW()');
54
+
57
55
 
58
56
  return pool;
59
57
  } catch (error) {
@@ -102,10 +100,9 @@ export async function db_query(
102
100
 
103
101
  } catch (error) {
104
102
  // If table doesn't exist for SELECT, return empty array
105
- if (error instanceof Error && error.message.includes('does not exist') && query.trim().toUpperCase().startsWith('SELECT')) {
106
- return [];
107
- }
108
- throw error;
103
+ console.error(error);
104
+ return [];
105
+
109
106
  }
110
107
  }
111
108
 
@@ -116,59 +113,6 @@ export async function db_query(
116
113
  * @returns SQL string for creating the table
117
114
  */
118
115
  export function db_migrate(model: Model, dbType: string): string {
119
- // Special handling for auth tables - create them first
120
- if (model.name === '__auth_tables__') {
121
- return `-- Users table (required for authentication)
122
- CREATE TABLE IF NOT EXISTS "Users" (
123
- "userid" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
124
- "OAuthID" TEXT NOT NULL UNIQUE,
125
- "Source" TEXT NOT NULL CHECK("Source" IN ('google', 'facebook', 'apple', 'github')),
126
- "UserName" TEXT NOT NULL,
127
- "Email" TEXT,
128
- "AvatarURL" TEXT,
129
- "UserLevel" INTEGER NOT NULL DEFAULT 1 CHECK("UserLevel" IN (0, 1, 2)),
130
- "UserTier" INTEGER NOT NULL DEFAULT 0,
131
- "LastLoginDate" TIMESTAMP NOT NULL DEFAULT NOW(),
132
- "CreatedDate" TIMESTAMP NOT NULL DEFAULT NOW(),
133
- "IsActive" BOOLEAN NOT NULL DEFAULT true
134
- );
135
-
136
- -- Indexes for Users table
137
- CREATE INDEX IF NOT EXISTS idx_users_oauthid ON "Users"("OAuthID");
138
- CREATE INDEX IF NOT EXISTS idx_users_email ON "Users"("Email");
139
- CREATE INDEX IF NOT EXISTS idx_users_usertier ON "Users"("UserTier");
140
-
141
- -- UserSession table
142
- CREATE TABLE IF NOT EXISTS "UserSession" (
143
- "ID" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
144
- "SessionToken" VARCHAR(255) NOT NULL UNIQUE,
145
- "userid" UUID NOT NULL,
146
- "ExpirationDate" TIMESTAMP NOT NULL,
147
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
148
- );
149
-
150
- -- Indexes for UserSession table
151
- CREATE INDEX IF NOT EXISTS idx_session_token ON "UserSession"("SessionToken");
152
- CREATE INDEX IF NOT EXISTS idx_session_user ON "UserSession"("userid");
153
- CREATE INDEX IF NOT EXISTS idx_session_expiry ON "UserSession"("ExpirationDate");
154
-
155
- -- OAuthTokens table
156
- CREATE TABLE IF NOT EXISTS "OAuthTokens" (
157
- "ID" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
158
- "userid" UUID NOT NULL,
159
- "Provider" VARCHAR(20) NOT NULL CHECK("Provider" IN ('google', 'facebook', 'apple', 'github')),
160
- "AccessToken" TEXT NOT NULL,
161
- "RefreshToken" TEXT,
162
- "ExpiresAt" TIMESTAMP,
163
- "CreatedAt" TIMESTAMP NOT NULL DEFAULT NOW(),
164
- "UpdatedAt" TIMESTAMP NOT NULL DEFAULT NOW(),
165
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
166
- );
167
-
168
- -- Indexes for OAuthTokens table
169
- CREATE INDEX IF NOT EXISTS idx_oauth_user ON "OAuthTokens"("userid");
170
- CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provider");`;
171
- }
172
116
 
173
117
  const sanitizedTableName = model.name;
174
118
 
@@ -244,7 +188,7 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
244
188
  // Add foreign key constraints at the end
245
189
  const foreignKeys: string[] = [];
246
190
  if (model.data_is_user_specific === "true") {
247
- foreignKeys.push(`FOREIGN KEY ("userid") REFERENCES "Users" ("userid")`);
191
+ foreignKeys.push(`FOREIGN KEY ("userid") REFERENCES "users" ("userid")`);
248
192
  }
249
193
 
250
194
  const allConstraints = foreignKeys.length > 0
@@ -256,13 +200,3 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
256
200
 
257
201
  return sql;
258
202
  }
259
-
260
- /**
261
- * Close database connection(s)
262
- */
263
- export async function closeDatabase(): Promise<void> {
264
- if (pool) {
265
- await pool.end();
266
- pool = null;
267
- }
268
- }
@@ -182,58 +182,6 @@ export async function db_query(
182
182
  */
183
183
  export function db_migrate(model: Model, dbType: string): string {
184
184
  // Special handling for auth tables - create them first
185
- if (model.name === '__auth_tables__') {
186
- return `-- Users table (required for authentication)
187
- CREATE TABLE IF NOT EXISTS "Users" (
188
- "userid" TEXT PRIMARY KEY,
189
- "OAuthID" TEXT NOT NULL UNIQUE,
190
- "Source" TEXT NOT NULL CHECK("Source" IN ('google', 'facebook', 'apple', 'github')),
191
- "UserName" TEXT NOT NULL,
192
- "Email" TEXT,
193
- "AvatarURL" TEXT,
194
- "UserLevel" INTEGER NOT NULL DEFAULT 1 CHECK("UserLevel" IN (0, 1, 2)),
195
- "UserTier" INTEGER NOT NULL DEFAULT 0,
196
- "LastLoginDate" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
197
- "CreatedDate" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
198
- "IsActive" INTEGER NOT NULL DEFAULT 1
199
- );
200
-
201
- -- Indexes for Users table
202
- CREATE INDEX IF NOT EXISTS idx_users_oauthid ON "Users"("OAuthID");
203
- CREATE INDEX IF NOT EXISTS idx_users_email ON "Users"("Email");
204
- CREATE INDEX IF NOT EXISTS idx_users_usertier ON "Users"("UserTier");
205
-
206
- -- UserSession table
207
- CREATE TABLE IF NOT EXISTS "UserSession" (
208
- "ID" TEXT PRIMARY KEY,
209
- "SessionToken" TEXT NOT NULL UNIQUE,
210
- "userid" TEXT NOT NULL,
211
- "ExpirationDate" TEXT NOT NULL,
212
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
213
- );
214
-
215
- -- Indexes for UserSession table
216
- CREATE INDEX IF NOT EXISTS idx_session_token ON "UserSession"("SessionToken");
217
- CREATE INDEX IF NOT EXISTS idx_session_user ON "UserSession"("userid");
218
- CREATE INDEX IF NOT EXISTS idx_session_expiry ON "UserSession"("ExpirationDate");
219
-
220
- -- OAuthTokens table
221
- CREATE TABLE IF NOT EXISTS "OAuthTokens" (
222
- "ID" TEXT PRIMARY KEY,
223
- "userid" TEXT NOT NULL,
224
- "Provider" TEXT NOT NULL CHECK("Provider" IN ('google', 'facebook', 'apple', 'github')),
225
- "AccessToken" TEXT NOT NULL,
226
- "RefreshToken" TEXT,
227
- "ExpiresAt" TEXT,
228
- "CreatedAt" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
229
- "UpdatedAt" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
230
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
231
- );
232
-
233
- -- Indexes for OAuthTokens table
234
- CREATE INDEX IF NOT EXISTS idx_oauth_user ON "OAuthTokens"("userid");
235
- CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provider");`;
236
- }
237
185
 
238
186
  const sanitizedTableName = model.name;
239
187
 
@@ -302,28 +250,6 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
302
250
  return sql;
303
251
  }
304
252
 
305
- /**
306
- * Close a specific database connection or all connections
307
- * @param dbPath Optional path to close a specific database connection.
308
- * If not provided, closes all connections.
309
- */
310
- export function closeDatabase(dbPath?: string): void {
311
- if (!dbPath) {
312
- // Close all file-based connections
313
- for (const [path, connection] of dbConnections.entries()) {
314
- connection.close();
315
- }
316
- dbConnections.clear();
317
- } else {
318
- // Close specific database connection
319
- const connection = dbConnections.get(dbPath);
320
- if (connection) {
321
- connection.close();
322
- dbConnections.delete(dbPath);
323
- }
324
- }
325
- }
326
-
327
253
  /**
328
254
  * Get or create a database connection for the specified path
329
255
  * This is a convenience wrapper for working with arbitrary database files
@@ -45,7 +45,7 @@ export async function getAllUsers(): Promise<User[]> {
45
45
  const client = await db_init();
46
46
 
47
47
  const users = await db_query(client,
48
- `SELECT * FROM Users
48
+ `SELECT * FROM users
49
49
  WHERE IsActive = ?
50
50
  ORDER BY UserLevel DESC, UserName ASC`,
51
51
  [true]
@@ -61,7 +61,7 @@ export async function getUserByOAuthID(oauthId: string): Promise<User | null> {
61
61
  const client = await db_init();
62
62
 
63
63
  const users = await db_query(client,
64
- "SELECT * FROM Users WHERE OAuthID = ? AND IsActive = ?",
64
+ "SELECT * FROM users WHERE OAuthID = ? AND IsActive = ?",
65
65
  [oauthId, true]
66
66
  );
67
67
 
@@ -75,7 +75,7 @@ export async function getUserByID(userId: string): Promise<User | null> {
75
75
  const client = await db_init();
76
76
 
77
77
  const users = await db_query(client,
78
- "SELECT * FROM Users WHERE userid = ? AND IsActive = ?",
78
+ "SELECT * FROM users WHERE userid = ? AND IsActive = ?",
79
79
  [userId, true]
80
80
  );
81
81
 
@@ -100,7 +100,7 @@ export async function upsertUser(
100
100
  if (existingUser) {
101
101
  // Update existing user
102
102
  await db_query(client,
103
- `UPDATE Users
103
+ `UPDATE users
104
104
  SET UserName = ?, Email = COALESCE(?, Email), AvatarURL = ?,
105
105
  LastLoginDate = CURRENT_TIMESTAMP, Source = ?
106
106
  WHERE OAuthID = ?`,
@@ -110,7 +110,7 @@ export async function upsertUser(
110
110
  return (await getUserByOAuthID(oauthId))!;
111
111
  } else {
112
112
  // Check if this is the first user (should be admin)
113
- const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM Users");
113
+ const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM users");
114
114
  const isFirstUser = allUsers[0].count === 0;
115
115
 
116
116
  // Create new user
@@ -118,7 +118,7 @@ export async function upsertUser(
118
118
  const permissionLevel = isFirstUser ? 2 : 1; // First user is admin
119
119
 
120
120
  await db_query(client,
121
- `INSERT INTO Users
121
+ `INSERT INTO users
122
122
  (userid, OAuthID, Source, UserName, Email, AvatarURL, UserLevel, UserTier,
123
123
  LastLoginDate, CreatedDate, IsActive)
124
124
  VALUES (?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?)`,
@@ -141,7 +141,7 @@ export async function updateUserPermission(
141
141
  // Ensure there's always at least one admin
142
142
  if (permissionLevel < 2) {
143
143
  const admins = await db_query(client,
144
- "SELECT COUNT(*) as count FROM Users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
144
+ "SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
145
145
  [2, userId, true]
146
146
  );
147
147
 
@@ -151,7 +151,7 @@ export async function updateUserPermission(
151
151
  }
152
152
 
153
153
  const result = await db_query(client,
154
- "UPDATE Users SET UserLevel = ? WHERE userid = ?",
154
+ "UPDATE users SET UserLevel = ? WHERE userid = ?",
155
155
  [permissionLevel, userId]
156
156
  );
157
157
 
@@ -168,7 +168,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
168
168
  const user = await getUserByID(userId);
169
169
  if (user && user.UserLevel === 2) {
170
170
  const admins = await db_query(client,
171
- "SELECT COUNT(*) as count FROM Users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
171
+ "SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
172
172
  [2, userId, true]
173
173
  );
174
174
 
@@ -179,7 +179,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
179
179
 
180
180
  // Soft delete the user
181
181
  const result = await db_query(client,
182
- "UPDATE Users SET IsActive = ? WHERE userid = ?",
182
+ "UPDATE users SET IsActive = ? WHERE userid = ?",
183
183
  [false, userId]
184
184
  );
185
185
 
@@ -203,7 +203,7 @@ export async function getUserStats(): Promise<{
203
203
  SUM(CASE WHEN UserLevel = 2 THEN 1 ELSE 0 END) as admins,
204
204
  SUM(CASE WHEN UserLevel = 1 THEN 1 ELSE 0 END) as registeredUsers,
205
205
  SUM(CASE WHEN UserLevel = 0 THEN 1 ELSE 0 END) as guestUsers
206
- FROM Users
206
+ FROM users
207
207
  WHERE IsActive = ?
208
208
  `, [true]);
209
209
 
@@ -217,7 +217,7 @@ export async function cleanupExpiredSessions(): Promise<number> {
217
217
  const client = await db_init();
218
218
 
219
219
  const result = await db_query(client,
220
- "DELETE FROM UserSession WHERE ExpirationDate < CURRENT_TIMESTAMP"
220
+ "DELETE FROM usersession WHERE ExpirationDate < CURRENT_TIMESTAMP"
221
221
  );
222
222
 
223
223
  return result[0].changes;
@@ -241,13 +241,13 @@ export async function storeOAuthToken(
241
241
 
242
242
  // Delete existing tokens for this user/provider combo
243
243
  await db_query(client,
244
- "DELETE FROM OAuthTokens WHERE userid = ? AND Provider = ?",
244
+ "DELETE FROM oauthtokens WHERE userid = ? AND Provider = ?",
245
245
  [userId, provider]
246
246
  );
247
247
 
248
248
  // Insert new token
249
249
  await db_query(client,
250
- `INSERT INTO OAuthTokens
250
+ `INSERT INTO oauthtokens
251
251
  (ID, userid, Provider, AccessToken, RefreshToken, ExpiresAt, CreatedAt, UpdatedAt)
252
252
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
253
253
  [tokenId, userId, provider, accessToken, refreshToken || null, expiresAt, now, now]
@@ -264,7 +264,7 @@ export async function getOAuthToken(
264
264
  const client = await db_init();
265
265
 
266
266
  const tokens = await db_query(client,
267
- "SELECT * FROM OAuthTokens WHERE userid = ? AND Provider = ?",
267
+ "SELECT * FROM oauthtokens WHERE userid = ? AND Provider = ?",
268
268
  [userId, provider]
269
269
  );
270
270
 
@@ -283,8 +283,8 @@ export async function validateSession(sessionToken: string): Promise<{
283
283
 
284
284
  // Get session details
285
285
  const sessions = await db_query(client,
286
- `SELECT s.*, u.* FROM UserSession s
287
- JOIN Users u ON s.userid = u.userid
286
+ `SELECT s.*, u.* FROM usersession s
287
+ JOIN users u ON s.userid = u.userid
288
288
  WHERE s.SessionToken = ? AND s.ExpirationDate > CURRENT_TIMESTAMP AND u.IsActive = ?`,
289
289
  [sessionToken, true]
290
290
  );
@@ -325,7 +325,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
325
325
 
326
326
  // Get existing session
327
327
  const sessions = await db_query(client,
328
- "SELECT * FROM UserSession WHERE SessionToken = ? AND ExpirationDate > CURRENT_TIMESTAMP",
328
+ "SELECT * FROM usersession WHERE SessionToken = ? AND ExpirationDate > CURRENT_TIMESTAMP",
329
329
  [oldSessionToken]
330
330
  );
331
331
 
@@ -338,7 +338,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
338
338
 
339
339
  // Update session with new token
340
340
  await db_query(client,
341
- "UPDATE UserSession SET SessionToken = ?, ExpirationDate = ? WHERE ID = ?",
341
+ "UPDATE usersession SET SessionToken = ?, ExpirationDate = ? WHERE ID = ?",
342
342
  [newSessionToken, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), session.ID]
343
343
  );
344
344
 
package/defaultapp/db.ts CHANGED
@@ -145,70 +145,5 @@ export function db_migrate(model: Model): string {
145
145
  const dbType = (process.env.DATABASE_TYPE || process.env.DB_TYPE || 'postgres').toLowerCase() as DatabaseType;
146
146
  return dbImplementation.db_migrate(model, dbType);
147
147
  }
148
-
149
- /**
150
- * Initialize the database with models and sample data
151
- * @param models Array of models to create tables for
152
- * @param sampleData Optional array of sample data SQL statements
153
- */
154
- export async function initializeDatabase(
155
- models: Model[],
156
- sampleData?: Array<{tableName: string, sql: string}>
157
- ): Promise<void> {
158
- const client = await db_init();
159
-
160
- try {
161
- // Create auth tables first (Users, UserSession, OAuthTokens)
162
- const authTablesModel: Model = {
163
- id: '__auth_tables__',
164
- name: '__auth_tables__',
165
- fields: []
166
- };
167
- const authTablesSql = db_migrate(authTablesModel);
168
-
169
- // Execute each statement separately for auth tables
170
- const authStatements = authTablesSql.split(';').map(s => s.trim()).filter(s => s.length > 0);
171
- for (const statement of authStatements) {
172
- try {
173
- await db_query(client, statement);
174
- } catch (error) {
175
- // Some databases might not support certain syntax, continue with other statements
176
- if (!statement.includes('CREATE INDEX')) {
177
- console.error('Error creating auth table:', error);
178
- }
179
- }
180
- }
181
-
182
- // Create tables for each model
183
- for (const model of models) {
184
- const createTableSql = db_migrate(model);
185
- await db_query(client, createTableSql);
186
- }
187
-
188
- // Insert sample data if provided
189
- if (sampleData && sampleData.length > 0) {
190
- for (const data of sampleData) {
191
- try {
192
- await db_query(client, data.sql);
193
- } catch (error) {
194
- // Continue with other tables even if one fails
195
- }
196
- }
197
- }
198
- } catch (error) {
199
- throw error;
200
- }
201
- }
202
-
203
- /**
204
- * Close database connection(s)
205
- * @param dbPath Optional path for SQLite databases
206
- */
207
- export async function closeDatabase(dbPath?: string): Promise<void> {
208
- if (dbImplementation && dbImplementation.closeDatabase) {
209
- return dbImplementation.closeDatabase(dbPath);
210
- }
211
- }
212
-
213
148
  // Export types
214
149
  export type { Model, ModelField };
@@ -156,14 +156,14 @@ export async function POST(request: Request) {
156
156
 
157
157
  // Delete existing sessions for this user
158
158
  const existingSessions = await db_query(db,
159
- "SELECT ID FROM UserSession WHERE userid = ?",
159
+ "SELECT ID FROM usersession WHERE userid = ?",
160
160
  [user.userid]
161
161
  );
162
162
 
163
163
  if (existingSessions && existingSessions.length > 0) {
164
164
  const sessionIds = existingSessions.map(session => session.ID);
165
165
  const placeholders = sessionIds.map(() => '?').join(',');
166
- await db_query(db, `DELETE FROM UserSession WHERE ID IN (${placeholders})`, sessionIds);
166
+ await db_query(db, `DELETE FROM usersession WHERE ID IN (${placeholders})`, sessionIds);
167
167
  }
168
168
 
169
169
  // Generate secure session token and ID
@@ -172,7 +172,7 @@ export async function POST(request: Request) {
172
172
 
173
173
  // Create new session with secure token
174
174
  await db_query(db,
175
- "INSERT INTO UserSession (ID, SessionToken, userid, ExpirationDate) VALUES (?, ?, ?, ?)",
175
+ "INSERT INTO usersession (ID, SessionToken, userid, ExpirationDate) VALUES (?, ?, ?, ?)",
176
176
  [sessionId, sessionToken, user.userid, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString()]
177
177
  );
178
178
 
@@ -318,7 +318,7 @@ export async function DELETE(request: Request) {
318
318
 
319
319
  // Delete session from database using the actual session token
320
320
  await db_query(db,
321
- "DELETE FROM UserSession WHERE SessionToken = ?",
321
+ "DELETE FROM usersession WHERE SessionToken = ?",
322
322
  [sessionToken]
323
323
  );
324
324
 
@@ -44,11 +44,7 @@ export async function db_init(): Promise<mysql.Pool> {
44
44
  // Create the pool
45
45
  pool = mysql.createPool(poolConfig);
46
46
 
47
- // Test the connection
48
- const connection = await pool.getConnection();
49
- await connection.ping();
50
- connection.release();
51
-
47
+
52
48
  return pool;
53
49
  } catch (error) {
54
50
  throw error;
@@ -105,60 +101,7 @@ export async function db_query(
105
101
  * @returns SQL string for creating the table
106
102
  */
107
103
  export function db_migrate(model: Model, dbType: string): string {
108
- // Special handling for auth tables - create them first
109
- if (model.name === '__auth_tables__') {
110
- return `-- Users table (required for authentication)
111
- CREATE TABLE IF NOT EXISTS \`Users\` (
112
- \`userid\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
113
- \`OAuthID\` VARCHAR(255) NOT NULL UNIQUE,
114
- \`Source\` VARCHAR(20) NOT NULL CHECK(\`Source\` IN ('google', 'facebook', 'apple', 'github')),
115
- \`UserName\` VARCHAR(255) NOT NULL,
116
- \`Email\` VARCHAR(255),
117
- \`AvatarURL\` TEXT,
118
- \`UserLevel\` INTEGER NOT NULL DEFAULT 1 CHECK(\`UserLevel\` IN (0, 1, 2)),
119
- \`UserTier\` INTEGER NOT NULL DEFAULT 0,
120
- \`LastLoginDate\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
121
- \`CreatedDate\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
122
- \`IsActive\` BOOLEAN NOT NULL DEFAULT true
123
- );
124
-
125
- -- Indexes for Users table
126
- CREATE INDEX idx_users_oauthid ON \`Users\`(\`OAuthID\`);
127
- CREATE INDEX idx_users_email ON \`Users\`(\`Email\`);
128
- CREATE INDEX idx_users_usertier ON \`Users\`(\`UserTier\`);
129
-
130
- -- UserSession table
131
- CREATE TABLE IF NOT EXISTS \`UserSession\` (
132
- \`ID\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
133
- \`SessionToken\` VARCHAR(255) NOT NULL UNIQUE,
134
- \`userid\` VARCHAR(36) NOT NULL,
135
- \`ExpirationDate\` DATETIME NOT NULL,
136
- FOREIGN KEY (\`userid\`) REFERENCES \`Users\`(\`userid\`) ON DELETE CASCADE
137
- );
138
-
139
- -- Indexes for UserSession table
140
- CREATE INDEX idx_session_token ON \`UserSession\`(\`SessionToken\`);
141
- CREATE INDEX idx_session_user ON \`UserSession\`(\`userid\`);
142
- CREATE INDEX idx_session_expiry ON \`UserSession\`(\`ExpirationDate\`);
143
-
144
- -- OAuthTokens table
145
- CREATE TABLE IF NOT EXISTS \`OAuthTokens\` (
146
- \`ID\` VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
147
- \`userid\` VARCHAR(36) NOT NULL,
148
- \`Provider\` VARCHAR(20) NOT NULL CHECK(\`Provider\` IN ('google', 'facebook', 'apple', 'github')),
149
- \`AccessToken\` TEXT NOT NULL,
150
- \`RefreshToken\` TEXT,
151
- \`ExpiresAt\` DATETIME,
152
- \`CreatedAt\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
153
- \`UpdatedAt\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
154
- FOREIGN KEY (\`userid\`) REFERENCES \`Users\`(\`userid\`) ON DELETE CASCADE
155
- );
156
-
157
- -- Indexes for OAuthTokens table
158
- CREATE INDEX idx_oauth_user ON \`OAuthTokens\`(\`userid\`);
159
- CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
160
- }
161
-
104
+
162
105
  const sanitizedTableName = model.name;
163
106
 
164
107
  // Start with the model's fields
@@ -233,7 +176,7 @@ CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
233
176
  // Add foreign key constraints at the end
234
177
  const foreignKeys: string[] = [];
235
178
  if (model.data_is_user_specific === "true") {
236
- foreignKeys.push(`FOREIGN KEY (\`userid\`) REFERENCES \`Users\` (\`userid\`)`);
179
+ foreignKeys.push(`FOREIGN KEY (\`userid\`) REFERENCES \`users\` (\`userid\`)`);
237
180
  }
238
181
 
239
182
  const allConstraints = foreignKeys.length > 0
@@ -245,13 +188,3 @@ CREATE INDEX idx_oauth_provider ON \`OAuthTokens\`(\`userid\`, \`Provider\`);`;
245
188
 
246
189
  return sql;
247
190
  }
248
-
249
- /**
250
- * Close database connection(s)
251
- */
252
- export async function closeDatabase(): Promise<void> {
253
- if (pool) {
254
- await pool.end();
255
- pool = null;
256
- }
257
- }
@@ -51,9 +51,7 @@ export async function db_init(): Promise<Pool> {
51
51
 
52
52
  // Create the pool
53
53
  pool = new Pool(poolConfig);
54
-
55
- // Test the connection
56
- await pool.query('SELECT NOW()');
54
+
57
55
 
58
56
  return pool;
59
57
  } catch (error) {
@@ -102,10 +100,9 @@ export async function db_query(
102
100
 
103
101
  } catch (error) {
104
102
  // If table doesn't exist for SELECT, return empty array
105
- if (error instanceof Error && error.message.includes('does not exist') && query.trim().toUpperCase().startsWith('SELECT')) {
106
- return [];
107
- }
108
- throw error;
103
+ console.error(error);
104
+ return [];
105
+
109
106
  }
110
107
  }
111
108
 
@@ -116,59 +113,6 @@ export async function db_query(
116
113
  * @returns SQL string for creating the table
117
114
  */
118
115
  export function db_migrate(model: Model, dbType: string): string {
119
- // Special handling for auth tables - create them first
120
- if (model.name === '__auth_tables__') {
121
- return `-- Users table (required for authentication)
122
- CREATE TABLE IF NOT EXISTS "Users" (
123
- "userid" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
124
- "OAuthID" TEXT NOT NULL UNIQUE,
125
- "Source" TEXT NOT NULL CHECK("Source" IN ('google', 'facebook', 'apple', 'github')),
126
- "UserName" TEXT NOT NULL,
127
- "Email" TEXT,
128
- "AvatarURL" TEXT,
129
- "UserLevel" INTEGER NOT NULL DEFAULT 1 CHECK("UserLevel" IN (0, 1, 2)),
130
- "UserTier" INTEGER NOT NULL DEFAULT 0,
131
- "LastLoginDate" TIMESTAMP NOT NULL DEFAULT NOW(),
132
- "CreatedDate" TIMESTAMP NOT NULL DEFAULT NOW(),
133
- "IsActive" BOOLEAN NOT NULL DEFAULT true
134
- );
135
-
136
- -- Indexes for Users table
137
- CREATE INDEX IF NOT EXISTS idx_users_oauthid ON "Users"("OAuthID");
138
- CREATE INDEX IF NOT EXISTS idx_users_email ON "Users"("Email");
139
- CREATE INDEX IF NOT EXISTS idx_users_usertier ON "Users"("UserTier");
140
-
141
- -- UserSession table
142
- CREATE TABLE IF NOT EXISTS "UserSession" (
143
- "ID" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
144
- "SessionToken" VARCHAR(255) NOT NULL UNIQUE,
145
- "userid" UUID NOT NULL,
146
- "ExpirationDate" TIMESTAMP NOT NULL,
147
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
148
- );
149
-
150
- -- Indexes for UserSession table
151
- CREATE INDEX IF NOT EXISTS idx_session_token ON "UserSession"("SessionToken");
152
- CREATE INDEX IF NOT EXISTS idx_session_user ON "UserSession"("userid");
153
- CREATE INDEX IF NOT EXISTS idx_session_expiry ON "UserSession"("ExpirationDate");
154
-
155
- -- OAuthTokens table
156
- CREATE TABLE IF NOT EXISTS "OAuthTokens" (
157
- "ID" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
158
- "userid" UUID NOT NULL,
159
- "Provider" VARCHAR(20) NOT NULL CHECK("Provider" IN ('google', 'facebook', 'apple', 'github')),
160
- "AccessToken" TEXT NOT NULL,
161
- "RefreshToken" TEXT,
162
- "ExpiresAt" TIMESTAMP,
163
- "CreatedAt" TIMESTAMP NOT NULL DEFAULT NOW(),
164
- "UpdatedAt" TIMESTAMP NOT NULL DEFAULT NOW(),
165
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
166
- );
167
-
168
- -- Indexes for OAuthTokens table
169
- CREATE INDEX IF NOT EXISTS idx_oauth_user ON "OAuthTokens"("userid");
170
- CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provider");`;
171
- }
172
116
 
173
117
  const sanitizedTableName = model.name;
174
118
 
@@ -244,7 +188,7 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
244
188
  // Add foreign key constraints at the end
245
189
  const foreignKeys: string[] = [];
246
190
  if (model.data_is_user_specific === "true") {
247
- foreignKeys.push(`FOREIGN KEY ("userid") REFERENCES "Users" ("userid")`);
191
+ foreignKeys.push(`FOREIGN KEY ("userid") REFERENCES "users" ("userid")`);
248
192
  }
249
193
 
250
194
  const allConstraints = foreignKeys.length > 0
@@ -256,13 +200,3 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
256
200
 
257
201
  return sql;
258
202
  }
259
-
260
- /**
261
- * Close database connection(s)
262
- */
263
- export async function closeDatabase(): Promise<void> {
264
- if (pool) {
265
- await pool.end();
266
- pool = null;
267
- }
268
- }
@@ -182,58 +182,6 @@ export async function db_query(
182
182
  */
183
183
  export function db_migrate(model: Model, dbType: string): string {
184
184
  // Special handling for auth tables - create them first
185
- if (model.name === '__auth_tables__') {
186
- return `-- Users table (required for authentication)
187
- CREATE TABLE IF NOT EXISTS "Users" (
188
- "userid" TEXT PRIMARY KEY,
189
- "OAuthID" TEXT NOT NULL UNIQUE,
190
- "Source" TEXT NOT NULL CHECK("Source" IN ('google', 'facebook', 'apple', 'github')),
191
- "UserName" TEXT NOT NULL,
192
- "Email" TEXT,
193
- "AvatarURL" TEXT,
194
- "UserLevel" INTEGER NOT NULL DEFAULT 1 CHECK("UserLevel" IN (0, 1, 2)),
195
- "UserTier" INTEGER NOT NULL DEFAULT 0,
196
- "LastLoginDate" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
197
- "CreatedDate" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
198
- "IsActive" INTEGER NOT NULL DEFAULT 1
199
- );
200
-
201
- -- Indexes for Users table
202
- CREATE INDEX IF NOT EXISTS idx_users_oauthid ON "Users"("OAuthID");
203
- CREATE INDEX IF NOT EXISTS idx_users_email ON "Users"("Email");
204
- CREATE INDEX IF NOT EXISTS idx_users_usertier ON "Users"("UserTier");
205
-
206
- -- UserSession table
207
- CREATE TABLE IF NOT EXISTS "UserSession" (
208
- "ID" TEXT PRIMARY KEY,
209
- "SessionToken" TEXT NOT NULL UNIQUE,
210
- "userid" TEXT NOT NULL,
211
- "ExpirationDate" TEXT NOT NULL,
212
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
213
- );
214
-
215
- -- Indexes for UserSession table
216
- CREATE INDEX IF NOT EXISTS idx_session_token ON "UserSession"("SessionToken");
217
- CREATE INDEX IF NOT EXISTS idx_session_user ON "UserSession"("userid");
218
- CREATE INDEX IF NOT EXISTS idx_session_expiry ON "UserSession"("ExpirationDate");
219
-
220
- -- OAuthTokens table
221
- CREATE TABLE IF NOT EXISTS "OAuthTokens" (
222
- "ID" TEXT PRIMARY KEY,
223
- "userid" TEXT NOT NULL,
224
- "Provider" TEXT NOT NULL CHECK("Provider" IN ('google', 'facebook', 'apple', 'github')),
225
- "AccessToken" TEXT NOT NULL,
226
- "RefreshToken" TEXT,
227
- "ExpiresAt" TEXT,
228
- "CreatedAt" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
229
- "UpdatedAt" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
230
- FOREIGN KEY ("userid") REFERENCES "Users"("userid") ON DELETE CASCADE
231
- );
232
-
233
- -- Indexes for OAuthTokens table
234
- CREATE INDEX IF NOT EXISTS idx_oauth_user ON "OAuthTokens"("userid");
235
- CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provider");`;
236
- }
237
185
 
238
186
  const sanitizedTableName = model.name;
239
187
 
@@ -302,28 +250,6 @@ CREATE INDEX IF NOT EXISTS idx_oauth_provider ON "OAuthTokens"("userid", "Provid
302
250
  return sql;
303
251
  }
304
252
 
305
- /**
306
- * Close a specific database connection or all connections
307
- * @param dbPath Optional path to close a specific database connection.
308
- * If not provided, closes all connections.
309
- */
310
- export function closeDatabase(dbPath?: string): void {
311
- if (!dbPath) {
312
- // Close all file-based connections
313
- for (const [path, connection] of dbConnections.entries()) {
314
- connection.close();
315
- }
316
- dbConnections.clear();
317
- } else {
318
- // Close specific database connection
319
- const connection = dbConnections.get(dbPath);
320
- if (connection) {
321
- connection.close();
322
- dbConnections.delete(dbPath);
323
- }
324
- }
325
- }
326
-
327
253
  /**
328
254
  * Get or create a database connection for the specified path
329
255
  * This is a convenience wrapper for working with arbitrary database files
@@ -45,7 +45,7 @@ export async function getAllUsers(): Promise<User[]> {
45
45
  const client = await db_init();
46
46
 
47
47
  const users = await db_query(client,
48
- `SELECT * FROM Users
48
+ `SELECT * FROM users
49
49
  WHERE IsActive = ?
50
50
  ORDER BY UserLevel DESC, UserName ASC`,
51
51
  [true]
@@ -61,7 +61,7 @@ export async function getUserByOAuthID(oauthId: string): Promise<User | null> {
61
61
  const client = await db_init();
62
62
 
63
63
  const users = await db_query(client,
64
- "SELECT * FROM Users WHERE OAuthID = ? AND IsActive = ?",
64
+ "SELECT * FROM users WHERE OAuthID = ? AND IsActive = ?",
65
65
  [oauthId, true]
66
66
  );
67
67
 
@@ -75,7 +75,7 @@ export async function getUserByID(userId: string): Promise<User | null> {
75
75
  const client = await db_init();
76
76
 
77
77
  const users = await db_query(client,
78
- "SELECT * FROM Users WHERE userid = ? AND IsActive = ?",
78
+ "SELECT * FROM users WHERE userid = ? AND IsActive = ?",
79
79
  [userId, true]
80
80
  );
81
81
 
@@ -100,7 +100,7 @@ export async function upsertUser(
100
100
  if (existingUser) {
101
101
  // Update existing user
102
102
  await db_query(client,
103
- `UPDATE Users
103
+ `UPDATE users
104
104
  SET UserName = ?, Email = COALESCE(?, Email), AvatarURL = ?,
105
105
  LastLoginDate = CURRENT_TIMESTAMP, Source = ?
106
106
  WHERE OAuthID = ?`,
@@ -110,7 +110,7 @@ export async function upsertUser(
110
110
  return (await getUserByOAuthID(oauthId))!;
111
111
  } else {
112
112
  // Check if this is the first user (should be admin)
113
- const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM Users");
113
+ const allUsers = await db_query(client, "SELECT COUNT(*) as count FROM users");
114
114
  const isFirstUser = allUsers[0].count === 0;
115
115
 
116
116
  // Create new user
@@ -118,7 +118,7 @@ export async function upsertUser(
118
118
  const permissionLevel = isFirstUser ? 2 : 1; // First user is admin
119
119
 
120
120
  await db_query(client,
121
- `INSERT INTO Users
121
+ `INSERT INTO users
122
122
  (userid, OAuthID, Source, UserName, Email, AvatarURL, UserLevel, UserTier,
123
123
  LastLoginDate, CreatedDate, IsActive)
124
124
  VALUES (?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?)`,
@@ -141,7 +141,7 @@ export async function updateUserPermission(
141
141
  // Ensure there's always at least one admin
142
142
  if (permissionLevel < 2) {
143
143
  const admins = await db_query(client,
144
- "SELECT COUNT(*) as count FROM Users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
144
+ "SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
145
145
  [2, userId, true]
146
146
  );
147
147
 
@@ -151,7 +151,7 @@ export async function updateUserPermission(
151
151
  }
152
152
 
153
153
  const result = await db_query(client,
154
- "UPDATE Users SET UserLevel = ? WHERE userid = ?",
154
+ "UPDATE users SET UserLevel = ? WHERE userid = ?",
155
155
  [permissionLevel, userId]
156
156
  );
157
157
 
@@ -168,7 +168,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
168
168
  const user = await getUserByID(userId);
169
169
  if (user && user.UserLevel === 2) {
170
170
  const admins = await db_query(client,
171
- "SELECT COUNT(*) as count FROM Users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
171
+ "SELECT COUNT(*) as count FROM users WHERE UserLevel = ? AND userid != ? AND IsActive = ?",
172
172
  [2, userId, true]
173
173
  );
174
174
 
@@ -179,7 +179,7 @@ export async function deleteUser(userId: string): Promise<boolean> {
179
179
 
180
180
  // Soft delete the user
181
181
  const result = await db_query(client,
182
- "UPDATE Users SET IsActive = ? WHERE userid = ?",
182
+ "UPDATE users SET IsActive = ? WHERE userid = ?",
183
183
  [false, userId]
184
184
  );
185
185
 
@@ -203,7 +203,7 @@ export async function getUserStats(): Promise<{
203
203
  SUM(CASE WHEN UserLevel = 2 THEN 1 ELSE 0 END) as admins,
204
204
  SUM(CASE WHEN UserLevel = 1 THEN 1 ELSE 0 END) as registeredUsers,
205
205
  SUM(CASE WHEN UserLevel = 0 THEN 1 ELSE 0 END) as guestUsers
206
- FROM Users
206
+ FROM users
207
207
  WHERE IsActive = ?
208
208
  `, [true]);
209
209
 
@@ -217,7 +217,7 @@ export async function cleanupExpiredSessions(): Promise<number> {
217
217
  const client = await db_init();
218
218
 
219
219
  const result = await db_query(client,
220
- "DELETE FROM UserSession WHERE ExpirationDate < CURRENT_TIMESTAMP"
220
+ "DELETE FROM usersession WHERE ExpirationDate < CURRENT_TIMESTAMP"
221
221
  );
222
222
 
223
223
  return result[0].changes;
@@ -241,13 +241,13 @@ export async function storeOAuthToken(
241
241
 
242
242
  // Delete existing tokens for this user/provider combo
243
243
  await db_query(client,
244
- "DELETE FROM OAuthTokens WHERE userid = ? AND Provider = ?",
244
+ "DELETE FROM oauthtokens WHERE userid = ? AND Provider = ?",
245
245
  [userId, provider]
246
246
  );
247
247
 
248
248
  // Insert new token
249
249
  await db_query(client,
250
- `INSERT INTO OAuthTokens
250
+ `INSERT INTO oauthtokens
251
251
  (ID, userid, Provider, AccessToken, RefreshToken, ExpiresAt, CreatedAt, UpdatedAt)
252
252
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
253
253
  [tokenId, userId, provider, accessToken, refreshToken || null, expiresAt, now, now]
@@ -264,7 +264,7 @@ export async function getOAuthToken(
264
264
  const client = await db_init();
265
265
 
266
266
  const tokens = await db_query(client,
267
- "SELECT * FROM OAuthTokens WHERE userid = ? AND Provider = ?",
267
+ "SELECT * FROM oauthtokens WHERE userid = ? AND Provider = ?",
268
268
  [userId, provider]
269
269
  );
270
270
 
@@ -283,8 +283,8 @@ export async function validateSession(sessionToken: string): Promise<{
283
283
 
284
284
  // Get session details
285
285
  const sessions = await db_query(client,
286
- `SELECT s.*, u.* FROM UserSession s
287
- JOIN Users u ON s.userid = u.userid
286
+ `SELECT s.*, u.* FROM usersession s
287
+ JOIN users u ON s.userid = u.userid
288
288
  WHERE s.SessionToken = ? AND s.ExpirationDate > CURRENT_TIMESTAMP AND u.IsActive = ?`,
289
289
  [sessionToken, true]
290
290
  );
@@ -325,7 +325,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
325
325
 
326
326
  // Get existing session
327
327
  const sessions = await db_query(client,
328
- "SELECT * FROM UserSession WHERE SessionToken = ? AND ExpirationDate > CURRENT_TIMESTAMP",
328
+ "SELECT * FROM usersession WHERE SessionToken = ? AND ExpirationDate > CURRENT_TIMESTAMP",
329
329
  [oldSessionToken]
330
330
  );
331
331
 
@@ -338,7 +338,7 @@ export async function rotateSession(oldSessionToken: string): Promise<string | n
338
338
 
339
339
  // Update session with new token
340
340
  await db_query(client,
341
- "UPDATE UserSession SET SessionToken = ?, ExpirationDate = ? WHERE ID = ?",
341
+ "UPDATE usersession SET SessionToken = ?, ExpirationDate = ? WHERE ID = ?",
342
342
  [newSessionToken, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), session.ID]
343
343
  );
344
344
 
@@ -145,70 +145,5 @@ export function db_migrate(model: Model): string {
145
145
  const dbType = (process.env.DATABASE_TYPE || process.env.DB_TYPE || 'postgres').toLowerCase() as DatabaseType;
146
146
  return dbImplementation.db_migrate(model, dbType);
147
147
  }
148
-
149
- /**
150
- * Initialize the database with models and sample data
151
- * @param models Array of models to create tables for
152
- * @param sampleData Optional array of sample data SQL statements
153
- */
154
- export async function initializeDatabase(
155
- models: Model[],
156
- sampleData?: Array<{tableName: string, sql: string}>
157
- ): Promise<void> {
158
- const client = await db_init();
159
-
160
- try {
161
- // Create auth tables first (Users, UserSession, OAuthTokens)
162
- const authTablesModel: Model = {
163
- id: '__auth_tables__',
164
- name: '__auth_tables__',
165
- fields: []
166
- };
167
- const authTablesSql = db_migrate(authTablesModel);
168
-
169
- // Execute each statement separately for auth tables
170
- const authStatements = authTablesSql.split(';').map(s => s.trim()).filter(s => s.length > 0);
171
- for (const statement of authStatements) {
172
- try {
173
- await db_query(client, statement);
174
- } catch (error) {
175
- // Some databases might not support certain syntax, continue with other statements
176
- if (!statement.includes('CREATE INDEX')) {
177
- console.error('Error creating auth table:', error);
178
- }
179
- }
180
- }
181
-
182
- // Create tables for each model
183
- for (const model of models) {
184
- const createTableSql = db_migrate(model);
185
- await db_query(client, createTableSql);
186
- }
187
-
188
- // Insert sample data if provided
189
- if (sampleData && sampleData.length > 0) {
190
- for (const data of sampleData) {
191
- try {
192
- await db_query(client, data.sql);
193
- } catch (error) {
194
- // Continue with other tables even if one fails
195
- }
196
- }
197
- }
198
- } catch (error) {
199
- throw error;
200
- }
201
- }
202
-
203
- /**
204
- * Close database connection(s)
205
- * @param dbPath Optional path for SQLite databases
206
- */
207
- export async function closeDatabase(dbPath?: string): Promise<void> {
208
- if (dbImplementation && dbImplementation.closeDatabase) {
209
- return dbImplementation.closeDatabase(dbPath);
210
- }
211
- }
212
-
213
148
  // Export types
214
149
  export type { Model, ModelField };
@@ -129,57 +129,6 @@ export function db_migrate(model: Model): string {
129
129
  return dbImplementation.db_migrate(model, dbType);
130
130
  }
131
131
 
132
- /**
133
- * Initialize the database with models and sample data
134
- * @param models Array of models to create tables for
135
- * @param sampleData Optional array of sample data SQL statements
136
- */
137
- export async function initializeDatabase(
138
- models: Model[],
139
- sampleData?: Array<{tableName: string, sql: string}>
140
- ): Promise<void> {
141
- const client = await db_init();
142
-
143
- try {
144
- console.log('Creating database tables...');
145
-
146
- // Create tables for each model
147
- for (const model of models) {
148
- const createTableSql = db_migrate(model);
149
- await db_query(client, createTableSql);
150
- console.log(`Created table: ${model.name}`);
151
- }
152
-
153
- // Insert sample data if provided
154
- if (sampleData && sampleData.length > 0) {
155
- console.log('Inserting sample data...');
156
- for (const data of sampleData) {
157
- try {
158
- await db_query(client, data.sql);
159
- console.log(`Inserted sample data for: ${data.tableName}`);
160
- } catch (error) {
161
- console.error(`Failed to insert sample data for ${data.tableName}:`, error);
162
- // Continue with other tables even if one fails
163
- }
164
- }
165
- }
166
-
167
- console.log('Database initialization complete');
168
- } catch (error) {
169
- console.error('Error initializing database:', error);
170
- throw error;
171
- }
172
- }
173
-
174
- /**
175
- * Close database connection(s)
176
- * @param dbPath Optional path for SQLite databases
177
- */
178
- export async function closeDatabase(dbPath?: string): Promise<void> {
179
- if (dbImplementation && dbImplementation.closeDatabase) {
180
- return dbImplementation.closeDatabase(dbPath);
181
- }
182
- }
183
132
 
184
133
  // Export types
185
134
  export type { Model, ModelField };
@@ -78,12 +78,12 @@ export async function writeModelsSql(targetDir, blueprint, databaseType = "postg
78
78
  const dbTypeMap = typeMap[databaseType] || typeMap.sqlite;
79
79
  const quoteChar = databaseType === 'mysql' ? '`' : '"';
80
80
  for (const model of models) {
81
- const tableName = model.name || model.id || "table";
81
+ const tableName = (model.name || model.id || "table").toLowerCase();
82
82
  lines.push(`\n-- Model: ${tableName}`);
83
83
  const fieldDefs = [];
84
84
  const fields = model.fields || [];
85
85
  for (const f of fields) {
86
- const name = f.name || "col";
86
+ const name = (f.name || "col").toLowerCase();
87
87
  const dt = f.datatype.toUpperCase() || "TEXT";
88
88
  const size = f.datatypesize || "";
89
89
  const required = f.required.toLowerCase() === "true" ? " NOT NULL" : "";
@@ -98,7 +98,7 @@ export async function writeModelsSql(targetDir, blueprint, databaseType = "postg
98
98
  if (model.data_is_user_specific.toLowerCase() === "true") {
99
99
  const userIdType = databaseType === 'mysql' ? 'VARCHAR(36)' : (databaseType === 'postgres' ? 'UUID' : 'TEXT');
100
100
  fieldDefs.push(` ${quoteChar}userid${quoteChar} ${userIdType} NOT NULL`);
101
- fieldDefs.push(` FOREIGN KEY (${quoteChar}userid${quoteChar}) REFERENCES ${quoteChar}Users${quoteChar} (${quoteChar}userid${quoteChar})`);
101
+ fieldDefs.push(` FOREIGN KEY (${quoteChar}userid${quoteChar}) REFERENCES ${quoteChar}users${quoteChar} (${quoteChar}userid${quoteChar})`);
102
102
  }
103
103
  const createSql = `CREATE TABLE IF NOT EXISTS ${quoteChar}${tableName}${quoteChar} (\n${fieldDefs.join(",\n")}\n);`;
104
104
  lines.push(createSql);
@@ -163,7 +163,7 @@ export function generateSQLFromMigrations(migrations, databaseType = "postgres")
163
163
  const sql = [];
164
164
  for (const m of migrations) {
165
165
  const action = m.action;
166
- const modelName = m.modelName || m.modelId || "";
166
+ const modelName = (m.modelName || m.modelId || "").toLowerCase();
167
167
  if (action === "create") {
168
168
  const modelChange = m.changes.find((c) => c.type === "model" && c.operation === "add");
169
169
  const model = (modelChange?.newValue ?? { name: modelName });
@@ -179,9 +179,9 @@ export function generateSQLFromMigrations(migrations, databaseType = "postgres")
179
179
  }
180
180
  const required = f.required.toLowerCase() === "true" ? " NOT NULL" : "";
181
181
  const pk = (f.key === "primary") ? " PRIMARY KEY" : "";
182
- return ` ${quoteChar}${f.name}${quoteChar} ${mappedType}${required}${pk}`;
182
+ return ` ${quoteChar}${f.name.toLowerCase()}${quoteChar} ${mappedType}${required}${pk}`;
183
183
  });
184
- sql.push(`CREATE TABLE IF NOT EXISTS ${quoteChar}${model.name || modelName}${quoteChar} (\n${fieldDefs.join(",\n")}\n);`);
184
+ sql.push(`CREATE TABLE IF NOT EXISTS ${quoteChar}${(model.name || modelName).toLowerCase()}${quoteChar} (\n${fieldDefs.join(",\n")}\n);`);
185
185
  continue;
186
186
  }
187
187
  if (action === "delete") {
@@ -204,19 +204,19 @@ export function generateSQLFromMigrations(migrations, databaseType = "postgres")
204
204
  const required = f.required.toLowerCase() === "true" ? " NOT NULL" : "";
205
205
  // SQLite doesn't support ALTER COLUMN syntax, needs special handling
206
206
  if (databaseType === 'sqlite') {
207
- sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ADD COLUMN ${quoteChar}${f.name}${quoteChar} ${mappedType}${required};`);
207
+ sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ADD COLUMN ${quoteChar}${f.name.toLowerCase()}${quoteChar} ${mappedType}${required};`);
208
208
  }
209
209
  else {
210
- sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ADD COLUMN ${quoteChar}${f.name}${quoteChar} ${mappedType}${required};`);
210
+ sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ADD COLUMN ${quoteChar}${f.name.toLowerCase()}${quoteChar} ${mappedType}${required};`);
211
211
  }
212
212
  }
213
213
  else if (c.operation === "remove" && c.field) {
214
214
  // SQLite doesn't support DROP COLUMN before version 3.35.0
215
215
  if (databaseType === 'sqlite') {
216
- sql.push(`-- WARNING: SQLite doesn't support DROP COLUMN. Manual migration required for: ${quoteChar}${modelName}${quoteChar}.${quoteChar}${c.field}${quoteChar}`);
216
+ sql.push(`-- WARNING: SQLite doesn't support DROP COLUMN. Manual migration required for: ${quoteChar}${modelName}${quoteChar}.${quoteChar}${c.field.toLowerCase()}${quoteChar}`);
217
217
  }
218
218
  else {
219
- sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} DROP COLUMN ${quoteChar}${c.field}${quoteChar};`);
219
+ sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} DROP COLUMN ${quoteChar}${c.field.toLowerCase()}${quoteChar};`);
220
220
  }
221
221
  }
222
222
  else if (c.operation === "modify") {
@@ -230,15 +230,15 @@ export function generateSQLFromMigrations(migrations, databaseType = "postgres")
230
230
  }
231
231
  // SQLite doesn't support ALTER COLUMN TYPE
232
232
  if (databaseType === 'sqlite') {
233
- sql.push(`-- WARNING: SQLite doesn't support ALTER COLUMN TYPE. Manual migration required for: ${quoteChar}${modelName}${quoteChar}.${quoteChar}${f.name || c.field || "col"}${quoteChar}`);
233
+ sql.push(`-- WARNING: SQLite doesn't support ALTER COLUMN TYPE. Manual migration required for: ${quoteChar}${modelName}${quoteChar}.${quoteChar}${(f.name || c.field || "col").toLowerCase()}${quoteChar}`);
234
234
  }
235
235
  else if (databaseType === 'mysql') {
236
236
  // MySQL uses MODIFY syntax
237
- sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} MODIFY COLUMN ${quoteChar}${f.name || c.field || "col"}${quoteChar} ${mappedType};`);
237
+ sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} MODIFY COLUMN ${quoteChar}${(f.name || c.field || "col").toLowerCase()}${quoteChar} ${mappedType};`);
238
238
  }
239
239
  else {
240
240
  // PostgreSQL uses ALTER COLUMN TYPE
241
- sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ALTER COLUMN ${quoteChar}${f.name || c.field || "col"}${quoteChar} TYPE ${mappedType};`);
241
+ sql.push(`ALTER TABLE ${quoteChar}${modelName}${quoteChar} ALTER COLUMN ${quoteChar}${(f.name || c.field || "col").toLowerCase()}${quoteChar} TYPE ${mappedType};`);
242
242
  }
243
243
  }
244
244
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/generators/sql.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/generators/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,SAAoB,EAAE,eAAgD,UAAU;IACtI,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,SAAS,CAAC,aAAa,CAAC,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,YAAY;IAEjD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC;IACtC,MAAM,KAAK,GAAa,CAAC,gDAAgD,CAAE,CAAC;IAE5E,mDAAmD;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,EAAE,MAAM,CAAC,CAAC;YACzG,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,MAAM,OAAO,GAA2C;QACtD,MAAM,EAAE;YACN,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,MAAM;YACjB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,MAAM;YAClB,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,SAAS;SACrB;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,UAAU;YACrB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE,kBAAkB;YAC5B,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,SAAS;SACrB;QACD,KAAK,EAAE;YACL,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,SAAS;SACrB;KACF,CAAC;IAEF,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC;IAC1D,MAAM,SAAS,GAAG,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAEvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;QACvC,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;QAElC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC;YAC9C,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YAEvD,IAAI,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACrC,2BAA2B;YAC3B,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC;gBAC7B,UAAU,GAAG,WAAW,IAAI,GAAG,CAAC;YAClC,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS,GAAG,IAAI,GAAG,SAAS,IAAI,UAAU,GAAG,QAAQ,GAAG,EAAE,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,KAAK,CAAC,qBAAqB,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC9G,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS,SAAS,SAAS,IAAI,UAAU,WAAW,CAAC,CAAC;YAC1E,SAAS,CAAC,IAAI,CAAC,kBAAkB,SAAS,SAAS,SAAS,gBAAgB,SAAS,QAAQ,SAAS,KAAK,SAAS,SAAS,SAAS,GAAG,CAAC,CAAC;QAC7I,CAAC;QAED,MAAM,SAAS,GAAG,8BAA8B,SAAS,GAAG,SAAS,GAAG,SAAS,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACpH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAuB,EAAE,eAAgD,UAAU;IAC3H,kCAAkC;IAClC,MAAM,OAAO,GAA2C;QACtD,MAAM,EAAE;YACN,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,MAAM;YACjB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,MAAM;YAClB,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,SAAS;SACrB;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,UAAU;YACrB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE,kBAAkB;YAC5B,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,SAAS;SACrB;QACD,KAAK,EAAE;YACL,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,SAAS;SACrB;KACF,CAAC;IAEF,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC;IAC1D,MAAM,SAAS,GAAG,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAEvD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACxB,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACjE,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;YACvF,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAU,CAAC;YACtE,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;YACvF,MAAM,SAAS,GAAa,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,QAAsB,CAAC;gBACnC,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,MAAM,CAAC;gBAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC;gBAElC,IAAI,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;gBACrC,2BAA2B;gBAC3B,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC;oBAC7B,UAAU,GAAG,WAAW,IAAI,GAAG,CAAC;gBAClC,CAAC;gBAED,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,OAAO,KAAK,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,IAAI,UAAU,GAAG,QAAQ,GAAG,EAAE,EAAE,CAAC;YAC3F,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,8BAA8B,SAAS,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1I,SAAS;QACX,CAAC;QACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,wBAAwB,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;YACvE,SAAS;QACX,CAAC;QACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;oBAAE,SAAS;gBACjC,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;oBAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,QAAsB,CAAC;oBACnC,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,MAAM,CAAC;oBAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC;oBAElC,IAAI,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;oBACrC,2BAA2B;oBAC3B,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC;wBAC7B,UAAU,GAAG,WAAW,IAAI,GAAG,CAAC;oBAClC,CAAC;oBAED,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;oBAExE,qEAAqE;oBACrE,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;wBAC9B,GAAG,CAAC,IAAI,CAAC,eAAe,SAAS,GAAG,SAAS,GAAG,SAAS,eAAe,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,IAAI,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC;oBACpJ,CAAC;yBAAM,CAAC;wBACN,GAAG,CAAC,IAAI,CAAC,eAAe,SAAS,GAAG,SAAS,GAAG,SAAS,eAAe,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,IAAI,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC;oBACpJ,CAAC;gBACH,CAAC;qBAAM,IAAI,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC/C,2DAA2D;oBAC3D,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;wBAC9B,GAAG,CAAC,IAAI,CAAC,kFAAkF,SAAS,GAAG,SAAS,GAAG,SAAS,IAAI,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;oBACnL,CAAC;yBAAM,CAAC;wBACN,GAAG,CAAC,IAAI,CAAC,eAAe,SAAS,GAAG,SAAS,GAAG,SAAS,gBAAgB,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,SAAS,GAAG,CAAC,CAAC;oBAC7H,CAAC;gBACH,CAAC;qBAAM,IAAI,CAAC,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;oBACpC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAsB,CAAC;oBACnC,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,MAAM,CAAC;oBAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC;oBAElC,IAAI,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;oBACrC,2BAA2B;oBAC3B,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC;wBAC7B,UAAU,GAAG,WAAW,IAAI,GAAG,CAAC;oBAClC,CAAC;oBAED,2CAA2C;oBAC3C,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;wBAC9B,GAAG,CAAC,IAAI,CAAC,wFAAwF,SAAS,GAAG,SAAS,GAAG,SAAS,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;oBAC9M,CAAC;yBAAM,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;wBACpC,2BAA2B;wBAC3B,GAAG,CAAC,IAAI,CAAC,eAAe,SAAS,GAAG,SAAS,GAAG,SAAS,kBAAkB,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,IAAI,UAAU,GAAG,CAAC,CAAC;oBAClK,CAAC;yBAAM,CAAC;wBACN,oCAAoC;wBACpC,GAAG,CAAC,IAAI,CAAC,eAAe,SAAS,GAAG,SAAS,GAAG,SAAS,iBAAiB,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,SAAS,UAAU,GAAG,CAAC,CAAC;oBACtK,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,SAAiB,EAAE,SAAoB,EAAE,eAAgD,QAAQ;IAChJ,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO;IAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,SAAS,CAAC,aAAa,CAAC,CAAC;IACzB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,SAAS,MAAM,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG;QACd,kCAAkC;QAClC,oBAAoB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QAC9C,EAAE;QACF,GAAG,UAAU;KACd,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sitepaige-mcp-server",
3
- "version": "0.7.9",
3
+ "version": "0.7.11",
4
4
  "type": "module",
5
5
  "description": "MCP server for generating web applications using SitePaige AI. Generate frontend (FREE/12 credits) then optionally add backend (50 credits)",
6
6
  "keywords": [