@sonicjs-cms/core 2.0.2 → 2.0.3

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.
@@ -1,7 +1,7 @@
1
1
  import { getCacheService, CACHE_CONFIGS, getLogger } from './chunk-LH4Z7QID.js';
2
- import { requireAuth, isPluginActive, requireRole, AuthManager, logActivity, requirePermission } from './chunk-M6FPVS7E.js';
2
+ import { requireAuth, isPluginActive, requireRole, AuthManager, logActivity } from './chunk-M6FPVS7E.js';
3
3
  import { PluginService, MigrationService } from './chunk-CDBVZEWR.js';
4
- import { init_admin_layout_catalyst_template, renderDesignPage, renderCheckboxPage, renderFAQList, renderTestimonialsList, renderCodeExamplesList, renderAlert, renderTable, renderPagination, renderConfirmationDialog, getConfirmationDialogScript, renderAdminLayoutCatalyst, renderAdminLayout, adminLayoutV2, renderForm } from './chunk-O46XKBFM.js';
4
+ import { init_admin_layout_catalyst_template, renderDesignPage, renderCheckboxPage, renderFAQList, renderTestimonialsList, renderCodeExamplesList, renderAlert, renderTable, renderPagination, renderConfirmationDialog, getConfirmationDialogScript, renderAdminLayoutCatalyst, renderAdminLayout, adminLayoutV2, renderForm } from './chunk-3LZ6TLPC.js';
5
5
  import { QueryFilterBuilder, sanitizeInput, getCoreVersion, escapeHtml } from './chunk-XJETEIRU.js';
6
6
  import { metricsTracker } from './chunk-FICTAGD4.js';
7
7
  import { Hono } from 'hono';
