@sonicjs-cms/core 1.0.0-alpha.1

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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +285 -0
  3. package/dist/chunk-JIINOD2W.js +471 -0
  4. package/dist/chunk-JIINOD2W.js.map +1 -0
  5. package/dist/chunk-KYGRJCZM.cjs +44 -0
  6. package/dist/chunk-KYGRJCZM.cjs.map +1 -0
  7. package/dist/chunk-LOUJRBXV.js +42 -0
  8. package/dist/chunk-LOUJRBXV.js.map +1 -0
  9. package/dist/chunk-PZ5AY32C.js +9 -0
  10. package/dist/chunk-PZ5AY32C.js.map +1 -0
  11. package/dist/chunk-Q7SFCCGT.cjs +11 -0
  12. package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
  13. package/dist/chunk-RGCQSFKC.cjs +481 -0
  14. package/dist/chunk-RGCQSFKC.cjs.map +1 -0
  15. package/dist/index.cjs +744 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.cts +8077 -0
  18. package/dist/index.d.ts +8077 -0
  19. package/dist/index.js +660 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/middleware.cjs +10 -0
  22. package/dist/middleware.cjs.map +1 -0
  23. package/dist/middleware.d.cts +8 -0
  24. package/dist/middleware.d.ts +8 -0
  25. package/dist/middleware.js +8 -0
  26. package/dist/middleware.js.map +1 -0
  27. package/dist/plugins.cjs +10 -0
  28. package/dist/plugins.cjs.map +1 -0
  29. package/dist/plugins.d.cts +8 -0
  30. package/dist/plugins.d.ts +8 -0
  31. package/dist/plugins.js +8 -0
  32. package/dist/plugins.js.map +1 -0
  33. package/dist/routes.cjs +10 -0
  34. package/dist/routes.cjs.map +1 -0
  35. package/dist/routes.d.cts +8 -0
  36. package/dist/routes.d.ts +8 -0
  37. package/dist/routes.js +8 -0
  38. package/dist/routes.js.map +1 -0
  39. package/dist/services.cjs +10 -0
  40. package/dist/services.cjs.map +1 -0
  41. package/dist/services.d.cts +8 -0
  42. package/dist/services.d.ts +8 -0
  43. package/dist/services.js +8 -0
  44. package/dist/services.js.map +1 -0
  45. package/dist/templates.cjs +10 -0
  46. package/dist/templates.cjs.map +1 -0
  47. package/dist/templates.d.cts +8 -0
  48. package/dist/templates.d.ts +8 -0
  49. package/dist/templates.js +8 -0
  50. package/dist/templates.js.map +1 -0
  51. package/dist/types.cjs +13 -0
  52. package/dist/types.cjs.map +1 -0
  53. package/dist/types.d.cts +497 -0
  54. package/dist/types.d.ts +497 -0
  55. package/dist/types.js +4 -0
  56. package/dist/types.js.map +1 -0
  57. package/dist/utils.cjs +45 -0
  58. package/dist/utils.cjs.map +1 -0
  59. package/dist/utils.d.cts +184 -0
  60. package/dist/utils.d.ts +184 -0
  61. package/dist/utils.js +4 -0
  62. package/dist/utils.js.map +1 -0
  63. package/package.json +131 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,744 @@
