sitepaige-mcp-server 0.7.14 → 1.0.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.
Files changed (40) hide show
  1. package/README.md +94 -42
  2. package/components/form.tsx +133 -6
  3. package/components/login.tsx +173 -21
  4. package/components/menu.tsx +128 -3
  5. package/components/testimonial.tsx +1 -1
  6. package/defaultapp/api/Auth/route.ts +105 -3
  7. package/defaultapp/api/Auth/signup/route.ts +143 -0
  8. package/defaultapp/api/Auth/verify-email/route.ts +98 -0
  9. package/defaultapp/db-password-auth.ts +325 -0
  10. package/defaultapp/storage/email.ts +162 -0
  11. package/dist/blueprintWriter.js +15 -1
  12. package/dist/blueprintWriter.js.map +1 -1
  13. package/dist/components/form.tsx +133 -6
  14. package/dist/components/login.tsx +173 -21
  15. package/dist/components/menu.tsx +128 -3
  16. package/dist/components/testimonial.tsx +1 -1
  17. package/dist/defaultapp/api/Auth/route.ts +105 -3
  18. package/dist/defaultapp/api/Auth/signup/route.ts +143 -0
  19. package/dist/defaultapp/api/Auth/verify-email/route.ts +98 -0
  20. package/dist/defaultapp/db-password-auth.ts +325 -0
  21. package/dist/defaultapp/storage/email.ts +162 -0
  22. package/dist/generators/apis.js +1 -0
  23. package/dist/generators/apis.js.map +1 -1
  24. package/dist/generators/defaultapp.js +2 -2
  25. package/dist/generators/defaultapp.js.map +1 -1
  26. package/dist/generators/env-example-template.txt +27 -0
  27. package/dist/generators/images.js +38 -13
  28. package/dist/generators/images.js.map +1 -1
  29. package/dist/generators/pages.js +1 -1
  30. package/dist/generators/pages.js.map +1 -1
  31. package/dist/generators/sql.js +19 -0
  32. package/dist/generators/sql.js.map +1 -1
  33. package/dist/generators/views.js +17 -2
  34. package/dist/generators/views.js.map +1 -1
  35. package/dist/index.js +15 -116
  36. package/dist/index.js.map +1 -1
  37. package/dist/sitepaige.js +20 -127
  38. package/dist/sitepaige.js.map +1 -1
  39. package/manifest.json +5 -24
  40. package/package.json +3 -2