@@ -2031,9 +2031,36 @@ function renderRegisterPage(data) {
2031
2031
  </html>
2032
2032
  `;
2033
2033
  }
2034
-
2035
- // src/services/auth-validation.ts
2036
- var authValidationService = {};
2034
+ var authValidationService = {
2035
+ /**
2036
+ * Build registration schema dynamically based on auth settings
2037
+ * For now, returns a static schema with standard fields
2038
+ */
2039
+ async buildRegistrationSchema(_db) {
2040
+ return z.object({
2041
+ email: z.string().email("Valid email is required"),
2042
+ password: z.string().min(8, "Password must be at least 8 characters"),
2043
+ username: z.string().min(3, "Username must be at least 3 characters").optional(),
2044
+ firstName: z.string().min(1, "First name is required").optional(),
2045
+ lastName: z.string().min(1, "Last name is required").optional()
2046
+ });
2047
+ },
2048
+ /**
2049
+ * Generate default values for optional fields
2050
+ */
2051
+ generateDefaultValue(field, data) {
2052
+ switch (field) {
2053
+ case "username":
2054
+ return data.email ? data.email.split("@")[0] : `user${Date.now()}`;
2055
+ case "firstName":
2056
+ return "User";
2057
+ case "lastName":
2058
+ return data.email ? data.email.split("@")[0] : "Account";
2059
+ default:
2060
+ return "";
2061
+ }
2062
+ }
2063
+ };
2037
2064
 
2038
2065
  // src/routes/auth.ts
2039
2066
  var authRoutes = new Hono();
@@ -7987,7 +8014,7 @@ userRoutes.post("/profile/password", async (c) => {
7987
8014
  }));
7988
8015
  }
7989
8016
  });
7990
- userRoutes.get("/users", requirePermission("users.read"), async (c) => {
8017
+ userRoutes.get("/users", async (c) => {
7991
8018
  const db = c.env.DB;
7992
8019
  const user = c.get("user");
7993
8020
  try {
@@ -8106,7 +8133,7 @@ userRoutes.get("/users", requirePermission("users.read"), async (c) => {
8106
8133
  }), 500);
8107
8134
  }
8108
8135
  });
8109
- userRoutes.get("/users/new", requirePermission("users.create"), async (c) => {
8136
+ userRoutes.get("/users/new", async (c) => {
8110
8137
  const user = c.get("user");
8111
8138
  try {
8112
8139
  const pageData = {
@@ -8127,7 +8154,7 @@ userRoutes.get("/users/new", requirePermission("users.create"), async (c) => {
8127
8154
  }), 500);
8128
8155
  }
8129
8156
  });
8130
- userRoutes.post("/users/new", requirePermission("users.create"), async (c) => {
8157
+ userRoutes.post("/users/new", async (c) => {
8131
8158
  const db = c.env.DB;
8132
8159
  const user = c.get("user");
8133
8160
  try {
@@ -8227,7 +8254,7 @@ userRoutes.post("/users/new", requirePermission("users.create"), async (c) => {
8227
8254
  }));
8228
8255
  }
8229
8256
  });
8230
- userRoutes.get("/users/:id", requirePermission("users.read"), async (c) => {
8257
+ userRoutes.get("/users/:id", async (c) => {
8231
8258
  if (c.req.path.endsWith("/edit")) {
8232
8259
  return c.notFound();
8233
8260
  }
@@ -8278,7 +8305,7 @@ userRoutes.get("/users/:id", requirePermission("users.read"), async (c) => {
8278
8305
  return c.json({ error: "Failed to fetch user" }, 500);
8279
8306
  }
8280
8307
  });
8281
- userRoutes.get("/users/:id/edit", requirePermission("users.update"), async (c) => {
8308
+ userRoutes.get("/users/:id/edit", async (c) => {
8282
8309
  const db = c.env.DB;
8283
8310
  const user = c.get("user");
8284
8311
  const userId = c.req.param("id");
@@ -8332,7 +8359,7 @@ userRoutes.get("/users/:id/edit", requirePermission("users.update"), async (c) =
8332
8359
  }), 500);
8333
8360
  }
8334
8361
  });
8335
- userRoutes.put("/users/:id", requirePermission("users.update"), async (c) => {
8362
+ userRoutes.put("/users/:id", async (c) => {
8336
8363
  const db = c.env.DB;
8337
8364
  const user = c.get("user");
8338
8365
  const userId = c.req.param("id");
@@ -8418,7 +8445,7 @@ userRoutes.put("/users/:id", requirePermission("users.update"), async (c) => {
8418
8445
  }));
8419
8446
  }
8420
8447
  });
8421
- userRoutes.delete("/users/:id", requirePermission("users.delete"), async (c) => {
8448
+ userRoutes.delete("/users/:id", async (c) => {
8422
8449
  const db = c.env.DB;
8423
8450
  const user = c.get("user");
8424
8451
  const userId = c.req.param("id");
@@ -8479,7 +8506,7 @@ userRoutes.delete("/users/:id", requirePermission("users.delete"), async (c) =>
8479
8506
  return c.json({ error: "Failed to delete user" }, 500);
8480
8507
  }
8481
8508
  });
8482
- userRoutes.post("/invite-user", requirePermission("users.create"), async (c) => {
8509
+ userRoutes.post("/invite-user", async (c) => {
8483
8510
  const db = c.env.DB;
8484
8511
  const user = c.get("user");
8485
8512
  try {
@@ -8555,7 +8582,7 @@ userRoutes.post("/invite-user", requirePermission("users.create"), async (c) =>
8555
8582
  return c.json({ error: "Failed to send user invitation" }, 500);
8556
8583
  }
8557
8584
  });
8558
- userRoutes.post("/resend-invitation/:id", requirePermission("users.create"), async (c) => {
8585
+ userRoutes.post("/resend-invitation/:id", async (c) => {
8559
8586
  const db = c.env.DB;
8560
8587
  const user = c.get("user");
8561
8588
  const userId = c.req.param("id");
@@ -8604,7 +8631,7 @@ userRoutes.post("/resend-invitation/:id", requirePermission("users.create"), asy
8604
8631
  return c.json({ error: "Failed to resend invitation" }, 500);
8605
8632
  }
8606
8633
  });
8607
- userRoutes.delete("/cancel-invitation/:id", requirePermission("users.delete"), async (c) => {
8634
+ userRoutes.delete("/cancel-invitation/:id", async (c) => {
8608
8635
  const db = c.env.DB;
8609
8636
  const user = c.get("user");
8610
8637
  const userId = c.req.param("id");
@@ -8638,7 +8665,7 @@ userRoutes.delete("/cancel-invitation/:id", requirePermission("users.delete"), a
8638
8665
  return c.json({ error: "Failed to cancel invitation" }, 500);
8639
8666
  }
8640
8667
  });
8641
- userRoutes.get("/activity-logs", requirePermission("activity.read"), async (c) => {
8668
+ userRoutes.get("/activity-logs", async (c) => {
8642
8669
  const db = c.env.DB;
8643
8670
  const user = c.get("user");
8644
8671
  try {
@@ -8744,7 +8771,7 @@ userRoutes.get("/activity-logs", requirePermission("activity.read"), async (c) =
8744
8771
  return c.html(renderActivityLogsPage(pageData));
8745
8772
  }
8746
8773
  });
8747
- userRoutes.get("/activity-logs/export", requirePermission("activity.read"), async (c) => {
8774
+ userRoutes.get("/activity-logs/export", async (c) => {
8748
8775
  const db = c.env.DB;
8749
8776
  const user = c.get("user");
8750
8777
  try {
@@ -18222,7 +18249,7 @@ function renderSettingsPage(data) {
18222
18249
  // Migration functions
18223
18250
  window.refreshMigrationStatus = async function() {
18224
18251
  try {
18225
- const response = await fetch('/admin/api/migrations/status');
18252
+ const response = await fetch('/admin/settings/api/migrations/status');
18226
18253
  const result = await response.json();
18227
18254
 
18228
18255
  if (result.success) {
@@ -18250,7 +18277,7 @@ function renderSettingsPage(data) {
18250
18277
  btn.innerHTML = 'Running...';
18251
18278
 
18252
18279
  try {
18253
- const response = await fetch('/admin/api/migrations/run', {
18280
+ const response = await fetch('/admin/settings/api/migrations/run', {
18254
18281
  method: 'POST'
18255
18282
  });
18256
18283
  const result = await response.json();
@@ -18271,7 +18298,7 @@ function renderSettingsPage(data) {
18271
18298
 
18272
18299
  window.validateSchema = async function() {
18273
18300
  try {
18274
- const response = await fetch('/admin/api/migrations/validate');
18301
+ const response = await fetch('/admin/settings/api/migrations/validate');
18275
18302
  const result = await response.json();
18276
18303
 
18277
18304
  if (result.success) {
@@ -18349,7 +18376,7 @@ function renderSettingsPage(data) {
18349
18376
  // Database Tools functions
18350
18377
  window.refreshDatabaseStats = async function() {
18351
18378
  try {
18352
- const response = await fetch('/admin/database-tools/api/stats');
18379
+ const response = await fetch('/admin/settings/api/database-tools/stats');
18353
18380
  const result = await response.json();
18354
18381
 
18355
18382
  if (result.success) {
@@ -18370,7 +18397,7 @@ function renderSettingsPage(data) {
18370
18397
  btn.innerHTML = 'Creating Backup...';
18371
18398
 
18372
18399
  try {
18373
- const response = await fetch('/admin/database-tools/api/backup', {
18400
+ const response = await fetch('/admin/settings/api/database-tools/backup', {
18374
18401
  method: 'POST'
18375
18402
  });
18376
18403
  const result = await response.json();
@@ -18409,7 +18436,7 @@ function renderSettingsPage(data) {
18409
18436
  btn.innerHTML = 'Truncating...';
18410
18437
 
18411
18438
  try {
18412
- const response = await fetch('/admin/database-tools/api/truncate', {
18439
+ const response = await fetch('/admin/settings/api/database-tools/truncate', {
18413
18440
  method: 'POST',
18414
18441
  headers: {
18415
18442
  'Content-Type': 'application/json'
@@ -18440,7 +18467,7 @@ function renderSettingsPage(data) {
18440
18467
 
18441
18468
  window.validateDatabase = async function() {
18442
18469
  try {
18443
- const response = await fetch('/admin/database-tools/api/validate');
18470
+ const response = await fetch('/admin/settings/api/database-tools/validate');
18444
18471
  const result = await response.json();
18445
18472
 
18446
18473
  if (result.success) {
@@ -19294,7 +19321,7 @@ function renderMigrationSettings(settings) {
19294
19321
  if (typeof refreshMigrationStatus === 'undefined') {
19295
19322
  window.refreshMigrationStatus = async function() {
19296
19323
  try {
19297
- const response = await fetch('/admin/api/migrations/status');
19324
+ const response = await fetch('/admin/settings/api/migrations/status');
19298
19325
  const result = await response.json();
19299
19326
 
19300
19327
  if (result.success) {
@@ -19767,6 +19794,138 @@ adminSettingsRoutes.get("/api/migrations/validate", async (c) => {
19767
19794
  }, 500);
19768
19795
  }
19769
19796
  });
19797
+ adminSettingsRoutes.get("/api/database-tools/stats", async (c) => {
19798
+ try {
19799
+ const db = c.env.DB;
19800
+ const tablesQuery = await db.prepare(`
19801
+ SELECT name FROM sqlite_master
19802
+ WHERE type='table'
19803
+ AND name NOT LIKE 'sqlite_%'
19804
+ AND name NOT LIKE '_cf_%'
19805
+ ORDER BY name
19806
+ `).all();
19807
+ const tables = tablesQuery.results || [];
19808
+ let totalRows = 0;
19809
+ const tableStats = await Promise.all(
19810
+ tables.map(async (table) => {
19811
+ try {
19812
+ const countResult = await db.prepare(`SELECT COUNT(*) as count FROM ${table.name}`).first();
19813
+ const rowCount = countResult?.count || 0;
19814
+ totalRows += rowCount;
19815
+ return {
19816
+ name: table.name,
19817
+ rowCount
19818
+ };
19819
+ } catch (error) {
19820
+ console.error(`Error counting rows in ${table.name}:`, error);
19821
+ return {
19822
+ name: table.name,
19823
+ rowCount: 0
19824
+ };
19825
+ }
19826
+ })
19827
+ );
19828
+ const estimatedSizeBytes = totalRows * 1024;
19829
+ const databaseSizeMB = (estimatedSizeBytes / (1024 * 1024)).toFixed(2);
19830
+ return c.json({
19831
+ success: true,
19832
+ data: {
19833
+ totalTables: tables.length,
19834
+ totalRows,
19835
+ databaseSize: `${databaseSizeMB} MB (estimated)`,
19836
+ tables: tableStats
19837
+ }
19838
+ });
19839
+ } catch (error) {
19840
+ console.error("Error fetching database stats:", error);
19841
+ return c.json({
19842
+ success: false,
19843
+ error: "Failed to fetch database statistics"
19844
+ }, 500);
19845
+ }
19846
+ });
19847
+ adminSettingsRoutes.get("/api/database-tools/validate", async (c) => {
19848
+ try {
19849
+ const db = c.env.DB;
19850
+ const integrityResult = await db.prepare("PRAGMA integrity_check").first();
19851
+ const isValid = integrityResult?.integrity_check === "ok";
19852
+ return c.json({
19853
+ success: true,
19854
+ data: {
19855
+ valid: isValid,
19856
+ message: isValid ? "Database integrity check passed" : "Database integrity check failed"
19857
+ }
19858
+ });
19859
+ } catch (error) {
19860
+ console.error("Error validating database:", error);
19861
+ return c.json({
19862
+ success: false,
19863
+ error: "Failed to validate database"
19864
+ }, 500);
19865
+ }
19866
+ });
19867
+ adminSettingsRoutes.post("/api/database-tools/backup", async (c) => {
19868
+ try {
19869
+ const user = c.get("user");
19870
+ if (!user || user.role !== "admin") {
19871
+ return c.json({
19872
+ success: false,
19873
+ error: "Unauthorized. Admin access required."
19874
+ }, 403);
19875
+ }
19876
+ return c.json({
19877
+ success: true,
19878
+ message: "Database backup feature coming soon. Use Cloudflare Dashboard for backups."
19879
+ });
19880
+ } catch (error) {
19881
+ console.error("Error creating backup:", error);
19882
+ return c.json({
19883
+ success: false,
19884
+ error: "Failed to create backup"
19885
+ }, 500);
19886
+ }
19887
+ });
19888
+ adminSettingsRoutes.post("/api/database-tools/truncate", async (c) => {
19889
+ try {
19890
+ const user = c.get("user");
19891
+ if (!user || user.role !== "admin") {
19892
+ return c.json({
19893
+ success: false,
19894
+ error: "Unauthorized. Admin access required."
19895
+ }, 403);
19896
+ }
19897
+ const body = await c.req.json();
19898
+ const tablesToTruncate = body.tables || [];
19899
+ if (!Array.isArray(tablesToTruncate) || tablesToTruncate.length === 0) {
19900
+ return c.json({
19901
+ success: false,
19902
+ error: "No tables specified for truncation"
19903
+ }, 400);
19904
+ }
19905
+ const db = c.env.DB;
19906
+ const results = [];
19907
+ for (const tableName of tablesToTruncate) {
19908
+ try {
19909
+ await db.prepare(`DELETE FROM ${tableName}`).run();
19910
+ results.push({ table: tableName, success: true });
19911
+ } catch (error) {
19912
+ console.error(`Error truncating ${tableName}:`, error);
19913
+ results.push({ table: tableName, success: false, error: String(error) });
19914
+ }
19915
+ }
19916
+ return c.json({
19917
+ success: true,
19918
+ message: `Truncated ${results.filter((r) => r.success).length} of ${tablesToTruncate.length} tables`,
19919
+ results
19920
+ });
19921
+ } catch (error) {
19922
+ console.error("Error truncating tables:", error);
19923
+ return c.json({
19924
+ success: false,
19925
+ error: "Failed to truncate tables"
19926
+ }, 500);
19927
+ }
19928
+ });
19770
19929
  adminSettingsRoutes.post("/", async (c) => {
19771
19930
  try {
19772
19931
  const formData = await c.req.formData();
@@ -19819,5 +19978,5 @@ var ROUTES_INFO = {
19819
19978
  };
19820
19979
 
19821
19980
  export { ROUTES_INFO, adminCheckboxRoutes, adminCollectionsRoutes, adminDesignRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, admin_api_default, admin_code_examples_default, admin_content_default, admin_faq_default, admin_testimonials_default, api_content_crud_default, api_default, api_media_default, api_system_default, auth_default, router, userRoutes };
19822
- //# sourceMappingURL=chunk-SGGHTIWV.js.map
19823
- //# sourceMappingURL=chunk-SGGHTIWV.js.map
19981
+ //# sourceMappingURL=chunk-PPUKPNTP.js.map
19982
+ //# sourceMappingURL=chunk-PPUKPNTP.js.map