1
+ 'use strict';
2
+
3
+ var chunkRGCQSFKC_cjs = require('./chunk-RGCQSFKC.cjs');
4
+ var chunkKYGRJCZM_cjs = require('./chunk-KYGRJCZM.cjs');
5
+ var chunkQ7SFCCGT_cjs = require('./chunk-Q7SFCCGT.cjs');
6
+ var hono = require('hono');
7
+ var d1 = require('drizzle-orm/d1');
8
+ var sqliteCore = require('drizzle-orm/sqlite-core');
9
+ var v4 = require('zod/v4');
10
+ var drizzleOrm = require('drizzle-orm');
11
+
12
+ function createSonicJSApp(config = {}) {
13
+ const app = new hono.Hono();
14
+ const appVersion = config.version || "1.0.0";
15
+ const appName = config.name || "SonicJS";
16
+ app.use("*", async (c, next) => {
17
+ c.set("appVersion", appVersion);
18
+ await next();
19
+ });
20
+ app.use("*", async (_c, next) => {
21
+ await next();
22
+ });
23
+ if (config.middleware?.beforeAuth) {
24
+ for (const middleware of config.middleware.beforeAuth) {
25
+ app.use("*", middleware);
26
+ }
27
+ }
28
+ app.use("*", async (_c, next) => {
29
+ await next();
30
+ });
31
+ app.use("*", async (_c, next) => {
32
+ await next();
33
+ });
34
+ if (config.middleware?.afterAuth) {
35
+ for (const middleware of config.middleware.afterAuth) {
36
+ app.use("*", middleware);
37
+ }
38
+ }
39
+ if (config.routes) {
40
+ for (const route of config.routes) {
41
+ app.route(route.path, route.handler);
42
+ }
43
+ }
44
+ app.get("/health", (c) => {
45
+ return c.json({
46
+ name: appName,
47
+ version: appVersion,
48
+ status: "running",
49
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
50
+ });
51
+ });
52
+ app.notFound((c) => {
53
+ return c.json({ error: "Not Found", status: 404 }, 404);
54
+ });
55
+ app.onError((err, c) => {
56
+ console.error(err);
57
+ return c.json({ error: "Internal Server Error", status: 500 }, 500);
58
+ });
59
+ return app;
60
+ }
61
+ function setupCoreMiddleware(_app) {
62
+ console.warn("setupCoreMiddleware is deprecated. Use createSonicJSApp() instead.");
63
+ }
64
+ function setupCoreRoutes(_app) {
65
+ console.warn("setupCoreRoutes is deprecated. Use createSonicJSApp() instead.");
66
+ }
67
+
68
+ // src/db/schema.ts
69
+ var schema_exports = {};
70
+ chunkQ7SFCCGT_cjs.__export(schema_exports, {
71
+ apiTokens: () => apiTokens,
72
+ collections: () => collections,
73
+ content: () => content,
74
+ contentVersions: () => contentVersions,
75
+ insertCollectionSchema: () => insertCollectionSchema,
76
+ insertContentSchema: () => insertContentSchema,
77
+ insertLogConfigSchema: () => insertLogConfigSchema,
78
+ insertMediaSchema: () => insertMediaSchema,
79
+ insertPluginActivityLogSchema: () => insertPluginActivityLogSchema,
80
+ insertPluginAssetSchema: () => insertPluginAssetSchema,
81
+ insertPluginHookSchema: () => insertPluginHookSchema,
82
+ insertPluginRouteSchema: () => insertPluginRouteSchema,
83
+ insertPluginSchema: () => insertPluginSchema,
84
+ insertSystemLogSchema: () => insertSystemLogSchema,
85
+ insertUserSchema: () => insertUserSchema,
86
+ insertWorkflowHistorySchema: () => insertWorkflowHistorySchema,
87
+ logConfig: () => logConfig,
88
+ media: () => media,
89
+ pluginActivityLog: () => pluginActivityLog,
90
+ pluginAssets: () => pluginAssets,
91
+ pluginHooks: () => pluginHooks,
92
+ pluginRoutes: () => pluginRoutes,
93
+ plugins: () => plugins,
94
+ selectCollectionSchema: () => selectCollectionSchema,
95
+ selectContentSchema: () => selectContentSchema,
96
+ selectLogConfigSchema: () => selectLogConfigSchema,
97
+ selectMediaSchema: () => selectMediaSchema,
98
+ selectPluginActivityLogSchema: () => selectPluginActivityLogSchema,
99
+ selectPluginAssetSchema: () => selectPluginAssetSchema,
100
+ selectPluginHookSchema: () => selectPluginHookSchema,
101
+ selectPluginRouteSchema: () => selectPluginRouteSchema,
102
+ selectPluginSchema: () => selectPluginSchema,
103
+ selectSystemLogSchema: () => selectSystemLogSchema,
104
+ selectUserSchema: () => selectUserSchema,
105
+ selectWorkflowHistorySchema: () => selectWorkflowHistorySchema,
106
+ systemLogs: () => systemLogs,
107
+ users: () => users,
108
+ workflowHistory: () => workflowHistory
109
+ });
110
+ var CONSTANTS = {
111
+ INT8_MIN: -128,
112
+ INT8_MAX: 127,
113
+ INT8_UNSIGNED_MAX: 255,
114
+ INT16_MIN: -32768,
115
+ INT16_MAX: 32767,
116
+ INT16_UNSIGNED_MAX: 65535,
117
+ INT24_MIN: -8388608,
118
+ INT24_MAX: 8388607,
119
+ INT24_UNSIGNED_MAX: 16777215,
120
+ INT32_MIN: -2147483648,
121
+ INT32_MAX: 2147483647,
122
+ INT32_UNSIGNED_MAX: 4294967295,
123
+ INT48_MIN: -140737488355328,
124
+ INT48_MAX: 140737488355327,
125
+ INT48_UNSIGNED_MAX: 281474976710655,
126
+ INT64_MIN: -9223372036854775808n,
127
+ INT64_MAX: 9223372036854775807n,
128
+ INT64_UNSIGNED_MAX: 18446744073709551615n
129
+ };
130
+ function isColumnType(column, columnTypes) {
131
+ return columnTypes.includes(column.columnType);
132
+ }
133
+ function isWithEnum(column) {
134
+ return "enumValues" in column && Array.isArray(column.enumValues) && column.enumValues.length > 0;
135
+ }
136
+ var isPgEnum = isWithEnum;
137
+ var literalSchema = v4.z.union([v4.z.string(), v4.z.number(), v4.z.boolean(), v4.z.null()]);
138
+ var jsonSchema = v4.z.union([
139
+ literalSchema,
140
+ v4.z.record(v4.z.string(), v4.z.any()),
141
+ v4.z.array(v4.z.any())
142
+ ]);
143
+ var bufferSchema = v4.z.custom((v) => v instanceof Buffer);
144
+ function columnToSchema(column, factory) {
145
+ const z$1 = v4.z;
146
+ const coerce = {};
147
+ let schema;
148
+ if (isWithEnum(column)) {
149
+ schema = column.enumValues.length ? z$1.enum(column.enumValues) : z$1.string();
150
+ }
151
+ if (!schema) {
152
+ if (isColumnType(column, ["PgGeometry", "PgPointTuple"])) {
153
+ schema = z$1.tuple([z$1.number(), z$1.number()]);
154
+ } else if (isColumnType(column, ["PgGeometryObject", "PgPointObject"])) {
155
+ schema = z$1.object({ x: z$1.number(), y: z$1.number() });
156
+ } else if (isColumnType(column, ["PgHalfVector", "PgVector"])) {
157
+ schema = z$1.array(z$1.number());
158
+ schema = column.dimensions ? schema.length(column.dimensions) : schema;
159
+ } else if (isColumnType(column, ["PgLine"])) {
160
+ schema = z$1.tuple([z$1.number(), z$1.number(), z$1.number()]);
161
+ } else if (isColumnType(column, ["PgLineABC"])) {
162
+ schema = z$1.object({
163
+ a: z$1.number(),
164
+ b: z$1.number(),
165
+ c: z$1.number()
166
+ });
167
+ } else if (isColumnType(column, ["PgArray"])) {
168
+ schema = z$1.array(columnToSchema(column.baseColumn));
169
+ schema = column.size ? schema.length(column.size) : schema;
170
+ } else if (column.dataType === "array") {
171
+ schema = z$1.array(z$1.any());
172
+ } else if (column.dataType === "number") {
173
+ schema = numberColumnToSchema(column, z$1, coerce);
174
+ } else if (column.dataType === "bigint") {
175
+ schema = bigintColumnToSchema(column, z$1, coerce);
176
+ } else if (column.dataType === "boolean") {
177
+ schema = coerce === true || coerce.boolean ? z$1.coerce.boolean() : z$1.boolean();
178
+ } else if (column.dataType === "date") {
179
+ schema = coerce === true || coerce.date ? z$1.coerce.date() : z$1.date();
180
+ } else if (column.dataType === "string") {
181
+ schema = stringColumnToSchema(column, z$1, coerce);
182
+ } else if (column.dataType === "json") {
183
+ schema = jsonSchema;
184
+ } else if (column.dataType === "custom") {
185
+ schema = z$1.any();
186
+ } else if (column.dataType === "buffer") {
187
+ schema = bufferSchema;
188
+ }
189
+ }
190
+ if (!schema) {
191
+ schema = z$1.any();
192
+ }
193
+ return schema;
194
+ }
195
+ function numberColumnToSchema(column, z2, coerce) {
196
+ let unsigned = column.getSQLType().includes("unsigned");
197
+ let min;
198
+ let max;
199
+ let integer2 = false;
200
+ if (isColumnType(column, ["MySqlTinyInt", "SingleStoreTinyInt"])) {
201
+ min = unsigned ? 0 : CONSTANTS.INT8_MIN;
202
+ max = unsigned ? CONSTANTS.INT8_UNSIGNED_MAX : CONSTANTS.INT8_MAX;
203
+ integer2 = true;
204
+ } else if (isColumnType(column, [
205
+ "PgSmallInt",
206
+ "PgSmallSerial",
207
+ "MySqlSmallInt",
208
+ "SingleStoreSmallInt"
209
+ ])) {
210
+ min = unsigned ? 0 : CONSTANTS.INT16_MIN;
211
+ max = unsigned ? CONSTANTS.INT16_UNSIGNED_MAX : CONSTANTS.INT16_MAX;
212
+ integer2 = true;
213
+ } else if (isColumnType(column, [
214
+ "PgReal",
215
+ "MySqlFloat",
216
+ "MySqlMediumInt",
217
+ "SingleStoreMediumInt",
218
+ "SingleStoreFloat"
219
+ ])) {
220
+ min = unsigned ? 0 : CONSTANTS.INT24_MIN;
221
+ max = unsigned ? CONSTANTS.INT24_UNSIGNED_MAX : CONSTANTS.INT24_MAX;
222
+ integer2 = isColumnType(column, ["MySqlMediumInt", "SingleStoreMediumInt"]);
223
+ } else if (isColumnType(column, [
224
+ "PgInteger",
225
+ "PgSerial",
226
+ "MySqlInt",
227
+ "SingleStoreInt"
228
+ ])) {
229
+ min = unsigned ? 0 : CONSTANTS.INT32_MIN;
230
+ max = unsigned ? CONSTANTS.INT32_UNSIGNED_MAX : CONSTANTS.INT32_MAX;
231
+ integer2 = true;
232
+ } else if (isColumnType(column, [
233
+ "PgDoublePrecision",
234
+ "MySqlReal",
235
+ "MySqlDouble",
236
+ "SingleStoreReal",
237
+ "SingleStoreDouble",
238
+ "SQLiteReal"
239
+ ])) {
240
+ min = unsigned ? 0 : CONSTANTS.INT48_MIN;
241
+ max = unsigned ? CONSTANTS.INT48_UNSIGNED_MAX : CONSTANTS.INT48_MAX;
242
+ } else if (isColumnType(column, [
243
+ "PgBigInt53",
244
+ "PgBigSerial53",
245
+ "MySqlBigInt53",
246
+ "MySqlSerial",
247
+ "SingleStoreBigInt53",
248
+ "SingleStoreSerial",
249
+ "SQLiteInteger"
250
+ ])) {
251
+ unsigned = unsigned || isColumnType(column, ["MySqlSerial", "SingleStoreSerial"]);
252
+ min = unsigned ? 0 : Number.MIN_SAFE_INTEGER;
253
+ max = Number.MAX_SAFE_INTEGER;
254
+ integer2 = true;
255
+ } else if (isColumnType(column, ["MySqlYear", "SingleStoreYear"])) {
256
+ min = 1901;
257
+ max = 2155;
258
+ integer2 = true;
259
+ } else {
260
+ min = Number.MIN_SAFE_INTEGER;
261
+ max = Number.MAX_SAFE_INTEGER;
262
+ }
263
+ let schema = coerce === true || coerce?.number ? integer2 ? z2.coerce.number() : z2.coerce.number().int() : integer2 ? z2.int() : z2.number();
264
+ schema = schema.gte(min).lte(max);
265
+ return schema;
266
+ }
267
+ function bigintColumnToSchema(column, z2, coerce) {
268
+ const unsigned = column.getSQLType().includes("unsigned");
269
+ const min = unsigned ? 0n : CONSTANTS.INT64_MIN;
270
+ const max = unsigned ? CONSTANTS.INT64_UNSIGNED_MAX : CONSTANTS.INT64_MAX;
271
+ const schema = coerce === true || coerce?.bigint ? z2.coerce.bigint() : z2.bigint();
272
+ return schema.gte(min).lte(max);
273
+ }
274
+ function stringColumnToSchema(column, z2, coerce) {
275
+ if (isColumnType(column, ["PgUUID"])) {
276
+ return z2.uuid();
277
+ }
278
+ let max;
279
+ let regex;
280
+ let fixed = false;
281
+ if (isColumnType(column, ["PgVarchar", "SQLiteText"])) {
282
+ max = column.length;
283
+ } else if (isColumnType(column, ["MySqlVarChar", "SingleStoreVarChar"])) {
284
+ max = column.length ?? CONSTANTS.INT16_UNSIGNED_MAX;
285
+ } else if (isColumnType(column, ["MySqlText", "SingleStoreText"])) {
286
+ if (column.textType === "longtext") {
287
+ max = CONSTANTS.INT32_UNSIGNED_MAX;
288
+ } else if (column.textType === "mediumtext") {
289
+ max = CONSTANTS.INT24_UNSIGNED_MAX;
290
+ } else if (column.textType === "text") {
291
+ max = CONSTANTS.INT16_UNSIGNED_MAX;
292
+ } else {
293
+ max = CONSTANTS.INT8_UNSIGNED_MAX;
294
+ }
295
+ }
296
+ if (isColumnType(column, [
297
+ "PgChar",
298
+ "MySqlChar",
299
+ "SingleStoreChar"
300
+ ])) {
301
+ max = column.length;
302
+ fixed = true;
303
+ }
304
+ if (isColumnType(column, ["PgBinaryVector"])) {
305
+ regex = /^[01]+$/;
306
+ max = column.dimensions;
307
+ }
308
+ let schema = coerce === true || coerce?.string ? z2.coerce.string() : z2.string();
309
+ schema = regex ? schema.regex(regex) : schema;
310
+ return max && fixed ? schema.length(max) : max ? schema.max(max) : schema;
311
+ }
312
+ function getColumns(tableLike) {
313
+ return drizzleOrm.isTable(tableLike) ? drizzleOrm.getTableColumns(tableLike) : drizzleOrm.getViewSelectedFields(tableLike);
314
+ }
315
+ function handleColumns(columns, refinements, conditions, factory) {
316
+ const columnSchemas = {};
317
+ for (const [key, selected] of Object.entries(columns)) {
318
+ if (!drizzleOrm.is(selected, drizzleOrm.Column) && !drizzleOrm.is(selected, drizzleOrm.SQL) && !drizzleOrm.is(selected, drizzleOrm.SQL.Aliased) && typeof selected === "object") {
319
+ const columns2 = drizzleOrm.isTable(selected) || drizzleOrm.isView(selected) ? getColumns(selected) : selected;
320
+ columnSchemas[key] = handleColumns(columns2, refinements[key] ?? {}, conditions);
321
+ continue;
322
+ }
323
+ const refinement = refinements[key];
324
+ if (refinement !== void 0 && typeof refinement !== "function") {
325
+ columnSchemas[key] = refinement;
326
+ continue;
327
+ }
328
+ const column = drizzleOrm.is(selected, drizzleOrm.Column) ? selected : void 0;
329
+ const schema = column ? columnToSchema(column) : v4.z.any();
330
+ const refined = typeof refinement === "function" ? refinement(schema) : schema;
331
+ if (conditions.never(column)) {
332
+ continue;
333
+ } else {
334
+ columnSchemas[key] = refined;
335
+ }
336
+ if (column) {
337
+ if (conditions.nullable(column)) {
338
+ columnSchemas[key] = columnSchemas[key].nullable();
339
+ }
340
+ if (conditions.optional(column)) {
341
+ columnSchemas[key] = columnSchemas[key].optional();
342
+ }
343
+ }
344
+ }
345
+ return v4.z.object(columnSchemas);
346
+ }
347
+ function handleEnum(enum_, factory) {
348
+ const zod = v4.z;
349
+ return zod.enum(enum_.enumValues);
350
+ }
351
+ var selectConditions = {
352
+ never: () => false,
353
+ optional: () => false,
354
+ nullable: (column) => !column.notNull
355
+ };
356
+ var insertConditions = {
357
+ never: (column) => column?.generated?.type === "always" || column?.generatedIdentity?.type === "always",
358
+ optional: (column) => !column.notNull || column.notNull && column.hasDefault,
359
+ nullable: (column) => !column.notNull
360
+ };
361
+ var createSelectSchema = (entity, refine) => {
362
+ if (isPgEnum(entity)) {
363
+ return handleEnum(entity);
364
+ }
365
+ const columns = getColumns(entity);
366
+ return handleColumns(columns, {}, selectConditions);
367
+ };
368
+ var createInsertSchema = (entity, refine) => {
369
+ const columns = getColumns(entity);
370
+ return handleColumns(columns, refine ?? {}, insertConditions);
371
+ };
372
+
373
+ // src/db/schema.ts
374
+ var users = sqliteCore.sqliteTable("users", {
375
+ id: sqliteCore.text("id").primaryKey(),
376
+ email: sqliteCore.text("email").notNull().unique(),
377
+ username: sqliteCore.text("username").notNull().unique(),
378
+ firstName: sqliteCore.text("first_name").notNull(),
379
+ lastName: sqliteCore.text("last_name").notNull(),
380
+ passwordHash: sqliteCore.text("password_hash"),
381
+ // Hashed password, nullable for OAuth users
382
+ role: sqliteCore.text("role").notNull().default("viewer"),
383
+ // 'admin', 'editor', 'author', 'viewer'
384
+ avatar: sqliteCore.text("avatar"),
385
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(true),
386
+ lastLoginAt: sqliteCore.integer("last_login_at"),
387
+ createdAt: sqliteCore.integer("created_at").notNull(),
388
+ updatedAt: sqliteCore.integer("updated_at").notNull()
389
+ });
390
+ var collections = sqliteCore.sqliteTable("collections", {
391
+ id: sqliteCore.text("id").primaryKey(),
392
+ name: sqliteCore.text("name").notNull().unique(),
393
+ displayName: sqliteCore.text("display_name").notNull(),
394
+ description: sqliteCore.text("description"),
395
+ schema: sqliteCore.text("schema", { mode: "json" }).notNull(),
396
+ // JSON schema definition
397
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(true),
398
+ managed: sqliteCore.integer("managed", { mode: "boolean" }).notNull().default(false),
399
+ // Config-managed collections cannot be edited in UI
400
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
401
+ updatedAt: sqliteCore.integer("updated_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
402
+ });
403
+ var content = sqliteCore.sqliteTable("content", {
404
+ id: sqliteCore.text("id").primaryKey(),
405
+ collectionId: sqliteCore.text("collection_id").notNull().references(() => collections.id),
406
+ slug: sqliteCore.text("slug").notNull(),
407
+ title: sqliteCore.text("title").notNull(),
408
+ data: sqliteCore.text("data", { mode: "json" }).notNull(),
409
+ // JSON content data
410
+ status: sqliteCore.text("status").notNull().default("draft"),
411
+ // 'draft', 'published', 'archived'
412
+ publishedAt: sqliteCore.integer("published_at", { mode: "timestamp" }),
413
+ authorId: sqliteCore.text("author_id").notNull().references(() => users.id),
414
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
415
+ updatedAt: sqliteCore.integer("updated_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
416
+ });
417
+ var contentVersions = sqliteCore.sqliteTable("content_versions", {
418
+ id: sqliteCore.text("id").primaryKey(),
419
+ contentId: sqliteCore.text("content_id").notNull().references(() => content.id),
420
+ version: sqliteCore.integer("version").notNull(),
421
+ data: sqliteCore.text("data", { mode: "json" }).notNull(),
422
+ authorId: sqliteCore.text("author_id").notNull().references(() => users.id),
423
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
424
+ });
425
+ var media = sqliteCore.sqliteTable("media", {
426
+ id: sqliteCore.text("id").primaryKey(),
427
+ filename: sqliteCore.text("filename").notNull(),
428
+ originalName: sqliteCore.text("original_name").notNull(),
429
+ mimeType: sqliteCore.text("mime_type").notNull(),
430
+ size: sqliteCore.integer("size").notNull(),
431
+ width: sqliteCore.integer("width"),
432
+ height: sqliteCore.integer("height"),
433
+ folder: sqliteCore.text("folder").notNull().default("uploads"),
434
+ r2Key: sqliteCore.text("r2_key").notNull(),
435
+ // R2 storage key
436
+ publicUrl: sqliteCore.text("public_url").notNull(),
437
+ // CDN URL
438
+ thumbnailUrl: sqliteCore.text("thumbnail_url"),
439
+ alt: sqliteCore.text("alt"),
440
+ caption: sqliteCore.text("caption"),
441
+ tags: sqliteCore.text("tags", { mode: "json" }),
442
+ // JSON array of tags
443
+ uploadedBy: sqliteCore.text("uploaded_by").notNull().references(() => users.id),
444
+ uploadedAt: sqliteCore.integer("uploaded_at").notNull(),
445
+ updatedAt: sqliteCore.integer("updated_at"),
446
+ publishedAt: sqliteCore.integer("published_at"),
447
+ scheduledAt: sqliteCore.integer("scheduled_at"),
448
+ archivedAt: sqliteCore.integer("archived_at"),
449
+ deletedAt: sqliteCore.integer("deleted_at")
450
+ });
451
+ var apiTokens = sqliteCore.sqliteTable("api_tokens", {
452
+ id: sqliteCore.text("id").primaryKey(),
453
+ name: sqliteCore.text("name").notNull(),
454
+ token: sqliteCore.text("token").notNull().unique(),
455
+ userId: sqliteCore.text("user_id").notNull().references(() => users.id),
456
+ permissions: sqliteCore.text("permissions", { mode: "json" }).notNull(),
457
+ // Array of permissions
458
+ expiresAt: sqliteCore.integer("expires_at", { mode: "timestamp" }),
459
+ lastUsedAt: sqliteCore.integer("last_used_at", { mode: "timestamp" }),
460
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
461
+ });
462
+ var workflowHistory = sqliteCore.sqliteTable("workflow_history", {
463
+ id: sqliteCore.text("id").primaryKey(),
464
+ contentId: sqliteCore.text("content_id").notNull().references(() => content.id),
465
+ action: sqliteCore.text("action").notNull(),
466
+ fromStatus: sqliteCore.text("from_status").notNull(),
467
+ toStatus: sqliteCore.text("to_status").notNull(),
468
+ userId: sqliteCore.text("user_id").notNull().references(() => users.id),
469
+ comment: sqliteCore.text("comment"),
470
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
471
+ });
472
+ var plugins = sqliteCore.sqliteTable("plugins", {
473
+ id: sqliteCore.text("id").primaryKey(),
474
+ name: sqliteCore.text("name").notNull().unique(),
475
+ displayName: sqliteCore.text("display_name").notNull(),
476
+ description: sqliteCore.text("description"),
477
+ version: sqliteCore.text("version").notNull(),
478
+ author: sqliteCore.text("author").notNull(),
479
+ category: sqliteCore.text("category").notNull(),
480
+ icon: sqliteCore.text("icon"),
481
+ status: sqliteCore.text("status").notNull().default("inactive"),
482
+ // 'active', 'inactive', 'error'
483
+ isCore: sqliteCore.integer("is_core", { mode: "boolean" }).notNull().default(false),
484
+ settings: sqliteCore.text("settings", { mode: "json" }),
485
+ permissions: sqliteCore.text("permissions", { mode: "json" }),
486
+ dependencies: sqliteCore.text("dependencies", { mode: "json" }),
487
+ downloadCount: sqliteCore.integer("download_count").notNull().default(0),
488
+ rating: sqliteCore.integer("rating").notNull().default(0),
489
+ installedAt: sqliteCore.integer("installed_at").notNull(),
490
+ activatedAt: sqliteCore.integer("activated_at"),
491
+ lastUpdated: sqliteCore.integer("last_updated").notNull(),
492
+ errorMessage: sqliteCore.text("error_message"),
493
+ createdAt: sqliteCore.integer("created_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3)),
494
+ updatedAt: sqliteCore.integer("updated_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
495
+ });
496
+ var pluginHooks = sqliteCore.sqliteTable("plugin_hooks", {
497
+ id: sqliteCore.text("id").primaryKey(),
498
+ pluginId: sqliteCore.text("plugin_id").notNull().references(() => plugins.id),
499
+ hookName: sqliteCore.text("hook_name").notNull(),
500
+ handlerName: sqliteCore.text("handler_name").notNull(),
501
+ priority: sqliteCore.integer("priority").notNull().default(10),
502
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(true),
503
+ createdAt: sqliteCore.integer("created_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
504
+ });
505
+ var pluginRoutes = sqliteCore.sqliteTable("plugin_routes", {
506
+ id: sqliteCore.text("id").primaryKey(),
507
+ pluginId: sqliteCore.text("plugin_id").notNull().references(() => plugins.id),
508
+ path: sqliteCore.text("path").notNull(),
509
+ method: sqliteCore.text("method").notNull(),
510
+ handlerName: sqliteCore.text("handler_name").notNull(),
511
+ middleware: sqliteCore.text("middleware", { mode: "json" }),
512
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(true),
513
+ createdAt: sqliteCore.integer("created_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
514
+ });
515
+ var pluginAssets = sqliteCore.sqliteTable("plugin_assets", {
516
+ id: sqliteCore.text("id").primaryKey(),
517
+ pluginId: sqliteCore.text("plugin_id").notNull().references(() => plugins.id),
518
+ assetType: sqliteCore.text("asset_type").notNull(),
519
+ // 'css', 'js', 'image', 'font'
520
+ assetPath: sqliteCore.text("asset_path").notNull(),
521
+ loadOrder: sqliteCore.integer("load_order").notNull().default(100),
522
+ loadLocation: sqliteCore.text("load_location").notNull().default("footer"),
523
+ // 'header', 'footer'
524
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(true),
525
+ createdAt: sqliteCore.integer("created_at").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
526
+ });
527
+ var pluginActivityLog = sqliteCore.sqliteTable("plugin_activity_log", {
528
+ id: sqliteCore.text("id").primaryKey(),
529
+ pluginId: sqliteCore.text("plugin_id").notNull().references(() => plugins.id),
530
+ action: sqliteCore.text("action").notNull(),
531
+ userId: sqliteCore.text("user_id"),
532
+ details: sqliteCore.text("details", { mode: "json" }),
533
+ timestamp: sqliteCore.integer("timestamp").notNull().$defaultFn(() => Math.floor(Date.now() / 1e3))
534
+ });
535
+ var insertUserSchema = createInsertSchema(users, {
536
+ email: (schema) => schema.email(),
537
+ firstName: (schema) => schema.min(1),
538
+ lastName: (schema) => schema.min(1),
539
+ username: (schema) => schema.min(3)
540
+ });
541
+ var selectUserSchema = createSelectSchema(users);
542
+ var insertCollectionSchema = createInsertSchema(collections, {
543
+ name: (schema) => schema.min(1).regex(/^[a-z0-9_]+$/, "Collection name must be lowercase with underscores"),
544
+ displayName: (schema) => schema.min(1)
545
+ });
546
+ var selectCollectionSchema = createSelectSchema(collections);
547
+ var insertContentSchema = createInsertSchema(content, {
548
+ slug: (schema) => schema.min(1).regex(/^[a-zA-Z0-9_-]+$/, "Slug must contain only letters, numbers, underscores, and hyphens"),
549
+ title: (schema) => schema.min(1),
550
+ status: (schema) => schema
551
+ });
552
+ var selectContentSchema = createSelectSchema(content);
553
+ var insertMediaSchema = createInsertSchema(media, {
554
+ filename: (schema) => schema.min(1),
555
+ originalName: (schema) => schema.min(1),
556
+ mimeType: (schema) => schema.min(1),
557
+ size: (schema) => schema.positive(),
558
+ r2Key: (schema) => schema.min(1),
559
+ publicUrl: (schema) => schema.url(),
560
+ folder: (schema) => schema.min(1)
561
+ });
562
+ var selectMediaSchema = createSelectSchema(media);
563
+ var insertWorkflowHistorySchema = createInsertSchema(workflowHistory, {
564
+ action: (schema) => schema.min(1),
565
+ fromStatus: (schema) => schema.min(1),
566
+ toStatus: (schema) => schema.min(1)
567
+ });
568
+ var selectWorkflowHistorySchema = createSelectSchema(workflowHistory);
569
+ var insertPluginSchema = createInsertSchema(plugins, {
570
+ name: (schema) => schema.min(1),
571
+ displayName: (schema) => schema.min(1),
572
+ version: (schema) => schema.min(1),
573
+ author: (schema) => schema.min(1),
574
+ category: (schema) => schema.min(1)
575
+ });
576
+ var selectPluginSchema = createSelectSchema(plugins);
577
+ var insertPluginHookSchema = createInsertSchema(pluginHooks, {
578
+ hookName: (schema) => schema.min(1),
579
+ handlerName: (schema) => schema.min(1)
580
+ });
581
+ var selectPluginHookSchema = createSelectSchema(pluginHooks);
582
+ var insertPluginRouteSchema = createInsertSchema(pluginRoutes, {
583
+ path: (schema) => schema.min(1),
584
+ method: (schema) => schema.min(1),
585
+ handlerName: (schema) => schema.min(1)
586
+ });
587
+ var selectPluginRouteSchema = createSelectSchema(pluginRoutes);
588
+ var insertPluginAssetSchema = createInsertSchema(pluginAssets, {
589
+ assetType: (schema) => schema.min(1),
590
+ assetPath: (schema) => schema.min(1)
591
+ });
592
+ var selectPluginAssetSchema = createSelectSchema(pluginAssets);
593
+ var insertPluginActivityLogSchema = createInsertSchema(pluginActivityLog, {
594
+ action: (schema) => schema.min(1)
595
+ });
596
+ var selectPluginActivityLogSchema = createSelectSchema(pluginActivityLog);
597
+ var systemLogs = sqliteCore.sqliteTable("system_logs", {
598
+ id: sqliteCore.text("id").primaryKey(),
599
+ level: sqliteCore.text("level").notNull(),
600
+ // 'debug', 'info', 'warn', 'error', 'fatal'
601
+ category: sqliteCore.text("category").notNull(),
602
+ // 'auth', 'api', 'workflow', 'plugin', 'media', 'system', etc.
603
+ message: sqliteCore.text("message").notNull(),
604
+ data: sqliteCore.text("data", { mode: "json" }),
605
+ // Additional structured data
606
+ userId: sqliteCore.text("user_id").references(() => users.id),
607
+ sessionId: sqliteCore.text("session_id"),
608
+ requestId: sqliteCore.text("request_id"),
609
+ ipAddress: sqliteCore.text("ip_address"),
610
+ userAgent: sqliteCore.text("user_agent"),
611
+ method: sqliteCore.text("method"),
612
+ // HTTP method for API logs
613
+ url: sqliteCore.text("url"),
614
+ // Request URL for API logs
615
+ statusCode: sqliteCore.integer("status_code"),
616
+ // HTTP status code for API logs
617
+ duration: sqliteCore.integer("duration"),
618
+ // Request duration in milliseconds
619
+ stackTrace: sqliteCore.text("stack_trace"),
620
+ // Error stack trace for error logs
621
+ tags: sqliteCore.text("tags", { mode: "json" }),
622
+ // Array of tags for categorization
623
+ source: sqliteCore.text("source"),
624
+ // Source component/module that generated the log
625
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
626
+ });
627
+ var logConfig = sqliteCore.sqliteTable("log_config", {
628
+ id: sqliteCore.text("id").primaryKey(),
629
+ category: sqliteCore.text("category").notNull().unique(),
630
+ enabled: sqliteCore.integer("enabled", { mode: "boolean" }).notNull().default(true),
631
+ level: sqliteCore.text("level").notNull().default("info"),
632
+ // minimum log level to store
633
+ retention: sqliteCore.integer("retention").notNull().default(30),
634
+ // days to keep logs
635
+ maxSize: sqliteCore.integer("max_size").default(1e4),
636
+ // max number of logs per category
637
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
638
+ updatedAt: sqliteCore.integer("updated_at", { mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
639
+ });
640
+ var insertSystemLogSchema = createInsertSchema(systemLogs, {
641
+ level: (schema) => schema.min(1),
642
+ category: (schema) => schema.min(1),
643
+ message: (schema) => schema.min(1)
644
+ });
645
+ var selectSystemLogSchema = createSelectSchema(systemLogs);
646
+ var insertLogConfigSchema = createInsertSchema(logConfig, {
647
+ category: (schema) => schema.min(1),
648
+ level: (schema) => schema.min(1)
649
+ });
650
+ var selectLogConfigSchema = createSelectSchema(logConfig);
651
+
652
+ // src/db/index.ts
653
+ function createDb(d1$1) {
654
+ return d1.drizzle(d1$1, { schema: schema_exports });
655
+ }
656
+
657
+ // src/index.ts
658
+ var VERSION = "1.0.0-alpha.1";
659
+
660
+ Object.defineProperty(exports, "QueryFilterBuilder", {
661
+ enumerable: true,
662
+ get: function () { return chunkRGCQSFKC_cjs.QueryFilterBuilder; }
663
+ });
664
+ Object.defineProperty(exports, "TemplateRenderer", {
665
+ enumerable: true,
666
+ get: function () { return chunkRGCQSFKC_cjs.TemplateRenderer; }
667
+ });
668
+ Object.defineProperty(exports, "buildQuery", {
669
+ enumerable: true,
670
+ get: function () { return chunkRGCQSFKC_cjs.buildQuery; }
671
+ });
672
+ Object.defineProperty(exports, "escapeHtml", {
673
+ enumerable: true,
674
+ get: function () { return chunkRGCQSFKC_cjs.escapeHtml; }
675
+ });
676
+ Object.defineProperty(exports, "metricsTracker", {
677
+ enumerable: true,
678
+ get: function () { return chunkRGCQSFKC_cjs.metricsTracker; }
679
+ });
680
+ Object.defineProperty(exports, "renderTemplate", {
681
+ enumerable: true,
682
+ get: function () { return chunkRGCQSFKC_cjs.renderTemplate; }
683
+ });
684
+ Object.defineProperty(exports, "sanitizeInput", {
685
+ enumerable: true,
686
+ get: function () { return chunkRGCQSFKC_cjs.sanitizeInput; }
687
+ });
688
+ Object.defineProperty(exports, "sanitizeObject", {
689
+ enumerable: true,
690
+ get: function () { return chunkRGCQSFKC_cjs.sanitizeObject; }
691
+ });
692
+ Object.defineProperty(exports, "templateRenderer", {
693
+ enumerable: true,
694
+ get: function () { return chunkRGCQSFKC_cjs.templateRenderer; }
695
+ });
696
+ Object.defineProperty(exports, "HOOKS", {
697
+ enumerable: true,
698
+ get: function () { return chunkKYGRJCZM_cjs.HOOKS; }
699
+ });
700
+ exports.VERSION = VERSION;
701
+ exports.apiTokens = apiTokens;
702
+ exports.collections = collections;
703
+ exports.content = content;
704
+ exports.contentVersions = contentVersions;
705
+ exports.createDb = createDb;
706
+ exports.createSonicJSApp = createSonicJSApp;
707
+ exports.insertCollectionSchema = insertCollectionSchema;
708
+ exports.insertContentSchema = insertContentSchema;
709
+ exports.insertLogConfigSchema = insertLogConfigSchema;
710
+ exports.insertMediaSchema = insertMediaSchema;
711
+ exports.insertPluginActivityLogSchema = insertPluginActivityLogSchema;
712
+ exports.insertPluginAssetSchema = insertPluginAssetSchema;
713
+ exports.insertPluginHookSchema = insertPluginHookSchema;
714
+ exports.insertPluginRouteSchema = insertPluginRouteSchema;
715
+ exports.insertPluginSchema = insertPluginSchema;
716
+ exports.insertSystemLogSchema = insertSystemLogSchema;
717
+ exports.insertUserSchema = insertUserSchema;
718
+ exports.insertWorkflowHistorySchema = insertWorkflowHistorySchema;
719
+ exports.logConfig = logConfig;
720
+ exports.media = media;
721
+ exports.pluginActivityLog = pluginActivityLog;
722
+ exports.pluginAssets = pluginAssets;
723
+ exports.pluginHooks = pluginHooks;
724
+ exports.pluginRoutes = pluginRoutes;
725
+ exports.plugins = plugins;
726
+ exports.selectCollectionSchema = selectCollectionSchema;
727
+ exports.selectContentSchema = selectContentSchema;
728
+ exports.selectLogConfigSchema = selectLogConfigSchema;
729
+ exports.selectMediaSchema = selectMediaSchema;
730
+ exports.selectPluginActivityLogSchema = selectPluginActivityLogSchema;
731
+ exports.selectPluginAssetSchema = selectPluginAssetSchema;
732
+ exports.selectPluginHookSchema = selectPluginHookSchema;
733
+ exports.selectPluginRouteSchema = selectPluginRouteSchema;
734
+ exports.selectPluginSchema = selectPluginSchema;
735
+ exports.selectSystemLogSchema = selectSystemLogSchema;
736
+ exports.selectUserSchema = selectUserSchema;
737
+ exports.selectWorkflowHistorySchema = selectWorkflowHistorySchema;
738
+ exports.setupCoreMiddleware = setupCoreMiddleware;
739
+ exports.setupCoreRoutes = setupCoreRoutes;
740
+ exports.systemLogs = systemLogs;
741
+ exports.users = users;
742
+ exports.workflowHistory = workflowHistory;
743
+ //# sourceMappingURL=index.cjs.map
744
+ //# sourceMappingURL=index.cjs.map