@@ -0,0 +1,325 @@
1
+ /*
2
+ * Username/Password Authentication Database Utilities
3
+ * Handles all database operations related to username/password authentication
4
+ */
5
+
6
+ import { db_init, db_query } from './db';
7
+ import type { DatabaseClient } from './db';
8
+ import * as crypto from 'node:crypto';
9
+ import { scrypt, randomBytes } from 'node:crypto';
10
+ import { promisify } from 'node:util';
11
+
12
+ const scryptAsync = promisify(scrypt);
13
+
14
+ export interface PasswordAuth {
15
+ id: string;
16
+ email: string; // Email serves as username
17
+ passwordhash: string;
18
+ salt: string;
19
+ verificationtoken?: string;
20
+ verificationtokenexpires?: string;
21
+ emailverified: boolean;
22
+ resettoken?: string;
23
+ resettokenexpires?: string;
24
+ createdat: string;
25
+ updatedat: string;
26
+ }
27
+
28
+ /**
29
+ * Hash a password using scrypt
30
+ */
31
+ export async function hashPassword(password: string): Promise<{ hash: string; salt: string }> {
32
+ const salt = randomBytes(32).toString('base64');
33
+ const hash = (await scryptAsync(password, salt, 64)) as Buffer;
34
+ return {
35
+ hash: hash.toString('base64'),
36
+ salt
37
+ };
38
+ }
39
+
40
+ /**
41
+ * Verify a password against its hash
42
+ */
43
+ export async function verifyPassword(password: string, hash: string, salt: string): Promise<boolean> {
44
+ const derivedKey = (await scryptAsync(password, salt, 64)) as Buffer;
45
+ return derivedKey.toString('base64') === hash;
46
+ }
47
+
48
+ /**
49
+ * Create the password authentication table
50
+ */
51
+ export async function createPasswordAuthTable(): Promise<void> {
52
+ const client = await db_init();
53
+
54
+ const createTableQuery = `
55
+ CREATE TABLE IF NOT EXISTS passwordauth (
56
+ id TEXT PRIMARY KEY,
57
+ email TEXT NOT NULL UNIQUE,
58
+ passwordhash TEXT NOT NULL,
59
+ salt TEXT NOT NULL,
60
+ verificationtoken TEXT,
61
+ verificationtokenexpires TIMESTAMP,
62
+ emailverified BOOLEAN DEFAULT FALSE,
63
+ resettoken TEXT,
64
+ resettokenexpires TIMESTAMP,
65
+ createdat TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
66
+ updatedat TIMESTAMP DEFAULT CURRENT_TIMESTAMP
67
+ )
68
+ `;
69
+
70
+ await db_query(client, createTableQuery);
71
+
72
+ // Create index on email for faster lookups
73
+ await db_query(client, 'CREATE INDEX IF NOT EXISTS idx_passwordauth_email ON passwordauth(email)');
74
+ await db_query(client, 'CREATE INDEX IF NOT EXISTS idx_passwordauth_verification_token ON passwordauth(verificationtoken)');
75
+ await db_query(client, 'CREATE INDEX IF NOT EXISTS idx_passwordauth_reset_token ON passwordauth(resettoken)');
76
+ }
77
+
78
+ /**
79
+ * Get password auth record by email
80
+ */
81
+ export async function getPasswordAuthByEmail(email: string): Promise<PasswordAuth | null> {
82
+ const client = await db_init();
83
+
84
+ const results = await db_query(client,
85
+ "SELECT * FROM passwordauth WHERE email = ?",
86
+ [email.toLowerCase()]
87
+ );
88
+
89
+ return results.length > 0 ? results[0] as PasswordAuth : null;
90
+ }
91
+
92
+ /**
93
+ * Create a new password auth record (for signup)
94
+ */
95
+ export async function createPasswordAuth(
96
+ email: string,
97
+ password: string
98
+ ): Promise<{ passwordAuth: PasswordAuth; verificationToken: string }> {
99
+ const client = await db_init();
100
+
101
+ // Check if email already exists
102
+ const existing = await getPasswordAuthByEmail(email);
103
+ if (existing) {
104
+ throw new Error('Email already registered');
105
+ }
106
+
107
+ // Hash the password
108
+ const { hash, salt } = await hashPassword(password);
109
+
110
+ // Generate verification token
111
+ const verificationToken = randomBytes(32).toString('base64url');
112
+ const verificationTokenExpires = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 hours
113
+
114
+ const id = crypto.randomUUID();
115
+ const now = new Date().toISOString();
116
+
117
+ await db_query(client,
118
+ `INSERT INTO passwordauth
119
+ (id, email, passwordhash, salt, verificationtoken, verificationtokenexpires, emailverified, createdat, updatedat)
120
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
121
+ [id, email.toLowerCase(), hash, salt, verificationToken, verificationTokenExpires.toISOString(), false, now, now]
122
+ );
123
+
124
+ const passwordAuth = await getPasswordAuthByEmail(email);
125
+ if (!passwordAuth) {
126
+ throw new Error('Failed to create password auth record');
127
+ }
128
+
129
+ return { passwordAuth, verificationToken };
130
+ }
131
+
132
+ /**
133
+ * Verify email with token
134
+ */
135
+ export async function verifyEmailWithToken(token: string): Promise<PasswordAuth | null> {
136
+ const client = await db_init();
137
+
138
+ // Find the auth record with this token
139
+ const results = await db_query(client,
140
+ `SELECT * FROM passwordauth
141
+ WHERE verificationtoken = ?
142
+ AND verificationtokenexpires > CURRENT_TIMESTAMP
143
+ AND emailverified = false`,
144
+ [token]
145
+ );
146
+
147
+ if (results.length === 0) {
148
+ return null;
149
+ }
150
+
151
+ const authRecord = results[0];
152
+
153
+ // Mark email as verified and clear token
154
+ await db_query(client,
155
+ `UPDATE passwordauth
156
+ SET emailverified = true,
157
+ verificationtoken = NULL,
158
+ verificationtokenexpires = NULL,
159
+ updatedat = CURRENT_TIMESTAMP
160
+ WHERE id = ?`,
161
+ [authRecord.id]
162
+ );
163
+
164
+ return await getPasswordAuthByEmail(authRecord.email);
165
+ }
166
+
167
+ /**
168
+ * Authenticate user with email and password
169
+ */
170
+ export async function authenticateUser(email: string, password: string): Promise<PasswordAuth | null> {
171
+ const authRecord = await getPasswordAuthByEmail(email);
172
+
173
+ if (!authRecord) {
174
+ return null;
175
+ }
176
+
177
+ // Check if email is verified
178
+ if (!authRecord.emailverified) {
179
+ throw new Error('Email not verified');
180
+ }
181
+
182
+ // Verify password
183
+ const isValid = await verifyPassword(password, authRecord.passwordhash, authRecord.salt);
184
+
185
+ if (!isValid) {
186
+ return null;
187
+ }
188
+
189
+ return authRecord;
190
+ }
191
+
192
+ /**
193
+ * Generate password reset token
194
+ */
195
+ export async function generatePasswordResetToken(email: string): Promise<string | null> {
196
+ const client = await db_init();
197
+
198
+ const authRecord = await getPasswordAuthByEmail(email);
199
+ if (!authRecord) {
200
+ return null;
201
+ }
202
+
203
+ const resetToken = randomBytes(32).toString('base64url');
204
+ const resetTokenExpires = new Date(Date.now() + 60 * 60 * 1000); // 1 hour
205
+
206
+ await db_query(client,
207
+ `UPDATE passwordauth
208
+ SET resettoken = ?,
209
+ resettokenexpires = ?,
210
+ updatedat = CURRENT_TIMESTAMP
211
+ WHERE id = ?`,
212
+ [resetToken, resetTokenExpires.toISOString(), authRecord.id]
213
+ );
214
+
215
+ return resetToken;
216
+ }
217
+
218
+ /**
219
+ * Reset password with token
220
+ */
221
+ export async function resetPasswordWithToken(token: string, newPassword: string): Promise<boolean> {
222
+ const client = await db_init();
223
+
224
+ // Find the auth record with this token
225
+ const results = await db_query(client,
226
+ `SELECT * FROM passwordauth
227
+ WHERE resettoken = ?
228
+ AND resettokenexpires > CURRENT_TIMESTAMP`,
229
+ [token]
230
+ );
231
+
232
+ if (results.length === 0) {
233
+ return false;
234
+ }
235
+
236
+ const authRecord = results[0];
237
+
238
+ // Hash the new password
239
+ const { hash, salt } = await hashPassword(newPassword);
240
+
241
+ // Update password and clear reset token
242
+ await db_query(client,
243
+ `UPDATE passwordauth
244
+ SET passwordhash = ?,
245
+ salt = ?,
246
+ resettoken = NULL,
247
+ resettokenexpires = NULL,
248
+ updatedat = CURRENT_TIMESTAMP
249
+ WHERE id = ?`,
250
+ [hash, salt, authRecord.id]
251
+ );
252
+
253
+ return true;
254
+ }
255
+
256
+ /**
257
+ * Delete unverified accounts older than 7 days
258
+ */
259
+ export async function cleanupUnverifiedAccounts(): Promise<number> {
260
+ const client = await db_init();
261
+
262
+ const result = await db_query(client,
263
+ `DELETE FROM passwordauth
264
+ WHERE emailverified = false
265
+ AND createdat < datetime('now', '-7 days')`
266
+ );
267
+
268
+ return result[0]?.changes || 0;
269
+ }
270
+
271
+ /**
272
+ * Update password for authenticated user
273
+ */
274
+ export async function updatePassword(email: string, currentPassword: string, newPassword: string): Promise<boolean> {
275
+ // First verify the current password
276
+ const authRecord = await authenticateUser(email, currentPassword);
277
+ if (!authRecord) {
278
+ return false;
279
+ }
280
+
281
+ // Hash the new password
282
+ const { hash, salt } = await hashPassword(newPassword);
283
+ const client = await db_init();
284
+
285
+ // Update password
286
+ await db_query(client,
287
+ `UPDATE passwordauth
288
+ SET passwordhash = ?,
289
+ salt = ?,
290
+ updatedat = CURRENT_TIMESTAMP
291
+ WHERE id = ?`,
292
+ [hash, salt, authRecord.id]
293
+ );
294
+
295
+ return true;
296
+ }
297
+
298
+ /**
299
+ * Check if an email is already registered
300
+ */
301
+ export async function isEmailRegistered(email: string): Promise<boolean> {
302
+ const authRecord = await getPasswordAuthByEmail(email);
303
+ return authRecord !== null;
304
+ }
305
+
306
+ /**
307
+ * Get statistics about password auth users
308
+ */
309
+ export async function getPasswordAuthStats(): Promise<{
310
+ totalUsers: number;
311
+ verifiedUsers: number;
312
+ unverifiedUsers: number;
313
+ }> {
314
+ const client = await db_init();
315
+
316
+ const stats = await db_query(client, `
317
+ SELECT
318
+ COUNT(*) as totalUsers,
319
+ SUM(CASE WHEN emailverified = true THEN 1 ELSE 0 END) as verifiedUsers,
320
+ SUM(CASE WHEN emailverified = false THEN 1 ELSE 0 END) as unverifiedUsers
321
+ FROM passwordauth
322
+ `);
323
+
324
+ return stats[0];
325
+ }
@@ -0,0 +1,162 @@
1
+ import { randomBytes } from 'crypto';
2
+
3
+ // Simple in-memory storage for email tracking (in production, use a database)
4
+ const emailHistory: Map<string, any> = new Map();
5
+
6
+ export interface EmailOptions {
7
+ to: string | string[];
8
+ from: string;
9
+ subject: string;
10
+ html?: string;
11
+ text?: string;
12
+ cc?: string | string[];
13
+ bcc?: string | string[];
14
+ replyTo?: string | string[];
15
+ attachments?: Array<{
16
+ filename: string;
17
+ content: string; // base64 encoded content
18
+ contentType?: string;
19
+ }>;
20
+ headers?: Record<string, string>;
21
+ tags?: Array<{
22
+ name: string;
23
+ value: string;
24
+ }>;
25
+ }
26
+
27
+ /**
28
+ * Send email function that sends emails via the Resend API
29
+ * @param options Email options including to, from, subject, message content, etc.
30
+ * @returns Promise that resolves to the email ID from Resend
31
+ */
32
+ export async function send_email(options: EmailOptions): Promise<string> {
33
+ console.log(`📧 Sending email to: ${Array.isArray(options.to) ? options.to.join(', ') : options.to}`);
34
+ console.log(`📧 Subject: ${options.subject}`);
35
+
36
+ try {
37
+ // Get API key from environment
38
+ const apiKey = process.env.RESEND_API_KEY;
39
+ if (!apiKey) {
40
+ throw new Error('RESEND_API_KEY environment variable is not set');
41
+ }
42
+
43
+ // Prepare request body for Resend API
44
+ const requestBody: any = {
45
+ to: options.to,
46
+ from: options.from,
47
+ subject: options.subject,
48
+ };
49
+
50
+ // Add optional fields
51
+ if (options.html) requestBody.html = options.html;
52
+ if (options.text) requestBody.text = options.text;
53
+ if (options.cc) requestBody.cc = options.cc;
54
+ if (options.bcc) requestBody.bcc = options.bcc;
55
+ if (options.replyTo) requestBody.reply_to = options.replyTo;
56
+ if (options.headers) requestBody.headers = options.headers;
57
+ if (options.tags) requestBody.tags = options.tags;
58
+
59
+ // Handle attachments
60
+ if (options.attachments && options.attachments.length > 0) {
61
+ requestBody.attachments = options.attachments.map(att => ({
62
+ filename: att.filename,
63
+ content: att.content,
64
+ content_type: att.contentType,
65
+ }));
66
+ }
67
+
68
+ // Make API request to Resend
69
+ const response = await fetch('https://api.resend.com/emails', {
70
+ method: 'POST',
71
+ headers: {
72
+ 'Authorization': `Bearer ${apiKey}`,
73
+ 'Content-Type': 'application/json',
74
+ },
75
+ body: JSON.stringify(requestBody),
76
+ });
77
+
78
+ if (!response.ok) {
79
+ const errorData = await response.json().catch(() => ({ message: 'Unknown error' }));
80
+ throw new Error(`Resend API error: ${response.status} - ${errorData.message || response.statusText}`);
81
+ }
82
+
83
+ const result = await response.json();
84
+ const emailId = result.id;
85
+
86
+ // Store email metadata
87
+ const emailKey = `${Date.now()}_${randomBytes(6).toString('hex')}`;
88
+ emailHistory.set(emailKey, {
89
+ id: emailId,
90
+ to: options.to,
91
+ from: options.from,
92
+ subject: options.subject,
93
+ sentAt: new Date().toISOString(),
94
+ status: 'sent',
95
+ });
96
+
97
+ console.log(`✅ Email sent successfully. ID: ${emailId}`);
98
+
99
+ return emailId;
100
+ } catch (error) {
101
+ console.error('❌ Error sending email:', error);
102
+ throw new Error(`Failed to send email: ${error}`);
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Get email status by ID
108
+ * @param emailId The email ID returned from send_email
109
+ * @returns Email metadata or undefined if not found
110
+ */
111
+ export async function getEmailStatus(emailId: string): Promise<any> {
112
+ // Find email in history by Resend ID
113
+ for (const [key, data] of emailHistory.entries()) {
114
+ if (data.id === emailId) {
115
+ return data;
116
+ }
117
+ }
118
+
119
+ // If not found locally, could query Resend API for status
120
+ const apiKey = process.env.RESEND_API_KEY;
121
+ if (!apiKey) {
122
+ throw new Error('RESEND_API_KEY environment variable is not set');
123
+ }
124
+
125
+ try {
126
+ const response = await fetch(`https://api.resend.com/emails/${emailId}`, {
127
+ headers: {
128
+ 'Authorization': `Bearer ${apiKey}`,
129
+ },
130
+ });
131
+
132
+ if (!response.ok) {
133
+ return undefined;
134
+ }
135
+
136
+ return await response.json();
137
+ } catch (error) {
138
+ console.error('Error fetching email status:', error);
139
+ return undefined;
140
+ }
141
+ }
142
+
143
+ /**
144
+ * List sent emails from local history
145
+ * @returns Array of email metadata
146
+ */
147
+ export function listSentEmails(): Array<any> {
148
+ return Array.from(emailHistory.values());
149
+ }
150
+
151
+ /**
152
+ * Initialize global send_email function for generated API code
153
+ * This makes send_email available in the same way as the preview environment
154
+ */
155
+ export function initializeGlobalEmailAPI(): void {
156
+ // Make send_email available globally for API code execution
157
+ (global as any).send_email = send_email;
158
+ (global as any).getEmailStatus = getEmailStatus;
159
+ (global as any).listSentEmails = listSentEmails;
160
+
161
+ console.log('✅ Global email API initialized');
162
+ }
@@ -163,7 +163,21 @@ export async function writeLibraryFile(targetDir, fileType, fileName, base64Data
163
163
  const fullPath = path.join(targetDir, 'public', libraryPath);
164
164
  ensureDir(fullPath);
165
165
  // Ensure filename is safe and unique
166
- const safeFileName = fileName.replace(/[^a-zA-Z0-9._-]/g, '_');
166
+ let safeFileName = fileName.replace(/[^a-zA-Z0-9._-]/g, '_');
167
+ // Simple approach: Take first 40 chars and add extension
168
+ const nameOnly = safeFileName.substring(0, 40);
169
+ // Add appropriate extension based on file type
170
+ let extension = '';
171
+ if (fileType === 'image') {
172
+ extension = '.jpg';
173
+ }
174
+ else if (fileType === 'video') {
175
+ extension = '.mp4';
176
+ }
177
+ else {
178
+ extension = '.pdf';
179
+ }
180
+ safeFileName = nameOnly + extension;
167
181
  const filePath = path.join(fullPath, safeFileName);
168
182
  try {
169
183
  // Remove data URL prefix if present
@@ -1 +1 @@
1
- {"version":3,"file":"blueprintWriter.js","sourceRoot":"","sources":["../src/blueprintWriter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blueprintWriter.js","sourceRoot":"","sources":["../src/blueprintWriter.ts"],"names":[],"mappings":"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"}